HealthSphere / apps /users /models.py
SabinaRosie
files root changed for deploy
e60ac7a
Raw
History Blame Contribute Delete
4.4 kB
from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
class UserManager(BaseUserManager):
def create_user(self, email, password=None, **extra_fields):
if not email:
raise ValueError('The Email field must be set')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password=None, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
class User(AbstractUser):
ROLE_CHOICES = [
('patient', 'Patient'),
('doctor', 'Doctor/Nurse'),
('admin', 'Admin'),
]
username = None
email = models.EmailField(unique=True)
full_name = models.CharField(max_length=255, blank=True)
role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='patient')
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
class Doctor(models.Model):
VERIFICATION_STATUS = [
('unverified', 'Unverified'),
('pending', 'Pending Review'),
('verified', 'Verified'),
('rejected', 'Rejected'),
]
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='doctor_profile', null=True, blank=True)
name = models.CharField(max_length=255)
specialty = models.CharField(max_length=255, blank=True)
qualification = models.CharField(max_length=255, blank=True)
experience = models.CharField(max_length=50, blank=True)
bio = models.TextField(blank=True)
location = models.CharField(max_length=255, blank=True)
phone = models.CharField(max_length=20, blank=True)
avatar_url = models.URLField(max_length=500, blank=True)
# Verification Documents
citizenship_card = models.FileField(upload_to='doctor_docs/citizenship/', null=True, blank=True)
medical_license = models.FileField(upload_to='doctor_docs/licenses/', null=True, blank=True)
recommendation_letter = models.FileField(upload_to='doctor_docs/recommendations/', null=True, blank=True)
verification_status = models.CharField(max_length=20, choices=VERIFICATION_STATUS, default='unverified')
rating = models.DecimalField(max_digits=3, decimal_places=1, default=4.5)
available = models.BooleanField(default=True)
reviews_count = models.IntegerField(default=0)
def __str__(self):
return f"{self.name} - {self.specialty} ({self.verification_status})"
class Appointment(models.Model):
CONSULTATION_TYPES = [
('Video Consult', 'Video Consult'),
('Audio Consult', 'Audio Consult'),
('Clinic Visit', 'Clinic Visit'),
]
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='appointments', null=True, blank=True)
doctor = models.ForeignKey(Doctor, on_delete=models.CASCADE, related_name='appointments')
patient_name = models.CharField(max_length=255)
date = models.CharField(max_length=100) # e.g., 'Mon, Aug 25'
time = models.CharField(max_length=100) # e.g., '09:00 AM - 09:30 AM'
type = models.CharField(max_length=50, choices=CONSULTATION_TYPES, default='Video Consult')
is_rescheduled = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Appointment: {self.patient_name} with {self.doctor.name} on {self.date} at {self.time}"
class Notification(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='notifications', null=True, blank=True)
title = models.CharField(max_length=255)
message = models.TextField()
is_read = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
user_display = self.user.email if self.user else "System"
return f"Notification: {self.title} for {user_display}"