82 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django.core.urlresolvers import reverse_lazy
 | |
| from django.contrib.auth.mixins import LoginRequiredMixin
 | |
| from django.views.generic import UpdateView
 | |
| from django.db import models
 | |
| from django.http import HttpResponseRedirect
 | |
| from django.contrib import messages
 | |
| 
 | |
| 
 | |
| from membership.models import StripeCustomer
 | |
| from utils.models import BillingAddress
 | |
| 
 | |
| 
 | |
| class MembershipRequiredMixin(object):
 | |
|     membership_redirect_url = None
 | |
| 
 | |
|     def dispatch(self, request, *args, **kwargs):
 | |
|         from .models import Membership
 | |
|         if not Membership.is_digitalglarus_active_member(request.user):
 | |
|             return HttpResponseRedirect(self.membership_redirect_url)
 | |
| 
 | |
|         return super(MembershipRequiredMixin, self).dispatch(request, *args, **kwargs)
 | |
| 
 | |
| 
 | |
| class IsNotMemberMixin(object):
 | |
|     already_member_redirect_url = None
 | |
| 
 | |
|     def dispatch(self, request, *args, **kwargs):
 | |
|         from .models import Membership
 | |
|         if Membership.is_digitalglarus_active_member(request.user):
 | |
|             return HttpResponseRedirect(self.already_member_redirect_url)
 | |
| 
 | |
|         return super(IsNotMemberMixin, self).dispatch(request, *args, **kwargs)
 | |
| 
 | |
| 
 | |
| class Ordereable(models.Model):
 | |
|     customer = models.ForeignKey(StripeCustomer)
 | |
|     amount = models.FloatField()
 | |
|     billing_address = models.ForeignKey(BillingAddress)
 | |
|     created_at = models.DateTimeField(auto_now_add=True)
 | |
|     approved = models.BooleanField(default=False)
 | |
|     last4 = models.CharField(max_length=4, blank=True)
 | |
|     cc_brand = models.CharField(max_length=10, blank=True)
 | |
|     stripe_charge_id = models.CharField(max_length=100, null=True)
 | |
| 
 | |
|     class Meta:
 | |
|         abstract = True
 | |
| 
 | |
|     @classmethod
 | |
|     def create(cls, data):
 | |
|         stripe_charge = data.pop('stripe_charge', None)
 | |
|         instance = cls.objects.create(**data)
 | |
|         if not stripe_charge:
 | |
|             return instance
 | |
|         instance.stripe_charge_id = stripe_charge.id
 | |
|         instance.last4 = stripe_charge.source.last4
 | |
|         instance.cc_brand = stripe_charge.source.brand
 | |
|         instance.save()
 | |
|         return instance
 | |
| 
 | |
| 
 | |
| class ChangeMembershipStatusMixin(LoginRequiredMixin, UpdateView):
 | |
|     success_message = None
 | |
|     success_url = reverse_lazy('digitalglarus:membership_orders_list')
 | |
|     login_url = reverse_lazy('digitalglarus:login')
 | |
|     fields = '__all__'
 | |
| 
 | |
|     def get_object(self):
 | |
|         from .models import MembershipOrder
 | |
|         membership_order = MembershipOrder.objects.\
 | |
|             filter(customer__user=self.request.user).last()
 | |
|         if not membership_order:
 | |
|             raise AttributeError("Membership does not exists")
 | |
|         membership = membership_order.membership
 | |
|         return membership
 | |
| 
 | |
|     def post(self, *args, **kwargs):
 | |
|         membership = self.get_object()
 | |
|         membership.activate()
 | |
| 
 | |
|         messages.add_message(self.request, messages.SUCCESS, self.success_message)
 | |
| 
 | |
|         return HttpResponseRedirect(self.success_url)
 |