digitaleagenturnc/users/models.py

218 lines
6.8 KiB
Python

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
# 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_<id>/<subdirs>/<filename>
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}'