Пример #1
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('./')
Пример #2
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/')
Пример #3
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 
Пример #4
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
Пример #5
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('./')
Пример #6
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)
Пример #7
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
Пример #8
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)
Пример #9
0
    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
Пример #10
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
Пример #11
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('./')
Пример #12
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
Пример #13
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)
Пример #14
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
Пример #15
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 
Пример #16
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
Пример #17
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
Пример #18
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('./')
Пример #19
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)
Пример #20
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 
Пример #21
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 
Пример #22
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)       
Пример #23
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]
Пример #24
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
Пример #25
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
Пример #26
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 
Пример #27
0
    def crear_version_sin_relaciones(self, it, id_item):
        """
        Crea una nueva versión de un ítem dado sin sus relaciones.

        @param it: Item a partir del cual se creará una nueva versión.
        @type it: L{Item}
        @param id_item: Id del ítem a reversionar.
        @type id_item: String
        """
        actual = DBSession.query(Item).filter(Item.id == id_item) \
            .order_by(desc(Item.version)).first()
        nueva_version = Item()
        nueva_version.id = it.id
        nueva_version.codigo = it.codigo
        nueva_version.version = actual.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
        nueva_version.tipo_item = it.tipo_item
        nueva_version.revisiones = actual.revisiones
        nueva_version.linea_base = actual.linea_base
        nueva_version.archivos = it.archivos
        return nueva_version    
Пример #28
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
Пример #29
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
Пример #30
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.
        """
        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 
Пример #31
0
    def post_delete(self, *args, **kw):
        """ Realiza la eliminación del archivo de la base de datos, creando
            una nueva versión del ítem correspondiente.
        """
        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)
        archivo = DBSession.query(Archivo).filter(Archivo.id == args[0]).one()
        nueva_version.archivos.remove(archivo)
        raise redirect('./../../' + nueva_version.id + '-' + \
                unicode(nueva_version.version) + '/' + 'archivos/')
Пример #32
0
 def new(self, *args, **kw):
     """ Permite la creación de una nueva relación entre dos ítems de un
         determinado proyecto.
     """
     it = DBSession.query(Item).filter(Item.id == self.id_item) \
         .filter(Item.version == self.version_item).one()
     if TienePermiso("crear relaciones", id_fase=it.tipo_item.fase.id):
         tmpl_context.widget = self.new_form
         d = dict(value=kw, model=self.model.__name__)
         d["items"] = DBSession.query(Item).join(Item.tipo_item) \
             .filter(TipoItem.id_fase == kw["fase"]).filter(Item.id != \
             self.id_item).filter(Item.borrado == False).all()
         lista = [x.id_item_2 for x in it.relaciones_a] + \
                 [y.id_item_1 for y in it.relaciones_b]
         for item in reversed(d["items"]):
             if item.id in lista:
                 d["items"].remove(item)
             else:
                 if item.tipo_item.fase < it.tipo_item.fase:
                     if item.linea_base:
                         if not (item.linea_base.consistente and \
                            item.linea_base.cerrado):
                             d["items"].remove(item)
                     else:
                         d["items"].remove(item)
                 else:
                     if item.estado != u"Aprobado" or item.revisiones:
                         d["items"].remove(item)
         aux = []
         for item in d["items"]:
             for item_2 in d["items"]:
                 if item.id == item_2.id:
                     if item.version > item_2.version and item_2 not in aux:
                         aux.append(item_2)
                     elif item.version < item_2.version and item not in aux:
                         aux.append(item)
         d["items"] = [i for i in d["items"] if i not in aux and \
                      i.estado == u"Aprobado"]
         d["direccion_anterior"] = "./"
         return d
     else:
         flash(u"El usuario no cuenta con los permisos necesarios", \
             u"error")
         raise redirect('./')
Пример #33
0
 def buscar(self, **kw):
     """ Lista las líneas base de acuerdo a un criterio de búsqueda
         introducido por el usuario.
     """
     buscar_table_filler = LineaBaseTableFiller(DBSession)
     if "parametro" in kw:
         buscar_table_filler.init(kw["parametro"], self.id_fase)
     else:
         buscar_table_filler.init("", self.id_fase)
     tmpl_context.widget = self.table
     value = buscar_table_filler.get_value()
     d = dict(value_list=value, model="Lineas Base")
     d["accion"] = "./buscar"
     d["permiso_crear"] = TienePermiso("crear linea base",
                                       id_fase=self.id_fase).is_met(
                                           request.environ)
     d["permiso_unir"] = TienePermiso("unir lineas base",
                                      id_fase=self.id_fase).is_met(
                                          request.environ)
     cant = DBSession.query(LineaBase).filter(LineaBase.cerrado == False) \
             .filter(LineaBase.id_fase == self.id_fase).count()
     if cant < 2:
         d["lineas_base"] = False
     else:
         d["lineas_base"] = True
     items = DBSession.query(Item).filter(Item.id_tipo_item
             .contains(self.id_fase)).filter(Item.borrado == False) \
             .filter(Item.id_linea_base == None).filter(Item.estado ==
             u"Aprobado").all()
     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 and not es_huerfano(i)]
     cant_items = len(items)
     if cant_items == 0: d["permiso_crear"] = False
     d["direccion_anterior"] = "../.."
     return d
Пример #34
0
 def obtener_fases_posibles(self):
     """ @return: Posibles órdenes para la fase a ser editada.
     """
     id_proyecto = unicode(request.url.split("/")[-4])
     id_fase = unicode(request.url.split("/")[-2])
     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()
     orden_actual = DBSession.query(Fase.orden).filter(Fase.id == \
                     id_fase).scalar()
     vec = list()
     list_ordenes = list()
     vec.append(orden_actual)
     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
Пример #35
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('./')
Пример #36
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)
Пример #37
0
 def get_all(self, *args, **kw):
     """
     Lista los ítems existentes de acuerdo a condiciones establecidas 
     en el L{item_controller.ItemTableFiller
     ._do_get_provider_count_and_objs}.
     """
     item_table_filler.init("", self.id_fase)
     d = super(ItemController, 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"] = TienePermiso("recuperar item", id_fase = \
             self.id_fase).is_met(request.environ) and items_borrados
     d["permiso_crear"] = TienePermiso("crear item", id_fase = \
             self.id_fase).is_met(request.environ)
     d["accion"] = "./buscar"
     d["tipos_item"] = DBSession.query(TipoItem).filter( \
                         TipoItem.id_fase == self.id_fase)
     d["model"] = "Items"
     d["direccion_anterior"] = "../.."
     return d
Пример #38
0
 def post_delete(self, *args, **kw):
     """ Borra una relación de la base de datos, con las dependencias
         correspondientes.
     """
     it = DBSession.query(Item).filter(Item.id == self.id_item) \
         .filter(Item.version == self.version_item).one()
     relacion = DBSession.query(Relacion) \
                 .filter(Relacion.id == args[0]).one()
     if it == relacion.item_2:
         version = unicode(it.version + 1)
     else:
         version = unicode(it.version)
     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)
     raise redirect('./../../' + it.id + '-' + \
           version + '/' + 'relaciones/')
Пример #39
0
 def get_all(self, *args, **kw):
     """Lista las fichas de acuerdo a lo establecido en
        L{ficha_usuario_controller.FichaTableFiller._do_get_provider_count_and_objs}.
     """
     ficha_table_filler.init("", self.id_usuario)
     d = super(FichaUsuarioController, self).get_all(*args, **kw)
     usuario = DBSession.query(Usuario).get(self.id_usuario)
     d["permiso_crear"] = False
     d["model"] = "Responsabilidades"
     d["accion"] = "./buscar"
     d["direccion_anterior"] = "../.."
     return d
Пример #40
0
 def revivir(self, *args, **kw):
     """Permite realizar la recuperación de ítems borrados con sus
         respectivos atributos y las relaciones que sea posible recuperar.
     """
     if TienePermiso("recuperar item", id_fase=self.id_fase):
         pk = kw["id_item"]
         pk_id = unicode(pk.split("-")[0] + "-" + pk.split("-")[1] + "-" + \
                 pk.split("-")[2] + "-" + pk.split("-")[3])
         pk_version = pk.split("-")[4]
         it = DBSession.query(Item).filter(Item.id == pk_id) \
                 .filter(Item.version == pk_version).one()
         it.estado = u"En desarrollo"
         it.borrado = False
         it.linea_base = None
         items = DBSession.query(Item).filter(Item.id == pk_id).all()
         for item in items:
             item.borrado = False
     else:
         flash(u"El usuario no cuenta con los permisos necesarios", \
             u"error")
     raise redirect('./')
Пример #41
0
 def buscar(self, **kw):
     """ Lista los ítems pertenecientes a una línea base de acuerdo a un 
         criterio de búsqueda introducido por el usuario.
     """
     buscar_table_filler = ItemTableFiller(DBSession)
     if "parametro" in kw:
         buscar_table_filler.init(kw["parametro"], self.id_fase)
     else:
         buscar_table_filler.init("", self.id_fase)
     tmpl_context.widget = self.table
     value = buscar_table_filler.get_value()
     d = dict(value_list = value, model = "Items", accion = "./buscar")
     items_borrados = DBSession.query(Item) \
         .filter(Item.id.contains(self.id_fase)) \
         .filter(Item.borrado == True).count()
     d["permiso_crear"] = False
     d["permiso_recuperar"] = False
     d["tipos_item"] = DBSession.query(TipoItem)\
                     .filter(TipoItem.id_fase == self.id_fase)
     d["direccion_anterior"] = "../.."
     return d
Пример #42
0
 def _do_get_provider_count_and_objs(self, buscado="", **kw):
     """
     Se utiliza para listar solo los roles que cumplan ciertas
     condiciones y de acuerdo a ciertos permisos.
     """
     if TieneAlgunPermiso(tipo = "Sistema", recurso = "Rol") \
                         .is_met(request.environ):
         roles = DBSession.query(Rol).filter(Rol.nombre.contains( \
                 self.buscado)).all()
     else:
         roles = list()
     return len(roles), roles
Пример #43
0
 def _do_get_provider_count_and_objs(self, buscado="", **kw):
     """ Se utiliza para listar las relaciones que cumplan ciertas
         condiciones y ciertos permisos.
     """
     item_1 = aliased(Item)
     item_2 = aliased(Item)
     raux = DBSession.query(Relacion).join((item_1, Relacion.id_item_1 == \
         item_1.id)).join((item_2, Relacion.id_item_2 == item_2.id)) \
         .filter(or_(and_(Relacion.id_item_1 == self.id_item, \
         Relacion.version_item_1 == self.version_item), \
         and_(Relacion.id_item_2 == self.id_item, \
         Relacion.version_item_2 == self.version_item))) \
         .filter(or_(Relacion.id.contains(self.buscado), \
         item_1.nombre.contains(self.buscado), \
         item_2.nombre.contains(self.buscado))).all()
     item = DBSession.query(Item).filter(Item.id == self.id_item) \
         .filter(Item.version == self.version_item).one()
     lista = [x for x in relaciones_a_actualizadas(item.relaciones_a) + \
             relaciones_b_actualizadas(item.relaciones_b)]
     relaciones = [r for r in raux if r in lista]
     return len(relaciones), relaciones
Пример #44
0
 def _do_get_provider_count_and_objs(self, buscado="", **kw):
     """
     Se utiliza para listar solo los tipos de ítem que cumplan ciertas
     condiciones y de acuerdo a ciertos permisos.
     """
     if self.id_fase == "":
         tiposItem = DBSession.query(TipoItem).filter(or_(TipoItem.nombre \
                 .contains(self.buscado), TipoItem.descripcion.contains( \
                 self.buscado), TipoItem.codigo.contains(self.buscado))) \
                 .all()
     else:
         pf = TieneAlgunPermiso(tipo = u"Fase", recurso = u"Tipo de Item", \
             id_fase = self.id_fase).is_met(request.environ)
         if pf:
             tiposItem = DBSession.query(TipoItem).filter( \
             TipoItem.id_fase == self.id_fase).filter(or_(TipoItem.nombre. \
             contains(self.buscado), TipoItem.descripcion.contains( \
             self.buscado), TipoItem.codigo.contains(self.buscado))).all()
         else:
             tiposItem = list()
     return len(tiposItem), tiposItem
Пример #45
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
Пример #46
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('./../../../../..')
Пример #47
0
    def _do_get_provider_count_and_objs(self, **kw):
        """ Se utiliza para listar las fases que cumplan ciertas condiciones y
            ciertos permisos.
        """
        self.id_proyecto = unicode(request.url.split("/")[-3])
        self.opcion = unicode(request.url.split("/")[-5])
        self.id_fase = unicode(request.url.split("/")[-6])
        if self.opcion == unicode("tipo_item"):
            if TienePermiso("importar tipo de item", id_fase=self.id_fase):
                fases = DBSession.query(Fase).filter(Fase.id_proyecto == \
                    self.id_proyecto).filter(Fase.id != self.id_fase) \
                    .order_by(Fase.orden).all()
                fases = [f for f in fases if len(f.tipos_item) > 1]
                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)
            else:
                fases = list()
        else:
            if TienePermiso("importar fase", id_proyecto=self.id_proyecto):
                fases = DBSession.query(Fase).filter(Fase.id_proyecto == \
                self.id_proyecto).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)
            else:
                proyectos = list()
        return len(fases), fases
Пример #48
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)
Пример #49
0
 def evaluate(self, environ, credentials):
     if is_anonymous().is_met(request.environ): self.unmet()
     usuario = DBSession.query(Usuario).filter(Usuario.nombre_usuario == \
               credentials.get('repoze.what.userid')).first()
     fichas = DBSession.query(Ficha).filter(Ficha.usuario == usuario)
     if self.id_proyecto:
         fichas = fichas.filter(Ficha.id_proyecto == self.id_proyecto)
     if self.id_fase:
         fichas = fichas.filter(Ficha.id_fase == self.id_fase)
     fichas = fichas.all()
     if self.tipo:
         for ficha in reversed(fichas):
             if ficha.rol.tipo != self.tipo: fichas.remove(ficha)
     if self.recurso:
         band = False
         for ficha in reversed(fichas):
             for perm in ficha.rol.permisos:
                 if perm.recurso == self.recurso:
                     band = True
                     break
             if not band: fichas.remove(ficha)
     if not fichas: self.unmet()
Пример #50
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
Пример #51
0
 def __actions__(self, obj):
     """ Define las acciones posibles para cada fase en el módulo de 
         desarrollo.
     """
     primary_fields = self.__provider__.get_primary_fields(self.__entity__)
     pklist = '/'.join(map(lambda x: str(getattr(obj, x)), primary_fields))
     value = '<div>'
     value = value + '<div><a class="item_link" href="'+pklist+'/items" ' \
         'style="text-decoration:none" TITLE = "Items"></a></div>'
     value = value + '</div>'
     fase = DBSession.query(Fase).filter(Fase.id == pklist).one()
     estado_fase(fase)
     return value
Пример #52
0
 def descargar(self, *args, **kw):
     """Realiza la descarga del archivo en la computadora del cliente.
     """
     item = DBSession.query(Item).filter(Item.id == self.id_item).filter( \
             Item.version == self.version_item).one()
     if TienePermiso("descargar archivo", id_fase = item.tipo_item.fase \
                     .id).is_met(request.environ):
         id_archivo = kw["id_archivo"]
         archivo = DBSession.query(Archivo).filter(Archivo.id == \
                 id_archivo).one()
         rh = response.headers
         rh['Content-Type'] = 'application/octet-stream'
         disposition = 'attachment; filename="' + archivo.nombre.encode(
             'utf-8') + '"'
         rh['Content-disposition'] = disposition
         rh['Pragma'] = 'public'  # for IE
         rh['Cache-control'] = 'max-age=0'  #for IE
         return archivo.contenido
     else:
         flash(u"El usuario no cuenta con los permisos necesarios", \
             u"error")
         redirect('./')
Пример #53
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>'
     value = value + '<div><a class="fase_link" href="'+pklist+'/fases" '\
         'style="text-decoration:none" TITLE = "Fases"></a></div>'
     value = value + '</div>'
     pr = DBSession.query(Proyecto).get(pklist)
     estado_proyecto(pr)
     return value
Пример #54
0
    def get_all(self, *args, **kw):
        """Lista las líneas base de acuerdo a lo establecido en
           L{linea_base_controller.LineaBaseTableFiller._do_get_provider_count_and_objs}.
        """
        linea_base_table_filler.init("", id_fase=self.id_fase)
        d = super(LineaBaseController, self).get_all(*args, **kw)
        d["permiso_crear"] = TienePermiso("crear linea base",
                                          id_fase=self.id_fase).is_met(
                                              request.environ)
        d["permiso_unir"] = TienePermiso("unir lineas base",
                                         id_fase=self.id_fase).is_met(
                                             request.environ)
        d["model"] = "Lineas Base"
        cant = DBSession.query(LineaBase).filter(LineaBase.cerrado == False) \
                .filter(LineaBase.id_fase == self.id_fase).count()
        items = DBSession.query(Item).filter(Item.id_tipo_item
                .contains(self.id_fase)).filter(Item.borrado == False) \
                .filter(Item.id_linea_base == None) \
                .filter(Item.estado == u"Aprobado").all()

        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 and not es_huerfano(i)]
        cant_items = len(items)
        if cant < 2:
            d["lineas_base"] = False
        else:
            d["lineas_base"] = True
        if cant_items == 0: d["permiso_crear"] = False
        d["direccion_anterior"] = "../.."
        d["accion"] = "./buscar"
        return d
Пример #55
0
 def get_all(self, *args, **kw):  
     """Lista las fases de acuerdo a lo establecido en
        L{fase_controller.FaseTableFiller._do_get_provider_count_and_objs}.
     """
     fase_table_filler.init("", self.id_proyecto)
     d = super(FaseController, self).get_all(*args, **kw)
     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["accion"] = "./buscar"
     d["direccion_anterior"] = "../.."
     return d
Пример #56
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_proyecto == "":
         fichas = DBSession.query(Ficha).filter(Ficha.id \
             .contains(self.buscado)).all()
     else:
         if TienePermiso("asignar rol proyecto", id_proyecto = \
             self.id_proyecto).is_met(request.environ):
             fichas = DBSession.query(Ficha).filter(Ficha.id_proyecto == \
                 self.id_proyecto).all()
             for ficha in reversed(fichas):
                 if ficha.rol.tipo != u"Proyecto":
                     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):                         \
                                             fichas.remove(ficha)
         else:
             fichas = list()
     return len(fichas), fichas
Пример #57
0
 def _to_python(self, value, state):
     """
     Realiza el control citado anteriormente.
     @param value: Se tiene el valor ingresado por el usuario.
     @type value: Unicode. 
     @return value: Retorna el valor ingresado por el usuario.
     """
     id_proyecto = self.id_proyecto = unicode(request.url.split("/")[-2])
     band = DBSession.query(Proyecto).filter(Proyecto.id != id_proyecto) \
             .filter(Proyecto.nombre == value).count()
     if band:
         raise Invalid('El nombre de proyecto elegido ya está en uso',
                       value, state)
     return value
Пример #58
0
 def _to_python(self, value, state):
     """
     Realiza el control citado anteriormente.
     @param value: Se tiene el valor ingresado por el usuario.
     @type value: Unicode. 
     @return value: Retorna el valor ingresado por el usuario.
     """
     id_proyecto = self.id_proyecto = unicode(request.url.split("/")[-2])
     cant_fases = DBSession.query(Fase).filter(Fase.id_proyecto == \
                 id_proyecto).count()
     if int(value) < cant_fases:
         raise Invalid(u'Existen más fases que el nro. ingresado', value,
                       state)
     return value
Пример #59
0
    def _do_get_provider_count_and_objs(self, **kw):
        """ Se utiliza para listar las fases que cumplan ciertas condiciones y
            ciertos permisos.
        """
        if self.id_proyecto == "":
            fases = DBSession.query(Fase).order_by(Fase.orden).all()
                    
        else:
            fases = DBSession.query(Fase).filter(Fase.id_proyecto == \
                    self.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)   
                        
        pp = TieneAlgunPermiso(tipo = u"Proyecto", recurso = u"Fase", \
                        id_proyecto = self.id_proyecto).is_met(request.environ)
            
        if not pp:
            for fase in reversed(fases):
                pfp = TienePermiso(u"asignar rol cualquier fase", \
                      id_proyecto = fase.id_proyecto).is_met(request.environ)
                pfi = TieneAlgunPermiso(tipo = "Fase", recurso = u"Ficha", \
                       id_proyecto = fase.id_proyecto).is_met(request.environ)
                pf = TieneAlgunPermiso(tipo = u"Fase", recurso = \
                    u"Tipo de Item", id_fase = fase.id). \
                    is_met(request.environ)
                if not (pf or pfp or pfi): 
                    fases.remove(fase)
        return len(fases), fases 
Пример #60
0
 def _to_python(self, value, state):
     """
     Realiza el control citado anteriormente.
     @param value: Se tiene el valor ingresado por el usuario.
     @type value: Unicode. 
     @return value: Retorna el valor ingresado por el usuario.
     """
     id_fase = unicode(request.url.split("/")[-3])
     valor = value.upper()
     band = DBSession.query(TipoItem).filter(TipoItem.codigo == valor) \
             .filter(TipoItem.id_fase == id_fase).count()
     if band:
         raise Invalid('El codigo de tipo de item elegido ya está en uso',
                       value, state)
     return value