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) 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', 'Benutzer bearbeiten'), ('groupmanager', 'Gruppen bearbeiten'), ('areaconfig', 'Bereiche bearbeiten'), ('activityconfig', 'Tätigkeiten bearbeiten'), ('standardmanager', 'Standards bearbeiten und freischalten'), ('modulenews', 'News bearbeiten und veröffentlichen'), ('modulesconfig', 'Module verwalten'), ('modulequicklinks', 'Quicklinks bearbeiten') ]