|
1 | 1 | import datetime
|
| 2 | +import random |
| 3 | +import string |
2 | 4 |
|
3 | 5 | from django.core.exceptions import ValidationError
|
4 | 6 | from django.core.validators import RegexValidator
|
|
13 | 15 | message=_("Phone number must not contain spaces, letters, parentheses or dashes. It must contain 10 digits.")
|
14 | 16 | )
|
15 | 17 |
|
| 18 | +PAYMENT_TYPES = ( |
| 19 | + ('full', _('Full payment')), |
| 20 | + ('down', _('Down payment')), |
| 21 | +) |
| 22 | + |
16 | 23 |
|
17 | 24 | class Service(models.Model):
|
18 | 25 | name = models.CharField(max_length=100)
|
@@ -63,12 +70,16 @@ def get_updated_at(self):
|
63 | 70 | def is_a_paid_service(self):
|
64 | 71 | return self.price > 0
|
65 | 72 |
|
| 73 | + def accepts_down_payment(self): |
| 74 | + return self.down_payment > 0 |
| 75 | + |
66 | 76 |
|
67 | 77 | class AppointmentRequest(models.Model):
|
68 | 78 | date = models.DateField()
|
69 | 79 | start_time = models.TimeField()
|
70 | 80 | end_time = models.TimeField()
|
71 | 81 | service = models.ForeignKey(Service, on_delete=models.CASCADE)
|
| 82 | + payment_type = models.CharField(max_length=4, choices=PAYMENT_TYPES, default='full') |
72 | 83 | id_request = models.CharField(max_length=100, blank=True, null=True)
|
73 | 84 |
|
74 | 85 | # meta data
|
@@ -122,6 +133,18 @@ def get_id_request(self):
|
122 | 133 | def is_a_paid_service(self):
|
123 | 134 | return self.service.is_a_paid_service()
|
124 | 135 |
|
| 136 | + def accepts_down_payment(self): |
| 137 | + return self.service.accepts_down_payment() |
| 138 | + |
| 139 | + def get_payment_type(self): |
| 140 | + return self.payment_type |
| 141 | + |
| 142 | + def get_created_at(self): |
| 143 | + return self.created_at |
| 144 | + |
| 145 | + def get_updated_at(self): |
| 146 | + return self.updated_at |
| 147 | + |
125 | 148 |
|
126 | 149 | class Appointment(models.Model):
|
127 | 150 | client = models.ForeignKey(APPOINTMENT_CLIENT_MODEL, on_delete=models.CASCADE)
|
@@ -149,6 +172,14 @@ def __str__(self):
|
149 | 172 | def save(self, *args, **kwargs):
|
150 | 173 | if self.id_request is None:
|
151 | 174 | self.id_request = f"{Utility.get_timestamp()}{self.appointment_request.id}{Utility.generate_random_id()}"
|
| 175 | + if self.amount_to_pay is None or self.amount_to_pay == 0: |
| 176 | + payment_type = self.appointment_request.get_payment_type() |
| 177 | + if payment_type == 'full': |
| 178 | + self.amount_to_pay = self.appointment_request.get_service_price() |
| 179 | + elif payment_type == 'down': |
| 180 | + self.amount_to_pay = self.appointment_request.get_service_down_payment() |
| 181 | + else: |
| 182 | + self.amount_to_pay = 0 |
152 | 183 | return super().save(*args, **kwargs)
|
153 | 184 |
|
154 | 185 | def get_client(self):
|
@@ -278,3 +309,20 @@ def get_user_email(self):
|
278 | 309 | return self.appointment.get_client().email
|
279 | 310 |
|
280 | 311 |
|
| 312 | +class EmailVerificationCode(models.Model): |
| 313 | + user = models.ForeignKey(APPOINTMENT_CLIENT_MODEL, on_delete=models.CASCADE) |
| 314 | + code = models.CharField(max_length=6) |
| 315 | + |
| 316 | + # meta data |
| 317 | + created_at = models.DateTimeField(auto_now_add=True) |
| 318 | + updated_at = models.DateTimeField(auto_now=True) |
| 319 | + |
| 320 | + def __str__(self): |
| 321 | + return f"{self.code}" |
| 322 | + |
| 323 | + @classmethod |
| 324 | + def generate_code(cls, user): |
| 325 | + code = ''.join(random.choices(string.ascii_uppercase + string.digits, k=6)) |
| 326 | + verification_code = cls(user=user, code=code) |
| 327 | + verification_code.save() |
| 328 | + return code |
0 commit comments