320 lines
10 KiB
Python
320 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 = 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}' |