def iniciar_proyecto(self, idproyecto, **kw): proyecto = DBSession.query(Proyecto).get(idproyecto) proyecto.estado = estado_proyecto_util.get_by_codigo('Desarrollo') DBSession.merge(proyecto) redirect('/miproyecto/ver/'+str(idproyecto))
def put(self, args={}, **kw): """ Evento invocado luego de un evento post en el form de editar ecargado de persistir las modificaciones de las instancias. @type args : Hash @param args : Argumentos de template @type kw : Hash @param kw : Keywords """ del kw['sprox_id'] rol = DBSession.query(Rol).get(int(kw['rol_id'])) rol.nombre = kw['nombre'] rol.codigo = kw['codigo'] rol.descripcion = kw['descripcion'] rol.is_template = kw['is_template'] rol.permisos = [] for permiso_id in kw['permisos'] : rol.permisos.append(DBSession.query(Permiso).get(permiso_id)) DBSession.merge(rol) flash("El rol '"+rol.nombre+"' ha sido modificado correctamente.") redirect("/administracion/rol/get_all")
def revivir_item (self, historial_item): """ Restaura el item a su ultima version sin sus relaciones """ item = Item() item.id_item = historial_item.id_item item.nombre = historial_item.nombre item.codigo = historial_item.codigo #el estado del item es en desarrollo al revivir item.estado = 2 item.tipo_item = historial_item.tipo_item item.fase = historial_item.fase item.version = historial_item.version item.prioridad = historial_item.prioridad item.complejidad = historial_item.complejidad item.descripcion = historial_item.descripcion item.observacion = historial_item.observacion item.linea_base = historial_item.linea_base #recuperar los detalles historial_detalles = DBSession.query(HistorialDetalleItem).\ filter(HistorialDetalleItem.id_item==historial_item.id_item).\ all() for hist_detalle in historial_detalles: detalle = DetalleItem() detalle.id_detalle = hist_detalle.id_detalle detalle.id_item = hist_detalle.id_item detalle.recurso = hist_detalle.recurso detalle.valor = hist_detalle.valor item.detalles.append(detalle) DBSession.merge(item)
def put(self, id, **kw): """ Evento invocado luego de un evento post en el form de editar encargado de persistir las modificaciones de las instancias. @type id : Integer @param id : Identificador del Detalle del item. @type kw : Hash @param kw : Keywords """ detalle = DBSession.query(DetalleItem).get(id) detalle.valor = kw['valor'] detalle.observacion = kw ['observacion'] DBSession.merge(detalle) DBSession.flush() item = DBSession.query(Item).get(detalle.id_item) item_util.audit_item(item) item.version += 1 DBSession.merge(item) flash("El item atributo ha sido modificado correctamente.") redirect('/miproyecto/fase/item/poner_en_revision/'+str(detalle.id_item))
def put(self, args={}, **kw): """ Evento invocado luego de un evento post en el form de editar ecargado de persistir las modificaciones de las instancias. @type args : Hash @param args : Argumentos de template @type kw : Hash @param kw : Keywords """ #Se obtiene de la base de datos el proyecto modifcado proyecto = DBSession.query(Proyecto).get(int(kw['id_proyecto'])) #Se actualizan unicamente los campos actualizables proyecto.nombre=kw['nombre'] proyecto.nro_fases = kw['nro_fases'] proyecto.descripcion = kw['descripcion'] #asignar lider proyecto.lider = DBSession.query(Usuario).get(kw['lider']) util.asignar_lider(proyecto) DBSession.merge(proyecto) flash("El proyecto ha sido '" +proyecto.nombre+ "' modificado correctamente.") redirect("/administracion/proyecto/list")
def put(self, id, **kw): """ Evento invocado luego de un evento post en el form de editar ecargado de persistir las modificaciones de las instancias. @type id : Integer @param id : Identificador del usuario. @type kw : Hash @param kw : Keywords """ usuario = DBSession.query(Usuario).get( int(id) ) usuario.nombre = kw['nombre'] usuario.email_address = kw['email_address'] if usuario._password != kw['password'] : print 'Actualizando la contrasenha' usuario._set_password(kw['password']) DBSession.merge(usuario) flash("El usuario '"+usuario.nombre+"' ha sido modificado correctamente.") redirect("/administracion/usuario/get_all")
def aprobar_item(self, iditem, **kw): """ Metodo para aprobar un item """ item = DBSession.query(Item).get(iditem) item.estado = 1 idfase = item.fase DBSession.merge(item) flash("El item " + item.codigo+ " ha sido aprobado correctamente") redirect('/miproyecto/fase/item/ver/'+str(iditem))
def revertir_item (self, historial_item): """ Dada una entidad HistorialItem que representa una version anterior del item en si se obtiene de la tabla las entradas de esa version para que el item recupere los valores de esa version """ #debe ser una version posterior a la actual item = DBSession.query(Item).get(historial_item.id_item) version = int(item.version) + 1 item = Item() item.id_item = historial_item.id_item item.nombre = historial_item.nombre item.codigo = historial_item.codigo item.estado = 3#historial_item.estado item.tipo_item = historial_item.tipo_item item.fase = historial_item.fase item.version = version item.prioridad = historial_item.prioridad item.complejidad = historial_item.complejidad item.descripcion = historial_item.descripcion item.observacion = historial_item.observacion item.linea_base = historial_item.linea_base #recuperar los detalles historial_detalles = DBSession.query(HistorialDetalleItem).\ filter(HistorialDetalleItem.id_item==historial_item.id_item).\ all() for hist_detalle in historial_detalles: detalle = DetalleItem() detalle.id_item_detalle = hist_detalle.id_detalle detalle.id_item = hist_detalle.id_item detalle.adjunto = hist_detalle.adjunto detalle.observacion = hist_detalle.observacion detalle.valor = hist_detalle.valor item.detalles.append(detalle) #recuperar los relaciones historial_relaciones = DBSession.query(HistorialRelacion).\ filter((HistorialRelacion.id_item_1 or HistorialRelacion.id_item_2) == item.id_item).\ all() for hist_relacion in historial_relaciones: relacion = RelacionItem() if(DBSession.query(Item).get(hist_relacion.id_item_1)!=None and DBSession.query(Item).get(hist_relacion.id_item_2)!=None): relacion.id_item_actual = hist_relacion.id_item_1 relacion.id_item_relacionado = hist_relacion.id_item_2 relacion.relacion_parentesco = hist_relacion.id_tipo_relacion DBSession.merge(relacion) DBSession.merge(item)
def eliminar(self, id, **kw): archivo = DBSession.query(Archivo).get(id) item_util.audit_item(archivo.item) archivo.item.version += 1 DBSession.merge(archivo.item) id_item = archivo.id_item DBSession.delete(archivo) flash("El archivo ha sido eliminado correctamente.") redirect('/miproyecto/fase/item/poner_en_revision/'+str(id_item))
def post(self, idfase, args={},**kw): """ Evento invocado luego de un evento post en el form de crear ecargado de persistir las nuevas instancias. @type idfase : Integer @param idfase : Identificador de la fase. @type args : Hash @param args : Argumentos de template @type kw : Hash @param kw : Keywords """ del kw['sprox_id'] """ se crea la nueva relacion y se le asignan los valores de los combos """ if kw['item_1'] != None and kw['item_2'] != None: relacion = RelacionItem() relacion.id_item_actual = kw['item_1'] relacion.id_item_relacionado = kw['item_2'] relacion.relacion_parentesco = 2 DBSession.merge(relacion) #auditar items y aumentar su version item1 = DBSession.query(Item).get(kw['item_1']) item2 = DBSession.query(Item).get(kw['item_2']) item_util.audit_item(item1) item_util.audit_item(item2) item1.version += 1 item2.version += 1 DBSession.add(item1) DBSession.add(item2) #marcar en revision los relacionados fase = DBSession.query(Fase).get(item1.fase) grafo = item_util.proyectGraphConstructor(fase.proyecto) item_util.marcar_en_revision(grafo, item1.id_item) flash("La relacion se ha creado correctamente") redirect("/miproyecto/fase/relacion/list/"+idfase) flash("No se puede crear la relacion", 'warning') redirect("/miproyecto/fase/relacion/"+idfase+"/new/")
def revivir_item (self, historial_item): """ Restaura el item a su ultima version sin sus relaciones """ item = Item() item.id_item = historial_item.id_item item.nombre = historial_item.nombre item.codigo = historial_item.codigo #el estado del item es en desarrollo al revivir item.estado_actual = estado_item_util.get_by_codigo('Revision') item.tipo_item = historial_item.tipo_item item.fase = historial_item.fase item.version = historial_item.version item.prioridad = historial_item.prioridad item.complejidad = historial_item.complejidad item.descripcion = historial_item.descripcion item.observacion = historial_item.observacion item.linea_base = None #se vacian los detalles item.detalles = [] atributo_mapper = {} #Se obtienen los atributos actuales del tipo de item al que pertenece tipo_item = DBSession.query(TipoItem).get(historial_item.tipo_item) for atributo in tipo_item.atributos: detalle = DetalleItem() detalle.id_item = historial_item.id_item detalle.id_atributo_tipo_item = atributo.id_atributo_tipo_item detalle.adjunto = None detalle.valor = None atributo_mapper[atributo.id_atributo_tipo_item] = len(item.detalles) item.detalles.append(detalle) #recuperar los detalles historial_detalles = DBSession.query(HistorialDetalleItem).\ filter(HistorialDetalleItem.id_item==historial_item.id_item).\ all() #Se setean los valores a los atributos ya existentes for hist_detalle in historial_detalles: #Se obtiene el indice correspondiente al atributo del tipo de item index = atributo_mapper[hist_detalle.id_atributo_tipo_item] item.detalles[index].adjunto = hist_detalle.adjunto item.detalles[index].valor = hist_detalle.valor DBSession.merge(item)
def put(self, args={}, **kw): """ Evento invocado luego de un evento post en el form de editar ecargado de persistir las modificaciones de las instancias. @type args : Hash @param args : Argumentos de template @type kw : Hash @param kw : Keywords """ del kw['sprox_id'] tipo_item = TipoItem(**kw) DBSession.merge(tipo_item) flash("El tipo de item ha sido modificado correctamente.") redirect('/miproyecto/fase/tipo_item/list/'+str(tipo_item.fase))
def put(self, args={}, **kw): """ Evento invocado luego de un evento post en el form de editar encargado de persistir las modificaciones de las instancias. @type args : Hash @param args : Argumentos de template @type kw : Hash @param kw : Keywords """ del kw['sprox_id'] fase = Fase(**kw) DBSession.merge(fase) flash("La fase '" + fase.nombre+ "'ha sido modificado correctamente.") redirect("/miproyecto/fase/"+str(kw['id_fase']))
def marcar_en_revision(self, grafo, itemId): """ Se marca en revision los items relacionados hacia atras y adelante. Las lineas base de los items relacionados se marcan con estado Comprometida. obtener la lista de todos antecesores directos e indirectos el list(set()) es para que elimine los repetidos los metodos listBackwards y listForward retornan listas con elementos repetidos. """ antecesores = list(set(self.listBackward(grafo, grafo.incidents(itemId)))) """ se añade a la lista el propio item """ item = [itemId] """ obtener la lista de todos sucesores directos e indirectos """ sucesores = list(set(self.listForward(grafo, grafo.neighbors(itemId)))) #suma de listas items = antecesores + item + sucesores relacionados = antecesores + sucesores for id_item in items: item_actual = DBSession.query(Item).get(id_item) item_actual.estado = 3 DBSession.merge(item_actual) # Se marca con estado comprometido cada linea base de los items # sucesores y antecesores. if(relacionados != None): for id_item in relacionados: item_actual = DBSession.query(Item).get(id_item) if item_actual.linea_base != None: linea_base = item_actual.linea_base #DBSession.query(LineaBase).get(item_actual.id_linea_base) linea_base.estado = estado_linea_base_util.get_by_codigo('Comprometida') DBSession.merge(linea_base) flash('Lineas base comprometidas') else: flash('El item no posee relaciones')
def put(self, id, **kw): """ Evento invocado luego de un evento post en el form de editar encargado de persistir las modificaciones de las instancias. @type id : Integer @param id : Identificador del item. @type kw : Hash @param kw : Keywords """ kw['id_item'] = id item = DBSession.query(Item).get(int(kw['id_item'])) item_util.audit_item(item) archivo = Archivo() archivo.id_item = id if kw ['archivo'] != None: stream = True archivo.archivo = "" while stream : stream = kw ['archivo'].file.read(1024) archivo.archivo += stream archivo.file_name = kw ['archivo'].filename archivo.content_type = kw ['archivo'].type kw ['archivo'].file.close() DBSession.add(archivo) item.version += 1 DBSession.merge(item) flash("El item atributo ha sido modificado correctamente.") redirect('/miproyecto/fase/item/poner_en_revision/'+str(archivo.id_item))
def put(self, args={}, **kw): """ Evento invocado luego de un evento post en el form de editar encargado de persistir las modificaciones de las instancias. @type args : Hash @param args : Argumentos de template @type kw : Hash @param kw : Keywords """ del kw['sprox_id'] #se cera una instancia apartir del Kw atributo = AtributoTipoItem(**kw) #se persiste los cambios DBSession.merge(atributo) tipo_item = DBSession.query(TipoItem).get(atributo.id_tipo_item) flash("El tipo de item ha sido modificado correctamente.") redirect('/miproyecto/fase/tipo_item/list/'+str(tipo_item.fase))
def abrir_linea_base(self, idlineabase, **kw): """ Metodo para abrir una linea base. Los de items de la linea base se marcan con estado de revision """ linea_base = DBSession.query(LineaBase).get(idlineabase) listaItems = DBSession.query(Item).\ filter(Item.id_linea_base == idlineabase).all() if(listaItems==None): flash("La linea base no tiene items asociados") return for item in listaItems: item.estado = 3 #item.id_linea_base = None DBSession.merge(item) self.params['idfase'] = linea_base.fase linea_base.estado = estado_linea_base_util.get_by_codigo('Abierta') DBSession.merge(linea_base) flash("La linea base ha sido abierta") redirect("/miproyecto/fase/linea_base/list/" + str(self.params['idfase']))
def post(self, idtipo,args={}, **kw): """ Evento invocado luego de un evento post en el form de crear ecargado de persistir las nuevas instancias. @type idtipo : Integer @param idtipo : Identificador del tipo de item. @type args : Hash @param args : Argumentos de template @type kw : Hash @param kw : Keywords """ del kw['sprox_id'] atributo_tipo_item = AtributoTipoItem() atributo_tipo_item.tipo_item = idtipo atributo_tipo_item.nombre = kw['nombre'] atributo_tipo_item.tipo_id = kw['tipo'] DBSession.add(atributo_tipo_item) items = DBSession.query(Item).filter(Item.tipo_item==idtipo) for item in items : detalle = DetalleItem() detalle.nombre = atributo_tipo_item.nombre detalle.id_atributo_tipo_item = atributo_tipo_item.id_atributo_tipo_item detalle.valor = None detalle.recurso = None item.detalles.append(detalle) DBSession.merge(item) DBSession.flush() flash("El Atributo del tipo de Item ha sido creado correctamente") redirect('/miproyecto/fase/tipo_item/atributos/'+idtipo+'/new')
def post(self, idfase, args={},**kw): """ Evento invocado luego de un evento post en el form de crear ecargado de persistir las nuevas instancias. @type idfase : Integer @param idfase : Identificador de la fase. @type args : Hash @param args : Argumentos de template @type kw : Hash @param kw : Keywords """ del kw['sprox_id'] item = Item() item.nombre = kw['nombre'] item.descripcion = kw['descripcion'] item.complejidad = kw['complejidad'] item.prioridad = kw['prioridad'] item.observacion = kw['observacion'] item.fase = idfase # Se crea con estado En Desarrollo por defecto item.estado = 2 item.tipo_item = kw['tipo_item_relacion'] item.version = 1 tipo_item = DBSession.query(TipoItem).get(item.tipo_item) #anhadir detalles al item segun el tipo de item al cual corresponda item.detalles = item_util.anadir_detalles(tipo_item) item.codigo = item_util.gen_cod(idfase, item.tipo_item) DBSession.add(item) DBSession.flush() # Se guarda la relacion elegida en el formulario if(kw['relaciones'] != None): relacion = RelacionItem() #el padre es el item que se selecciono en el combo relacion.id_item_actual = kw['relaciones'] #el item nuevo es el hijo relacion.id_item_relacionado = item.id_item item_relacionado = DBSession.query(Item).get(kw['relaciones']) #auditar el item item_util.audit_item(item_relacionado) item_relacionado.version += 1 DBSession.merge(item_relacionado) DBSession.flush() if(item_relacionado.fase == int(idfase)): #relacion padre-hijo relacion.relacion_parentesco = 1 else: relacion.relacion_parentesco = 2 DBSession.add(relacion) DBSession.flush() #flash("El item se ha creado correctamente") redirect('/miproyecto/fase/item/ver/'+str(item.id_item))
def put(self, _method, **kw): del kw['sprox_id'] linea_base = LineaBase(**kw) DBSession.merge(linea_base) flash("La LB ha sido modificado correctamente.") redirect("/miproyecto/fase/linea_base/generarLineaBase/" + str(idfase))
def revertir_item (self, historial_item): """ Dada una entidad HistorialItem que representa una version anterior del item en si se obtiene de la tabla las entradas de esa version para que el item recupere los valores de esa version """ #debe ser una version posterior a la actual item = DBSession.query(Item).get(historial_item.id_item) detalles = item.detalles print "Recuperar el item "+str(item) item.nombre = historial_item.nombre item.codigo = historial_item.codigo item.estado_actual = estado_item_util.get_by_codigo('Revision') #item.estado = item.estado_actual.id_estado_item item.tipo_item = historial_item.tipo_item item.fase = historial_item.fase item.version += 1 item.prioridad = historial_item.prioridad item.complejidad = historial_item.complejidad item.descripcion = historial_item.descripcion item.observacion = historial_item.observacion item.linea_base = None #Se borran todos los archivos print "Borrando todos los archivos acutales" for archivo in item.archivos : DBSession.delete(archivo) #Se reestauran todos los arachivos item.archivos = [] DBSession.merge(item) print "Anhadiendo nuevos archivos." for archivo in historial_item.archivos : print "archivo: "+ str(archivo) new_archivo = Archivo() new_archivo.archivo = archivo.archivo new_archivo.file_name = archivo.file_name new_archivo.content_type = archivo.content_type new_archivo.id_item = item.id_item DBSession.add(new_archivo) print "Recuperar los detalles" #recuperar los detalles historial_detalles = DBSession.query(HistorialDetalleItem).\ filter(HistorialDetalleItem.id_historial == historial_item.id_historial_item).\ all() #variable para indexar las posiciones que corresponden a los valores #de esa version atributo_mapper = {} index = 0 """ Se establecen los detalles actuales del item a None para que el item conserve los campos definidos por su tipo de item. El item recuperara los valores de la version a la cual se quiere revertir """ for detalle in item.detalles: detalle.valor = None detalle.observacion = None atributo_mapper[detalle.id_atributo_tipo_item] = index index += 1 for hist_detalle in historial_detalles: index = atributo_mapper[hist_detalle.id_atributo_tipo_item] item.detalles[index].observacion = hist_detalle.observacion item.detalles[index].valor = hist_detalle.valor DBSession.merge(item) #borrar las relaciones actuales relaciones = DBSession.query(RelacionItem).\ filter(or_(RelacionItem.id_item_actual == item.id_item, RelacionItem.id_item_relacionado == item.id_item)).\ all() print relaciones for relacion in relaciones: #se verifica que no deje huerfanos if not self.deja_huerfanos(relacion): print 'borrando relacion' DBSession.delete(relacion) print "Recuperar las relaciones" #recuperar los relaciones historial_relaciones = DBSession.query(HistorialRelacion).\ filter(HistorialRelacion.id_item_1 == item.id_item or HistorialRelacion.id_item_2 == item.id_item).\ all() print historial_relaciones for hist_relacion in historial_relaciones: relacion = RelacionItem() if(DBSession.query(Item).get(hist_relacion.id_item_1)!=None and DBSession.query(Item).get(hist_relacion.id_item_2)!=None): relacion.id_item_actual = hist_relacion.id_item_1 relacion.id_item_relacionado = hist_relacion.id_item_2 relacion.relacion_parentesco = hist_relacion.id_tipo_relacion DBSession.merge(relacion) print "Merge" DBSession.merge(item) print "Flush" DBSession.flush() return
def put(self, id_item, **kw): item = DBSession.query(Item).get(id_item) # Se registra en el historial el item antes de ser modificado item_util.audit_item(item) # Se modifica el item item.descripcion = kw['descripcion'] #item.codigo = kw['codigo'] item.nombre = kw['nombre'] item.complejidad = kw['complejidad'] item.prioridad = kw['prioridad'] item.observacion = kw['observacion'] item.version = int(item.version) + 1 item.estado = 2 # En Desarrollo #Se persiste el item DBSession.merge(item) DBSession.flush() #se verifica si ya tenia un padre relacion = DBSession.query(RelacionItem).\ filter(RelacionItem.id_item_relacionado==item.id_item).\ filter(RelacionItem.relacion_parentesco==1).\ all() #se borra las relacion padre hijo si existia if relacion != []: DBSession.delete(relacion[0]) # Si se elijio NONE en las relaciones no se hace nada if(kw['relaciones'] != None): item_padre_antecesor = DBSession.query(Item).get(kw['relaciones']) item_util.audit_item(item_padre_antecesor) item_padre_antecesor.version += 1 DBSession.merge(item_padre_antecesor) DBSession.flush() #tipo de relacion 1 padre-hijo, 2 antecesor sucesor tipo_relacion = 2 if item_padre_antecesor.fase == int(item.fase): tipo_relacion = 1 rel = RelacionItem() rel.relacion_parentesco = tipo_relacion rel.id_item_actual = kw['relaciones'] rel.id_item_relacionado = item.id_item DBSession.add(rel) DBSession.flush() fase = DBSession.query(Fase).get(item.fase) grafo = item_util.proyectGraphConstructor(fase.proyecto) item_util.marcar_en_revision(grafo, item.id_item) #la linea del item modificado permanece abierta if item.linea_base != None: linea = item.linea_base linea.estado = estado_linea_base_util.get_by_codigo('Abierta') flash("El item " +str(item.nombre)+ " ha sido modificado correctamente.") redirect('/miproyecto/fase/item/ver/'+str(item.id_item))