Ejemplo n.º 1
0
 def test_user_doesnt_have_all_permissions(self):
     environ = make_environ('gustavo',
                            permissions=['watch-tv', 'party', 'eat'])
     p = predicates.has_any_permission('jump', 'scream')
     self.eval_unmet_predicate(
         p, environ, 'The user must have at least one of the following '
         'permissions: jump, scream')
Ejemplo n.º 2
0
class AttributController(CrudRestController):
    allow_only = has_any_permission(gl.perm_admin, gl.perm_user)
    model = Attributs
    table = attribut_table
    table_filler = attribut_table_filler
    edit_form = attribut_edit_form
    new_form = new_attribut_form
    edit_filler = attribut_edit_filler

    @with_trailing_slash
    @expose('biorepo.templates.list')
    @expose('json')
    def get_all(self, *args, **kw):
        user = handler.user.get_user_in_session(request)
        # user attributs
        #to block to one specific user
        attributs = DBSession.query(Attributs).all()
        all_attributs = [
            util.to_datagrid(attribut_grid, attributs, "Attributs Table",
                             len(attributs) > 0)
        ]
        return dict(page='attributs',
                    model='attribut',
                    form_title="new attribut",
                    items=all_attributs,
                    value=kw)

    @expose('genshi:tgext.crud.templates.new')
    def new(self, *args, **kw):
        tmpl_context.widget = new_attribut_form
        #take the logged user
        user = handler.user.get_user_in_session(request)
        #take the logged user samples
        samples = DBSession.query(Samples).join(Projects).join(User).filter(
            User.id == user.id).all()
        meas = DBSession.query(Measurements).all()
        attributs = DBSession.query(Attributs).all()
        tmpl_context.samples = samples
        tmpl_context.meas = meas
        tmpl_context.attributs = attributs

        return dict(page='samples',
                    value=kw,
                    title='New Sample',
                    model='Sample')

    @expose('genshi:tgext.crud.templates.edit')
    def edit(self, *args, **kw):
        tmpl_context.widget = attribut_edit_form
        user = handler.user.get_user_in_session(request)
        attribut = DBSession.query(Attributs).filter(
            Attributs.id == args[0]).first()

    @expose('genshi:tgext.crud.templates.get_delete')
    def get_delete(self, *args, **kw):

        return CrudRestController.get_delete(self, *args, **kw)
Ejemplo n.º 3
0
 def test_check_authorization(self):
     logger = FakeLogger()
     environ = make_environ('gustavo',
                            permissions=['watch-tv', 'party', 'eat'])
     environ['repoze.who.logger'] = logger
     p = has_any_permission('party', 'scream')
     check_authorization(p, environ)
     info = logger.messages['info']
     assert "Authorization granted" == info[0]
Ejemplo n.º 4
0
 def test_check_authorization(self):
     logger = FakeLogger()
     environ = make_environ('gustavo', permissions=['watch-tv', 'party',
                                                    'eat'])
     environ['repoze.who.logger'] = logger
     p = has_any_permission('party', 'scream')
     check_authorization(p, environ)
     info = logger.messages['info']
     assert "Authorization granted" == info[0]
Ejemplo n.º 5
0
class ReflectController(BaseController):
    allow_only = has_any_permission(constants.permissions['admin']['name'],
                                    constants.permissions['read']['name'])

    @expose()
    def links(self, name, assembly_id):
        url = '%s/%s/%s?name=%s' % (reflect_server, reflect_api, reflect_popup,
                                    name)
        u = urllib2.urlopen(url)
        return u
Ejemplo n.º 6
0
    def __call__(self, environ, start_response):
        """Invoke the Controller"""
        # TGController.__call__ dispatches to the Controller method
        # the request is routed to. This routing information is
        # available in environ['pylons.routes_dict']

        request.identity = request.environ.get('repoze.who.identity')
        # para acceder mas rapido a este componente
        request.credentials = request.environ.get('repoze.what.credentials')
        request.puede_gestion_conf = False
        request.puede_desarrollo = False

        if request.credentials:
            username = request.credentials["repoze.what.userid"]
            usuario = model.Usuario.by_user_name(username)
            request.puede_proyecto = False
            request.puede_rol = False
            request.puede_fase = False
            request.puede_ti = False
            request.puede_busqueda = False

            if AlgunPermiso(tipo="Rol").is_met(request.environ):
                request.puede_rol = True

            perms = request.credentials["permissions"]
            if perms.count("crear proyecto") or \
               perms.count("modificar proyecto") or \
               perms.count("eliminar proyecto"):
                request.puede_proyecto = True

            if perms.count("modificar fase"):
                request.puede_fase = True

            if perms.count("crear tipo item") or \
               perms.count("redefinir tipo item"):
                request.puede_ti = True

            if AlgunPermiso(tipo="Usuario").is_met(request.environ):
                request.puede_busqueda = True

            if AlgunPermiso(tipo="Tipo").is_met(request.environ):
                request.puede_desarrollo = True

            if has_any_permission(u"crear lb", u"abrir-cerrar lb",
                                  u"consultar lb").is_met(request.environ):
                request.puede_gestion_conf = True

        tmpl_context.identity = request.identity
        #        session['atras'] = session['actual']
        #        session['actual'] = session['adelante']

        session.save()
        return TGController.__call__(self, environ, start_response)
Ejemplo n.º 7
0
    def __call__(self, environ, start_response):
        """Invoke the Controller"""
        # TGController.__call__ dispatches to the Controller method
        # the request is routed to. This routing information is
        # available in environ['pylons.routes_dict']

        request.identity = request.environ.get('repoze.who.identity')
        # para acceder mas rapido a este componente
        request.credentials = request.environ.get('repoze.what.credentials')
        request.puede_gestion_conf = False
        request.puede_desarrollo = False
        
        if request.credentials:
            username = request.credentials["repoze.what.userid"]
            usuario = model.Usuario.by_user_name(username)
            request.puede_proyecto = False
            request.puede_rol = False
            request.puede_fase = False
            request.puede_ti = False
            request.puede_busqueda = False
            
            if AlgunPermiso(tipo="Rol").is_met(request.environ):
                request.puede_rol = True

            perms = request.credentials["permissions"]
            if perms.count("crear proyecto") or \
               perms.count("modificar proyecto") or \
               perms.count("eliminar proyecto"):
                request.puede_proyecto = True
            
            if perms.count("modificar fase"):
                request.puede_fase = True
            
            if perms.count("crear tipo item") or \
               perms.count("redefinir tipo item"):
                request.puede_ti = True
            
            if AlgunPermiso(tipo="Usuario").is_met(request.environ):
                request.puede_busqueda = True
                
            if AlgunPermiso(tipo="Tipo").is_met(request.environ):
                request.puede_desarrollo = True
                
            if has_any_permission(u"crear lb", u"abrir-cerrar lb", 
                                  u"consultar lb").is_met(request.environ):
                request.puede_gestion_conf = True
			
        tmpl_context.identity = request.identity
#        session['atras'] = session['actual']
#        session['actual'] = session['adelante']
        
        session.save()
        return TGController.__call__(self, environ, start_response)
Ejemplo n.º 8
0
class WorkerController(BaseController):
    allow_only = has_any_permission(constants.permissions['admin']['name'],
                                    constants.permissions['read']['name'])

    def index(self, *args, **kw):
        print 'worker received : args : %s, kw : %s' % (args, kw)
        pass

    @expose('json')
    def new_selection(self, project_id, s, job_name, job_description, *args,
                      **kw):
        '''
        Called by the browser. Transform a selection to a new track;
        '''
        user = handler.user.get_user_in_session(request)
        sels = json.loads(s)

        project = DBSession.query(Project).filter(
            Project.id == project_id).first()
        if project is None:
            return {'error': "project id %s doesn't exist" % project_id}
        path = track.common.temporary_path()

        with track.new(path, 'sql') as t:
            t.fields = simple_fields
            for chromosome in sels:
                t.write(chromosome,
                        ((marquee['start'], marquee['end'], 0, '', 0, '')
                         for marquee in sels[chromosome]))
            t.datatype = constants.FEATURES
            t.assembly = project.sequence.name

        task_id, track_id = handler.track.create_track(
            user.id,
            project.sequence,
            f=path,
            trackname='%s %s' % (job_name, job_description),
            project=project)
        if task_id == constants.NOT_SUPPORTED_DATATYPE:
            return {'error': "not supported datatype" % project_id}

        job_id = handler.job.new_sel(user.id,
                                     project.id,
                                     job_description,
                                     job_name,
                                     task_id=task_id)
        return {
            'job_id': job_id,
            'job_name': job_name,
            'job_description': job_description,
            'status': 'RUNNING'
        }

    @expose('json')
    def status(self, job_id, *args, **kw):
        try:
            job_id = int(job_id)
            job = DBSession.query(Job).filter(Job.id == job_id).first()
            return {
                'job_id': job.id,
                'status': job.status,
                'output': job.output,
                'error': job.traceback
            }
        except ValueError:
            pass
        return {}

    @expose('json')
    def new_gfeatminer_job(self, project_id, job_description, job_name, data,
                           *args, **kw):
        print 'new_gfeatminer_job pid : %s, data : %s, args : %s, kw : %s, job_name : %s, job_description : %s' % (
            project_id, data, args, kw, job_name, job_description)
        user = handler.user.get_user_in_session(request)
        try:
            data = json.loads(data)
        except Exception as e:
            return {
                'error': 'error when loading job in GDV',
                'trace': e.message
            }

        try:
            handler.job.parse_args(data)
        except IndexError as e:
            return {'error': 'you did not specified a requested parameter'}
        except Exception as e:
            return {
                'error': 'error when parsing job in GDV',
                'trace': e.message
            }

        try:
            job_id = handler.job.new_job(user.id, project_id, job_name,
                                         job_description, data, *args, **kw)
        except Exception as e:
            etype, value, tb = sys.exc_info()
            traceback.print_exception(etype, value, tb)
            return {
                'error': 'error when launching job in GDV',
                'trace': e.message
            }

        return {
            'job_id': job_id,
            'job_name': job_name,
            'job_description': job_description,
            'status': 'RUNNING'
        }
Ejemplo n.º 9
0
class UsersController(BaseController):

    allow_only = authorize.not_anonymous()

    @expose('sapns/users/edit.html')
    @require(predicates.not_anonymous())
    @add_language
    def edit(self, cls, id_, **params):

        user = dbs.query(SapnsUser).get(request.identity['user'].user_id)
        id_user = int(id_)

        is_manager = u'managers' in request.identity['groups']

        if user.user_id != id_user and not is_manager:
            redirect(url('/error'))

        user = dbs.query(SapnsUser).get(id_user)
        return dict(user=user, came_from=params.get('came_from'))

    @expose('sapns/users/edit.html')
    @require(predicates.has_any_permission('manage', 'users'))
    def new(self, cls, **params):
        came_from = params.get('came_from', '/dashboard/users')
        return dict(user={}, came_from=url(came_from))

    @expose('json')
    @require(predicates.has_any_permission('manage', 'users'))
    def save(self, **params):

        logger = logging.getLogger('UsersController.save')
        try:
            #logger.info(params)

            id_ = get_paramw(params, 'id', int, opcional=True)
            display_name = get_paramw(params, 'display_name', unicode)
            user_name = get_paramw(params, 'user_name', unicode)
            email_address = get_paramw(params, 'email_address', unicode)
            password = get_paramw(params, 'password', unicode, opcional=True)
            copy_from = get_paramw(params, 'copy_from', int, opcional=True)

            new_user = False
            if id_:
                user = dbs.query(SapnsUser).get(id_)
            else:
                new_user = True
                user = SapnsUser()

            user.display_name = display_name

            # user_name
            another = dbs.query(SapnsUser).\
                filter(and_(SapnsUser.user_id != user.user_id,
                            SapnsUser.user_name == user_name,
                            )).\
                first()
            if another:
                raise EUser(_('"User name" is already in use'))

            # email_address
            another = dbs.query(SapnsUser).\
                filter(and_(SapnsUser.user_id != user.user_id,
                            SapnsUser.email_address == email_address,
                            )).\
                first()

            if another:
                raise EUser(_('"E-mail address" is already in use'))

            # user_name
            user.user_name = user_name

            # email_address
            user.email_address = email_address

            if password:
                user.password = password

            dbs.add(user)
            dbs.flush()

            # copy shortcuts and privileges form another user
            if new_user:
                user.copy_from(copy_from)

            return dict(status=True)

        except EUser, e:
            logger.error(e)
            return dict(status=False, message=unicode(e))

        except Exception, e:
            logger.error(e)
            return dict(status=False)
Ejemplo n.º 10
0
class TreeviewController(BaseController):
    allow_only = has_any_permission(gl.perm_admin, gl.perm_user)

    @with_trailing_slash
    @expose('biorepo.templates.treeview')
    @expose('json')
    def index(self, *args, **kw):
        user_lab = session.get("current_lab", None)
        user_projects = []
        u_projects = []
        u_samples = []
        u_meas = []
        u_children = []
        u_global = []

        dico_final = {}
        #TODO : admin view - watch for a dl link
        if user_lab:
            lab = DBSession.query(Labs).filter(Labs.name == user_lab).first()
            lab_users = lab.users
            for u in lab_users:
                projects = DBSession.query(Projects).filter(
                    Projects.user_id == u.id).all()
                if len(projects) > 0:
                    for p in projects:
                        for lab in p.labs:
                            if lab.name == user_lab:
                                user_projects.append(p)
                    for proj in user_projects:
                        for sample in proj.samples:
                            if len(sample.measurements) > 0:
                                for meas in sample.measurements:
                                    if len(meas.children) == 0:
                                        u_meas.append({
                                            "name":
                                            str(meas.name) + "(" +
                                            str(meas.id) + ")"
                                        })
                                    else:
                                        for child in meas.children:
                                            u_children.append({
                                                "name":
                                                str(child.name) + "(" +
                                                str(child.id) + ")"
                                            })
                                        u_meas.append({
                                            "name":
                                            str(meas.name) + "(" +
                                            str(meas.id) + ")",
                                            "children":
                                            u_children
                                        })
                                        u_children = []
                                u_samples.append({
                                    "name":
                                    str(sample.name) + "(" + str(sample.type) +
                                    ")",
                                    "children":
                                    u_meas
                                })
                                u_meas = []
                            else:
                                u_samples.append({
                                    "name":
                                    str(sample.name + "(" + str(sample.type) +
                                        ")")
                                })
                        if len(proj.samples) > 0:
                            u_projects.append({
                                "name": str(proj.project_name),
                                "children": u_samples
                            })
                            u_samples = []
                        else:
                            u_projects.append({"name": str(proj.project_name)})
                    u_global.append({
                        "name": u.firstname + " " + u.name,
                        "children": u_projects
                    })
                    u_projects = []
                    user_projects = []
                #uncomment these 4 lines if you want to see every lab users registered in BioRepo
                #else:
                #u_global.append({"name": u.firstname + " " + u.name})
                #u_projects = []
                #user_projects = []
            dico_final["name"] = user_lab
            dico_final["children"] = u_global
        return {"data": json.dumps(dico_final)}
Ejemplo n.º 11
0
class ProjectController(BaseController):
    allow_only = has_any_permission(constants.permissions['admin']['name'],
                                    constants.permissions['read']['name'])

    @expose('pygdv.templates.project_new')
    def new(self, *args, **kw):
        new_form = form.NewProject(action=url('/projects/create')).req()
        species = DBSession.query(Species).all()
        sp_opts = [(sp.id, sp.name) for sp in species]
        new_form.child.children[2].options = sp_opts
        mapping = json.dumps(
            dict([(sp.id,
                   [(seq.id, seq.name) for seq in sp.sequences
                    if seq.public or handler.genrep.checkright(seq, user)])
                  for sp in species]))
        new_form.value = {'smapping': mapping}
        return dict(page='projects', widget=new_form)

    @with_trailing_slash
    @expose('pygdv.templates.project_edit')
    def edit(self, *args, **kw):
        user = handler.user.get_user_in_session(request)
        if request.method == 'GET':
            project_id = args[0]
        else:
            project_id = kw.get('pid')
        debug("check permission", 1)
        if not checker.check_permission(
                user=user,
                project_id=project_id,
                right_id=constants.right_upload_id) and not checker.is_admin(
                    user=user):
            flash(
                'You must have %s permission to edit the project.' %
                constants.right_upload, 'error')
            raise redirect('/tracks/', {'pid': project_id})
        #if checker.is_admin(user=user):
        #user = DBSession.query(User).join(Project).filter(Project.id == project_id).first()

        widget = form.EditProject(action=url('/projects/edit/%s' %
                                             project_id)).req()
        widget.value = {'pid': project_id}
        project = DBSession.query(Project).filter(
            Project.id == project_id).first()

        # prendre les user tracks du meme sequence id
        tracks = DBSession.query(Track).join(User.tracks).filter(
            and_(User.id == user.id, Track.sequence_id == project.sequence_id,
                 not_(Track.id.in_([t.id for t in project.tracks])))).all()

        # prendre les sared tracks du meme sequence id
        shared_tracks = handler.user.shared_tracks(
            user.id, constants.rights['download']['id'])
        shared_tracks = [
            t for t in shared_tracks
            if (t.sequence_id == project.sequence_id
                and t.id not in [tr.id for tr in project.tracks])
        ]

        tracks.extend(shared_tracks)

        if request.method == 'GET':
            debug("GET", 2)
            widget.child.children[1].value = project.name
            widget.child.children[2].options = [('', '')] + [
                (t.id, t.name) for t in tracks
            ] + [(t.id, t.name, {
                'selected': True
            }) for t in project.tracks]
            return dict(page='tracks', widget=widget, project_id=project_id)
        debug("POST", 2)
        try:
            debug("validate post", 2)
            widget.validate(kw)
        except twc.ValidationError as e:
            debug("error", 2)
            w = e.widget
            w.child.children[1].value = project.name
            w.child.children[2].options = [(t.id, t.name) for t in tracks
                                           ] + [(t.id, t.name, {
                                               'selected': True
                                           }) for t in project.tracks]
            return dict(page='tracks', widget=w, project_id=project_id)
        debug("validation passed")
        track_ids = kw.get('tracks', [])
        if not track_ids:
            track_ids = []
        if not isinstance(track_ids, list):
            track_ids = [track_ids]
        if len(track_ids) > 0 and '' in track_ids:
            track_ids.remove('')

        # if the project is shared, some track cannot be removed
        for t in project.tracks:
            if not checker.user_own_track(
                    user.id, track=t) and t.id not in track_ids and t.id in [
                        s.id for s in shared_tracks
                    ]:
                track_ids.append(t.id)

        handler.project.e(project_id=project_id,
                          name=kw.get('name'),
                          track_ids=track_ids)
        raise redirect('/tracks/', {'pid': project_id})

    @expose('json')
    def get(self, project_key=None, project_id=None, **kw):
        # get all user projects
        if not project_key and not project_id:
            user = handler.user.get_user_in_session(request)
            projects = DBSession.query(Project).filter(
                Project.user_id == user.id).all()
            return reply.normal(request,
                                'You can upload track on these projects',
                                '/tracks', {'projects': projects})
        project = None
        # get one specific user project
        if project_id is not None and project_id:
            user = handler.user.get_user_in_session(request)
            project = DBSession.query(Project).filter(
                Project.id == int(project_id)).first()
            if project is not None and not project.user_id == user.id:
                reply.error(request, 'Not your project', '/tracks', {})
            return reply.normal(request,
                                'You can upload track on this project',
                                '/tracks', {'project': project})
        # get a project by it's key
        project = DBSession.query(Project).filter(
            Project.key == project_key).first()
        if project is None:
            return reply.error(request, 'Wrong key', '/tracks', {})
        return reply.normal(request, 'You can upload track on this project',
                            '/tracks', {'project': project})

    @expose('json')
    def create(self, *args, **kw):
        print 'create %s, %s' % (args, kw)
        user = handler.user.get_user_in_session(request)
        if not 'name' in kw:
            return reply.error(request, 'Missing project `name`.',
                               url('/tracks'), {})

        if not 'assembly' in kw:
            return reply.error(request,
                               'Missing project `assembly` identifier.',
                               url('/tracks'), {})

        sequence = DBSession.query(Sequence).filter(
            Sequence.id == int(kw.get('assembly'))).first()
        if sequence is None:
            return reply.error(request, "Assembly doesn't exist in GDV.", './',
                               {})

        project = handler.project.create(kw['name'], kw['assembly'], user.id)
        return reply.normal(request, 'Project successfully created.',
                            url('/tracks'), {'project': project})

    @expose()
    def post(self, *args, **kw):
        return self.create(*args, **kw)

    @expose('json')
    def delete(self, *args, **kw):
        user = handler.user.get_user_in_session(request)
        if len(args) > 0:
            project_id = args[0]
            if not checker.check_permission(
                    user=user,
                    project_id=project_id,
                    right_id=constants.right_upload_id
            ) and not checker.is_admin(user=user):
                return reply.error(
                    request,
                    "You must have %s permission to delete the project." %
                    constants.right_upload, '/tracks',
                    {'error': 'wrong credentials'})

        handler.project.delete(project_id=project_id)
        return reply.normal(request, 'Project successfully deleted.',
                            '/tracks', {'success': 'project deleted'})

    @expose('pygdv.templates.project_sharing')
    def share(self, *args, **kw):
        user = handler.user.get_user_in_session(request)

        if request.method == 'GET':
            project_id = args[0]
        else:
            project_id = kw.get('pid')

        if not checker.check_permission(
                user=user,
                project_id=project_id,
                right_id=constants.right_upload_id) and not checker.is_admin(
                    user=user):
            flash('You must have %s permission to share the project',
                  'error') % constants.right_upload
            raise redirect('/tracks', {'pid': project_id})

        project = DBSession.query(Project).filter(
            Project.id == project_id).first()
        widget = form.ShareProject(action=url('/projects/share/%s' %
                                              project_id))

        # public url
        pub = url('/public/project', {'id': project_id, 'k': project.key})
        # download url
        if project.download_key is None:
            project.download_key = project.setdefaultkey()
        down = url('/public/project', {
            'id': project_id,
            'k': project.download_key
        })

        widget.value = {'pid': project_id}

        tl = handler.help.help_address(url('help'), '#share',
                                       'sharing projects')

        if request.method == 'POST':
            if kw.has_key('rights'):
                rights_checkboxes = kw.get('rights_checkboxes', None)
                if rights_checkboxes is not None:
                    if not isinstance(rights_checkboxes, list):
                        rights_checkboxes = [rights_checkboxes]
                    handler.project.change_rights(kw.get('pid'),
                                                  kw.get('cid'),
                                                  rights=rights_checkboxes)
                else:
                    handler.project.change_rights(kw.get('pid'), kw.get('cid'))

            else:
                circle_ids = kw.get('circles', [])
                if not circle_ids: circle_ids = []
                if not isinstance(circle_ids, list):
                    circle_ids = [circle_ids]
                if len(circle_ids) > 0 and '' in circle_ids:
                    circle_ids.remove('')
                handler.project.e(project=project, circle_ids=circle_ids)

        debug(project.get_circle_with_right_display)

        cr_data = [
            util.to_datagrid(datagrid.project_sharing, project.circles_rights,
                             "Sharing",
                             len(project.circles_rights) > 0)
        ]

        widget.child.children[1].options =  [('','')] + [(c.id, c.name) for c in user.circles_sharing if c not in project.shared_circles] +\
                                            [(c.id, c.name, {'selected': True}) for c in project.shared_circles]

        return dict(page='projects',
                    public=pub,
                    download=down,
                    name=project.name,
                    tooltip_links=tl,
                    widget=widget,
                    items=cr_data,
                    project_id=project_id)

    @expose('pygdv.templates.view')
    def view(self, project_id, *args, **kw):
        debug('VIEW')
        user = handler.user.get_user_in_session(request)
        if not checker.check_permission(
                project_id=project_id,
                user=user,
                right_id=constants.rights['read']['id']):
            flash(
                'You must have %s permission to view the project.' %
                constants.right_read, 'error')
            raise redirect(url('/'))
        d = handler.view.prepare_view(project_id, *args, **kw)
        response.headerlist.append(('Access-Control-Allow-Origin', '*'))
        return d

    @require(has_permission('admin', msg='Only for admins'))
    @expose('pygdv.templates.admin_project')
    def admin(self):
        projects = DBSession.query(Project).all()
        data_projects = [
            util.to_datagrid(project_admin_grid, projects, "All projects",
                             len(projects) > 0)
        ]
        t = handler.help.tooltip['project']
        return dict(page='projects',
                    model='project',
                    tooltip=t,
                    form_title="new project",
                    projects=data_projects,
                    value={})
Ejemplo n.º 12
0
            # copy shortcuts and privileges form another user
            if new_user:
                user.copy_from(copy_from)

            return dict(status=True)

        except EUser, e:
            logger.error(e)
            return dict(status=False, message=unicode(e))

        except Exception, e:
            logger.error(e)
            return dict(status=False)

    @expose('sapns/users/permission.html')
    @require(predicates.has_any_permission('manage', 'users'))
    def permission(self, came_from='/dashboard/users'):
        return dict(came_from=url(came_from))

    @expose('sapns/users/roles.html')
    @require(predicates.has_any_permission('manage', 'users'))
    @add_language
    def roles(self, id_user, **kw):

        logger = logging.getLogger('UsersController.roles')
        try:
            user = dbs.query(SapnsUser).get(int(id_user))

            roles = []
            for r in dbs.query(SapnsRole).order_by(SapnsRole.group_name):
                #r = SapnsRole()
Ejemplo n.º 13
0
class RolController(BaseController):

    @expose()
    def index(self):
        """Muestra la pantalla inicial"""
        return dict(nombre_modelo='Rol', page='index_rol')      

    @expose('is2sap.templates.rol.nuevo')
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def nuevo(self, **kw):
        """Despliega el formulario para añadir un nuevo Rol."""
        try:
            tmpl_context.form = crear_rol_form
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Creacion de Roles! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/listado")
        except (AttributeError, NameError):
            flash(_("No se pudo acceder a Creacion de Roles! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")

        return dict(nombre_modelo='Rol', page='nuevo_rol', value=kw)

    @validate(crear_rol_form, error_handler=nuevo)
    @expose()
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def add(self, **kw):
        """Metodo para agregar un registro a la base de datos """
        try:
            rol = Rol()
            rol.tipo = kw['tipo']
            rol.nombre_rol = kw['nombre_rol']
            rol.descripcion = kw['descripcion']
            DBSession.add(rol)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha guardado! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")
        except SQLAlchemyError:
            flash(_("No se ha guardado! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/listado")
        except (AttributeError, NameError):
            flash(_("No se ha guardado! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")
        else:
            flash(_("Rol creado!"), 'ok')

        redirect("/admin/rol/listado")

    @expose("is2sap.templates.rol.listado")
    @require(predicates.has_any_permission('administracion'))
    def listado(self,page=1):
        """Metodo para listar todos los Roles existentes de la base de datos"""
        try:
            roles = DBSession.query(Rol).order_by(Rol.id_rol)
            currentPage = paginate.Page(roles, page, items_per_page=10)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Roles! SQLAlchemyError..."), 'error')
            redirect("/admin")
        except (AttributeError, NameError):
            flash(_("No se pudo acceder a Roles! Hay Problemas con el servidor..."), 'error')
            redirect("/admin")

        return dict(roles=currentPage.items, page='listado_rol', currentPage=currentPage)

    @expose('is2sap.templates.rol.editar')
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def editar(self, id_rol, **kw):
        """Metodo que rellena el formulario para editar los datos de un Rol"""
        try:
            tmpl_context.form = editar_rol_form
            traerRol = DBSession.query(Rol).get(id_rol)
            kw['id_rol'] = traerRol.id_rol
            kw['tipo'] = traerRol.tipo
            kw['nombre_rol'] = traerRol.nombre_rol
            kw['descripcion'] = traerRol.descripcion
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Edicion de Roles! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/listado")
        except (AttributeError, NameError):
            flash(_("No se pudo acceder a Edicion de Roles! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")

        return dict(nombre_modelo='Rol', page='editar_rol', value=traerRol)

    @validate(editar_rol_form, error_handler=editar)
    @expose()
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def update(self, **kw):        
        """Metodo que actualizar la base de datos"""
        try:
            rol = DBSession.query(Rol).get(kw['id_rol'])   
            rol.tipo=kw['tipo']
            rol.nombre_rol=kw['nombre_rol']
            rol.descripcion = kw['descripcion']
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se han guardado los cambios! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")
        except SQLAlchemyError:
            flash(_("No se han guardado los cambios! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/listado")
        except (AttributeError, NameError):
            flash(_("No se han guardado los cambios! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")
        else:
            flash(_("Se han guardado los cambios!"), 'ok')

        redirect("/admin/rol/listado")

    @expose('is2sap.templates.rol.confirmar_eliminar')
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def confirmar_eliminar(self, id_rol, **kw):
        """Despliega confirmacion de eliminacion"""
        try:
            rol=DBSession.query(Rol).get(id_rol)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Eliminacion de Roles! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/listado")
        except (AttributeError, NameError):
            flash(_("No se pudo acceder a Eliminacion de Roles! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")

        return dict(nombre_modelo='Rol', page='eliminar_rol', value=rol)

    @expose()
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def delete(self, id_rol, **kw):
        """Metodo que elimina un registro de la base de datos"""
        try:
            DBSession.delete(DBSession.query(Rol).get(id_rol))
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")
        except SQLAlchemyError:
            flash(_("No se ha eliminado! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/listado")
        except (AttributeError, NameError):
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")
        else:
            flash(_("Rol eliminado!"), 'ok')

        redirect("/admin/rol/listado")

    @expose("is2sap.templates.rol.listar_permisos")
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def permisos(self, id_rol, page=1):
        """Metodo para listar todos los permisos que tiene el rol seleccionado"""
        try:
            rol = DBSession.query(Rol).get(id_rol)
            permisos = rol.permisos
            currentPage = paginate.Page(permisos, page, items_per_page=10)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Permisos de Roles! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/listado")
        except (AttributeError, NameError):
            flash(_("No se pudo acceder a Permisos de Roles! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/listado")

        return dict(permisos=currentPage.items, page='listar_permisos', currentPage=currentPage, rol=rol)

    @expose()
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def eliminar_rol_permiso(self, id_rol, id_permiso, **kw):
        """Metodo que elimina un permiso al rol seleccionado"""
        try:
            permiso = DBSession.query(Permiso).get(id_permiso)
            rol = DBSession.query(Rol).get(id_rol)

            if permiso.roles.count(rol) >= 1: 
               permiso.roles.remove(rol)

            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se pudo desasignar el Permiso! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/permisos", id_rol=id_rol)
        except SQLAlchemyError:
            flash(_("No se pudo desasignar el Permiso! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/permisos", id_rol=id_rol)
        except (AttributeError, NameError):
            flash(_("No se pudo desasignar el Permiso! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/permisos", id_rol=id_rol)
        except (ValueError):
            redirect("/admin/rol/permisos", id_rol=id_rol)
        else:
            flash(_("Permiso desasignado!"), 'ok')

        redirect("/admin/rol/permisos", id_rol=id_rol)

    @expose("is2sap.templates.rol.agregar_permisos")
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def rolPermiso(self, id_rol, page=1):
        """Metodo que permite listar los permisos que se pueden agregar al rol seleccionado"""
        try:
            rol = DBSession.query(Rol).get(id_rol)
            permisosRol = rol.permisos
            permisos = DBSession.query(Permiso).all()
        
            for permiso in permisosRol:
                if permisos.count(permiso) >= 1: 
                   permisos.remove(permiso)

            currentPage = paginate.Page(permisos, page, items_per_page=10)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Asignar Permisos! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/permisos", id_rol=id_rol)
        except (AttributeError, NameError):
            flash(_("No se pudo acceder a Asignar Permisos! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/permisos", id_rol=id_rol)

        return dict(permisos=currentPage.items, page='agregar_permisos', 
                    currentPage=currentPage, id_rol=id_rol, rol=rol)

    @expose()
    @require(predicates.has_permission('administracion',  msg=l_('Solo para el Administrador')))
    def agregarPermiso(self, id_rol, id_permiso):
        """Metodo que realiza la agregacion de un permiso al rol selecccionado"""
        try:
            permiso = DBSession.query(Permiso).get(id_permiso)
            rol = DBSession.query(Rol).get(id_rol)
            permiso.roles.append(rol)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:            
            redirect("/admin/rol/rolPermiso",id_rol=id_rol)
        except SQLAlchemyError:
            flash(_("No se pudo asignar el Permiso! SQLAlchemyError..."), 'error')
            redirect("/admin/rol/rolPermiso",id_rol=id_rol)
        except (AttributeError, NameError):
            flash(_("No se pudo asignar el Permiso! Hay Problemas con el servidor..."), 'error')
            redirect("/admin/rol/rolPermiso",id_rol=id_rol)
        else:
            flash(_("Permiso asignado!"), 'ok')

        redirect("/admin/rol/rolPermiso",id_rol=id_rol)
Ejemplo n.º 14
0
class PermisoController(BaseController):
    @expose()
    def index(self):
        """Muestra la pantalla inicial"""
        return dict(nombre_modelo='Permiso', page='index_permiso')

    @expose('is2sap.templates.permiso.nuevo')
    @require(
        predicates.has_permission('administracion',
                                  msg=l_('Solo para el Administrador')))
    def nuevo(self, **kw):
        """Despliega el formulario para añadir un nuevo Permiso."""
        try:
            tmpl_context.form = crear_permiso_form
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Creacion de Permisos! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/permiso/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Creacion de Permisos! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/permiso/listado")

        return dict(nombre_modelo='Permiso', page='nuevo_permiso', value=kw)

    @validate(crear_permiso_form, error_handler=nuevo)
    @expose()
    @require(
        predicates.has_permission('administracion',
                                  msg=l_('Solo para el Administrador')))
    def add(self, **kw):
        """Metodo para agregar un registro a la base de datos """
        try:
            permiso = Permiso()
            permiso.nombre_permiso = kw['nombre_permiso']
            permiso.descripcion = kw['descripcion']
            DBSession.add(permiso)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/permiso/listado")
        except SQLAlchemyError:
            flash(_("No se ha guardado! SQLAlchemyError..."), 'error')
            redirect("/admin/permiso/listado")
        except (AttributeError, NameError):
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/permiso/listado")
        else:
            flash(_("Permiso creado!"), 'ok')

        redirect("/admin/permiso/listado")

    @expose("is2sap.templates.permiso.listado")
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def listado(self, page=1):
        """Metodo para listar todos los Permisos existentes de la base de datos"""
        try:
            permisos = DBSession.query(Permiso).order_by(Permiso.id_permiso)
            currentPage = paginate.Page(permisos, page, items_per_page=10)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Permisos! SQLAlchemyError..."),
                  'error')
            redirect("/admin")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Permisos! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin")
        return dict(permisos=currentPage.items,
                    page='listado_permiso',
                    currentPage=currentPage)

    @expose('is2sap.templates.permiso.editar')
    @require(
        predicates.has_permission('administracion',
                                  msg=l_('Solo para el Administrador')))
    def editar(self, id_permiso, **kw):
        """Metodo que rellena el formulario para editar los datos de un Permiso"""
        try:
            tmpl_context.form = editar_permiso_form
            traerPermiso = DBSession.query(Permiso).get(id_permiso)
            kw['id_permiso'] = traerPermiso.id_permiso
            kw['nombre_permiso'] = traerPermiso.nombre_permiso
            kw['descripcion'] = traerPermiso.descripcion
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Edicion de Permisos! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/permiso/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Edicion de Permisos! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/permiso/listado")

        return dict(nombre_modelo='Permiso', page='editar_permiso', value=kw)

    @validate(editar_permiso_form, error_handler=editar)
    @expose()
    @require(
        predicates.has_permission('administracion',
                                  msg=l_('Solo para el Administrador')))
    def update(self, **kw):
        """Metodo que actualizar la base de datos"""
        try:
            permiso = DBSession.query(Permiso).get(kw['id_permiso'])
            permiso.nombre_permiso = kw['nombre_permiso']
            permiso.descripcion = kw['descripcion']
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/permiso/listado")
        except SQLAlchemyError:
            flash(_("No se han guardado los cambios! SQLAlchemyError..."),
                  'error')
            redirect("/admin/permiso/listado")
        except (AttributeError, NameError):
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/permiso/listado")
        else:
            flash(_("Se han guardado los cambios!"), 'ok')

        redirect("/admin/permiso/listado")

    @expose('is2sap.templates.permiso.confirmar_eliminar')
    @require(
        predicates.has_permission('administracion',
                                  msg=l_('Solo para el Administrador')))
    def confirmar_eliminar(self, id_permiso, **kw):
        """Despliega confirmacion de eliminacion"""
        try:
            permiso = DBSession.query(Permiso).get(id_permiso)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Eliminacion de Permisos! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/permiso/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Eliminacion de Permisos! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/permiso/listado")

        return dict(nombre_modelo='Permiso',
                    page='eliminar_permiso',
                    value=permiso)

    @expose()
    @require(
        predicates.has_permission('administracion',
                                  msg=l_('Solo para el Administrador')))
    def delete(self, id_permiso, **kw):
        """Metodo que elimina un registro de la base de datos"""
        try:
            DBSession.delete(DBSession.query(Permiso).get(id_permiso))
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/permiso/listado")
        except SQLAlchemyError:
            flash(_("No se ha eliminado! SQLAlchemyError..."), 'error')
            redirect("/admin/permiso/listado")
        except (AttributeError, NameError):
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/permiso/listado")
        else:
            flash(_("Permiso eliminado!"), 'ok')

        redirect("/admin/permiso/listado")
Ejemplo n.º 15
0
class CircleController(BaseController):
    allow_only = has_any_permission(constants.permissions['admin']['name'], constants.permissions['read']['name'])

    def new(self, *args, **kw):
        widget = form.NewCircle(action=url('/circles/new')).req()
        if request.method == 'GET':
            return dict(page='circles', model='circle', widget=widget)
        else:
            try:
                widget.validate(kw)
            except twc.ValidationError as e:
                return dict(page='circles', model='circle', widget=e.widget)
        user = handler.user.get_user_in_session(request)
        handler.circle.create(kw['name'], kw['description'], user)
        raise redirect('/circles')

    @expose('pygdv.templates.circle_index')
    @with_trailing_slash
    def index(self, *args, **kw):
        kw['page'] = 'circle'
        user = handler.user.get_user_in_session(request)

        data = util.to_datagrid(datagrid.circle_grid, user.circles_owned, grid_display=len(user.circles) > 0)
        t = handler.help.help_address(url('/help'), 'circles', 'help about circles')

        widget = form.NewCircle(action=url('/circles/index')).req()
        if request.method == 'GET':
            return dict(page='circles', item=data, tooltip=t, widget=widget)
        else:
            try:
                widget.validate(kw)
            except twc.ValidationError as e:
                return dict(page='circles',  item=data, tooltip=t, widget=e.widget, ac_error=True)

        user = handler.user.get_user_in_session(request)
        handler.circle.create(kw['name'], kw['description'], user)
        data = util.to_datagrid(datagrid.circle_grid, user.circles_owned, grid_display=len(user.circles) > 0)
        return dict(page='circles', model='circle', item=data, widget=widget, tooltip=t)

    @expose()
    def delete(self, circle_id, *args, **kw):
        user = handler.user.get_user_in_session(request)
        if not checker.user_own_circle(user.id, circle_id):
            flash('you have no right to delete this circle: you are not the creator of it')
            raise redirect('/circles')
        circle = DBSession.query(Circle).filter(Circle.id == circle_id).first()
        DBSession.delete(circle)
        DBSession.flush()
        raise redirect('/circles/')

    @expose()
    def delete_user(self, id, user_id):
        user = handler.user.get_user_in_session(request)
        if not checker.user_own_circle(user.id, id):
            flash('you have no rights to delete users from this circle: you are not the creator of it')
            raise redirect('/circles')
        circle = DBSession.query(Circle).filter(Circle.id == id).first()
        to_delete = DBSession.query(User).filter(User.id == user_id).first()
        circle.users.remove(to_delete)
        DBSession.flush()
        raise redirect('/circles/edit/%s' % id)

    @expose('pygdv.templates.circle_edit')
    @with_trailing_slash
    def edit(self, *args, **kw):
        user = handler.user.get_user_in_session(request)

        t = handler.help.tooltip['circledesc']

        # get circle id
        if request.method == 'GET':
            circle_id = args[0]
        else:
            circle_id = kw.get('cid')
        circle_id = int(circle_id)

        if circle_id not in [c.id for c in user.circles_owned]:
            flash('You have no right to edit this circle', 'error')
            raise redirect('/circles/')
        circle = DBSession.query(Circle).filter(Circle.id == circle_id).first()
        widget = form.AddUser(action=url('/circles/edit/%s' % circle_id)).req()

        if request.method == 'POST':
            # add user
            mail = kw.get('mail')
            try:
                widget.validate({'cid': circle_id, 'mail': mail})
            except twc.ValidationError as e:
                for u in circle.users:
                    u.__dict__['cid'] = circle_id
                wrappers = [u for u in circle.users if u.id != user.id]
                data = [util.to_datagrid(datagrid.circle_description_grid, wrappers, grid_display=len(wrappers) > 0)]
                return dict(page='circles', name=circle.name, widget=e.widget, items=data, value=kw, tooltip=t, au_error=True)
            mail = mail.lower()
            to_add = DBSession.query(User).filter(User.email == mail).first()
            if to_add is None:
                to_add = handler.user.create_tmp_user(mail)
            handler.circle.add_user(circle_id=circle_id, user=to_add)

        # build common parameters
        if not checker.user_own_circle(user.id, circle_id):
            flash('you have no right to edit this circle: you are not the creator of it')
            raise redirect('/circles')

        for u in circle.users:
            u.__dict__['cid'] = circle_id
        wrappers = [u for u in circle.users if u.id != user.id]

        data = [util.to_datagrid(datagrid.circle_description_grid, wrappers, grid_display=len(wrappers) > 0)]

        kw['cid'] = circle_id
        widget.value = kw
        return dict(page='circles', name=circle.name, widget=widget, items=data, tooltip=t)

#    @expose()
#    @validate(circle_edit_form, error_handler=edit)
#    def put(self, *args, **kw):
#        user = handler.user.get_user_in_session(request)
#        circle_id = args[0]
#        circle = DBSession.query(Circle).filter(Circle.id == circle_id).first()
#        if not checker.user_own_circle(user.id, circle_id):
#            flash('you have no right to edit this circle: you are not the creator of it')
#            raise redirect('/circles')
#        handler.circle.edit(circle, kw['name'], kw['description'], user, kw['users'])
#        raise redirect('/circles')

    @require(has_permission('admin', msg='Only for admins'))
    @expose('pygdv.templates.list')
    def admin(self):
        c = DBSession.query(Circle).all()
        dc = [util.to_datagrid(circle_grid, c, "All circles", len(c) > 0)]
        t = handler.help.tooltip['circle']
        return dict(page='circles', model='circle', tooltip=t, items=dc, value={})
Ejemplo n.º 16
0
 def test_user_has_one_permission(self):
     environ = make_environ('gustavo',
                            permissions=['watch-tv', 'party', 'eat'])
     p = predicates.has_any_permission('party', 'scream')
     self.eval_met_predicate(p, environ)
Ejemplo n.º 17
0
class SelectionController(object):
    allow_only = has_any_permission(constants.permissions['admin']['name'],
                                    constants.permissions['read']['name'])

    @expose()
    def index(self):
        return ''

    @expose()
    def save(self, project_id, color, description, locations):
        user = handler.user.get_user_in_session(request)

        if not checker.check_permission(user=user,
                                        project_id=project_id,
                                        right_id=constants.right_upload_id):
            flash(
                'You must have %s permission to delete the project.' %
                constants.right_upload, 'error')
            return {'save': 'failed'}

        #print "save %s, color %s, desc %s loc %s" % (project_id, color, description, locations)
        ''' For the moment, there is only one selection per project'''
        sel = DBSession.query(Selection).filter(
            Selection.project_id == project_id).first()
        if sel is None:
            sel = Selection()
            sel.project_id = project_id

        sel.description = description
        sel.color = color
        DBSession.add(sel)
        DBSession.flush()

        locations_ids = []
        # add locations
        for loc in json.loads(locations):
            obj = None
            if 'id' in loc:
                obj = DBSession.query(Location).join(
                    Selection.locations).filter(
                        and_(Selection.id == sel.id,
                             Location.id == loc.get('id'))).first()

            if obj is None:
                obj = Location()

            obj.chromosome = loc.get('chr')
            obj.start = loc.get('start')
            obj.end = loc.get('end')
            obj.description = loc.get('desc', 'No description')
            obj.selection = sel
            DBSession.add(obj)
            DBSession.flush()
            locations_ids.append(obj.id)
        # remove not saved ones
        loc_to_remove = DBSession.query(Location).filter(
            not_(Location.id.in_(locations_ids))).all()
        for l in loc_to_remove:
            DBSession.delete(l)
        DBSession.flush()
        return {"saved": "ok"}

    @expose()
    def delete(self, project_id, selection_id):
        user = handler.user.get_user_in_session(request)
        if not checker.check_permission(user=user,
                                        project_id=project_id,
                                        right_id=constants.right_upload_id):
            flash(
                'You must have %s permission to delete the project.' %
                constants.right_upload, 'error')
            return {'delete': 'failed'}
        selection = DBSession.query(Selection).filter(
            Selection.id == selection_id).first()
        if not selection.project_id == project_id:
            flash('Bad project_id: %s' % project_id, 'error')
            return {'delete': 'failed'}
        DBSession.delete(selection)
        DBSession.flush()
        return {'delete': 'success'}

    @expose()
    def get(self, selection_id):
        sel = DBSession.query(Selection).filter(
            Selection.id == selection_id).first()
        b = ''
        for loc in sel.locations:
            b += '%s\t%s\t%s' % (loc.chromosome, loc.start, loc.end)
        return b
Ejemplo n.º 18
0
class ProyectoController(BaseController):
    @expose()
    def index(self):
        """Muestra la pantalla inicial"""
        return dict(nombre_modelo='Proyecto', page='index_proyecto')

    @expose('is2sap.templates.proyecto.nuevo')
    @require(predicates.has_any_permission('administracion'))
    def nuevo(self, **kw):
        """Despliega el formulario para añadir un nuevo Proyecto."""
        try:
            tmpl_context.form = crear_proyecto_form
            usuario_id = DBSession.query(Usuario.id_usuario).filter_by(
                nombre_usuario=request.identity['repoze.who.userid']).first()
            kw['id_usuario'] = usuario_id
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Creacion de Proyectos! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Creacion de Proyecto! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listado")

        return dict(nombre_modelo='Proyecto', page='nuevo_proyecto', value=kw)

    @validate(crear_proyecto_form, error_handler=nuevo)
    @expose()
    @require(predicates.has_any_permission('administracion'))
    def add(self, **kw):
        """Metodo para agregar un registro a la base de datos """
        try:
            proyecto = Proyecto()
            proyecto.id_usuario = kw['id_usuario']
            proyecto.nombre = kw['nombre']
            proyecto.descripcion = kw['descripcion']
            proyecto.fecha = kw['fecha']
            proyecto.iniciado = kw['iniciado']
            DBSession.add(proyecto)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/proyecto/listado")
        except SQLAlchemyError:
            flash(_("No se ha guardado! SQLAlchemyError..."), 'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/proyecto/listado")
        else:
            flash(_("Proyecto creado!"), 'ok')

        redirect("/admin/proyecto/listado")

    @expose("is2sap.templates.proyecto.listado")
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def listado(self, page=1):
        """Metodo para listar todos los Proyectos existentes de la base de datos"""
        try:
            proyectos = []
            if predicates.has_permission('administracion'):
                proyectos = DBSession.query(Proyecto).order_by(
                    Proyecto.id_proyecto)
            elif predicates.has_permission('lider_proyecto'):
                usuario = DBSession.query(Usuario).filter_by(
                    nombre_usuario=request.identity['repoze.who.userid']
                ).first()
                proyectos = usuario.proyectos
            currentPage = paginate.Page(proyectos, page, items_per_page=10)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Proyectos! SQLAlchemyError..."),
                  'error')
            redirect("/admin")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Proyectos! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin")

        return dict(proyectos=currentPage.items,
                    page='listado_proyecto',
                    currentPage=currentPage)

    @expose('is2sap.templates.proyecto.editar')
    @require(predicates.has_any_permission('administracion'))
    def editar(self, id_proyecto, **kw):
        """Metodo que rellena el formulario para editar los datos de un Proyecto"""
        try:
            tmpl_context.form = editar_proyecto_form
            traerProyecto = DBSession.query(Proyecto).get(id_proyecto)

            if traerProyecto.iniciado:
                flash(
                    _("El proyecto no puede modificarse porque ya se encuentra iniciado."
                      ), 'error')
                redirect("/admin/proyecto/listado")

            kw['id_proyecto'] = traerProyecto.id_proyecto
            kw['id_usuario'] = traerProyecto.id_usuario
            kw['nombre'] = traerProyecto.nombre
            kw['descripcion'] = traerProyecto.descripcion
            kw['fecha'] = traerProyecto.fecha
            kw['iniciado'] = traerProyecto.iniciado
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Edicion de Proyectos! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Edicion de Proyecto! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listado")

        return dict(nombre_modelo='Proyecto', page='editar_proyecto', value=kw)

    @validate(editar_proyecto_form, error_handler=editar)
    @expose()
    @require(predicates.has_any_permission('administracion'))
    def update(self, **kw):
        """Metodo que actualiza la base de datos"""
        try:
            proyecto = DBSession.query(Proyecto).get(kw['id_proyecto'])
            proyecto.id_usuario = kw['id_usuario']
            proyecto.nombre = kw['nombre']
            proyecto.descripcion = kw['descripcion']
            proyecto.fecha = kw['fecha']
            proyecto.inciado = kw['iniciado']
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listado")
        except SQLAlchemyError:
            flash(_("No se han guardado los cambios! SQLAlchemyError..."),
                  'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listado")
        else:
            flash(_("Se han guardado los cambios!"), 'ok')

        redirect("/admin/proyecto/listado")

    @expose('is2sap.templates.proyecto.confirmar_eliminar')
    @require(predicates.has_any_permission('administracion'))
    def confirmar_eliminar(self, id_proyecto, **kw):
        """Despliega confirmacion de eliminacion"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            if proyecto.iniciado == True:
                flash(_("Proyecto ya iniciado. No puede eliminar!"), 'error')
                redirect("/admin/proyecto/listado")
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Eliminacion de Proyecto! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Eliminacion de Proyecto! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listado")

        return dict(nombre_modelo='Proyecto',
                    page='eliminar_proyecto',
                    value=proyecto)

    @expose()
    @require(predicates.has_any_permission('administracion'))
    def delete(self, id_proyecto, **kw):
        """Metodo que elimina un registro de la base de datos"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            fases = proyecto.fases

            for fase in fases:
                id_fase = fase.id_fase
                tipo_items = DBSession.query(TipoItem).filter_by(
                    id_fase=id_fase).all()
                for tipo_item in tipo_items:
                    id_tipo_item = tipo_item.id_tipo_item
                    atributos = DBSession.query(Atributo).filter_by(
                        id_tipo_item=id_tipo_item).all()
                    for atributo in atributos:
                        DBSession.delete(
                            DBSession.query(Atributo).get(
                                atributo.id_atributo))
                    DBSession.delete(
                        DBSession.query(TipoItem).get(id_tipo_item))
                DBSession.delete(DBSession.query(Fase).get(id_fase))

            DBSession.delete(DBSession.query(Proyecto).get(id_proyecto))
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se pudo eliminar! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/proyecto/listado")
        except SQLAlchemyError:
            flash(_("No se pudo eliminar! SQLAlchemyError..."), 'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(_("No se pudo eliminar! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/proyecto/listado")
        else:
            flash(_("Proyecto eliminado!"), 'ok')

        redirect("/admin/proyecto/listado")

    @expose("is2sap.templates.proyecto.listar_roles")
    @require(predicates.has_any_permission('lider_proyecto'))
    def roles(self, id_proyecto, page=1):
        """Metodo para listar todos los roles que tiene el proyecto seleccionado"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            id_proyecto = proyecto.id_proyecto
            roles = proyecto.roles
            currentPage = paginate.Page(roles, page, items_per_page=10)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Roles del Proyecto! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Roles del Proyecto! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listado")

        return dict(roles=currentPage.items,
                    page='listar_roles',
                    currentPage=currentPage,
                    id_proyecto=id_proyecto,
                    proyecto=proyecto)

    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def eliminar_rol_proyecto(self, id_proyecto, id_rol, **kw):
        """Metodo que elimina un rol al proyecto seleccionado"""
        try:
            rol = DBSession.query(Rol).get(id_rol)
            proyecto = DBSession.query(Proyecto).get(id_proyecto)

            if rol.proyectos.count(proyecto) >= 1:
                rol.proyectos.remove(proyecto)
            DBSession.flush()

            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se ha desasignado dicho Rol! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/roles", id_proyecto=id_proyecto)
        except SQLAlchemyError:
            flash(_("No se ha desasignado dicho Rol! SQLAlchemyError..."),
                  'error')
            redirect("/admin/proyecto/roles", id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se ha desasignado decho Rol! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/roles", id_proyecto=id_proyecto)
        else:
            flash(_("Rol desasignado!"), 'ok')

        redirect("/admin/proyecto/roles", id_proyecto=id_proyecto)

    @expose("is2sap.templates.proyecto.agregar_roles")
    @require(predicates.has_any_permission('lider_proyecto'))
    def rolProyecto(self, id_proyecto, page=1):
        """Metodo que permite listar los roles que se pueden agregar al proyecto seleccionado"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            id_proyecto = proyecto.id_proyecto
            rolesProyecto = proyecto.roles
            roles = DBSession.query(Rol).filter_by(tipo="Proyecto").order_by(
                Rol.id_rol).all()

            for rol in rolesProyecto:
                if roles.count(rol) >= 1:
                    roles.remove(rol)

            currentPage = paginate.Page(roles, page, items_per_page=10)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Agregar Roles al Proyecto! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/proyecto/roles", id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Agregar Roles al Proyecto! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/roles", id_proyecto=id_proyecto)

        return dict(roles=currentPage.items,
                    page='agregar_roles',
                    currentPage=currentPage,
                    id_proyecto=id_proyecto,
                    proyecto=proyecto)

    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def agregarRol(self, id_proyecto, id_rol):
        """Metodo que realiza la agregacion de un rol al proyecto selecccionado"""
        try:
            rol = DBSession.query(Rol).get(id_rol)
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            rol.proyectos.append(proyecto)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se ha asignado dicho Rol! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/rolProyecto", id_proyecto=id_proyecto)
        except SQLAlchemyError:
            flash(_("No se ha asignado dicho Rol! SQLAlchemyError..."),
                  'error')
            redirect("/admin/proyecto/rolProyecto", id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se ha asignado decho Rol! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/rolProyecto", id_proyecto=id_proyecto)
        else:
            flash(_("Rol asignado!"), 'ok')

        redirect("/admin/proyecto/rolProyecto", id_proyecto=id_proyecto)

    @expose("is2sap.templates.proyecto.listar_usuarios")
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def usuarios(self, id_proyecto, page=1):
        """Metodo para listar todos los usuarios que tiene el proyecto seleccionado"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            id_proyecto = proyecto.id_proyecto
            usuarios = proyecto.usuarios
            currentPage = paginate.Page(usuarios, page, items_per_page=10)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Usuarios del Proyecto! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Usuarios del Proyecto! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listado")

        return dict(usuarios=currentPage.items,
                    page='listar_usuarios',
                    id_proyecto=id_proyecto,
                    currentPage=currentPage,
                    proyecto=proyecto)

    @expose()
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def eliminar_usuario_proyecto(self, id_proyecto, id_usuario, **kw):
        """Metodo que elimina un usuario al proyecto seleccionado"""
        try:
            usuario = DBSession.query(Usuario).get(id_usuario)
            proyecto = DBSession.query(Proyecto).get(id_proyecto)

            if usuario.proyectos.count(proyecto) >= 1:
                usuario.proyectos.remove(proyecto)

            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se ha desasignado dicho Usuario! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/usuarios", id_proyecto=id_proyecto)
        except SQLAlchemyError:
            flash(_("No se ha desasignado dicho Usuario! SQLAlchemyError..."),
                  'error')
            redirect("/admin/proyecto/usuarios", id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se ha desasignado decho Usuario! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/usuarios", id_proyecto=id_proyecto)
        else:
            flash(_("Usuario desasignado!"), 'ok')

        redirect("/admin/proyecto/usuarios", id_proyecto=id_proyecto)

    @expose("is2sap.templates.proyecto.agregar_usuarios")
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def usuarioProyecto(self, id_proyecto, page=1):
        """Metodo que permite listar los usuarios que se pueden agregar al proyecto seleccionado"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            id_proyecto = proyecto.id_proyecto
            usuariosProyecto = proyecto.usuarios
            usuarios = DBSession.query(Usuario).order_by(
                Usuario.id_usuario).all()

            for usuario in usuariosProyecto:
                if usuarios.count(usuario) >= 1:
                    usuarios.remove(usuario)

            currentPage = paginate.Page(usuarios, page, items_per_page=10)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Agregar Usuarios al Proyecto! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/proyecto/usuarios", id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Agregar Usuarios al Proyecto! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/usuarios", id_proyecto=id_proyecto)

        return dict(usuarios=currentPage.items,
                    page='agregar_usuarios',
                    currentPage=currentPage,
                    id_proyecto=id_proyecto,
                    proyecto=proyecto)

    @expose()
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def agregarUsuario(self, id_proyecto, id_usuario):
        """Metodo que realiza la agregacion de un usuario al proyecto selecccionado"""
        try:
            usuario = DBSession.query(Usuario).get(id_usuario)
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            usuario.proyectos.append(proyecto)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se ha asignado dicho Usuario! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/usuarioProyecto",
                     id_proyecto=id_proyecto)
        except SQLAlchemyError:
            flash(_("No se ha asignado dicho Usuario! SQLAlchemyError..."),
                  'error')
            redirect("/admin/proyecto/usuarioProyecto",
                     id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se ha asignado decho Usuario! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/usuarioProyecto",
                     id_proyecto=id_proyecto)
        else:
            flash(_("Usuario asignado!"), 'ok')

        redirect("/admin/proyecto/usuarioProyecto", id_proyecto=id_proyecto)

    @expose("is2sap.templates.proyecto.listaProyectos_a_iniciar")
    @require(predicates.has_any_permission('lider_proyecto'))
    def listaProyectos_a_iniciar(self, page=1):
        """Metodo para listar todos los Proyectos a iniciar de la base de datos"""
        try:
            proy = DBSession.query(Proyecto).filter_by(
                iniciado=False).order_by(Proyecto.id_proyecto)
            usuario = DBSession.query(Usuario).filter_by(
                nombre_usuario=request.identity['repoze.who.userid']).first()
            proyectos = []
            for p in proy:
                if usuario.proyectos.count(p) == 1:
                    proyectos.append(p)
            currentPage = paginate.Page(proyectos, page, items_per_page=10)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Proyectos! SQLAlchemyError..."),
                  'error')
            redirect("/admin")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Proyectos! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin")

        return dict(proyectos=currentPage.items,
                    page='listaProyectos_a_iniciar',
                    currentPage=currentPage)

    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def iniciar(self, id_proyecto, **kw):
        """Metodo que da inicio a un proyecto"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            fases = proyecto.fases
            id_proyecto = proyecto.id_proyecto
            maxnumerofase = DBSession.query(func.max(
                Fase.numero_fase)).filter_by(id_proyecto=id_proyecto).first()

            if maxnumerofase[0] == None:
                flash(
                    _("El Proyecto se encuentra sin fases! No puede iniciar..."
                      ), 'error')
                redirect("/admin/proyecto/listaProyectos_a_iniciar")
            else:
                proyecto.iniciado = True
                for fase in fases:
                    if fase.numero_fase == 1:
                        fase.id_estado_fase = '2'

                DBSession.flush()
                transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se ha realizado la inicializacion! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listaProyectos_a_iniciar")
        except SQLAlchemyError:
            flash(
                _("No se ha realizado la inicializacion! SQLAlchemyError..."),
                'error')
            redirect("/admin/proyecto/listaProyectos_a_iniciar")
        except (AttributeError, NameError):
            flash(
                _("No se ha realizado la inicializacion! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listaProyectos_a_iniciar")
        else:
            flash(_("Proyecto iniciado!"), 'ok')

        redirect("/admin/proyecto/listaProyectos_a_iniciar")

    @expose("is2sap.templates.proyecto.rolesProyectoUsuario")
    @require(predicates.has_any_permission('lider_proyecto'))
    def rolesProyectoUsuario(self, id_proyecto, id_usuario, page=1):
        """Metodo para listar todos los roles que tiene el usuario seleccionado"""
        try:
            usuario = DBSession.query(Usuario).get(id_usuario)
            rolesProyecto = DBSession.query(Rol).filter_by(
                tipo="Proyecto").all()
            roles = []
            for rol in rolesProyecto:
                if usuario.roles.count(rol) == 1:
                    roles.append(rol)

            currentPage = paginate.Page(roles, page, items_per_page=10)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Roles de Usuario! SQLAlchemyError..."),
                'error')
            redirect("/admin/proyecto/usuarios", id_proyecto=id_proyecto)
        except (AttributeError, NameError, ValueError):
            flash(
                _("No se pudo acceder a Roles de Usuario! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/usuarios", id_proyecto=id_proyecto)
        return dict(roles=currentPage.items,
                    page='rolesProyectoUsuario',
                    currentPage=currentPage,
                    usuario=usuario,
                    id_proyecto=id_proyecto)

    @expose("is2sap.templates.proyecto.agregarRolUsuario")
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def agregarRolUsuario(self, id_usuario, id_proyecto, page=1):
        """Metodo que permite listar los roles que se pueden agregar al usuario seleccionado"""
        try:
            usuario = DBSession.query(Usuario).get(id_usuario)
            rolesUsuario = usuario.roles
            rolesDB = DBSession.query(Rol).filter_by(tipo="Proyecto").all()
            roles = []
            for rol in rolesDB:
                if rolesUsuario.count(rol) == 0:
                    roles.append(rol)

            currentPage = paginate.Page(roles, page, items_per_page=10)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Agregar Roles! SQLAlchemyError..."),
                  'error')
            redirect("/admin/proyecto/agregarRolUsuario",
                     id_usuario=id_usuario,
                     id_proyecto=id_proyecto)
        except (AttributeError, NameError, ValueError):
            flash(
                _("No se pudo acceder a Agregar Roles! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/agregarRolUsuario",
                     id_usuario=id_usuario,
                     id_proyecto=id_proyecto)

        return dict(roles=currentPage.items,
                    page='agregar_roles',
                    currentPage=currentPage,
                    id_usuario=id_usuario,
                    usuario=usuario,
                    id_proyecto=id_proyecto)

    @expose()
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def agregarRolUser(self, id_usuario, id_rol, id_proyecto):
        """Metodo que realiza la agregacion de un rol al usuario selecccionado"""
        try:
            rol = DBSession.query(Rol).get(id_rol)
            usuario = DBSession.query(Usuario).get(id_usuario)
            rol.usuarios.append(usuario)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se pudo Asignar Rol! Hay Problemas con el servidor..."),
                'error')
            redirect("/admin/proyecto/rolesProyectoUsuario",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario)
        except SQLAlchemyError:
            flash(_("No se pudo Asignar Rol! SQLAlchemyError..."), 'error')
            redirect("/admin/proyecto/rolesProyectoUsuario",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario)
        except (AttributeError, NameError):
            flash(
                _("No se pudo Asignar Rol! Hay Problemas con el servidor..."),
                'error')
            redirect("/admin/proyecto/rolesProyectoUsuario",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario)
        else:
            flash(_("Rol asignado!"), 'ok')

        redirect("/admin/proyecto/rolesProyectoUsuario",
                 id_proyecto=id_proyecto,
                 id_usuario=id_usuario)

    @expose()
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def eliminar_rol_usuario(self, id_usuario, id_rol, id_proyecto, **kw):
        """Metodo que elimina un rol al usuario seleccionado"""
        try:
            rol = DBSession.query(Rol).get(id_rol)
            usuario = DBSession.query(Usuario).get(id_usuario)
            if rol.usuarios.count(usuario) >= 1:
                rol.usuarios.remove(usuario)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se pudo Desasignar Rol! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/rolesProyectoUsuario",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario)
        except SQLAlchemyError:
            flash(_("No se pudo Desasignar Rol! SQLAlchemyError..."), 'error')
            redirect("/admin/proyecto/rolesProyectoUsuario",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario)
        except (AttributeError, NameError):
            flash(
                _("No se pudo Desasignar Rol! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/rolesProyectoUsuario",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario)
        else:
            flash(_("Rol desasignado!"), 'ok')

        redirect("/admin/proyecto/rolesProyectoUsuario",
                 id_proyecto=id_proyecto,
                 id_usuario=id_usuario)

    @expose("is2sap.templates.proyecto.listadoPermisoFase")
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def listadoPermisoFase(self, id_usuario, id_rol, id_proyecto, page=1):
        """Metodo que permite listar los roles que se pueden agregar al usuario seleccionado"""
        try:
            roles = DBSession.query(Rol).get(id_rol)
            rolesFases = roles.fases
            rolesFases1 = roles.fases
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            listaFases = []

            for fase in rolesFases:
                if proyecto.fases.count(fase) == 0:
                    rolesFases.remove(fase)

            for fase in proyecto.fases:
                if rolesFases1.count(fase) == 0:
                    listaFases.append(fase)
            currentPage = paginate.Page(rolesFases, page, items_per_page=10)
        except SQLAlchemyError:
            flash(_("No se pudo acceder a Listado Fases! SQLAlchemyError..."),
                  'error')
            redirect("/admin/proyecto/rolesProyectoUsuario",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Agregar Roles! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/rolesProyectoUsuario",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario)

        return dict(rolesFases=currentPage.items,
                    page='agregar_roles',
                    currentPage=currentPage,
                    id_usuario=id_usuario,
                    id_proyecto=id_proyecto,
                    fasesRestantes=listaFases,
                    id_rol=id_rol)

    @expose()
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def agregarPermisoFase(self,
                           id_usuario,
                           id_rol,
                           id_proyecto,
                           id_fase,
                           page=1):
        """Metodo que permite listar los roles que se pueden agregar al usuario seleccionado"""
        try:
            roles = DBSession.query(Rol).get(id_rol)
            fase = DBSession.query(Fase).get(id_fase)
            usuario = DBSession.query(Usuario).get(id_usuario)
            roles.fases.append(fase)
            usuario.fases.append(fase)

        except SQLAlchemyError:
            redirect("/admin/proyecto/listadoPermisoFase",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario,
                     id_rol=id_rol)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Agregar Roles! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listadoPermisoFase",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario,
                     id_rol=id_rol)

        redirect("/admin/proyecto/listadoPermisoFase",
                 id_proyecto=id_proyecto,
                 id_usuario=id_usuario,
                 id_rol=id_rol)

    @expose()
    @require(predicates.has_any_permission('administracion', 'lider_proyecto'))
    def eliminarPermisoFase(self,
                            id_usuario,
                            id_rol,
                            id_proyecto,
                            id_fase,
                            page=1):
        """Metodo que permite listar los roles que se pueden agregar al usuario seleccionado"""
        try:
            roles = DBSession.query(Rol).get(id_rol)
            fase = DBSession.query(Fase).get(id_fase)
            usuario = DBSession.query(Usuario).get(id_usuario)

            if roles.fases.count(fase) >= 1:
                roles.fases.remove(fase)

            if usuario.fases.count(fase) >= 1:
                usuario.fases.remove(fase)

        except SQLAlchemyError:
            flash(_("No se pudo acceder a Listado Fases! SQLAlchemyError..."),
                  'error')
            redirect("/admin/proyecto/listadoPermisoFase",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario,
                     id_rol=id_rol)
        except (AttributeError, NameError, ValueError):
            redirect("/admin/proyecto/listadoPermisoFase",
                     id_proyecto=id_proyecto,
                     id_usuario=id_usuario,
                     id_rol=id_rol)

        redirect("/admin/proyecto/listadoPermisoFase",
                 id_proyecto=id_proyecto,
                 id_usuario=id_usuario,
                 id_rol=id_rol)
Ejemplo n.º 19
0
class PluginController(BaseController):
    allow_only = has_any_permission(constants.permissions['admin']['name'],
                                    constants.permissions['read']['name'])

    @expose()
    def get(self, *args, **kw):
        bsurl = handler.job.bioscript_url
        bsrequesturl = bsurl + '/plugins/fetch?oid=' + kw['oid']
        user = handler.user.get_user_in_session(request)
        project = DBSession.query(Project).filter(
            Project.id == kw['pid']).first()
        # add private parameters
        pp = {
            "key": user.key,
            "mail": user.email,
            "pid": project.id,
            "pkey": project.key
        }
        # add prefill parameters
        tracks = list(project.tracks)
        selections = list(project.selections)
        gtrack = [(json.dumps({
            'p':
            handler.track.plugin_link(t),
            'n':
            os.path.split(handler.track.plugin_link(t))[-1]
        }), t.name) for t in tracks]
        if len(selections) > 0:
            s = selections[0]
            if len(s.locations) > 0:
                gtrack.append((handler.track.plugin_link(s, selection_id=s.id),
                               'selection'))

        prefill = {'track': gtrack}

        # prepare parameters
        parameters = {
            'key':
            handler.job.shared_key,
            'bs_private':
            json.dumps({
                'app': pp,
                'cfg': handler.job.bioscript_config,
                'prefill': prefill
            })
        }
        # TODO fetch tracks & selections
        req = urllib2.urlopen(url=bsrequesturl,
                              data=urllib.urlencode(parameters))
        # display the form in template
        response.headerlist.append(('Access-Control-Allow-Origin', '*'))
        data = req.read()
        return data

    # @expose()
    # def index(self, id, key, *args, **kw):
    #     bsurl = handler.job.bioscript_url
    #     shared_key = handler.job.shared_key
    #     project = DBSession.query(Project).filter(Project.key == key).first()
    #     req = {}
    #     # add private parameters
    #     user = handler.user.get_user_in_session(request)
    #     req['_up'] = json.dumps({"key": user.key, "mail": user.email, "project_key": project.key})
    #     req['key'] = shared_key
    #     # add prefill for parameters:
    #     gen_tracks = [[handler.track.plugin_link(track), track.name] for track in project.success_tracks]
    #     req['prefill'] = json.dumps({"track": gen_tracks})
    #     req['id'] = id
    #     bs_request_url = bsurl + '/plugins/get'
    #     f = urllib2.urlopen(bs_request_url, urllib.urlencode(req))
    #     return f.read()

    @expose()
    def validation(*args, **kw):
        for arg in args_list:
            if arg not in kw:
                raise Exception('Missing args for the validation %s' % kw)
        user = DBSession.query(User).filter(
            User.email == str(kw['mail'])).first()
        if user.key != str(kw['key']):
            raise Exception('User not valid %s' % kw)
        project = DBSession.query(Project).filter(
            Project.id == int(kw['pid'])).first()
        if project.key != str(kw['pkey']):
            raise Exception('Project not valid %s' % kw)
        job = Job()
        job.user_id = user.id
        job.project_id = project.id
        job.status = 'PENDING'
        job.ext_task_id = kw['task_id']
        job.bioscript_url = handler.job.task_url(kw['task_id'])
        if 'plugin_info' in kw:
            info = json.loads(kw['plugin_info'])
            job.name = info['title']
            job.description = info['description']
        else:
            job.name = 'Job %s from bioscript' % kw['task_id']
            job.description = 'Description available at %s' % handler.job.task_url(
                kw['task_id'])
        DBSession.add(job)
        DBSession.flush()
        return {}

    @expose()
    def callback(self, *args, **kw):
        print kw
        job = DBSession.query(Job).filter(
            Job.ext_task_id == kw['task_id']).first()
        project = DBSession.query(Project).filter(
            Project.id == int(kw['pid'])).first()
        if project is None or project.key != str(kw['pkey']):
            raise Exception('Project not valid')
        if job.project_id != project.id:
            raise Exception('Job not valid')

        status = str(kw['status'])
        job.status = status
        if status.lower() in ['error', 'failed']:
            job.traceback = kw['error']
        elif status == 'SUCCESS':
            results = json.loads(kw['results'])
            for result in results:
                bres = Bresults()
                bres.job_id = job.id
                bres.output_type = str(result.get('type', 'not defined'))
                bres.is_file = result.get('is_file', False)
                path = str(result.get('path', ''))
                bres.path = path
                bres.data = str(result.get('value', ''))

                is_track = result.get('type', '') == 'track'
                if is_track:
                    out = os.path.join(filemanager.temporary_directory(),
                                       os.path.split(path)[-1])
                    fileinfo = filemanager.FileInfo(inputtype='fsys',
                                                    inpath=path,
                                                    outpath=out,
                                                    admin=False)
                    sequence = project.sequence
                    user = DBSession.query(User).filter(
                        User.key == str(kw['key'])).first()
                    if user.email != str(kw['mail']):
                        raise Exception("Wrong user")
                    user_info = {
                        'id': user.id,
                        'name': user.name,
                        'email': user.email
                    }
                    sequence_info = {'id': sequence.id, 'name': sequence.name}

                    t = Track()
                    t.name = fileinfo.trackname
                    t.sequence_id = sequence.id
                    t.user_id = user.id
                    DBSession.add(t)
                    DBSession.flush()
                    async = tasks.new_input.delay(user_info, fileinfo,
                                                  sequence_info, t.id,
                                                  project.id)
                    t.task_id = async .task_id
                    bres.track_id = t.id

                bres.is_track = is_track
                DBSession.add(bres)
        DBSession.flush()
        return {}
Ejemplo n.º 20
0
     try:
         id_repo = get_paramw(kw, 'id_repo', int)
         r = SapnsDoc.upload(f, id_repo)
         
         return sj.dumps(dict(status=True, 
                              uploaded_file=r['uploaded_file'],
                              file_name=r['file_name'],
                              file_size=r['file_size'],
                              ))
     
     except Exception, e:
         logger.error(e)
         return sj.dumps(dict(status=False, message=str(e).decode('utf-8')))
     
 @expose()
 @require(p.Any(p.in_group('managers'), p.has_any_permission('manage', 'docs')))
 def download(self, id_doc):
     
     content, mt, file_name = SapnsDoc.download(int(id_doc))
     response.content_type = mt.encode('latin1')
     response.headers['Content-Disposition'] = 'attachment;filename=%s' % file_name
     
     return content
     
 @expose('json')
 @require(authorize.has_any_permission('manage', 'docs'))
 def remove_file(self, **kw):
     
     logger = logging.getLogger('DocsController.remove_file')
     try:
         file_name = get_paramw(kw, 'file_name', unicode)
Ejemplo n.º 21
0
class TrackController(BaseController):
    allow_only = has_any_permission(constants.permissions['admin']['name'], constants.permissions['read']['name'])

    @expose('pygdv.templates.track_index')
    @expose('json')
    #@paginate('items', items_per_page=10)
    @with_trailing_slash
    def index(self, *args, **kw):
        user = handler.user.get_user_in_session(request)
        shared_by = None
        # view on a specific project
        if 'pid' in kw and kw.get('pid'):
            project_id = kw.get('pid')
            project = DBSession.query(Project).filter(Project.id == project_id).first()
            if project is None:
                flash("Project doesn't exists", "error")
                raise redirect('/tracks')
            if not checker.check_permission(user=user, project=project, right_id=constants.right_read_id):
                flash('You must have %s permission to view the project.' % constants.right_read, 'error')
                raise redirect('/tracks')
            tracks = project.tracks
            # view on user project
            if checker.own(user=user, project=project):
                kw['own'] = True
                kw['upload'] = True
                grid = datagrid.track_grid_user(user, project)

            # view from a shared user
            else:
                rights = handler.project.get_rights(project=project, user=user)
                debug('find %s' % rights, 2)
                if constants.right_upload_id in [r.id for r in rights]:
                    kw['upload'] = True
                debug('view from a shared user %s' % rights)
                grid = datagrid.track_grid_permissions(user=user, rights=rights, project=project)
                shared_by = "%s %s" % (project.user.firstname, project.user.name[0].upper())

            kw['pn'] = project.name
            track_list = [util.to_datagrid(grid, tracks, "Track Listing", len(tracks) > 0)]
            shared_with = project.get_circle_with_right_display

        # view all user tracks
        else:
            if 'pid' in kw:
                del kw['pid']
            shared_with = ''
            tracks = list(user.tracks)
            # shared tracks
            shared_tracks = handler.user.shared_tracks(user.id, constants.rights['download']['id'])
            tracks.extend(shared_tracks)
            debug('shared tracks : %s' % ', '.join((str(x) for x in shared_tracks)))

            track_list = [util.to_datagrid(datagrid.track_grid_user(user), tracks, "Track Listing", len(tracks) > 0)]
            kw['upload'] = True

        t = handler.help.help_address(url('/help'), 'main', 'track list help')

        # project list
        project_list = [(p.id, p.name,) for p in user.projects]

        # shared projects
        shared_with_rights = handler.project.get_shared_projects(user)
        sorted_projects = sorted(shared_with_rights.iteritems(), key=lambda k: k[0].name)
        shared_project_list = [(p.id, p.name, ''.join([r[0] for r in rights])) for p, rights in sorted_projects]
        return dict(page='tracks', model='track', form_title="new track", track_list=track_list,
            project_list=project_list, shared_project_list=shared_project_list, value=kw,
            tooltip=t, project_id=kw.get('pid', None), upload=kw.get('upload', None), project_name=kw.get('pn', None),
            shared_with=shared_with, owner=kw.get('own', False), shared=not kw.get('own', False), shared_by=shared_by)

    @require(not_anonymous())
    @with_trailing_slash
    @expose('pygdv.templates.track_new')
    def new(self, *args, **kw):

        project_name = None
        ass_name = None
        project_id = None
        value = {}
        if 'pid' in kw:
            new_form = form.NewTrackPrefilled(action=url('/tracks/create')).req()
            project_id = kw.get('pid')
            project = DBSession.query(Project).filter(Project.id == project_id).first()
            project_name = project.name
            ass_name = project.sequence.name
            value['project_id'] = project_id
        else:
            new_form = form.NewTrack(action=url('/tracks/create')).req()
            species = DBSession.query(Species).all()
            sp_opts = [(sp.id, sp.name) for sp in species]
            new_form.child.children[5].options = sp_opts
            mapping = json.dumps(dict([(sp.id, [(seq.id, seq.name) for seq in sp.sequences]) for sp in species]))
            value['smapping'] = mapping

        new_form.value = value
        return dict(page='tracks', widget=new_form, project_id=project_id, project_name=project_name, ass_name=ass_name)

    @expose('json')
    def create(self, *args, **kw):
        user = handler.user.get_user_in_session(request)
        # get sequence
        sequence = None
        project_id = None
        debug('Create track %s' % kw)

        debug('Find sequence', 1)
        if 'assembly' in kw and kw.get('assembly'):
            assembly = int(kw.get('assembly'))
            sequence = DBSession.query(Sequence).filter(Sequence.id == assembly).first()
        elif 'sequence_id' in kw and kw.get('sequence_id'):
            sequence_id = int(kw.get('sequence_id'))
            sequence = DBSession.query(Sequence).filter(Sequence.id == sequence_id).first()
        elif 'sequence_id' in kw and kw.get('sequence_id'):
            sequence_id = int(kw.get('sequence_id'))
            sequence = DBSession.query(Sequence).filter(Sequence.id == sequence_id).first()
        elif 'project_id' in kw and kw.get('project_id'):
            project_id = int(kw.get('project_id'))
            project = DBSession.query(Project).filter(Project.id == project_id).first()
            if project is None:
                return reply.error(request, 'Project with id %s not found on GDV.' % project_id, tg.url('./new', {'pid': project_id}), {})
            sequence = DBSession.query(Sequence).filter(Sequence.id == project.sequence_id).first()
        if not sequence:
            return reply.error(request, 'Sequence not found on GDV.', tg.url('./new'), {'pid': project_id})
        debug('%s' % sequence.name, 2)

        # know if file is comming from url, fileupload or filsystem
        filetoget = None
        inputtype = None
        debug('Find inputtype', 1)
        if 'url' in kw and kw.get('url'):
            debug('from url', 2)
            filetoget = kw.get('url')
            if not filetoget.startswith('http://'):
                filetoget = 'http://%s' % filetoget
            inputtype = 'url'
        elif 'fsys' in kw and kw.get('fsys'):
            debug('fsys', 2)
            filetoget = kw.get('fsys')
            inputtype = 'fsys'
        elif 'file_upload' in kw and kw.get('file_upload') is not None and kw['file_upload'] != '':
            debug('file upload %s' % kw.get('file_upload'), 2)
            filetoget = kw.get('file_upload')
            inputtype = 'fu'
        if filetoget is None:
            return reply.error(request, 'No file to upload', tg.url('./new'), {'pid': project_id})

        debug('file2get: %s, intype: %s' % (filetoget, inputtype), 2)
        # get file name
        debug('Find track name', 1)
        trackname = None
        if 'trackname' in kw and kw.get('trackname'):
            debug('i params', 2)
            trackname = kw.get('trackname')
        else:
            if inputtype == 'url':
                debug('trackname from url', 2)
                trackname = os.path.split(filetoget)[1].split('?')[0]
            elif inputtype == 'fsys':
                debug('trackname from fsys', 2)
                trackname = os.path.split(filetoget)[-1]
            elif inputtype == 'fu':
                debug('trackname from fu', 2)
                trackname = filetoget.filename
        if trackname is None:
            return reply.error(request, 'No trackname found', tg.url('./new'), {'pid': project_id})

        debug('%s' % trackname, 2)
        # get extension
        extension = None
        if 'extension' in kw and kw.get('extension'):
            extension = kw.get('extension')
        elif 'ext' in kw and kw.get('ext'):
            extension = kw.get('ext')
        else:
            extension = os.path.splitext(trackname)[-1]
            if extension is None or extension == '':
                if inputtype == 'url':
                    debug('extension from url', 2)
                    extension = os.path.splitext(os.path.split(filetoget)[1].split('?')[0])[-1]
                elif inputtype == 'fsys':
                    debug('extension from fsys', 2)
                    extension = os.path.splitext(os.path.split(filetoget)[-1])[-1]
                elif inputtype == 'fu':
                    debug('extension from fu', 2)
                    extension = os.path.splitext(filetoget.filename)[-1]
        if extension is None or extension == '':
            return reply.error(request, 'No extension found', tg.url('./new'), {'pid': project_id})
        if extension.startswith('.'):
            extension = extension[1:]
        extension = extension.lower()
        # is the track "admin"
        admin = False
        if 'track_admin' in kw and kw.get('track_admin'):
            # check if really admin
            group_admin = DBSession.query(Group).filter(Group.id == constants.group_admins_id).first()
            if user in group_admin.users:
                admin = True
        debug('admin: %s' % admin, 1)
        #store information in a dummy object
        out = os.path.join(filemanager.temporary_directory(), trackname)
        fileinfo = filemanager.FileInfo(inputtype=inputtype, inpath=filetoget, trackname=trackname, extension=extension, outpath=out, admin=admin)
        debug('fileinfo: %s' % fileinfo, 1)
        # get additionnal information
        user_info = {'id': user.id, 'name': user.name, 'email': user.email}
        sequence_info = {'id': sequence.id, 'name': sequence.name}

        #upload the track it's from file_upload
        if inputtype == 'fu':
            debug('Download', 1)
            fileinfo.download()

        debug('fileinfo: %s' % fileinfo, 1)
        # create a track that the user can see something
        t = Track()
        t.name = fileinfo.trackname
        t.sequence_id = sequence.id
        t.user_id = user.id
        DBSession.add(t)
        DBSession.flush()
        # send task
        async = tasks.new_input.delay(user_info, fileinfo, sequence_info, t.id, project_id)
        t.task_id = async.task_id
        DBSession.add(t)
        DBSession.flush()
        debug('End create')
        return reply.normal(request, 'Processing launched.', '/tracks/', {'track_id': t.id, 'pid': project_id})

        # determine processes to launch

        # # check if multiples url or if zipped file
        # if util.is_compressed(extension) or (kw.get('url', None)!=None and len(kw.get('url', '').split())>1):
        #     async = tasks.multiple_track_input.delay(kw.get('uploaded', None), kw.get('file', None), kw.get('url', None), kw.get('fsys', None),
        #         sequence_id, user.email, user.key, project_id, kw.get('force', False), kw.get('delfile', False),
        #         constants.callback_track_url(), extension)
        #     return reply.normal(request, 'Processing launched.', '/tracks/', {'task_id': async.task_id})
        # else:
        #     # create a new track
        #     _track = handler.track.new_track(user.id, track_name, sequence_id=sequence_id, admin=admin, project_id=project_id)

        #     # format parameters
        #     _uploaded = kw.get('uploaded', False)
        #     _file = kw.get('file', None)
        #     _urls = kw.get('url', None)
        #     _fsys=kw.get('fsys', None)
        #     _track_name = track_name
        #     _extension = extension
        #     _callback_url = constants.callback_track_url()
        #     _force = kw.get('force', False)
        #     _delfile = kw.get('delfile', False)
        #     _track_id = _track.id
        #     _user_key = user.key
        #     _user_mail = user.email

        #     # launch task with the parameters
        #     async = tasks.track_input.delay(_uploaded, _file, _urls, _fsys, _track_name, _extension, _callback_url, _force,
        #         _track_id, _user_mail, _user_key, sequence_id, _delfile)

        #     # update the track
        #     handler.track.update(track=_track, params={'task_id': async.task_id})

        #     if project_id is not None:
        #         return reply.normal(request,'Processing launched.', tg.url('/tracks/', {'pid': project_id}), {'task_id': async.task_id,
        #                                                                                                           'track_id': _track.id})
        #     return reply.normal(request, 'Processing launched.', '/tracks/', {'task_id': async.task_id,
        #                                                                 'track_id': _track.id})
    @expose('json')
    def post(self, *args, **kw):
        project_id = kw.get('project_id', None)
        urls = kw.get('urls', None)
        fu = kw.get('file_upload', None)

        if (fu is None or fu == '') and (urls is None or urls == ''):
            flash('Missing field', 'error')
            raise redirect('/tracks/new')

        return self.create(*args, **kw)

    @expose('json')
    def post2(self, *args, **kw):
        project_id = kw.get('project_id', None)
        urls = kw.get('urls', None)
        fu = kw.get('file_upload', None)
        if (fu is None or fu == '') and (urls is None or urls == ''):
            flash('Missing field', 'error')
            raise redirect('/tracks/new', {'pid': project_id})
        return self.create(*args, **kw)

    #@expose('genshi:tgext.crud.templates.post_delete')

    @expose('json')
    def delete(self, track_id, **kw):
        user = handler.user.get_user_in_session(request)
        if track_id is not None:
            if not checker.can_edit_track(user, track_id):
                return reply.error(request, "You haven't the right to delete any tracks which is not yours", '/tracks', {'error': 'wrong credential'})
            handler.track.delete_track(track_id=track_id)
        red = '/tracks'
        if 'pid' in kw:
            red += '?pid=%s' % kw['pid']
        return reply.normal(request, 'Track successfully deleted.', red, {'success': 'track deleted'})

    @with_trailing_slash
    @expose('pygdv.templates.track_edit')
    def edit(self, track_id, **kw):
        user = handler.user.get_user_in_session(request)
        if track_id is not None:
            if not checker.can_edit_track(user, track_id):
                flash("You haven't the right to edit any tracks which is not yours", 'error')
                raise redirect('/tracks')

        widget = form.EditTrack(action=url('/tracks/edit/%s' % track_id)).req()

        track = DBSession.query(Track).filter(Track.id == track_id).first()

        d = {}
        d['name'] = track.name
        if track.parameters is None or not 'color' in track.parameters:
            cc = constants.default_track_color
        else:
            cc = track.parameters['color']
        d['track_id'] = track_id
        d['color'] = cc
        if 'pid' in kw:
            d['pid'] = kw['pid']
        widget.value = d
        if request.method == 'GET':
            return dict(title='Edit track', page='track', widget=widget, color=cc)

        if request.method == 'POST':
            try:
                widget.validate(kw)
            except twc.ValidationError as e:
                return dict(title='Edit track', page='track', widget=e.widget, color=cc)
        handler.track.edit(track=track, name=kw.get('name', None), color=kw.get('color', None))
        raise redirect('/tracks', {'pid': kw.get('pid', None)})

    @expose('pygdv.templates.track_export')
    def export(self, track_id, *args, **kw):
        user = handler.user.get_user_in_session(request)
        trac = DBSession.query(Track).filter(Track.id == track_id).first()
        if not checker.can_download(user, trac):
            flash("You haven't the right to export any tracks which is not yours")
            raise redirect('../')

        data = util.to_datagrid(track_grid, [trac])
        tmpl_context.form = track_export
        kw['track_id'] = track_id
        return dict(page='tracks', model='Track', info=data, form_title='', value=kw)

    @expose()
    def dump(self, track_id, format, *args, **kw):
        user = handler.user.get_user_in_session(request)
        if not checker.can_download(user.id, track_id):
            flash("You haven't the right to export any tracks which is not yours", 'error')
            raise redirect('../')
        _track = DBSession.query(Track).filter(Track.id == track_id).first()
        if format == 'sqlite':
            response.content_type = 'application/x-sqlite3'
            return open(_track.path).read()
        else:
            tmp_file = tempfile.NamedTemporaryFile(delete=True)
            tmp_file.close()
            track.convert(_track.path, (tmp_file.name, format))
            response.content_type = 'text/plain'
            return open(tmp_file.name).read()

    @expose()
    def link(self, track_id, *args, **kw):
        user = handler.user.get_user_in_session(request)
        trac = DBSession.query(Track).filter(Track.id == track_id).first()
        if not checker.can_download(user, trac):
            flash("You haven't the right to download any tracks which is not yours", 'error')
            raise redirect('/tracks/')
        track = DBSession.query(Track).filter(Track.id == track_id).first()
        if track.status == constants.ERROR:
            flash("The track processing failed. You cannot download it.", 'error')
            raise redirect('/tracks/')
        response.content_type = 'application/x-sqlite3'
        response.headerlist.append(('Content-Disposition', 'attachment;filename=%s.sqlite' % track.name))
        return open(track.path).read()

    @expose()
    def sql(self, sha1, name):
        user = handler.user.get_user_in_session(request)
        inp = DBSession.query(Input).filter(Input.sha1 == sha1).first()
        if inp is None:
            flash("Doesn't exist", 'error')
            raise redirect('/tracks')
        if not os.path.split(inp.path)[-1] == name:
            flash("Doesn't exist", 'error')
            raise redirect('/tracks')
        for t in inp.tracks:
            if user.id == t.user_id:
                response.content_type = 'application/x-sqlite3'
                response.headerlist.append(('Content-Disposition', 'attachment;filename=%s.sqlite' % t.name))
                return open(t.path).read()
        flash("You haven't the right to download any tracks which is not yours", 'error')
        raise redirect('/tracks')

    @expose()
    def traceback(self, id):
        user = handler.user.get_user_in_session(request)

        if not checker.user_own_track(user.id, id) and not checker.is_admin(user):

            flash("You haven't the right to look at any tracks which is not yours", 'error')
            raise redirect('/tracks')
        track = DBSession.query(Track).filter(Track.id == id).first()
        return track.traceback

    @expose()
    def copy(self, track_id):
        user = handler.user.get_user_in_session(request)
        if not checker.can_download_track(user.id, track_id):
            return reply.error(request, 'You have no right to copy this track in your profile.', './', {})
        t = DBSession.query(Track).filter(Track.id == track_id).first()
        if not t:
            return reply.error(request, 'No track with this id.', './', {})
        handler.track.copy_track(user.id, t)
        return reply.normal(request, 'Copy successfull', './', {})




    ##### for ADMINS #######







    @require(has_permission('admin', msg='Only for admins'))
    @expose('pygdv.templates.track_admin')
    @expose('json')
    #@paginate('items', items_per_page=10)
    @with_trailing_slash
    def admin(self, **kw):
        # view on a specific project
        grid = datagrid.track_admin_grid
        if kw.has_key('pid'):
            project_id = kw.get('pid')
            project = DBSession.query(Project).filter(Project.id == project_id).first()
            tracks = project.tracks
            kw['upload'] = True

            kw['pn'] = project.name
            track_list = [util.to_datagrid(grid, tracks, "Track Listing", len(tracks)>0)]

        else:
            if 'user_id' in kw:
                tracks = DBSession.query(Track).filter(Track.user_id == kw['user_id']).all()
            else:
                tracks = DBSession.query(Track).all()
            track_list = [util.to_datagrid(grid, tracks, "Track Listing", len(tracks)>0)]
            kw['upload'] = True

        # track list

        t = handler.help.tooltip['admin']

        # project list
        all_projects = DBSession.query(Project).all()
        project_list = [(p.id, p.name,) for p in all_projects]


        return dict(page='tracks', model='track', form_title="new track", track_list=track_list,
            project_list=project_list, shared_project_list=[], value=kw,
            tooltip=t, project_id=kw.get('pid', None), upload=kw.get('upload', None), project_name=kw.get('pn', None))






    @expose('json')
    def after_sha1(self, fname, sha1, force, callback_url, track_id, old_task_id, mail, key, sequence_id, extension, trackname):
        """
        Called after a sha1 where calculated on a file.
        If the sha1 already exist, only the databases operations are done.
        Else the input will go in the second part of the process.
        The input can be 'forced' to be recomputed
        """
        try:
            _input = DBSession.query(Input).filter(Input.sha1 == sha1).first()
            do_process = True
            if util.str2bool(force) and _input is not None:
                handler.track.delete_input(_input.sha1)
                DBSession.delete(_input)
                DBSession.flush()
            elif _input is not None:
                do_process = False
                handler.track.update(track_id=track_id,
                    params={'new_input_id': _input.id})
                handler.track.finalize_track_creation(track_id=track_id)

            if do_process:

                handler.track.update(track_id=track_id, params={'sha1': sha1})
                sequence = DBSession.query(Sequence).filter(Sequence.id == sequence_id).first()
                async = tasks.track_process.delay(mail, key, old_task_id, fname, sha1, callback_url, track_id, sequence.name, extension, trackname, callback_url)

                handler.track.update(track_id=track_id,
                    params={'new_task_id': async.task_id})
            return {'success': 'to second process'}
        except Exception as e:
            etype, value, tb = sys.exc_info()
            traceback.print_exception(etype, value, tb)


            return {'error': str(e)}


    @expose('json')
    def after_process(self, mail, key, old_task_id, track_id, datatype):
        print '[x] after process [x] %s' % track_id
        task = DBSession.query(Task).filter(Task.task_id == old_task_id).first()
        if task is not None:
            DBSession.delete(task)
            DBSession.flush()
        if not track_id == 'None':
            handler.track.update(track_id=track_id, params={'datatype': datatype})
            handler.track.finalize_track_creation(track_id=track_id)
        return {'success': 'end'}
Ejemplo n.º 22
0
class TipoItemController(BaseController):
    @expose()
    def index(self):
        """Muestra la pantalla inicial"""
        return dict(nombre_modelo='Tipo de Item', page='index_tipo_item')

    @expose('is2sap.templates.tipo_item.listadoImportar')
    @require(predicates.has_any_permission('lider_proyecto'))
    def listadoImportar(self, id_proyecto, id_fase):
        """Metodo para listar los Tipos de Items que se pueden Importar"""
        try:
            listaProyectos = DBSession.query(Proyecto).order_by(
                Proyecto.id_proyecto)
            for proyecto in listaProyectos:
                for fase in proyecto.fases:
                    for tipoitem in fase.tipoitems:
                        for atributo in tipoitem.atributos:
                            print atributo.nombre
            myTree = TreeView(treeDiv='navTree')
            tmpl_context.form = myTree
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Importacion de Tipo de Item! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Importacion de Tipo de Item! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)

        return dict(listaProyectos=listaProyectos,
                    id_proyecto=id_proyecto,
                    id_fase=id_fase)

    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def importar(self, **kw):
        #id_proyecto, id_fase, id_tipo_item, nombre, descripcion, codigo):
        """Metodo que realiza la importacion del Tipo de Item con todos sus Atributos"""
        try:
            tipo_item = TipoItem()
            tipo_item.id_fase = kw['id_fase']
            tipo_item.nombre = kw['nombre']
            tipo_item.codigo = kw['codigo']
            tipo_item.descripcion = kw['descripcion']
            DBSession.add(tipo_item)
            DBSession.flush()

            listaAtributos = DBSession.query(Atributo).filter_by(
                id_tipo_item=kw['id_tipo_item']).all()

            for unAtributo in listaAtributos:
                print unAtributo.nombre
                atributo = Atributo()
                atributo.id_tipo_item = tipo_item.id_tipo_item
                atributo.nombre = unAtributo.nombre
                atributo.descripcion = unAtributo.descripcion
                atributo.tipo = unAtributo.tipo
                DBSession.add(atributo)
                DBSession.flush()

            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se ha realizado la importacion! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=kw['id_proyecto'],
                     id_fase=kw['id_fase'])
        except SQLAlchemyError:
            flash(_("No se ha realizado la importacion! SQLAlchemyError..."),
                  'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=kw['id_proyecto'],
                     id_fase=kw['id_fase'])
        except (AttributeError, NameError):
            flash(
                _("No se ha realizado la importacion! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=kw['id_proyecto'],
                     id_fase=kw['id_fase'])
        else:
            flash(_("Se ha importado correctamente!"), 'ok')

        redirect("/admin/tipo_item/listadoTipoItemPorFase",
                 id_proyecto=kw['id_proyecto'],
                 id_fase=kw['id_fase'])

    @expose('is2sap.templates.tipo_item.nuevo')
    @require(predicates.has_any_permission('lider_proyecto'))
    def nuevoDesdeFase(self, id_fase, **kw):
        """Despliega el formulario para añadir un Nuevo Tipo de Item a la fase de un proyecto."""
        try:
            tmpl_context.form = crear_tipo_item_form
            fase = DBSession.query(Fase).get(id_fase)
            id_proyecto = fase.id_proyecto
            kw['id_fase'] = id_fase
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Creacion de Tipo de Item! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Creacon de Tipo de Item! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)

        return dict(nombre_modelo='Tipo Item',
                    page='nuevo_tipo_item',
                    id_proyecto=id_proyecto,
                    id_fase=id_fase,
                    value=kw)

    @expose()
    @validate(crear_tipo_item_form, error_handler=nuevoDesdeFase)
    @require(predicates.has_any_permission('lider_proyecto'))
    def add(self, **kw):
        """Metodo para agregar un registro a la base de datos """
        try:
            tipo_item = TipoItem()
            tipo_item.id_fase = kw['id_fase']
            tipo_item.nombre = kw['nombre']
            tipo_item.codigo = kw['codigo']
            tipo_item.descripcion = kw['descripcion']
            DBSession.add(tipo_item)
            DBSession.flush()
            transaction.commit()
            fase = DBSession.query(Fase).get(kw['id_fase'])
            id_fase = fase.id_fase
            id_proyecto = fase.id_proyecto
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except SQLAlchemyError:
            flash(_("No se ha guardado! SQLAlchemyError..."), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except (AttributeError, NameError):
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        else:
            flash(_("Tipo de Item creado!"), 'ok')

        redirect("/admin/tipo_item/listadoTipoItemPorFase",
                 id_proyecto=id_proyecto,
                 id_fase=id_fase)

    @expose("is2sap.templates.tipo_item.listadoTipoItemPorFase")
    @require(predicates.has_any_permission('lider_proyecto'))
    def listadoTipoItemPorFase(self, id_proyecto, id_fase, page=1):
        """Metodo para listar los Tipos de Items de una Fase """
        try:
            tipoItemPorFase = DBSession.query(TipoItem).join(
                TipoItem.relacion_fase).filter(
                    TipoItem.id_fase == id_fase).options(
                        contains_eager(TipoItem.relacion_fase)).order_by(
                            TipoItem.id_tipo_item)
            nombreFase = DBSession.query(
                Fase.nombre).filter_by(id_fase=id_fase).first()
            idProyectoFase = DBSession.query(
                Fase.id_proyecto).filter_by(id_fase=id_fase).first()
            currentPage = paginate.Page(tipoItemPorFase,
                                        page,
                                        items_per_page=10)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Tipo de Items de Fase! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Tipo de Items de Fase! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)

        return dict(tipoItemPorFase=currentPage.items,
                    page='listado',
                    nombre_fase=nombreFase,
                    id_proyecto=id_proyecto,
                    id_fase=id_fase,
                    currentPage=currentPage)

    @expose('is2sap.templates.tipo_item.editar')
    @require(predicates.has_any_permission('lider_proyecto'))
    def editar(self, id_tipo_item, **kw):
        """Metodo que rellena el formulario para editar los datos de un usuario"""
        try:
            tmpl_context.form = editar_tipo_item_form
            tipo_item = DBSession.query(TipoItem).get(id_tipo_item)
            id_fase = tipo_item.id_fase
            fase = DBSession.query(Fase).get(id_fase)
            id_proyecto = fase.id_proyecto
            proyecto = DBSession.query(Proyecto).get(id_proyecto)

            if proyecto.iniciado == True:
                flash(_("Proyecto ya iniciado. No puede editar Tipo de Item!"),
                      'error')
                redirect("/admin/tipo_item/listadoTipoItemPorFase",
                         id_proyecto=id_proyecto,
                         id_fase=id_fase)

            traertipo_item = DBSession.query(TipoItem).get(id_tipo_item)
            kw['id_tipo_item'] = traertipo_item.id_tipo_item
            kw['nombre'] = traertipo_item.nombre
            kw['codigo'] = traertipo_item.codigo
            kw['descripcion'] = traertipo_item.descripcion
            kw['id_fase'] = traertipo_item.id_fase
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Edicion de Tipo de Item! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Edicion de Tipo de Item! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)

        return dict(nombre_modelo='Tipo Item',
                    id_proyecto=id_proyecto,
                    id_fase=id_fase,
                    page='editar',
                    value=kw)

    @validate(editar_tipo_item_form, error_handler=editar)
    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def update(self, **kw):
        """Metodo que actualiza la base de datos"""
        try:
            tipo_item = DBSession.query(TipoItem).get(kw['id_tipo_item'])
            tipo_item.nombre = kw['nombre']
            tipo_item.codigo = kw['codigo']
            tipo_item.descripcion = kw['descripcion']
            tipo_item.id_fase = kw['id_fase']
            DBSession.flush()
            transaction.commit()
            fase = DBSession.query(Fase).get(kw['id_fase'])
            id_fase = fase.id_fase
            id_proyecto = fase.id_proyecto
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except SQLAlchemyError:
            flash(_("No se han guardado los cambios! SQLAlchemyError..."),
                  'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except (AttributeError, NameError):
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        else:
            flash(_("Se han guardado los cambios!"), 'ok')

        redirect("/admin/tipo_item/listadoTipoItemPorFase",
                 id_proyecto=id_proyecto,
                 id_fase=id_fase)

    @expose('is2sap.templates.tipo_item.confirmar_eliminar')
    @require(predicates.has_any_permission('lider_proyecto'))
    def confirmar_eliminar(self, id_proyecto, id_fase, id_tipo_item, **kw):
        """Despliega confirmacion de eliminacion"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)
            if proyecto.iniciado == True:
                flash(
                    _("Proyecto ya iniciado. No puede eliminar Tipo de Item!"),
                    'error')
                redirect("/admin/tipo_item/listadoTipoItemPorFase",
                         id_proyecto=id_proyecto,
                         id_fase=id_fase)

            tipo_item = DBSession.query(TipoItem).get(id_tipo_item)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Edicion de Tipo de Item! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Edicion de Tipo de Item! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)

        return dict(nombre_modelo='Tipo Item',
                    page='editar',
                    id_proyecto=id_proyecto,
                    id_fase=id_fase,
                    value=tipo_item)

    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def delete(self, id_proyecto, id_fase, id_tipo_item, **kw):
        """Metodo que elimina un registro de la base de datos"""
        try:
            atributos = DBSession.query(Atributo).filter_by(
                id_tipo_item=id_tipo_item).all()

            for atributo in atributos:
                DBSession.delete(
                    DBSession.query(Atributo).get(atributo.id_atributo))

            DBSession.delete(DBSession.query(TipoItem).get(id_tipo_item))
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except SQLAlchemyError:
            flash(_("No se ha eliminado! SQLAlchemyError..."), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except (AttributeError, NameError):
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        else:
            flash(_("Tipo de Item eliminado!"), 'ok')

        redirect("/admin/tipo_item/listadoTipoItemPorFase",
                 id_proyecto=id_proyecto,
                 id_fase=id_fase)
Ejemplo n.º 23
0
class FaseController(BaseController):
    @expose()
    def index(self):
        """Muestra la pantalla inicial"""
        return dict(nombre_modelo='Fase', page='index_fase')

    @expose('is2sap.templates.fase.nuevo')
    @require(predicates.has_any_permission('lider_proyecto'))
    def nuevoDesdeProyecto(self, id_proyecto, **kw):
        """Despliega el formulario para añadir una fase al proyecto."""
        try:
            tmpl_context.form = crear_fase_form
            proyecto = DBSession.query(Proyecto).get(id_proyecto)

            if proyecto.iniciado == True:
                flash(_("Proyecto ya iniciado. No puede crear fases!"),
                      'error')
                redirect("/admin/fase/listadoFasesPorProyecto",
                         id_proyecto=id_proyecto)

            maxnumerofase = DBSession.query(func.max(
                Fase.numero_fase)).filter_by(id_proyecto=id_proyecto).first()
            kw['id_proyecto'] = id_proyecto
            kw['id_estado_fase'] = 1

            if maxnumerofase[0] == None:
                kw['numero_fase'] = 1
            else:
                kw['numero_fase'] = maxnumerofase[0] + 1

        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Creacion de Fases! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Creacion de Fases! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)

        return dict(nombre_modelo='Fase',
                    idProyecto=id_proyecto,
                    page='nuevo',
                    value=kw)

    @validate(crear_fase_form, error_handler=nuevoDesdeProyecto)
    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def add(self, **kw):
        """Metodo para agregar un registro a la base de datos """
        try:
            fase = Fase()
            fase.id_estado_fase = kw['id_estado_fase']
            fase.id_proyecto = kw['id_proyecto']
            fase.nombre = kw['nombre']
            fase.descripcion = kw['descripcion']
            fase.numero_fase = kw['numero_fase']
            DBSession.add(fase)
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=kw['id_proyecto'])
        except SQLAlchemyError:
            flash(_("No se ha guardado! SQLAlchemyError..."), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=kw['id_proyecto'])
        except (AttributeError, NameError):
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=kw['id_proyecto'])
        else:
            flash(_("Fase creada!"), 'ok')

        redirect("/admin/fase/listadoFasesPorProyecto",
                 id_proyecto=kw['id_proyecto'])

    @expose("is2sap.templates.fase.listadoFasesPorProyecto")
    @require(predicates.has_any_permission('lider_proyecto'))
    def listadoFasesPorProyecto(self, id_proyecto, page=1):
        """Metodo para listar las Fases de un proyecto """
        try:
            fasesPorProyecto = DBSession.query(Fase).join(
                Fase.relacion_estado_fase).filter(
                    Fase.id_proyecto == id_proyecto).options(
                        contains_eager(Fase.relacion_estado_fase)).order_by(
                            Fase.numero_fase)
            #           fasesPorProyecto = DBSession.query(Fase).filter_by(id_proyecto=id_proyecto).order_by(Fase.numero_fase)
            nombreProyecto = DBSession.query(
                Proyecto.nombre).filter_by(id_proyecto=id_proyecto).first()
            currentPage = paginate.Page(fasesPorProyecto,
                                        page,
                                        items_per_page=10)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Fases del Proyecto! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/proyecto/listado")
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Fases del Proyecto! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/proyecto/listado")

        return dict(fasesPorProyecto=currentPage.items,
                    page='listado_fases',
                    nombre_proyecto=nombreProyecto,
                    id_proyecto=id_proyecto,
                    currentPage=currentPage)

    @expose('is2sap.templates.fase.editar')
    @require(predicates.has_any_permission('lider_proyecto'))
    def editar(self, id_proyecto, id_fase, **kw):
        """Metodo que rellena el formulario para editar los datos de una Fase"""
        try:
            tmpl_context.form = editar_fase_form
            proyecto = DBSession.query(Proyecto).get(id_proyecto)

            if proyecto.iniciado == True:
                flash(_("Proyecto ya iniciado. No puede editar fases!"),
                      'error')
                redirect("/admin/fase/listadoFasesPorProyecto",
                         id_proyecto=id_proyecto)

            traerFase = DBSession.query(Fase).get(id_fase)
            kw['id_fase'] = traerFase.id_fase
            kw['id_estado_fase'] = traerFase.id_estado_fase
            kw['id_proyecto'] = traerFase.id_proyecto
            kw['nombre'] = traerFase.nombre
            kw['descripcion'] = traerFase.descripcion
            kw['numero_fase'] = traerFase.numero_fase
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Edicion de Fases! SQLAlchemyError..."),
                'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Edicion de Fases! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)

        return dict(nombre_modelo='Fase', page='editar_fase', value=kw)

    @validate(editar_fase_form, error_handler=editar)
    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def update(self, **kw):
        """Metodo que actualiza la fase en la base de datos"""
        try:
            fase = DBSession.query(Fase).get(kw['id_fase'])
            fase.nombre = kw['nombre']
            fase.numero_fase = kw['numero_fase']
            fase.descripcion = kw['descripcion']
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=kw['id_proyecto'])
        except SQLAlchemyError:
            flash(_("No se han guardado los cambios! SQLAlchemyError..."),
                  'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=kw['id_proyecto'])
        except (AttributeError, NameError):
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=kw['id_proyecto'])
        else:
            flash(_("Se han guardado los cambios!"), 'ok')

        redirect("/admin/fase/listadoFasesPorProyecto",
                 id_proyecto=kw['id_proyecto'])

    @expose('is2sap.templates.fase.confirmar_eliminar')
    @require(predicates.has_any_permission('lider_proyecto'))
    def confirmar_eliminar(self, id_proyecto, id_fase, **kw):
        """Despliega confirmacion de eliminacion"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)

            if proyecto.iniciado == True:
                flash(_("Proyecto ya iniciado. No puede eliminar fases!"),
                      'error')
                redirect("/admin/fase/listadoFasesPorProyecto",
                         id_proyecto=id_proyecto)

            fase = DBSession.query(Fase).get(id_fase)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Eliminacion de Fases! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Eliminacion de Fases! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)

        return dict(nombre_modelo='Fase', page='eliminar_fase', value=fase)

    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def delete(self, id_proyecto, id_fase, **kw):
        """ Metodo que elimina un registro de la base de datos 
            Parametros:
                       -  id_fase: identificador de la fase
        """
        try:
            tipo_items = DBSession.query(TipoItem).filter_by(
                id_fase=id_fase).all()

            for tipo_item in tipo_items:
                id_tipo_item = tipo_item.id_tipo_item
                atributos = DBSession.query(Atributo).filter_by(
                    id_tipo_item=id_tipo_item).all()
                for atributo in atributos:
                    DBSession.delete(
                        DBSession.query(Atributo).get(atributo.id_atributo))
                DBSession.delete(DBSession.query(TipoItem).get(id_tipo_item))

            DBSession.delete(DBSession.query(Fase).get(id_fase))
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)
        except SQLAlchemyError:
            flash(_("No se ha eliminado! SQLAlchemyError..."), 'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)
        except (AttributeError, NameError):
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/fase/listadoFasesPorProyecto",
                     id_proyecto=id_proyecto)
        else:
            flash(_("Fase eliminada!"), 'ok')

        redirect("/admin/fase/listadoFasesPorProyecto",
                 id_proyecto=id_proyecto)
Ejemplo n.º 24
0
class AtributoController(BaseController):
    @expose()
    def index(self):
        """Muestra la pantalla inicial"""
        return dict(nombre_modelo='Atributo', page='index_atributo')

    @expose('is2sap.templates.atributo.nuevoDesdeTipoItem')
    @require(predicates.has_any_permission('lider_proyecto'))
    def nuevoDesdeTipoItem(self, id_tipo_item, **kw):
        """Despliega el formulario para añadir un nuevo atributo."""
        try:
            tmpl_context.form = crear_atributo_form
            tipo_item = DBSession.query(TipoItem).get(id_tipo_item)
            id_fase = tipo_item.id_fase
            fase = DBSession.query(Fase).get(id_fase)
            id_proyecto = fase.id_proyecto
            kw['id_tipo_item'] = id_tipo_item
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Creacion de Atributo! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Creacon de Atributo! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)

        return dict(nombre_modelo='Atributo',
                    page='nuevo_atributo',
                    id_proyecto=id_proyecto,
                    id_fase=id_fase,
                    id_tipo_item=id_tipo_item,
                    value=kw)

    @validate(crear_atributo_form, error_handler=nuevoDesdeTipoItem)
    @require(predicates.has_any_permission('lider_proyecto'))
    @expose()
    def add(self, **kw):
        """Metodo para agregar un registro a la base de datos """
        try:
            atributo = Atributo()
            atributo.id_tipo_item = kw['id_tipo_item']
            atributo.nombre = kw['nombre']
            atributo.descripcion = kw['descripcion']
            atributo.tipo = kw['tipo']
            DBSession.add(atributo)
            DBSession.flush()
            transaction.commit()
            tipo_item = DBSession.query(TipoItem).get(kw['id_tipo_item'])
            id_tipo_item = tipo_item.id_tipo_item
            fase = tipo_item.relacion_fase
            id_fase = fase.id_fase
            id_proyecto = fase.id_proyecto
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except SQLAlchemyError:
            flash(_("No se ha guardado! SQLAlchemyError..."), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except (AttributeError, NameError):
            flash(_("No se ha guardado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        else:
            flash(_("Atributo creado!"), 'ok')

        redirect("/admin/atributo/listadoAtributosPorTipoItem",
                 id_proyecto=id_proyecto,
                 id_fase=id_fase,
                 id_tipo_item=id_tipo_item)

    @expose("is2sap.templates.atributo.listadoAtributosPorTipoItem")
    @require(predicates.has_any_permission('lider_proyecto'))
    def listadoAtributosPorTipoItem(self,
                                    id_proyecto,
                                    id_fase,
                                    id_tipo_item,
                                    page=1):
        """Metodo para listar todos los atributos de la base de datos"""
        try:
            atributos = DBSession.query(Atributo).filter_by(
                id_tipo_item=id_tipo_item).order_by(Atributo.id_atributo)
            currentPage = paginate.Page(atributos, page, items_per_page=10)
            tipo_item = DBSession.query(TipoItem).get(id_tipo_item)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Atributos de Tipo de Item! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Atributos de Tipo de Item! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/tipo_item/listadoTipoItemPorFase",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase)

        return dict(atributos=currentPage.items,
                    page='listado_atributos',
                    nombre_tipo_item=tipo_item.nombre,
                    id_proyecto=id_proyecto,
                    id_fase=id_fase,
                    id_tipo_item=id_tipo_item,
                    currentPage=currentPage)

    @expose('is2sap.templates.atributo.editar')
    @require(predicates.has_any_permission('lider_proyecto'))
    def editar(self, id_atributo, **kw):
        """Metodo que rellena el formulario para editar los datos de un usuario"""
        try:
            tmpl_context.form = editar_atributo_form
            traerAtributo = DBSession.query(Atributo).get(id_atributo)
            id_tipo_item = traerAtributo.id_tipo_item
            tipo_item = DBSession.query(TipoItem).get(id_tipo_item)
            id_fase = tipo_item.id_fase
            fase = DBSession.query(Fase).get(id_fase)
            id_proyecto = fase.id_proyecto
            proyecto = DBSession.query(Proyecto).get(id_proyecto)

            if proyecto.iniciado == True:
                flash(_("Proyecto ya iniciado. No puede editar Atributo!"),
                      'error')
                redirect("/admin/atributo/listadoAtributosPorTipoItem",
                         id_proyecto=id_proyecto,
                         id_fase=id_fase,
                         id_tipo_item=id_tipo_item)

            kw['id_atributo'] = traerAtributo.id_atributo
            kw['id_tipo_item'] = traerAtributo.id_tipo_item
            kw['nombre'] = traerAtributo.nombre
            kw['descripcion'] = traerAtributo.descripcion
            kw['tipo'] = traerAtributo.tipo
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Edicion de Atributo! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Edicion de Atributo! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)

        return dict(nombre_modelo='Atributo',
                    page='editar',
                    id_proyecto=id_proyecto,
                    id_fase=id_fase,
                    id_tipo_item=id_tipo_item,
                    value=kw)

    @validate(editar_atributo_form, error_handler=editar)
    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def update(self, **kw):
        """Metodo que actualiza la base de datos"""
        try:
            atributo = DBSession.query(Atributo).get(kw['id_atributo'])
            atributo.id_tipo_item = kw['id_tipo_item']
            atributo.nombre = kw['nombre']
            atributo.descripcion = kw['descripcion']
            atributo.tipo = kw['tipo']
            DBSession.flush()
            transaction.commit()
            tipo_item = DBSession.query(TipoItem).get(kw['id_tipo_item'])
            id_tipo_item = tipo_item.id_tipo_item
            fase = tipo_item.relacion_fase
            id_fase = fase.id_fase
            id_proyecto = fase.id_proyecto
        except IntegrityError:
            transaction.abort()
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except SQLAlchemyError:
            flash(_("No se han guardado los cambios! SQLAlchemyError..."),
                  'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except (AttributeError, NameError):
            flash(
                _("No se han guardado los cambios! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        else:
            flash(_("Se han guardado los cambios!"), 'ok')

        redirect("/admin/atributo/listadoAtributosPorTipoItem",
                 id_proyecto=id_proyecto,
                 id_fase=fase.id_fase,
                 id_tipo_item=id_tipo_item)

    @expose('is2sap.templates.atributo.confirmar_eliminar')
    @require(predicates.has_any_permission('lider_proyecto'))
    def confirmar_eliminar(self, id_proyecto, id_fase, id_tipo_item,
                           id_atributo, **kw):
        """Despliega confirmacion de eliminacion"""
        try:
            proyecto = DBSession.query(Proyecto).get(id_proyecto)

            if proyecto.iniciado == True:
                flash(_("Proyecto ya iniciado. No puede eliminar Atributo!"),
                      'error')
                redirect("/admin/atributo/listadoAtributosPorTipoItem",
                         id_proyecto=id_proyecto,
                         id_fase=id_fase,
                         id_tipo_item=id_tipo_item)

            atributo = DBSession.query(Atributo).get(id_atributo)
        except SQLAlchemyError:
            flash(
                _("No se pudo acceder a Eliminacion de Atributo! SQLAlchemyError..."
                  ), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except (AttributeError, NameError):
            flash(
                _("No se pudo acceder a Eliminacion de Atributo! Hay Problemas con el servidor..."
                  ), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)

        return dict(nombre_modelo='Atributo',
                    page='editar',
                    id_proyecto=id_proyecto,
                    id_fase=id_fase,
                    id_tipo_item=id_tipo_item,
                    value=atributo)

    @expose()
    @require(predicates.has_any_permission('lider_proyecto'))
    def delete(self, id_proyecto, id_fase, id_tipo_item, id_atributo, **kw):
        """ Metodo que elimina el registro de un atributo
            Parametros: - id_atributo: Para identificar el atributo a eliminar
                        - id_tipo_item: Para redireccionar al listado de atributos correspondientes al tipo de item 
        """
        try:
            DBSession.delete(DBSession.query(Atributo).get(id_atributo))
            DBSession.flush()
            transaction.commit()
        except IntegrityError:
            transaction.abort()
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except SQLAlchemyError:
            flash(_("No se ha eliminado! SQLAlchemyError..."), 'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        except (AttributeError, NameError):
            flash(_("No se ha eliminado! Hay Problemas con el servidor..."),
                  'error')
            redirect("/admin/atributo/listadoAtributosPorTipoItem",
                     id_proyecto=id_proyecto,
                     id_fase=id_fase,
                     id_tipo_item=id_tipo_item)
        else:
            flash(_("Atributo eliminado!"), 'ok')

        redirect("/admin/atributo/listadoAtributosPorTipoItem",
                 id_proyecto=id_proyecto,
                 id_fase=id_fase,
                 id_tipo_item=id_tipo_item)
Ejemplo n.º 25
0
            # copy shortcuts and privileges form another user
            if new_user:
                user.copy_from(copy_from)
                
            return dict(status=True)
        
        except EUser, e:
            logger.error(e)
            return dict(status=False, message=unicode(e))
        
        except Exception, e:
            logger.error(e)
            return dict(status=False)

    @expose('sapns/users/permission.html')
    @require(predicates.has_any_permission('manage', 'users'))
    def permission(self, came_from='/dashboard/users'):
        return dict(came_from=url(came_from))
    
    @expose('sapns/users/roles.html')
    @require(predicates.has_any_permission('manage', 'users'))
    @add_language
    def roles(self, id_user, **kw):

        logger = logging.getLogger('UsersController.roles')        
        try:
            user = dbs.query(SapnsUser).get(int(id_user))
            
            roles = []
            for r in dbs.query(SapnsRole).order_by(SapnsRole.group_name):
                #r = SapnsRole()
Ejemplo n.º 26
0
from archeologicaladdressbook.lib.base import BaseController
from archeologicaladdressbook.lib.base import render
from archeologicaladdressbook.lib.base import validate
from archeologicaladdressbook.lib.base import authenticate_form
from archeologicaladdressbook.lib.helpers import flash_message
from archeologicaladdressbook.lib.helpers import paginate
from archeologicaladdressbook.lib.auth import ProtectController
from archeologicaladdressbook.lib.auth import ProtectAction

from archeologicaladdressbook.model import Session, Address, Person, forms

log = logging.getLogger(__name__)


@ProtectController(has_any_permission('edit', 'view'))
class AddressesController(BaseController):
    """ `Addresses` Controller."""

# TODO: add check personn + address_type uniqueness constrain
# See related person infos and/or include in person templates

# index and list actions

    @ProtectAction(has_permission('view'))
    def index(self):
        """ Render the addresses index template."""
        return render('/addresses/index.mako')

    @ProtectAction(has_permission('view'))
    def list(self, id=None):
Ejemplo n.º 27
0
class RootController(BaseController):
    """
    The root controller for the pygdv application.

    All the other controllers and WSGI applications should be mounted on this
    controller. For example::

        panel = ControlPanelController()
        another_app = AnotherWSGIApplication()

    Keep in mind that WSGI applications shouldn't be mounted directly: They
    must be wrapped around with :class:`tg.controllers.WSGIAppController`.

    """

    error = ErrorController()
    login = LoginController()

    sequences = SequenceController()
    tracks = TrackController()
    projects = ProjectController()
    circles = CircleController()
    jobs = JobController()
    public = PublicController()
    help = HelpController()
    genrep = GenRepController()
    database = DatabaseController()
    selections = SelectionController()
    plugins = PluginController()

    @expose('pygdv.templates.index')
    def index(self, *args, **kw):
        raise redirect('/tracks')

    @expose('pygdv.templates.help')
    def login_needed(self):
        flash('You need to login', 'error')
        return dict(page='index')

    #@require(has_permission('admin', msg='Only for admins'))
    @expose()
    def test_files(self, id):
        import os
        from pkg_resources import resource_filename
        from pygdv.tests.test_input_files import samples
        from tg import response
        samples_path = resource_filename('pygdv.tests', 'test_files')
        print samples[int(id)]

        _f = open(os.path.join(samples_path, samples[int(id)]))
        response.content_type = 'plain/text'
        response.headerlist.append(
            ('Content-Disposition',
             'attachment;filename=%s' % samples[int(id)]))
        return _f.read()

    @expose('pygdv.templates.about')
    def about(self):
        """Handle the 'about' page."""
        return dict(page='about')

    @expose()
    def home(self, *args, **kw):
        raise redirect('/')

    ## DEVELOPMENT PAGES ##
    @require(has_permission('admin', msg='Only for admins'))
    @expose('pygdv.templates.environ')
    def environ(self):
        """This method showcases TG's access to the wsgi environment."""
        return dict(page='environ', environment=request.environ)

#    @require(has_permission('admin', msg='Only for admins'))
#    @expose('pygdv.templates.data')
#    @expose('json')
#    def data(self, **kw):
#        """This method showcases how you can use the same controller for a data page and a display page"""
#        return dict(page='data',params=kw)

    @require(has_any_permission('admin', 'user', msg='You must be logged'))
    @expose()
    def private_key(self):
        from pygdv import handler
        user = handler.user.get_user_in_session(request)
        return user.key

    @require(has_any_permission('user', 'admin', msg='You must be logged'))
    @expose('pygdv.templates.me')
    def me(self):
        from pygdv import handler
        user = handler.user.get_user_in_session(request)
        return {'user': user, 'page': 'user'}
Ejemplo n.º 28
0
Archivo: job.py Proyecto: yjarosz/pygdv
class JobController(BaseController):
    allow_only = has_any_permission(constants.permissions['admin']['name'],
                                    constants.permissions['read']['name'])

    @with_trailing_slash
    @expose('pygdv.templates.jobs_index')
    def index(self, *args, **kw):
        user = handler.user.get_user_in_session(request)
        if request.method == 'POST':
            jid = kw.get('id', None)
            if jid is not None and checker.can_edit_job(user.id, jid):
                handler.job.delete(jid)
            else:
                flash('not authorized')

        jobs = DBSession.query(Job).filter(Job.user_id == user.id).all()

        data = util.to_datagrid(datagrid.job_grid,
                                jobs,
                                "Job Listing",
                                grid_display=len(jobs) > 0)
        t = handler.help.help_address(url('/help'), 'jobs',
                                      'How to compute new data')

        return dict(page='jobs',
                    model='job',
                    form_title="new job",
                    item=data,
                    value=kw,
                    tooltip=t)

    @expose('pygdv.templates.job')
    def result(self, id):

        res = DBSession.query(Bresults).filter(Bresults.id == id).first()
        checker.check_permission(
            user=handler.user.get_user_in_session(request),
            project=res.job.project,
            right_id=constants.right_download_id)
        if res.rtype in constants.track_types:
            raise redirect(url('/tracks/links/%s' % res.track_id))

        src = constants.extra_url() + '/' + res.rpath
        return dict(page='jobs', model='Job', src=src)

    @expose('json')
    def delete(self, _id):
        user = handler.user.get_user_in_session(request)
        if not checker.can_edit_job(user.id, _id):
            return {
                'error': "You have don't have the right to delete this job"
            }
        job = DBSession.query(Job).filter(Job.id == _id).first()
        # TODO delete results (DB + filesystem)
        DBSession.delete(job)
        raise redirect('/jobs')

    @expose()
    def traceback(self, id):
        job = DBSession.query(Job).filter(Job.id == id).first()
        if job.traceback:
            return job.traceback
        return 'no traceback.'
Ejemplo n.º 29
0
class TrackhubController(BaseController):
    allow_only = has_any_permission(gl.perm_admin, gl.perm_user)

    @with_trailing_slash
    @expose('biorepo.templates.list_no_new')
    def index(self, *args, **kw):
        user = handler.user.get_user_in_session(request)
        user_lab = session.get("current_lab", None)
        mail = user.email
        mail_tmp = mail.split("@")
        mail_final = mail_tmp[0] + "AT" + mail_tmp[1]
        user_TH_path = trackhubs_path() + "/" + user_lab + "/" + mail_final
        trackhubs = []
        if os.path.exists(user_TH_path):
            list_trackhubs = os.listdir(user_TH_path)
            for t in list_trackhubs:
                th_path = user_TH_path + "/" + t
                #the only one directory into at this th level is named by the assembly used for it
                for i in os.listdir(th_path):
                    path_to_test = th_path + "/" + i
                    if os.path.isdir(path_to_test):
                        assembly = i
                if not assembly:
                    break
                else:
                    #hub_url = th_path + "/hub.txt"
                    hostname = socket.gethostname().lower()
                    #because of aliasing
                    if hostname == "ptbbsrv2.epfl.ch":
                        hostname = "biorepo.epfl.ch"
                    hub_url = "http://" + hostname + url(
                        "/trackHubs/"
                    ) + user_lab + "/" + mail_final + "/" + t + "/hub.txt"
                    th = Trackhub(
                        t, 'http://genome.ucsc.edu/cgi-bin/hgTracks?hubUrl=' +
                        hub_url + "&db=" + assembly)
                    trackhubs.append(th)

        all_trackhubs = [
            util.to_datagrid(TrackhubGrid(), trackhubs, " UCSC's Trackhub(s)",
                             len(trackhubs) > 0)
        ]

        return dict(page='trackhubs',
                    model=trackhubs,
                    items=all_trackhubs,
                    value=kw)

    @expose('biorepo.templates.edit_trackhub')
    def edit(self, *args, **kw):
        th_name = str(args[0])
        session["th_name"] = th_name
        session.save()
        user = handler.user.get_user_in_session(request)
        user_lab = session.get("current_lab", None)
        mail_path = str(user._email).lower().replace('@', 'AT')

        if user_lab is None:
            flash(
                "Problem detected with your lab in session. Contact your administrator please",
                'error')
            raise redirect('/trackhubs')

        complementary_path = str(
            user_lab) + "/" + mail_path + "/" + th_name + "/"
        th_path = trackhubs_path() + "/" + complementary_path
        genome_path = th_path + "genomes.txt"
        if os.path.exists(genome_path):
            #get the final path
            with open(genome_path, 'r') as gen:
                l = gen.readline()
                while l != '':
                    if l.startswith("trackDb"):
                        trackdb_path = l.split('trackDb')[1].strip()
                    l = gen.readline()
            final_path = th_path + trackdb_path + "trackDb.txt"
            with open(final_path, 'r') as final:
                l = final.readline()
                dic_colors = {}
                cpt = 0
                while l != '':
                    if l.startswith("\ttrack"):
                        track = l.split("\ttrack")[1].strip()
                        dic_colors[cpt] = track
                        cpt += 1
                    elif l.startswith("\tcolor"):
                        color = l.split("\tcolor")[1].strip()
                        dic_colors[cpt] = color
                        cpt += 1
                    l = final.readline()

            t_length = len(dic_colors.keys())
            edit_form = build_form_edit_th(t_length)(
                action=url('/trackhubs/post_edit')).req()
            for k, v in dic_colors.items():
                #even --> track
                if (k % 2 == 0):
                    edit_form.child.children[k].value = v
                #odd --> color
                else:
                    edit_form.child.children[k].value = v

            return dict(page='trackhubs', widget=edit_form, value=kw)
        else:
            flash(
                "Your trackhub is not accessible right now. Hardware problem on /data. Sorry for this inconvenient, retry in a fiew moment please.",
                'error')
            raise redirect('/trackhubs')

    @expose()
    def post_edit(self, *args, **kw):
        dic_colors = {}
        th_name = session["th_name"]
        user = handler.user.get_user_in_session(request)
        user_lab = session.get("current_lab", None)
        mail_path = str(user._email).lower().replace('@', 'AT')
        for key in kw.keys():
            if key.startswith('Color_Track_'):
                key_id = key.replace('Color_Track_', '')
                dic_colors[int(key_id)] = kw[key] + "\n\n"

        #paths...
        complementary_path = str(
            user_lab) + "/" + mail_path + "/" + th_name + "/"
        th_path = trackhubs_path() + "/" + complementary_path
        genome_path = th_path + "genomes.txt"
        if os.path.exists(genome_path):
            #get the final path
            with open(genome_path, 'r') as gen:
                l = gen.readline()
                while l != '':
                    if l.startswith("trackDb"):
                        trackdb_path = l.split('trackDb')[1].strip()
                    l = gen.readline()
            source_path = th_path + trackdb_path + "trackDb.txt"
            final_path_tmp = th_path + trackdb_path + "trackDb_tmp.txt"
            with open(source_path, 'r') as source:
                with open(final_path_tmp, 'a') as destination:
                    l = source.readline()
                    color_cpt = 0
                    while l != '':
                        if l.startswith("\tcolor "):
                            color_cpt += 1
                            destination.write("\tcolor " +
                                              dic_colors[color_cpt])
                        else:
                            destination.write(l)
                        l = source.readline()

            # remove old file
            os.remove(source_path)
            # rename new one
            os.rename(final_path_tmp, source_path)
            flash("Trackhub edited !")
            raise redirect("/trackhubs")
        else:
            flash(
                "Your trackhub is not accessible right now. Hardware problem on /data. Sorry for this inconvenient, retry in a fiew moment please.",
                'error')
            raise redirect('/trackhubs')

    @expose()
    def delete(self, *args, **kw):
        th_name = str(args[0])
        user = handler.user.get_user_in_session(request)
        user_lab = session.get("current_lab", None)
        mail = user.email
        mail_tmp = mail.split("@")
        mail_final = mail_tmp[0] + "AT" + mail_tmp[1]
        user_path = trackhubs_path() + "/" + user_lab + "/" + mail_final
        th_path = user_path + "/" + th_name
        try:
            shutil.rmtree(th_path)
            flash("Your trackhub " + th_name + " was deleted.")
        except:
            flash(
                "Error : your trackhub was not deleted. Contact the administrator please.",
                'error')
        raise redirect(url('/trackhubs'))