cleaned Maraudeur model, created MaraudeurManager, created some tests

This commit is contained in:
Arthur Gerbaud
2016-12-02 12:43:07 +01:00
parent 363ca64cab
commit f4bb37ae63
5 changed files with 98 additions and 90 deletions

View File

@@ -2,23 +2,9 @@ import datetime
from django.db import models
from django.contrib.auth.models import User, AnonymousUser
from django.contrib.auth.models import User, UserManager, AnonymousUser
# Create your models here.
class SingletonModel(models.Model):
class Meta:
abstract = True
def save(self, *args, **kwargs):
self.__class__.objects.exclude(id=self.id).delete()
super(SingletonModel, self).save(*args, **kwargs)
@classmethod
def load(cls):
try:
return cls.objects.get()
except cls.DoesNotExist:
return cls()
## Visiteur
@@ -53,78 +39,60 @@ class Professionnel(User):
class MaraudeurManager(UserManager):
""" Manager for Maraudeurs objects.
Updates `create`, `get_or_create` methods signatures : 'first_name', 'last_name'.
Add `set_referent` method (same signature).
"""
def create(self, first_name, last_name):
username = "%s.%s" % (first_name[0].lower(), last_name.lower())
data = {
'first_name': first_name,
'last_name': last_name,
'email': "%s@alsa68.org" % username,
}
return super().create_user(username, **data)
def get_or_create(self, first_name, last_name):
try:
maraudeur = self.get(first_name=first_name, last_name=last_name)
created = False
except self.model.DoesNotExist:
created = True
maraudeur = self.create(first_name, last_name)
return (maraudeur, created)
def get_referent(self):
try:
return self.get(is_superuser=True)
except self.model.DoesNotExist:
return None
def set_referent(self, first_name, last_name):
maraudeur, created = self.get_or_create(first_name, last_name)
for previous in self.get_queryset().filter(is_superuser=True):
previous.is_superuser = False
previous.save()
maraudeur.is_superuser = True
maraudeur.save()
return maraudeur
class Maraudeur(Professionnel):
""" Professionnels qui participent aux maraudes """
auto_fields = ['username', 'email', 'organisme']
# Donne accès aux vues "maraudes" et "suivi"
DEFAULT_ORGANISME = "ALSA"
objects = MaraudeurManager()
class Meta:
verbose_name = "Maraudeur"
def _fill_fields(self):
for field in self.auto_fields:
filling_func = "fill_%s" % field
try:
val = getattr(self, filling_func)()
except AttributeError:
raise ValueError("'%s' is not defined on %s" % (filling_func, self))
setattr(self, field, val)
def fill_email(self):
return "%s@alsa68.org" % self.username
def fill_username(self):
return "%s.%s" % (self.first_name[0].lower(), self.last_name.lower())
def fill_organisme(self):
try:
return Organisme.objects.get(nom=self.DEFAULT_ORGANISME)
except Organisme.DoesNotExist:
return None
def save(self, *args, **kwargs):
if not self.pk or not self.username or not self.email:
self._fill_fields()
self.is_staff = True
return super(Maraudeur, self).save(*args, **kwargs)
def __str__(self):
return "%s %s" % (self.first_name, self.last_name[0])
class ReferentMaraude(SingletonModel):
""" Référent de la maraude """
maraudeur = models.ForeignKey(Maraudeur)
class Meta:
verbose_name = "Référent de la maraude"
def __str__(self):
return 'Referent: %s' % self.maraudeur
def set_unique_referent(self):
""" Ensure 'is_referent' has only one 'True' value """
for maraudeur in Maraudeur.objects.all():
if maraudeur == self.maraudeur:
maraudeur.is_superuser= True
maraudeur.save()
else:
if maraudeur.is_superuser:
maraudeur.is_superuser = False
maraudeur.save()
def save(self, *args, **kwargs):
# On s'assure que le référent (administrateur) est unique
self.set_unique_referent()
return super().save(*args, **kwargs)
@classmethod
def get_referent(cls):
instance = cls.load()
return instance.maraudeur