from django.contrib.gis.db import models from django.utils import timezone from django.contrib.gis.db.models.functions import Distance from clients.models import ClientProfile from partners.models import Establishment, RoomCategory from dbsettings.functions import getValue from datetime import timedelta import uuid class LengthChoices(models.IntegerChoices): ANY = 0 SHORT = 1 LONG = 2 class Inquiry(models.Model): uuid = models.UUIDField(default=uuid.uuid4, unique=True) client = models.ForeignKey(ClientProfile, models.PROTECT, null=True, blank=True) destination_name = models.CharField(max_length=128) destination_coords = models.PointField() destination_radius = models.IntegerField() arrival = models.DateField() min_nights = models.IntegerField(default=0, choices=LengthChoices.choices) budget = models.DecimalField(max_digits=10, decimal_places=2) adults = models.IntegerField() children = models.IntegerField() comment = models.TextField(null=True, blank=True) activated = models.DateTimeField(null=True, blank=True) bidding_end = models.DateTimeField(null=True, blank=True) gateway = models.CharField(max_length=128, null=True, blank=True) @property def is_paid(self): if not self.invoice: return False return self.invoice.is_paid def activate(self): if self.activated: return False self.activated = timezone.now() self.bidding_end = self.activated + timedelta(hours=getValue("auction.bidding_period", 24)) self.auction_end = self.bidding_end + timedelta(hours=getValue("auction.selection_period", 24)) self.save() def process_payment(self): if self.invoice.is_paid: self.activate() @property def expired(self): return self.expiry and (self.expiry < timezone.now()) @property def active(self): try: return bool(self.activated) and not self.expired except: return False @property def accepted(self): try: return Offer.objects.get(inquiry=self, accepted__isnull=False) except Offer.DoesNotExist: return False class Offer(models.Model): uuid = models.UUIDField(default=uuid.uuid4, unique=True) inquiry = models.ForeignKey(Inquiry, models.PROTECT) roomcategory = models.ForeignKey(RoomCategory, models.PROTECT) departure = models.DateField() comment = models.TextField(null=True, blank=True) accepted = models.DateTimeField(null=True, blank=True) hidden = models.BooleanField(default=False) @property def establishment(self): return self.roomcategory.establishment @property def nights(self): return (self.departure - self.inquiry.arrival).days @property def distance(self): return self.inquiry.destination_coords.distance(self.roomcategory.establishment.coords)