source: publico/il.spdo/trunk/il/spdo/browser/forms/pessoa.py @ 5942

Última Alteração nesse arquivo desde 5942 foi 5942, incluída por fabianosantos, 7 anos atrás

Exigir ROLE_GESTOR ou ROLE_ADMIN para definir a área de lotação de uma pessoa

File size: 3.5 KB
Linha 
1# -*- coding: utf-8 -*-
2
3from five import grok
4from zope.component import getUtility
5from plone.app.layout.navigation.interfaces import INavigationRoot
6
7from il.spdo.browser.forms import base
8from il.spdo.config import MessageFactory as _
9from il.spdo.config import Session
10from il.spdo.interfaces import IPessoa
11from il.spdo.db import Pessoa
12from il.spdo.log import log
13from il.spdo.interfaces import ISecurityChecker
14
15class PessoaAddForm(base.AddForm):
16    """Formulário de cadastro de uma pessoa.
17    """
18
19    grok.context(INavigationRoot)
20    grok.name('add-pessoa')
21    grok.require('zope2.View')
22
23    schema = IPessoa
24    klass = Pessoa
25    label = _(u'Adicionar Pessoa')
26    description = _(u'Formulário de cadastro de uma pessoa.')
27
28    def update(self):
29        sc = getUtility(ISecurityChecker)
30        sc.enforce('acessar_add_pessoa')
31        super(PessoaAddForm, self).update()
32
33    @log
34    def createAndAdd(self, data):
35        del data['id']
36
37        # garante que alguns campos são armazenados apenas como
38        # números, mesmo sendo strings
39        for campo in ('cep', 'cpf_cnpj'):
40            if data[campo] is not None:
41                data[campo] = ''.join([c for c in data[campo] if c.isdigit()])
42
43        # ROLE_ADMIN ou ROLE_GESTOR são necessários para definir a
44        # lotação de uma pessoa. Isso é importante para evitar que um
45        # operador modifique a própria lotação para contornar
46        # restrições de segurança.
47        sc = getUtility(ISecurityChecker)
48        if not sc.check('lotacao_pessoa'):
49            del data['area_id']
50
51        pessoa = Pessoa(**data)
52        session = Session()
53        session.add(pessoa)
54        session.flush()
55
56class PessoaEditForm(base.EditForm):
57    """Formulário de edição de uma pessoa.
58    """
59
60    grok.context(INavigationRoot)
61    grok.name('edit-pessoa')
62    grok.require('zope2.View')
63
64    schema = IPessoa
65    klass = Pessoa
66    label = _(u'Editar Pessoa')
67    descrition = _(u'Formulário de edição de uma pessoa.')
68
69    def update(self):
70        sc = getUtility(ISecurityChecker)
71        sc.enforce('acessar_edit_pessoa')
72        super(PessoaEditForm, self).update()
73
74    @log
75    def applyChanges(self, data):
76        content = self.getContent()
77        if content:
78            for k, v in data.items():
79
80                # garante que alguns campos são armazenados apenas
81                # como números, mesmo sendo strings
82                if k in ('cep', 'cpf_cnpj') and v is not None:
83                    v = ''.join([c for c in v if c.isdigit()])
84
85                # ROLE_ADMIN ou ROLE_GESTOR são necessários para
86                # definir a lotação de uma pessoa. Isso é importante
87                # para evitar que um operador modifique a própria
88                # lotação para contornar restrições de segurança.
89                if k == 'area_id':
90                    sc = getUtility(ISecurityChecker)
91                    if not sc.check('lotacao_pessoa'):
92                        continue
93               
94                setattr(content, k, v)
95
96class PessoaShowForm(base.ShowForm):
97    """Formulário de visualização de uma pessoa.
98    """
99   
100    grok.context(INavigationRoot)
101    grok.name('show-pessoa')
102    grok.require('zope2.View')
103
104    schema = IPessoa
105    klass = Pessoa
106    label = _(u'Detalhes da Pessoa')
107    description = _(u'Formulário de visualização de uma pessoa.')
108
109    def update(self):
110        sc = getUtility(ISecurityChecker)
111        sc.enforce('acessar_show_pessoa')
112        super(PessoaShowForm, self).update()
Note: Veja TracBrowser para ajuda no uso do navegador do trac.
 

The contents and data of this website are published under license:
Creative Commons 4.0 Brasil - Atribuir Fonte - Compartilhar Igual.