source: publico/il.spdo/trunk/il/spdo/browser/forms/base.py

Última Alteração nesse arquivo foi 8040, incluída por jeanferri, 6 anos atrás

Fix bug related to thousands separators on int fields.

File size: 5.8 KB
Linha 
1# -*- coding: utf-8 -*-
2
3from sqlalchemy.exc import IntegrityError
4
5from five import grok
6from z3c.form import button
7from plone.directives import form
8from plone.app.layout.navigation.interfaces import INavigationRoot
9from Products.statusmessages.interfaces import IStatusMessage
10
11from il.spdo.config import MessageFactory as _
12from il.spdo.config import Session
13from il.spdo.log import log, logger
14from il.spdo.nav import go
15
16def vs(klass):
17    return klass.__name__.lower()
18
19class AddForm(form.SchemaForm):
20    """Formulário base de cadastro.
21    """
22
23    grok.context(INavigationRoot)
24
25    ignoreContext = True
26
27    def createAndAdd(self, data):
28        raise NotImplementedError
29
30    def nextURL(self):
31        go('list-'+vs(self.klass))
32
33    def cancelURL(self):
34        self.nextURL()
35
36    @button.buttonAndHandler(_(u'Cadastrar'), name='cadastrar')
37    def handleCadastrar(self, action):
38        data, errors = self.extractData()
39        if errors:
40            self.status = self.formErrorsMessage
41            return
42        status = IStatusMessage(self.request)
43        try:
44            obj = self.createAndAdd(data)
45            session = Session()
46            session.flush()
47        except IntegrityError, e:
48            msg = _(u'Falha de integridade relacional: ' + str(e))
49            status.add(msg, 'error')
50            logger(msg)
51            raise
52        else:
53            status.add(_(u'Cadastro efetuado com sucesso.'), 'info')
54            self.nextURL()
55
56    @button.buttonAndHandler(_(u'Cancelar'), name='cancelar')
57    def handleCancelar(self, action):
58        self.cancelURL()
59
60    def updateActions(self):
61        self.request.set('disable_border', True)
62        super(AddForm, self).updateActions()
63        self.actions["cadastrar"].addClass("context")
64        self.actions["cancelar"].addClass("standalone")
65
66
67class EditForm(form.SchemaForm):
68    """Formulário base de edição dos formmulários.
69    """
70
71    grok.context(INavigationRoot)
72
73    def getContent(self):
74        session = Session()
75        return session.query(self.klass).get(self.rec_id())
76
77    @log
78    def applyChanges(self, data):
79        content = self.getContent()
80        if content:
81            for k, v in data.items():
82                setattr(content, k, v)
83
84    def nextURL(self):
85        go('show-'+vs(self.klass), id=self.rec_id())
86
87    def rec_id(self):
88
89        ret = self.request.get('id', self.request.get('form.widgets.id', None))
90
91        # Bug reportado pela AL-RO: por algum motivo, o widget padrão
92        # do schema.Int adiciona separador de milhar. Como utilizo
93        # campos int para reter os id nos formularios de edição faz-se
94        # necessário limpar os "." Nas views o id é passado por GET e
95        # esse bug, obviamente, não se manifesta.
96
97        if ret is not None:
98            ret = ret.replace('.', '')
99
100        return ret
101
102    @button.buttonAndHandler(_(u'Salvar'), name='salvar')
103    def handleSalvar(self, action):
104        data, errors = self.extractData()
105        if errors:
106            self.status = self.formErrorsMessage
107            return
108        status = IStatusMessage(self.request)
109        try:
110            self.applyChanges(data)
111            session = Session()
112            session.flush()
113        except IntegrityError, e:
114            msg = _(u'Falha de integridade relacional: ' + str(e))
115            status.add(msg, 'error')
116            logger(msg)
117            raise
118        else:
119            status.add(_(u"Alterações efetuadas"), "info")
120            self.nextURL()
121
122    @button.buttonAndHandler(_(u'Cancelar'), name='cancelar')
123    def handleCancelar(self, action):
124        self.nextURL()
125
126    def updateActions(self):
127        self.request.set('disable_border', True)
128        super(EditForm, self).updateActions()
129        self.actions["salvar"].addClass("context")
130        self.actions["cancelar"].addClass("standalone")
131
132
133class ShowForm(form.SchemaForm):
134    """Formulário base de visualização.
135    """
136
137    grok.context(INavigationRoot)
138
139    mode = 'display'
140
141    @log
142    def removeItem(self):
143        content = self.getContent()
144        status = IStatusMessage(self.request)
145        try:
146            session = Session()
147            session.delete(content)
148            session.flush()
149        except AssertionError, e:
150            msg = _(u'Falha de integridade relacional: ' + str(e))
151            status.add(msg, 'error')
152            logger(msg)
153            raise
154        else:
155            status.add(_(u'Registro removido.'), 'info')
156            self.nextURL()
157
158    def getContent(self):
159        session = Session()
160        return session.query(self.klass).get(self.rec_id())
161
162    def nextURL(self):
163        go('list-'+vs(self.klass))
164
165    def editURL(self):
166        go('edit-'+vs(self.klass), id=self.rec_id())
167
168    def rec_id(self):
169
170        ret = self.request.get('id', self.request.get('form.widgets.id', None))
171
172        # Bug reportado pela AL-RO: por algum motivo, o widget padrão
173        # do schema.Int adiciona separador de milhar. Como utilizo
174        # campos int para reter os id nos formularios de edição faz-se
175        # necessário limpar os "." Nas views o id é passado por GET e
176        # esse bug, obviamente, não se manifesta.
177
178        if ret is not None:
179            ret = ret.replace('.', '')
180
181        return ret
182
183    @button.buttonAndHandler(_(u'Editar'), name='editar')
184    def handleEditar(self, action):
185        self.editURL()
186
187    @button.buttonAndHandler(_(u'Excluir'), name='excluir')
188    def handleExcluir(self, action):
189        self.removeItem()
190
191    @button.buttonAndHandler(_(u'Voltar'), name='voltar')
192    def handleVoltar(self, action):
193        self.nextURL()
194
195    def updateActions(self):
196        self.request.set('disable_border', True)
197        super(ShowForm, self).updateActions()
198        self.actions["editar"].addClass("context")
199        self.actions["excluir"].addClass("context")
200        self.actions["voltar"].addClass("standalone")
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.