from django.db import models from django.contrib.auth.models import User from colorfield.fields import ColorField from datetime import datetime # Create your models here. class Reference(models.Model): name = models.CharField(max_length=50) date = models.DateField(blank=True) class Business(models.Model): name = models.CharField(max_length=50) email = models.EmailField(unique=True) financial_number = models.CharField(max_length=50) vat = models.BooleanField(default=False) commercial_registration = models.CharField(max_length=50) phone_number = models.CharField(max_length=50) website = models.URLField(null=True) BUSINESS_TYPE = ( ('ASSOCIATIONS', 'ASSOCIATIONS'), ('HEALTHCARE', 'HEALTHCARE'), ('LUXURY', 'LUXURY'), ('MANUFACTURING', 'MANUFACTURING'), ('NON-PROFIT', 'NON-PROFIT'), ('EDUCATION', 'EDUCATION'), ('ENTERTAINMENT', 'ENTERTAINMENT'), ('LOGISTICS', 'LOGISTICS'), ('RETAIL', 'RETAIL'), ('AUTOMOTIVE', 'AUTOMOTIVE'), ) business_type = models.CharField(max_length=200, choices=BUSINESS_TYPE) logo = models.ImageField() class Meta: verbose_name_plural = u'Businesses' class CustomerProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) email = models.EmailField(unique=True) mobile_number = models.CharField(max_length=50) password = models.CharField(max_length=128) personal_website = models.URLField(null=True) STATUS_CHOICES = ( ('Active', 'Active'), ('Suspended', 'Suspended'), ('Terminated', 'Terminated'), ) status = models.CharField(max_length=200, choices=STATUS_CHOICES) reference = models.ForeignKey(Reference, on_delete=models.CASCADE, null=True) business = models.ForeignKey(Business, on_delete=models.CASCADE, null=True) def __str__(self): return self.user.username class StaffProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) image = models.ImageField(null=True) email = models.EmailField(unique=True) mobile_number = models.CharField(max_length=50) password = models.CharField(max_length=128) Staff_CHOICES = ( ('Developer', 'Developer'), ('Designer', 'Designer'), ('Support', 'Support'), ('Project Manager', 'Project Manager'), ) position = models.CharField(max_length=100) intern = models.BooleanField(default=False) active = models.BooleanField(default=True) def __str__(self): return self.user.username class ProjectType(models.Model): name = models.CharField(max_length=50) color = ColorField(default='#FF0000') class Project(models.Model): name = models.CharField(max_length=50) customer = models.ForeignKey(CustomerProfile, on_delete=models.CASCADE, null=True) manager = models.ForeignKey(StaffProfile, on_delete=models.CASCADE, null=True) project_type = models.ManyToManyField('ProjectType', default='', related_name='manager_project') details = models.TextField() members = models.ManyToManyField('StaffProfile', default='', related_name='members_project') STATUS_CHOICES = ( ('Active', 'Active'), ('Completed', 'Completed'), ('Pending', 'Pending'), ('Cancelled', 'Cancelled'), ) status = models.CharField(max_length=200, choices=STATUS_CHOICES) start_date = models.DateField() end_date = models.DateField() project_id = models.CharField(max_length=20, null=True, blank=True) # Allow null and blank for initial creation def save(self, *args, **kwargs): if not self.project_id: # Get the last two digits of the current year current_year = str(datetime.now().year)[-2:] # Find the maximum project ID in the database and increment it max_id = Project.objects.aggregate(models.Max('project_id'))['project_id__max'] new_id = str(int(max_id[-4:]) + 1).zfill(4) if max_id else '0001' # If no existing records, start with '0001' self.project_id = 'P' + current_year + new_id # Add 'p' prefix super(Project, self).save(*args, **kwargs) class Milestone(models.Model): title = models.CharField(max_length=150) description = models.TextField() project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) start_date = models.DateField() end_date = models.DateField() class Epic(models.Model): title = models.CharField(max_length=150) description = models.TextField() project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) start_date = models.DateField() end_date = models.DateField() class ProjectRequirement(models.Model): content = models.CharField(max_length=350) project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) class ProjectFile(models.Model): name = models.CharField(max_length=350) file = models.FileField(blank=True) date = models.DateField() project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) class ProjectCredential(models.Model): emailorusername = models.CharField(max_length=350) password = models.CharField(max_length=350) usedfor = models.CharField(max_length=350) project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True) class Note(models.Model): text = models.TextField(blank=True) date = models.DateTimeField(null=True,blank=True) user = models.ForeignKey(User, on_delete=models.CASCADE, null=True,blank=True) color = ColorField(default='#FF0000',blank=True)