validator.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. '''
  2. @author: olivier.massot, 2018
  3. '''
  4. from core.validation import NetgeoValidator
  5. from core.validation_errors import DuplicatedPk, RelationError
  6. from schemas.netgeo_2_2_doe.models import Artere, Cable, Equipement, Noeud, \
  7. Tranchee, Zapbo
  8. class Netgeo22DoeValidator(NetgeoValidator):
  9. schema_name = "Netgeo v2.2 DOE"
  10. models = [Artere, Cable, Equipement, Noeud, Tranchee, Zapbo]
  11. def _technical_validation(self):
  12. # construction de l'index
  13. self.index = {}
  14. for model in self.dataset:
  15. self.index[model] = {}
  16. for item in self.dataset[model]:
  17. pk_value = getattr(item, model.pk)
  18. if pk_value in self.index[model]:
  19. self.log_error(DuplicatedPk("Doublons dans le champs", filename=model.filename, field=model.pk))
  20. else:
  21. self.index[model][pk_value] = item
  22. del self.dataset
  23. if self.errors:
  24. return
  25. # rattachement les noeuds aux artères
  26. for artere in self.index[Artere]:
  27. try:
  28. artere.noeud_a = self.index[Artere][artere.AR_NOEUD_A]
  29. except KeyError:
  30. self.log_error(RelationError("Le noeud '{}' n'existe pas".format(artere.AR_NOEUD_A), filename=Artere.filename, field="AR_NOEUD_A"))
  31. try:
  32. artere.noeud_b = self.index[Artere][artere.AR_NOEUD_B]
  33. except KeyError:
  34. self.log_error(RelationError("Le noeud '{}' n'existe pas".format(artere.AR_NOEUD_B), filename=Artere.filename, field="AR_NOEUD_A"))
  35. # rattachement des equipements aux cables
  36. for cable in self.index[Cable]:
  37. try:
  38. cable.equipement_a = self.index[Cable][cable.CA_EQ_A]
  39. except KeyError:
  40. self.log_error(RelationError("L'équipement '{}' n'existe pas".format(cable.AR_NOEUD_A), filename=Cable.filename, field="CA_EQ_A"))
  41. try:
  42. cable.equipement_b = self.index[Cable][cable.CA_EQ_B]
  43. except KeyError:
  44. self.log_error(RelationError("L'équipement '{}' n'existe pas".format(cable.AR_NOEUD_B), filename=Cable.filename, field="CA_EQ_B"))
  45. if self.errors:
  46. return
  47. # Contrôler dans la base si des éléments portant ces codes existent à des emplacements différents
  48. # Contrôler l'emprise des ZAPBO
  49. if __name__ == "__main__":
  50. from core.constants import MAIN
  51. subject = MAIN / "work" / "STURNO_192AP1_REC_171211_OK"
  52. report = Netgeo22DoeValidator.submit(subject)
  53. print(report)