finishing digitalglarus booking

This commit is contained in:
Levi 2016-09-29 00:04:40 -05:00
commit 447ddc7c2e
7 changed files with 137 additions and 24 deletions

View file

@ -16,8 +16,9 @@ from .mixins import Ordereable
class MembershipType(models.Model):
STANDARD = 'standard'
MEMBERSHIP_TYPES = (
('standard', 'Standard'),
(STANDARD, 'Standard'),
)
name = models.CharField(choices=MEMBERSHIP_TYPES, max_length=20)
@ -63,7 +64,7 @@ class Membership(models.Model):
active = models.BooleanField(default=True)
@classmethod
def is_digitalglarus_member(cls, user):
def is_digitalglarus_active_member(cls, user):
past_month = (datetime.today() - relativedelta(months=1)).month
has_booking_current_month = Q(membershiporder__customer__user=user,
membershiporder__created_at__month=datetime.today().month)
@ -158,6 +159,14 @@ class Booking(models.Model):
total_free_days = months * TWO_DAYS + free_days_this_month
return total_free_days
@staticmethod
def membership_required_booking_months(start_date, end_date):
start_month = start_date.month
end_month = end_date.month
months = abs(start_month - (end_month + 12) if end_month < start_month
else end_month - start_month)
return months
@classmethod
def booking_price(cls, user, start_date, end_date):
@ -178,13 +187,34 @@ class Booking(models.Model):
free_days = cls.get_ramaining_free_days(user, start_date, end_date)
final_booking_price = normal_price - (free_days * price_per_day)
return normal_price, final_booking_price, free_days
# Calculating membership required months price for booking
required_membership_months = 0
membership_booking_price = 0.0
if BookingOrder.user_has_not_bookings(user):
today = datetime.today().date()
membership_price = MembershipType.objects.get(name=MembershipType.STANDARD).price
required_membership_months = cls.membership_required_booking_months(today, end_date)
membership_booking_price = membership_price * required_membership_months
# Add required membership months to final prices
final_booking_price += membership_booking_price
return normal_price, final_booking_price, free_days,\
required_membership_months, membership_booking_price
class BookingOrder(Ordereable, models.Model):
booking = models.OneToOneField(Booking)
original_price = models.FloatField()
special_month_price = models.FloatField()
membership_required_months = models.IntegerField(default=0)
membership_required_months_price = models.FloatField(default=0)
@classmethod
def user_has_not_bookings(cls, user):
return cls.objects.filter(customer__user=user).exists()
def booking_days(self):
return (self.booking.end_date - self.booking.start_date).days + 1