from django.db import models from common.models.baseModels import BaseModel from common.models.choiceModels import InvitationStatus from common.utils.fileManager import DynamicUploadTo from django.contrib.postgres.fields import ArrayField from django.conf import settings from notifications.models import Notification from users.models import User NICKNAME_LEN = 20 class Project(BaseModel): title = models.CharField(max_length=20) is_team = models.BooleanField(default=False) team_name = models.CharField(max_length=20, blank=True) category = ArrayField(models.CharField(max_length=20), default=list) is_published = models.BooleanField(default=False) view_count = models.IntegerField(default=0) like_count = models.IntegerField(default=0) scrap_count = models.IntegerField(default=0) is_represent = models.BooleanField(default=False) now_worker = models.CharField(max_length=NICKNAME_LEN, blank=True) thumbnail = models.ImageField(upload_to=DynamicUploadTo("project", "thumbnail"), null=True, blank=True) code_id = models.CharField(max_length=26, null=True, blank=True) owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='owned_projects', to_field="id") likers = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='liked_projects', blank=True) scrappers = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name='scrapped_projects', blank=True) def delete(self, *args, **kwargs): if self.thumbnail: self.thumbnail.delete(save=False) super().delete(*args, **kwargs) class ProjectTeamList(BaseModel): project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name='team_project_member_list', to_field='id') user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='team_project_list',to_field='id') class ProjectInvitation(BaseModel): from_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sent_invitations') to_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_invitations') project = models.ForeignKey(Project, on_delete=models.CASCADE) status = models.CharField(max_length=10, choices=InvitationStatus.choices) notification = models.OneToOneField(Notification, on_delete=models.CASCADE, related_name='project_invitation', null=True, blank=True)