|
1 | | -# Create your models here. |
| 1 | +from django.conf import settings |
| 2 | +from django.contrib.auth.models import AbstractUser |
| 3 | +from django.db import models |
| 4 | + |
| 5 | + |
| 6 | +class User(AbstractUser): |
| 7 | + ROLE_CHOICES = [ |
| 8 | + ("user", "User"), |
| 9 | + ("admin", "Admin"), |
| 10 | + ("technician", "Technician"), |
| 11 | + ] |
| 12 | + fullname = models.CharField(max_length=255) |
| 13 | + role = models.CharField(max_length=20, choices=ROLE_CHOICES) |
| 14 | + address = models.JSONField(blank=True, null=True) |
| 15 | + phone_no = models.CharField(max_length=20, blank=True, default="") |
| 16 | + mobile_no = models.CharField(max_length=20, blank=True, default="") |
| 17 | + |
| 18 | + |
| 19 | +class Tag(models.Model): |
| 20 | + name = models.CharField(max_length=50) |
| 21 | + |
| 22 | + def __str__(self): |
| 23 | + return str(self.name) |
| 24 | + |
| 25 | + |
| 26 | +class Profile(models.Model): |
| 27 | + PROFILE_STATUS = [ |
| 28 | + ("inactive", "Inactive"), |
| 29 | + ("pending", "Pending"), |
| 30 | + ("active", "Active"), |
| 31 | + ] |
| 32 | + user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) |
| 33 | + bio = models.TextField(blank=True, default="") |
| 34 | + avatar = models.ImageField(upload_to="avatars/", blank=True, null=True) |
| 35 | + profile_status = models.CharField(max_length=20, choices=PROFILE_STATUS) |
| 36 | + |
| 37 | + # Technician-specific fields |
| 38 | + years_experience = models.PositiveIntegerField(blank=True, null=True) |
| 39 | + months_experience = models.PositiveIntegerField(blank=True, null=True) |
| 40 | + tags = models.ManyToManyField(Tag, blank=True) # Expertise categories |
| 41 | + available_days = models.JSONField(blank=True, null=True) # Calendar availability data |
| 42 | + price_hour = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True) |
| 43 | + price_day = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True) |
| 44 | + |
| 45 | + def __str__(self): |
| 46 | + return str(self.user.username) |
| 47 | + |
| 48 | + |
| 49 | +class Review(models.Model): |
| 50 | + technician = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name="reviews") |
| 51 | + reviewer = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) |
| 52 | + rating = models.PositiveSmallIntegerField() |
| 53 | + review_text = models.TextField() |
| 54 | + created_at = models.DateTimeField(auto_now_add=True) |
| 55 | + |
| 56 | + def __str__(self): |
| 57 | + return str(self.technician.user.username) + " - " + str(self.rating) |
| 58 | + |
| 59 | + |
| 60 | +class Booking(models.Model): |
| 61 | + SERVICE_STATUS = [ |
| 62 | + ("pending", "Pending"), |
| 63 | + ("completed", "Completed"), |
| 64 | + ("cancelled", "Cancelled"), |
| 65 | + ] |
| 66 | + technician = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name="bookings") |
| 67 | + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="bookings") |
| 68 | + date_time_start = models.DateTimeField() |
| 69 | + date_time_end = models.DateTimeField() |
| 70 | + address = models.JSONField(blank=True, null=True) |
| 71 | + payment_done = models.BooleanField(default=False) |
| 72 | + price = models.DecimalField(max_digits=10, decimal_places=2) |
| 73 | + service_status = models.CharField(max_length=20, choices=SERVICE_STATUS, default="pending") |
| 74 | + |
| 75 | + def __str__(self): |
| 76 | + return f"Booking {self.id} - {self.technician.user.username} for {self.user.username}" |
0 commit comments