JourneyJoker/auction/models.py
Klaus-Uwe Mitterer 2b175339dc Move variables into database
Improve auction activation logic
2021-05-30 17:47:56 +02:00

92 lines
No EOL
2.9 KiB
Python

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)