models.py 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. from django.db import models
  2. from django.db.models import Q
  3. from django.core.validators import MaxValueValidator
  4. from django.utils import timezone
  5. from django.contrib.auth.models import Group
  6. from django.contrib.contenttypes.fields import GenericRelation
  7. from django.core.exceptions import ValidationError
  8. from adhesions.models import Adherent
  9. from banking.models import Payment
  10. class IPResource(models.Model):
  11. ip = models.GenericIPAddressField(verbose_name='IP')
  12. mask = models.PositiveIntegerField(validators=[MaxValueValidator(128)],
  13. default=0, verbose_name='Masque')
  14. @property
  15. def in_use(self):
  16. if Service.objects.filter(ip_resources=self, start__lte=timezone.now(),
  17. end__isnull=True).exists():
  18. return True
  19. else:
  20. return False
  21. class Meta:
  22. verbose_name = 'Ressource IP'
  23. verbose_name_plural = 'Ressources IP'
  24. def __str__(self):
  25. r = str(self.ip)
  26. if self.mask:
  27. r += '/%d' % self.mask
  28. return r
  29. class ServiceType(models.Model):
  30. name = models.CharField(max_length=64, verbose_name='Nom')
  31. group = models.ForeignKey(Group, null=True, blank=True,
  32. verbose_name='Groupe de gestion',
  33. related_name='service_types')
  34. class Meta:
  35. verbose_name = 'Type de service'
  36. verbose_name_plural = 'Types de service'
  37. def __str__(self):
  38. return self.name
  39. class Service(models.Model):
  40. adherent = models.ForeignKey(Adherent, verbose_name='Adhérent', null=True, blank=True)
  41. service_type = models.ForeignKey(ServiceType, related_name='services',
  42. verbose_name='Type de service')
  43. notes = models.TextField(blank=True, default='')
  44. contribution = GenericRelation(Payment,
  45. content_type_field='reason_type',
  46. object_id_field='reason_id',
  47. related_query_name='service')
  48. ip_resources = models.ManyToManyField(IPResource, blank=True,
  49. verbose_name='Ressources IP')
  50. start = models.DateTimeField(null=True, blank=True, verbose_name='Début du service')
  51. end = models.DateTimeField(null=True, blank=True, verbose_name='Fin du service')
  52. # Designed with a Karnaugh map, should be correct...
  53. @staticmethod
  54. def get_forthcoming_filter():
  55. now = timezone.now()
  56. return Q(start__isnull=True, end__isnull=True) \
  57. | Q(start__gt=now)
  58. @staticmethod
  59. def get_ongoing_filter():
  60. now = timezone.now()
  61. return Q(start__lte=now, end__isnull=True) \
  62. | Q(start__lte=now, end__gt=now) \
  63. | Q(start__isnull=True, end__gt=now)
  64. @staticmethod
  65. def get_finished_filter():
  66. now = timezone.now()
  67. return Q(end__lte=now)
  68. @property
  69. def is_ongoing(self):
  70. if (not self.start or self.start < timezone.now()) \
  71. and (not self.end or self.end > timezone.now()) \
  72. and (self.start or self.end):
  73. return True
  74. else:
  75. return False
  76. def clean(self):
  77. if self.start and self.end and self.start > self.end:
  78. raise ValidationError("La date de début du service doit être antérieur "
  79. "à la date de fin du service.")
  80. def __str__(self):
  81. return str(self.service_type) + ' ' + str(self.adherent)