def _do_get_provider_count_and_objs(self, buscado = "", **kw):
        """ Se utiliza para listar las fases que cumplan ciertas condiciones y
            ciertos permisos.
        """
        id_proyecto = unicode(request.url.split("/")[-3])
        if TieneAlgunPermiso(tipo = u"Fase", recurso = u"Item", id_proyecto = \
                            id_proyecto):
            fases = DBSession.query(Fase).filter(Fase.id_proyecto == \
                    id_proyecto).order_by(Fase.orden).all()

            for fase in reversed(fases):
                buscado = self.buscado in fase.nombre or \
                          self.buscado in fase.descripcion or \
                          self.buscado in str(fase.orden) or \
                          self.buscado in str(fase.fecha_inicio) or \
                          self.buscado in str(fase.fecha_fin) or \
                          self.buscado in fase.estado

                if not buscado: fases.remove(fase)  
            for fase in reversed(fases):
                if not TieneAlgunPermiso(tipo = u"Fase", recurso = u"Item", \
                                    id_fase = fase.id).is_met(request.environ):
                    fases.remove(fase)
                elif fase.orden > 1:
                    fase_prev = DBSession.query(Fase).filter(Fase.id_proyecto \
                            == id_proyecto).filter(Fase.orden == \
                            fase.orden - 1).one()
                    if not fase_prev.lineas_base: fases.remove(fase)
        else: fases = list()
        return len(fases), fases
Beispiel #2
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('./')
Beispiel #3
0
 def post_delete(self, *args, **kw):
     """ Elimina un item."""
     pks = self.provider.get_primary_fields(self.model)
     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])
     it = DBSession.query(Item).filter(Item.id == pk_id) \
             .filter(Item.version == pk_version).scalar()
     self.crear_version(it, None , True)
     items = DBSession.query(Item).filter(Item.id == pk_id).all()
     for item in items:
         item.borrado = True
         item.linea_base = None
     re = it.relaciones_a
     re_act = relaciones_a_actualizadas(re)
     if re:
         for relacion in re:
             if relacion in re_act:
                 nueva_version = self.crear_version(relacion.item_2, \
                                 relacion)            
                 if es_huerfano(nueva_version) and \
                     (nueva_version.estado == u"Aprobado" \
                     or nueva_version.linea_base):
                         msg = u"Item huerfano"
                         nueva_version.estado = u"En desarrollo"
                         self.crear_revision(nueva_version, msg)
                         if nueva_version.linea_base: 
                             consistencia_lb(nueva_version.linea_base)                
     redirect('./')
Beispiel #4
0
 def post_delete(self, *args, **kw):
     """ Elimina un item."""
     pks = self.provider.get_primary_fields(self.model)
     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])
     it = DBSession.query(Item).filter(Item.id == pk_id) \
             .filter(Item.version == pk_version).scalar()
     self.crear_version(it, None, True)
     items = DBSession.query(Item).filter(Item.id == pk_id).all()
     for item in items:
         item.borrado = True
         item.linea_base = None
     re = it.relaciones_a
     re_act = relaciones_a_actualizadas(re)
     if re:
         for relacion in re:
             if relacion in re_act:
                 nueva_version = self.crear_version(relacion.item_2, \
                                 relacion)
                 if es_huerfano(nueva_version) and \
                     (nueva_version.estado == u"Aprobado" \
                     or nueva_version.linea_base):
                     msg = u"Item huerfano"
                     nueva_version.estado = u"En desarrollo"
                     self.crear_revision(nueva_version, msg)
                     if nueva_version.linea_base:
                         consistencia_lb(nueva_version.linea_base)
     redirect('./')
Beispiel #5
0
 def __actions__(self, obj):
     """ Define las acciones posibles para cada relación.
     """
     primary_fields = self.__provider__.get_primary_fields(self.__entity__)
     pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
     value = '<div>'
     relacion = DBSession.query(Relacion).get(pklist)
     item = DBSession.query(Item).filter(Item.id == self.id_item).filter( \
             Item.version == self.version_item).one()
     bloqueado = False
     if item.linea_base:
         if item.linea_base.cerrado: bloqueado = True
     if TienePermiso("eliminar relaciones", id_fase = item.tipo_item.fase \
                     .id).is_met(request.environ) and not bloqueado and \
                     relacion.item_2 == item:
         value = value + '<div>'\
           '<form method="POST" action="'+pklist+'" class="button-to">'\
         '<input type="hidden" name="_method" value="DELETE" />'\
         '<input class="delete-button" onclick="return confirm' \
         '(\'¿Está seguro?\');" value="delete" type="submit" '\
         'style="background-color: transparent; float:left; border:0;' \
         ' color: #286571; display: inline; margin: 0; padding: 0;"/>'\
         '</form>'\
         '</div>'
     value = value + '</div>'
     return value
Beispiel #6
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('./../../../../..')
Beispiel #7
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('./')
Beispiel #8
0
 def _do_get_provider_count_and_objs(self, buscado = "", **kw):
     """
     Se utiliza para listar solo las fichas que cumplan ciertas
     condiciones y de acuerdo a ciertos permisos.
     """
     if self.id_fase == "":
         fichas = DBSession.query(Ficha) \
                 .filter(Ficha.id.contains(self.buscado)).all()    
     else:
         id_proyecto = self.id_fase.split("-")[1]
         permiso_asignar_rol_fase = TienePermiso("asignar rol fase", \
                     id_fase = self.id_fase).is_met(request.environ)
         permiso_asignar_rol_cualquier_fase = TienePermiso( \
                 "asignar rol cualquier fase", id_proyecto = \
                 id_proyecto).is_met(request.environ)
         if permiso_asignar_rol_fase or permiso_asignar_rol_cualquier_fase:
             fichas = DBSession.query(Ficha).filter(Ficha.id_fase == \
             self.id_fase).all()
             for ficha in reversed(fichas):
                 if ficha.rol.tipo != u"Fase": 
                     fichas.remove(ficha)
                 elif not (self.buscado in ficha.usuario.nombre_usuario or \
                     self.buscado in ficha.rol.nombre or self.buscado in \
                     ficha.id or self.buscado in ficha.proyecto.nombre or \
                     self.buscado in ficha.fase.nombre): fichas.remove(ficha)
                 
         else: fichas = list()
     return len(fichas), fichas 
Beispiel #9
0
    def buscar(self, **kw):
        """ Lista las relaciones de acuerdo a un criterio de búsqueda
            introducido por el usuario.
        """
        buscar_table_filler = RelacionTableFiller(DBSession)
        item = DBSession.query(Item).filter(Item.id == self.id_item) \
            .filter(Item.version == self.version_item).one()
        buscar_table_filler = RelacionTableFiller(DBSession)
        if "parametro" in kw:
            buscar_table_filler.init(kw["parametro"], self.id_item, \
                    self.version_item)
        else:
            buscar_table_filler.init("", self.id_item, self.version_item)
        tmpl_context.widget = self.table
        value = buscar_table_filler.get_value()
        d = dict(value_list = value, model = "Relaciones", accion = "./buscar")
        d["fases"] = list()
        lista = [x.id_item_2 for x in item.relaciones_a] + \
                [x.id_item_1 for x in item.relaciones_b]
        fase_actual = DBSession.query(Fase).filter(Fase.id == \
                item.tipo_item.id_fase).one()
        band = False
        ts_item = [t for t in fase_actual.tipos_item]
        items = list()
        for t_item in ts_item:
            items = items + t_item.items
        for it in reversed(items):
            if it.borrado: items.remove(it) 
        for it in items:
            if it.id not in lista and it.id != self.id_item and \
               it.estado == u"Aprobado" and not it.revisiones:
                band = True
                break
        if band: d["fases"].append(fase_actual)
        fase_ant = DBSession.query(Fase).filter(Fase.id_proyecto == \
                item.tipo_item.fase.id_proyecto).filter(Fase.orden == \
                item.tipo_item.fase.orden - 1).first()
        if fase_ant:
            band = False
            ts_item = [t for t in fase_ant.tipos_item]
            items = list()
            for t_item in ts_item:
                items = items + t_item.items
            for it in reversed(items):
	            if it.borrado: items.remove(it) 
            for it in items:
                if it.id not in lista and it.linea_base:
                    if it.linea_base.cerrado and it.linea_base.consistente:
                        band = True
                        break
            if band: d["fases"].append(fase_ant)        
        bloqueado = False
        if item.linea_base:
            if item.linea_base.cerrado: bloqueado = True
        if d["fases"]:
            d["permiso_crear"] = TienePermiso("crear relaciones", id_fase = \
                    fase_actual.id).is_met(request.environ) and not bloqueado
        else: d["permiso_crear"] = False
        d["direccion_anterior"] = "../.."        
        return d
Beispiel #10
0
 def __actions__(self, obj):
     """ Define las acciones posibles para cada relación.
     """
     primary_fields = self.__provider__.get_primary_fields(self.__entity__)
     pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
     value = '<div>'
     relacion = DBSession.query(Relacion).get(pklist)
     item = DBSession.query(Item).filter(Item.id == self.id_item).filter( \
             Item.version == self.version_item).one()
     bloqueado = False
     if item.linea_base:
         if item.linea_base.cerrado: bloqueado = True
     if TienePermiso("eliminar relaciones", id_fase = item.tipo_item.fase \
                     .id).is_met(request.environ) and not bloqueado and \
                     relacion.item_2 == item:
         value = value + '<div>'\
           '<form method="POST" action="'+pklist+'" class="button-to">'\
         '<input type="hidden" name="_method" value="DELETE" />'\
         '<input class="delete-button" onclick="return confirm' \
         '(\'¿Está seguro?\');" value="delete" type="submit" '\
         'style="background-color: transparent; float:left; border:0;' \
         ' color: #286571; display: inline; margin: 0; padding: 0;"/>'\
         '</form>'\
         '</div>'
     value = value + '</div>'
     return value
 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)
Beispiel #12
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)
Beispiel #13
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('./')
Beispiel #14
0
    def buscar(self, **kw):
        """ Lista las fases de acuerdo a un criterio de búsqueda introducido
            por el usuario.
        """
        buscar_table_filler = FaseTableFiller(DBSession)
        if "parametro" in kw:
            buscar_table_filler.init(kw["parametro"], self.id_proyecto)
        else:
            buscar_table_filler.init("", self.id_proyecto)
        tmpl_context.widget = self.table
        value = buscar_table_filler.get_value()
        d = dict(value_list = value, model = "fase", accion = "./buscar")

        cant_fases = DBSession.query(Fase).filter(Fase.id_proyecto == \
                    self.id_proyecto).count()
        otroproyecto = DBSession.query(Proyecto).filter(Proyecto.id != \
                       self.id_proyecto).filter(Proyecto.fases != None).count()
        if cant_fases < DBSession.query(Proyecto.nro_fases).filter( \
                        Proyecto.id == self.id_proyecto).scalar():
            d["suficiente"] = True
        else:
            d["suficiente"] = False
        d["model"] = "Fases"
        d["permiso_crear"] = TienePermiso("crear fase", id_proyecto = \
                            self.id_proyecto).is_met(request.environ)
        d["permiso_importar"] = TienePermiso("importar fase", id_proyecto = \
                    self.id_proyecto).is_met(request.environ) and otroproyecto
        d["direccion_anterior"] = "../.."
        return d
Beispiel #15
0
    def update_params(self, d):
        """ @param d: diccionario con las opciones posibles de ítems.
            @return: d con los valores correctos de ítems posibles.
        """
        super(ItemsField, self).update_params(d)
        id_fase = unicode(request.url.split("/")[-3])
        ids_tipos_item = DBSession.query(TipoItem.id).filter(TipoItem.id_fase == id_fase)
        items = (
            DBSession.query(Item)
            .filter(Item.id_tipo_item.in_(ids_tipos_item))
            .filter(Item.id_linea_base == None)
            .filter(Item.borrado == False)
            .filter(Item.revisiones == None)
            .all()
        )

        items_a_mostrar = UnificarItem(items)
        aux = list()
        for item in reversed(items_a_mostrar):
            if item.estado != u"Aprobado" or es_huerfano(item):
                items_a_mostrar.remove(item)
        for item in items_a_mostrar:
            aux.append(item.id + "/" + str(item.version))
        lista = [x for x in d["options"] if x[0] in aux]
        d["options"] = lista
Beispiel #16
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('./')
    def _do_get_provider_count_and_objs(self, buscado="", **kw):
        """ Se utiliza para listar las fases que cumplan ciertas condiciones y
            ciertos permisos.
        """
        id_proyecto = unicode(request.url.split("/")[-3])
        if TieneAlgunPermiso(tipo = u"Fase", recurso = u"Item", id_proyecto = \
                            id_proyecto):
            fases = DBSession.query(Fase).filter(Fase.id_proyecto == \
                    id_proyecto).order_by(Fase.orden).all()

            for fase in reversed(fases):
                buscado = self.buscado in fase.nombre or \
                          self.buscado in fase.descripcion or \
                          self.buscado in str(fase.orden) or \
                          self.buscado in str(fase.fecha_inicio) or \
                          self.buscado in str(fase.fecha_fin) or \
                          self.buscado in fase.estado

                if not buscado: fases.remove(fase)
            for fase in reversed(fases):
                if not TieneAlgunPermiso(tipo = u"Fase", recurso = u"Item", \
                                    id_fase = fase.id).is_met(request.environ):
                    fases.remove(fase)
                elif fase.orden > 1:
                    fase_prev = DBSession.query(Fase).filter(Fase.id_proyecto \
                            == id_proyecto).filter(Fase.orden == \
                            fase.orden - 1).one()
                    if not fase_prev.lineas_base: fases.remove(fase)
        else: fases = list()
        return len(fases), fases
Beispiel #18
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('./../../../../..')
Beispiel #19
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)
Beispiel #20
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/')
Beispiel #21
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)
Beispiel #22
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/')
Beispiel #23
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)
 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('./../../../../../../..')
Beispiel #25
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('./')
Beispiel #26
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('./')
Beispiel #27
0
 def get_all(self, *args, **kw):
     """Lista las relaciones de acuerdo a lo establecido en
        L{relacion_controller.RelacionTableFiller._do_get_provider_count_and_objs}.
     """
     relacion_table_filler.init("", self.id_item, self.version_item)
     d = super(RelacionController, self).get_all(*args, **kw)
     item = DBSession.query(Item).filter(Item.id == self.id_item) \
         .filter(Item.version == self.version_item).one()
     d["accion"] = "./buscar"
     d["fases"] = list()
     d["model"] = "Relaciones"
     lista = [x.id_item_2 for x in item.relaciones_a] + \
             [x.id_item_1 for x in item.relaciones_b]
     fase_actual = DBSession.query(Fase).filter(Fase.id == \
             item.tipo_item.id_fase).one()
     band = False
     ts_item = [t for t in fase_actual.tipos_item]
     items = list()
     for t_item in ts_item:
         items = items + t_item.items
     for it in reversed(items):
         if it.borrado: items.remove(it)
     for it in items:
         if it.id not in lista and it.id != self.id_item and \
            it.estado == u"Aprobado" and not it.revisiones:
             band = True
             break
     if band: d["fases"].append(fase_actual)
     fase_ant = DBSession.query(Fase).filter(Fase.id_proyecto == \
             item.tipo_item.fase.id_proyecto).filter(Fase.orden == \
             item.tipo_item.fase.orden - 1).first()
     if fase_ant:
         band = False
         ts_item = [t for t in fase_ant.tipos_item]
         items = list()
         for t_item in ts_item:
             items = items + t_item.items
         for it in reversed(items):
             if it.borrado: items.remove(it)
         for it in items:
             if it.id not in lista and it.linea_base:
                 if it.linea_base.cerrado and it.linea_base.consistente:
                     band = True
                     break
         if band: d["fases"].append(fase_ant)
     bloqueado = False
     if item.linea_base:
         if item.linea_base.cerrado: bloqueado = True
     if d["fases"]:
         d["permiso_crear"] = TienePermiso("crear relaciones", id_fase = \
                 fase_actual.id).is_met(request.environ) and not bloqueado
     else:
         d["permiso_crear"] = False
     d["direccion_anterior"] = "../.."
     return d
Beispiel #28
0
    def get_all(self, *args, **kw):
        """Lista las relaciones de acuerdo a lo establecido en
           L{relacion_controller.RelacionTableFiller._do_get_provider_count_and_objs}.
        """
        relacion_table_filler.init("", self.id_item, self.version_item)   
        d = super(RelacionController, self).get_all(*args, **kw)
        item = DBSession.query(Item).filter(Item.id == self.id_item) \
            .filter(Item.version == self.version_item).one()
        d["accion"] = "./buscar"
        d["fases"] = list()
        d["model"] = "Relaciones"
        lista = [x.id_item_2 for x in item.relaciones_a] + \
                [x.id_item_1 for x in item.relaciones_b]
        fase_actual = DBSession.query(Fase).filter(Fase.id == \
                item.tipo_item.id_fase).one()
        band = False
        ts_item = [t for t in fase_actual.tipos_item]
        items = list()
        for t_item in ts_item:
            items = items + t_item.items
        for it in reversed(items):
            if it.borrado: items.remove(it) 
        for it in items:
            if it.id not in lista and it.id != self.id_item and \
               it.estado == u"Aprobado" and not it.revisiones:
                band = True
                break
        if band: d["fases"].append(fase_actual)
        fase_ant = DBSession.query(Fase).filter(Fase.id_proyecto == \
                item.tipo_item.fase.id_proyecto).filter(Fase.orden == \
                item.tipo_item.fase.orden - 1).first()
        if fase_ant:
            band = False
            ts_item = [t for t in fase_ant.tipos_item]
            items = list()
            for t_item in ts_item:
                items = items + t_item.items
            for it in reversed(items):
	            if it.borrado: items.remove(it) 
            for it in items:
                if it.id not in lista and it.linea_base:
                    if it.linea_base.cerrado and it.linea_base.consistente:
                        band = True
                        break
            if band: d["fases"].append(fase_ant)
        bloqueado = False
        if item.linea_base:
            if item.linea_base.cerrado: bloqueado = True
        if d["fases"]:
            d["permiso_crear"] = TienePermiso("crear relaciones", id_fase = \
                    fase_actual.id).is_met(request.environ) and not bloqueado
        else: d["permiso_crear"] = False
        d["direccion_anterior"] = "../.."
        return d
Beispiel #29
0
 def _do_get_provider_count_and_objs(self, buscado="", id_item = "", \
                                     version = "", **kw):
     """ Se utiliza para listar los archivos que cumplan ciertas condiciones
         y ciertos permisos.
     """
     archivos = DBSession.query(Archivo).filter(or_(Archivo.id.contains( \
                self.buscado), Archivo.nombre.contains(self.buscado))).all()
     item = DBSession.query(Item).filter(Item.id == self.id_item) \
             .filter(Item.version == self.version).one()
     for archivo in reversed(archivos):
         if item not in archivo.items: archivos.remove(archivo)
     return len(archivos), archivos
Beispiel #30
0
 def _do_get_provider_count_and_objs(self, buscado="", id_item = "", \
                                     version = "", **kw):
     """ Se utiliza para listar los archivos que cumplan ciertas condiciones
         y ciertos permisos.
     """
     archivos = DBSession.query(Archivo).filter(or_(Archivo.id.contains( \
                self.buscado), Archivo.nombre.contains(self.buscado))).all()
     item = DBSession.query(Item).filter(Item.id == self.id_item) \
             .filter(Item.version == self.version).one()
     for archivo in reversed(archivos):
         if item not in archivo.items: archivos.remove(archivo)
     return len(archivos), archivos 
Beispiel #31
0
    def __actions__(self, obj):
        """ Define las acciones posibles para cada línea base.
        """
        primary_fields = self.__provider__.get_primary_fields(self.__entity__)
        pklist = "/".join(map(lambda x: str(getattr(obj, x)), primary_fields))
        value = "<div>"
        id_proyecto = pklist.split("-")[2]
        linea_base = DBSession.query(LineaBase).filter(LineaBase.id == pklist).one()
        items = DBSession.query(Item).filter(Item.id_linea_base == pklist).all()
        items_a_mostrar = UnificarItem(items)
        cant_items = len(items_a_mostrar)
        consistencia_lb(linea_base)
        fase = DBSession.query(Fase).filter(Fase.id == self.id_fase).one()
        estado_fase(fase)
        if linea_base.cerrado:
            if TienePermiso("abrir linea base", id_proyecto=id_proyecto, id_fase=self.id_fase).is_met(request.environ):
                value = (
                    value + '<div><a class="abrir_link" '
                    'href="abrir?pk_linea_base=' + pklist + '" '
                    'style="text-decoration:none" TITLE = "Abrir"></a></div>'
                )

        if not linea_base.cerrado:
            if (
                TienePermiso("separar linea base", id_proyecto=id_proyecto, id_fase=self.id_fase).is_met(
                    request.environ
                )
                and cant_items > 1
            ):
                value = (
                    value + '<div><a class="dividir_link" href='
                    '"dividir?pk_linea_base=' + pklist + '" style="text-decoration:'
                    'none" TITLE = "Dividir"></a></div>'
                )

            if linea_base.consistente:
                if TienePermiso("cerrar linea base", id_proyecto=id_proyecto, id_fase=self.id_fase).is_met(
                    request.environ
                ):
                    value = (
                        value + '<div><a class="cerrar_link" href='
                        '"cerrar?pk_linea_base=' + pklist + '" style="text-'
                        'decoration:none" TITLE = "Cerrar"></a></div>'
                    )
        if cant_items >= 1:
            value = (
                value + '<div><a class="item_link" href='
                '"' + pklist + '/items" style="text-decoration:'
                'none" TITLE = "Listar Items"></a></div>'
            )
        value = value + "</div>"
        return value
Beispiel #32
0
    def __actions__(self, obj):
        """
        Define las acciones posibles para cada proyecto.
        """
        primary_fields = self.__provider__.get_primary_fields(self.__entity__)
        pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
        value = '<div>'
        if TienePermiso("modificar proyecto").is_met(request.environ):
            value = value + '<div><a class="edit_link" href="'+pklist+ \
                '/edit" style="text-decoration:none" TITLE= "Modificar"></a>'\
                '</div>'
        pp = TieneAlgunPermiso(tipo = u"Proyecto", recurso = u"Fase", \
                id_proyecto = pklist).is_met(request.environ)
        pf = TieneAlgunPermiso(tipo = u"Fase", recurso = u"Tipo de Item", \
                id_proyecto = pklist).is_met(request.environ)
        pfp = TienePermiso(u"asignar rol cualquier fase", \
              id_proyecto = pklist).is_met(request.environ)
        pfi = TieneAlgunPermiso(tipo = "Fase", recurso = u"Ficha", \
              id_proyecto = pklist).is_met(request.environ)
        if pp or pf or pfp or pfi: 
            value = value + '<div><a class="fase_link" href="'+pklist+ \
                    '/fases" style="text-decoration:none" TITLE= "Fases"></a>'\
                    '</div>'
        if TienePermiso("asignar rol proyecto", id_proyecto = pklist).is_met( \
                        request.environ):
            value = value + '<div><a class="responsable_link" href="'+pklist+ \
                    '/responsables" style="text-decoration:none" '\
                    'TITLE= "Responsables"></a>'\
                    '</div>'
        if TienePermiso("eliminar proyecto").is_met(request.environ):
            value = value + '<div><form method="POST" action="'+pklist+ \
                    '" class="button-to" TITLE= "Eliminar">'\
                    '<input type="hidden" name="_method" value="DELETE" />'\
                    '<input class="delete-button" onclick="return confirm' \
                    '(\'¿Está seguro?\');" value="delete" type="submit" '\
                    'style="background-color: transparent; float:left; '\
                    'border:0; color: #286571; display: inline; margin: 0; '\
                    'padding: 0;"/>'\
                    '</form></div>'
        pr = DBSession.query(Proyecto).get(pklist)
        estado_proyecto(pr)
        cant_fases = DBSession.query(Fase).filter(Fase.id_proyecto == pklist) \
                    .count()
        if cant_fases == pr.nro_fases and pr.estado == u"Nuevo" and \
            TienePermiso("setear estado proyecto en desarrollo"). \
            is_met(request.environ):
            value = value + '<div><a class="inicio_link" href="iniciar/' \
                    +pklist+'" style="text-decoration:none">Inicia proyecto' \
                    '</a></div>'        

        value = value + '</div>'
        return value
Beispiel #33
0
    def __actions__(self, obj):
        """
        Define las acciones posibles para cada proyecto.
        """
        primary_fields = self.__provider__.get_primary_fields(self.__entity__)
        pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
        value = '<div>'
        if TienePermiso("modificar proyecto").is_met(request.environ):
            value = value + '<div><a class="edit_link" href="'+pklist+ \
                '/edit" style="text-decoration:none" TITLE= "Modificar"></a>'\
                '</div>'
        pp = TieneAlgunPermiso(tipo = u"Proyecto", recurso = u"Fase", \
                id_proyecto = pklist).is_met(request.environ)
        pf = TieneAlgunPermiso(tipo = u"Fase", recurso = u"Tipo de Item", \
                id_proyecto = pklist).is_met(request.environ)
        pfp = TienePermiso(u"asignar rol cualquier fase", \
              id_proyecto = pklist).is_met(request.environ)
        pfi = TieneAlgunPermiso(tipo = "Fase", recurso = u"Ficha", \
              id_proyecto = pklist).is_met(request.environ)
        if pp or pf or pfp or pfi:
            value = value + '<div><a class="fase_link" href="'+pklist+ \
                    '/fases" style="text-decoration:none" TITLE= "Fases"></a>'\
                    '</div>'
        if TienePermiso("asignar rol proyecto", id_proyecto = pklist).is_met( \
                        request.environ):
            value = value + '<div><a class="responsable_link" href="'+pklist+ \
                    '/responsables" style="text-decoration:none" '\
                    'TITLE= "Responsables"></a>'\
                    '</div>'
        if TienePermiso("eliminar proyecto").is_met(request.environ):
            value = value + '<div><form method="POST" action="'+pklist+ \
                    '" class="button-to" TITLE= "Eliminar">'\
                    '<input type="hidden" name="_method" value="DELETE" />'\
                    '<input class="delete-button" onclick="return confirm' \
                    '(\'¿Está seguro?\');" value="delete" type="submit" '\
                    'style="background-color: transparent; float:left; '\
                    'border:0; color: #286571; display: inline; margin: 0; '\
                    'padding: 0;"/>'\
                    '</form></div>'
        pr = DBSession.query(Proyecto).get(pklist)
        estado_proyecto(pr)
        cant_fases = DBSession.query(Fase).filter(Fase.id_proyecto == pklist) \
                    .count()
        if cant_fases == pr.nro_fases and pr.estado == u"Nuevo" and \
            TienePermiso("setear estado proyecto en desarrollo"). \
            is_met(request.environ):
            value = value + '<div><a class="inicio_link" href="iniciar/' \
                    +pklist+'" style="text-decoration:none">Inicia proyecto' \
                    '</a></div>'

        value = value + '</div>'
        return value
Beispiel #34
0
 def buscar(self, **kw):
     """ Lista las relaciones de acuerdo a un criterio de búsqueda
         introducido por el usuario.
     """
     buscar_table_filler = RelacionTableFiller(DBSession)
     item = DBSession.query(Item).filter(Item.id == self.id_item) \
         .filter(Item.version == self.version_item).one()
     buscar_table_filler = RelacionTableFiller(DBSession)
     if "parametro" in kw:
         buscar_table_filler.init(kw["parametro"], self.id_item, \
                 self.version_item)
     else:
         buscar_table_filler.init("", self.id_item, self.version_item)
     tmpl_context.widget = self.table
     value = buscar_table_filler.get_value()
     d = dict(value_list=value, model="Relaciones", accion="./buscar")
     d["fases"] = list()
     lista = [x.id_item_2 for x in item.relaciones_a] + \
             [x.id_item_1 for x in item.relaciones_b]
     fase_actual = DBSession.query(Fase).filter(Fase.id == \
             item.tipo_item.id_fase).one()
     band = False
     ts_item = [t for t in fase_actual.tipos_item]
     items = list()
     for t_item in ts_item:
         items = items + t_item.items
     for it in items:
         if it.id not in lista and it.id != self.id_item:
             band = True
             break
     if band: d["fases"].append(fase_actual)
     fase_ant = DBSession.query(Fase).filter(Fase.id_proyecto == \
             item.tipo_item.fase.id_proyecto) \
             .filter(Fase.orden == item.tipo_item.fase.orden - 1).first()
     if fase_ant:
         band = False
         ts_item = [t for t in fase_ant.tipos_item]
         items = list()
         for t_item in ts_item:
             items = items + t_item.items
         for it in items:
             if it.id not in lista and it.linea_base:
                 if it.linea_base.cerrado and it.linea_base.consistente:
                     band = True
                     break
         if band: d["fases"].append(fase_ant)
     bloqueado = False
     if item.linea_base:
         if item.linea_base.cerrado: bloqueado = True
     d["direccion_anterior"] = "../.."
     return d
 def _do_get_provider_count_and_objs(self, buscado = "", **kw):
     """ Se utiliza para listar las fichas que cumplan ciertas condiciones y
         ciertos permisos.
     """
     if self.id_usuario == "":
         fichas = DBSession.query(Ficha).all()    
     elif TieneAlgunPermiso(tipo = u"Sistema", recurso = u"Usuario"):            
         fichas = DBSession.query(Ficha).filter(Ficha.id_usuario == \
             self.id_usuario).all()
         for ficha in reversed(fichas):
             if not (self.buscado in ficha.usuario.nombre_usuario or \
                     self.buscado in ficha.rol.nombre or self.buscado in \
                     ficha.id): fichas.remove(ficha)
     return len(fichas), fichas 
Beispiel #36
0
    def _do_get_provider_count_and_objs(self, buscado="", **kw):
        """
        Se utiliza para listar solo los proyectos que cumplan ciertas
        condiciones y de acuerdo a ciertos permisos.
        """
        self.opcion = unicode(request.url.split("/")[-3])
        if self.opcion == unicode("tipo_item"):
            self.id_fase = unicode(request.url.split("/")[-4])
            if TienePermiso("importar tipo de item", id_fase=self.id_fase):
                proyectos = DBSession.query(Proyecto).join(Proyecto.fases) \
                        .filter(Proyecto.fases != None).order_by(Proyecto.id) \
                        .all()
                for proyecto in reversed(proyectos):
                    buscado = self.buscado in str(proyecto.nro_fases) or \
                              self.buscado in str(proyecto.fecha_inicio) or \
                              self.buscado in str(proyecto.fecha_fin) or \
                              self.buscado in proyecto.lider.nombre_usuario or \
                              self.buscado in proyecto.nombre or \
                              self.buscado in proyecto.descripcion or \
                              self.buscado in proyecto.estado
                    if not buscado: proyectos.remove(proyecto)

                for proyecto in reversed(proyectos):
                    band = True
                    for fase in proyecto.fases:
                        if len(fase.tipos_item) > 1 and \
                            fase.id != self.id_fase:
                            band = False
                    if band: proyectos.remove(proyecto)
            else:
                proyectos = list()
        else:
            self.id_proyecto = unicode(request.url.split("/")[-4])
            if TienePermiso("importar fase", id_proyecto=self.id):
                proyectos = DBSession.query(Proyecto).filter(Proyecto.id != \
                    self.id_proyecto).filter(Proyecto.fases != \
                    None).order_by(Proyecto.id).all()
                for proyecto in reversed(proyectos):
                    buscado = self.buscado in str(proyecto.nro_fases) or \
                      self.buscado in str(proyecto.fecha_inicio) or \
                      self.buscado in str(proyecto.fecha_fin) or \
                      self.buscado in proyecto.lider.nombre_usuario or \
                      self.buscado in proyecto.nombre or \
                      self.buscado in proyecto.descripcion or \
                      self.buscado in proyecto.estado
                    if not buscado: proyectos.remove(proyecto)

            else:
                proyectos = list()
        return len(proyectos), proyectos
Beispiel #37
0
 def update_params(self, d):
     super(PermisosField, self).update_params(d)
     id_rol = unicode(request.url.split("/")[-2])
     rol = DBSession.query(Rol).filter(Rol.id == id_rol).one()
     permisos_tipo = DBSession.query(Permiso.id).filter(Permiso.tipo == \
             rol.tipo).all()  
     id_permisos_tipo = list()
     for permiso in permisos_tipo: id_permisos_tipo.append(permiso[0])
     a_eliminar = list()
     for permiso in d['options']:
             if not permiso[0] in id_permisos_tipo:
                 a_eliminar.append(permiso)
     for elemento in a_eliminar:
         d['options'].remove(elemento)
Beispiel #38
0
    def _do_get_provider_count_and_objs(self, buscado = "", **kw):
        """
        Se utiliza para listar solo los proyectos que cumplan ciertas
        condiciones y de acuerdo a ciertos permisos.
        """
        self.opcion = unicode(request.url.split("/")[-3])
        if self.opcion == unicode("tipo_item"):
            self.id_fase = unicode(request.url.split("/")[-4])
            if TienePermiso("importar tipo de item", id_fase = self.id_fase):
                proyectos = DBSession.query(Proyecto).join(Proyecto.fases) \
                        .filter(Proyecto.fases != None).order_by(Proyecto.id) \
                        .all()
                for proyecto in reversed(proyectos):
                    buscado = self.buscado in str(proyecto.nro_fases) or \
                              self.buscado in str(proyecto.fecha_inicio) or \
                              self.buscado in str(proyecto.fecha_fin) or \
                              self.buscado in proyecto.lider.nombre_usuario or \
                              self.buscado in proyecto.nombre or \
                              self.buscado in proyecto.descripcion or \
                              self.buscado in proyecto.estado
                    if not buscado: proyectos.remove(proyecto)

                for proyecto in reversed(proyectos):
                    band = True
                    for fase in proyecto.fases:
                        if len(fase.tipos_item) > 1 and \
                            fase.id != self.id_fase: band = False
                    if band: proyectos.remove(proyecto)
            else:
                proyectos = list()
        else:
            self.id_proyecto = unicode(request.url.split("/")[-4])
            if TienePermiso("importar fase", id_proyecto = self.id):
                proyectos = DBSession.query(Proyecto).filter(Proyecto.id != \
                    self.id_proyecto).filter(Proyecto.fases != \
                    None).order_by(Proyecto.id).all()
                for proyecto in reversed(proyectos):
                    buscado = self.buscado in str(proyecto.nro_fases) or \
                      self.buscado in str(proyecto.fecha_inicio) or \
                      self.buscado in str(proyecto.fecha_fin) or \
                      self.buscado in proyecto.lider.nombre_usuario or \
                      self.buscado in proyecto.nombre or \
                      self.buscado in proyecto.descripcion or \
                      self.buscado in proyecto.estado
                    if not buscado: proyectos.remove(proyecto)

            else:
                proyectos = list()
        return len(proyectos), proyectos 
Beispiel #39
0
 def update_params(self, d):
     super(PermisosField, self).update_params(d)
     id_rol = unicode(request.url.split("/")[-2])
     rol = DBSession.query(Rol).filter(Rol.id == id_rol).one()
     permisos_tipo = DBSession.query(Permiso.id).filter(Permiso.tipo == \
             rol.tipo).all()
     id_permisos_tipo = list()
     for permiso in permisos_tipo:
         id_permisos_tipo.append(permiso[0])
     a_eliminar = list()
     for permiso in d['options']:
         if not permiso[0] in id_permisos_tipo:
             a_eliminar.append(permiso)
     for elemento in a_eliminar:
         d['options'].remove(elemento)
Beispiel #40
0
 def obtener_orden(self, id_proyecto):
     """Obtiene los órdenes posibles para la fase que se importa.
     """
     cantidad_fases = DBSession.query(Proyecto.nro_fases) \
                 .filter(Proyecto.id == id_proyecto).scalar()
     ordenes = DBSession.query(Fase.orden).filter(Fase.id_proyecto == \
             id_proyecto).order_by(Fase.orden).all()
     vec = list()
     list_ordenes = list()
     for elem in ordenes:
         list_ordenes.append(elem.orden)
     for elem in xrange(cantidad_fases):
         if not (elem + 1) in list_ordenes:
             vec.append(elem + 1)
     return vec[0]
 def _do_get_provider_count_and_objs(self, buscado="", **kw):
     """ Se utiliza para listar las fichas que cumplan ciertas condiciones y
         ciertos permisos.
     """
     if self.id_usuario == "":
         fichas = DBSession.query(Ficha).all()
     elif TieneAlgunPermiso(tipo=u"Sistema", recurso=u"Usuario"):
         fichas = DBSession.query(Ficha).filter(Ficha.id_usuario == \
             self.id_usuario).all()
         for ficha in reversed(fichas):
             if not (self.buscado in ficha.usuario.nombre_usuario or \
                     self.buscado in ficha.rol.nombre or self.buscado in \
                     ficha.id):
                 fichas.remove(ficha)
     return len(fichas), fichas
Beispiel #42
0
 def obtener_orden(self, id_proyecto):
     """Obtiene los órdenes posibles para la fase que se importa.
     """
     cantidad_fases = DBSession.query(Proyecto.nro_fases) \
                 .filter(Proyecto.id == id_proyecto).scalar()
     ordenes = DBSession.query(Fase.orden).filter(Fase.id_proyecto == \
             id_proyecto).order_by(Fase.orden).all()
     vec = list()
     list_ordenes = list()
     for elem in ordenes:
         list_ordenes.append(elem.orden)
     for elem in xrange(cantidad_fases):
         if not (elem+1) in list_ordenes:
             vec.append(elem+1)        
     return vec[0]
 def __actions__(self, obj):
     """ Define las acciones posibles para cada fase en el módulo de
         gestión.
     """
     primary_fields = self.__provider__.get_primary_fields(self.__entity__)
     pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
     value = '<div>'
     id_tipos = DBSession.query(TipoItem.id).filter(TipoItem.id_fase == \
         pklist).all()
     value = value + '<div><a class="linea_base_link" href="'+pklist+ \
         '/lineas_base" style="text-decoration:none" TITLE = ' \
         '"Lineas base"></a></div>'
     value = value + '</div>'
     fase = DBSession.query(Fase).filter(Fase.id == pklist).one()
     estado_fase(fase)
     return value
Beispiel #44
0
    def _do_get_provider_count_and_objs(self, **kw):
        """ Se utiliza para listar los ítems que cumplan ciertas condiciones y
            ciertos permisos.
        """
        id_linea_base = unicode(request.url.split("/")[-3])
        items = DBSession.query(Item)\
            .filter(Item.id_tipo_item.contains(self.id_fase)) \
            .filter(Item.borrado == False).filter(Item.id_linea_base  == \
            id_linea_base).order_by(Item.id).all()
        for item in reversed(items):
            buscado = self.buscado in item.id or \
                      self.buscado in item.nombre or \
                      self.buscado in str(item.version) or \
                      self.buscado in item.descripcion or \
                      self.buscado in item.estado or \
                      self.buscado in item.observaciones or \
                      self.buscado in str(item.complejidad) or \
                      self.buscado in str(item.prioridad) or \
                      self.buscado in item.tipo_item.nombre
            if item.linea_base:
                buscado = buscado or self.buscado in item.linea_base.id

            if not buscado: items.remove(item)
        aux = []
        for item in items:
            for item_2 in items:
                if item.id == item_2.id : 
                    if item.version > item_2.version: 
                        aux.append(item_2)
                    elif item.version < item_2.version :
                        aux.append(item)
        items = [i for i in items if i not in aux]
        return len(items), items 
Beispiel #45
0
 def get_all(self, *args, **kw):
     """ Lista los ítems de acuerdo a lo establecido en
         L{ItemTableFiller._do_get_provider_count_and_objs}.
     """
     item_table_filler.init("", self.id_fase)
     d = super(ItemControllerListado, self).get_all(*args, **kw)
     items_borrados = DBSession.query(Item).filter(Item.id.contains( \
                     self.id_fase)).filter(Item.borrado == True).count()
     d["permiso_recuperar"] = False
     d["permiso_crear"] = False
     d["accion"] = "./buscar"   
     d["tipos_item"] = DBSession.query(TipoItem).filter( \
                         TipoItem.id_fase == self.id_fase)
     d["direccion_anterior"] = "../.."
     d["model"] = "Items"
     return d
Beispiel #46
0
 def __actions__(self, obj):
     """
     Define las acciones posibles para cada ítem.
     """
     primary_fields = self.__provider__.get_primary_fields(self.__entity__)
     pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
     id_item = pklist.split("/")[0]
     version_item = pklist.split("/")[1]
     pklist = id_item+ "-" + version_item
     item = DBSession.query(Item).filter(Item.id == id_item) \
             .filter(Item.version == version_item).one()
     value = '<div>'
     bloqueado = False
     if item.linea_base:
         if item.linea_base.cerrado: bloqueado = True
     if TienePermiso("reversionar item", id_fase = item.tipo_item.fase.id) \
                     .is_met(request.environ) and not bloqueado:
         value = value + '<div><a class="reversion_link" href=' \
          '"revertir?item='+pklist+'" style="text-decoration:none" TITLE ='\
          ' "Revertir"></a>'\
           '</div>'
     value = value + '<div><a class="relacion_link" href="'+pklist+ \
         '/relaciones" style="text-decoration:none" TITLE =' \
         '"Relaciones"></a></div>'
     value = value + '<div><a class="archivo_link" href="'+pklist+ \
      '/archivos" style="text-decoration:none" TITLE = "Archivos"></a>'\
      '</div>'
     if item.anexo != "{}":
         value = value + '<div><a class="caracteristica_link" href=' \
             '"listar_caracteristicas?pk_item='+pklist+ \
             '" style="text-decoration:none" TITLE =' \
             ' "Ver caracteristicas"></a></div>'
     value = value + '</div>'
     return value
Beispiel #47
0
 def __actions__(self, obj):
     """
     Define las acciones posibles para cada ítem.
     """
     primary_fields = self.__provider__.get_primary_fields(self.__entity__)
     pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
     id_item = pklist.split("/")[0]
     version_item = pklist.split("/")[1]
     pklist = id_item + "-" + version_item
     item = DBSession.query(Item).filter(Item.id == id_item) \
             .filter(Item.version == version_item).one()
     value = '<div>'
     bloqueado = False
     if item.linea_base:
         if item.linea_base.cerrado: bloqueado = True
     if TienePermiso("reversionar item", id_fase = item.tipo_item.fase.id) \
                     .is_met(request.environ) and not bloqueado:
         value = value + '<div><a class="reversion_link" href=' \
          '"revertir?item='+pklist+'" style="text-decoration:none" TITLE ='\
          ' "Revertir"></a>'\
           '</div>'
     value = value + '<div><a class="relacion_link" href="'+pklist+ \
         '/relaciones" style="text-decoration:none" TITLE =' \
         '"Relaciones"></a></div>'
     value = value + '<div><a class="archivo_link" href="'+pklist+ \
      '/archivos" style="text-decoration:none" TITLE = "Archivos"></a>'\
      '</div>'
     if item.anexo != "{}":
         value = value + '<div><a class="caracteristica_link" href=' \
             '"listar_caracteristicas?pk_item='+pklist+ \
             '" style="text-decoration:none" TITLE =' \
             ' "Ver caracteristicas"></a></div>'
     value = value + '</div>'
     return value
Beispiel #48
0
 def get_one(self, caracteristica_id):
     tmpl_context.widget = tipo_item_table
     caracteristica = DBSession.query(Caracteristica).get(caracteristica_id)
     value = caracteristica_table_filler.get_value(caracteristica = \
             caracteristica)
     return dict(caracteristica = caracteristica, value = value, model = \
                 "Caracteristica", accion = "./buscar")
    def _do_get_provider_count_and_objs(self, **kw):
        """
        Se utiliza para listar solo los proyectos que cumplan ciertas
        condiciones y de acuerdo a ciertos permisos.
        """
        if TieneAlgunPermiso(tipo = u"Fase", recurso = u"Linea Base"):
            proyectos = DBSession.query(Proyecto).filter(Proyecto.estado != \
                        u"Nuevo").order_by(Proyecto.id).all()

            for proyecto in reversed(proyectos):
                buscado = self.buscado in str(proyecto.nro_fases) or \
                          self.buscado in str(proyecto.fecha_inicio) or \
                          self.buscado in str(proyecto.fecha_fin) or \
                          self.buscado in proyecto.lider.nombre_usuario or \
                          self.buscado in proyecto.nombre or \
                          self.buscado in proyecto.descripcion or \
                          self.buscado in proyecto.estado
                if not buscado: proyectos.remove(proyecto)

            for proyecto in reversed(proyectos):
                if not (TieneAlgunPermiso(tipo = u"Fase", recurso = \
                        u"Linea Base", id_proyecto = proyecto.id) \
                        .is_met(request.environ) and self.fase_apta(proyecto)): 
                    proyectos.remove(proyecto)
                
        else: proyectos = list()       
        return len(proyectos), proyectos 
    def _do_get_provider_count_and_objs(self, buscado = "", **kw):
        """
        Se utiliza para listar solo los proyectos que cumplan ciertas
        condiciones y de acuerdo a ciertos permisos.
        """
        if TieneAlgunPermiso(tipo = u"Fase", recurso = u"Item"):
            proyectos = DBSession.query(Proyecto).filter(Proyecto.estado != \
                u"Nuevo").order_by(Proyecto.id).all()

            for proyecto in reversed(proyectos):
                buscado = self.buscado in str(proyecto.nro_fases) or \
                          self.buscado in str(proyecto.fecha_inicio) or \
                          self.buscado in str(proyecto.fecha_fin) or \
                          self.buscado in proyecto.lider.nombre_usuario or \
                          self.buscado in proyecto.nombre or \
                          self.buscado in proyecto.descripcion or \
                          self.buscado in proyecto.estado
                if not buscado: proyectos.remove(proyecto)

            for proyecto in reversed(proyectos):
                if not TieneAlgunPermiso(tipo = u"Fase", recurso = u"Item", \
                                        id_proyecto = proyecto.id) \
                                        .is_met(request.environ):
                    proyectos.remove(proyecto)
        else: proyectos = list()       
        return len(proyectos), proyectos 
Beispiel #51
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('./')
Beispiel #52
0
    def _do_get_provider_count_and_objs(self, **kw):
        """
        Se utiliza para listar solo los proyectos que cumplan ciertas
        condiciones y de acuerdo a ciertos permisos.
        """
        proyectos = DBSession.query(Proyecto).order_by(Proyecto.id).all()
        for proyecto in reversed(proyectos):
            buscado = self.buscado in str(proyecto.nro_fases) or \
                      self.buscado in str(proyecto.fecha_inicio) or \
                      self.buscado in str(proyecto.fecha_fin) or \
                      self.buscado in proyecto.lider.nombre_usuario or \
                      self.buscado in proyecto.nombre or \
                      self.buscado in proyecto.descripcion or \
                      self.buscado in proyecto.estado

            if not buscado: proyectos.remove(proyecto)
        ps = TieneAlgunPermiso(tipo = u"Sistema", recurso = u"Proyecto") \
            .is_met(request.environ)
        if not ps:
            for proyecto in reversed(proyectos):
                pfp = TienePermiso(u"asignar rol cualquier fase", \
                      id_proyecto = proyecto.id).is_met(request.environ)
                pfi = TieneAlgunPermiso(tipo = "Fase", recurso = u"Ficha", \
                      id_proyecto = proyecto.id).is_met(request.environ)
                pp = TieneAlgunPermiso(tipo = u"Proyecto", recurso = u"Fase", \
                     id_proyecto = proyecto.id).is_met(request.environ)
                pf = TieneAlgunPermiso(tipo = u"Fase", recurso =
                     u"Tipo de Item", id_proyecto = proyecto.id). \
                     is_met(request.environ)

                if not (pp or pf or pfp or pfi): proyectos.remove(proyecto)

        return len(proyectos), proyectos
Beispiel #53
0
 def index(self):
     """Handle the front-page."""
     p_sis = TieneAlgunPermiso(tipo = u"Sistema").is_met(request.environ)
     p_proy = TieneAlgunPermiso(tipo = u"Proyecto").is_met(request.environ)
     p_fic = TieneAlgunPermiso(recurso = u"Ficha").is_met(request.environ)
     p_t_it = TieneAlgunPermiso(recurso = u"Tipo de Item") \
             .is_met(request.environ)
     proys = DBSession.query(Proyecto).filter(Proyecto.estado != \
             u"Nuevo").all()
     permiso_desarrollo = False
     if len(proys) != 0: 
         for p in proys:
             if TieneAlgunPermiso(recurso = u"Item", id_proyecto = p.id) \
             .is_met(request.environ): permiso_desarrollo = True
     d = dict(page='index', direccion_anterior = "../")
     d["permiso_desarrollo"] =  permiso_desarrollo
     for proyecto in reversed(proys):
         if not self.fase_apta(proyecto): proys.remove(proyecto)
     permiso_gestion = False
     if len(proys) != 0: 
         for p in proys:
             for f in p.fases:
                 if TieneAlgunPermiso(recurso = u"Linea Base", \
                     id_fase = f.id).is_met(request.environ): 
                     permiso_gestion = True        
     d["permiso_administracion"] = p_sis or p_proy or p_fic or p_t_it
     d["permiso_gestion"] = permiso_gestion
      
     return d
Beispiel #54
0
 def __actions__(self, obj):
     """ Define las acciones posibles para cada fase en el módulo de
         gestión.
     """
     primary_fields = self.__provider__.get_primary_fields(self.__entity__)
     pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
     value = '<div>'
     id_tipos = DBSession.query(TipoItem.id).filter(TipoItem.id_fase == \
         pklist).all()
     value = value + '<div><a class="linea_base_link" href="'+pklist+ \
         '/lineas_base" style="text-decoration:none" TITLE = ' \
         '"Lineas base"></a></div>'
     value = value + '</div>'
     fase = DBSession.query(Fase).filter(Fase.id == pklist).one()
     estado_fase(fase)
     return value