Пример #1
0
    def importar_caracteristica(self, id_tipo_item_viejo, id_tipo_item_nuevo):
        """ Realiza la importación de características de un tipo de ítem a otro.
            @param id_tipo_item_viejo: id del tipo de ítem a ser importado.
            @param id_tipo_item_nuevo: id del tipo de ítem que será creado en
                base al importado.
            @type id_tipo_item_viejo: unicode
            @type id_tipo_item_nuevo: unicode
        """
        caracteristicas = DBSession.query(Caracteristica) \
            .filter(Caracteristica.id_tipo_item == id_tipo_item_viejo).all()
        for caracteristica in caracteristicas:
            c = Caracteristica()
            c.nombre = caracteristica.nombre
            c.tipo = caracteristica.tipo
            c.descripcion = caracteristica.descripcion
            ids_caracteristicas = DBSession.query(Caracteristica.id) \
               .filter(Caracteristica.id_tipo_item == id_tipo_item_nuevo).all()
            if ids_caracteristicas:        
                proximo_id_caracteristica = proximo_id(ids_caracteristicas)
            else:
                proximo_id_caracteristica = "CA1-" + id_tipo_item_nuevo
            c.id = proximo_id_caracteristica

            c.tipo_item = DBSession.query(TipoItem).filter(TipoItem.id == \
                        id_tipo_item_nuevo).one()
            DBSession.add(c)
Пример #2
0
    def crear_relacion(self, item_1, item_2, nueva_version):
        """
        Crea una relación entre dos ítems.

        @param item_1: Item antecesor/padre de la relación a ser creada.
        @type item_1: L{Item}
        @param item_2: Item sucesor/hijo de la relación a ser creada.
        @type item_2: L{Item}
        @return: True si la relación se creó exitosamente, 
                 False en caso contrario.
        @rtype: Bool
        """
        r = Relacion()
        r.id = "RE-" + item_1.id + "-" + unicode(item_1.version) + "+" + \
                item_2.id + "-" + unicode(item_2.version)
        r.item_1 = item_1
        r.item_2 = item_2
        a = forma_ciclo(r.item_1)
        DBSession.add(r)
        if a:
            if nueva_version == r.item_1:
                DBSession.delete(r.item_2)
            DBSession.delete(r)
            return False
        else:
            return True
Пример #3
0
 def importar_tipo_item(self, id_fase_vieja, id_fase_nueva):
     """ Realiza la importación de un tipo de ítem de una fase a otra.
         @param id_fase_vieja: id de la fase a ser importada.
         @param id_fase_nueva: id de la fase que será creada en
             base a la importada.
         @type id_fase_vieja: unicode
         @type id_fase_nueva: unicode
     """
     
     tipos_item = DBSession.query(TipoItem).filter(TipoItem.id_fase == \
                 id_fase_vieja).all()
     for tipo_item in tipos_item:
         t = TipoItem()
         t.codigo = tipo_item.codigo
         t.nombre = tipo_item.nombre
         t.descripcion = tipo_item.descripcion
         ids_tipos_item = DBSession.query(TipoItem.id) \
                 .filter(TipoItem.id_fase == id_fase_nueva).all()
         if ids_tipos_item:        
             proximo_id_tipo_item = proximo_id(ids_tipos_item)
         else:
             proximo_id_tipo_item = "TI1-" + id_fase_nueva
         t.id = proximo_id_tipo_item
         t.fase = DBSession.query(Fase).filter(Fase.id == id_fase_nueva) \
                 .one()
         DBSession.add(t)
         cont = DBSession.query(Caracteristica) \
                 .filter(Caracteristica.id_tipo_item == t.id).count()
         self.importar_caracteristica(tipo_item.id, t.id)
Пример #4
0
 def importar_tipo_item(self, *args, **kw):
     """
     Importa un tipo de ítem a una fase determinada.
     """
     id_fase = unicode(request.url.split("/")[-10])
     t = TipoItem()
     id_tipo_item = unicode(request.url.split("/")[-2])
     tipo_item_a_importar = DBSession.query(TipoItem) \
             .filter(TipoItem.id == id_tipo_item).one()
     existe_nombre = DBSession.query(TipoItem).filter(TipoItem.id_fase == \
             id_fase).filter(TipoItem.nombre == \
             tipo_item_a_importar.nombre).count()
     existe_codigo = DBSession.query(TipoItem).filter(TipoItem.id_fase == \
             id_fase).filter(TipoItem.codigo == \
             tipo_item_a_importar.codigo).count()    
     t.nombre = tipo_item_a_importar.nombre
     t.codigo = tipo_item_a_importar.codigo
     if existe_nombre:  
         t.nombre = t.nombre + "'"
     if existe_codigo:  
         t.codigo = t.codigo + "'"
     t.descripcion = tipo_item_a_importar.descripcion
     ids_tipos_item = DBSession.query(TipoItem.id) \
             .filter(TipoItem.id_fase == id_fase).all()
     if ids_tipos_item:        
         proximo_id_tipo_item = proximo_id(ids_tipos_item)
     else:
         proximo_id_tipo_item = "TI1-" + id_fase
     t.id = proximo_id_tipo_item
     t.fase = DBSession.query(Fase).filter(Fase.id == id_fase).one()        
     DBSession.add(t)
     self.importar_caracteristica(id_tipo_item, t.id)
     flash("Se importo de forma exitosa")
     raise redirect('./../../../../../../..')
Пример #5
0
 def importar_caracteristica(self, id_tipo_item_viejo, id_tipo_item_nuevo):
     """
     Importa las características correspondientes al tipo de ítem a 
     importar.
     @param id_tipo_item_viejo: Id del tipo de item a importar.
     @type id_tipo_item_viejo: Unicode. 
     @param id_tipo_item_nuevo: Id del tipo de item nuevo o importado.
     @type id_tipo_item_nuevo: Unicode
     """
     caracteristicas = DBSession.query(Caracteristica) \
            .filter(Caracteristica.id_tipo_item == id_tipo_item_viejo).all()
     for caracteristica in caracteristicas:
         c = Caracteristica()
         c.nombre = caracteristica.nombre
         c.tipo = caracteristica.tipo
         c.descripcion = caracteristica.descripcion
         ids_caracteristicas = DBSession.query(Caracteristica.id) \
            .filter(Caracteristica.id_tipo_item == id_tipo_item_nuevo).all()
         if ids_caracteristicas:        
             proximo_id_caracteristica = proximo_id(ids_caracteristicas)
         else:
             proximo_id_caracteristica = "CA1-" + id_tipo_item_nuevo
         c.id = proximo_id_caracteristica
         c.tipo_item = DBSession.query(TipoItem).filter(TipoItem.id == \
             id_tipo_item_nuevo).one()
         DBSession.add(c)
Пример #6
0
    def importar_tipo_item(self, id_fase_vieja, id_fase_nueva):
        """ Realiza la importación de un tipo de ítem de una fase a otra.
            @param id_fase_vieja: id de la fase a ser importada.
            @param id_fase_nueva: id de la fase que será creada en
                base a la importada.
            @type id_fase_vieja: unicode
            @type id_fase_nueva: unicode
        """

        tipos_item = DBSession.query(TipoItem).filter(TipoItem.id_fase == \
                    id_fase_vieja).all()
        for tipo_item in tipos_item:
            t = TipoItem()
            t.codigo = tipo_item.codigo
            t.nombre = tipo_item.nombre
            t.descripcion = tipo_item.descripcion
            ids_tipos_item = DBSession.query(TipoItem.id) \
                    .filter(TipoItem.id_fase == id_fase_nueva).all()
            if ids_tipos_item:
                proximo_id_tipo_item = proximo_id(ids_tipos_item)
            else:
                proximo_id_tipo_item = "TI1-" + id_fase_nueva
            t.id = proximo_id_tipo_item
            t.fase = DBSession.query(Fase).filter(Fase.id == id_fase_nueva) \
                    .one()
            DBSession.add(t)
            cont = DBSession.query(Caracteristica) \
                    .filter(Caracteristica.id_tipo_item == t.id).count()
            self.importar_caracteristica(tipo_item.id, t.id)
Пример #7
0
    def importar_fase(self, *args, **kw):
        """ Realiza la importación de una fase de un proyecto a otro.
        """
        id_proyecto = unicode(request.url.split("/")[-8])
        f = Fase()
        id_fase = unicode(request.url.split("/")[-2])
        fase_a_importar = DBSession.query(Fase).filter(Fase.id == id_fase) \
                .one()
        existe_nombre = DBSession.query(Fase).filter(Fase.id_proyecto == \
             id_proyecto).filter(Fase.nombre == fase_a_importar.nombre).count()
        f.nombre = fase_a_importar.nombre
        if existe_nombre:
            f.nombre = f.nombre + "'"
        f.orden = self.obtener_orden(id_proyecto)
        fecha_inicio = datetime.datetime.now()
        f.fecha_inicio = datetime.date(int(fecha_inicio.year), \
                    int(fecha_inicio.month),int(fecha_inicio.day))

        f.descripcion = fase_a_importar.descripcion
        f.estado = u'Inicial'
        ids_fases = DBSession.query(Fase.id).filter(Fase.id_proyecto == \
                    id_proyecto).all()
        if ids_fases:
            proximo_id_fase = proximo_id(ids_fases)
        else:
            proximo_id_fase = "FA1-" + id_proyecto
        f.id = proximo_id_fase
        f.proyecto = DBSession.query(Proyecto).filter(Proyecto.id == \
                id_proyecto).one()
        DBSession.add(f)
        self.importar_tipo_item(id_fase, f.id)
        flash(u"Se importó de forma exitosa")
        raise redirect('./../../../../..')
Пример #8
0
    def importar_caracteristica(self, id_tipo_item_viejo, id_tipo_item_nuevo):
        """ Realiza la importación de características de un tipo de ítem a otro.
            @param id_tipo_item_viejo: id del tipo de ítem a ser importado.
            @param id_tipo_item_nuevo: id del tipo de ítem que será creado en
                base al importado.
            @type id_tipo_item_viejo: unicode
            @type id_tipo_item_nuevo: unicode
        """
        caracteristicas = DBSession.query(Caracteristica) \
            .filter(Caracteristica.id_tipo_item == id_tipo_item_viejo).all()
        for caracteristica in caracteristicas:
            c = Caracteristica()
            c.nombre = caracteristica.nombre
            c.tipo = caracteristica.tipo
            c.descripcion = caracteristica.descripcion
            ids_caracteristicas = DBSession.query(Caracteristica.id) \
               .filter(Caracteristica.id_tipo_item == id_tipo_item_nuevo).all()
            if ids_caracteristicas:
                proximo_id_caracteristica = proximo_id(ids_caracteristicas)
            else:
                proximo_id_caracteristica = "CA1-" + id_tipo_item_nuevo
            c.id = proximo_id_caracteristica

            c.tipo_item = DBSession.query(TipoItem).filter(TipoItem.id == \
                        id_tipo_item_nuevo).one()
            DBSession.add(c)
Пример #9
0
    def crear_relacion(self, item_1, item_2, nueva_version):
        """
        Crea una relación entre dos ítems.

        @param item_1: Item antecesor/padre de la relación a ser creada.
        @type item_1: L{Item}
        @param item_2: Item sucesor/hijo de la relación a ser creada.
        @type item_2: L{Item}
        @return: True si la relación se creó exitosamente, 
                 False en caso contrario.
        @rtype: Bool
        """
        r = Relacion()
        r.id = "RE-" + item_1.id + "-" + unicode(item_1.version) + "+" + \
                item_2.id + "-" + unicode(item_2.version)
        r.item_1 = item_1
        r.item_2 = item_2
        a = forma_ciclo(r.item_1)
        DBSession.add(r)      
        if a:
            if nueva_version == r.item_1:
                DBSession.delete(r.item_2)
            DBSession.delete(r)
            return False
        else:
            return True        
Пример #10
0
    def post(self, **kw):
        """Registra el nuevo archivo creado."""
        id_item_version = unicode(request.url.split("/")[-3])
        self.id_item = id_item_version.split("-")[0] + "-" + id_item_version \
                    .split("-")[1] + "-" + id_item_version.split("-")[2] + \
                    "-" + id_item_version.split("-")[3]
        self.version_item = id_item_version.split("-")[4]
        it = DBSession.query(Item).filter(Item.id == self.id_item) \
            .filter(Item.version == self.version_item).one()
        nueva_version = self.crear_version(it)
        a = Archivo()

        ids_archivos = DBSession.query(Archivo.id).all()
        if ids_archivos:
            proximo_id_archivo = proximo_id(ids_archivos)
        else:
            proximo_id_archivo = "AR1"
        a.id = proximo_id_archivo
        a.nombre = kw['archivo'].filename
        a.contenido = kw['archivo'].value
        a.items.append(nueva_version)
        DBSession.add(a)
        flash(u"Creación realizada de forma exitosa")
        raise redirect('./../../' + nueva_version.id + '-' + unicode( \
                        nueva_version.version) + '/' + 'archivos/')
Пример #11
0
 def post(self, **kw):
     """ Registra el nuevo ítem creado. """
     i = Item()
     i.descripcion = kw['descripcion']
     i.nombre = kw['nombre']
     i.estado = 'En desarrollo'
     i.observaciones = kw['observaciones']
     i.prioridad = kw['prioridad']
     i.complejidad = kw['complejidad']
     i.version = 1
     i.borrado = False
     caract = DBSession.query(Caracteristica) \
             .filter(Caracteristica.id_tipo_item == kw['tipo_item']).all()
     anexo = dict()
     for nom_car in caract: 
         anexo[nom_car.nombre] = kw[nom_car.nombre]
     i.anexo = json.dumps(anexo)
     ids_items = DBSession.query(Item.id) \
             .filter(Item.id_tipo_item == kw["tipo_item"]).all()
     if ids_items:        
         proximo_id_item = proximo_id(ids_items)
     else:
         proximo_id_item = "IT1-" + kw["tipo_item"]
     i.id = proximo_id_item
     i.tipo_item = DBSession.query(TipoItem) \
             .filter(TipoItem.id == kw["tipo_item"]).one()
     DBSession.add(i)
     i.codigo = i.tipo_item.codigo + "-" + i.id.split("-")[0][2:]
     raise redirect('./')
Пример #12
0
 def importar_fase(self, *args, **kw):
     """ Realiza la importación de una fase de un proyecto a otro.
     """
     id_proyecto = unicode(request.url.split("/")[-8])
     f = Fase()
     id_fase = unicode(request.url.split("/")[-2])
     fase_a_importar = DBSession.query(Fase).filter(Fase.id == id_fase) \
             .one()
     existe_nombre = DBSession.query(Fase).filter(Fase.id_proyecto == \
          id_proyecto).filter(Fase.nombre == fase_a_importar.nombre).count()    
     f.nombre = fase_a_importar.nombre
     if existe_nombre:  
         f.nombre = f.nombre + "'"   
     f.orden = self.obtener_orden(id_proyecto)
     fecha_inicio = datetime.datetime.now()
     f.fecha_inicio = datetime.date(int(fecha_inicio.year), \
                 int(fecha_inicio.month),int(fecha_inicio.day))
     
     f.descripcion = fase_a_importar.descripcion
     f.estado = u'Inicial'
     ids_fases = DBSession.query(Fase.id).filter(Fase.id_proyecto == \
                 id_proyecto).all()
     if ids_fases:        
         proximo_id_fase = proximo_id(ids_fases)
     else:
         proximo_id_fase = "FA1-" + id_proyecto
     f.id = proximo_id_fase
     f.proyecto = DBSession.query(Proyecto).filter(Proyecto.id == \
             id_proyecto).one()        
     DBSession.add(f)
     self.importar_tipo_item(id_fase, f.id)
     flash(u"Se importó de forma exitosa")
     raise redirect('./../../../../..')
Пример #13
0
    def post(self, **kw):
        """ Registra la nueva línea base creada."""
        lista_ids_item = list()
        l = LineaBase()
        l.descripcion = kw['descripcion']
        ids_lineas_base = DBSession.query(LineaBase.id) \
                          .filter(LineaBase.id_fase == self.id_fase).all()
        if ids_lineas_base:
            proximo_id_linea_base = proximo_id(ids_lineas_base)
        else:
            proximo_id_linea_base = "LB1-" + self.id_fase
        l.id = proximo_id_linea_base
        l.fase = DBSession.query(Fase).filter(Fase.id == self.id_fase).one()
        l.cerrado = True
        l.consistente = True
        for item in kw['items']:
            lista_ids_item.append((item.split("/")[0], item.split("/")[-1]))
        for i in lista_ids_item:
            items = DBSession.query(Item).filter(Item.id == i[0]).all()
            for item in items:
                l.items.append(item)

        DBSession.add(l)
        flash(u"Creación realizada de forma exitosa")
        raise redirect('./')
Пример #14
0
 def post(self, **kw):
     """ Registra el nuevo ítem creado. """
     i = Item()
     i.descripcion = kw['descripcion']
     i.nombre = kw['nombre']
     i.estado = 'En desarrollo'
     i.observaciones = kw['observaciones']
     i.prioridad = kw['prioridad']
     i.complejidad = kw['complejidad']
     i.version = 1
     i.borrado = False
     caract = DBSession.query(Caracteristica) \
             .filter(Caracteristica.id_tipo_item == kw['tipo_item']).all()
     anexo = dict()
     for nom_car in caract:
         anexo[nom_car.nombre] = kw[nom_car.nombre]
     i.anexo = json.dumps(anexo)
     ids_items = DBSession.query(Item.id) \
             .filter(Item.id_tipo_item == kw["tipo_item"]).all()
     if ids_items:
         proximo_id_item = proximo_id(ids_items)
     else:
         proximo_id_item = "IT1-" + kw["tipo_item"]
     i.id = proximo_id_item
     i.tipo_item = DBSession.query(TipoItem) \
             .filter(TipoItem.id == kw["tipo_item"]).one()
     DBSession.add(i)
     i.codigo = i.tipo_item.codigo + "-" + i.id.split("-")[0][2:]
     raise redirect('./')
Пример #15
0
 def post(self, **kw):
     """Registra la nueva ficha creada"""
     if not DBSession.query(Ficha).filter(Ficha.id_usuario == \
             kw['usuario']).filter(Ficha.id_rol == kw['rol']) \
             .filter(Ficha.id_fase == self.id_fase).count():
         f = Ficha()
         ids_fichas = DBSession.query(Ficha.id).filter(Ficha.id_usuario == \
                 kw['usuario']).all()
         if ids_fichas:        
             proximo_id_ficha = proximo_id(ids_fichas)
         else:
             proximo_id_ficha = "FI1-" + kw['usuario']
         f.id = proximo_id_ficha
         usuario = DBSession.query(Usuario).filter(Usuario.id == \
             kw['usuario']).one()
         rol = DBSession.query(Rol).filter(Rol.id ==  kw['rol']).one()
         fase = DBSession.query(Fase).filter(Fase.id == self.id_fase).one()
         proyecto = fase.proyecto
         f.usuario = usuario
         f.rol = rol
         f.proyecto = proyecto   
         f.fase = fase        
         DBSession.add(f)
     else:
         flash(u"La ficha ya existe", u"error")
     raise redirect('./')
Пример #16
0
    def post(self, **kw):
        """Registra el nuevo archivo creado."""
        id_item_version = unicode(request.url.split("/")[-3])
        self.id_item = id_item_version.split("-")[0] + "-" + id_item_version \
                    .split("-")[1] + "-" + id_item_version.split("-")[2] + \
                    "-" + id_item_version.split("-")[3]
        self.version_item = id_item_version.split("-")[4]
        it = DBSession.query(Item).filter(Item.id == self.id_item) \
            .filter(Item.version == self.version_item).one()
        nueva_version = self.crear_version(it)
        a = Archivo()

        ids_archivos = DBSession.query(Archivo.id).all()
        if ids_archivos:        
            proximo_id_archivo = proximo_id(ids_archivos)
        else:
            proximo_id_archivo = "AR1"
        a.id = proximo_id_archivo 
        a.nombre = kw['archivo'].filename
        a.contenido = kw['archivo'].value
        a.items.append(nueva_version)
        DBSession.add(a)
        flash(u"Creación realizada de forma exitosa")
        raise redirect('./../../' + nueva_version.id + '-' + unicode( \
                        nueva_version.version) + '/' + 'archivos/')
Пример #17
0
 def crear_tipo_default(self, id_fase):
     """ Crea un tipo de ítem por defecto al crear una fase.
     """
     ti = TipoItem()
     ti.nombre = "Default"    
     ti.descripcion = "Default"
     ti.id = "TI1-" + id_fase
     ti.codigo = "DF"
     ti.fase = DBSession.query(Fase).filter(Fase.id == id_fase).one() 
     DBSession.add(ti)
Пример #18
0
    def dividir(self, **kw):
        """ Permite formar una línea base a partir de dos o más líneas base
            existentes previamente.
        """
        id_proyecto = self.id_fase.split("-")[1]
        if TienePermiso("separar linea base",
                        id_proyecto=id_proyecto,
                        id_fase=self.id_fase).is_met(request.environ):
            if "pk_linea_base" in kw:
                self.id_primera_lb = kw["pk_linea_base"]
                items = DBSession.query(Item).filter(
                    Item.id_linea_base == self.id_primera_lb)
                items_a_mostrar = UnificarItem(items)

            if "seleccionados" in kw:
                lb = LineaBase()
                lb.descripcion = kw["descripcion"]
                ids_lineas_base = DBSession.query(LineaBase.id) \
                                  .filter(LineaBase.id_fase == self.id_fase) \
                                  .all()
                proximo_id_linea_base = proximo_id(ids_lineas_base)
                lb.id = proximo_id_linea_base
                lb.fase = DBSession.query(Fase) \
                          .filter(Fase.id == self.id_fase).one()
                lb.cerrado = False
                lb.consistente = True
                DBSession.add(lb)

                if type(kw["seleccionados"]).__name__ == "unicode":
                    item = DBSession.query(Item) \
                           .filter(Item.id == kw["seleccionados"]).all()
                    for aux in item:
                        aux.linea_base = DBSession.query(LineaBase) \
                                      .filter(LineaBase.id == lb.id).one()
                    consistencia_lb(lb)
                else:
                    for item_seleccionado in kw["seleccionados"]:
                        items = DBSession.query(Item) \
                                .filter(Item.id == item_seleccionado).all()
                        for item in items:
                            item.linea_base = DBSession.query(LineaBase) \
                                              .filter(LineaBase.id == lb.id) \
                                              .one()
                primera_lb = DBSession.query(LineaBase) \
                             .filter(LineaBase.id == self.id_primera_lb).one()
                consistencia_lb(primera_lb)
                redirect('./.')
            d = dict(items=items_a_mostrar, model="Lineas Base")
            d["accion"] = "dividir"
            d["direccion_anterior"] = "./"
            return d
        else:
            flash(u"El usuario no cuenta con los permisos necesarios",
                  u"error")
            redirect('./')
Пример #19
0
 def setUp(self):
     """Prepare model test fixture."""
     try:
         new_attrs = {}
         new_attrs.update(self.attrs)
         new_attrs.update(self.do_get_dependencies())
         self.obj = self.klass(**new_attrs)
         DBSession.add(self.obj)
         DBSession.flush()
         return self.obj
     except:
         DBSession.rollback()
         raise
Пример #20
0
 def setUp(self):
     """Prepare model test fixture."""
     try:
         new_attrs = {}
         new_attrs.update(self.attrs)
         new_attrs.update(self.do_get_dependencies())
         self.obj = self.klass(**new_attrs)
         DBSession.add(self.obj)
         DBSession.flush()
         return self.obj
     except:
         DBSession.rollback()
         raise
Пример #21
0
 def post(self, **kw):
     """ Registra el nuevo rol creado. """
     r = Rol()
     r.nombre = kw['nombre']
     r.descripcion = kw['descripcion']
     r.tipo = kw['tipo']
     ids_roles = DBSession.query(Rol.id).all()
     if ids_roles:        
         proximo_id_rol = proximo_id(ids_roles)
     else:
         proximo_id_rol = "RL1"
     r.id = proximo_id_rol
     DBSession.add(r)
     raise redirect('./')
Пример #22
0
 def post(self, **kw):
     """ Registra el nuevo rol creado. """
     r = Rol()
     r.nombre = kw['nombre']
     r.descripcion = kw['descripcion']
     r.tipo = kw['tipo']
     ids_roles = DBSession.query(Rol.id).all()
     if ids_roles:
         proximo_id_rol = proximo_id(ids_roles)
     else:
         proximo_id_rol = "RL1"
     r.id = proximo_id_rol
     DBSession.add(r)
     raise redirect('./')
Пример #23
0
 def crear_revision(self, item, msg):
     """ Crea una revisión cuando al borrar una relación un ítem queda
         huérfano, se le genera una revisión al mismo.
     """
     rv = Revision()
     ids_revisiones = DBSession.query(Revision.id) \
                     .filter(Revision.id_item == item.id).all()
     if ids_revisiones:
         proximo_id_revision = proximo_id(ids_revisiones)
     else:
         proximo_id_revision = "RV1-" + item.id
     rv.id = proximo_id_revision
     rv.item = item
     rv.descripcion = msg
     DBSession.add(rv)       
Пример #24
0
 def crear_revision(self, item, msg):
     """ Crea una revisión cuando al borrar una relación un ítem queda
         huérfano, se le genera una revisión al mismo.
     """
     rv = Revision()
     ids_revisiones = DBSession.query(Revision.id) \
                     .filter(Revision.id_item == item.id).all()
     if ids_revisiones:
         proximo_id_revision = proximo_id(ids_revisiones)
     else:
         proximo_id_revision = "RV1-" + item.id
     rv.id = proximo_id_revision
     rv.item = item
     rv.descripcion = msg
     DBSession.add(rv)
Пример #25
0
 def post(self, **kw):
     """ Registra el nuevo tipo de ítem creado. """
     t = TipoItem()
     t.descripcion = kw['descripcion']
     t.nombre = kw['nombre']
     t.codigo = kw['codigo'].upper()
     ids_tipos_item = DBSession.query(TipoItem.id).filter(TipoItem.id_fase \
                     == self.id_fase).all()
     if ids_tipos_item:
         proximo_id_tipo_item = proximo_id(ids_tipos_item)
     else:
         proximo_id_tipo_item = "TI1-" + self.id_fase
     t.id = proximo_id_tipo_item
     t.fase = DBSession.query(Fase).filter(Fase.id == self.id_fase).one()
     DBSession.add(t)
     raise redirect('./')
Пример #26
0
 def post(self, **kw):
     """ Registra el nuevo tipo de ítem creado. """
     t = TipoItem()
     t.descripcion = kw['descripcion']
     t.nombre = kw['nombre']
     t.codigo = kw['codigo'].upper()
     ids_tipos_item = DBSession.query(TipoItem.id).filter(TipoItem.id_fase \
                     == self.id_fase).all()
     if ids_tipos_item:        
         proximo_id_tipo_item = proximo_id(ids_tipos_item)
     else:
         proximo_id_tipo_item = "TI1-" + self.id_fase
     t.id = proximo_id_tipo_item
     t.fase = DBSession.query(Fase).filter(Fase.id == self.id_fase).one()        
     DBSession.add(t)
     raise redirect('./')
Пример #27
0
    def unir(self, **kw):
        """ Permite realizar la unión entre dos o más líneas base de manera
            que formen una sola.
        """
        id_proyecto = self.id_fase.split("-")[1]
        if TienePermiso("unir lineas base",
                        id_proyecto=id_proyecto,
                        id_fase=self.id_fase).is_met(request.environ):
            if "seleccionados" in kw:
                lb = LineaBase()
                lb.descripcion = kw["descripcion"]
                ids_lineas_base = DBSession.query(LineaBase.id) \
                                  .filter(LineaBase.id_fase == self.id_fase) \
                                  .all()
                proximo_id_linea_base = proximo_id(ids_lineas_base)
                lb.id = proximo_id_linea_base
                lb.fase = DBSession.query(Fase) \
                          .filter(Fase.id == self.id_fase).one()
                lb.cerrado = False
                lb.consistente = False
                DBSession.add(lb)
                consistente = True
                for lb_seleccionada in kw["seleccionados"]:
                    items = DBSession.query(Item).filter(
                        Item.id_linea_base == lb_seleccionada).all()
                    a_eliminar = DBSession.query(LineaBase) \
                                 .filter(LineaBase.id == lb_seleccionada).one()
                    DBSession.delete(a_eliminar)
                    for item in items:
                        item.linea_base = DBSession.query(LineaBase) \
                                          .filter(LineaBase.id == lb.id).one()
                consistencia_lb(lb)
                DBSession.add(lb)

                redirect('./')
            lineas_base = DBSession.query(LineaBase.id) \
                          .filter(LineaBase.id_fase == self.id_fase) \
                          .filter(LineaBase.cerrado == False).all()

            d = dict(model="Linea Base", accion="./")
            d["lineas_base"] = lineas_base
            d["direccion_anterior"] = "./"
            return d
        else:
            flash(u"El usuario no cuenta con los permisos necesarios",
                  u"error")
            redirect('./')
Пример #28
0
 def post(self, **kw):
     c = Caracteristica()
     c.descripcion = kw['descripcion']
     c.nombre = kw['nombre']
     c.tipo = kw['tipo']
     ids_caracteristicas = DBSession.query(Caracteristica.id).filter( \
                 Caracteristica.id_tipo_item == self.id_tipo_item).all()
     if ids_caracteristicas:
         proximo_id_caracteristica = proximo_id(ids_caracteristicas)
     else:
         proximo_id_caracteristica = "CA1-" + self.id_tipo_item
     c.id = proximo_id_caracteristica
     c.tipo_item = DBSession.query(TipoItem).filter(TipoItem.id == \
             self.id_tipo_item).one()
     DBSession.add(c)
     self.set_null(c)
     raise redirect('./')
Пример #29
0
 def post(self, **kw):
     c = Caracteristica()
     c.descripcion = kw['descripcion']
     c.nombre = kw['nombre']
     c.tipo = kw['tipo']
     ids_caracteristicas = DBSession.query(Caracteristica.id).filter( \
                 Caracteristica.id_tipo_item == self.id_tipo_item).all()
     if ids_caracteristicas:        
         proximo_id_caracteristica = proximo_id(ids_caracteristicas)
     else:
         proximo_id_caracteristica = "CA1-" + self.id_tipo_item
     c.id = proximo_id_caracteristica
     c.tipo_item = DBSession.query(TipoItem).filter(TipoItem.id == \
             self.id_tipo_item).one()        
     DBSession.add(c)
     self.set_null(c)
     raise redirect('./')
Пример #30
0
    def dividir(self, **kw):
        """ Permite formar una línea base a partir de dos o más líneas base
            existentes previamente.
        """
        id_proyecto = self.id_fase.split("-")[1]
        if TienePermiso("separar linea base", id_proyecto=id_proyecto, id_fase=self.id_fase).is_met(request.environ):
            if "pk_linea_base" in kw:
                self.id_primera_lb = kw["pk_linea_base"]
                items = DBSession.query(Item).filter(Item.id_linea_base == self.id_primera_lb)
                items_a_mostrar = UnificarItem(items)

            if "seleccionados" in kw:
                lb = LineaBase()
                lb.descripcion = kw["descripcion"]
                ids_lineas_base = DBSession.query(LineaBase.id).filter(LineaBase.id_fase == self.id_fase).all()
                proximo_id_linea_base = proximo_id(ids_lineas_base)
                lb.id = proximo_id_linea_base
                lb.fase = DBSession.query(Fase).filter(Fase.id == self.id_fase).one()
                lb.cerrado = False
                lb.consistente = True
                DBSession.add(lb)

                if type(kw["seleccionados"]).__name__ == "unicode":
                    item = DBSession.query(Item).filter(Item.id == kw["seleccionados"]).all()
                    for aux in item:
                        aux.linea_base = DBSession.query(LineaBase).filter(LineaBase.id == lb.id).one()
                    consistencia_lb(lb)
                else:
                    for item_seleccionado in kw["seleccionados"]:
                        items = DBSession.query(Item).filter(Item.id == item_seleccionado).all()
                        for item in items:
                            item.linea_base = DBSession.query(LineaBase).filter(LineaBase.id == lb.id).one()
                primera_lb = DBSession.query(LineaBase).filter(LineaBase.id == self.id_primera_lb).one()
                consistencia_lb(primera_lb)
                redirect("./.")
            d = dict(items=items_a_mostrar, model="Lineas Base")
            d["accion"] = "dividir"
            d["direccion_anterior"] = "./"
            return d
        else:
            flash(u"El usuario no cuenta con los permisos necesarios", u"error")
            redirect("./")
Пример #31
0
 def post(self, **kw):
     """Registra la nueva fase creada."""
     f = Fase()
     f.nombre = kw['nombre']   
     f.orden = kw['orden']
     f.descripcion = kw['descripcion']
     f.estado = 'Inicial'
     ids_fases = DBSession.query(Fase.id).filter(Fase.id_proyecto == \
                 self.id_proyecto).all()
     if ids_fases:        
         proximo_id_fase = proximo_id(ids_fases)
     else:
         proximo_id_fase = "FA1-" + self.id_proyecto
     f.id = proximo_id_fase
     proyecto = DBSession.query(Proyecto).filter(Proyecto.id == \
                 self.id_proyecto).one()
     f.proyecto = proyecto
     DBSession.add(f)
     self.crear_tipo_default(f.id)
     raise redirect('./')
Пример #32
0
 def crear_revision(self, item, msg):
     """
     Crea una nueva revisión y la agrega a un item dado.
     
     @param item: Item al cual se agregará la revisión
     @type item: L{Item}
     @param msg: Mensaje de la revisión
     @type msg: String
     """
     rv = Revision()
     ids_revisiones = DBSession.query(Revision.id) \
             .filter(Revision.id_item == item.id).all()
     if ids_revisiones:
         proximo_id_revision = proximo_id(ids_revisiones)
     else:
         proximo_id_revision = "RV1-" + item.id
     rv.id = proximo_id_revision
     rv.item = item
     rv.descripcion = msg
     DBSession.add(rv)
Пример #33
0
 def crear_revision(self, item, msg):
     """
     Crea una nueva revisión y la agrega a un item dado.
     
     @param item: Item al cual se agregará la revisión
     @type item: L{Item}
     @param msg: Mensaje de la revisión
     @type msg: String
     """
     rv = Revision()
     ids_revisiones = DBSession.query(Revision.id) \
             .filter(Revision.id_item == item.id).all()
     if ids_revisiones:
         proximo_id_revision = proximo_id(ids_revisiones)
     else:
         proximo_id_revision = "RV1-" + item.id
     rv.id = proximo_id_revision
     rv.item = item
     rv.descripcion = msg
     DBSession.add(rv)        
Пример #34
0
    def unir(self, **kw):
        """ Permite realizar la unión entre dos o más líneas base de manera
            que formen una sola.
        """
        id_proyecto = self.id_fase.split("-")[1]
        if TienePermiso("unir lineas base", id_proyecto=id_proyecto, id_fase=self.id_fase).is_met(request.environ):
            if "seleccionados" in kw:
                lb = LineaBase()
                lb.descripcion = kw["descripcion"]
                ids_lineas_base = DBSession.query(LineaBase.id).filter(LineaBase.id_fase == self.id_fase).all()
                proximo_id_linea_base = proximo_id(ids_lineas_base)
                lb.id = proximo_id_linea_base
                lb.fase = DBSession.query(Fase).filter(Fase.id == self.id_fase).one()
                lb.cerrado = False
                lb.consistente = False
                DBSession.add(lb)
                consistente = True
                for lb_seleccionada in kw["seleccionados"]:
                    items = DBSession.query(Item).filter(Item.id_linea_base == lb_seleccionada).all()
                    a_eliminar = DBSession.query(LineaBase).filter(LineaBase.id == lb_seleccionada).one()
                    DBSession.delete(a_eliminar)
                    for item in items:
                        item.linea_base = DBSession.query(LineaBase).filter(LineaBase.id == lb.id).one()
                consistencia_lb(lb)
                DBSession.add(lb)

                redirect("./")
            lineas_base = (
                DBSession.query(LineaBase.id)
                .filter(LineaBase.id_fase == self.id_fase)
                .filter(LineaBase.cerrado == False)
                .all()
            )

            d = dict(model="Linea Base", accion="./")
            d["lineas_base"] = lineas_base
            d["direccion_anterior"] = "./"
            return d
        else:
            flash(u"El usuario no cuenta con los permisos necesarios", u"error")
            redirect("./")
Пример #35
0
 def post(self, **kw):
     """ Registra el nuevo proyecto creado. """
     p = Proyecto()
     p.descripcion = kw['descripcion']
     p.nombre = kw['nombre']
     p.estado = 'Nuevo'
     p.nro_fases = int(kw['nro_fases'])
     ids_proyectos = DBSession.query(Proyecto.id).all()
     if ids_proyectos:
         proximo_id_proyecto = proximo_id(ids_proyectos)
     else:
         proximo_id_proyecto = "PR1"
     p.id = proximo_id_proyecto
     if kw['lider']:
         objeto_usuario = DBSession.query(Usuario).filter(Usuario.id == \
                         kw['lider']).one()
         p.lider = objeto_usuario
         ids_fichas = DBSession.query(Ficha.id).filter(Ficha.id_usuario == \
                     kw['lider']).all()
         r = DBSession.query(Rol).filter(Rol.id == u'RL2').one()
         ficha = Ficha()
         ficha.usuario = objeto_usuario
         ficha.rol = r
         ficha.proyecto = p
         if ids_fichas:
             proximo_id_ficha = proximo_id(ids_fichas)
         else:
             proximo_id_ficha = "FI1-" + kw["lider"]
         ficha.id = proximo_id_ficha
         DBSession.add(p)
         DBSession.add(ficha)
     else:
         DBSession.add(p)
     raise redirect('./')
Пример #36
0
 def post(self, **kw):
     """ Registra el nuevo proyecto creado. """
     p = Proyecto()
     p.descripcion = kw['descripcion']
     p.nombre = kw['nombre']
     p.estado = 'Nuevo'
     p.nro_fases = int(kw['nro_fases'])
     ids_proyectos = DBSession.query(Proyecto.id).all()
     if ids_proyectos:
         proximo_id_proyecto = proximo_id(ids_proyectos)
     else:
         proximo_id_proyecto = "PR1"
     p.id = proximo_id_proyecto
     if kw['lider']:
         objeto_usuario = DBSession.query(Usuario).filter(Usuario.id == \
                         kw['lider']).one()
         p.lider = objeto_usuario
         ids_fichas = DBSession.query(Ficha.id).filter(Ficha.id_usuario == \
                     kw['lider']).all()
         r = DBSession.query(Rol).filter(Rol.id == u'RL2').one()
         ficha = Ficha()
         ficha.usuario = objeto_usuario
         ficha.rol = r
         ficha.proyecto = p
         if ids_fichas:
             proximo_id_ficha = proximo_id(ids_fichas)
         else:
             proximo_id_ficha = "FI1-" + kw["lider"]
         ficha.id = proximo_id_ficha
         DBSession.add(p)
         DBSession.add(ficha)            
     else:
         DBSession.add(p)
     raise redirect('./')
Пример #37
0
    def post(self, **kw):
        """Registra la nueva relación creada."""
        r = Relacion()

        item_2 = DBSession.query(Item).filter(Item.id == self.id_item) \
                .filter(Item.version == self.version_item).one()
        item_1 = DBSession.query(Item).filter(Item.id == kw["item_2"]) \
                .order_by(desc(Item.version)).first()
        r.id = "RE-" + item_1.id + "-" + unicode(item_1.version) + "+" + \
                item_2.id + "-" + unicode(item_2.version + 1)
        r.item_1 = item_1
        r.item_2 = self.crear_version(item_2)
        if forma_ciclo(r.item_1):
            flash(u"No se puede crear la relación", u"error")

            DBSession.delete(r.item_2)
            DBSession.delete(r)
            raise redirect('./')
        else:
            DBSession.add(r)
            flash("Creacion realizada de forma exitosa")
            raise redirect('./../../' + r.item_2.id + '-' + \
                unicode(r.item_2.version) + '/' + 'relaciones/')
Пример #38
0
    def post(self, **kw):
        """Registra la nueva relación creada."""
        r = Relacion()

        item_2 = DBSession.query(Item).filter(Item.id == self.id_item) \
                .filter(Item.version == self.version_item).one()
        item_1 = DBSession.query(Item).filter(Item.id == kw["item_2"]) \
                .order_by(desc(Item.version)).first()
        r.id = "RE-" + item_1.id + "-" + unicode(item_1.version) + "+" + \
                item_2.id + "-" + unicode(item_2.version + 1)
        r.item_1 = item_1
        r.item_2 = self.crear_version(item_2)
        if forma_ciclo(r.item_1):
            flash(u"No se puede crear la relación", u"error")

            DBSession.delete(r.item_2)
            DBSession.delete(r)
            raise redirect('./')
        else:
            DBSession.add(r)
            flash("Creacion realizada de forma exitosa")
            raise redirect('./../../' + r.item_2.id + '-' + \
                unicode(r.item_2.version) + '/' + 'relaciones/')
Пример #39
0
    def post(self, **kw):
        """ Registra la nueva línea base creada."""
        lista_ids_item = list()
        l = LineaBase()
        l.descripcion = kw["descripcion"]
        ids_lineas_base = DBSession.query(LineaBase.id).filter(LineaBase.id_fase == self.id_fase).all()
        if ids_lineas_base:
            proximo_id_linea_base = proximo_id(ids_lineas_base)
        else:
            proximo_id_linea_base = "LB1-" + self.id_fase
        l.id = proximo_id_linea_base
        l.fase = DBSession.query(Fase).filter(Fase.id == self.id_fase).one()
        l.cerrado = True
        l.consistente = True
        for item in kw["items"]:
            lista_ids_item.append((item.split("/")[0], item.split("/")[-1]))
        for i in lista_ids_item:
            items = DBSession.query(Item).filter(Item.id == i[0]).all()
            for item in items:
                l.items.append(item)

        DBSession.add(l)
        flash(u"Creación realizada de forma exitosa")
        raise redirect("./")
Пример #40
0
    def put(self, *args, **kw):
        """ Registra los cambios realizados a un ítem. """
        nombre_caract = DBSession.query(Caracteristica.nombre) \
                .filter(Caracteristica.id_tipo_item == kw['tipo_item']).all()
        anexo = dict()
        for nom_car in nombre_caract:
            anexo[nom_car.nombre] = kw[nom_car.nombre]
        anexo = json.dumps(anexo)

        clave_primaria = args[0]
        pk_version = unicode(clave_primaria.split("-")[4])
        pk_id = unicode(clave_primaria.split("-")[0] + "-" + \
                clave_primaria.split("-")[1] + "-" + \
                clave_primaria.split("-")[2] + "-" + \
                clave_primaria.split("-")[3])
        clave = {}
        clave[0] = pk_id
        clave[1] = pk_version
        it = DBSession.query(Item).filter(Item.id == pk_id).filter( \
                Item.version == pk_version).scalar()
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(clave):
                kw[pk] = clave[i]
        band = 0
        nueva_version = Item()
        nueva_version.id = it.id
        nueva_version.codigo = it.codigo
        nueva_version.version = int(pk_version) + 1
        nueva_version.nombre = it.nombre
        nueva_version.descripcion = it.descripcion
        nueva_version.estado = u"En desarrollo"
        nueva_version.observaciones = it.observaciones
        nueva_version.prioridad = it.prioridad
        nueva_version.complejidad = it.complejidad
        nueva_version.borrado = it.borrado
        nueva_version.anexo = it.anexo
        if not it.descripcion == kw['descripcion']:
            band = 1
            nueva_version.descripcion = kw['descripcion']
        if not it.nombre == kw['nombre']:
            band = 1
            nueva_version.nombre = kw['nombre']
        if not it.observaciones == kw['observaciones']:
            band = 1
            nueva_version.observaciones = kw['observaciones']
        if not it.prioridad == int(kw['prioridad']):
            band = 1
            nueva_version.prioridad = kw['prioridad']
        if not it.complejidad == int(kw['complejidad']):
            band = 1
            nueva_version.complejidad = kw['complejidad']
        if not it.anexo == anexo:
            band = 1
            nueva_version.anexo = anexo

        if band:
            nueva_version.tipo_item = it.tipo_item
            nueva_version.linea_base = it.linea_base
            nueva_version.archivos = it.archivos
            nueva_version.revisiones = it.revisiones
            for relacion in relaciones_a_actualizadas(it.relaciones_a):
                aux = relacion.id.split("+")
                r = Relacion()
                r.id = "-".join(aux[0].split("-")[0:-1]) + "-" + \
                        unicode(nueva_version.version) + "+" +aux[1]
                r.item_1 = nueva_version
                r.item_2 = relacion.item_2
            for relacion in relaciones_b_actualizadas(it.relaciones_b):
                r = Relacion()
                aux = relacion.id.split("+")
                r.id = aux[0] + "+" + "-".join(aux[1].split("-")[0:-1]) + \
                        "-" + unicode(nueva_version.version)
                r.item_1 = relacion.item_1
                r.item_2 = nueva_version
            DBSession.add(nueva_version)
            r_act = relaciones_a_actualizadas(it.relaciones_a)
            listaux = [r.item_2 for r in r_act]
            ids_items_direc_relacionados_1 = DBSession.query( \
                    Relacion.id_item_2, Relacion.version_item_2) \
                    .filter(Relacion.id_item_1 == pk_id) \
                    .filter(Relacion.version_item_1 == pk_version).all()
            for tupla_id_item_version in (ids_items_direc_relacionados_1):
                id_item = tupla_id_item_version[0]
                version_item = tupla_id_item_version[1]
                item_revision =  DBSession.query(Item) \
                                .filter(Item.id == id_item) \
                                .filter(Item.version == version_item).one()
                if item_revision in listaux:
                    r = Revision()
                    ids_revisiones = DBSession.query(Revision.id) \
                                .filter(Revision.id_item == id_item).all()
                    if ids_revisiones:
                        proximo_id_revision = proximo_id(ids_revisiones)
                    else:
                        proximo_id_revision = "RV1-" + id_item
                    r.id = proximo_id_revision
                    r.item = item_revision

                    r.descripcion = "Modificacion del item relacionado '\
                                    'directamente: " + pk_id
                    DBSession.add(r)

        else:
            self.provider.update(self.model, params=kw)
        redirect('../')
Пример #41
0
 def revertir(self, *args, **kw):
     """
     Revierte un ítem a una versión especificada en los parámetros.
     """
     item = DBSession.query(Item).filter(Item.id == self.id_item) \
             .filter(Item.version == self.version_item).one()
     if TienePermiso("reversionar item", id_fase = item.tipo_item.fase.id) \
             .is_met(request.environ):
         id_item = unicode("-".join(kw["item"] \
                 .split("-")[0:-1]))
         version_item = unicode(kw["item"].split("-")[-1])
         it = DBSession.query(Item).filter(Item.id == id_item) \
             .filter(Item.version == version_item).one()
         it_actual = DBSession.query(Item).filter(Item.id == id_item) \
                 .order_by(desc(Item.version)).first()
         nueva_version = self.crear_version_sin_relaciones(it, id_item)
         ruta = './../../' + nueva_version.id + '-' + \
             unicode(nueva_version.version) + '/' + 'versiones/'
         hijos_ant = list()
         for relacion in relaciones_a_actualizadas(it_actual.relaciones_a):
             hijos_ant.append(relacion.id_item_2)
         relaciones = relaciones_a_recuperar(it.relaciones_a) + \
             relaciones_b_recuperar(it.relaciones_b)
         huerfano = True
         for relacion in relaciones:
             aux = opuesto(relacion,it)
             aux_act = DBSession.query(Item).filter(Item.id == aux.id) \
                 .order_by(desc(Item.version)).first()
             if not aux.borrado:
                 band = False
                 band_p = False
                 if aux.tipo_item.fase.orden < it.tipo_item.fase.orden:
                     item_1 = aux_act
                     item_2 = nueva_version
                     if aux.linea_base:
                         if not aux_act.borrado and \
                                 aux_act.linea_base.consistente and \
                                 aux_act.linea_base.cerrado: 
                             band = True
                             band_p = True
                 elif aux.tipo_item.fase.orden == it.tipo_item.fase.orden: 
                     if aux == relacion.item_1:
                         if aux.estado == u"Aprobado" and \
                            not aux.revisiones:
                             item_1 = aux_act
                             item_2 = nueva_version
                     else:
                         item_1 = nueva_version
                         item_2 = self.crear_version(aux_act)                                   
                     if not aux_act.borrado: band = True
                 else:
                     item_1 = nueva_version
                     item_2 = self.crear_version(aux_act)  
                     if it_actual.linea_base:
                         band = True
                 if band:
                     exito = self.crear_relacion(item_1, item_2, \
                             nueva_version)
                     if not exito:
                         msg = u"No se pudo recuperar la relación " + \
                               relacion.id
                         self.crear_revision(nueva_version, msg)
                     elif band_p: 
                         huerfano = False
                 if not band:
                     msg = u"No se pudo recuperar la relación " + relacion.id
                     self.crear_revision(nueva_version, msg)                                        
             else:
                 msg = u"No se pudo recuperar la relación " + relacion.id
                 self.crear_revision(nueva_version, msg)        
                         
         for h in hijos_ant:
                 h_act = DBSession.query(Item).filter(Item.id == h) \
                 .order_by(desc(Item.version)).first()
                 msg = u"Item huerfano"
                 if h_act.tipo_item.fase != it.tipo_item.fase:
                     if es_huerfano(h_act) and \
                        (h_act.estado == u"Aprobado" or \
                         h_act.linea_base):
                         h_act.estado = u"En desarrollo"
                         self.crear_revision(h_act, msg)                                        
             
                             
         
         if huerfano and it.tipo_item.fase.orden != 1:
             msg = u"Item huerfano"
             if nueva_version.linea_base:
                 self.crear_revision(nueva_version, msg)
         DBSession.add(nueva_version)
         transaction.commit()
         raise redirect(ruta)
     else:
         flash(u"El usuario no cuenta con los permisos necesarios", \
             u"error")
         redirect('./')            
Пример #42
0
    def put(self, *args, **kw):
        """ Registra los cambios realizados a un proyecto. """

        id_proyecto = args[0]
        proyecto_modificado = DBSession.query(Proyecto).filter(Proyecto.id == \
                            id_proyecto).one()

        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]
        usuario = None
        if kw['lider']:
            id_lider = kw['lider']
            viejo_lider_proyecto_tupla = DBSession.query(Proyecto.id_lider). \
                                       filter(Proyecto.id == id_proyecto).one()
            if viejo_lider_proyecto_tupla:
                viejo_lider_proyecto_id = viejo_lider_proyecto_tupla.id_lider
                ficha = DBSession.query(Ficha).filter(Ficha.id_proyecto == \
                      id_proyecto).filter(Ficha.id_usuario == \
                      viejo_lider_proyecto_id).filter(Ficha.id_rol == u'RL2') \
                      .scalar()
                if ficha:
                    usuario = DBSession.query(Usuario).filter(Usuario.id == \
                            id_lider).one()
                    ids_fichas = DBSession.query(Ficha.id).filter(Ficha. \
                                id_usuario == id_lider).all()
                    if ids_fichas:
                        proximo_id_ficha = proximo_id(ids_fichas)
                    else:
                        proximo_id_ficha = "FI1-" + id_lider
                    ficha.id = proximo_id_ficha
                    ficha.usuario = usuario
                    DBSession.add(ficha)
                else:
                    ids_fichas = DBSession.query(Ficha.id).filter(Ficha.\
                                id_usuario == id_lider).all()
                    rol = DBSession.query(Rol).filter(Rol.id == u'RL2').one()
                    proyecto = DBSession.query(Proyecto).filter(Proyecto.id \
                             == id_proyecto).one()
                    usuario = DBSession.query(Usuario).filter(Usuario.id == \
                             id_lider).one()
                    fi = Ficha()
                    fi.usuario = usuario
                    fi.rol = rol
                    fi.proyecto = proyecto
                    if ids_fichas:
                        proximo_id_ficha = proximo_id(ids_fichas)
                    else:
                        proximo_id_ficha = "FI1-" + id_lider
                    fi.id = proximo_id_ficha
                    DBSession.add(fi)

        else:
            viejo_lider_proyecto_tupla = DBSession.query(Proyecto.id_lider). \
                                       filter(Proyecto.id == id_proyecto).one()
            if viejo_lider_proyecto_tupla:
                viejo_lider_proyecto_id = viejo_lider_proyecto_tupla.id_lider
                ficha_lider_a_eliminar = DBSession.query(Ficha).filter \
                                        (Ficha.id_proyecto == id_proyecto). \
                                        filter(Ficha.id_usuario == \
                                        viejo_lider_proyecto_id).filter \
                                        (Ficha.id_rol == u'RL2').scalar()
                DBSession.delete(ficha_lider_a_eliminar)
        proyecto_modificado.lider = usuario
        proyecto_modificado.nombre = kw["nombre"]
        proyecto_modificado.descripcion = kw["descripcion"]
        if "nro_fases" in kw:
            proyecto_modificado.nro_fases = kw["nro_fases"]

        redirect('../')
Пример #43
0
    def put(self, *args, **kw):
        """ Registra los cambios realizados a un proyecto. """
        
        id_proyecto = args[0]
        proyecto_modificado = DBSession.query(Proyecto).filter(Proyecto.id == \
                            id_proyecto).one()
        
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(args):
                kw[pk] = args[i]
        usuario = None
        if kw['lider']:
            id_lider = kw['lider']
            viejo_lider_proyecto_tupla = DBSession.query(Proyecto.id_lider). \
                                       filter(Proyecto.id == id_proyecto).one()
            if viejo_lider_proyecto_tupla:
                viejo_lider_proyecto_id = viejo_lider_proyecto_tupla.id_lider
                ficha = DBSession.query(Ficha).filter(Ficha.id_proyecto == \
                      id_proyecto).filter(Ficha.id_usuario == \
                      viejo_lider_proyecto_id).filter(Ficha.id_rol == u'RL2') \
                      .scalar()
                if ficha:
                    usuario = DBSession.query(Usuario).filter(Usuario.id == \
                            id_lider).one()
                    ids_fichas = DBSession.query(Ficha.id).filter(Ficha. \
                                id_usuario == id_lider).all()
                    if ids_fichas:
                        proximo_id_ficha = proximo_id(ids_fichas)
                    else:
                        proximo_id_ficha = "FI1-" + id_lider
                    ficha.id = proximo_id_ficha
                    ficha.usuario = usuario
                    DBSession.add(ficha)
                else:
                    ids_fichas = DBSession.query(Ficha.id).filter(Ficha.\
                                id_usuario == id_lider).all()
                    rol = DBSession.query(Rol).filter(Rol.id == u'RL2').one()
                    proyecto = DBSession.query(Proyecto).filter(Proyecto.id \
                             == id_proyecto).one()
                    usuario = DBSession.query(Usuario).filter(Usuario.id == \
                             id_lider).one()
                    fi = Ficha()
                    fi.usuario = usuario
                    fi.rol = rol
                    fi.proyecto = proyecto
                    if ids_fichas:
                        proximo_id_ficha = proximo_id(ids_fichas)
                    else:
                        proximo_id_ficha = "FI1-" + id_lider
                    fi.id = proximo_id_ficha                      
                    DBSession.add(fi)

        else:
            viejo_lider_proyecto_tupla = DBSession.query(Proyecto.id_lider). \
                                       filter(Proyecto.id == id_proyecto).one()
            if viejo_lider_proyecto_tupla:
                viejo_lider_proyecto_id = viejo_lider_proyecto_tupla.id_lider
                ficha_lider_a_eliminar = DBSession.query(Ficha).filter \
                                        (Ficha.id_proyecto == id_proyecto). \
                                        filter(Ficha.id_usuario == \
                                        viejo_lider_proyecto_id).filter \
                                        (Ficha.id_rol == u'RL2').scalar()
                DBSession.delete(ficha_lider_a_eliminar)
        proyecto_modificado.lider = usuario
        proyecto_modificado.nombre = kw["nombre"]
        proyecto_modificado.descripcion = kw["descripcion"]
        if "nro_fases" in kw:        
            proyecto_modificado.nro_fases = kw["nro_fases"]
        
        redirect('../')
Пример #44
0
    def put(self, *args, **kw):
        """ Registra los cambios realizados a un ítem. """
        nombre_caract = DBSession.query(Caracteristica.nombre) \
                .filter(Caracteristica.id_tipo_item == kw['tipo_item']).all()      
        anexo = dict()
        for nom_car in nombre_caract:
            anexo[nom_car.nombre] = kw[nom_car.nombre]
        anexo = json.dumps(anexo)

        clave_primaria = args[0]
        pk_version = unicode(clave_primaria.split("-")[4])
        pk_id = unicode(clave_primaria.split("-")[0] + "-" + \
                clave_primaria.split("-")[1] + "-" + \
                clave_primaria.split("-")[2] + "-" + \
                clave_primaria.split("-")[3])
        clave = {}
        clave[0] = pk_id
        clave[1] = pk_version        
        it = DBSession.query(Item).filter(Item.id == pk_id).filter( \
                Item.version == pk_version).scalar()
        pks = self.provider.get_primary_fields(self.model)
        for i, pk in enumerate(pks):
            if pk not in kw and i < len(clave):
                kw[pk] = clave[i]
        band = 0
        nueva_version = Item()
        nueva_version.id = it.id
        nueva_version.codigo = it.codigo
        nueva_version.version = int(pk_version) + 1
        nueva_version.nombre = it.nombre
        nueva_version.descripcion = it.descripcion
        nueva_version.estado = u"En desarrollo"
        nueva_version.observaciones = it.observaciones
        nueva_version.prioridad = it.prioridad
        nueva_version.complejidad = it.complejidad
        nueva_version.borrado = it.borrado
        nueva_version.anexo = it.anexo
        if not it.descripcion == kw['descripcion']:
            band = 1
            nueva_version.descripcion = kw['descripcion']
        if not it.nombre == kw['nombre']:
            band = 1
            nueva_version.nombre = kw['nombre']
        if not it.observaciones == kw['observaciones']:
            band = 1
            nueva_version.observaciones = kw['observaciones']
        if not it.prioridad == int(kw['prioridad']):
            band = 1
            nueva_version.prioridad = kw['prioridad']
        if not it.complejidad == int(kw['complejidad']):
            band = 1
            nueva_version.complejidad = kw['complejidad']
        if not it.anexo == anexo:
            band = 1
            nueva_version.anexo = anexo
        
        if band:
            nueva_version.tipo_item = it.tipo_item
            nueva_version.linea_base = it.linea_base
            nueva_version.archivos = it.archivos
            nueva_version.revisiones = it.revisiones
            for relacion in relaciones_a_actualizadas(it.relaciones_a):
                aux = relacion.id.split("+")
                r = Relacion()
                r.id = "-".join(aux[0].split("-")[0:-1]) + "-" + \
                        unicode(nueva_version.version) + "+" +aux[1] 
                r.item_1 = nueva_version
                r.item_2 = relacion.item_2
            for relacion in relaciones_b_actualizadas(it.relaciones_b):
                r = Relacion()
                aux = relacion.id.split("+")
                r.id = aux[0] + "+" + "-".join(aux[1].split("-")[0:-1]) + \
                        "-" + unicode(nueva_version.version)
                r.item_1 = relacion.item_1
                r.item_2 = nueva_version
            DBSession.add(nueva_version)
            r_act = relaciones_a_actualizadas(it.relaciones_a)
            listaux = [r.item_2 for r in r_act]
            ids_items_direc_relacionados_1 = DBSession.query( \
                    Relacion.id_item_2, Relacion.version_item_2) \
                    .filter(Relacion.id_item_1 == pk_id) \
                    .filter(Relacion.version_item_1 == pk_version).all()
            for tupla_id_item_version in (ids_items_direc_relacionados_1):
                id_item = tupla_id_item_version[0]
                version_item = tupla_id_item_version[1]                
                item_revision =  DBSession.query(Item) \
                                .filter(Item.id == id_item) \
                                .filter(Item.version == version_item).one()
                if item_revision in listaux:
                    r = Revision()
                    ids_revisiones = DBSession.query(Revision.id) \
                                .filter(Revision.id_item == id_item).all()
                    if ids_revisiones:
                        proximo_id_revision = proximo_id(ids_revisiones)
                    else:
                        proximo_id_revision = "RV1-" + id_item
                    r.id = proximo_id_revision
                    r.item = item_revision
                    
                    r.descripcion = "Modificacion del item relacionado '\
                                    'directamente: " + pk_id
                    DBSession.add(r)

        else:       
            self.provider.update(self.model, params=kw)        
        redirect('../')
Пример #45
0
    def revertir(self, *args, **kw):
        """
        Revierte un ítem a una versión especificada en los parámetros.
        """
        item = DBSession.query(Item).filter(Item.id == self.id_item) \
                .filter(Item.version == self.version_item).one()
        if TienePermiso("reversionar item", id_fase = item.tipo_item.fase.id) \
                .is_met(request.environ):
            id_item = unicode("-".join(kw["item"] \
                    .split("-")[0:-1]))
            version_item = unicode(kw["item"].split("-")[-1])
            it = DBSession.query(Item).filter(Item.id == id_item) \
                .filter(Item.version == version_item).one()
            it_actual = DBSession.query(Item).filter(Item.id == id_item) \
                    .order_by(desc(Item.version)).first()
            nueva_version = self.crear_version_sin_relaciones(it, id_item)
            ruta = './../../' + nueva_version.id + '-' + \
                unicode(nueva_version.version) + '/' + 'versiones/'
            hijos_ant = list()
            for relacion in relaciones_a_actualizadas(it_actual.relaciones_a):
                hijos_ant.append(relacion.id_item_2)
            relaciones = relaciones_a_recuperar(it.relaciones_a) + \
                relaciones_b_recuperar(it.relaciones_b)
            huerfano = True
            for relacion in relaciones:
                aux = opuesto(relacion, it)
                aux_act = DBSession.query(Item).filter(Item.id == aux.id) \
                    .order_by(desc(Item.version)).first()
                if not aux.borrado:
                    band = False
                    band_p = False
                    if aux.tipo_item.fase.orden < it.tipo_item.fase.orden:
                        item_1 = aux_act
                        item_2 = nueva_version
                        if aux.linea_base:
                            if not aux_act.borrado and \
                                    aux_act.linea_base.consistente and \
                                    aux_act.linea_base.cerrado:
                                band = True
                                band_p = True
                    elif aux.tipo_item.fase.orden == it.tipo_item.fase.orden:
                        if aux == relacion.item_1:
                            if aux.estado == u"Aprobado" and \
                               not aux.revisiones:
                                item_1 = aux_act
                                item_2 = nueva_version
                        else:
                            item_1 = nueva_version
                            item_2 = self.crear_version(aux_act)
                        if not aux_act.borrado: band = True
                    else:
                        item_1 = nueva_version
                        item_2 = self.crear_version(aux_act)
                        if it_actual.linea_base:
                            band = True
                    if band:
                        exito = self.crear_relacion(item_1, item_2, \
                                nueva_version)
                        if not exito:
                            msg = u"No se pudo recuperar la relación " + \
                                  relacion.id
                            self.crear_revision(nueva_version, msg)
                        elif band_p:
                            huerfano = False
                    if not band:
                        msg = u"No se pudo recuperar la relación " + relacion.id
                        self.crear_revision(nueva_version, msg)
                else:
                    msg = u"No se pudo recuperar la relación " + relacion.id
                    self.crear_revision(nueva_version, msg)

            for h in hijos_ant:
                h_act = DBSession.query(Item).filter(Item.id == h) \
                .order_by(desc(Item.version)).first()
                msg = u"Item huerfano"
                if h_act.tipo_item.fase != it.tipo_item.fase:
                    if es_huerfano(h_act) and \
                       (h_act.estado == u"Aprobado" or \
                        h_act.linea_base):
                        h_act.estado = u"En desarrollo"
                        self.crear_revision(h_act, msg)

            if huerfano and it.tipo_item.fase.orden != 1:
                msg = u"Item huerfano"
                if nueva_version.linea_base:
                    self.crear_revision(nueva_version, msg)
            DBSession.add(nueva_version)
            transaction.commit()
            raise redirect(ruta)
        else:
            flash(u"El usuario no cuenta con los permisos necesarios", \
                u"error")
            redirect('./')