diff --git a/topologie/models.py b/topologie/models.py index e469eefb..441a9f78 100644 --- a/topologie/models.py +++ b/topologie/models.py @@ -1,7 +1,17 @@ from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.fields import GenericForeignKey +from django.core.exceptions import ValidationError +def make_port_related(port): + related_port = port.related + related_port.related = port + related_port.save() + +def clean_port_related(port): + related_port = port.related_port + related_port.related = None + related_port.save() class Switch(models.Model): building = models.CharField(max_length=10) @@ -20,22 +30,23 @@ class Port(models.Model): details = models.CharField(max_length=255, blank=True) room = models.ForeignKey('Room', on_delete=models.PROTECT, blank=True, null=True) machine_interface = models.OneToOneField('machines.Interface', on_delete=models.PROTECT, blank=True, null=True) + related = models.OneToOneField('self', null=True, blank=True, related_name='related_port') class Meta: - unique_together = ('_content_type', '_object_id') + unique_together = ('switch', 'port') - _content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, blank=True, null=True) - _object_id = models.PositiveIntegerField(blank=True, null=True) - goto = GenericForeignKey('_content_type', '_object_id') - - @property - def comefrom(self): - ctype = ContentType.objects.get_for_model(self.__class__) - try: - event = Port.objects.get(_content_type__pk=ctype.id, _object_id=self.id) - except: - return None - return event + def clean(self): + if self.room and self.machine_interface or self.room and self.related or self.machine_interface and self.related: + raise ValidationError("Chambre, interface et related_port sont mutuellement exclusifs") + if self.related==self: + raise ValidationError("On ne peut relier un port à lui même") + if self.related and not self.related.related: + if self.related.machine_interface or self.related.room: + raise ValidationError("Le port relié est déjà occupé, veuillez le libérer avant de créer une relation") + else: + make_port_related(self) + elif hasattr(self, 'related_port'): + clean_port_related(self) def __str__(self): return str(self.switch) + " - " + str(self.port)