Skip to content

Commit f62264e

Browse files
committed
Day 3: Users App Model Declaration
1 parent 773288f commit f62264e

File tree

1 file changed

+76
-1
lines changed

1 file changed

+76
-1
lines changed

users/models.py

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,76 @@
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

Comments
 (0)