utils.py 3.4 KB

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