def insertarAncestro(self, kw):
        global inserciones
        inserciones = inserciones + 1
        print "el numero de inserciones es :", inserciones
        if inserciones == 1:
            item = DBSession.query(Item).get(kw['id_item1'])
            id_item = item.id_item
            version_anterior = item.version
            version_nueva = int(item.version) + 1
            linea_bases_item = item.linea_bases

            #Comprobamos que no se encuentre en una Linea Base
            if linea_bases_item != []:
                for linea_base_item in linea_bases_item:
                    flash(
                        _("No se puede agregar la relacion! El Item se encuentra en una Linea Base..."
                          ), 'error')
                    return

            #El Item cambia de version al agregar la relacion
            itemHistorial = ItemHistorial()
            itemHistorial.id_item = item.id_item
            itemHistorial.id_tipo_item = item.id_tipo_item
            itemHistorial.codigo = item.codigo
            itemHistorial.descripcion = item.descripcion
            itemHistorial.complejidad = item.complejidad
            itemHistorial.prioridad = item.prioridad
            itemHistorial.estado = "Desarrollo"
            itemHistorial.version = version_anterior
            itemHistorial.observacion = item.observacion
            itemHistorial.fecha_modificacion = item.fecha_modificacion
            item.version = version_nueva
            item.estado = "Desarrollo"
            DBSession.add(itemHistorial)
            DBSession.flush()

            #Consultamos los detalles que tiene el Item a ser editado y tambien
            #los atributos actuales de su Tipo de Item correspondiente
            detalles = DBSession.query(ItemDetalle).filter_by(id_item=id_item)
            atributos = DBSession.query(Atributo).filter_by(
                id_tipo_item=id_tipo_item)
            lista_id_atributo = []

            if atributos != None:
                for atributo in atributos:
                    lista_id_atributo.append(atributo.id_atributo)

            #Enviamos al historial los detalles del Item a ser editado
            if detalles != None:
                for detalle in detalles:
                    if lista_id_atributo.count(detalle.id_atributo) >= 1:
                        lista_id_atributo.remove(detalle.id_atributo)
                    itemDetalleHistorial = ItemDetalleHistorial()
                    itemDetalleHistorial.id_item = id_item
                    itemDetalleHistorial.id_item_detalle = detalle.id_item_detalle
                    itemDetalleHistorial.id_atributo = detalle.id_atributo
                    itemDetalleHistorial.nombre_atributo = detalle.nombre_atributo
                    itemDetalleHistorial.valor = detalle.valor
                    itemDetalleHistorial.version = version_anterior
                    DBSession.add(itemDetalleHistorial)
                    DBSession.flush()

            #Cargamos a vacio los atributos que no contemplaban los detalles actuales
            if lista_id_atributo != None:
                for id_atributo in lista_id_atributo:
                    atributo = DBSession.query(Atributo).get(id_atributo)
                    itemDetalle = ItemDetalle()
                    itemDetalle.id_item = id_item
                    itemDetalle.id_atributo = atributo.id_atributo
                    itemDetalle.nombre_atributo = atributo.nombre
                    itemDetalle.valor = ""
                    DBSession.add(itemDetalle)
                    DBSession.flush()

            #Enviamos sus relaciones actuales al historial de relaciones
            hijos = DBSession.query(RelacionItem).filter_by(id_item1=id_item)
            antecesores = DBSession.query(RelacionItem).filter_by(
                id_item2=id_item)
            if hijos != None:
                for hijo in hijos:
                    relacion_historial = RelacionHistorial()
                    relacion_historial.tipo = hijo.tipo
                    relacion_historial.id_item1 = hijo.id_item1
                    relacion_historial.id_item2 = hijo.id_item2
                    relacion_historial.version_modif = version_anterior
                    DBSession.add(relacion_historial)
                    DBSession.flush()
            if antecesores != None:
                for antecesor in antecesores:
                    relacion_historial = RelacionHistorial()
                    relacion_historial.tipo = antecesor.tipo
                    relacion_historial.id_item1 = antecesor.id_item1
                    relacion_historial.id_item2 = antecesor.id_item2
                    relacion_historial.version_modif = version_anterior
                    DBSession.add(relacion_historial)
                    DBSession.flush()

            #Insertamos la nueva relacion
            relacion = RelacionItem()
            relacion.tipo = "Antecesor-Sucesor"
            relacion.id_item1 = kw['id_item1']
            relacion.id_item2 = kw['id_item2']
            DBSession.add(relacion)
            DBSession.flush()

            #Ponemos a revision todos los items afectados por el Item editado
            #Tambien colocamos a "Revision" las Lineas Bases correspondientes
            global itemsAfectados
            global listaRelaciones
            itemsAfectados = []
            listaRelaciones = []

            itemsAfectados.append(id_item)

            for item_afectado in itemsAfectados:
                self.buscarRelaciones(item_afectado)

            for item_afectado in itemsAfectados:
                item_cambio = DBSession.query(Item).get(item_afectado)
                item_cambio.estado = "Revision"
                linea_bases_item = item_cambio.linea_bases
                if linea_bases_item != None:
                    for linea_base_item in linea_bases_item:
                        if linea_base_item.estado == "Aprobado":
                            id_linea_base = linea_base_item.id_linea_base
                            linea_base = DBSession.query(LineaBase).get(
                                id_linea_base)
                            linea_base.estado = "Revision"
                            fase = DBSession.query(Fase).get(
                                linea_base.id_fase)
                            if fase.relacion_estado_fase.nombre == "Finalizado":
                                fase.id_estado_fase = '4'
                            DBSession.flush()

                DBSession.flush()

            #Los archivos adjuntos del Item a ser editado se copian
            #para tener el registro de estos archivos con esa version de item
            archivos_item_editado = DBSession.query(ItemArchivo).filter_by(
                id_item=id_item).filter_by(version_item=version_anterior)
            if archivos_item_editado != None:
                for archivo in archivos_item_editado:
                    nuevo_archivo = ItemArchivo()
                    nuevo_archivo.id_item = archivo.id_item
                    nuevo_archivo.version_item = version_anterior
                    nuevo_archivo.nombre_archivo = archivo.nombre_archivo
                    nuevo_archivo.contenido_archivo = archivo.contenido_archivo
                    archivo.version_item = version_nueva
                    DBSession.add(nuevo_archivo)
                    DBSession.flush()

            transaction.commit()
            flash(_("Relacion insertada!"), 'ok')

            #Aqui comprobamos si todos los items de la fase actual  tienen sucesores, en ese caso
            #el estado de la fase cambiamos a Finalizado
            id_tipo_item = kw['id_tipo_item']
            id_fase = kw['id_fase']
            fase_actual = DBSession.query(Fase).get(id_fase)
            #Obtenemos la fase anterior
            fase_anterior = DBSession.query(Fase).filter_by(
                numero_fase=fase_actual.numero_fase -
                1).filter_by(id_proyecto=fase_actual.id_proyecto).first()
            fase = fase_anterior
            items_sin_sucesores = 0
            if fase.relacion_estado_fase.nombre_estado == 'Con Lineas Bases' and fase_anterior != None:
                tipo_items = DBSession.query(TipoItem).filter_by(
                    id_fase=fase.id_fase)
                itemsDeFaseActual = []
                for tipo_item in tipo_items:
                    itemsTipoItem = DBSession.query(Item).filter_by(
                        id_tipo_item=tipo_item.id_tipo_item).filter_by(
                            vivo=True).filter_by(estado='Aprobado')
                    for itemTipoItem in itemsTipoItem:
                        succs = DBSession.query(RelacionItem).filter_by(
                            id_item1=itemTipoItem.id_item)
                        sw = 0
                        for suc in succs:
                            sw = 1
                        if sw == 0:
                            items_sin_sucesores = items_sin_sucesores + 1
                        itemsDeFaseActual.append(itemTipoItem)
                contador_items_en_fase_actual = 0
                for item in itemsDeFaseActual:
                    contador_items_en_fase_actual = contador_items_en_fase_actual + 1
                #Si contador_items_en_fase_actual es igual a items_con_sucesores entonces cumple la condicion
                if contador_items_en_fase_actual == contador_items_en_fase_actual - items_sin_sucesores:
                    fase.id_estado_fase = '5'
    def insertarAncestro(self, kw): 
        global inserciones
        inserciones = inserciones + 1
        print "el numero de inserciones es :", inserciones
        if inserciones == 1:
           item = DBSession.query(Item).get(kw['id_item1'])
           id_item = item.id_item
           version_anterior = item.version
           version_nueva = int(item.version) + 1
           linea_bases_item = item.linea_bases

           #Comprobamos que no se encuentre en una Linea Base
           if linea_bases_item != []:
              for linea_base_item in linea_bases_item:
                  flash(_("No se puede agregar la relacion! El Item se encuentra en una Linea Base..."), 'error')
                  return

           #El Item cambia de version al agregar la relacion
           itemHistorial = ItemHistorial()
           itemHistorial.id_item = item.id_item
           itemHistorial.id_tipo_item = item.id_tipo_item
           itemHistorial.codigo = item.codigo
           itemHistorial.descripcion = item.descripcion
           itemHistorial.complejidad = item.complejidad
           itemHistorial.prioridad = item.prioridad
           itemHistorial.estado = "Desarrollo"
           itemHistorial.version = version_anterior
           itemHistorial.observacion = item.observacion
           itemHistorial.fecha_modificacion = item.fecha_modificacion
           item.version = version_nueva
           item.estado = "Desarrollo"
           DBSession.add(itemHistorial)
           DBSession.flush()

           #Consultamos los detalles que tiene el Item a ser editado y tambien
           #los atributos actuales de su Tipo de Item correspondiente
           detalles = DBSession.query(ItemDetalle).filter_by(id_item=id_item)
           atributos = DBSession.query(Atributo).filter_by(id_tipo_item=id_tipo_item)
           lista_id_atributo = []

           if atributos != None:
              for atributo in atributos:
                  lista_id_atributo.append(atributo.id_atributo)

           #Enviamos al historial los detalles del Item a ser editado
           if detalles != None:
              for detalle in detalles:
                  if lista_id_atributo.count(detalle.id_atributo) >= 1: 
                     lista_id_atributo.remove(detalle.id_atributo)
                  itemDetalleHistorial = ItemDetalleHistorial()
                  itemDetalleHistorial.id_item = id_item
                  itemDetalleHistorial.id_item_detalle = detalle.id_item_detalle
                  itemDetalleHistorial.id_atributo = detalle.id_atributo
                  itemDetalleHistorial.nombre_atributo = detalle.nombre_atributo
                  itemDetalleHistorial.valor = detalle.valor
                  itemDetalleHistorial.version = version_anterior
                  DBSession.add(itemDetalleHistorial)
                  DBSession.flush()

           #Cargamos a vacio los atributos que no contemplaban los detalles actuales
           if lista_id_atributo != None:
              for id_atributo in lista_id_atributo:
                  atributo = DBSession.query(Atributo).get(id_atributo)
                  itemDetalle = ItemDetalle()
                  itemDetalle.id_item = id_item
                  itemDetalle.id_atributo = atributo.id_atributo
                  itemDetalle.nombre_atributo = atributo.nombre
                  itemDetalle.valor = ""
                  DBSession.add(itemDetalle)
                  DBSession.flush()

           #Enviamos sus relaciones actuales al historial de relaciones
           hijos = DBSession.query(RelacionItem).filter_by(id_item1=id_item)
           antecesores = DBSession.query(RelacionItem).filter_by(id_item2=id_item)
           if hijos != None:
              for hijo in hijos:
                  relacion_historial = RelacionHistorial()
                  relacion_historial.tipo = hijo.tipo
                  relacion_historial.id_item1 = hijo.id_item1
                  relacion_historial.id_item2 = hijo.id_item2
                  relacion_historial.version_modif = version_anterior
                  DBSession.add(relacion_historial)
                  DBSession.flush()
           if antecesores != None:
              for antecesor in antecesores:
                  relacion_historial = RelacionHistorial()
                  relacion_historial.tipo = antecesor.tipo
                  relacion_historial.id_item1 = antecesor.id_item1
                  relacion_historial.id_item2 = antecesor.id_item2
                  relacion_historial.version_modif = version_anterior
                  DBSession.add(relacion_historial)
                  DBSession.flush()

           #Insertamos la nueva relacion
           relacion = RelacionItem()
           relacion.tipo = "Antecesor-Sucesor"
           relacion.id_item1 = kw['id_item1']
           relacion.id_item2 = kw['id_item2']      
           DBSession.add(relacion)
           DBSession.flush() 

           #Ponemos a revision todos los items afectados por el Item editado
           #Tambien colocamos a "Revision" las Lineas Bases correspondientes
           global itemsAfectados
           global listaRelaciones
           itemsAfectados = []
           listaRelaciones = []
            
           itemsAfectados.append(id_item)

           for item_afectado in itemsAfectados:
               self.buscarRelaciones(item_afectado)

           for item_afectado in itemsAfectados:
               item_cambio = DBSession.query(Item).get(item_afectado)
               item_cambio.estado = "Revision"
               linea_bases_item = item_cambio.linea_bases
               if linea_bases_item != None:
                  for linea_base_item in linea_bases_item:
                      if linea_base_item.estado == "Aprobado":
                         id_linea_base = linea_base_item.id_linea_base 
                         linea_base = DBSession.query(LineaBase).get(id_linea_base)
                         linea_base.estado = "Revision"
                         fase = DBSession.query(Fase).get(linea_base.id_fase)
                         if fase.relacion_estado_fase.nombre == "Finalizado":
                            fase.id_estado_fase = '4'
                         DBSession.flush()

               DBSession.flush()

           #Los archivos adjuntos del Item a ser editado se copian
           #para tener el registro de estos archivos con esa version de item
           archivos_item_editado = DBSession.query(ItemArchivo).filter_by(id_item=id_item).filter_by(version_item=version_anterior)
           if archivos_item_editado != None:
              for archivo in archivos_item_editado:
                  nuevo_archivo = ItemArchivo()
                  nuevo_archivo.id_item = archivo.id_item
                  nuevo_archivo.version_item = version_anterior
                  nuevo_archivo.nombre_archivo = archivo.nombre_archivo
                  nuevo_archivo.contenido_archivo = archivo.contenido_archivo
                  archivo.version_item = version_nueva
                  DBSession.add(nuevo_archivo)
                  DBSession.flush()     

           transaction.commit()   
           flash(_("Relacion insertada!"), 'ok')

	   #Aqui comprobamos si todos los items de la fase actual  tienen sucesores, en ese caso
	   #el estado de la fase cambiamos a Finalizado
	   id_tipo_item=kw['id_tipo_item']
	   id_fase=kw['id_fase']
	   fase_actual=DBSession.query(Fase).get(id_fase)
	   #Obtenemos la fase anterior
	   fase_anterior=DBSession.query(Fase).filter_by(numero_fase=fase_actual.numero_fase-1).filter_by(id_proyecto=fase_actual.id_proyecto).first()
	   fase=fase_anterior
	   items_sin_sucesores = 0
	   if fase.relacion_estado_fase.nombre_estado=='Con Lineas Bases' and fase_anterior != None:
		tipo_items=DBSession.query(TipoItem).filter_by(id_fase=fase.id_fase)
		itemsDeFaseActual = []
		for tipo_item in tipo_items:
			itemsTipoItem = DBSession.query(Item).filter_by(id_tipo_item=tipo_item.id_tipo_item).filter_by(vivo=True).filter_by(estado='Aprobado')
			for itemTipoItem in itemsTipoItem:
				succs = DBSession.query(RelacionItem).filter_by(id_item1=itemTipoItem.id_item)
				sw=0
				for suc in succs:
					sw=1
				if sw==0:
					items_sin_sucesores = items_sin_sucesores + 1
				itemsDeFaseActual.append(itemTipoItem)
		contador_items_en_fase_actual = 0
		for item in itemsDeFaseActual:
			contador_items_en_fase_actual = contador_items_en_fase_actual + 1
		#Si contador_items_en_fase_actual es igual a items_con_sucesores entonces cumple la condicion
		if contador_items_en_fase_actual == contador_items_en_fase_actual - items_sin_sucesores:
			fase.id_estado_fase = '5'
    def insertarHijo(self, kw):
        newGrafo.__init__()
        global inserciones
        inserciones = inserciones + 1
        print "el numero de inserciones es :", inserciones
        if inserciones == 1:
            self.buscarCiclos(kw['id_item1'])
            id_item1 = int(kw['id_item1'])
            id_item2 = int(kw['id_item2'])
            newGrafo.add_edge(id_item1, id_item2, False)
            hayciclo = newGrafo.walk(id_item1)
            print newGrafo
            print hayciclo
            if hayciclo:
                flash(_("No se puede insertar la relacion. Produce ciclos!"),
                      'warning')
                return
            else:
                item = DBSession.query(Item).get(kw['id_item1'])
                id_item = item.id_item
                version_anterior = item.version
                version_nueva = int(item.version) + 1
                linea_bases_item = item.linea_bases

                #Comprobamos que no se encuentre en una Linea Base
                if linea_bases_item != []:
                    for linea_base_item in linea_bases_item:
                        flash(
                            _("No se puede agregar la relacion! El Item se encuentra en una Linea Base..."
                              ), 'error')
                        return

                #El Item padre cambia de version al tener una nueva relacion
                itemHistorial = ItemHistorial()
                itemHistorial.id_item = item.id_item
                itemHistorial.id_tipo_item = item.id_tipo_item
                itemHistorial.codigo = item.codigo
                itemHistorial.descripcion = item.descripcion
                itemHistorial.complejidad = item.complejidad
                itemHistorial.prioridad = item.prioridad
                itemHistorial.estado = "Desarrollo"
                itemHistorial.version = version_anterior
                itemHistorial.observacion = item.observacion
                itemHistorial.fecha_modificacion = item.fecha_modificacion
                item.version = version_nueva
                item.estado = "Desarrollo"
                DBSession.add(itemHistorial)
                DBSession.flush()

                #Consultamos los detalles que tiene el Item a ser editado y tambien
                #los atributos actuales de su Tipo de Item correspondiente
                detalles = DBSession.query(ItemDetalle).filter_by(
                    id_item=id_item)
                atributos = DBSession.query(Atributo).filter_by(
                    id_tipo_item=id_tipo_item)
                lista_id_atributo = []

                if atributos != None:
                    for atributo in atributos:
                        lista_id_atributo.append(atributo.id_atributo)

                #Enviamos al historial los detalles del Item a ser editado
                if detalles != None:
                    for detalle in detalles:
                        if lista_id_atributo.count(detalle.id_atributo) >= 1:
                            lista_id_atributo.remove(detalle.id_atributo)
                        itemDetalleHistorial = ItemDetalleHistorial()
                        itemDetalleHistorial.id_item = id_item
                        itemDetalleHistorial.id_item_detalle = detalle.id_item_detalle
                        itemDetalleHistorial.id_atributo = detalle.id_atributo
                        itemDetalleHistorial.nombre_atributo = detalle.nombre_atributo
                        itemDetalleHistorial.valor = detalle.valor
                        itemDetalleHistorial.version = version_anterior
                        DBSession.add(itemDetalleHistorial)
                        DBSession.flush()

                #Cargamos a vacio los atributos que no contemplaban los detalles actuales
                if lista_id_atributo != None:
                    for id_atributo in lista_id_atributo:
                        atributo = DBSession.query(Atributo).get(id_atributo)
                        itemDetalle = ItemDetalle()
                        itemDetalle.id_item = id_item
                        itemDetalle.id_atributo = atributo.id_atributo
                        itemDetalle.nombre_atributo = atributo.nombre
                        itemDetalle.valor = ""
                        DBSession.add(itemDetalle)
                        DBSession.flush()

                #Enviamos sus relaciones actuales al historial de relaciones
                hijos = DBSession.query(RelacionItem).filter_by(
                    id_item1=id_item)
                antecesores = DBSession.query(RelacionItem).filter_by(
                    id_item2=id_item)
                if hijos != None:
                    for hijo in hijos:
                        relacion_historial = RelacionHistorial()
                        relacion_historial.tipo = hijo.tipo
                        relacion_historial.id_item1 = hijo.id_item1
                        relacion_historial.id_item2 = hijo.id_item2
                        relacion_historial.version_modif = version_anterior
                        DBSession.add(relacion_historial)
                        DBSession.flush()
                if antecesores != None:
                    for antecesor in antecesores:
                        relacion_historial = RelacionHistorial()
                        relacion_historial.tipo = antecesor.tipo
                        relacion_historial.id_item1 = antecesor.id_item1
                        relacion_historial.id_item2 = antecesor.id_item2
                        relacion_historial.version_modif = version_anterior
                        DBSession.add(relacion_historial)
                        DBSession.flush()

                #Insertamos la nueva relacion
                relacion = RelacionItem()
                relacion.tipo = "Padre-Hijo"
                relacion.id_item1 = kw['id_item1']
                relacion.id_item2 = kw['id_item2']
                DBSession.add(relacion)
                DBSession.flush()

                #Ponemos a revision todos los items afectados por el Item editado
                #Tambien colocamos a "Revision" las Lineas Bases correspondientes
                global itemsAfectados
                global listaRelaciones
                itemsAfectados = []
                listaRelaciones = []

                itemsAfectados.append(id_item)

                for item_afectado in itemsAfectados:
                    self.buscarRelaciones(item_afectado)

                for item_afectado in itemsAfectados:
                    item_cambio = DBSession.query(Item).get(item_afectado)
                    item_cambio.estado = "Revision"
                    linea_bases_item = item_cambio.linea_bases
                    if linea_bases_item != None:
                        for linea_base_item in linea_bases_item:
                            if linea_base_item.estado == "Aprobado":
                                id_linea_base = linea_base_item.id_linea_base
                                linea_base = DBSession.query(LineaBase).get(
                                    id_linea_base)
                                linea_base.estado = "Revision"
                                fase = DBSession.query(Fase).get(
                                    linea_base.id_fase)
                                if fase.relacion_estado_fase.nombre == "Finalizado":
                                    fase.id_estado_fase = '4'
                                DBSession.flush()
                    DBSession.flush()

                #Los archivos adjuntos del Item a ser editado se copian
                #para tener el registro de estos archivos con esa version de item
                archivos_item_editado = DBSession.query(ItemArchivo).filter_by(
                    id_item=id_item).filter_by(version_item=version_anterior)
                if archivos_item_editado != None:
                    for archivo in archivos_item_editado:
                        nuevo_archivo = ItemArchivo()
                        nuevo_archivo.id_item = archivo.id_item
                        nuevo_archivo.version_item = version_anterior
                        nuevo_archivo.nombre_archivo = archivo.nombre_archivo
                        nuevo_archivo.contenido_archivo = archivo.contenido_archivo
                        archivo.version_item = version_nueva
                        DBSession.add(nuevo_archivo)
                        DBSession.flush()

                transaction.commit()
                flash(_("Relacion insertada!"), 'ok')
    def insertarHijo(self, kw): 
        newGrafo.__init__()
        global inserciones
        inserciones = inserciones + 1
        print "el numero de inserciones es :", inserciones
        if inserciones == 1:                        
            self.buscarCiclos(kw['id_item1'])
            id_item1 = int(kw['id_item1'])
            id_item2 = int(kw['id_item2'])
            newGrafo.add_edge(id_item1, id_item2, False)
            hayciclo = newGrafo.walk(id_item1)
            print newGrafo
            print hayciclo
            if hayciclo:
                flash(_("No se puede insertar la relacion. Produce ciclos!"), 'warning')
                return
            else: 
                item = DBSession.query(Item).get(kw['id_item1'])
                id_item = item.id_item
                version_anterior = item.version
                version_nueva = int(item.version) + 1
                linea_bases_item = item.linea_bases

                #Comprobamos que no se encuentre en una Linea Base
                if linea_bases_item != []:
                   for linea_base_item in linea_bases_item:
                       flash(_("No se puede agregar la relacion! El Item se encuentra en una Linea Base..."), 'error')
                       return

                #El Item padre cambia de version al tener una nueva relacion
                itemHistorial = ItemHistorial()
                itemHistorial.id_item = item.id_item
                itemHistorial.id_tipo_item = item.id_tipo_item
                itemHistorial.codigo = item.codigo
                itemHistorial.descripcion = item.descripcion
                itemHistorial.complejidad = item.complejidad
                itemHistorial.prioridad = item.prioridad
                itemHistorial.estado = "Desarrollo"
                itemHistorial.version = version_anterior
                itemHistorial.observacion = item.observacion
                itemHistorial.fecha_modificacion = item.fecha_modificacion
                item.version = version_nueva
                item.estado = "Desarrollo"
                DBSession.add(itemHistorial)
                DBSession.flush()

                #Consultamos los detalles que tiene el Item a ser editado y tambien
                #los atributos actuales de su Tipo de Item correspondiente
                detalles = DBSession.query(ItemDetalle).filter_by(id_item=id_item)
                atributos = DBSession.query(Atributo).filter_by(id_tipo_item=id_tipo_item)
                lista_id_atributo = []

                if atributos != None:
                   for atributo in atributos:
                       lista_id_atributo.append(atributo.id_atributo)

                #Enviamos al historial los detalles del Item a ser editado
                if detalles != None:
                   for detalle in detalles:
                       if lista_id_atributo.count(detalle.id_atributo) >= 1: 
                          lista_id_atributo.remove(detalle.id_atributo)
                       itemDetalleHistorial = ItemDetalleHistorial()
                       itemDetalleHistorial.id_item = id_item
                       itemDetalleHistorial.id_item_detalle = detalle.id_item_detalle
                       itemDetalleHistorial.id_atributo = detalle.id_atributo
                       itemDetalleHistorial.nombre_atributo = detalle.nombre_atributo
                       itemDetalleHistorial.valor = detalle.valor
                       itemDetalleHistorial.version = version_anterior
                       DBSession.add(itemDetalleHistorial)
                       DBSession.flush()

                #Cargamos a vacio los atributos que no contemplaban los detalles actuales
                if lista_id_atributo != None:
                   for id_atributo in lista_id_atributo:
                       atributo = DBSession.query(Atributo).get(id_atributo)
                       itemDetalle = ItemDetalle()
                       itemDetalle.id_item = id_item
                       itemDetalle.id_atributo = atributo.id_atributo
                       itemDetalle.nombre_atributo = atributo.nombre
                       itemDetalle.valor = ""
                       DBSession.add(itemDetalle)
                       DBSession.flush()

                #Enviamos sus relaciones actuales al historial de relaciones
                hijos = DBSession.query(RelacionItem).filter_by(id_item1=id_item)
                antecesores = DBSession.query(RelacionItem).filter_by(id_item2=id_item)
                if hijos != None:
                   for hijo in hijos:
                       relacion_historial = RelacionHistorial()
                       relacion_historial.tipo = hijo.tipo
                       relacion_historial.id_item1 = hijo.id_item1
                       relacion_historial.id_item2 = hijo.id_item2
                       relacion_historial.version_modif = version_anterior
                       DBSession.add(relacion_historial)
                       DBSession.flush()
                if antecesores != None:
                   for antecesor in antecesores:
                       relacion_historial = RelacionHistorial()
                       relacion_historial.tipo = antecesor.tipo
                       relacion_historial.id_item1 = antecesor.id_item1
                       relacion_historial.id_item2 = antecesor.id_item2
                       relacion_historial.version_modif = version_anterior
                       DBSession.add(relacion_historial)
                       DBSession.flush()

                #Insertamos la nueva relacion
                relacion = RelacionItem()
                relacion.tipo = "Padre-Hijo"
                relacion.id_item1 = kw['id_item1']
                relacion.id_item2 = kw['id_item2']      
                DBSession.add(relacion)
                DBSession.flush()

                #Ponemos a revision todos los items afectados por el Item editado
                #Tambien colocamos a "Revision" las Lineas Bases correspondientes
                global itemsAfectados
                global listaRelaciones
                itemsAfectados = []
                listaRelaciones = []
            
                itemsAfectados.append(id_item)

                for item_afectado in itemsAfectados:
                    self.buscarRelaciones(item_afectado)

                for item_afectado in itemsAfectados:
                    item_cambio = DBSession.query(Item).get(item_afectado)
                    item_cambio.estado = "Revision"
                    linea_bases_item = item_cambio.linea_bases
                    if linea_bases_item != None:
                       for linea_base_item in linea_bases_item:
                           if linea_base_item.estado == "Aprobado":
                              id_linea_base = linea_base_item.id_linea_base 
                              linea_base = DBSession.query(LineaBase).get(id_linea_base)
                              linea_base.estado = "Revision"
                              fase = DBSession.query(Fase).get(linea_base.id_fase)
                              if fase.relacion_estado_fase.nombre == "Finalizado":
                                 fase.id_estado_fase = '4'
                              DBSession.flush()
                    DBSession.flush() 

                #Los archivos adjuntos del Item a ser editado se copian
                #para tener el registro de estos archivos con esa version de item
                archivos_item_editado = DBSession.query(ItemArchivo).filter_by(id_item=id_item).filter_by(version_item=version_anterior)
                if archivos_item_editado != None:
                   for archivo in archivos_item_editado:
                       nuevo_archivo = ItemArchivo()
                       nuevo_archivo.id_item = archivo.id_item
                       nuevo_archivo.version_item = version_anterior
                       nuevo_archivo.nombre_archivo = archivo.nombre_archivo
                       nuevo_archivo.contenido_archivo = archivo.contenido_archivo
                       archivo.version_item = version_nueva
                       DBSession.add(nuevo_archivo)
                       DBSession.flush()     

                transaction.commit()   
                flash(_("Relacion insertada!"), 'ok')