digitaleagenturnc/users/models.py

177 lines
5.6 KiB
Python

from django.db import models
from django.contrib.auth.models import User, AbstractBaseUser
from django.conf import settings
from PIL import Image
# MAKE EMAIL UNIQUE
from django.contrib.auth.models import AbstractUser, User
from django.contrib.auth.models import Permission
# 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
def picturepath_agency(instance, filename):
# file will be uploaded to MEDIA_ROOT/agency_<id>/<subdirs>/<filename>
return 'agency_{0}/agencystats/{1}'.format(instance.pk, filename)
def picturepath_user(instance, filename):
# file will be uploaded to MEDIA_ROOT/agency_<id>/<subdirs>/<filename>
return 'agency_{0}/agencystats/profilepics/{1}'.format(instance.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)
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)
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)
# 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/userprofilepics/default.jpg"
# PERMISSIONS - Über alle Modelle hinweg, in der url.py wird dann die route verhindert!
# Im template: if perms.users.PERMISSION
class Meta:
permissions = [
('agency_change', 'Agenturinformationen verändern'),
('users_usermanagement', 'Benutzer bearbeiten'),
('areas_management', 'Bereiche bearbeiten'),
('tasks_management', 'Aufgabenbereiche bearbeiten'),
('standard_management', 'Standards bearbeiten und freischalten'),
('news_management', 'News bearbeiten und veröffentlichen'),
('ql_management', 'Quicklinks bearbeiten und erstellen')
]