digitaleagenturnc/users/models.py

316 lines
10 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
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_<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 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}'