from django.db import models from django.contrib.auth.models import User, AbstractUser from django.conf import settings from PIL import Image from django.utils import timezone # MAKE EMAIL UNIQUE from django.contrib.auth.models import AbstractUser, User, Group, Permission from django.contrib.contenttypes.models import ContentType # 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_ROOT/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 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='agencymain/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) # MODULEEINSTELLUNGEN FÜR DIE AGENTUR module_news = models.BooleanField(default=True) module_quicklinks = models.BooleanField(default=True) module_files = models.BooleanField(default=True) module_organigramm = models.BooleanField(default=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 "/media/agencymain/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) # Wenn die Funktion gelöscht wird, wird die FUNC auf NULL gesetzt func = models.ForeignKey(AgencyJob, blank=True, null=True, 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='userprofilepics/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) 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 "/media/default.jpg" ''' 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'), ('usermanager', 'Mitarbeiter bearbeiten'), ('groupmanager', 'Gruppen bearbeiten'), ('structuremanager', 'Struktur bearbeiten'), ('standardmanager', 'Standards bearbeiten und freischalten'), ('modulenews', 'News bearbeiten und veröffentlichen'), ('modulesconfig', 'Module verwalten'), ('modulequicklinks', 'Quicklinks bearbeiten'), ('filesmanager', 'Dateien bearbeiten'), ('filedirmanager', 'Ordner bearbeiten'), ('filesviewer', 'Dateien lesen') ] # SUBCLASS class UserFullName(User): class Meta: proxy = True def __unicode__(self): return "MEIN NAME" def __str__(self): return f'{self.first_name + " " + self.last_name}'