models.py 2.9 KB

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