utils.py 2.4 KB

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