utils.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from django.core.mail.message import EmailMultiAlternatives
  2. from django.db.models import Q
  3. from django.utils import timezone
  4. from django.forms import widgets
  5. from django.utils.safestring import mark_safe
  6. from django.conf import settings
  7. # Ce widget permet d’afficher un champ de formulaire sous forme de texte
  8. class StringWidget(widgets.Input):
  9. def render(self, name, value, attrs=None):
  10. # Create a hidden field first
  11. hidden_field = widgets.HiddenInput(attrs)
  12. return mark_safe(u'%s %s' % (value, hidden_field.render(value, attrs)))
  13. # Cette fonction permet d’obtenir un filtre s’appliquant aux paiements et aux allocations de ressources
  14. def get_active_filter(prefix=''):
  15. if prefix and not prefix.endswith('__'):
  16. prefix += '__'
  17. now = timezone.now()
  18. # Début antérieur et fin non spécifié ou postérieur
  19. return Q(**{prefix + 'start__lte': now}) & (Q(**{prefix + 'end__isnull': True}) | Q(**{prefix + 'end__gte': now}))
  20. # Cette fonction vérifie que l’object « instance » ne chevauche pas temporellement un objet présent dans « queryset »
  21. # Le model associé doit posséder deux attributs « start » et « end ».
  22. # L’attribut « start » doit être obligatoire.
  23. def is_overlapping(instance, queryset):
  24. # Le champ « start » ne doit pas être None pour les comparaisons qui suivent
  25. if not instance.start:
  26. return False # Une erreur sera levé au niveau de ce field spécifiquement
  27. # S’il s’agit d’une modification et non d’un ajout, il faut ignorer l’objet déjà présent en db
  28. if instance.pk:
  29. queryset = queryset.exclude(pk=instance.pk)
  30. for existing in queryset.all():
  31. if instance.end and existing.end:
  32. # Les deux périodes sont terminées
  33. latest_start = max(instance.start, existing.start)
  34. earliest_end = min(instance.end, existing.end)
  35. if earliest_end > latest_start:
  36. return True
  37. elif existing.end:
  38. assert(not instance.end)
  39. # La période existante est terminée et doit donc se terminer avant la modifiée
  40. if existing.end > instance.start:
  41. return True
  42. elif instance.end:
  43. assert(not existing.end)
  44. # La période existante n’est terminée, la modifiée doit se terminer avant
  45. if instance.end > existing.start:
  46. return True
  47. else:
  48. assert(not instance.end and not existing.end)
  49. # Aucune des périodes n’est terminées
  50. return True
  51. def send_notification(subject, message, recipients, **kwargs):
  52. mail = EmailMultiAlternatives(
  53. '%s%s' % (settings.EMAIL_SUBJECT_PREFIX, subject), message,
  54. settings.SERVER_EMAIL, recipients, **kwargs,
  55. )
  56. mail.send()