from django.db import models from django.contrib.auth.models import User from django.conf import settings from PIL import Image from django.utils import timezone # MAKE EMAIL UNIQUE from django.contrib.auth.models import User, Group, Permission from django.contrib.contenttypes.models import ContentType import datetime # UNIQUE and NO BLANK fields while user-registration User._meta.get_field('email')._unique = True User._meta.get_field('email').blank = False User._meta.get_field('first_name').blank = False User._meta.get_field('last_name').blank = False # PATH FOR AGENCYPIC def picturepath_agency(instance, filename): # file will be uploaded to MEDIA_URL/agency_// return 'agencydata/agency_{0}/agencystats/{1}'.format(instance.pk, filename) # PATH FOR PROFILEPICS def picturepath_user(instance, filename): return 'agencydata/agency_{0}/agencystats/profilepics/{1}'.format(instance.agency.pk, filename) ''' Class AgencyNetworkPreperation Regelt den Join-Prozess einer Agentur in einen Verbund, um Anfrage und Status der Anfrage zu prüfen. Kommt nur zum tragen, wenn ein AgenturVerbund auf publicjoin=False ist! ''' class AgencyNetworkPreperation(models.Model): target_network = models.ForeignKey("AgencyNetwork", on_delete=models.CASCADE) wanted_agency = models.ForeignKey("Agency", on_delete=models.PROTECT, blank=True) status = models.IntegerField() ''' Class AgencyNetwork Bildet einen Agenturverbund ab ''' class AgencyNetwork(models.Model): name = models.CharField(default="", max_length=200) adminagencys = models.ManyToManyField("Agency", related_name="AdministrationAgencys") creator = models.ForeignKey(User, on_delete=models.PROTECT, blank=True) creator_agency = models.ForeignKey("Agency", on_delete=models.PROTECT, blank=True) created_on = models.DateTimeField(default=timezone.now) lastactivity = models.DateTimeField(default=timezone.now) members = models.ManyToManyField("Agency", related_name="MemberAgencys", blank=True) sharemembers = models.ManyToManyField("Agency", related_name="ShareMemberAgencys", blank=True) publicjoin = models.BooleanField(default=False) networkid = models.CharField(default="", max_length=30) standards = models.ManyToManyField("standards.Standards", related_name="sharedstandards", blank=True) def __str__(self): return f'{self.name}' ''' Class Agency Speichert alle Infos für die Agency, darunter später auch die Aufgaben und Bereiche Bezug normale User: Erhalten bei Erstellung durch den Administrator automatisch die aktuelle agency: request.user.profile.agency --> Dahinter ist das Agency-Objekt! ''' class Agency(models.Model): name = models.CharField(default="", max_length=200) inhaber = models.CharField(default="", max_length=200, blank=True) street = models.CharField(default="", max_length=200, blank=True) city = models.CharField(default="", max_length=200, blank=True) plz = models.CharField(default="", max_length=5, blank=True) agency_email = models.EmailField(default="", blank=True) phone = models.CharField(default="", max_length=50, blank=True) agencypic = models.ImageField(default='ag_default.jpg', upload_to=picturepath_agency, blank=True) # MONEY balance = models.FloatField(default=0.0, max_length=9, blank=True) nextdebiting = models.DateTimeField(default=timezone.now, blank=True) monthlyprice = models.FloatField(default=25.0, max_length=9, blank=True) # MODULEEINSTELLUNGEN FÜR DIE AGENTUR module_news = models.BooleanField(default=True) module_organizer = models.BooleanField(default=True) module_files = models.BooleanField(default=True) module_organigramm = models.BooleanField(default=True) # Steckbrief dynamisch aus Standard dynamicprofile = models.BooleanField(default=True) module_messages = models.BooleanField(default=True) module_chat = models.BooleanField(default=True) # KOSTENPFLICHTIGE MODULE # Abwesenheits- und Zeiterfassung # Modul aktiv/deaktiviert module_timemanagement = models.BooleanField(default=False) module_timemanagement_price = models.FloatField(default=10.0, max_length=9, blank=True) # Zeiterfassung Ja/Nein module_timemanagement_ze = models.BooleanField(default=False) vve = models.CharField(default="", max_length=200, blank=True) def __str__(self): return f'{self.name}' # Hier wird definiert, welche Parameter in der URL übertragen werden inkl. Bezeichner #def get_absolute_url(self): # return reverse('agency-update', kwargs={'pk':self.pk}) @property def get_photo_url(self): if self.agencypic and hasattr(self.agencypic, 'url'): return self.agencypic.url else: return settings.MEDIA_URL + "ag_default.jpg" ''' Class AgencyJob ''' class AgencyJob(models.Model): name = models.CharField(default="", max_length=80) agency = models.ForeignKey(Agency, on_delete=models.PROTECT) def __str__(self): return f'{self.name}' ''' Class Profile Klasse für die Zusatzinfos eines Nutzers. - Vorname - Nachname - Email - Bild - Telefonnummer - Fest - Mobil - Funktion - Auswahlfelder - Außendienst/Innendienst/Azubi - Rollen - Bereiche - Aufgaben ''' class Profile(models.Model): # Wenn der User gelöscht wird, wird auch das Profil gelöscht user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True, default=None) parent = models.ForeignKey(User, on_delete=models.PROTECT, blank=True, null=True, related_name='parent_user') phoneland = models.CharField(max_length=60, blank=True) phonemobile = models.CharField(max_length=60, blank=True) phone_public = models.BooleanField(default=False) # Wenn die Funktion gelöscht wird, wird die FUNC auf NULL gesetzt func = models.ForeignKey("AgencyJob", blank=True, null=True, default=None, on_delete=models.SET_NULL) # Wenn dieses Profil gelöscht wird, wird NICHT die Agency geslöscht agency = models.ForeignKey(Agency, on_delete=models.PROTECT) image = models.ImageField(default='default.jpg', upload_to=picturepath_user, blank=True) compfunc = models.CharField(max_length=60, blank=True) visible = models.BooleanField(default=True) persnumber = models.CharField(default="", max_length=50, blank=True) # TOOLTIPPS showtooltips = models.BooleanField(default=True) # NOTIFICATIONS #NEWS # Mitteilung bei neuen News innerhalb der Agentur news_mail = models.BooleanField(default=True) news_push = models.BooleanField(default=True) #STANDARDS # Benutzerstandard wurde veröffentlicht user_standard_public_mail = models.BooleanField(default=False) user_standard_public_push = models.BooleanField(default=True) #STANDARDS # Neue Standards agency_new_standard_mail = models.BooleanField(default=False) agency_new_standard_push = models.BooleanField(default=True) # GROUPS # Neuer Gruppe zugeordnet add_new_group_mail = models.BooleanField(default=False) add_new_group_push = models.BooleanField(default=True) # TASKS # Einer neuen Tätigkeit zugewiesen add_task_mail = models.BooleanField(default=False) add_task_push = models.BooleanField(default=True) # MESSAGES # Mitteilungen user_messages_mail = models.BooleanField(default=True) user_messages_push = models.BooleanField(default=True) # ONLINESTATUS ''' 0 = ONLINE - green 1 = BESCHAFTIGT - red 2 = ABWESEND - orange 3 = OFFLINE - grey ''' onlinestatus = models.IntegerField(default=0) def __str__(self): return f'{self.user.last_name}' # Hier Path für Templates des Models mit Parametern def get_absolute_url(self): return reverse('users-update', kwargs={'pk':self.pk}) # Erst Oberklasse speichern, dann Bild verkleinern ''' def save(self, **kwargs): super().save() if self.image: img = Image.open(self.image.path) # Bildspeichergröße if(img.height > 300 or img.width > 300): output_size = (300,300) img.thumbnail(output_size) img.save(self.image.path) baseheight = 560 hpercent = (baseheight / float(img.size[1])) wsize = int((float(img.size[0]) * float(hpercent))) img = img.resize((wsize, baseheight), Image.ANTIALIAS) img.save(self.image.path) ''' @property def get_photo_url(self): if self.image and hasattr(self.image, 'url'): return self.image.url else: return settings.MEDIA_URL + "default.jpg" class UserTime(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True, default=None) # TIME ELEMENTS wd_mo = models.FloatField(default=8.0) wd_tu = models.FloatField(default=8.0) wd_we = models.FloatField(default=8.0) wd_th = models.FloatField(default=8.0) wd_fr = models.FloatField(default=8.0) loose_holidedate = models.CharField(default="30.04", max_length=5) startdate = models.DateField(default=None, blank=True, null=True) class UserYearAbsenceInfo(models.Model): agency = models.ForeignKey(Agency, on_delete=models.PROTECT, default=None) user = models.ForeignKey(User, on_delete=models.CASCADE) year = models.IntegerField() days_inuse = models.FloatField(default=0.0) days = models.FloatField(default=24.0) restdays = models.FloatField(default=0.0) ''' CLASS AgencyGroup Hier werden die Gruppen mit der Agency verbunden ''' class AgencyGroup(models.Model): group = models.OneToOneField(Group, on_delete=models.CASCADE) agency = models.ForeignKey(Agency, on_delete=models.PROTECT) agencygroupname = models.CharField(max_length=60, blank=True) savefordel = models.BooleanField(default=False) is_admin = models.BooleanField(default=False) class Meta: permissions = [ ('agencyinfo', 'Agenturinformationen verändern'), ('agencynetwork', 'Agenturverbund bearbeiten'), ('usermanager', 'Mitarbeiter bearbeiten'), ('groupmanager', 'Gruppen bearbeiten'), ('structuremanager', 'Struktur bearbeiten'), ('standardmanager', 'Standards bearbeiten und freischalten'), ('modulenews', 'News bearbeiten und veröffentlichen'), ('modulesconfig', 'Module verwalten'), ('moduleorganizer', 'Organizer bearbeiten'), ('filesmanager', 'Dateien bearbeiten'), ('filedirmanager', 'Ordner bearbeiten'), ('filesviewer', 'Dateien lesen'), ('absencemanager', 'Abwesenheiten verwalten') ] # SUBCLASS class UserFullName(User): class Meta: proxy = True def __unicode__(self): return "placeholder" def __str__(self): return f'{self.first_name + " " + self.last_name}'