/prueba/controllers/Ciclos.py

https://github.com/sgip/ultimo-repo · Python · 115 lines · 92 code · 14 blank · 9 comment · 23 complexity · df398ecb5bf5f1a0082036882b1de09e MD5 · raw file

  1. from prueba.model import DBSession
  2. from prueba.model.modelos import Item, Relacion,Fase
  3. from sqlalchemy import or_,and_
  4. class Ciclos:
  5. def __init__(self,codItem,itemFin):
  6. self.codItem= codItem
  7. self.itemFin = itemFin
  8. """metodo que verifica si se forma un ciclo al intentar anadir un item"""
  9. def calcular(self):
  10. item = DBSession.query(Item).filter_by(coditem=self.codItem).one()
  11. itemFase = item.fase.items
  12. auxItemFase = list()
  13. padres = list()
  14. hijos = list()
  15. relacion_act = list()
  16. listaItem = list()
  17. pila = list()
  18. visitados = list()
  19. ciclo = 0
  20. padres.append(self.codItem)
  21. hijos.append(self.itemFin)
  22. listaItem.append(self.codItem)
  23. for i in itemFase:
  24. auxItemFase.append(i.coditem)
  25. for x in itemFase:
  26. relacionAux = DBSession.query(Relacion).filter_by(coditeminicio=x.coditem).filter_by(tipo='padre-hijo').all()
  27. for j in relacionAux:
  28. padres.append(j.coditeminicio)
  29. listaItem.append(j.coditeminicio)
  30. hijos.append(j.coditemfin)
  31. for inicio in padres:
  32. pila.append(inicio)
  33. while(pila and ciclo==0):
  34. origen = pila.pop()
  35. if not origen in visitados:
  36. visitados.append(origen)
  37. while origen in listaItem:
  38. i = listaItem.index(origen)
  39. listaItem[i] = -1
  40. if hijos[i] in visitados:#mirar si no fue visistado.hay ciclo y se pasa al sgt valor en la lista padres
  41. pila = list()
  42. visitados = list()
  43. listaItem = list()
  44. ciclo = 1
  45. return ciclo
  46. break
  47. else:
  48. pila.append(hijos[i])
  49. visitados.append(hijos[i])
  50. if ciclo==1:
  51. break
  52. listaItem=list()
  53. visitados=list()
  54. for x in padres:
  55. listaItem.append(x)
  56. return ciclo
  57. """verifica si un item tiene un antecesor directo o esta relacionado con uno a traves de su padre"""
  58. def tieneAntecesor(self):
  59. #trae el item correspondiente
  60. item = DBSession.query(Item).filter_by(coditem=self.codItem).one()
  61. # los items de la fase actual
  62. itemFase = item.fase.items
  63. faseItemAnt = int(item.fase.codfase) -1
  64. #los antecesores y sucesores del item dado
  65. antecesores = DBSession.query(Relacion).filter_by(coditemfin=self.codItem).filter_by(tipo='antecesor-sucesor').all()
  66. #fase anterior a la actual
  67. faseAnt = DBSession.query(Fase).filter_by(codfase=faseItemAnt).one()
  68. #items de la fase anterior
  69. itemFaseAnt = DBSession.query(Item).filter_by(fase=faseAnt).all()
  70. itemFaseAnterior = list()
  71. pila = list()
  72. print "########################### items fase anterior ####################################### ", self.codItem
  73. for h in itemFaseAnt:
  74. itemFaseAnterior.append(h.coditem)
  75. print h.coditem
  76. #si tiene una antecesor directo, retorna que tiene antecesor
  77. for j in antecesores:
  78. if j.coditeminicio in itemFaseAnterior:
  79. return 1
  80. #los items que son padres del actual
  81. padres = DBSession.query(Relacion).filter_by(coditemfin=self.codItem).filter_by(tipo='padre-hijo').all()
  82. for i in padres:
  83. pila.append(i.coditeminicio)
  84. while(pila):
  85. x = pila.pop()
  86. antecesores = DBSession.query(Relacion).filter_by(coditemfin=x).filter_by(tipo='antecesor-sucesor').all()
  87. cantidad=0
  88. print "###################################################################"
  89. for m in antecesores:
  90. cantidad = cantidad + 1
  91. m.coditeminicio
  92. print "###################################################################"
  93. if cantidad == 0:
  94. antecesores = DBSession.query(Relacion).filter_by(coditemfin=x).filter_by(tipo='padre-hijo').all()
  95. for i in antecesores:
  96. pila.append(i.coditeminicio)
  97. else:
  98. for j in antecesores:
  99. if j.coditeminicio in itemFaseAnterior:
  100. return 1
  101. return 0