validator.py 2.8 KB

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