mirror of
https://github.com/AdrienHallet/HaitiWater.git
synced 2026-10-28 18:36:27 +00:00
107 lines
4.0 KiB
Python
107 lines
4.0 KiB
Python
from django.contrib.auth.models import User
|
|
from django.contrib.postgres.fields import ArrayField
|
|
from django.db import models
|
|
from django.db.models.signals import post_save
|
|
from django.dispatch import receiver
|
|
|
|
from ..utils.common_models import *
|
|
from ..water_network.models import Zone, Element
|
|
|
|
|
|
class Profile(models.Model):
|
|
|
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
|
phone_number = models.CharField("Numéro de téléphone", max_length=10, null=True)
|
|
zone = models.ForeignKey(Zone, verbose_name="Zone gérée", related_name="admins",
|
|
null=True, on_delete=models.CASCADE)
|
|
outlets = ArrayField(models.CharField(max_length=30), blank=True, default=list, null=True)
|
|
# Should be a ManyToManyField to Element, but refactor requires to dump DB
|
|
|
|
def get_phone_number(self):
|
|
return self.phone_number if self.phone_number is not None and self.phone_number != "0" else "Non spécifié"
|
|
|
|
def infos(self):
|
|
result = {}
|
|
result["ID"] = self.id
|
|
result["Identifiant"] = self.user.username
|
|
result["Prénom"] = self.user.first_name
|
|
result["Nom de famille"] = self.user.last_name
|
|
result["Email"] = self.user.email
|
|
result["Numéro de téléphone"] = self.get_phone_number()
|
|
result["Role"] = self.user.groups.values_list('name', flat=True)[0]
|
|
|
|
if self.zone:
|
|
result["Zone gérée"] = self.zone.name
|
|
result["_zone"] = self.zone.id
|
|
elif len(self.outlets) > 0:
|
|
all_outlets = ""
|
|
for outlet_id in self.outlets:
|
|
outlet = Element.objects.filter(id=outlet_id).first()
|
|
if outlet is not None:
|
|
all_outlets += outlet.name + ", "
|
|
result["Fontaines gérées"] = all_outlets[:-2]
|
|
result["_outlets"] = self.outlets
|
|
|
|
return result
|
|
|
|
def log_add(self, transaction):
|
|
add(self._meta.model_name, self.infos(), transaction)
|
|
|
|
def log_delete(self, transaction):
|
|
delete(self._meta.model_name, self.infos(), transaction)
|
|
|
|
def log_edit(self, old, transaction):
|
|
edit(self._meta.model_name, self.infos(), old, transaction)
|
|
|
|
def get_subordinates(self):
|
|
sub = []
|
|
for user in User.objects.all():
|
|
if user.username == "admin": # Skip the admin
|
|
pass
|
|
elif user.profile.zone is not None: # Zone manager
|
|
if user.profile.zone.name in self.zone.subzones and user.username != self.user.username:
|
|
sub.append(user)
|
|
elif len(user.profile.outlets) > 0: # Fountain manager
|
|
to_add = True
|
|
for outlet_id in user.profile.outlets:
|
|
outlet = Element.objects.filter(id=outlet_id).first()
|
|
if outlet is not None and outlet.zone.name not in self.zone.subzones:
|
|
to_add = False
|
|
if to_add:
|
|
sub.append(user)
|
|
return sub
|
|
|
|
def get_zone(self):
|
|
if self.zone:
|
|
return self.zone.name
|
|
else:
|
|
outlet = Element.objects.filter(id=self.outlets[0])
|
|
if len(outlet) != 1:
|
|
return ""
|
|
outlet = outlet[0]
|
|
higher_zone = outlet.zone
|
|
for elem in self.outlets[1:]:
|
|
outlet = Element.objects.filter(id=elem)
|
|
if len(outlet) != 1:
|
|
return ""
|
|
outlet = outlet[0]
|
|
other_zone = outlet.zone
|
|
if higher_zone.name in other_zone.subzones and other_zone.name not in higher_zone.subzones:
|
|
higher_zone = other_zone
|
|
return higher_zone.name
|
|
|
|
|
|
@receiver(post_save, sender=User)
|
|
def create_user_profile(sender, instance, created, **kwargs):
|
|
raw = kwargs.get('raw', False)
|
|
if not raw:
|
|
if created:
|
|
Profile.objects.create(user=instance)
|
|
|
|
|
|
@receiver(post_save, sender=User)
|
|
def save_user_profile(sender, instance, **kwargs):
|
|
raw = kwargs.get('raw', False)
|
|
if not raw:
|
|
instance.profile.save()
|