133 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from django import forms
 | |
| from django.db.models import Q
 | |
| from django.utils.translation import ugettext_lazy as _
 | |
| 
 | |
| 
 | |
| from utils.models import BillingAddress
 | |
| from utils.forms import LoginFormMixin, SignupFormMixin, BillingAddressForm
 | |
| 
 | |
| from .models import MembershipType, MembershipOrder
 | |
| from .models import Booking, BookingOrder
 | |
| 
 | |
| 
 | |
| class LoginForm(LoginFormMixin):
 | |
|     email = forms.CharField(widget=forms.EmailInput())
 | |
|     password = forms.CharField(widget=forms.PasswordInput())
 | |
| 
 | |
| 
 | |
| class SignupForm(SignupFormMixin):
 | |
|     confirm_password = forms.CharField(widget=forms.PasswordInput())
 | |
|     password = forms.CharField(widget=forms.PasswordInput())
 | |
|     name = forms.CharField(label='name',
 | |
|                            widget=forms.TextInput(attrs={'placeholder': 'Full name'}))
 | |
| 
 | |
| 
 | |
| class MembershipBillingForm(BillingAddressForm):
 | |
|     token = forms.CharField(widget=forms.HiddenInput())
 | |
|     membership_type = forms.ModelChoiceField(queryset=MembershipType.objects.all(),
 | |
|                                              widget=forms.HiddenInput())
 | |
| 
 | |
|     class Meta:
 | |
|         model = BillingAddress
 | |
|         fields = ['membership_type', 'street_address', 'city', 'postal_code', 'country']
 | |
|         labels = {
 | |
|             'street_address': _('Street Address'),
 | |
|             'city': _('City'),
 | |
|             'postal_code': _('Postal Code'),
 | |
|             'country': _('Country'),
 | |
|         }
 | |
| 
 | |
| 
 | |
| class MembershipOrderForm(forms.ModelForm):
 | |
| 
 | |
|     class Meta:
 | |
|         model = MembershipOrder
 | |
|         fields = ['membership', 'customer', 'billing_address',
 | |
|                   'last4', 'cc_brand', 'stripe_charge_id', 'amount']
 | |
| 
 | |
|     # def save(self, commit=True):
 | |
|     #     instance = super(MembershipOrderForm, self).save(commit=False)
 | |
| 
 | |
|     #     # if commit:
 | |
|     #     #     DonatorStatus.create(self.cleaned_data['donator'].user)
 | |
|     #     #     instance.save()
 | |
| 
 | |
|     #     return instance
 | |
| 
 | |
| 
 | |
| class BookingBillingForm(BillingAddressForm):
 | |
|     token = forms.CharField(widget=forms.HiddenInput(), required=False)
 | |
|     start_date = forms.DateField(widget=forms.HiddenInput())
 | |
|     end_date = forms.DateField(widget=forms.HiddenInput())
 | |
|     price = forms.FloatField(widget=forms.HiddenInput())
 | |
| 
 | |
|     class Meta:
 | |
|         model = BillingAddress
 | |
|         fields = ['start_date', 'end_date', 'price', 'street_address',
 | |
|                   'city', 'postal_code', 'country']
 | |
|         labels = {
 | |
|             'street_address': _('Street Address'),
 | |
|             'city': _('City'),
 | |
|             'postal_code': _('Postal Code'),
 | |
|             'country': _('Country'),
 | |
|         }
 | |
| 
 | |
| 
 | |
| class CancelBookingForm(forms.ModelForm):
 | |
|     status = forms.CharField(widget=forms.HiddenInput(), required=False)
 | |
| 
 | |
|     class Meta:
 | |
|         model = BookingOrder
 | |
|         fields = ['status']
 | |
| 
 | |
|     # def clean(self):
 | |
|     #     booking = self.instance.booking
 | |
|     #     days_to_start = (booking.start_date - datetime.today().date()).days
 | |
|     #     if days_to_start < 7:
 | |
|     #         raise forms.ValidationError("You can't cancel your booking")
 | |
|     #     return self.cleaned_data
 | |
| 
 | |
| 
 | |
| class BookingDateForm(forms.Form):
 | |
|     start_date = forms.DateField(required=False,
 | |
|                                  widget=forms.TextInput(attrs={'id': 'booking-date-1',
 | |
|                                                                'value': 'Select your date'}))
 | |
|     end_date = forms.DateField(required=False,
 | |
|                                widget=forms.TextInput(attrs={'id': 'booking-date-2'}))
 | |
| 
 | |
|     def __init__(self, *args, **kwargs):
 | |
|         self.user = kwargs.pop('user')
 | |
|         super(BookingDateForm, self).__init__(*args, **kwargs)
 | |
| 
 | |
|     def clean_start_date(self):
 | |
|         start_date = self.cleaned_data.get('start_date')
 | |
|         if not start_date:
 | |
|             raise forms.ValidationError("This field is required.")
 | |
|         return start_date
 | |
| 
 | |
|     def clean_end_date(self):
 | |
|         end_date = self.cleaned_data.get('end_date')
 | |
|         if not end_date:
 | |
|             raise forms.ValidationError("This field is required.")
 | |
|         return end_date
 | |
| 
 | |
|     def clean(self):
 | |
|         start_date = self.cleaned_data.get('start_date')
 | |
|         end_date = self.cleaned_data.get('end_date')
 | |
| 
 | |
|         if not start_date or not end_date:
 | |
|             return self.cleaned_data
 | |
| 
 | |
|         if start_date > end_date:
 | |
|             raise forms.ValidationError("Your end date must be greather than your start date.")
 | |
| 
 | |
|         q1 = Q(bookingorder__customer__user=self.user,
 | |
|                start_date__lte=start_date, end_date__gte=start_date,
 | |
|                bookingorder__status=BookingOrder.APPROVED)
 | |
|         q2 = Q(bookingorder__customer__user=self.user,
 | |
|                start_date__gt=start_date, start_date__lte=end_date,
 | |
|                bookingorder__status=BookingOrder.APPROVED)
 | |
|         if Booking.objects.filter(q1 | q2).exists():
 | |
|             raise forms.ValidationError("You already have a booking in these dates.")
 | |
| 
 | |
|         return self.cleaned_data
 |