Merge lp:~xmo-deactivatedaccount/openobject-client-web/trunk-various-stuff into lp:openobject-client-web/trunk
- trunk-various-stuff
- Merge into trunk
Proposed by
Xavier (Open ERP)
Status: | Merged |
---|---|
Merged at revision: | not available |
Proposed branch: | lp:~xmo-deactivatedaccount/openobject-client-web/trunk-various-stuff |
Merge into: | lp:openobject-client-web/trunk |
Diff against target: |
7425 lines (+1176/-1648) (has conflicts) 100 files modified
addons/openerp/__init__.py (+0/-1) addons/openerp/controllers/__init__.py (+0/-3) addons/openerp/controllers/actions.py (+13/-22) addons/openerp/controllers/attachment.py (+4/-9) addons/openerp/controllers/controllers.py (+0/-5) addons/openerp/controllers/database.py (+6/-16) addons/openerp/controllers/error_page.py (+16/-24) addons/openerp/controllers/fieldpref.py (+3/-14) addons/openerp/controllers/form.py (+42/-59) addons/openerp/controllers/image.py (+5/-9) addons/openerp/controllers/impex.py (+24/-39) addons/openerp/controllers/listgrid.py (+13/-22) addons/openerp/controllers/modules.py (+19/-21) addons/openerp/controllers/openm2m.py (+7/-22) addons/openerp/controllers/openm2o.py (+5/-18) addons/openerp/controllers/openo2m.py (+19/-32) addons/openerp/controllers/preferences.py (+3/-15) addons/openerp/controllers/process.py (+7/-15) addons/openerp/controllers/record.py (+3/-7) addons/openerp/controllers/requests.py (+3/-9) addons/openerp/controllers/root.py (+16/-31) addons/openerp/controllers/search.py (+72/-84) addons/openerp/controllers/selection.py (+3/-12) addons/openerp/controllers/shortcuts.py (+4/-10) addons/openerp/controllers/templates/view_log.mako (+5/-6) addons/openerp/controllers/translator.py (+3/-12) addons/openerp/controllers/tree.py (+14/-23) addons/openerp/controllers/utils.py (+1/-7) addons/openerp/controllers/view_log.py (+28/-43) addons/openerp/controllers/viewed.py (+13/-26) addons/openerp/controllers/viewlist.py (+4/-12) addons/openerp/controllers/wizard.py (+11/-23) addons/openerp/controllers/workflow.py (+7/-19) addons/openerp/tests/test_root_controller.py (+0/-3) addons/openerp/utils/__init__.py (+1/-4) addons/openerp/utils/cache.py (+2/-3) addons/openerp/utils/common.py (+2/-3) addons/openerp/utils/icons.py (+4/-5) addons/openerp/utils/rpc.py (+19/-20) addons/openerp/utils/rpc_utils.py (+4/-5) addons/openerp/utils/tiny_socket.py (+0/-1) addons/openerp/utils/tools.py (+17/-18) addons/openerp/utils/utils.py (+2/-3) addons/openerp/validators/validators.py (+0/-1) addons/openerp/widgets/__init__.py (+0/-3) addons/openerp/widgets/_interface.py (+9/-10) addons/openerp/widgets/_views.py (+25/-28) addons/openerp/widgets/form/_action.py (+4/-5) addons/openerp/widgets/form/_binary.py (+10/-11) addons/openerp/widgets/form/_form.py (+53/-54) addons/openerp/widgets/form/_m2m.py (+3/-4) addons/openerp/widgets/form/_m2o.py (+0/-1) addons/openerp/widgets/form/_o2m.py (+24/-9) addons/openerp/widgets/form/_ref.py (+2/-3) addons/openerp/widgets/form_view.py (+7/-8) addons/openerp/widgets/listgrid.py (+47/-69) addons/openerp/widgets/listgroup.py (+33/-63) addons/openerp/widgets/pager.py (+0/-1) addons/openerp/widgets/screen.py (+7/-8) addons/openerp/widgets/search.py (+100/-146) addons/openerp/widgets/sidebar.py (+10/-11) addons/openerp/widgets/templates/search.mako (+2/-2) addons/openerp/widgets/tree_view.py (+3/-4) addons/openerp/widgets/treegrid.py (+0/-1) addons/view_calendar/controllers/_calendar.py (+4/-7) addons/view_calendar/widgets/_base.py (+0/-3) addons/view_calendar/widgets/_views.py (+5/-6) addons/view_calendar/widgets/utils.py (+0/-3) addons/view_calendar/widgets/widgets.py (+0/-3) addons/view_graph/__init__.py (+0/-1) addons/view_graph/__terp__.py (+0/-1) addons/view_graph/widgets/_graph.py (+62/-73) addons/view_graph/widgets/_views.py (+5/-5) addons/widget_tinymce/widgets/_tinymce.py (+2/-5) addons/widget_wiki/controllers/wiki.py (+2/-2) addons/widget_wiki/widgets/wiki.py (+5/-6) openobject/__init__.py (+4/-5) openobject/addons.py (+30/-32) openobject/admin/__init__.py (+0/-1) openobject/admin/_admin.py (+8/-8) openobject/admin/i18n/_commands.py (+63/-63) openobject/commands.py (+10/-11) openobject/controllers/_base.py (+11/-13) openobject/controllers/_root.py (+12/-13) openobject/i18n/_gettext.py (+14/-14) openobject/i18n/format.py (+3/-3) openobject/i18n/utils.py (+4/-4) openobject/pooler.py (+19/-21) openobject/tools/__init__.py (+0/-1) openobject/tools/_expose.py (+28/-28) openobject/tools/_tools.py (+0/-2) openobject/tools/_utils.py (+11/-12) openobject/tools/_validate.py (+0/-1) openobject/validators/_base.py (+0/-1) openobject/widgets/_base.py (+64/-66) openobject/widgets/_js_i18n.py (+8/-12) openobject/widgets/_meta.py (+3/-4) openobject/widgets/_resource.py (+5/-6) openobject/widgets/_utils.py (+0/-2) openobject/widgets/_widgets.py (+31/-33) Text conflict in addons/openerp/widgets/form/_o2m.py |
To merge this branch: | bzr merge lp:~xmo-deactivatedaccount/openobject-client-web/trunk-various-stuff |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Christophe Simonis (OpenERP) | Needs Fixing | ||
Amit Mendapara | Pending | ||
OpenERP Core Team | Pending | ||
Review via email: mp+20958@code.launchpad.net |
Commit message
Description of the change
Small improvements (mostly style) done while reading the code
To post a comment you must log in.
Revision history for this message
Christophe Simonis (OpenERP) (kangol) wrote : | # |
review:
Needs Fixing
- 2945. By Xavier (Open ERP)
-
[fix] <group/> broken in <email address hidden>
Revision history for this message
Xavier (Open ERP) (xmo-deactivatedaccount) wrote : | # |
Fixed, thanks
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'addons/openerp/__init__.py' |
2 | --- addons/openerp/__init__.py 2009-11-10 09:21:45 +0000 |
3 | +++ addons/openerp/__init__.py 2010-03-09 13:30:53 +0000 |
4 | @@ -3,4 +3,3 @@ |
5 | import controllers |
6 | |
7 | import utils |
8 | - |
9 | |
10 | === modified file 'addons/openerp/controllers/__init__.py' |
11 | --- addons/openerp/controllers/__init__.py 2010-02-04 12:16:22 +0000 |
12 | +++ addons/openerp/controllers/__init__.py 2010-03-09 13:30:53 +0000 |
13 | @@ -31,6 +31,3 @@ |
14 | import workflow |
15 | import process |
16 | import modules |
17 | - |
18 | -# vim: ts=4 sts=4 sw=4 si et |
19 | - |
20 | |
21 | === modified file 'addons/openerp/controllers/actions.py' |
22 | --- addons/openerp/controllers/actions.py 2010-01-13 13:41:55 +0000 |
23 | +++ addons/openerp/controllers/actions.py 2010-03-09 13:30:53 +0000 |
24 | @@ -29,24 +29,18 @@ |
25 | |
26 | """This module implementes action methods. |
27 | """ |
28 | - |
29 | -import time |
30 | import base64 |
31 | import datetime |
32 | +import time |
33 | |
34 | import cherrypy |
35 | +from openerp.utils import rpc, common, expr_eval, TinyDict |
36 | |
37 | +from form import Form |
38 | from openobject import tools |
39 | - |
40 | -from openerp.utils import rpc |
41 | -from openerp.utils import common |
42 | -from openerp.utils import expr_eval |
43 | -from openerp.utils import TinyDict |
44 | - |
45 | -from form import Form |
46 | +from selection import Selection |
47 | from tree import Tree |
48 | from wizard import Wizard |
49 | -from selection import Selection |
50 | |
51 | |
52 | def execute_window(view_ids, model, res_id=False, domain=None, view_type='form', context={}, |
53 | @@ -72,10 +66,10 @@ |
54 | params.domain = domain or [] |
55 | params.context = context or {} |
56 | params.limit = limit |
57 | - |
58 | + |
59 | cherrypy.request._terp_view_name = name or None |
60 | cherrypy.request._terp_view_target = target or None |
61 | - |
62 | + |
63 | if params.ids and not isinstance(params.ids, list): |
64 | params.ids = [params.ids] |
65 | |
66 | @@ -202,10 +196,10 @@ |
67 | elif action['type'] in ['ir.actions.act_window', 'ir.actions.submenu']: |
68 | for key in ('res_id', 'res_model', 'view_type','view_mode', 'limit'): |
69 | data[key] = action.get(key, data.get(key, None)) |
70 | - |
71 | + |
72 | if not data.get('limit'): |
73 | data['limit'] = 80 |
74 | - |
75 | + |
76 | view_ids=False |
77 | if action.get('views', []): |
78 | if isinstance(action['views'], list): |
79 | @@ -223,14 +217,14 @@ |
80 | ctx = data.get('context', {}).copy() |
81 | ctx.update({'active_id': data.get('id', False), 'active_ids': data.get('ids', [])}) |
82 | ctx.update(expr_eval(action.get('context', '{}'), ctx.copy())) |
83 | - |
84 | + |
85 | search_view = action.get('search_view_id') |
86 | if search_view: |
87 | if isinstance(search_view, (list, tuple)): |
88 | ctx['search_view'] = search_view[0] |
89 | else: |
90 | ctx['search_view'] = search_view |
91 | - |
92 | + |
93 | # save active_id in session |
94 | rpc.session.active_id = data.get('id') |
95 | |
96 | @@ -251,7 +245,7 @@ |
97 | name=action.get('name'), |
98 | target=action.get('target'), |
99 | limit=data.get('limit')) |
100 | - |
101 | + |
102 | return res |
103 | |
104 | elif action['type']=='ir.actions.server': |
105 | @@ -266,7 +260,7 @@ |
106 | elif action['type']=='ir.actions.wizard': |
107 | if 'window' in data: |
108 | del data['window'] |
109 | - |
110 | + |
111 | |
112 | ctx1 = data.get('context', {}).copy() |
113 | ctx2 = action.get('context', {}).copy() |
114 | @@ -324,7 +318,7 @@ |
115 | |
116 | if type==None: |
117 | type = get_action_type(act_id) |
118 | - |
119 | + |
120 | res = rpc.session.execute('object', 'execute', type, 'read', act_id, False, rpc.session.context) |
121 | return execute(res, **data) |
122 | |
123 | @@ -366,6 +360,3 @@ |
124 | @tools.expose(template="templates/closepopup.mako") |
125 | def close_popup(*args, **kw): |
126 | return dict() |
127 | - |
128 | -# vim: ts=4 sts=4 sw=4 si et |
129 | - |
130 | |
131 | === modified file 'addons/openerp/controllers/attachment.py' |
132 | --- addons/openerp/controllers/attachment.py 2010-01-09 12:38:38 +0000 |
133 | +++ addons/openerp/controllers/attachment.py 2010-03-09 13:30:53 +0000 |
134 | @@ -26,21 +26,16 @@ |
135 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
136 | # |
137 | ############################################################################### |
138 | - |
139 | -import os |
140 | import base64 |
141 | |
142 | +from openerp.controllers import SecuredController |
143 | +from openerp.utils import rpc, common |
144 | + |
145 | from openobject.tools import expose |
146 | |
147 | -from openerp.utils import rpc |
148 | -from openerp.utils import common |
149 | -from openerp.utils import TinyDict |
150 | - |
151 | -from openerp.controllers import SecuredController |
152 | - |
153 | |
154 | class Attachment(SecuredController): |
155 | - |
156 | + |
157 | _cp_path = "/attachment" |
158 | |
159 | @expose() |
160 | |
161 | === modified file 'addons/openerp/controllers/controllers.py' |
162 | --- addons/openerp/controllers/controllers.py 2010-01-09 14:09:46 +0000 |
163 | +++ addons/openerp/controllers/controllers.py 2010-03-09 13:30:53 +0000 |
164 | @@ -30,18 +30,13 @@ |
165 | """ |
166 | This modules implements custom authorization logic for the OpenERP Web Client. |
167 | """ |
168 | - |
169 | import types |
170 | -import cherrypy |
171 | |
172 | from openobject.controllers import BaseController |
173 | - |
174 | from utils import secured |
175 | |
176 | - |
177 | __all__ = ["SecuredController"] |
178 | |
179 | - |
180 | class SecuredController(BaseController): |
181 | |
182 | def __getattribute__( self, name ): |
183 | |
184 | === modified file 'addons/openerp/controllers/database.py' |
185 | --- addons/openerp/controllers/database.py 2010-03-03 12:24:36 +0000 |
186 | +++ addons/openerp/controllers/database.py 2010-03-09 13:30:53 +0000 |
187 | @@ -26,26 +26,16 @@ |
188 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
189 | # |
190 | ############################################################################### |
191 | - |
192 | +import base64 |
193 | import re |
194 | import time |
195 | -import base64 |
196 | |
197 | import cherrypy |
198 | - |
199 | -from openobject.tools import url |
200 | -from openobject.tools import expose |
201 | -from openobject.tools import redirect |
202 | -from openobject.tools import validate |
203 | -from openobject.tools import error_handler |
204 | +from openerp import widgets, validators |
205 | +from openerp.utils import rpc, common |
206 | |
207 | from openobject.controllers import BaseController |
208 | - |
209 | -from openerp.utils import rpc |
210 | -from openerp.utils import common |
211 | - |
212 | -from openerp import widgets |
213 | -from openerp import validators |
214 | +from openobject.tools import url, expose, redirect, validate, error_handler |
215 | |
216 | |
217 | def get_lang_list(): |
218 | @@ -70,7 +60,7 @@ |
219 | self.validator = validators.Schema() |
220 | for f in self.fields: |
221 | self.validator.add_field(f.name, f.validator) |
222 | - |
223 | + |
224 | def update_params(self, d): |
225 | super(DBForm, self).update_params(d) |
226 | d.attrs['action'] = url(self.action) |
227 | @@ -138,7 +128,7 @@ |
228 | } |
229 | |
230 | class Database(BaseController): |
231 | - |
232 | + |
233 | _cp_path = "/database" |
234 | |
235 | @expose() |
236 | |
237 | === modified file 'addons/openerp/controllers/error_page.py' |
238 | --- addons/openerp/controllers/error_page.py 2010-01-11 10:07:02 +0000 |
239 | +++ addons/openerp/controllers/error_page.py 2010-03-09 13:30:53 +0000 |
240 | @@ -26,26 +26,18 @@ |
241 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
242 | # |
243 | ############################################################################### |
244 | - |
245 | +import cgitb |
246 | import sys |
247 | -import cgitb |
248 | |
249 | import cherrypy |
250 | - |
251 | -from openobject.tools import expose |
252 | -from openobject.tools import redirect |
253 | +from openerp import widgets |
254 | +from openerp.utils import rpc, common |
255 | |
256 | from openobject.controllers import BaseController |
257 | - |
258 | -from openerp.utils import rpc |
259 | -from openerp.utils import common |
260 | -from openerp.utils import TinyDict |
261 | - |
262 | -from openerp import widgets |
263 | - |
264 | +from openobject.tools import expose, redirect |
265 | |
266 | class ErrorPage(BaseController): |
267 | - |
268 | + |
269 | _cp_path = "/errorpage" |
270 | |
271 | nb = widgets.form.Notebook() |
272 | @@ -56,36 +48,36 @@ |
273 | |
274 | def render(self): |
275 | etype, value, tb = sys.exc_info() |
276 | - |
277 | + |
278 | if isinstance(value, common.Concurrency): |
279 | return self.__render(value) |
280 | - |
281 | + |
282 | if not isinstance(value, common.TinyException): |
283 | return cgitb.html((etype, value, tb)) |
284 | - |
285 | + |
286 | return self.__render(value) |
287 | |
288 | @expose(template="templates/error_page.mako") |
289 | def __render(self, value): |
290 | - |
291 | + |
292 | maintenance = None |
293 | concurrency = False |
294 | - |
295 | + |
296 | all_params = cherrypy.request.params |
297 | - |
298 | + |
299 | title=value.title |
300 | error=value.message |
301 | - |
302 | + |
303 | target = cherrypy.request.path_info or '/form/save' |
304 | - |
305 | + |
306 | if isinstance(value, common.Concurrency): |
307 | concurrency = True |
308 | - |
309 | + |
310 | if isinstance(value, common.TinyError): |
311 | proxy = rpc.RPCProxy('maintenance.contract') |
312 | maintenance = proxy.status() |
313 | - |
314 | - return dict(title=title, error=error, maintenance=maintenance, nb=self.nb, |
315 | + |
316 | + return dict(title=title, error=error, maintenance=maintenance, nb=self.nb, |
317 | concurrency=concurrency, all_params=all_params, target=target) |
318 | |
319 | @expose('json') |
320 | |
321 | === modified file 'addons/openerp/controllers/fieldpref.py' |
322 | --- addons/openerp/controllers/fieldpref.py 2010-01-09 12:38:38 +0000 |
323 | +++ addons/openerp/controllers/fieldpref.py 2010-03-09 13:30:53 +0000 |
324 | @@ -26,24 +26,13 @@ |
325 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
326 | # |
327 | ############################################################################### |
328 | - |
329 | -import os |
330 | -import time |
331 | - |
332 | -import cherrypy |
333 | +from openerp.controllers import SecuredController |
334 | +from openerp.utils import rpc, TinyDict, TinyForm |
335 | |
336 | from openobject.tools import expose |
337 | |
338 | -from openerp.utils import rpc |
339 | -from openerp.utils import common |
340 | -from openerp.utils import TinyDict |
341 | -from openerp.utils import TinyForm |
342 | - |
343 | -from openerp.controllers import SecuredController |
344 | - |
345 | - |
346 | class FieldPref(SecuredController): |
347 | - |
348 | + |
349 | _cp_path = "/fieldpref" |
350 | |
351 | @expose(template="templates/fieldpref.mako") |
352 | |
353 | === modified file 'addons/openerp/controllers/form.py' |
354 | --- addons/openerp/controllers/form.py 2010-02-04 12:16:22 +0000 |
355 | +++ addons/openerp/controllers/form.py 2010-03-09 13:30:53 +0000 |
356 | @@ -26,39 +26,22 @@ |
357 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
358 | # |
359 | ############################################################################### |
360 | - |
361 | +import base64 |
362 | import re |
363 | -import base64 |
364 | |
365 | import cherrypy |
366 | - |
367 | -from openobject.tools import expose |
368 | -from openobject.tools import redirect |
369 | -from openobject.tools import validate |
370 | -from openobject.tools import error_handler |
371 | -from openobject.tools import exception_handler |
372 | - |
373 | -from openerp import utils |
374 | - |
375 | -from openerp.utils import rpc |
376 | -from openerp.utils import cache |
377 | -from openerp.utils import common |
378 | -from openerp.utils import TinyDict |
379 | -from openerp.utils import TinyForm |
380 | - |
381 | +from openerp import utils, widgets as tw, validators |
382 | from openerp.controllers import SecuredController |
383 | - |
384 | -from openerp import widgets as tw |
385 | -from openerp import validators |
386 | - |
387 | +from openerp.utils import rpc, cache, common, TinyDict, TinyForm |
388 | from openerp.widgets.form import generate_url_for_picture |
389 | |
390 | +from openobject.tools import expose, redirect, validate, error_handler, exception_handler |
391 | |
392 | def make_domain(name, value, kind='char'): |
393 | """A helper function to generate domain for the given name, value pair. |
394 | Will be used for search window... |
395 | """ |
396 | - |
397 | + |
398 | if isinstance(value, int) and not isinstance(value, bool): |
399 | return [(name, '=', value)] |
400 | |
401 | @@ -77,10 +60,10 @@ |
402 | return [(name, '<=', end)] |
403 | |
404 | return None |
405 | - |
406 | + |
407 | if kind == "selection" and value: |
408 | return [(name, '=', value)] |
409 | - |
410 | + |
411 | if isinstance(value, basestring) and value: |
412 | return [(name, 'ilike', value)] |
413 | |
414 | @@ -105,10 +88,10 @@ |
415 | domain = domain or [] |
416 | context = context or {} |
417 | data = data or {} |
418 | - |
419 | + |
420 | proxy = rpc.RPCProxy(model) |
421 | fields = proxy.fields_get([], {}) |
422 | - |
423 | + |
424 | search_domain = domain[:] |
425 | search_data = {} |
426 | |
427 | @@ -153,9 +136,9 @@ |
428 | |
429 | cherrypy.request.terp_validators = {} |
430 | cherrypy.request.terp_data = data |
431 | - |
432 | + |
433 | params.nodefault = True |
434 | - |
435 | + |
436 | form = self.create_form(params) |
437 | cherrypy.request.terp_form = form |
438 | |
439 | @@ -187,9 +170,9 @@ |
440 | raise tg_exceptions |
441 | |
442 | class Form(SecuredController): |
443 | - |
444 | + |
445 | _cp_path = "/form" |
446 | - |
447 | + |
448 | def create_form(self, params, tg_errors=None): |
449 | if tg_errors: |
450 | return cherrypy.request.terp_form |
451 | @@ -234,24 +217,24 @@ |
452 | buttons.can_attach = id and mode == 'form' |
453 | buttons.has_attach = buttons.can_attach and len(form.sidebar.attachments) |
454 | buttons.i18n = not editable and mode == 'form' |
455 | - |
456 | + |
457 | from openerp.widgets import get_registered_views |
458 | buttons.views = [] |
459 | - |
460 | + |
461 | views = get_registered_views() |
462 | for k, v in views: |
463 | active = k in params.view_mode and mode != k |
464 | buttons.views.append(dict(kind=k, name=v.name, desc=v.desc, active=active)) |
465 | - |
466 | + |
467 | target = getattr(cherrypy.request, '_terp_view_target', None) |
468 | buttons.toolbar = target != 'new' and not form.is_dashboard |
469 | |
470 | if cache.can_write('ir.ui.view'): |
471 | links.view_manager = True |
472 | - |
473 | + |
474 | if cache.can_write('workflow'): |
475 | links.workflow_manager = True |
476 | - |
477 | + |
478 | buttons.process = cache.can_read('process.process') |
479 | |
480 | pager = None |
481 | @@ -280,7 +263,7 @@ |
482 | |
483 | params.editable = True |
484 | params.view_type = 'form' |
485 | - |
486 | + |
487 | cherrypy.request._terp_view_target = kw.get('target') |
488 | |
489 | if params.view_mode and 'form' not in params.view_mode: |
490 | @@ -319,7 +302,7 @@ |
491 | |
492 | params.editable = False |
493 | params.view_type = 'form' |
494 | - |
495 | + |
496 | cherrypy.request._terp_view_target = kw.get('target') |
497 | |
498 | if params.view_mode and 'form' not in params.view_mode: |
499 | @@ -412,7 +395,7 @@ |
500 | |
501 | if terp_save_only: |
502 | return dict(params=params, data=data) |
503 | - |
504 | + |
505 | def get_params(p, f): |
506 | |
507 | pp = p.chain_get(f) |
508 | @@ -448,7 +431,7 @@ |
509 | 'limit': params.limit, |
510 | 'count': params.count, |
511 | 'search_domain': ustr(params.search_domain)} |
512 | - |
513 | + |
514 | if params.editable or params.source or params.return_edit: |
515 | raise redirect(self.path + '/edit', source=params.source, **args) |
516 | |
517 | @@ -617,7 +600,7 @@ |
518 | proxy.write([params.id], {params.field: False, params.fname: False}, ctx) |
519 | else: |
520 | proxy.write([params.id], {params.field: False}, ctx) |
521 | - |
522 | + |
523 | args = {'model': params.model, |
524 | 'id': params.id, |
525 | 'ids': ustr(params.ids), |
526 | @@ -629,7 +612,7 @@ |
527 | 'limit': params.limit, |
528 | 'count': params.count, |
529 | 'search_domain': ustr(params.search_domain)} |
530 | - |
531 | + |
532 | raise redirect(self.path + '/edit', **args) |
533 | |
534 | @expose() |
535 | @@ -856,33 +839,33 @@ |
536 | @expose() |
537 | def action(self, **kw): |
538 | params, data = TinyDict.split(kw) |
539 | - |
540 | + |
541 | id = params.id or False |
542 | ids = params.selection or [] |
543 | - |
544 | + |
545 | if not ids and id: |
546 | ids = [id] |
547 | - |
548 | + |
549 | if not id and ids: |
550 | id = ids[0] |
551 | - |
552 | + |
553 | domain = params.domain or [] |
554 | context = params.context or {} |
555 | - |
556 | + |
557 | act_id = params.action |
558 | - |
559 | + |
560 | if not params.selection and not params.id: |
561 | raise common.message(_('You must save this record to use the sidebar button!')) |
562 | - |
563 | + |
564 | if not act_id: |
565 | return self.do_action('client_action_multi', datas=kw) |
566 | - |
567 | + |
568 | action_type = rpc.RPCProxy('ir.actions.actions').read(act_id, ['type'], rpc.session.context)['type'] |
569 | action = rpc.session.execute('object', 'execute', action_type, 'read', act_id, False, rpc.session.context) |
570 | - |
571 | + |
572 | action['domain'] = domain or [] |
573 | action['context'] = context or {} |
574 | - |
575 | + |
576 | import actions |
577 | return actions.execute(action, model=params.model, id=id, ids=ids, report_type='pdf') |
578 | |
579 | @@ -955,13 +938,13 @@ |
580 | response = getattr(proxy, func_name)(ids, *args) |
581 | except Exception, e: |
582 | return dict(error=ustr(e)) |
583 | - |
584 | + |
585 | if response is False: # response is False when creating new record for inherited view. |
586 | response = {} |
587 | - |
588 | + |
589 | if 'value' not in response: |
590 | response['value'] = {} |
591 | - |
592 | + |
593 | result.update(response) |
594 | |
595 | # apply validators (transform values from python) |
596 | @@ -1066,16 +1049,16 @@ |
597 | @expose() |
598 | def action_submenu(self, **kw): |
599 | params, data = TinyDict.split(kw) |
600 | - |
601 | + |
602 | import actions |
603 | - |
604 | + |
605 | act_id = rpc.session.execute('object', 'execute', 'ir.model.data', 'search', [('name','=', params.action_id)]) |
606 | res_model = rpc.session.execute('object', 'execute', 'ir.model.data', 'read', act_id, ['res_id']) |
607 | - |
608 | + |
609 | res = rpc.session.execute('object', 'execute', 'ir.actions.act_window', 'read', res_model[0]['res_id'], False) |
610 | - |
611 | + |
612 | if res: |
613 | return actions.execute(res, model=params.model, id=params.id, context=rpc.session.context.copy()) |
614 | |
615 | - |
616 | + |
617 | # vim: ts=4 sts=4 sw=4 si et |
618 | |
619 | === modified file 'addons/openerp/controllers/image.py' |
620 | --- addons/openerp/controllers/image.py 2010-01-09 12:38:38 +0000 |
621 | +++ addons/openerp/controllers/image.py 2010-03-09 13:30:53 +0000 |
622 | @@ -26,22 +26,18 @@ |
623 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
624 | # |
625 | ############################################################################### |
626 | - |
627 | -import os |
628 | import base64 |
629 | |
630 | import cherrypy |
631 | - |
632 | -from openobject.tools import expose |
633 | -from openobject.tools import redirect |
634 | - |
635 | +from openerp.controllers import SecuredController |
636 | from openerp.utils import rpc |
637 | -from openerp.controllers import SecuredController |
638 | from openerp.widgets.form import get_temp_file |
639 | |
640 | +from openobject.tools import expose, redirect |
641 | + |
642 | |
643 | class Image(SecuredController): |
644 | - |
645 | + |
646 | _cp_path = "/image" |
647 | |
648 | @expose(template="templates/image.mako") |
649 | @@ -68,7 +64,7 @@ |
650 | return base64.decodestring(res) |
651 | else: |
652 | return '' |
653 | - |
654 | + |
655 | @expose(content_type='application/octet') |
656 | def get_picture(self, **kw): |
657 | fname = get_temp_file(**kw) |
658 | |
659 | === modified file 'addons/openerp/controllers/impex.py' |
660 | --- addons/openerp/controllers/impex.py 2010-01-09 12:38:38 +0000 |
661 | +++ addons/openerp/controllers/impex.py 2010-03-09 13:30:53 +0000 |
662 | @@ -26,36 +26,21 @@ |
663 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
664 | # |
665 | ############################################################################### |
666 | - |
667 | +import StringIO |
668 | +import csv |
669 | import re |
670 | -import os |
671 | -import csv |
672 | -import time |
673 | -import types |
674 | -import base64 |
675 | -import StringIO |
676 | import xml.dom.minidom |
677 | |
678 | -import cherrypy |
679 | +from openerp.controllers import SecuredController |
680 | +from openerp.utils import rpc, common, TinyDict, node_attributes |
681 | +from openerp.widgets import treegrid, listgrid |
682 | |
683 | from openobject import tools |
684 | - |
685 | -from openobject.tools import expose |
686 | -from openobject.tools import redirect |
687 | - |
688 | -from openerp.utils import rpc |
689 | -from openerp.utils import common |
690 | -from openerp.utils import TinyDict |
691 | -from openerp.utils import node_attributes |
692 | - |
693 | -from openerp.controllers import SecuredController |
694 | - |
695 | -from openerp.widgets import treegrid |
696 | -from openerp.widgets import listgrid |
697 | +from openobject.tools import expose, redirect |
698 | |
699 | |
700 | def datas_read(ids, model, fields, context=None): |
701 | - ctx = context.copy() |
702 | + ctx = context.copy() |
703 | ctx.update(rpc.session.context) |
704 | return rpc.RPCProxy(model).export_data(ids, fields, ctx) |
705 | |
706 | @@ -125,7 +110,7 @@ |
707 | return fields |
708 | |
709 | class ImpEx(SecuredController): |
710 | - |
711 | + |
712 | _cp_path = "/impex" |
713 | |
714 | @expose(template="templates/exp.mako") |
715 | @@ -355,32 +340,32 @@ |
716 | |
717 | ids = params.ids or proxy.search(domain, 0, 0, 0, ctx) |
718 | result = datas_read(ids, params.model, fields, context=ctx) |
719 | - |
720 | + |
721 | if result.get('warning', False): |
722 | common.warning(unicode(result.get('warning', False)), _('Export Error!')) |
723 | return False |
724 | result = result.get('datas',[]) |
725 | - |
726 | + |
727 | if import_compat: |
728 | params.fields2 = fields |
729 | |
730 | if export_as == 'xls': |
731 | - try: |
732 | + try: |
733 | import xlwt |
734 | except Exception, e: |
735 | - raise common.warning(_('Please Install xlwt Library.\nTo create spreadsheet files compatible with MS Excel.'), _('Import Error.')) |
736 | - |
737 | + raise common.warning(_('Please Install xlwt Library.\nTo create spreadsheet files compatible with MS Excel.'), _('Import Error.')) |
738 | + |
739 | ezxf = xlwt.easyxf |
740 | - |
741 | + |
742 | fp = StringIO.StringIO() |
743 | - |
744 | + |
745 | wb = xlwt.Workbook() |
746 | worksheet = wb.add_sheet('Sheet 1') |
747 | - |
748 | + |
749 | for col in range(len(fields)): |
750 | worksheet.write(0, col, str(fields[col])) |
751 | col+1 |
752 | - |
753 | + |
754 | heading_xf = ezxf('align: wrap yes') |
755 | |
756 | for data in range(len(result)): |
757 | @@ -391,13 +376,13 @@ |
758 | pass |
759 | result[data][d] = re.sub("\r", " ", result[data][d]) |
760 | worksheet.write(data+1, d, result[data][d], heading_xf) |
761 | - worksheet.col(d).width = 8000 |
762 | - d+1 |
763 | - |
764 | - wb.save(fp) |
765 | + worksheet.col(d).width = 8000 |
766 | + d+1 |
767 | + |
768 | + wb.save(fp) |
769 | |
770 | fp.seek(0) |
771 | - data = fp.read() |
772 | + data = fp.read() |
773 | return data |
774 | else: |
775 | return export_csv(params.fields2, result, add_names) |
776 | @@ -487,7 +472,7 @@ |
777 | #if csv_data['combo']: |
778 | ctx = {} |
779 | ctx.update(rpc.session.context.copy()) |
780 | - |
781 | + |
782 | if not isinstance(fields, list): |
783 | fields = [fields] |
784 | |
785 | @@ -504,7 +489,7 @@ |
786 | for key,val in res[1].items(): |
787 | d+= ('\t%s: %s\n' % (ustr(key),ustr(val))) |
788 | error = _('Error trying to import this record:\n%s\nError Message:\n%s\n\n%s') % (d,res[2],res[3]) |
789 | - raise common.warning(unicode(error), _('Importation Error !')) |
790 | + raise common.warning(unicode(error), _('Importation Error !')) |
791 | |
792 | return self.imp(**kw) |
793 | |
794 | |
795 | === modified file 'addons/openerp/controllers/listgrid.py' |
796 | --- addons/openerp/controllers/listgrid.py 2010-02-26 06:44:18 +0000 |
797 | +++ addons/openerp/controllers/listgrid.py 2010-03-09 13:30:53 +0000 |
798 | @@ -26,27 +26,18 @@ |
799 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
800 | # |
801 | ############################################################################### |
802 | - |
803 | import cherrypy |
804 | - |
805 | -from openobject.tools import expose |
806 | - |
807 | -from openerp.utils import rpc |
808 | -from openerp.utils import TinyDict |
809 | -from openerp.utils import TinyForm |
810 | -from openerp.utils import TinyFormError |
811 | -from openerp.utils import context_with_concurrency_info |
812 | - |
813 | from openerp.controllers import SecuredController |
814 | - |
815 | +from openerp.utils import rpc, TinyDict, TinyForm, TinyFormError, context_with_concurrency_info |
816 | from openerp.widgets import listgrid |
817 | |
818 | import form |
819 | -import search |
820 | import wizard |
821 | +from openobject.tools import expose |
822 | + |
823 | |
824 | class List(SecuredController): |
825 | - |
826 | + |
827 | _cp_path = "/listgrid" |
828 | |
829 | @expose('json') |
830 | @@ -234,14 +225,14 @@ |
831 | error = ustr(e) |
832 | |
833 | return dict(error=error, result=result, reload=reload) |
834 | - |
835 | + |
836 | @expose('json') |
837 | def sort_by_order(self, **kw): |
838 | params, data = TinyDict.split(kw) |
839 | proxy = rpc.RPCProxy(params.model) |
840 | ctx = rpc.session.context.copy() |
841 | try: |
842 | - |
843 | + |
844 | if params.sort_domain: |
845 | ids = proxy.search(params.sort_domain, 0,0, params.sort_order, ctx) |
846 | else: |
847 | @@ -249,7 +240,7 @@ |
848 | return dict(ids = ids) |
849 | except Exception , e: |
850 | return dict(error = e.message) |
851 | - |
852 | + |
853 | @expose('json') |
854 | def sort_by_drag(self, **kw): |
855 | params, data = TinyDict.split(kw) |
856 | @@ -258,7 +249,7 @@ |
857 | proxy = rpc.RPCProxy(params.model) |
858 | ctx = rpc.session.context.copy() |
859 | swap_id = params.swap_id |
860 | - |
861 | + |
862 | res_id = proxy.read([id], ['sequence'], ctx)[0] |
863 | id_seq = res_id['sequence'] |
864 | res_swap_id = proxy.read([swap_id], ['sequence'], ctx)[0] |
865 | @@ -279,14 +270,14 @@ |
866 | proxy.write([r['id']], {'sequence': len(new_ids)}, ctx) |
867 | else: |
868 | proxy.write([r['id']], {'sequence': ids.index(r['id'])}, ctx) |
869 | - |
870 | + |
871 | else: |
872 | for r in res: |
873 | if r['id'] == id: |
874 | proxy.write([r['id']], {'sequence': swap_id_seq}, ctx) |
875 | else: |
876 | proxy.write([r['id']], {'sequence': r['sequence'] -1}, ctx) |
877 | - |
878 | + |
879 | else: |
880 | new_ids = [] |
881 | new_ids.append(id) |
882 | @@ -297,9 +288,9 @@ |
883 | proxy.write([r['id']], {'sequence': swap_id_seq}, ctx) |
884 | else: |
885 | proxy.write([r['id']], {'sequence': ids.index(r['id'])+2}, ctx) |
886 | - |
887 | + |
888 | return dict() |
889 | - |
890 | + |
891 | @expose('json') |
892 | def moveUp(self, **kw): |
893 | |
894 | @@ -314,7 +305,7 @@ |
895 | ctx = rpc.session.context.copy() |
896 | |
897 | prev_id = ids[ids.index(id)-1] |
898 | - |
899 | + |
900 | try: |
901 | res = proxy.read([id, prev_id], ['sequence'], ctx) |
902 | records = dict([(r['id'], r['sequence']) for r in res]) |
903 | |
904 | === modified file 'addons/openerp/controllers/modules.py' |
905 | --- addons/openerp/controllers/modules.py 2010-01-12 21:09:06 +0000 |
906 | +++ addons/openerp/controllers/modules.py 2010-03-09 13:30:53 +0000 |
907 | @@ -1,14 +1,13 @@ |
908 | +from openerp.controllers import form |
909 | +from openerp.utils import rpc, TinyDict |
910 | + |
911 | from openobject.tools import expose |
912 | |
913 | -from openerp.controllers import form |
914 | - |
915 | -from openerp.utils import rpc |
916 | -from openerp.utils import TinyDict |
917 | |
918 | class ModuleForm(form.Form): |
919 | - |
920 | + |
921 | _cp_path = "/modules" |
922 | - |
923 | + |
924 | @expose(template="templates/modules.mako") |
925 | def create(self, params, tg_errors=None): |
926 | params.model = "ir.module.web" |
927 | @@ -16,43 +15,42 @@ |
928 | params.view_mode = "['tree']" |
929 | params.ids = None |
930 | params.editable = False |
931 | - |
932 | + |
933 | params.context = ctx = rpc.session.context.copy() |
934 | ctx['reload'] = True |
935 | - |
936 | + |
937 | form = self.create_form(params, tg_errors) |
938 | return dict(form=form, params=params) |
939 | - |
940 | + |
941 | @expose() |
942 | def index(self): |
943 | - |
944 | + |
945 | from openobject import addons |
946 | - |
947 | + |
948 | modules = addons.get_module_list() |
949 | data = [] |
950 | - |
951 | + |
952 | for name in modules: |
953 | mod = addons.get_info(name) |
954 | - |
955 | + |
956 | mod['module'] = name |
957 | - |
958 | + |
959 | mod.pop("depends", None) |
960 | mod.pop("version", None) |
961 | if mod.pop("active", False): |
962 | mod["state"] = "uninstallable" |
963 | - |
964 | + |
965 | data.append(mod) |
966 | - |
967 | + |
968 | proxy = rpc.RPCProxy("ir.module.web") |
969 | proxy.update_module_list(data) |
970 | - |
971 | + |
972 | params = TinyDict() |
973 | return self.create(params) |
974 | - |
975 | + |
976 | def get_installed_modules(self): |
977 | - |
978 | + |
979 | proxy = rpc.RPCProxy("ir.module.web") |
980 | ids = proxy.search([('state', '=', 'installed')]) |
981 | - |
982 | + |
983 | return [m['module'] for m in proxy.read(ids)] |
984 | - |
985 | |
986 | === modified file 'addons/openerp/controllers/openm2m.py' |
987 | --- addons/openerp/controllers/openm2m.py 2010-01-09 12:38:38 +0000 |
988 | +++ addons/openerp/controllers/openm2m.py 2010-03-09 13:30:53 +0000 |
989 | @@ -26,30 +26,16 @@ |
990 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
991 | # |
992 | ############################################################################### |
993 | - |
994 | import cherrypy |
995 | - |
996 | -from openobject import tools |
997 | - |
998 | -from openobject.tools import expose |
999 | -from openobject.tools import validate |
1000 | -from openobject.tools import error_handler |
1001 | -from openobject.tools import exception_handler |
1002 | - |
1003 | -from openerp.utils import rpc |
1004 | -from openerp.utils import cache |
1005 | -from openerp.utils import TinyDict |
1006 | -from openerp.utils import context_with_concurrency_info |
1007 | - |
1008 | +from openerp.utils import rpc, TinyDict, context_with_concurrency_info |
1009 | from openerp.widgets.form import Hidden |
1010 | |
1011 | -from form import Form |
1012 | -from form import get_validation_schema |
1013 | -from form import default_error_handler |
1014 | -from form import default_exception_handler |
1015 | +from form import Form, get_validation_schema, default_error_handler, default_exception_handler |
1016 | +from openobject.tools import expose, validate, error_handler, exception_handler |
1017 | + |
1018 | |
1019 | class OpenM2M(Form): |
1020 | - |
1021 | + |
1022 | _cp_path = "/openm2m" |
1023 | |
1024 | @expose(template="templates/openm2m.mako") |
1025 | @@ -88,7 +74,7 @@ |
1026 | |
1027 | current = params.chain_get(params.source or '') |
1028 | button = (params.button or False) and True |
1029 | - |
1030 | + |
1031 | params.load_counter = 1 |
1032 | if current and current.id and not button: |
1033 | params.load_counter = 2 |
1034 | @@ -99,7 +85,7 @@ |
1035 | if res: |
1036 | return res |
1037 | |
1038 | - |
1039 | + |
1040 | if current: |
1041 | current.id = None |
1042 | if not params.id: |
1043 | @@ -125,4 +111,3 @@ |
1044 | params.editable = params.get('_terp_editable', True) |
1045 | |
1046 | return self.create(params) |
1047 | - |
1048 | |
1049 | === modified file 'addons/openerp/controllers/openm2o.py' |
1050 | --- addons/openerp/controllers/openm2o.py 2010-01-09 12:38:38 +0000 |
1051 | +++ addons/openerp/controllers/openm2o.py 2010-03-09 13:30:53 +0000 |
1052 | @@ -26,28 +26,16 @@ |
1053 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1054 | # |
1055 | ############################################################################### |
1056 | - |
1057 | import cherrypy |
1058 | - |
1059 | -from openobject.tools import expose |
1060 | -from openobject.tools import validate |
1061 | -from openobject.tools import error_handler |
1062 | -from openobject.tools import exception_handler |
1063 | - |
1064 | -from openerp.utils import rpc |
1065 | -from openerp.utils import cache |
1066 | -from openerp.utils import TinyDict |
1067 | -from openerp.utils import context_with_concurrency_info |
1068 | - |
1069 | +from openerp.utils import rpc, TinyDict, context_with_concurrency_info |
1070 | from openerp.widgets.form import Hidden |
1071 | |
1072 | -from form import Form |
1073 | -from form import get_validation_schema |
1074 | -from form import default_error_handler |
1075 | -from form import default_exception_handler |
1076 | +from form import Form, get_validation_schema, default_error_handler, default_exception_handler |
1077 | +from openobject.tools import expose, validate, error_handler, exception_handler |
1078 | + |
1079 | |
1080 | class OpenM2O(Form): |
1081 | - |
1082 | + |
1083 | _cp_path = "/openm2o" |
1084 | |
1085 | @expose(template="templates/openm2o.mako") |
1086 | @@ -119,4 +107,3 @@ |
1087 | return self.create(params) |
1088 | |
1089 | # vim: ts=4 sts=4 sw=4 si et |
1090 | - |
1091 | |
1092 | === modified file 'addons/openerp/controllers/openo2m.py' |
1093 | --- addons/openerp/controllers/openo2m.py 2010-02-04 06:19:33 +0000 |
1094 | +++ addons/openerp/controllers/openo2m.py 2010-03-09 13:30:53 +0000 |
1095 | @@ -26,30 +26,18 @@ |
1096 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1097 | # |
1098 | ############################################################################### |
1099 | - |
1100 | import urllib |
1101 | |
1102 | import cherrypy |
1103 | - |
1104 | -from openobject.tools import expose |
1105 | -from openobject.tools import validate |
1106 | -from openobject.tools import error_handler |
1107 | -from openobject.tools import exception_handler |
1108 | - |
1109 | -from openerp.utils import rpc |
1110 | -from openerp.utils import cache |
1111 | -from openerp.utils import TinyDict |
1112 | -from openerp.utils import context_with_concurrency_info |
1113 | - |
1114 | from openerp import widgets as tw |
1115 | - |
1116 | -from form import Form |
1117 | -from form import get_validation_schema |
1118 | -from form import default_error_handler |
1119 | -from form import default_exception_handler |
1120 | +from openerp.utils import rpc, TinyDict, context_with_concurrency_info |
1121 | + |
1122 | +from form import Form, get_validation_schema, default_error_handler, default_exception_handler |
1123 | +from openobject.tools import expose, validate, error_handler, exception_handler |
1124 | + |
1125 | |
1126 | class OpenO2M(Form): |
1127 | - |
1128 | + |
1129 | _cp_path = "/openo2m" |
1130 | |
1131 | def create_form(self, params, tg_errors=None): |
1132 | @@ -58,18 +46,18 @@ |
1133 | params.model = params.o2m_model |
1134 | params.view_mode = ['form', 'tree'] |
1135 | params.view_type = 'form' |
1136 | - |
1137 | + |
1138 | #XXX: dirty hack to fix bug #401700 |
1139 | if not params.get('_terp_view_ids'): |
1140 | params['_terp_view_ids'] = [] |
1141 | |
1142 | # to get proper view, first generate form using the view_params |
1143 | vp = params.view_params |
1144 | - |
1145 | - # this prevents calling default_get, causes unnecessary |
1146 | + |
1147 | + # this prevents calling default_get, causes unnecessary |
1148 | # auto increment of sequence |
1149 | - vp.id = params.parent_id or False |
1150 | - |
1151 | + vp.id = params.parent_id or False |
1152 | + |
1153 | form = tw.form_view.ViewForm(vp, name="view_form", action="/openo2m/save") |
1154 | cherrypy.request.terp_validators = {} |
1155 | wid = form.screen.widget.get_widgets_by_name(params.o2m)[0] |
1156 | @@ -80,7 +68,7 @@ |
1157 | |
1158 | params.prefix = params.o2m |
1159 | params.views = wid.view |
1160 | - |
1161 | + |
1162 | # IE hack, get context from cookies (see o2m.js) |
1163 | o2m_context = {} |
1164 | try: |
1165 | @@ -89,9 +77,9 @@ |
1166 | cherrypy.response.cookie['_terp_o2m_context']['expires'] = 0 |
1167 | except: |
1168 | pass |
1169 | - |
1170 | + |
1171 | params.o2m_context = params.o2m_context or o2m_context |
1172 | - |
1173 | + |
1174 | ctx = params.context or {} |
1175 | ctx.update(params.parent_context or {}) |
1176 | ctx.update(params.o2m_context or {}) |
1177 | @@ -109,7 +97,7 @@ |
1178 | |
1179 | form = tw.form_view.ViewForm(params, name="view_form", action="/openo2m/save") |
1180 | form.screen.string = wid.screen.string |
1181 | - |
1182 | + |
1183 | return form |
1184 | |
1185 | @expose(template="templates/openo2m.mako") |
1186 | @@ -142,14 +130,14 @@ |
1187 | ctx.update(params.o2m_context or {}) |
1188 | |
1189 | id = proxy.write([params.parent_id], data, ctx) |
1190 | - |
1191 | + |
1192 | prefix = params.o2m |
1193 | current = params.chain_get(prefix) |
1194 | - |
1195 | + |
1196 | params.load_counter = 1 |
1197 | if current and current.id and not params.button: |
1198 | params.load_counter = 2 |
1199 | - |
1200 | + |
1201 | ids = current.ids |
1202 | fld = params.o2m.split('/')[-1] |
1203 | all_ids = proxy.read([params.parent_id], [fld])[0][fld] |
1204 | @@ -159,7 +147,7 @@ |
1205 | if new_ids: |
1206 | current.id = new_ids[0] |
1207 | params.o2m_id = current.id |
1208 | - |
1209 | + |
1210 | # perform button action |
1211 | if params.button: |
1212 | current.button = params.button |
1213 | @@ -177,4 +165,3 @@ |
1214 | return self.create(params) |
1215 | |
1216 | # vim: ts=4 sts=4 sw=4 si et |
1217 | - |
1218 | |
1219 | === modified file 'addons/openerp/controllers/preferences.py' |
1220 | --- addons/openerp/controllers/preferences.py 2010-01-09 12:38:38 +0000 |
1221 | +++ addons/openerp/controllers/preferences.py 2010-03-09 13:30:53 +0000 |
1222 | @@ -26,25 +26,14 @@ |
1223 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1224 | # |
1225 | ############################################################################### |
1226 | - |
1227 | -import re |
1228 | -import time |
1229 | - |
1230 | -import cherrypy |
1231 | - |
1232 | -from openobject.tools import expose |
1233 | -from openobject.tools import redirect |
1234 | - |
1235 | -from openerp.utils import rpc |
1236 | -from openerp.utils import TinyDict |
1237 | - |
1238 | -from openerp.controllers import SecuredController |
1239 | +from openerp.utils import rpc, TinyDict |
1240 | |
1241 | from form import Form |
1242 | +from openobject.tools import expose, redirect |
1243 | |
1244 | |
1245 | class Preferences(Form): |
1246 | - |
1247 | + |
1248 | _cp_path = "/pref" |
1249 | |
1250 | @expose(template="templates/preferences.mako") |
1251 | @@ -86,4 +75,3 @@ |
1252 | raise redirect('/pref/create') |
1253 | |
1254 | # vim: ts=4 sts=4 sw=4 si et |
1255 | - |
1256 | |
1257 | === modified file 'addons/openerp/controllers/process.py' |
1258 | --- addons/openerp/controllers/process.py 2010-01-09 12:38:38 +0000 |
1259 | +++ addons/openerp/controllers/process.py 2010-03-09 13:30:53 +0000 |
1260 | @@ -26,27 +26,20 @@ |
1261 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1262 | # |
1263 | ############################################################################### |
1264 | - |
1265 | import cherrypy |
1266 | - |
1267 | -from openobject.tools import expose |
1268 | -from openobject.tools import redirect |
1269 | - |
1270 | -from openobject.i18n import format |
1271 | - |
1272 | -from openerp.utils import rpc |
1273 | -from openerp.utils import common |
1274 | -from openerp.utils import TinyDict |
1275 | - |
1276 | from openerp.controllers import SecuredController |
1277 | +from openerp.utils import rpc, TinyDict |
1278 | |
1279 | +import actions |
1280 | import form |
1281 | -import actions |
1282 | +from openobject.i18n import format |
1283 | +from openobject.tools import expose |
1284 | + |
1285 | |
1286 | class ResourcePopup(form.Form): |
1287 | |
1288 | _cp_path = "/process/resource" |
1289 | - |
1290 | + |
1291 | @expose(template="templates/process_open.mako") |
1292 | def create(self, params, tg_errors=None): |
1293 | params.editable = True |
1294 | @@ -58,7 +51,7 @@ |
1295 | return dict(form=form, params=params) |
1296 | |
1297 | class Process(SecuredController): |
1298 | - |
1299 | + |
1300 | _cp_path = "/process" |
1301 | |
1302 | resource = ResourcePopup() |
1303 | @@ -158,4 +151,3 @@ |
1304 | return actions.execute_report("workflow.instance.graph", ids=[], id=int(id), model=model, nested=False) |
1305 | |
1306 | # vim: ts=4 sts=4 sw=4 si et |
1307 | - |
1308 | |
1309 | === modified file 'addons/openerp/controllers/record.py' |
1310 | --- addons/openerp/controllers/record.py 2010-01-09 12:38:38 +0000 |
1311 | +++ addons/openerp/controllers/record.py 2010-03-09 13:30:53 +0000 |
1312 | @@ -26,14 +26,10 @@ |
1313 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1314 | # |
1315 | ############################################################################### |
1316 | - |
1317 | import time |
1318 | |
1319 | -from openerp.utils import expr_eval |
1320 | -from openerp.utils import TinyDict |
1321 | - |
1322 | -from openerp.widgets import TinyWidget |
1323 | -from openerp.widgets import TinyInputWidget |
1324 | +from openerp.utils import expr_eval, TinyDict |
1325 | +from openerp.widgets import TinyWidget, TinyInputWidget |
1326 | |
1327 | from form import Form |
1328 | |
1329 | @@ -57,7 +53,7 @@ |
1330 | parent = parent or self |
1331 | |
1332 | for wid in parent.iter_member_widgets(): |
1333 | - |
1334 | + |
1335 | if isinstance(wid, TinyInputWidget) and wid.name and not wid.name.endswith('/'): |
1336 | self[wid.name] = wid.get_value() |
1337 | |
1338 | |
1339 | === modified file 'addons/openerp/controllers/requests.py' |
1340 | --- addons/openerp/controllers/requests.py 2010-01-09 12:38:38 +0000 |
1341 | +++ addons/openerp/controllers/requests.py 2010-03-09 13:30:53 +0000 |
1342 | @@ -26,20 +26,15 @@ |
1343 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1344 | # |
1345 | ############################################################################### |
1346 | - |
1347 | import cherrypy |
1348 | - |
1349 | +from openerp.controllers import SecuredController |
1350 | from openerp.utils import rpc |
1351 | -from openerp.utils import common |
1352 | |
1353 | from openobject.tools import expose |
1354 | -from openobject.tools import redirect |
1355 | - |
1356 | -from openerp.controllers import SecuredController |
1357 | |
1358 | |
1359 | class Requests(SecuredController): |
1360 | - |
1361 | + |
1362 | _cp_path = "/requests" |
1363 | |
1364 | def my(self): |
1365 | @@ -64,9 +59,8 @@ |
1366 | @expose() |
1367 | def default(self): |
1368 | import actions |
1369 | - return actions.execute_window(False, 'res.request', res_id=None, |
1370 | + return actions.execute_window(False, 'res.request', res_id=None, |
1371 | domain=[('act_to','=',rpc.session.uid)], view_type='form', mode='tree,form') |
1372 | |
1373 | |
1374 | # vim: ts=4 sts=4 sw=4 si et |
1375 | - |
1376 | |
1377 | === modified file 'addons/openerp/controllers/root.py' |
1378 | --- addons/openerp/controllers/root.py 2010-03-05 10:39:40 +0000 |
1379 | +++ addons/openerp/controllers/root.py 2010-03-09 13:30:53 +0000 |
1380 | @@ -26,35 +26,21 @@ |
1381 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1382 | # |
1383 | ############################################################################### |
1384 | - |
1385 | -import os |
1386 | -import re |
1387 | - |
1388 | import cherrypy |
1389 | - |
1390 | -from openobject import tools |
1391 | - |
1392 | -from openobject.tools import url |
1393 | -from openobject.tools import expose |
1394 | -from openobject.tools import redirect |
1395 | -from openobject.tools import find_resource |
1396 | - |
1397 | -from openerp.utils import rpc |
1398 | -from openerp.utils import cache |
1399 | -from openerp.utils import common |
1400 | - |
1401 | -from openerp.controllers import SecuredController, unsecured |
1402 | -from openerp.controllers import login as tiny_login |
1403 | +from openerp.controllers import SecuredController, unsecured, login as tiny_login |
1404 | +from openerp.utils import rpc, cache |
1405 | + |
1406 | +from openobject.tools import url, expose, redirect |
1407 | |
1408 | |
1409 | def _cp_on_error(): |
1410 | - |
1411 | + |
1412 | errorpage = cherrypy.request.pool.get_controller("/errorpage") |
1413 | message = errorpage.render() |
1414 | cherrypy.response.status = 500 |
1415 | #cherrypy.response.headers['Content-Type'] = 'text/html' |
1416 | cherrypy.response.body = [message] |
1417 | - |
1418 | + |
1419 | cherrypy.config.update({'request.error_response': _cp_on_error}) |
1420 | |
1421 | class Root(SecuredController): |
1422 | @@ -66,7 +52,7 @@ |
1423 | """Index page, loads the view defined by `action_id`. |
1424 | """ |
1425 | raise redirect("/menu") |
1426 | - |
1427 | + |
1428 | @expose() |
1429 | def info(self): |
1430 | return """ |
1431 | @@ -79,18 +65,18 @@ |
1432 | </body> |
1433 | </html> |
1434 | """ % (url("/openerp/static/images/loading.gif")) |
1435 | - |
1436 | + |
1437 | @expose(template="templates/menu.mako") |
1438 | def menu(self, active=None, **kw): |
1439 | - |
1440 | + |
1441 | from openerp.utils import icons |
1442 | from openerp.widgets import tree_view |
1443 | - |
1444 | + |
1445 | try: |
1446 | id = int(active) |
1447 | except: |
1448 | id = False |
1449 | - |
1450 | + |
1451 | ctx = rpc.session.context.copy() |
1452 | proxy = rpc.RPCProxy("ir.ui.menu") |
1453 | |
1454 | @@ -99,17 +85,17 @@ |
1455 | |
1456 | if not id and ids: |
1457 | id = ids[0] |
1458 | - |
1459 | + |
1460 | ids = proxy.search([('parent_id', '=', id)], 0, 0, 0, ctx) |
1461 | tools = proxy.read(ids, ['name', 'icon'], ctx) |
1462 | - |
1463 | + |
1464 | view = cache.fields_view_get('ir.ui.menu', 1, 'tree', {}) |
1465 | |
1466 | for tool in tools: |
1467 | tid = tool['id'] |
1468 | tool['icon'] = icons.get_icon(tool['icon']) |
1469 | - tool['tree'] = tree = tree_view.ViewTree(view, 'ir.ui.menu', tid, |
1470 | - domain=[('parent_id', '=', tid)], |
1471 | + tool['tree'] = tree = tree_view.ViewTree(view, 'ir.ui.menu', tid, |
1472 | + domain=[('parent_id', '=', tid)], |
1473 | context=ctx, action="/tree/action") |
1474 | tree._name = "tree_%s" %(tid) |
1475 | tree.tree.onselection = None |
1476 | @@ -135,7 +121,7 @@ |
1477 | return dict(result=0) |
1478 | |
1479 | if style in ('ajax', 'ajax_small'): |
1480 | - return dict(db=db, user=user, password=password, location=location, |
1481 | + return dict(db=db, user=user, password=password, location=location, |
1482 | style=style, cp_template="templates/login_ajax.mako") |
1483 | |
1484 | return tiny_login(target=location, db=db, user=user, password=password, action="login") |
1485 | @@ -157,4 +143,3 @@ |
1486 | |
1487 | |
1488 | # vim: ts=4 sts=4 sw=4 si et |
1489 | - |
1490 | |
1491 | === modified file 'addons/openerp/controllers/search.py' |
1492 | --- addons/openerp/controllers/search.py 2010-02-24 07:01:25 +0000 |
1493 | +++ addons/openerp/controllers/search.py 2010-03-09 13:30:53 +0000 |
1494 | @@ -26,28 +26,17 @@ |
1495 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1496 | # |
1497 | ############################################################################### |
1498 | - |
1499 | -import cherrypy |
1500 | - |
1501 | -from openobject.tools import expose |
1502 | -from openobject.tools import redirect |
1503 | +from openerp.utils import rpc, expr_eval, TinyDict, TinyForm, TinyFormError |
1504 | |
1505 | import actions |
1506 | - |
1507 | -from openerp.utils import rpc |
1508 | -from openerp.utils import common |
1509 | -from openerp.utils import expr_eval |
1510 | -from openerp.utils import TinyDict |
1511 | -from openerp.utils import TinyForm |
1512 | -from openerp.utils import TinyFormError |
1513 | - |
1514 | -from openerp.controllers import SecuredController |
1515 | from form import Form |
1516 | +from openobject.tools import expose |
1517 | + |
1518 | |
1519 | class Search(Form): |
1520 | |
1521 | _cp_path = "/search" |
1522 | - |
1523 | + |
1524 | @expose(template="templates/search.mako") |
1525 | def create(self, params, tg_errors=None): |
1526 | |
1527 | @@ -105,10 +94,10 @@ |
1528 | |
1529 | domain = kw.get('_terp_domain', []) |
1530 | context = kw.get('_terp_context', {}) |
1531 | - |
1532 | + |
1533 | parent_context = params.parent_context or {} |
1534 | parent_context.update(rpc.session.context.copy()) |
1535 | - |
1536 | + |
1537 | try: |
1538 | ctx = TinyForm(**kw).to_python() |
1539 | pctx = ctx |
1540 | @@ -129,18 +118,18 @@ |
1541 | ctx['context'] = parent_context |
1542 | ctx['active_id'] = params.active_id or False |
1543 | ctx['active_ids'] = params.active_ids or [] |
1544 | - |
1545 | + |
1546 | if params.active_id and not params.active_ids: |
1547 | ctx['active_ids'] = [params.active_id] |
1548 | - |
1549 | + |
1550 | if domain and isinstance(domain, basestring): |
1551 | domain = expr_eval(domain, ctx) |
1552 | - |
1553 | + |
1554 | if domain and len(domain) >= 2 and domain[-2] in ['&', '|']: # For custom domain ('AND', OR') from search view. |
1555 | dom1 = domain[-1:] |
1556 | dom2 = domain[:-2] |
1557 | domain = dom2 + dom1 |
1558 | - |
1559 | + |
1560 | if context and isinstance(context, basestring): |
1561 | if not context.startswith('{'): |
1562 | context = "dict(%s)"%context |
1563 | @@ -152,40 +141,40 @@ |
1564 | for key, val in context.items(): |
1565 | if val==None: |
1566 | context[key] = False |
1567 | - |
1568 | + |
1569 | ctx2 = parent_context |
1570 | parent_context.update(context) |
1571 | - |
1572 | + |
1573 | return dict(domain=ustr(domain), context=ustr(parent_context)) |
1574 | |
1575 | @expose('json') |
1576 | def get(self, **kw): |
1577 | - |
1578 | + |
1579 | params, data = TinyDict.split(kw) |
1580 | - |
1581 | + |
1582 | model = params.model |
1583 | context = rpc.session.context |
1584 | - |
1585 | + |
1586 | record = kw.get('record') |
1587 | record = eval(record) |
1588 | - |
1589 | + |
1590 | proxy = rpc.RPCProxy(model) |
1591 | data = {} |
1592 | - |
1593 | + |
1594 | frm = {} |
1595 | error = '' |
1596 | values = {} |
1597 | - |
1598 | + |
1599 | for key, val in record.items(): |
1600 | id = key |
1601 | - for field in val: |
1602 | + for field in val: |
1603 | fld = {} |
1604 | datas = {} |
1605 | res = proxy.fields_get(field) |
1606 | - |
1607 | + |
1608 | fld['value'] = val[field] |
1609 | fld['type'] = res[field].get('type') |
1610 | - |
1611 | + |
1612 | data[field] = fld |
1613 | try: |
1614 | frm = TinyForm(**data).to_python() |
1615 | @@ -193,9 +182,9 @@ |
1616 | error = ustr(e) |
1617 | error_field = ustr(e.field) |
1618 | return dict(error=error, error_field=error_field) |
1619 | - |
1620 | + |
1621 | datas['rec'] = field |
1622 | - |
1623 | + |
1624 | if fld['type'] == 'many2one': |
1625 | datas['rec_val'] = fld['value'] |
1626 | frm[field] = 'many2one' |
1627 | @@ -206,46 +195,46 @@ |
1628 | datas['rec_val'] = 0 |
1629 | else: |
1630 | datas['rec_val'] = frm[field] |
1631 | - |
1632 | + |
1633 | datas['type'] = fld['type'] |
1634 | values[key] = datas |
1635 | - |
1636 | + |
1637 | return dict(frm=values, error=error) |
1638 | |
1639 | @expose('json') |
1640 | def eval_domain_filter(self, **kw): |
1641 | - |
1642 | + |
1643 | all_domains = kw.get('all_domains') |
1644 | custom_domains = kw.get('custom_domain') |
1645 | model = kw.get('model') |
1646 | - |
1647 | + |
1648 | all_domains = eval(all_domains) |
1649 | - |
1650 | + |
1651 | domains = all_domains.get('domains') |
1652 | selection_domain = all_domains.get('selection_domain') |
1653 | search_context = all_domains.get('search_context') |
1654 | - |
1655 | - if domains: |
1656 | + |
1657 | + if domains: |
1658 | domains = eval(domains) |
1659 | - |
1660 | + |
1661 | c = search_context.get('context', {}) |
1662 | v = search_context.get('value') |
1663 | ctx = expr_eval(c, {'self':v}) |
1664 | - |
1665 | + |
1666 | context = rpc.session.context |
1667 | if ctx: |
1668 | ctx.update(context) |
1669 | - |
1670 | + |
1671 | domain = [] |
1672 | check_domain = [] |
1673 | check_domain = all_domains.get('check_domain') |
1674 | - |
1675 | + |
1676 | if check_domain and isinstance(check_domain, basestring): |
1677 | domain = expr_eval(check_domain, context) |
1678 | - |
1679 | + |
1680 | if domain == None: |
1681 | domain = [] |
1682 | - |
1683 | + |
1684 | if domains: |
1685 | for key in domains: |
1686 | if domains[key] in ['0', '1']: |
1687 | @@ -254,11 +243,11 @@ |
1688 | domain += [(key, '=', domains[key])] |
1689 | else: |
1690 | domain += [(key, 'ilike', domains[key])] |
1691 | - |
1692 | + |
1693 | if custom_domains: |
1694 | inner_domain = [] |
1695 | tmp_domain = '' |
1696 | - |
1697 | + |
1698 | custom_domains = eval(custom_domains) |
1699 | for inner in custom_domains: |
1700 | if len(inner) == 4: |
1701 | @@ -271,60 +260,60 @@ |
1702 | tmp_domain += '[(\'' + inner[0] + '\', \'' + inner[1] + '\', ' + ustr(inner[2]) + ')]' |
1703 | else: |
1704 | tmp_domain += '[(\'' + inner[0] + '\', \'' + inner[1] + '\', \'' + inner[2] + '\')]' |
1705 | - |
1706 | + |
1707 | if tmp_domain : |
1708 | cust_domain = tmp_domain.replace('][', ', ') |
1709 | domain += eval(cust_domain) |
1710 | - |
1711 | + |
1712 | if selection_domain: |
1713 | if selection_domain in ['blk', 'sh', 'sf', 'mf']: |
1714 | if selection_domain == 'blk': |
1715 | selection_domain = [] |
1716 | - |
1717 | + |
1718 | if selection_domain in ['sh', 'sf']: |
1719 | return dict(flag=selection_domain, sf_dom=ustr(domain)) |
1720 | - |
1721 | + |
1722 | if selection_domain == 'mf': |
1723 | - act = {'name':'Manage Filters', |
1724 | - 'res_model':'ir.actions.act_window', |
1725 | - 'type':'ir.actions.act_window', |
1726 | - 'view_type':'form', |
1727 | - 'view_mode':'tree,form', |
1728 | + act = {'name':'Manage Filters', |
1729 | + 'res_model':'ir.actions.act_window', |
1730 | + 'type':'ir.actions.act_window', |
1731 | + 'view_type':'form', |
1732 | + 'view_mode':'tree,form', |
1733 | 'domain':'[(\'filter\',\'=\',True), (\'res_model\',\'=\',\'' + model + '\'), (\'default_user_ids\',\'in\', (\'' + str(rpc.session.uid) + '\',))]'} |
1734 | return dict(action=act) |
1735 | else: |
1736 | selection_domain = expr_eval(selection_domain) |
1737 | if selection_domain: |
1738 | domain += selection_domain |
1739 | - |
1740 | + |
1741 | if not domain: |
1742 | domain = None |
1743 | - |
1744 | + |
1745 | return dict(domain=ustr(domain), context=ustr(ctx)) |
1746 | |
1747 | @expose() |
1748 | def manage_filter(self, **kw): |
1749 | action = kw.get('action') |
1750 | action = eval(action) |
1751 | - |
1752 | + |
1753 | return actions.execute(action, context=rpc.session.context) |
1754 | |
1755 | @expose(template="templates/save_filter.mako") |
1756 | def save_filter(self, **kw): |
1757 | - |
1758 | + |
1759 | model = kw.get('model') |
1760 | domain = kw.get('domain') |
1761 | flag = kw.get('flag') |
1762 | - |
1763 | + |
1764 | new_view_ids = rpc.session.execute('object', 'execute', 'ir.ui.view', 'search', [('model', '=', model), ('inherit_id', '=', False)]) |
1765 | view_datas = rpc.session.execute('object', 'execute', 'ir.ui.view', 'read', new_view_ids, ['id', 'name', 'type']) |
1766 | - |
1767 | + |
1768 | form_views = [] |
1769 | tree_views = [] |
1770 | graph_views = [] |
1771 | calendar_views = [] |
1772 | gantt_views = [] |
1773 | - |
1774 | + |
1775 | for data in view_datas: |
1776 | if data['type'] == 'form': |
1777 | form_views.append([data['id'],data['name']]) |
1778 | @@ -336,26 +325,26 @@ |
1779 | calendar_views.append([data['id'],data['name']]) |
1780 | elif data['type'] == 'gantt': |
1781 | gantt_views.append([data['id'],data['name']]) |
1782 | - |
1783 | - return dict(model=model, domain=domain, flag=flag, form_views=form_views, |
1784 | + |
1785 | + return dict(model=model, domain=domain, flag=flag, form_views=form_views, |
1786 | tree_views=tree_views, graph_views=graph_views, calendar_views=calendar_views, gantt_views=gantt_views) |
1787 | - |
1788 | + |
1789 | @expose() |
1790 | def do_filter_sc(self, **kw): |
1791 | - |
1792 | + |
1793 | name = kw.get('sc_name') |
1794 | model = kw.get('model') |
1795 | domain = kw.get('domain') |
1796 | flag = kw.get('flag') |
1797 | - |
1798 | + |
1799 | form_id = kw.get('form_views') |
1800 | tree_id = kw.get('tree_views') |
1801 | graph_id = kw.get('graph_views') |
1802 | calendar_id = kw.get('calendar_views') |
1803 | gantt_id = kw.get('gantt_views') |
1804 | - |
1805 | + |
1806 | if name: |
1807 | - v_ids=[] |
1808 | + v_ids=[] |
1809 | if kw.get('form_views'): |
1810 | rec = {'view_mode':'form', 'view_id': form_id, 'sequence':2} |
1811 | v_ids.append(rpc.session.execute('object', 'execute', 'ir.actions.act_window.view', 'create', rec)) |
1812 | @@ -369,29 +358,29 @@ |
1813 | rec = {'view_mode':'calendar', 'view_id':calendar_id, 'sequence':3} |
1814 | v_ids.append(rpc.session.execute('object', 'execute', 'ir.actions.act_window.view', 'create', rec)) |
1815 | if kw.get('gantt_views'): |
1816 | - rec = {'view_mode':'gantt', 'view_id':gantt_id, 'sequence':5} |
1817 | + rec = {'view_mode':'gantt', 'view_id':gantt_id, 'sequence':5} |
1818 | v_ids.append(rpc.session.execute('object', 'execute', 'ir.actions.act_window.view', 'create', rec)) |
1819 | - |
1820 | - datas = {'name': name, |
1821 | - 'res_model': model, |
1822 | - 'domain': domain, |
1823 | + |
1824 | + datas = {'name': name, |
1825 | + 'res_model': model, |
1826 | + 'domain': domain, |
1827 | 'context': str({}), |
1828 | 'view_ids':[(6, 0, v_ids)], |
1829 | 'filter': True, |
1830 | - 'default_user_ids': [[6, 0, [rpc.session.uid]]], |
1831 | + 'default_user_ids': [[6, 0, [rpc.session.uid]]], |
1832 | } |
1833 | action_id = rpc.session.execute('object', 'execute', 'ir.actions.act_window', 'create', datas) |
1834 | |
1835 | if flag == 'sh': |
1836 | parent_menu_id = rpc.session.execute('object', 'execute', 'ir.ui.menu', 'search', [('name','=','Custom Shortcuts')]) |
1837 | - |
1838 | + |
1839 | if parent_menu_id: |
1840 | menu_data = {'name': name, |
1841 | 'sequence': 20, |
1842 | 'action': 'ir.actions.act_window,' + str(action_id), |
1843 | 'parent_id': parent_menu_id[0], |
1844 | } |
1845 | - |
1846 | + |
1847 | menu_id = rpc.session.execute('object', 'execute', 'ir.ui.menu', 'create', menu_data) |
1848 | sc_data = {'name': name, |
1849 | 'sequence': 1, |
1850 | @@ -399,14 +388,14 @@ |
1851 | } |
1852 | shortcut_id = rpc.session.execute('object', 'execute', 'ir.ui.view_sc', 'create', sc_data) |
1853 | return True |
1854 | - |
1855 | + |
1856 | @expose('json') |
1857 | def ok(self, **kw): |
1858 | params, data = TinyDict.split(kw) |
1859 | |
1860 | ids = [int(id) for id in data.get('search_list', [])] |
1861 | return dict(ids=ids) |
1862 | - |
1863 | + |
1864 | @expose('json') |
1865 | def get_name(self, model, id): |
1866 | return dict(name=rpc.name_get(model, id)) |
1867 | @@ -415,7 +404,7 @@ |
1868 | def get_matched(self, model, text, **kw): |
1869 | params, data = TinyDict.split(kw) |
1870 | limit = kw.get('limit', 10) |
1871 | - |
1872 | + |
1873 | domain = params.domain or [] |
1874 | context = params.context or {} |
1875 | |
1876 | @@ -429,4 +418,3 @@ |
1877 | |
1878 | |
1879 | # vim: ts=4 sts=4 sw=4 si et |
1880 | - |
1881 | |
1882 | === modified file 'addons/openerp/controllers/selection.py' |
1883 | --- addons/openerp/controllers/selection.py 2010-01-09 12:38:38 +0000 |
1884 | +++ addons/openerp/controllers/selection.py 2010-03-09 13:30:53 +0000 |
1885 | @@ -26,20 +26,14 @@ |
1886 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1887 | # |
1888 | ############################################################################### |
1889 | - |
1890 | -import cherrypy |
1891 | +from openerp.controllers import SecuredController |
1892 | +from openerp.utils import TinyDict |
1893 | |
1894 | from openobject.tools import expose |
1895 | |
1896 | -from openerp.utils import rpc |
1897 | -from openerp.utils import common |
1898 | -from openerp.utils import TinyDict |
1899 | - |
1900 | -from openerp.controllers import SecuredController |
1901 | - |
1902 | |
1903 | class Selection(SecuredController): |
1904 | - |
1905 | + |
1906 | _cp_path = "/selection" |
1907 | |
1908 | @expose(template="templates/selection.mako") |
1909 | @@ -52,6 +46,3 @@ |
1910 | |
1911 | import actions |
1912 | return actions.execute(params.action, **params.data) |
1913 | - |
1914 | -# vim: ts=4 sts=4 sw=4 si et |
1915 | - |
1916 | |
1917 | === modified file 'addons/openerp/controllers/shortcuts.py' |
1918 | --- addons/openerp/controllers/shortcuts.py 2010-01-09 12:38:38 +0000 |
1919 | +++ addons/openerp/controllers/shortcuts.py 2010-03-09 13:30:53 +0000 |
1920 | @@ -26,22 +26,17 @@ |
1921 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1922 | # |
1923 | ############################################################################### |
1924 | - |
1925 | import cherrypy |
1926 | - |
1927 | -from openobject.tools import expose |
1928 | -from openobject.tools import redirect |
1929 | - |
1930 | +from openerp.controllers import SecuredController |
1931 | from openerp.utils import rpc |
1932 | -from openerp.utils import common |
1933 | |
1934 | -from openerp.controllers import SecuredController |
1935 | +from openobject.tools import expose, redirect |
1936 | |
1937 | |
1938 | class Shortcuts(SecuredController): |
1939 | - |
1940 | + |
1941 | _cp_path = "/shortcuts" |
1942 | - |
1943 | + |
1944 | def my(self): |
1945 | |
1946 | if not rpc.session.is_logged(): |
1947 | @@ -94,4 +89,3 @@ |
1948 | raise redirect('/tree/open', id=id, model='ir.ui.menu') |
1949 | |
1950 | # vim: ts=4 sts=4 sw=4 si et |
1951 | - |
1952 | |
1953 | === modified file 'addons/openerp/controllers/templates/view_log.mako' |
1954 | --- addons/openerp/controllers/templates/view_log.mako 2010-01-12 04:35:09 +0000 |
1955 | +++ addons/openerp/controllers/templates/view_log.mako 2010-03-09 13:30:53 +0000 |
1956 | @@ -18,19 +18,18 @@ |
1957 | </tr> |
1958 | <tr> |
1959 | <td> |
1960 | - % if tmp and not message: |
1961 | + % if not message: |
1962 | <div class="box2"> |
1963 | <table border="0" width="100%" align="center"> |
1964 | - % for key, val in todo: |
1965 | + % for field, description in fields: |
1966 | <tr> |
1967 | - <td class="label" width="50%">${val}:</td> |
1968 | - <td width="50%">${tmp[key]}</td> |
1969 | + <td class="label" width="50%">${description}:</td> |
1970 | + <td width="50%">${values[field]}</td> |
1971 | </tr> |
1972 | % endfor |
1973 | </table> |
1974 | </div> |
1975 | - % endif |
1976 | - % if message and not tmp: |
1977 | + % else: |
1978 | <div class="toolbar"> |
1979 | <table border="0" cellpadding="0" cellspacing="0" width="100%"> |
1980 | <tr> |
1981 | |
1982 | === modified file 'addons/openerp/controllers/translator.py' |
1983 | --- addons/openerp/controllers/translator.py 2010-01-09 12:38:38 +0000 |
1984 | +++ addons/openerp/controllers/translator.py 2010-03-09 13:30:53 +0000 |
1985 | @@ -26,21 +26,13 @@ |
1986 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
1987 | # |
1988 | ############################################################################### |
1989 | - |
1990 | -import os |
1991 | import copy |
1992 | |
1993 | -import cherrypy |
1994 | +from openerp.controllers import SecuredController |
1995 | +from openerp.utils import rpc, cache, common, TinyDict |
1996 | |
1997 | from openobject.tools import expose |
1998 | |
1999 | -from openerp.utils import rpc |
2000 | -from openerp.utils import cache |
2001 | -from openerp.utils import common |
2002 | -from openerp.utils import TinyDict |
2003 | - |
2004 | -from openerp.controllers import SecuredController |
2005 | - |
2006 | |
2007 | #change 'en' to false for context |
2008 | def adapt_context(val): |
2009 | @@ -50,7 +42,7 @@ |
2010 | return val |
2011 | |
2012 | class Translator(SecuredController): |
2013 | - |
2014 | + |
2015 | _cp_path = "/translator" |
2016 | |
2017 | @expose(template="templates/translator.mako") |
2018 | @@ -171,4 +163,3 @@ |
2019 | return self.index(translate=translate, _terp_model=params.model, _terp_id=params.id) |
2020 | |
2021 | # vim: ts=4 sts=4 sw=4 si et |
2022 | - |
2023 | |
2024 | === modified file 'addons/openerp/controllers/tree.py' |
2025 | --- addons/openerp/controllers/tree.py 2010-01-27 11:50:51 +0000 |
2026 | +++ addons/openerp/controllers/tree.py 2010-03-09 13:30:53 +0000 |
2027 | @@ -31,28 +31,20 @@ |
2028 | This module implementes heirarchical tree view for a tiny model having |
2029 | view_type = 'tree' |
2030 | """ |
2031 | - |
2032 | import time |
2033 | -import xml.dom.minidom |
2034 | - |
2035 | -from openobject.tools import url |
2036 | -from openobject.tools import expose |
2037 | - |
2038 | -from openerp.utils import rpc |
2039 | -from openerp.utils import cache |
2040 | -from openerp.utils import icons |
2041 | -from openerp.utils import common |
2042 | -from openerp.utils import TinyDict |
2043 | |
2044 | from openerp.controllers import SecuredController |
2045 | +from openerp.utils import rpc, cache, icons, common, TinyDict |
2046 | from openerp.widgets import tree_view |
2047 | |
2048 | +from openobject.tools import url, expose |
2049 | + |
2050 | |
2051 | DT_FORMAT = '%Y-%m-%d' |
2052 | DHM_FORMAT = '%Y-%m-%d %H:%M:%S' |
2053 | |
2054 | class Tree(SecuredController): |
2055 | - |
2056 | + |
2057 | _cp_path = "/tree" |
2058 | |
2059 | @expose(template="templates/tree.mako") |
2060 | @@ -74,9 +66,9 @@ |
2061 | |
2062 | tree = tree_view.ViewTree(view, model, res_id, domain=domain, context=context, action="/tree/action") |
2063 | if tree.toolbar: |
2064 | - |
2065 | + |
2066 | proxy = rpc.RPCProxy(model) |
2067 | - |
2068 | + |
2069 | for tool in tree.toolbar: |
2070 | if tool.get('icon'): |
2071 | tool['icon'] = icons.get_icon(tool['icon']) |
2072 | @@ -85,7 +77,7 @@ |
2073 | id = tool['id'] |
2074 | ids = proxy.read([id], [tree.field_parent])[0][tree.field_parent] |
2075 | tool['ids'] = ids |
2076 | - |
2077 | + |
2078 | return dict(tree=tree, model=model) |
2079 | |
2080 | @expose() |
2081 | @@ -108,7 +100,7 @@ |
2082 | def sort_callback(self, item1, item2, field, sort_order="asc", type=None): |
2083 | a = item1[field] |
2084 | b = item2[field] |
2085 | - |
2086 | + |
2087 | if type == 'many2one' and isinstance(a, (tuple, list)): |
2088 | a = a[1] |
2089 | b = b[1] |
2090 | @@ -123,12 +115,12 @@ |
2091 | |
2092 | ids = ids or [] |
2093 | |
2094 | - if isinstance(ids, basestring): |
2095 | + if isinstance(ids, basestring): |
2096 | ids = [int(id) for id in ids.split(',')] |
2097 | - |
2098 | + |
2099 | if isinstance(ids, list): |
2100 | ids = [int(id) for id in ids] |
2101 | - |
2102 | + |
2103 | if isinstance(fields, basestring): |
2104 | fields = eval(fields) |
2105 | |
2106 | @@ -162,7 +154,7 @@ |
2107 | for x in result: |
2108 | if x[field]: |
2109 | x[field] = '%s'%(x[field]) |
2110 | - |
2111 | + |
2112 | if fields_info[field]['type'] in ('float'): |
2113 | for x in result: |
2114 | if x[field]: |
2115 | @@ -222,7 +214,7 @@ |
2116 | record['items'] = item |
2117 | |
2118 | records += [record] |
2119 | - |
2120 | + |
2121 | return dict(records=records) |
2122 | |
2123 | def do_action(self, name, adds={}, datas={}): |
2124 | @@ -271,7 +263,7 @@ |
2125 | |
2126 | params, data = TinyDict.split(kw) |
2127 | |
2128 | - ids = params.selection or [] |
2129 | + ids = params.selection or [] |
2130 | if len(ids): |
2131 | import actions |
2132 | return actions.execute_window(False, res_id=ids, model=params.model, domain=params.domain) |
2133 | @@ -291,4 +283,3 @@ |
2134 | return self.do_action('tree_but_open', datas=datas) |
2135 | |
2136 | # vim: ts=4 sts=4 sw=4 si et |
2137 | - |
2138 | |
2139 | === modified file 'addons/openerp/controllers/utils.py' |
2140 | --- addons/openerp/controllers/utils.py 2010-03-03 12:24:36 +0000 |
2141 | +++ addons/openerp/controllers/utils.py 2010-03-09 13:30:53 +0000 |
2142 | @@ -26,19 +26,14 @@ |
2143 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
2144 | # |
2145 | ############################################################################### |
2146 | - |
2147 | import re |
2148 | import time |
2149 | -import types |
2150 | |
2151 | import cherrypy |
2152 | +from openerp.utils import rpc |
2153 | |
2154 | from openobject import tools |
2155 | - |
2156 | from openobject.tools import expose |
2157 | -from openobject.tools import redirect |
2158 | - |
2159 | -from openerp.utils import rpc |
2160 | |
2161 | |
2162 | __all__ = ["secured", "unsecured", "login"] |
2163 | @@ -184,4 +179,3 @@ |
2164 | |
2165 | |
2166 | # vim: ts=4 sts=4 sw=4 si et |
2167 | - |
2168 | |
2169 | === modified file 'addons/openerp/controllers/view_log.py' |
2170 | --- addons/openerp/controllers/view_log.py 2010-01-09 12:38:38 +0000 |
2171 | +++ addons/openerp/controllers/view_log.py 2010-03-09 13:30:53 +0000 |
2172 | @@ -26,60 +26,45 @@ |
2173 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
2174 | # |
2175 | ############################################################################### |
2176 | - |
2177 | -import os |
2178 | -import copy |
2179 | - |
2180 | -import cherrypy |
2181 | +from openerp.controllers import SecuredController |
2182 | +from openerp.utils import rpc, TinyDict |
2183 | |
2184 | from openobject.tools import expose |
2185 | |
2186 | -from openerp.utils import rpc |
2187 | -from openerp.utils import cache |
2188 | -from openerp.utils import common |
2189 | -from openerp.utils import TinyDict |
2190 | - |
2191 | -from openerp.controllers import SecuredController |
2192 | - |
2193 | |
2194 | class View_Log(SecuredController): |
2195 | - |
2196 | + |
2197 | _cp_path = "/viewlog" |
2198 | |
2199 | + fields = [ |
2200 | + ('id', _('ID')), |
2201 | + ('create_uid', _('Creation User')), |
2202 | + ('create_date', _('Creation Date')), |
2203 | + ('write_uid', _('Latest Modification by')), |
2204 | + ('write_date', _('Latest Modification Date')), |
2205 | + ('uid', _('Owner')), |
2206 | + ('gid', _('Group Owner')), |
2207 | + ('level', _('Access Level')) |
2208 | + ] |
2209 | + |
2210 | @expose(template="templates/view_log.mako") |
2211 | - def index(self, **kw): |
2212 | - params, data = TinyDict.split(kw) |
2213 | - |
2214 | - id = params.id |
2215 | - model = params.model |
2216 | - message = None |
2217 | - tmp = {} |
2218 | - todo = [] |
2219 | - |
2220 | - if id: |
2221 | - res = rpc.session.execute('object', 'execute', model, 'perm_read', [id], rpc.session.context) |
2222 | + def index(self, _terp_id=None, _terp_model=None): |
2223 | + |
2224 | + values = {} |
2225 | + if _terp_id: |
2226 | + message = None |
2227 | + res = rpc.session.execute('object', 'execute', _terp_model, |
2228 | + 'perm_read', [_terp_id], rpc.session.context) |
2229 | |
2230 | for line in res: |
2231 | - todo = [ |
2232 | - ('id', _('ID')), |
2233 | - ('create_uid', _('Creation User')), |
2234 | - ('create_date', _('Creation Date')), |
2235 | - ('write_uid', _('Latest Modification by')), |
2236 | - ('write_date', _('Latest Modification Date')), |
2237 | - ('uid', _('Owner')), |
2238 | - ('gid', _('Group Owner')), |
2239 | - ('level', _('Access Level')) |
2240 | - ] |
2241 | - for (key,val) in todo: |
2242 | - if line.get(key) and key in ('create_uid','write_uid','uid'): |
2243 | - line[key] = line[key][1] |
2244 | - |
2245 | - tmp[key] = ustr(line.get(key) or '/') |
2246 | - |
2247 | - if not id: |
2248 | + for field, label in self.fields: |
2249 | + if line.get(field) and field in ('create_uid','write_uid','uid'): |
2250 | + line[field] = line[field][1] |
2251 | + |
2252 | + values[field] = ustr(line.get(field) or '/') |
2253 | + else: |
2254 | message = _("No resource is selected...") |
2255 | |
2256 | - return dict(tmp=tmp, todo=todo, message=message) |
2257 | + return {'values':values, 'fields':self.fields, 'message':message} |
2258 | |
2259 | # vim: ts=4 sts=4 sw=4 si et |
2260 | - |
2261 | |
2262 | === modified file 'addons/openerp/controllers/viewed.py' |
2263 | --- addons/openerp/controllers/viewed.py 2010-01-11 14:39:12 +0000 |
2264 | +++ addons/openerp/controllers/viewed.py 2010-03-09 13:30:53 +0000 |
2265 | @@ -26,36 +26,24 @@ |
2266 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
2267 | # |
2268 | ############################################################################### |
2269 | - |
2270 | +import random |
2271 | import xml |
2272 | -import random |
2273 | |
2274 | import cherrypy |
2275 | - |
2276 | -from openobject.tools import url |
2277 | -from openobject.tools import expose |
2278 | - |
2279 | -from openerp import utils |
2280 | - |
2281 | -from openerp.utils import rpc |
2282 | -from openerp.utils import common |
2283 | -from openerp.utils import icons |
2284 | -from openerp.utils import cache |
2285 | -from openerp.utils import TinyDict |
2286 | - |
2287 | +from openerp import utils, widgets, validators |
2288 | from openerp.controllers import SecuredController |
2289 | - |
2290 | -from openerp import widgets |
2291 | -from openerp import validators |
2292 | +from openerp.utils import rpc, common, icons, cache, TinyDict |
2293 | |
2294 | from form import Form |
2295 | +from openobject.tools import url, expose |
2296 | + |
2297 | |
2298 | class NewField(Form): |
2299 | |
2300 | _cp_path = "/viewed/new_field" |
2301 | - |
2302 | + |
2303 | def create_form(self, params, tg_errors=None): |
2304 | - |
2305 | + |
2306 | # generate model_id field |
2307 | params.hidden_fields = [widgets.form.Hidden(name='model_id', default=params.model_id)] |
2308 | form = super(NewField, self).create_form(params, tg_errors) |
2309 | @@ -93,7 +81,7 @@ |
2310 | class NewModel(Form): |
2311 | |
2312 | _cp_path = "/viewed/new_model" |
2313 | - |
2314 | + |
2315 | @expose(template="templates/viewed_new_model.mako") |
2316 | def create(self, params, tg_errors=None): |
2317 | |
2318 | @@ -124,7 +112,7 @@ |
2319 | class Preview(Form): |
2320 | |
2321 | _cp_path = "/viewed/preview" |
2322 | - |
2323 | + |
2324 | @expose(template="templates/viewed_preview.mako") |
2325 | def create(self, params, tg_errors=None): |
2326 | form = self.create_form(params, tg_errors) |
2327 | @@ -233,7 +221,7 @@ |
2328 | return field |
2329 | |
2330 | class ViewEd(SecuredController): |
2331 | - |
2332 | + |
2333 | _cp_path = "/viewed" |
2334 | |
2335 | @expose(template="templates/viewed.mako") |
2336 | @@ -587,7 +575,7 @@ |
2337 | |
2338 | if new_node.localName == "field": |
2339 | new_node.setAttribute('name', kw.get('name', new_node.localName)) |
2340 | - |
2341 | + |
2342 | elif new_node.localName == "notebook": |
2343 | page = doc.createElement('page') |
2344 | page.setAttribute('string', 'Page 1') |
2345 | @@ -907,12 +895,12 @@ |
2346 | def __init__(self, name, default=None): |
2347 | options = [('', ''), ('save', _('Save Button')), ('cancel', _('Cancel Button')), ('open', _('Open Button'))] |
2348 | super(ButtonSpecialProperty, self).__init__(name=name, options=options, default=default) |
2349 | - |
2350 | + |
2351 | class AlignProperty(widgets.SelectField): |
2352 | |
2353 | def __init__(self, name, default=None): |
2354 | options = [('', ''), ('0.0', _('Left')), ('0.5', _('Center')), ('1.0', _('Right'))] |
2355 | - super(AlignProperty, self).__init__(name=name, options=options, default=default) |
2356 | + super(AlignProperty, self).__init__(name=name, options=options, default=default) |
2357 | |
2358 | _PROPERTY_WIDGETS = { |
2359 | 'select' : SelectProperty, |
2360 | @@ -939,4 +927,3 @@ |
2361 | |
2362 | |
2363 | # vim: ts=4 sts=4 sw=4 si et |
2364 | - |
2365 | |
2366 | === modified file 'addons/openerp/controllers/viewlist.py' |
2367 | --- addons/openerp/controllers/viewlist.py 2010-01-09 12:38:38 +0000 |
2368 | +++ addons/openerp/controllers/viewlist.py 2010-03-09 13:30:53 +0000 |
2369 | @@ -26,22 +26,15 @@ |
2370 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
2371 | # |
2372 | ############################################################################### |
2373 | - |
2374 | -import os |
2375 | -import base64 |
2376 | - |
2377 | -from openobject.tools import expose |
2378 | -from openobject.tools import redirect |
2379 | - |
2380 | -from openerp.utils import rpc |
2381 | -from openerp.utils import TinyDict |
2382 | - |
2383 | from openerp.controllers import SecuredController |
2384 | +from openerp.utils import rpc, TinyDict |
2385 | from openerp.widgets.screen import Screen |
2386 | |
2387 | +from openobject.tools import expose, redirect |
2388 | + |
2389 | |
2390 | class ViewList(SecuredController): |
2391 | - |
2392 | + |
2393 | _cp_path = "/viewlist" |
2394 | |
2395 | @expose(template="templates/viewlist.mako") |
2396 | @@ -108,4 +101,3 @@ |
2397 | raise redirect('/viewlist', model=model) |
2398 | |
2399 | # vim: ts=4 sts=4 sw=4 si et |
2400 | - |
2401 | |
2402 | === modified file 'addons/openerp/controllers/wizard.py' |
2403 | --- addons/openerp/controllers/wizard.py 2010-01-09 12:38:38 +0000 |
2404 | +++ addons/openerp/controllers/wizard.py 2010-03-09 13:30:53 +0000 |
2405 | @@ -26,30 +26,19 @@ |
2406 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
2407 | # |
2408 | ############################################################################### |
2409 | - |
2410 | import re |
2411 | |
2412 | import cherrypy |
2413 | - |
2414 | -from openobject.tools import expose |
2415 | -from openobject.tools import redirect |
2416 | -from openobject.tools import validate |
2417 | -from openobject.tools import error_handler |
2418 | - |
2419 | -from openerp.utils import rpc |
2420 | -from openerp.utils import icons |
2421 | -from openerp.utils import common |
2422 | -from openerp.utils import TinyDict |
2423 | - |
2424 | +from openerp import widgets as tw, validators |
2425 | from openerp.controllers import SecuredController |
2426 | - |
2427 | -from openerp import widgets as tw |
2428 | -from openerp import validators |
2429 | +from openerp.utils import rpc, icons, TinyDict |
2430 | |
2431 | import form |
2432 | +from openobject.tools import expose, redirect, validate, error_handler |
2433 | + |
2434 | |
2435 | class Wizard(SecuredController): |
2436 | - |
2437 | + |
2438 | _cp_path = "/wizard" |
2439 | |
2440 | def execute(self, params): |
2441 | @@ -89,7 +78,7 @@ |
2442 | res['datas'] = {} |
2443 | |
2444 | if res['type']=='form': |
2445 | - |
2446 | + |
2447 | fields = res['fields'] |
2448 | form_values = {} |
2449 | |
2450 | @@ -102,27 +91,27 @@ |
2451 | datas['form'] = form_values |
2452 | |
2453 | res['datas'].update(datas['form']) |
2454 | - |
2455 | + |
2456 | params.is_wizard = True |
2457 | params.view_mode = ['form'] |
2458 | params.view_type = 'form' |
2459 | params.views = {'form': res} |
2460 | - |
2461 | + |
2462 | # keep track of datas and some other required information |
2463 | params.hidden_fields = [tw.form.Hidden(name='_terp_datas', default=ustr(datas)), |
2464 | tw.form.Hidden(name='_terp_state2', default=state), |
2465 | tw.form.Hidden(name='_terp_wiz_id', default=wiz_id)] |
2466 | - |
2467 | + |
2468 | form = tw.form_view.ViewForm(params, name="view_form", action="/wizard/action") |
2469 | |
2470 | buttons = [] |
2471 | for x in res.get('state', []): |
2472 | x = list(x) |
2473 | x[1] = re.sub('_(?!_)', '', x[1]) # remove mnemonic |
2474 | - |
2475 | + |
2476 | if len(x) >= 3: |
2477 | x[2] = icons.get_icon(x[2]) |
2478 | - |
2479 | + |
2480 | buttons.append(tuple(x)) |
2481 | |
2482 | params.state = state |
2483 | @@ -231,4 +220,3 @@ |
2484 | return self.create(params, tg_errors=tg_errors) |
2485 | |
2486 | # vim: ts=4 sts=4 sw=4 si et |
2487 | - |
2488 | |
2489 | === modified file 'addons/openerp/controllers/workflow.py' |
2490 | --- addons/openerp/controllers/workflow.py 2010-01-09 12:38:38 +0000 |
2491 | +++ addons/openerp/controllers/workflow.py 2010-03-09 13:30:53 +0000 |
2492 | @@ -26,29 +26,19 @@ |
2493 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
2494 | # |
2495 | ############################################################################### |
2496 | - |
2497 | import cherrypy |
2498 | - |
2499 | -from openobject.tools import expose |
2500 | -from openobject.tools import redirect |
2501 | -from openobject.tools import validate |
2502 | - |
2503 | -from openerp.utils import rpc |
2504 | -from openerp.utils import common |
2505 | -from openerp.utils import TinyDict |
2506 | - |
2507 | +from openerp import widgets as tw, validators |
2508 | from openerp.controllers import SecuredController |
2509 | - |
2510 | -from openerp import widgets as tw |
2511 | -from openerp import validators |
2512 | +from openerp.utils import rpc, common, TinyDict |
2513 | |
2514 | from form import Form |
2515 | +from openobject.tools import expose, redirect |
2516 | |
2517 | |
2518 | class State(Form): |
2519 | |
2520 | _cp_path = "/workflow/state" |
2521 | - |
2522 | + |
2523 | @expose(template="templates/wkf_popup.mako") |
2524 | def create(self, params, tg_errors=None): |
2525 | |
2526 | @@ -117,7 +107,7 @@ |
2527 | class Connector(Form): |
2528 | |
2529 | _cp_path = "/workflow/connector" |
2530 | - |
2531 | + |
2532 | @expose(template="templates/wkf_popup.mako") |
2533 | def create(self, params, tg_errors=None): |
2534 | |
2535 | @@ -204,7 +194,7 @@ |
2536 | class Workflow(Form): |
2537 | |
2538 | _cp_path = "/workflow" |
2539 | - |
2540 | + |
2541 | @expose(template="templates/workflow.mako") |
2542 | def index(self, model, id=None): |
2543 | |
2544 | @@ -271,7 +261,7 @@ |
2545 | |
2546 | |
2547 | class WorkflowList(SecuredController): |
2548 | - |
2549 | + |
2550 | _cp_path = "/workflowlist" |
2551 | |
2552 | @expose(template="templates/wkf_list.mako") |
2553 | @@ -329,5 +319,3 @@ |
2554 | raise redirect('/workflowlist', model=model) |
2555 | |
2556 | # vim: ts=4 sts=4 sw=4 si et |
2557 | - |
2558 | - |
2559 | |
2560 | === modified file 'addons/openerp/tests/test_root_controller.py' |
2561 | --- addons/openerp/tests/test_root_controller.py 2010-01-09 13:02:21 +0000 |
2562 | +++ addons/openerp/tests/test_root_controller.py 2010-03-09 13:30:53 +0000 |
2563 | @@ -1,4 +1,3 @@ |
2564 | - |
2565 | from openerp.utils import rpc |
2566 | from openobject.test import TestCase |
2567 | |
2568 | @@ -17,5 +16,3 @@ |
2569 | self.getPage("/menu") |
2570 | self.assertStatus(200) |
2571 | self.assertInBody("new TreeGrid") |
2572 | - |
2573 | - |
2574 | |
2575 | === modified file 'addons/openerp/utils/__init__.py' |
2576 | --- addons/openerp/utils/__init__.py 2010-01-09 14:09:46 +0000 |
2577 | +++ addons/openerp/utils/__init__.py 2010-03-09 13:30:53 +0000 |
2578 | @@ -1,11 +1,9 @@ |
2579 | - |
2580 | import rpc |
2581 | import rpc_utils |
2582 | - |
2583 | +from openobject.tools import register_template_vars |
2584 | from tools import * |
2585 | from utils import * |
2586 | |
2587 | -from openobject.tools import register_template_vars |
2588 | |
2589 | def _root_vars(): |
2590 | return { |
2591 | @@ -15,4 +13,3 @@ |
2592 | register_template_vars(_root_vars, None) |
2593 | |
2594 | del register_template_vars |
2595 | - |
2596 | |
2597 | === modified file 'addons/openerp/utils/cache.py' |
2598 | --- addons/openerp/utils/cache.py 2010-01-09 11:49:22 +0000 |
2599 | +++ addons/openerp/utils/cache.py 2010-03-09 13:30:53 +0000 |
2600 | @@ -54,9 +54,9 @@ |
2601 | return func |
2602 | |
2603 | def func_wrapper(*args, **kwargs): |
2604 | - |
2605 | + |
2606 | queue, store = __cache.setdefault(rpc.session.db, ([], {})) |
2607 | - |
2608 | + |
2609 | key = cPickle.dumps((args, kwargs)) |
2610 | try: |
2611 | queue.append(queue.pop(queue.index(key))) |
2612 | @@ -112,4 +112,3 @@ |
2613 | return __can_read(model, uid=rpc.session.uid) |
2614 | |
2615 | # vim: ts=4 sts=4 sw=4 si et |
2616 | - |
2617 | |
2618 | === modified file 'addons/openerp/utils/common.py' |
2619 | --- addons/openerp/utils/common.py 2010-01-07 07:47:47 +0000 |
2620 | +++ addons/openerp/utils/common.py 2010-03-09 13:30:53 +0000 |
2621 | @@ -56,12 +56,12 @@ |
2622 | TinyException.__init__(self, message=message, title=title) |
2623 | |
2624 | class Concurrency(Exception): |
2625 | - |
2626 | + |
2627 | def __init__(self, message, title=None, datas=None): |
2628 | self.title = title |
2629 | self.datas = datas |
2630 | self.message = message |
2631 | - |
2632 | + |
2633 | def __unicode__(self): |
2634 | return ustr(self.title) |
2635 | |
2636 | @@ -84,4 +84,3 @@ |
2637 | return Concurrency(message, title, datas) |
2638 | |
2639 | # vim: ts=4 sts=4 sw=4 si et |
2640 | - |
2641 | |
2642 | === modified file 'addons/openerp/utils/icons.py' |
2643 | --- addons/openerp/utils/icons.py 2010-01-11 09:47:54 +0000 |
2644 | +++ addons/openerp/utils/icons.py 2010-03-09 13:30:53 +0000 |
2645 | @@ -154,7 +154,7 @@ |
2646 | } |
2647 | |
2648 | def get_icon(name): |
2649 | - |
2650 | + |
2651 | if name.startswith('STOCK_'): |
2652 | res = "images/stock/%s.png"%(stock_items.get(name, "stock")) |
2653 | |
2654 | @@ -163,13 +163,12 @@ |
2655 | |
2656 | elif name.startswith('terp-'): |
2657 | res = "images/icons/%s.png"%(name.replace('terp-', '', 1)) |
2658 | - |
2659 | + |
2660 | else: |
2661 | name, ext = os.path.splitext(name) |
2662 | res = "images/%s%s" % (name, ext or '.png') |
2663 | - |
2664 | + |
2665 | return "/openerp/static/%s" % res |
2666 | - |
2667 | + |
2668 | |
2669 | # vim: ts=4 sts=4 sw=4 si et |
2670 | - |
2671 | |
2672 | === modified file 'addons/openerp/utils/rpc.py' |
2673 | --- addons/openerp/utils/rpc.py 2010-03-03 12:24:36 +0000 |
2674 | +++ addons/openerp/utils/rpc.py 2010-03-09 13:30:53 +0000 |
2675 | @@ -7,17 +7,17 @@ |
2676 | # Developed by Tiny (http://openerp.com) and Axelor (http://axelor.com). |
2677 | # |
2678 | # The OpenERP web client is distributed under the "OpenERP Public License". |
2679 | -# It's based on Mozilla Public License Version (MPL) 1.1 with following |
2680 | +# It's based on Mozilla Public License Version (MPL) 1.1 with following |
2681 | # restrictions: |
2682 | # |
2683 | -# - All names, links and logos of Tiny, Open ERP and Axelor must be |
2684 | -# kept as in original distribution without any changes in all software |
2685 | -# screens, especially in start-up page and the software header, even if |
2686 | -# the application source code has been changed or updated or code has been |
2687 | +# - All names, links and logos of Tiny, Open ERP and Axelor must be |
2688 | +# kept as in original distribution without any changes in all software |
2689 | +# screens, especially in start-up page and the software header, even if |
2690 | +# the application source code has been changed or updated or code has been |
2691 | # added. |
2692 | # |
2693 | # - All distributions of the software must keep source code with OEPL. |
2694 | -# |
2695 | +# |
2696 | # - All integrations to any other software must keep source code with OEPL. |
2697 | # |
2698 | # If you need commercial licence to remove this kind of restriction please |
2699 | @@ -203,7 +203,7 @@ |
2700 | |
2701 | except xmlrpclib.Fault, err: |
2702 | raise RPCException(err.faultCode, err.faultString) |
2703 | - |
2704 | + |
2705 | except TinySocketError, err: |
2706 | raise RPCException(err.faultCode, err.faultString) |
2707 | |
2708 | @@ -215,7 +215,7 @@ |
2709 | |
2710 | |
2711 | class RPCSession(object): |
2712 | - """Maintains client session and provides way to authenticate |
2713 | + """Maintains client session and provides way to authenticate |
2714 | client & invoce RPC requested by clients. |
2715 | """ |
2716 | |
2717 | @@ -289,7 +289,7 @@ |
2718 | raise |
2719 | |
2720 | def login(self, db, user, password): |
2721 | - |
2722 | + |
2723 | if not (db and user and password): |
2724 | return -1 |
2725 | |
2726 | @@ -328,21 +328,21 @@ |
2727 | """ |
2728 | |
2729 | self._context = {'client': 'web'} |
2730 | - |
2731 | + |
2732 | # self.uid |
2733 | context = self.execute('object', 'execute', 'res.users', 'context_get') |
2734 | self._context.update(context or {}) |
2735 | - |
2736 | + |
2737 | self.remote_timezone = 'utc' |
2738 | self.client_timezone = self.context.get("tz", False) |
2739 | - |
2740 | + |
2741 | if self.client_timezone: |
2742 | self.remote_timezone = self.execute('common', 'timezone_get') |
2743 | try: |
2744 | import pytz |
2745 | except: |
2746 | raise common.warning(_('You select a timezone but OpenERP could not find pytz library!\nThe timezone functionality will be disable.')) |
2747 | - |
2748 | + |
2749 | # set locale in session |
2750 | self.locale = self.context.get('lang') |
2751 | |
2752 | @@ -354,7 +354,7 @@ |
2753 | |
2754 | def execute_noauth(self, obj, method, *args): |
2755 | return self.gateway.execute_noauth(obj, method, *args) |
2756 | - |
2757 | + |
2758 | def execute_db(self, method, *args): |
2759 | return self.execute_noauth('db', method, *args) |
2760 | |
2761 | @@ -387,7 +387,7 @@ |
2762 | self._resource = resource |
2763 | self._session = session |
2764 | self._attrs = {} |
2765 | - |
2766 | + |
2767 | def _func_getter(self, name): |
2768 | return lambda *args: self._session.execute("object", "execute", self._resource, name, *args) |
2769 | |
2770 | @@ -398,17 +398,17 @@ |
2771 | |
2772 | |
2773 | def name_get(model, id, context=None): |
2774 | - |
2775 | + |
2776 | id = (id or False) and int(id) |
2777 | name = (id or str('')) and str(id) |
2778 | |
2779 | if model and id: |
2780 | - |
2781 | + |
2782 | ctx = session.context.copy() |
2783 | ctx.update(context or {}) |
2784 | - |
2785 | + |
2786 | proxy = RPCProxy(model) |
2787 | - |
2788 | + |
2789 | try: |
2790 | name = proxy.name_get([id], ctx) |
2791 | name = name[0][1] or '' |
2792 | @@ -441,4 +441,3 @@ |
2793 | |
2794 | |
2795 | # vim: ts=4 sts=4 sw=4 si et |
2796 | - |
2797 | |
2798 | === modified file 'addons/openerp/utils/rpc_utils.py' |
2799 | --- addons/openerp/utils/rpc_utils.py 2010-01-11 11:50:03 +0000 |
2800 | +++ addons/openerp/utils/rpc_utils.py 2010-03-09 13:30:53 +0000 |
2801 | @@ -20,18 +20,17 @@ |
2802 | |
2803 | def clear(self): |
2804 | cherrypy.session.clear() |
2805 | - |
2806 | + |
2807 | def init_rpc_session(): |
2808 | - |
2809 | + |
2810 | config = cherrypy.config |
2811 | - |
2812 | + |
2813 | # initialize the rpc session |
2814 | host = config.get('openerp.server.host') |
2815 | port = config.get('openerp.server.port') |
2816 | protocol = config.get('openerp.server.protocol') |
2817 | - |
2818 | + |
2819 | import rpc |
2820 | rpc.initialize(host, port, protocol, storage=CPSessionWrapper()) |
2821 | |
2822 | init_rpc_session() |
2823 | - |
2824 | |
2825 | === modified file 'addons/openerp/utils/tiny_socket.py' |
2826 | --- addons/openerp/utils/tiny_socket.py 2010-01-07 07:47:47 +0000 |
2827 | +++ addons/openerp/utils/tiny_socket.py 2010-03-09 13:30:53 +0000 |
2828 | @@ -94,4 +94,3 @@ |
2829 | return res[0] |
2830 | |
2831 | # vim: ts=4 sts=4 sw=4 si et |
2832 | - |
2833 | |
2834 | === modified file 'addons/openerp/utils/tools.py' |
2835 | --- addons/openerp/utils/tools.py 2010-01-09 11:49:22 +0000 |
2836 | +++ addons/openerp/utils/tools.py 2010-03-09 13:30:53 +0000 |
2837 | @@ -36,24 +36,24 @@ |
2838 | |
2839 | |
2840 | def expr_eval(string, context={}): |
2841 | - context['uid'] = rpc.session.uid |
2842 | - context['current_date'] = time.strftime('%Y-%m-%d') |
2843 | - context['time'] = time |
2844 | - context['datetime'] = DT |
2845 | + context.update(uid=rpc.session.uid, |
2846 | + current_date=time.strftime('%Y-%m-%d'), |
2847 | + time=time, |
2848 | + datetime=DT) |
2849 | if isinstance(string, basestring): |
2850 | - string = string.replace("'active_id'", "active_id") |
2851 | - return eval(string, context) |
2852 | + return eval(string.replace("'active_id'", "active_id"), |
2853 | + context) |
2854 | else: |
2855 | return string |
2856 | |
2857 | def node_attributes(node): |
2858 | - result = {} |
2859 | + if not node.hasAttributes(): return {} |
2860 | attrs = node.attributes |
2861 | - if attrs is None: |
2862 | - return {} |
2863 | - for i in range(attrs.length): |
2864 | - result[str(attrs.item(i).localName)] = attrs.item(i).nodeValue |
2865 | - return result |
2866 | + # localName can be a unicode string, we're using attribute names as |
2867 | + # **kwargs keys and python-level kwargs don't take unicode keys kindly |
2868 | + # (they blow up) so we need to ensure all keys are ``str`` |
2869 | + return dict([(str(attrs.item(i).localName), attrs.item(i).nodeValue) |
2870 | + for i in range(attrs.length)]) |
2871 | |
2872 | def xml_locate(expr, ref): |
2873 | """Simple xpath locator. |
2874 | @@ -66,7 +66,7 @@ |
2875 | |
2876 | @return: list of nodes |
2877 | """ |
2878 | - |
2879 | + |
2880 | if '/' not in expr: |
2881 | name, index = expr.split('[') |
2882 | index = int(index.replace(']', '')) |
2883 | @@ -76,7 +76,7 @@ |
2884 | return nodes[index-1] |
2885 | except Exception, e: |
2886 | return [] |
2887 | - |
2888 | + |
2889 | parts = expr.split('/') |
2890 | for part in parts: |
2891 | if part in ('', '.'): |
2892 | @@ -96,7 +96,7 @@ |
2893 | |
2894 | if pn and pn.localName and pn.localName != 'view': |
2895 | xp = get_node_xpath(pn) + xp |
2896 | - |
2897 | + |
2898 | nodes = xml_locate(root, node.parentNode) |
2899 | xp += '[%s]' % (nodes.index(node) + 1) |
2900 | |
2901 | @@ -108,7 +108,7 @@ |
2902 | """ |
2903 | if not sz: |
2904 | return False |
2905 | - |
2906 | + |
2907 | units = ('bytes', 'Kb', 'Mb', 'Gb') |
2908 | if isinstance(sz,basestring): |
2909 | sz=len(sz) |
2910 | @@ -142,10 +142,9 @@ |
2911 | |
2912 | def __copy__(self): |
2913 | return self |
2914 | - |
2915 | + |
2916 | def __deepcopy__(self, visit): |
2917 | return self |
2918 | |
2919 | |
2920 | # vim: ts=4 sts=4 sw=4 si et |
2921 | - |
2922 | |
2923 | === modified file 'addons/openerp/utils/utils.py' |
2924 | --- addons/openerp/utils/utils.py 2010-01-09 11:49:22 +0000 |
2925 | +++ addons/openerp/utils/utils.py 2010-03-09 13:30:53 +0000 |
2926 | @@ -192,7 +192,7 @@ |
2927 | 'many2one': lambda *a: validators.many2one(), |
2928 | 'email' : lambda *a: validators.Email(), |
2929 | 'url' : lambda *a: validators.URL(), |
2930 | - 'picture': lambda *a: validators.Binary(), |
2931 | + 'picture': lambda *a: validators.Binary(), |
2932 | } |
2933 | |
2934 | class TinyFormError(validators.Invalid): |
2935 | @@ -233,7 +233,7 @@ |
2936 | value = attrs.get('value') |
2937 | |
2938 | required = attrs.get('required', False) |
2939 | - |
2940 | + |
2941 | if kind == "one2many": |
2942 | try: |
2943 | value = eval(value) |
2944 | @@ -313,4 +313,3 @@ |
2945 | print params.chain_get('view_ids.child').view_ids |
2946 | |
2947 | # vim: ts=4 sts=4 sw=4 si et |
2948 | - |
2949 | |
2950 | === modified file 'addons/openerp/validators/validators.py' |
2951 | --- addons/openerp/validators/validators.py 2010-01-07 07:47:47 +0000 |
2952 | +++ addons/openerp/validators/validators.py 2010-03-09 13:30:53 +0000 |
2953 | @@ -250,4 +250,3 @@ |
2954 | } |
2955 | |
2956 | # vim: ts=4 sts=4 sw=4 si et |
2957 | - |
2958 | |
2959 | === modified file 'addons/openerp/widgets/__init__.py' |
2960 | --- addons/openerp/widgets/__init__.py 2010-02-04 12:34:58 +0000 |
2961 | +++ addons/openerp/widgets/__init__.py 2010-03-09 13:30:53 +0000 |
2962 | @@ -9,6 +9,3 @@ |
2963 | |
2964 | import screen |
2965 | import form_view |
2966 | - |
2967 | -# vim: ts=4 sts=4 sw=4 si et |
2968 | - |
2969 | |
2970 | === modified file 'addons/openerp/widgets/_interface.py' |
2971 | --- addons/openerp/widgets/_interface.py 2010-01-11 13:20:35 +0000 |
2972 | +++ addons/openerp/widgets/_interface.py 2010-03-09 13:30:53 +0000 |
2973 | @@ -72,7 +72,7 @@ |
2974 | nolabel = False |
2975 | visible = True |
2976 | model = None |
2977 | - |
2978 | + |
2979 | valign = "middle" |
2980 | |
2981 | def __init__(self, **attrs): |
2982 | @@ -267,33 +267,33 @@ |
2983 | |
2984 | def register_widget(klass, types, view="form"): |
2985 | """Register a widget class for the given view and types |
2986 | - |
2987 | + |
2988 | @param view: the view type (e.g. form, tree) |
2989 | - @param types: register for the give types |
2990 | + @param types: register for the give types |
2991 | @param klass: widget class |
2992 | """ |
2993 | - |
2994 | + |
2995 | if not isinstance(types, (list, tuple)): |
2996 | types = [types] |
2997 | - |
2998 | + |
2999 | for t in types: |
3000 | pooler.register_object(klass, key=t, group=view) |
3001 | - |
3002 | + |
3003 | |
3004 | def get_widget(type, view="form"): |
3005 | """Get the widget of the given type for the given view. |
3006 | - |
3007 | + |
3008 | @param view: the view |
3009 | @param type: the widget type |
3010 | """ |
3011 | - |
3012 | + |
3013 | pool = pooler.get_pool() |
3014 | return pool.get(type, group=view) |
3015 | |
3016 | |
3017 | def get_registered_widgets(view="form"): |
3018 | """Get all the registered widgets for the given view type. |
3019 | - |
3020 | + |
3021 | @param view: the view |
3022 | @returns: dict of all the registered widgets |
3023 | """ |
3024 | @@ -302,4 +302,3 @@ |
3025 | |
3026 | |
3027 | # vim: ts=4 sts=4 sw=4 si et |
3028 | - |
3029 | |
3030 | === modified file 'addons/openerp/widgets/_views.py' |
3031 | --- addons/openerp/widgets/_views.py 2010-03-05 10:39:40 +0000 |
3032 | +++ addons/openerp/widgets/_views.py 2010-03-09 13:30:53 +0000 |
3033 | @@ -11,48 +11,48 @@ |
3034 | |
3035 | |
3036 | class ViewType(type): |
3037 | - |
3038 | + |
3039 | def __new__(cls, name, bases, attrs): |
3040 | - |
3041 | - obj = super(ViewType, cls).__new__(cls, name, bases, attrs) |
3042 | - |
3043 | + |
3044 | + obj = super(ViewType, cls).__new__(cls, name, bases, attrs) |
3045 | + |
3046 | name = attrs.get("_name") |
3047 | kind = attrs.get("_type") |
3048 | desc = attrs.get("_desc") |
3049 | - |
3050 | + |
3051 | if kind: |
3052 | pooler.register_object(obj, key=kind, group="view_types", auto_create=True) |
3053 | - |
3054 | + |
3055 | return obj |
3056 | |
3057 | |
3058 | class TinyView(object): |
3059 | - |
3060 | + |
3061 | __metaclass__ = ViewType |
3062 | - |
3063 | + |
3064 | _name = None |
3065 | _type = None |
3066 | _desc = None |
3067 | _priority = 0 |
3068 | - |
3069 | + |
3070 | name = property(lambda self: self._name) |
3071 | kind = property(lambda self: self._type) |
3072 | desc = property(lambda self: self._desc) |
3073 | priority = property(lambda self: self._priority) |
3074 | - |
3075 | + |
3076 | def __call__(self, screen): |
3077 | pass |
3078 | |
3079 | |
3080 | class FormView(TinyView): |
3081 | - |
3082 | + |
3083 | _type = "form" |
3084 | _name = _("Form") |
3085 | _desc = _("Form view...") |
3086 | _priority = 1 |
3087 | |
3088 | def __call__(self, screen): |
3089 | - |
3090 | + |
3091 | widget = form.Form(prefix=screen.prefix, |
3092 | model=screen.model, |
3093 | view=screen.view, |
3094 | @@ -65,21 +65,21 @@ |
3095 | |
3096 | if not screen.is_wizard and screen.ids is None: |
3097 | proxy = rpc.RPCProxy(screen.model) |
3098 | - screen.ids = proxy.search(screen.domain, screen.offset or False, |
3099 | + screen.ids = proxy.search(screen.domain, screen.offset or False, |
3100 | screen.limit or False, 0, screen.context) |
3101 | screen.count = proxy.search_count(screen.domain, screen.context) |
3102 | |
3103 | return widget |
3104 | |
3105 | class ListView(TinyView): |
3106 | - |
3107 | + |
3108 | _type = "tree" |
3109 | _name = _("Search") |
3110 | _desc = _("Search view...") |
3111 | _priority = 0 |
3112 | |
3113 | def __call__(self, screen): |
3114 | - |
3115 | + |
3116 | if screen.group_by_ctx: |
3117 | widget = listgroup.ListGroup(screen.name or '_terp_list', |
3118 | model=screen.model, |
3119 | @@ -90,7 +90,7 @@ |
3120 | view_mode=screen.view_mode, |
3121 | editable=screen.editable, |
3122 | selectable=screen.selectable, |
3123 | - offset=screen.offset, limit=screen.limit, |
3124 | + offset=screen.offset, limit=screen.limit, |
3125 | count=screen.count, nolinks=screen.link, |
3126 | group_by_ctx=screen.group_by_ctx) |
3127 | else: |
3128 | @@ -103,38 +103,35 @@ |
3129 | view_mode=screen.view_mode, |
3130 | editable=screen.editable, |
3131 | selectable=screen.selectable, |
3132 | - offset=screen.offset, limit=screen.limit, |
3133 | + offset=screen.offset, limit=screen.limit, |
3134 | count=screen.count, nolinks=screen.link) |
3135 | |
3136 | screen.ids = widget.ids |
3137 | screen.limit = widget.limit |
3138 | screen.count = widget.count |
3139 | - |
3140 | + |
3141 | return widget |
3142 | - |
3143 | + |
3144 | |
3145 | def get_view_widget(kind, screen): |
3146 | - |
3147 | + |
3148 | pool = pooler.get_pool() |
3149 | views = pool.get_group("view_types") |
3150 | - |
3151 | + |
3152 | try: |
3153 | view = views[kind] |
3154 | except KeyError, e: |
3155 | raise Exception("view '%s' not supported." % kind) |
3156 | - |
3157 | + |
3158 | return view(screen) |
3159 | |
3160 | |
3161 | def get_registered_views(): |
3162 | - |
3163 | + |
3164 | pool = pooler.get_pool() |
3165 | views = pool.get_group("view_types") |
3166 | - |
3167 | + |
3168 | views = views.items() |
3169 | views.sort(lambda a, b: cmp(a[1].priority, b[1].priority)) |
3170 | - |
3171 | + |
3172 | return views |
3173 | - |
3174 | - |
3175 | - |
3176 | |
3177 | === modified file 'addons/openerp/widgets/form/_action.py' |
3178 | --- addons/openerp/widgets/form/_action.py 2010-01-09 13:02:21 +0000 |
3179 | +++ addons/openerp/widgets/form/_action.py 2010-03-09 13:30:53 +0000 |
3180 | @@ -73,10 +73,10 @@ |
3181 | |
3182 | if not self.action.get('domain', False): |
3183 | self.action['domain']='[]' |
3184 | - |
3185 | + |
3186 | ctx = rpc.session.context.copy() |
3187 | ctx.update({'active_id': False, 'active_ids': []}) |
3188 | - |
3189 | + |
3190 | self.context = expr_eval(self.action.get('context', '{}'), ctx) |
3191 | self.domain = expr_eval(self.action['domain'], ctx) |
3192 | |
3193 | @@ -110,8 +110,7 @@ |
3194 | |
3195 | elif self.action['view_type']=='tree': |
3196 | pass #TODO |
3197 | - |
3198 | -register_widget(Action, ["action"]) |
3199 | + |
3200 | +register_widget(Action, ["action"]) |
3201 | |
3202 | # vim: ts=4 sts=4 sw=4 si et |
3203 | - |
3204 | |
3205 | === modified file 'addons/openerp/widgets/form/_binary.py' |
3206 | --- addons/openerp/widgets/form/_binary.py 2010-01-09 13:02:21 +0000 |
3207 | +++ addons/openerp/widgets/form/_binary.py 2010-03-09 13:30:53 +0000 |
3208 | @@ -68,7 +68,7 @@ |
3209 | self.text = value or '' |
3210 | |
3211 | register_widget(Binary, ["binary"]) |
3212 | - |
3213 | + |
3214 | |
3215 | class Image(TinyInputWidget): |
3216 | |
3217 | @@ -100,7 +100,7 @@ |
3218 | self.src = icons.get_icon(icon) |
3219 | |
3220 | register_widget(Image, ["image"]) |
3221 | - |
3222 | + |
3223 | |
3224 | @cache.memoize(1000, force=True) |
3225 | def get_temp_file(**kw): |
3226 | @@ -114,7 +114,7 @@ |
3227 | type, data = value |
3228 | else: |
3229 | type, data = None, value |
3230 | - |
3231 | + |
3232 | if data: |
3233 | if type == 'stock': |
3234 | stock, size = data |
3235 | @@ -128,7 +128,7 @@ |
3236 | tmp.write(base64.decodestring(data)) |
3237 | finally: |
3238 | tmp.close() |
3239 | - |
3240 | + |
3241 | url = tools.url("/image/get_picture", hash=hashkey) |
3242 | else: |
3243 | url = tools.url("/static/images/blank.gif") |
3244 | @@ -146,29 +146,29 @@ |
3245 | |
3246 | def __init__(self, **attrs): |
3247 | super(Picture, self).__init__(**attrs) |
3248 | - |
3249 | + |
3250 | height = attrs.get('img_height', attrs.get('height', None)) |
3251 | self.height = height and 'height="%s"' % height or '' |
3252 | width = attrs.get('img_width', attrs.get('width', None)) |
3253 | self.width = width and 'width="%s"' % width or '' |
3254 | self.validator = validators.Binary() |
3255 | - |
3256 | + |
3257 | ctx = rpc.session.context.copy() |
3258 | ctx.update(self.context or {}) |
3259 | ctx['bin_size'] = False |
3260 | - |
3261 | + |
3262 | proxy = rpc.RPCProxy(self.model) |
3263 | - |
3264 | + |
3265 | if '/' in self.name: |
3266 | name = self.name.rsplit('/', 1)[-1] |
3267 | else: |
3268 | name = self.name |
3269 | - |
3270 | + |
3271 | if not self.id: |
3272 | value = proxy.default_get([name], ctx) |
3273 | else: |
3274 | value = proxy.read([self.id], [name], ctx)[0] |
3275 | - |
3276 | + |
3277 | value = value.get(name) or (None, None) |
3278 | self.url = generate_url_for_picture(self.model, name, self.id, value) |
3279 | |
3280 | @@ -176,4 +176,3 @@ |
3281 | |
3282 | |
3283 | # vim: ts=4 sts=4 sw=4 si et |
3284 | - |
3285 | |
3286 | === modified file 'addons/openerp/widgets/form/_form.py' |
3287 | --- addons/openerp/widgets/form/_form.py 2010-03-05 09:32:15 +0000 |
3288 | +++ addons/openerp/widgets/form/_form.py 2010-03-09 13:30:53 +0000 |
3289 | @@ -83,7 +83,7 @@ |
3290 | |
3291 | self.columns = int(attrs.get('col', 4)) |
3292 | self.nolabel = True |
3293 | - |
3294 | + |
3295 | self.x = 0 |
3296 | self.y = 0 |
3297 | |
3298 | @@ -133,12 +133,12 @@ |
3299 | cn -= len([w for a, w in row if not isinstance(w, (basestring, Label, Image)) and not w.visible]) |
3300 | |
3301 | if cn < 1: cn = 1 |
3302 | - |
3303 | + |
3304 | for i, (a, wid) in enumerate(row): |
3305 | |
3306 | if isinstance(wid, (basestring, Label, Image)): |
3307 | w = sw |
3308 | - |
3309 | + |
3310 | else: |
3311 | c = a.get('colspan', 1) |
3312 | if c > max_length: |
3313 | @@ -148,19 +148,19 @@ |
3314 | w = ww * c / cn |
3315 | else: |
3316 | w = 0 |
3317 | - |
3318 | + |
3319 | a['width'] = '%d%%' % (w) |
3320 | |
3321 | def add_row(self): |
3322 | - |
3323 | + |
3324 | if len(self.table) and len(self.table[-1]) == 0: |
3325 | return self.table[-1] |
3326 | - |
3327 | + |
3328 | self.table.append([]) |
3329 | |
3330 | self.x = 0 |
3331 | self.y += 1 |
3332 | - |
3333 | + |
3334 | return self.table[-1] |
3335 | |
3336 | def _add_validator(self, widget): |
3337 | @@ -220,7 +220,7 @@ |
3338 | if not widget.visible: |
3339 | attrs['style'] = 'display: none' |
3340 | widget.visible = True |
3341 | - |
3342 | + |
3343 | valign = getattr(widget, "valign", None) |
3344 | if valign: |
3345 | attrs['valign'] = valign |
3346 | @@ -252,14 +252,14 @@ |
3347 | |
3348 | params = ['fake_widget'] |
3349 | member_widgets = ['children'] |
3350 | - |
3351 | + |
3352 | valign = "top" |
3353 | - |
3354 | + |
3355 | def __init__(self, **attrs): |
3356 | super(Notebook, self).__init__(**attrs) |
3357 | self.nolabel = True |
3358 | self.colspan = attrs.get('colspan', 3) |
3359 | - |
3360 | + |
3361 | self.fake_widget = '_fake' |
3362 | if attrs.get('prefix'): |
3363 | self.fake_widge = attrs['prefix'] + '/_fake' |
3364 | @@ -268,12 +268,12 @@ |
3365 | |
3366 | |
3367 | class Page(Frame): |
3368 | - |
3369 | + |
3370 | def __init__(self, **attrs): |
3371 | super(Page, self).__init__(**attrs) |
3372 | if self.invisible: |
3373 | self.attributes = "{'invisible': [1]}" |
3374 | - |
3375 | + |
3376 | register_widget(Page, ["page"]) |
3377 | |
3378 | |
3379 | @@ -283,7 +283,7 @@ |
3380 | |
3381 | template = "templates/separator.mako" |
3382 | params = ["orientation"] |
3383 | - |
3384 | + |
3385 | def __init__(self, **attrs): |
3386 | super(Separator, self).__init__(**attrs) |
3387 | |
3388 | @@ -336,7 +336,7 @@ |
3389 | |
3390 | def set_value(self, value): |
3391 | self.field_value = unicode(value or '', 'utf-8') |
3392 | - |
3393 | + |
3394 | register_widget(Label, ["label"]) |
3395 | |
3396 | |
3397 | @@ -346,10 +346,10 @@ |
3398 | params = ['password', 'size'] |
3399 | |
3400 | def __init__(self, **attrs): |
3401 | - |
3402 | + |
3403 | if attrs.get('password'): |
3404 | attrs.pop('invisible', None) |
3405 | - |
3406 | + |
3407 | super(Char, self).__init__(**attrs) |
3408 | self.validator = validators.String() |
3409 | |
3410 | @@ -504,10 +504,10 @@ |
3411 | |
3412 | def update_params(self, d): |
3413 | super(Selection, self).update_params(d) |
3414 | - |
3415 | + |
3416 | if self.search_context: |
3417 | d.setdefault('css_classes', []).append('selection_search') |
3418 | - |
3419 | + |
3420 | def set_value(self, value): |
3421 | |
3422 | if isinstance(value, (tuple, list)): |
3423 | @@ -517,18 +517,18 @@ |
3424 | value = None |
3425 | |
3426 | super(Selection, self).set_value(value) |
3427 | - |
3428 | + |
3429 | register_widget(Selection, ["selection"]) |
3430 | - |
3431 | + |
3432 | |
3433 | class DTLink(JSLink): |
3434 | - |
3435 | + |
3436 | def update_params(self, d): |
3437 | super(DTLink, self).update_params(d) |
3438 | - |
3439 | + |
3440 | lang = get_locale() |
3441 | link = "calendar/lang/calendar-%s.js" % lang |
3442 | - |
3443 | + |
3444 | if os.path.exists(tools.find_resource("openobject", "static", link)): |
3445 | d.link = tools.url(["/openobject/static", link]) |
3446 | else: |
3447 | @@ -540,11 +540,11 @@ |
3448 | class DateTime(TinyInputWidget): |
3449 | |
3450 | template = "templates/datetime.mako" |
3451 | - |
3452 | + |
3453 | javascript = [JSLink("openerp", "calendar/calendar.js"), |
3454 | JSLink("openerp", "calendar/calendar-setup.js"), |
3455 | DTLink("openerp", "calendar/lang/calendar-en.js")] |
3456 | - |
3457 | + |
3458 | css = [CSSLink("openerp", "calendar/skins/aqua/theme.css")] |
3459 | |
3460 | params = ["format", "picker_shows_time"] |
3461 | @@ -593,14 +593,14 @@ |
3462 | self.widget = get_widget(kind)(**attrs) |
3463 | self.validator = self.widget.validator |
3464 | self.relation = attrs.get('relation') or None |
3465 | - |
3466 | + |
3467 | if 'field_id' not in attrs: |
3468 | self.field_id = self.name |
3469 | - |
3470 | + |
3471 | def set_value(self, value): |
3472 | self.widget.set_value(value) |
3473 | self.default = self.widget.default |
3474 | - |
3475 | + |
3476 | |
3477 | class Button(TinyInputWidget): |
3478 | |
3479 | @@ -620,7 +620,7 @@ |
3480 | self.btype = attrs.get('special', attrs.get('type', 'workflow')) |
3481 | |
3482 | self.nolabel = True |
3483 | - |
3484 | + |
3485 | if self.icon: |
3486 | self.icon = icons.get_icon(self.icon) |
3487 | |
3488 | @@ -630,20 +630,20 @@ |
3489 | |
3490 | register_widget(Button, ["button"]) |
3491 | |
3492 | - |
3493 | + |
3494 | class Group(TinyInputWidget): |
3495 | |
3496 | template = "templates/group.mako" |
3497 | |
3498 | member_widgets = ["frame"] |
3499 | valign = "top" |
3500 | - |
3501 | + |
3502 | def __init__(self, **attrs): |
3503 | super(Group, self).__init__(**attrs) |
3504 | |
3505 | self.frame = Frame(**attrs) |
3506 | self.nolabel = True |
3507 | - |
3508 | + |
3509 | register_widget(Group, ["group"]) |
3510 | |
3511 | |
3512 | @@ -655,7 +655,7 @@ |
3513 | css = [CSSLink("openerp", 'css/dashboard.css')] |
3514 | |
3515 | member_widgets = ['children'] |
3516 | - |
3517 | + |
3518 | register_widget(Dashbar, ["dashbar"]) |
3519 | |
3520 | |
3521 | @@ -672,7 +672,7 @@ |
3522 | </tr> |
3523 | </table> |
3524 | """ |
3525 | - |
3526 | + |
3527 | member_widgets = ['children'] |
3528 | |
3529 | def __init__(self, **attrs): |
3530 | @@ -695,7 +695,7 @@ |
3531 | % endfor |
3532 | </table> |
3533 | """ |
3534 | - |
3535 | + |
3536 | member_widgets = ['children'] |
3537 | |
3538 | def __init__(self, **attrs): |
3539 | @@ -705,21 +705,21 @@ |
3540 | register_widget(VPaned, ["vpaned"]) |
3541 | |
3542 | class HtmlView(TinyWidget): |
3543 | - |
3544 | + |
3545 | template = "templates/htmlview.mako" |
3546 | - |
3547 | + |
3548 | params = ['tag_name', 'args'] |
3549 | member_widgets = ['children', 'frame'] |
3550 | - |
3551 | + |
3552 | def __init__(self, **attrs): |
3553 | super(HtmlView, self).__init__(**attrs) |
3554 | self.tag_name = attrs.get('tag_name') |
3555 | - |
3556 | + |
3557 | self.args = attrs.get('args', {}) |
3558 | - |
3559 | + |
3560 | if attrs.get('value'): |
3561 | self.default = attrs.get('value') |
3562 | - |
3563 | + |
3564 | register_widget(HtmlView, ["html"]) |
3565 | |
3566 | class Form(TinyInputWidget): |
3567 | @@ -842,17 +842,17 @@ |
3568 | |
3569 | elif node.localName=='label': |
3570 | text = attrs.get('string', '') |
3571 | - |
3572 | + |
3573 | if not text: |
3574 | for node in node.childNodes: |
3575 | if node.nodeType == node.TEXT_NODE: |
3576 | text += node.data |
3577 | else: |
3578 | text += node.toxml() |
3579 | - |
3580 | + |
3581 | attrs['string'] = text |
3582 | views += [Label(**attrs)] |
3583 | - |
3584 | + |
3585 | elif node.localName=='newline': |
3586 | views += [NewLine(**attrs)] |
3587 | |
3588 | @@ -863,11 +863,11 @@ |
3589 | n = self.parse(prefix=prefix, root=node, fields=fields, values=values) |
3590 | views += [Frame(children=n, **attrs)] |
3591 | |
3592 | - elif node.localName == 'notebook': |
3593 | + elif node.localName == 'notebook': |
3594 | n = self.parse(prefix=prefix, root=node, fields=fields, values=values) |
3595 | nb = Notebook(children=n, **attrs) |
3596 | self.nb_couter += 1 |
3597 | - nb._name = prefix.replace('/', '_') + '_notebook_%s' % (self.nb_couter) |
3598 | + nb._name = prefix.replace('/', '_') + '_notebook_%s' % (self.nb_couter) |
3599 | views += [nb] |
3600 | |
3601 | elif node.localName == 'page': |
3602 | @@ -925,23 +925,23 @@ |
3603 | wid = get_widget('action')(**attrs) |
3604 | views += [wid] |
3605 | cherrypy.request._terp_dashboard = True |
3606 | - |
3607 | + |
3608 | else: |
3609 | n = self.parse(prefix=prefix, root=node, fields=fields, values=values) |
3610 | args = node_attributes(node) |
3611 | attrs['args'] = args |
3612 | - attrs['tag_name'] = node.localName |
3613 | - |
3614 | + attrs['tag_name'] = node.localName |
3615 | + |
3616 | if node.nodeType == node.TEXT_NODE: |
3617 | if not node.nodeValue.strip(): |
3618 | continue |
3619 | attrs['value'] = node.nodeValue |
3620 | - |
3621 | + |
3622 | views += [HtmlView(children=n, **attrs)] |
3623 | - |
3624 | + |
3625 | |
3626 | return views |
3627 | - |
3628 | + |
3629 | def _make_field_widget(self, attrs, value=False): |
3630 | |
3631 | attrs['editable'] = self.editable |
3632 | @@ -982,4 +982,3 @@ |
3633 | |
3634 | |
3635 | # vim: ts=4 sts=4 sw=4 si et |
3636 | - |
3637 | |
3638 | === modified file 'addons/openerp/widgets/form/_m2m.py' |
3639 | --- addons/openerp/widgets/form/_m2m.py 2010-01-09 13:02:21 +0000 |
3640 | +++ addons/openerp/widgets/form/_m2m.py 2010-03-09 13:30:53 +0000 |
3641 | @@ -53,7 +53,7 @@ |
3642 | template = "templates/many2many.mako" |
3643 | params = ['relation', 'domain', 'context'] |
3644 | member_widgets = ['screen'] |
3645 | - |
3646 | + |
3647 | valign = "top" |
3648 | |
3649 | relation = None |
3650 | @@ -95,7 +95,7 @@ |
3651 | |
3652 | self.switch_to = view_mode[-1] |
3653 | if view_type == view_mode[-1]: self.switch_to = view_mode[0] |
3654 | - |
3655 | + |
3656 | if ids is None: |
3657 | ids = attrs.get('value', []) |
3658 | |
3659 | @@ -133,7 +133,7 @@ |
3660 | current.view_type = view_type |
3661 | current.domain = current.domain or [] |
3662 | current.context = current.context or {} |
3663 | - |
3664 | + |
3665 | if isinstance(self.context, basestring): |
3666 | ctx = cherrypy.request.terp_record |
3667 | ctx['current_date'] = time.strftime('%Y-%m-%d') |
3668 | @@ -193,4 +193,3 @@ |
3669 | |
3670 | |
3671 | # vim: ts=4 sts=4 sw=4 si et |
3672 | - |
3673 | |
3674 | === modified file 'addons/openerp/widgets/form/_m2o.py' |
3675 | --- addons/openerp/widgets/form/_m2o.py 2010-01-09 13:02:21 +0000 |
3676 | +++ addons/openerp/widgets/form/_m2o.py 2010-03-09 13:30:53 +0000 |
3677 | @@ -76,4 +76,3 @@ |
3678 | register_widget(M2O, ["many2one"]) |
3679 | |
3680 | # vim: ts=4 sts=4 sw=4 si et |
3681 | - |
3682 | |
3683 | === modified file 'addons/openerp/widgets/form/_o2m.py' |
3684 | --- addons/openerp/widgets/form/_o2m.py 2010-03-09 09:56:21 +0000 |
3685 | +++ addons/openerp/widgets/form/_o2m.py 2010-03-09 13:30:53 +0000 |
3686 | @@ -62,7 +62,23 @@ |
3687 | |
3688 | self.new_attrs = { 'text': _("New"), 'help': _('Create new record.')} |
3689 | self.default_get_ctx = attrs.get('default_get', {}) or attrs.get('context', {}) |
3690 | +<<<<<<< TREE |
3691 | |
3692 | +======= |
3693 | + |
3694 | + group_by_ctx = '' |
3695 | + |
3696 | + grp_ctx = attrs.get('context', {}) |
3697 | + try: |
3698 | + grp_ctx = expr_eval(grp_ctx) |
3699 | + except: |
3700 | + pass |
3701 | + |
3702 | + if grp_ctx: |
3703 | + if grp_ctx.get('group_by'): |
3704 | + group_by_ctx = grp_ctx.get('group_by') |
3705 | + |
3706 | +>>>>>>> MERGE-SOURCE |
3707 | # self.colspan = 4 |
3708 | # self.nolabel = True |
3709 | |
3710 | @@ -104,16 +120,16 @@ |
3711 | |
3712 | self.switch_to = view_mode[-1] |
3713 | if view_type == view_mode[-1]: self.switch_to = view_mode[0] |
3714 | - |
3715 | + |
3716 | ids = attrs.get('value') or [] |
3717 | if not isinstance(ids, list): |
3718 | ids = [ids] |
3719 | - |
3720 | + |
3721 | if ids and isinstance(ids[0], dict): |
3722 | ids = [] |
3723 | - |
3724 | + |
3725 | id = (ids or None) and ids[0] |
3726 | - |
3727 | + |
3728 | if current and params.source and self.name in params.source.split('/'): |
3729 | id = current.id |
3730 | |
3731 | @@ -152,12 +168,12 @@ |
3732 | current.offset = current.offset or 0 |
3733 | current.limit = current.limit or 20 |
3734 | current.count = len(ids or []) |
3735 | - |
3736 | + |
3737 | # Group By for one2many list. |
3738 | if group_by_ctx: |
3739 | current.group_by_ctx = group_by_ctx |
3740 | current.domain = [('id', 'in', ids)] |
3741 | - |
3742 | + |
3743 | if current.view_type == 'tree' and self.readonly: |
3744 | self.editable = False |
3745 | |
3746 | @@ -185,12 +201,11 @@ |
3747 | |
3748 | if not self.ids: |
3749 | return [] |
3750 | - |
3751 | + |
3752 | values = getattr(self.screen.widget, 'values', []) |
3753 | - |
3754 | + |
3755 | return [(1, val.get('id', False), val) for val in values] |
3756 | |
3757 | register_widget(O2M, ["one2many", "one2many_form", "one2many_list"]) |
3758 | |
3759 | # vim: ts=4 sts=4 sw=4 si et |
3760 | - |
3761 | |
3762 | === modified file 'addons/openerp/widgets/form/_ref.py' |
3763 | --- addons/openerp/widgets/form/_ref.py 2010-01-09 13:02:21 +0000 |
3764 | +++ addons/openerp/widgets/form/_ref.py 2010-03-09 13:30:53 +0000 |
3765 | @@ -47,7 +47,7 @@ |
3766 | def __init__(self, **attrs): |
3767 | super(Reference, self).__init__(**attrs) |
3768 | self.options = attrs.get('selection', []) |
3769 | - |
3770 | + |
3771 | self.domain = attrs.get('domain', []) |
3772 | self.context = attrs.get('context', {}) |
3773 | |
3774 | @@ -62,9 +62,8 @@ |
3775 | self.relation = '' |
3776 | self.default = '' |
3777 | self.text = '' |
3778 | - |
3779 | + |
3780 | register_widget(Reference, ["reference"]) |
3781 | |
3782 | |
3783 | # vim: ts=4 sts=4 sw=4 si et |
3784 | - |
3785 | |
3786 | === modified file 'addons/openerp/widgets/form_view.py' |
3787 | --- addons/openerp/widgets/form_view.py 2010-02-04 10:58:07 +0000 |
3788 | +++ addons/openerp/widgets/form_view.py 2010-03-09 13:30:53 +0000 |
3789 | @@ -41,7 +41,7 @@ |
3790 | |
3791 | params = ['limit', 'offset', 'count', 'search_domain', 'search_data'] |
3792 | member_widgets = ['screen', 'search', 'sidebar'] |
3793 | - |
3794 | + |
3795 | css = [CSSLink("openerp", "css/autocomplete.css")] |
3796 | javascript = [JSLink("openerp", "javascript/form.js", location=locations.bodytop), |
3797 | JSLink("openerp", "javascript/form_state.js", location=locations.bodytop), |
3798 | @@ -52,7 +52,7 @@ |
3799 | JSLink("openerp", "javascript/binary.js", location=locations.bodytop)] |
3800 | |
3801 | def __init__(self, params, **kw): |
3802 | - |
3803 | + |
3804 | super(ViewForm, self).__init__(**kw) |
3805 | |
3806 | # save reference of params dictionary in requeste |
3807 | @@ -70,14 +70,14 @@ |
3808 | |
3809 | self.screen = Screen(prefix='', hastoolbar=True, hassubmenu=True, editable=editable, readonly=readonly, |
3810 | selectable=params.selectable or 2) |
3811 | - |
3812 | + |
3813 | self.sidebar = Sidebar(self.screen.model, self.screen.submenu, self.screen.toolbar, self.screen.id, |
3814 | self.screen.view_type, context=self.screen.context) |
3815 | |
3816 | self.is_dashboard = getattr(cherrypy.request, '_terp_dashboard', False) |
3817 | |
3818 | self.search = None |
3819 | - |
3820 | + |
3821 | if params.view_type in ('tree', 'graph'): |
3822 | self.search = Search(model=params.model, domain=params.domain, context=params.context, values=params.search_data or {}) |
3823 | |
3824 | @@ -86,7 +86,7 @@ |
3825 | |
3826 | # get the correct view title |
3827 | self.screen.string = getattr(cherrypy.request, '_terp_view_name', self.screen.string) or self.screen.string |
3828 | - |
3829 | + |
3830 | # get the actual pager data |
3831 | self.limit = self.screen.limit |
3832 | self.offset = self.screen.offset |
3833 | @@ -94,12 +94,11 @@ |
3834 | |
3835 | self.search_domain = params.search_domain |
3836 | self.search_data = params.search_data |
3837 | - |
3838 | + |
3839 | if params.hidden_fields: |
3840 | self.hidden_fields = params.hidden_fields |
3841 | - |
3842 | + |
3843 | #self.fields = cherrypy.request.terp_fields |
3844 | |
3845 | |
3846 | # vim: ts=4 sts=4 sw=4 si et |
3847 | - |
3848 | |
3849 | === modified file 'addons/openerp/widgets/listgrid.py' |
3850 | --- addons/openerp/widgets/listgrid.py 2010-02-26 06:44:18 +0000 |
3851 | +++ addons/openerp/widgets/listgrid.py 2010-03-09 13:30:53 +0000 |
3852 | @@ -26,37 +26,22 @@ |
3853 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
3854 | # |
3855 | ############################################################################### |
3856 | - |
3857 | +import copy |
3858 | +import math |
3859 | import time |
3860 | -import math |
3861 | -import copy |
3862 | -import locale |
3863 | import xml.dom.minidom |
3864 | +from itertools import chain |
3865 | |
3866 | import cherrypy |
3867 | +from openerp.utils import rpc, icons, common, expr_eval, node_attributes |
3868 | +from openerp.widgets import TinyWidget, TinyInputWidget, ConcurrencyInfo, get_widget |
3869 | |
3870 | +import form |
3871 | from openobject import tools |
3872 | - |
3873 | from openobject.i18n import format |
3874 | from openobject.widgets import CSSLink, JSLink |
3875 | - |
3876 | -from openerp.utils import rpc |
3877 | -from openerp.utils import icons |
3878 | -from openerp.utils import common |
3879 | -from openerp.utils import expr_eval |
3880 | -from openerp.utils import node_attributes |
3881 | - |
3882 | -import form |
3883 | - |
3884 | from pager import Pager |
3885 | |
3886 | -from openerp.widgets import TinyWidget |
3887 | -from openerp.widgets import TinyInputWidget |
3888 | -from openerp.widgets import ConcurrencyInfo |
3889 | - |
3890 | -from openerp.widgets import get_widget |
3891 | -from openerp.widgets import register_widget |
3892 | - |
3893 | |
3894 | class List(TinyWidget): |
3895 | |
3896 | @@ -106,7 +91,7 @@ |
3897 | self.selectable = kw.get('selectable', 0) |
3898 | self.editable = kw.get('editable', False) |
3899 | self.pageable = kw.get('pageable', True) |
3900 | - |
3901 | + |
3902 | self.offset = kw.get('offset', 0) |
3903 | self.limit = kw.get('limit', 0) |
3904 | self.count = kw.get('count', 0) |
3905 | @@ -127,10 +112,10 @@ |
3906 | |
3907 | attrs = node_attributes(root) |
3908 | self.string = attrs.get('string','') |
3909 | - |
3910 | + |
3911 | # is relational field (M2M/O2M) |
3912 | if self.source: |
3913 | - self.limit = cherrypy.request.app.config['openobject-web'].get('child.listgrid.limit', self.limit) |
3914 | + self.limit = cherrypy.request.app.config['openobject-web'].get('child.listgrid.limit', self.limit) |
3915 | self.min_rows = cherrypy.request.app.config['openobject-web'].get('child.listgrid.min_rows', 5) |
3916 | else: |
3917 | self.min_rows = 5 |
3918 | @@ -163,10 +148,10 @@ |
3919 | |
3920 | self.data_dict = {} |
3921 | data = [] |
3922 | - |
3923 | + |
3924 | if ids and not isinstance(ids, list): |
3925 | ids = [ids] |
3926 | - |
3927 | + |
3928 | if ids and len(ids) > 0: |
3929 | |
3930 | ctx = rpc.session.context.copy() |
3931 | @@ -180,7 +165,7 @@ |
3932 | self.data_dict[item['id']] = item.copy() |
3933 | |
3934 | self.ids = ids |
3935 | - |
3936 | + |
3937 | self.values = copy.deepcopy(data) |
3938 | self.headers, self.hiddens, self.data, self.field_total, self.buttons = self.parse(root, fields, data) |
3939 | |
3940 | @@ -245,38 +230,32 @@ |
3941 | def display(self, value=None, **params): |
3942 | |
3943 | # set editor values |
3944 | - if self.editors and self.edit_inline: |
3945 | - |
3946 | - ctx = rpc.session.context.copy() |
3947 | - ctx.update(self.context) |
3948 | - |
3949 | - fields = [f for f, fa in self.headers] |
3950 | - fields += [f for f, fa in self.hiddens] |
3951 | - |
3952 | - proxy = rpc.RPCProxy(self.model) |
3953 | - |
3954 | - values = {} |
3955 | - defaults = {} |
3956 | + if not (self.editors and self.edit_inline): |
3957 | + return super(List, self).display(value, **params) |
3958 | + |
3959 | + ctx = dict(rpc.session.context, |
3960 | + **self.context) |
3961 | + |
3962 | + fields = [name for name, _ in chain(self.headers, self.hiddens)] |
3963 | + |
3964 | + proxy = rpc.RPCProxy(self.model) |
3965 | + |
3966 | + if self.edit_inline > 0: |
3967 | + values = self.data_dict[self.edit_inline] |
3968 | + else: |
3969 | + values = dict(proxy.default_get(fields, ctx)) |
3970 | |
3971 | # update values according to domain |
3972 | - for d in self.domain: |
3973 | - if d[0] in fields: |
3974 | - if d[1] == '=': |
3975 | - values[d[0]] = d[2] |
3976 | - if d[1] == 'in' and len(d[2]) == 1: |
3977 | - values[d[0]] = d[2][0] |
3978 | - |
3979 | - if self.edit_inline > 0: |
3980 | - values = self.data_dict[self.edit_inline] |
3981 | - else: |
3982 | - defaults = proxy.default_get(fields, ctx) |
3983 | - |
3984 | - for k, v in defaults.items(): |
3985 | - values.setdefault(k, v) |
3986 | - |
3987 | - for f in fields: |
3988 | - if f in values: |
3989 | - self.editors[f].set_value(values[f]) |
3990 | + for (field, operator, value) in self.domain: |
3991 | + if field in fields: |
3992 | + if operator == '=': |
3993 | + values[field] = value |
3994 | + elif operator == 'in' and len(value) == 1: |
3995 | + values[field] = value[0] |
3996 | + |
3997 | + for f in fields: |
3998 | + if f in values: |
3999 | + self.editors[f].set_value(values[f]) |
4000 | |
4001 | return super(List, self).display(value, **params) |
4002 | |
4003 | @@ -372,7 +351,7 @@ |
4004 | pass |
4005 | |
4006 | row[name] = cell |
4007 | - |
4008 | + |
4009 | if invisible: |
4010 | continue |
4011 | |
4012 | @@ -396,7 +375,7 @@ |
4013 | |
4014 | self.text = self.get_text() |
4015 | self.link = self.get_link() |
4016 | - |
4017 | + |
4018 | self.color = None |
4019 | self.onclick = None |
4020 | |
4021 | @@ -431,10 +410,10 @@ |
4022 | """ |
4023 | |
4024 | def get_text(self): |
4025 | - |
4026 | + |
4027 | if isinstance(self.value, int): |
4028 | self.value = self.value, rpc.name_get(self.attrs['relation'], self.value) |
4029 | - |
4030 | + |
4031 | if self.value and len(self.value) > 0: |
4032 | return self.value[-1] |
4033 | |
4034 | @@ -442,7 +421,7 @@ |
4035 | |
4036 | def get_link(self): |
4037 | m2o_link = int(self.attrs.get('link', 1)) |
4038 | - |
4039 | + |
4040 | if m2o_link == 1: |
4041 | return tools.url('/form/view', model=self.attrs['relation'], id=(self.value or False) and self.value[0]) |
4042 | else: |
4043 | @@ -512,9 +491,9 @@ |
4044 | |
4045 | def get_text(self): |
4046 | if isinstance(self.value, float): |
4047 | - self.value = '%.2f' % (self.value) |
4048 | + self.value = '%.2f' % (self.value) |
4049 | self.value = float(self.value) |
4050 | - |
4051 | + |
4052 | if self.value > 100.0: |
4053 | self.range = 100.0 |
4054 | else: |
4055 | @@ -534,9 +513,9 @@ |
4056 | return ustr(self.value or '') |
4057 | |
4058 | class Boolean(Char): |
4059 | - |
4060 | + |
4061 | params = ['value', 'kind'] |
4062 | - |
4063 | + |
4064 | template = """ <input type="checkbox" kind="${kind}" class="checkbox" readonly="readonly" disabled="disabled" value="${py.checker(value)}"> """ |
4065 | |
4066 | def get_text(self): |
4067 | @@ -544,9 +523,9 @@ |
4068 | return _('Yes') |
4069 | else: |
4070 | return _('No') |
4071 | - |
4072 | + |
4073 | class Button(TinyInputWidget): |
4074 | - |
4075 | + |
4076 | params = ['icon', 'id', 'parent_grid', 'btype', 'confirm', 'width', 'context'] |
4077 | |
4078 | template=""" |
4079 | @@ -615,4 +594,3 @@ |
4080 | } |
4081 | |
4082 | # vim: ts=4 sts=4 sw=4 si et |
4083 | - |
4084 | |
4085 | === modified file 'addons/openerp/widgets/listgroup.py' |
4086 | --- addons/openerp/widgets/listgroup.py 2010-02-26 06:44:18 +0000 |
4087 | +++ addons/openerp/widgets/listgroup.py 2010-03-09 13:30:53 +0000 |
4088 | @@ -26,102 +26,73 @@ |
4089 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
4090 | # |
4091 | ############################################################################### |
4092 | - |
4093 | -import time |
4094 | -import math |
4095 | -import copy |
4096 | -import locale |
4097 | import random |
4098 | -import xml.dom.minidom |
4099 | - |
4100 | -import cherrypy |
4101 | - |
4102 | -from openobject import tools |
4103 | - |
4104 | -from openobject.i18n import format |
4105 | -from openobject.widgets import CSSLink, JSLink |
4106 | |
4107 | from openerp.utils import rpc |
4108 | -from openerp.utils import icons |
4109 | -from openerp.utils import common |
4110 | -from openerp.utils import expr_eval |
4111 | -from openerp.utils import node_attributes |
4112 | - |
4113 | -import form |
4114 | -from listgrid import List |
4115 | - |
4116 | -from pager import Pager |
4117 | - |
4118 | -from openerp.widgets import TinyWidget |
4119 | -from openerp.widgets import TinyInputWidget |
4120 | -from openerp.widgets import ConcurrencyInfo |
4121 | - |
4122 | -from openerp.widgets import get_widget |
4123 | -from openerp.widgets import register_widget |
4124 | + |
4125 | +from listgrid import List |
4126 | + |
4127 | |
4128 | class ListGroup(List): |
4129 | |
4130 | template = "templates/listgroup.mako" |
4131 | params = ['grp_records', 'group_by_ctx'] |
4132 | - |
4133 | + |
4134 | def __init__(self, name, model, view, ids=[], domain=[], context={}, **kw): |
4135 | |
4136 | - params = {} |
4137 | - |
4138 | self.context = context or {} |
4139 | self.domain = domain or [] |
4140 | - |
4141 | + |
4142 | self.selectable = kw.get('selectable', 0) |
4143 | self.editable = kw.get('editable', False) |
4144 | self.pageable = kw.get('pageable', True) |
4145 | - |
4146 | + |
4147 | self.offset = kw.get('offset', 0) |
4148 | self.limit = kw.get('limit', 0) |
4149 | self.count = kw.get('count', 0) |
4150 | self.link = kw.get('nolinks') |
4151 | - |
4152 | + |
4153 | proxy = rpc.RPCProxy(model) |
4154 | - |
4155 | + |
4156 | if ids == None: |
4157 | if self.limit > 0: |
4158 | ids = proxy.search(self.domain, self.offset, self.limit, 0, self.context) |
4159 | else: |
4160 | ids = proxy.search(self.domain, 0, 0, 0, self.context) |
4161 | - |
4162 | + |
4163 | self.count = proxy.search_count(domain, context) |
4164 | - |
4165 | - params['limit'] = self.limit |
4166 | - params['count'] = self.count |
4167 | - params['offset'] = self.offset |
4168 | - params['editable'] = self.editable |
4169 | - params['selectable'] = self.selectable |
4170 | - |
4171 | + |
4172 | + |
4173 | if ids and not isinstance(ids, list): |
4174 | ids = [ids] |
4175 | - |
4176 | + |
4177 | self.ids = ids |
4178 | - |
4179 | + |
4180 | self.m2m = False |
4181 | self.concurrency_info = None |
4182 | - |
4183 | + |
4184 | self.group_by_ctx = kw.get('group_by_ctx', []) |
4185 | - |
4186 | + |
4187 | if not isinstance(self.group_by_ctx, list): |
4188 | self.group_by_ctx = [self.group_by_ctx] |
4189 | - |
4190 | + |
4191 | fields = view['fields'] |
4192 | - |
4193 | + |
4194 | self.grp_records = [] |
4195 | group_field = None |
4196 | - |
4197 | + |
4198 | self.context.update(rpc.session.context.copy()) |
4199 | - |
4200 | - super(ListGroup, self).__init__(name=name, model=model, view=view, ids=self.ids, domain=self.domain, context=self.context, **params) |
4201 | - |
4202 | + |
4203 | + super(ListGroup, self).__init__( |
4204 | + name=name, model=model, view=view, ids=self.ids, domain=self.domain, |
4205 | + context=self.context, limit=self.limit, count=self.count, |
4206 | + offset=self.offset, editable=self.editable, |
4207 | + selectable=self.selectable) |
4208 | + |
4209 | if self.group_by_ctx: |
4210 | gb = self.group_by_ctx[0] |
4211 | self.group_by_ctx = gb |
4212 | - |
4213 | + |
4214 | new_hidden = () |
4215 | for hidden in self.hiddens: |
4216 | if gb == hidden[0]: |
4217 | @@ -137,21 +108,21 @@ |
4218 | if header[0] == gb: |
4219 | self.headers.pop(cnt) |
4220 | self.headers.insert(0, head) |
4221 | - |
4222 | - self.grp_records = proxy.read_group(self.context.get('__domain', []) + (self.domain or []), |
4223 | + |
4224 | + self.grp_records = proxy.read_group(self.context.get('__domain', []) + (self.domain or []), |
4225 | fields.keys(), gb, 0, False, self.context) |
4226 | - |
4227 | + |
4228 | grp_ids = [] |
4229 | - |
4230 | + |
4231 | if self.grp_records: |
4232 | for rec in self.grp_records: |
4233 | - |
4234 | + |
4235 | if not rec.get(self.group_by_ctx): |
4236 | rec[self.group_by_ctx] = '' |
4237 | - |
4238 | + |
4239 | rec_dom = rec.get('__domain') |
4240 | dom = [('id', 'in', self.ids), rec_dom[0]] |
4241 | - |
4242 | + |
4243 | ch_ids = [] |
4244 | grp_ids = proxy.search(dom, self.offset, self.limit, 0, self.context) |
4245 | for id in grp_ids: |
4246 | @@ -160,4 +131,3 @@ |
4247 | ch_ids.append(d) |
4248 | rec['child_rec'] = ch_ids |
4249 | rec['group_id'] = 'group_' + str(random.randrange(1, 10000)) |
4250 | - |
4251 | \ No newline at end of file |
4252 | |
4253 | === modified file 'addons/openerp/widgets/pager.py' |
4254 | --- addons/openerp/widgets/pager.py 2010-01-11 06:30:30 +0000 |
4255 | +++ addons/openerp/widgets/pager.py 2010-03-09 13:30:53 +0000 |
4256 | @@ -79,4 +79,3 @@ |
4257 | self.next = self.offset+len(self.ids) < self.count |
4258 | |
4259 | # vim: ts=4 sts=4 sw=4 si et |
4260 | - |
4261 | |
4262 | === modified file 'addons/openerp/widgets/screen.py' |
4263 | --- addons/openerp/widgets/screen.py 2010-03-05 10:39:40 +0000 |
4264 | +++ addons/openerp/widgets/screen.py 2010-03-09 13:30:53 +0000 |
4265 | @@ -55,15 +55,15 @@ |
4266 | <input type="hidden" id="${name}_terp_offset" name="${name}_terp_offset" value="${offset}"/> |
4267 | <input type="hidden" id="${name}_terp_count" name="${name}_terp_count" value="${count}"/> |
4268 | <input type="hidden" id="${name}_terp_group_by_ctx" name="${name}_terp_group_by_ctx" value="${group_by_ctx}"/> |
4269 | - |
4270 | + |
4271 | % if widget: |
4272 | ${display_member(widget)} |
4273 | % endif |
4274 | """ |
4275 | |
4276 | - params = ['model', 'state', 'id', 'ids', 'view_id', 'view_ids', 'view_mode', 'view_type', 'domain', |
4277 | + params = ['model', 'state', 'id', 'ids', 'view_id', 'view_ids', 'view_mode', 'view_type', 'domain', |
4278 | 'context', 'limit', 'offset', 'count', 'group_by_ctx'] |
4279 | - |
4280 | + |
4281 | member_widgets = ['widget'] |
4282 | |
4283 | def __init__(self, params=None, prefix='', name='', views_preloaded={}, hastoolbar=False, hassubmenu=False, editable=False, readonly=False, selectable=0, nolinks=1): |
4284 | @@ -112,7 +112,7 @@ |
4285 | |
4286 | self.hastoolbar = hastoolbar |
4287 | self.toolbar = None |
4288 | - |
4289 | + |
4290 | self.hassubmenu = hassubmenu |
4291 | self.submenu = None |
4292 | |
4293 | @@ -143,7 +143,7 @@ |
4294 | |
4295 | self.view_id = view.get('view_id', self.view_id) |
4296 | self.view = view |
4297 | - |
4298 | + |
4299 | from _views import get_view_widget |
4300 | self.widget = get_view_widget(view_type, self) |
4301 | |
4302 | @@ -154,12 +154,11 @@ |
4303 | if value: toolbar[item] = value |
4304 | |
4305 | submenu = view.get('submenu', {}) |
4306 | - |
4307 | + |
4308 | self.toolbar = toolbar or None |
4309 | self.submenu = eval(ustr(submenu)) or None |
4310 | - |
4311 | + |
4312 | self.hastoolbar = (toolbar or False) and True |
4313 | self.hassubmenu = (submenu or False) and True |
4314 | |
4315 | # vim: ts=4 sts=4 sw=4 si et |
4316 | - |
4317 | |
4318 | === modified file 'addons/openerp/widgets/search.py' |
4319 | --- addons/openerp/widgets/search.py 2010-02-26 06:44:18 +0000 |
4320 | +++ addons/openerp/widgets/search.py 2010-03-09 13:30:53 +0000 |
4321 | @@ -31,40 +31,20 @@ |
4322 | This module implementes widget parser for form view, and |
4323 | several widget components. |
4324 | """ |
4325 | - |
4326 | -import copy |
4327 | import random |
4328 | import xml.dom.minidom |
4329 | |
4330 | import cherrypy |
4331 | +from openerp.utils import rpc, cache, icons, node_attributes |
4332 | +from openerp.widgets import TinyInputWidget |
4333 | +from openerp.widgets.form import Char, Frame, Float, DateTime, Integer, Selection, Notebook, Separator, Group, NewLine |
4334 | |
4335 | from openobject.widgets import JSLink, locations |
4336 | |
4337 | -from openerp.utils import rpc |
4338 | -from openerp.utils import cache |
4339 | -from openerp.utils import icons |
4340 | -from openerp.utils import node_attributes |
4341 | - |
4342 | -from openerp.widgets import TinyInputWidget |
4343 | - |
4344 | -from openerp.widgets.form import Char |
4345 | -from openerp.widgets.form import Form |
4346 | -from openerp.widgets.form import Frame |
4347 | -from openerp.widgets.form import Button |
4348 | -from openerp.widgets.form import Float |
4349 | -from openerp.widgets.form import Frame |
4350 | -from openerp.widgets.form import DateTime |
4351 | -from openerp.widgets.form import Integer |
4352 | -from openerp.widgets.form import Selection |
4353 | -from openerp.widgets.form import Notebook |
4354 | -from openerp.widgets.form import Separator |
4355 | -from openerp.widgets.form import Group |
4356 | -from openerp.widgets.form import NewLine |
4357 | - |
4358 | |
4359 | class RangeWidget(TinyInputWidget): |
4360 | template = "templates/rangewid.mako" |
4361 | - |
4362 | + |
4363 | params = ["field_value"] |
4364 | member_widgets = ["from_field", "to_field"] |
4365 | |
4366 | @@ -75,11 +55,8 @@ |
4367 | |
4368 | fname = attrs['name'] |
4369 | |
4370 | - from_attrs = attrs.copy() |
4371 | - to_attrs = attrs.copy() |
4372 | - |
4373 | - from_attrs['name'] = fname + '/from' |
4374 | - to_attrs['name'] = fname + '/to' |
4375 | + from_attrs = dict(attrs, name=fname+'/from') |
4376 | + to_attrs = dict(attrs, name=fname+'/to') |
4377 | |
4378 | self.from_field = RANGE_WIDGETS[kind](**from_attrs) |
4379 | self.to_field = RANGE_WIDGETS[kind](**to_attrs) |
4380 | @@ -90,7 +67,7 @@ |
4381 | # in search view fields should be writable |
4382 | self.from_field.readonly = False |
4383 | self.to_field.readonly = False |
4384 | - |
4385 | + |
4386 | # register the validators |
4387 | if hasattr(cherrypy.request, 'terp_validators'): |
4388 | for widget in [self.from_field, self.to_field]: |
4389 | @@ -106,178 +83,163 @@ |
4390 | |
4391 | class Filter(TinyInputWidget): |
4392 | template = "templates/filter.mako" |
4393 | - |
4394 | + |
4395 | params = ['icon', 'filter_domain', 'help', 'filter_id', 'text_val', 'group_context', 'def_checked'] |
4396 | - |
4397 | + |
4398 | def __init__(self, **attrs): |
4399 | super(Filter, self).__init__(**attrs) |
4400 | - |
4401 | + |
4402 | self.icon = attrs.get('icon') |
4403 | self.filter_domain = attrs.get('domain', []) |
4404 | self.help = attrs.get('help') |
4405 | self.filter_id = 'filter_%s' % (random.randint(0,10000)) |
4406 | filter_context = attrs.get('context', None) |
4407 | - |
4408 | + |
4409 | self.def_checked = False |
4410 | default_val = attrs.get('default', 0) |
4411 | if default_val: |
4412 | self.def_checked = True |
4413 | - |
4414 | + |
4415 | self.group_context = None |
4416 | - |
4417 | + |
4418 | # context implemented only for group_by. |
4419 | if filter_context: |
4420 | self.filter_context = eval(filter_context) |
4421 | self.group_context = self.filter_context.get('group_by', None) |
4422 | - |
4423 | + |
4424 | if self.group_context: |
4425 | - self.group_context = 'group_' + self.group_context |
4426 | - |
4427 | + self.group_context = 'group_' + self.group_context |
4428 | + |
4429 | self.nolabel = True |
4430 | self.readonly = False |
4431 | - |
4432 | + |
4433 | self.text_val = self.string or self.help |
4434 | - |
4435 | + |
4436 | if self.icon: |
4437 | self.icon = icons.get_icon(self.icon) |
4438 | |
4439 | class Search(TinyInputWidget): |
4440 | template = "templates/search.mako" |
4441 | javascript = [JSLink("openerp", "javascript/search.js", location=locations.bodytop)] |
4442 | - |
4443 | - params = ['fields_type', 'filters_list', 'middle_string', 'fields_list'] |
4444 | + |
4445 | + params = ['fields_type', 'filters_list', 'operators_map', 'fields_list'] |
4446 | member_widgets = ['frame'] |
4447 | |
4448 | _notebook = Notebook(name="search_notebook") |
4449 | |
4450 | - def __init__(self, model, domain=[], context={}, values={}): |
4451 | - |
4452 | + def __init__(self, model, domain=None, context=None, values={}): |
4453 | + |
4454 | super(Search, self).__init__(model=model) |
4455 | |
4456 | self.domain = domain or [] |
4457 | self.context = context or {} |
4458 | self.model = model |
4459 | |
4460 | - ctx = rpc.session.context.copy() |
4461 | - ctx.update(self.context) |
4462 | - |
4463 | + ctx = dict(rpc.session.context, |
4464 | + **self.context) |
4465 | + |
4466 | view_id = ctx.get('search_view') or False |
4467 | - |
4468 | + |
4469 | view = cache.fields_view_get(self.model, view_id, 'search', ctx, True) |
4470 | fields = cache.fields_get(self.model, [], ctx) |
4471 | - |
4472 | + |
4473 | self.fields_list = [] |
4474 | - |
4475 | + |
4476 | for k,v in fields.items(): |
4477 | - if v['type'] in ('many2one', 'char', 'float', 'integer', 'date', 'datetime', 'selection', 'many2many', 'boolean', 'one2many') and v.get('selectable', False): |
4478 | - self.fields_list.append([k, v['string'], v['type']]) |
4479 | + if v['type'] in ('many2one', 'char', 'float', 'integer', 'date', |
4480 | + 'datetime', 'selection', 'many2many', 'boolean', |
4481 | + 'one2many') and v.get('selectable', False): |
4482 | + self.fields_list.append((k, v['string'], v['type'])) |
4483 | if self.fields_list: |
4484 | self.fields_list.sort(lambda x, y: cmp(x[1], y[1])) |
4485 | - |
4486 | + |
4487 | dom = xml.dom.minidom.parseString(view['arch'].encode('utf-8')) |
4488 | - root = dom.childNodes[0] |
4489 | - attrs = node_attributes(root) |
4490 | - self.string = attrs.get('string', '') |
4491 | + |
4492 | + self.string = dom.documentElement.getAttribute('string') |
4493 | |
4494 | self.fields_type = {} |
4495 | - |
4496 | + |
4497 | self.frame = self.parse(model, dom, view['fields'], values)[0] |
4498 | - |
4499 | + |
4500 | my_acts = rpc.session.execute('object', 'execute', 'ir.actions.act_window', 'get_filters', model) |
4501 | - |
4502 | - sorted_filters = [[act.get('domain', act['id']), act['name']] for act in my_acts] |
4503 | + |
4504 | + sorted_filters = [(act.get('domain', act['id']), act['name']) |
4505 | + for act in my_acts] |
4506 | sorted_filters.sort(lambda x, y: cmp(x[1], y[1])) |
4507 | - |
4508 | - self.filters_list = [["blk", "-- Filters --"]] |
4509 | - self.filters_list += sorted_filters |
4510 | - self.filters_list += [["blk", '--Actions--'],["sh", 'Save as a Shortcut'],["sf", 'Save as a Filter'],["mf", 'Manage Filters']] |
4511 | - |
4512 | - self.middle_string = [] |
4513 | - for item in (['ilike', _('contains')], ['not ilike', _('doesn\'t contain')], ['=', _('is equal to')], |
4514 | - ['<>', _('is not equal to')], ['>', _('greater than')], ['<', _('less than')], |
4515 | - ['in', _('in')], ['not in', _('not in')]): |
4516 | - self.middle_string += [item] |
4517 | - |
4518 | + |
4519 | + self.filters_list = [("blk", "-- Filters --")] \ |
4520 | + + sorted_filters \ |
4521 | + + [("blk", '--Actions--'),("sh", 'Save as a Shortcut'), |
4522 | + ("sf", 'Save as a Filter'),("mf", 'Manage Filters')] |
4523 | + |
4524 | + self.operators_map = [ |
4525 | + ('ilike', _('contains')), ('not ilike', _('doesn\'t contain')), |
4526 | + ('=', _('is equal to')), ('<>', _('is not equal to')), |
4527 | + ('>', _('greater than')), ('<', _('less than')), |
4528 | + ('in', _('in')), ('not in', _('not in'))] |
4529 | + |
4530 | def parse(self, model=None, root=None, fields=None, values={}): |
4531 | - |
4532 | + |
4533 | views = [] |
4534 | search_model = model |
4535 | for node in root.childNodes: |
4536 | - |
4537 | + |
4538 | if not node.nodeType==node.ELEMENT_NODE: |
4539 | continue |
4540 | - |
4541 | - filter_attrs = {} |
4542 | + |
4543 | attrs = node_attributes(node) |
4544 | - attrs['label_position'] = 'True' |
4545 | - attrs['model'] = search_model |
4546 | - |
4547 | - if attrs.has_key('colspan'): |
4548 | + attrs.update(label_position='True', |
4549 | + model=search_model) |
4550 | + |
4551 | + if 'colspan' in attrs: |
4552 | attrs['colspan'] = 1 |
4553 | |
4554 | - if attrs.has_key('nolabel'): |
4555 | + if 'nolabel' in attrs: |
4556 | attrs['nolabel'] = False |
4557 | - |
4558 | - if node.localName in ('form', 'tree'): |
4559 | - n = self.parse(model=search_model, root=node, fields=fields, values=values) |
4560 | - views += [Frame(children=n, **attrs)] |
4561 | - |
4562 | - elif node.localName in ('notebook', 'page'): |
4563 | - n = self.parse(model=search_model, root=node, fields=fields, values=values) |
4564 | - views += [Frame(children=n, **attrs)] |
4565 | - |
4566 | - elif node.localName == 'search': |
4567 | - n = self.parse(model=search_model, root=node, fields=fields, values=values) |
4568 | - views += [Frame(children=n, **attrs)] |
4569 | - |
4570 | - elif node.localName=='group': |
4571 | - n = self.parse(model=search_model, root=node, fields=fields, values=values) |
4572 | - views += [Group(children=n, **attrs)] |
4573 | - |
4574 | + |
4575 | + if node.localName in ('form', 'tree', 'notebook', 'page', 'search', |
4576 | + 'group'): |
4577 | + if node.localName == 'group': |
4578 | + Element = Group |
4579 | + else: |
4580 | + Element = Frame |
4581 | + views.append(Element(children= |
4582 | + self.parse(model=search_model, root=node, |
4583 | + fields=fields, values=values), |
4584 | + **attrs)) |
4585 | + |
4586 | elif node.localName=='newline': |
4587 | - views += [NewLine(**attrs)] |
4588 | - |
4589 | + views.append(NewLine(**attrs)) |
4590 | + |
4591 | elif node.localName=='filter': |
4592 | - kind = 'filter' |
4593 | attrs['model'] = search_model |
4594 | - field = FILTER[kind](**attrs) |
4595 | - |
4596 | - views += [field] |
4597 | - |
4598 | -# elif node.localName=='separator': |
4599 | -# kind = 'separator' |
4600 | -# field = WIDGETS[kind](**attrs) |
4601 | -# |
4602 | -# views += [field] |
4603 | - |
4604 | + views.append(Filter(**attrs)) |
4605 | + |
4606 | elif node.localName == 'field': |
4607 | name = attrs['name'] |
4608 | - filter_field = {} |
4609 | - |
4610 | + |
4611 | if name in self.fields_type: |
4612 | continue |
4613 | - |
4614 | + |
4615 | # If search view available then select=1 wont consider. All fields will display from search view. |
4616 | if not ('select' in attrs or 'select' in fields[name]): |
4617 | continue |
4618 | - |
4619 | - if attrs.get('widget', False): |
4620 | - if attrs['widget']=='one2many_list': |
4621 | - attrs['widget']='one2many' |
4622 | - if attrs['widget']=='selection': |
4623 | - attrs['widget']='selection' |
4624 | + |
4625 | + if attrs.get('widget'): |
4626 | + if attrs['widget'] == 'one2many_list': |
4627 | + attrs['widget'] = 'one2many' |
4628 | attrs['type'] = attrs['widget'] |
4629 | - |
4630 | + |
4631 | |
4632 | # in search view fields should be writable |
4633 | - attrs['readonly'] = False |
4634 | - attrs['required'] = False |
4635 | - attrs['translate'] = False |
4636 | - attrs['disabled'] = False |
4637 | - attrs['visible'] = True |
4638 | - attrs['invisible'] = False |
4639 | - attrs['editable'] = True |
4640 | - attrs['attrs'] = None |
4641 | + attrs.update(readonly=False, |
4642 | + required=False, |
4643 | + translate=False, |
4644 | + disabled=False, |
4645 | + visible=True, |
4646 | + invisible=False, |
4647 | + editable=True, |
4648 | + attrs=None) |
4649 | |
4650 | try: |
4651 | fields[name].update(attrs) |
4652 | @@ -298,26 +260,22 @@ |
4653 | field.callback = None |
4654 | |
4655 | if kind == 'boolean': |
4656 | - field.options = [[1, 'Yes'],[0, 'No']] |
4657 | + field.options = [(1, 'Yes'),(0, 'No')] |
4658 | field.validator.if_empty = '' |
4659 | |
4660 | - if values.has_key(name) and isinstance(field, (TinyInputWidget, RangeWidget)): |
4661 | + if name in values and isinstance(field, (TinyInputWidget, RangeWidget)): |
4662 | field.set_value(values[name]) |
4663 | - |
4664 | - if field: |
4665 | - views += [field] |
4666 | - |
4667 | + |
4668 | + views.append(field) |
4669 | + |
4670 | for n in node.childNodes: |
4671 | if n.localName=='filter': |
4672 | - attrs = node_attributes(n) |
4673 | - kind = 'filter' |
4674 | - |
4675 | - filter_field = FILTER[kind](**attrs) |
4676 | + filter_field = Filter(**node_attributes(n)) |
4677 | filter_field.onchange = None |
4678 | filter_field.callback = None |
4679 | - |
4680 | - views += [filter_field] |
4681 | - |
4682 | + |
4683 | + views.append(filter_field) |
4684 | + |
4685 | return views |
4686 | |
4687 | RANGE_WIDGETS = { |
4688 | @@ -328,10 +286,6 @@ |
4689 | 'integer': Integer, |
4690 | } |
4691 | |
4692 | -FILTER = { |
4693 | - 'filter': Filter |
4694 | -} |
4695 | - |
4696 | WIDGETS = { |
4697 | 'date': RangeWidget, |
4698 | 'datetime': RangeWidget, |
4699 | |
4700 | === modified file 'addons/openerp/widgets/sidebar.py' |
4701 | --- addons/openerp/widgets/sidebar.py 2010-01-11 07:27:50 +0000 |
4702 | +++ addons/openerp/widgets/sidebar.py 2010-03-09 13:30:53 +0000 |
4703 | @@ -43,7 +43,7 @@ |
4704 | |
4705 | javascript = [JSSource(""" |
4706 | function toggle_sidebar(forced) { |
4707 | - |
4708 | + |
4709 | function a() { |
4710 | |
4711 | var sb = openobject.dom.get('sidebar'); |
4712 | @@ -59,7 +59,7 @@ |
4713 | img.src = "/openerp/static/images/sidebar_hide.gif"; |
4714 | } |
4715 | } |
4716 | - |
4717 | + |
4718 | if (typeof(Notebook) == "undefined") { |
4719 | a(); |
4720 | } else { |
4721 | @@ -80,11 +80,11 @@ |
4722 | self.multi = multi |
4723 | self.context = context or {} |
4724 | self.view_type = view_type |
4725 | - |
4726 | + |
4727 | act = 'client_action_multi' |
4728 | toolbar = toolbar or {} |
4729 | submenu = submenu |
4730 | - |
4731 | + |
4732 | self.reports = toolbar.get('print', []) |
4733 | self.actions = toolbar.get('action', []) |
4734 | self.relates = toolbar.get('relate', []) |
4735 | @@ -93,7 +93,7 @@ |
4736 | self.sub_menu = None |
4737 | |
4738 | proxy = rpc.RPCProxy('ir.values') |
4739 | - |
4740 | + |
4741 | if self.view_type == 'form': |
4742 | act = 'tree_but_action' |
4743 | |
4744 | @@ -103,7 +103,7 @@ |
4745 | ids = [a['id'] for a in self.actions] |
4746 | for act in actions: |
4747 | if act['id'] not in ids: |
4748 | - act['context'] = self.context |
4749 | + act['context'] = self.context |
4750 | self.actions.append(act) |
4751 | |
4752 | reports = proxy.get('action', 'client_print_multi', [(self.model, False)], False, self.context) |
4753 | @@ -116,18 +116,17 @@ |
4754 | self.reports.append(rep) |
4755 | |
4756 | if self.view_type == 'form': |
4757 | - |
4758 | + |
4759 | proxy = rpc.RPCProxy('ir.attachment') |
4760 | ids = proxy.search([('res_model', '=', model), ('res_id', '=', id)], 0, 0, 0, self.context) |
4761 | - |
4762 | + |
4763 | if ids: |
4764 | attach = [] |
4765 | datas = proxy.read(ids, ['datas_fname']) |
4766 | self.attachments = [(d['id'], d['datas_fname']) for d in datas if d['datas_fname']] |
4767 | - |
4768 | + |
4769 | self.sub_menu = submenu |
4770 | else: |
4771 | self.relates = [] |
4772 | - |
4773 | + |
4774 | # vim: ts=4 sts=4 sw=4 si et |
4775 | - |
4776 | |
4777 | === modified file 'addons/openerp/widgets/templates/search.mako' |
4778 | --- addons/openerp/widgets/templates/search.mako 2010-01-11 09:32:25 +0000 |
4779 | +++ addons/openerp/widgets/templates/search.mako 2010-03-09 13:30:53 +0000 |
4780 | @@ -9,8 +9,8 @@ |
4781 | % endfor |
4782 | </select> |
4783 | <select id="expr" class="expr"> |
4784 | - % for val in middle_string: |
4785 | - <option value="${val[0]}">${val[1]}</option> |
4786 | + % for operator, description in operators_map: |
4787 | + <option value="${operator}">${description}</option> |
4788 | % endfor |
4789 | </select> |
4790 | <input type="text" class='qstring' id="qstring"></input> |
4791 | |
4792 | === modified file 'addons/openerp/widgets/tree_view.py' |
4793 | --- addons/openerp/widgets/tree_view.py 2010-02-11 06:51:04 +0000 |
4794 | +++ addons/openerp/widgets/tree_view.py 2010-03-09 13:30:53 +0000 |
4795 | @@ -47,7 +47,7 @@ |
4796 | template = "templates/viewtree.mako" |
4797 | params = ['model', 'id', 'ids', 'domain', 'context', 'view_id', 'toolbar'] |
4798 | member_widgets = ['tree', 'sidebar'] |
4799 | - |
4800 | + |
4801 | javascript = [JSLink("openerp", "javascript/form.js", location=locations.bodytop)] |
4802 | |
4803 | def __init__(self, view, model, res_id=False, domain=[], context={}, action=None): |
4804 | @@ -110,14 +110,14 @@ |
4805 | onheaderclick="onHeaderClick") |
4806 | self.id = id |
4807 | self.ids = ids |
4808 | - |
4809 | + |
4810 | submenu = {} |
4811 | toolbar = {} |
4812 | for item, value in view.get('toolbar', {}).items(): |
4813 | if value: toolbar[item] = value |
4814 | |
4815 | self.sidebar = Sidebar(self.model, submenu, toolbar, context=self.context) |
4816 | - |
4817 | + |
4818 | # get the correct view title |
4819 | self.string = getattr(cherrypy.request, '_terp_view_name', self.string) |
4820 | |
4821 | @@ -136,4 +136,3 @@ |
4822 | self.headers += [field] |
4823 | |
4824 | # vim: ts=4 sts=4 sw=4 si et |
4825 | - |
4826 | |
4827 | === modified file 'addons/openerp/widgets/treegrid.py' |
4828 | --- addons/openerp/widgets/treegrid.py 2010-01-11 06:30:30 +0000 |
4829 | +++ addons/openerp/widgets/treegrid.py 2010-03-09 13:30:53 +0000 |
4830 | @@ -84,4 +84,3 @@ |
4831 | self.url_params = _jsonify(params) |
4832 | |
4833 | # vim: ts=4 sts=4 sw=4 si et |
4834 | - |
4835 | |
4836 | === modified file 'addons/view_calendar/controllers/_calendar.py' |
4837 | --- addons/view_calendar/controllers/_calendar.py 2010-02-04 12:16:22 +0000 |
4838 | +++ addons/view_calendar/controllers/_calendar.py 2010-03-09 13:30:53 +0000 |
4839 | @@ -46,7 +46,7 @@ |
4840 | from view_calendar import widgets as tc |
4841 | |
4842 | class TinyCalendar(Form): |
4843 | - |
4844 | + |
4845 | _cp_path = "/calendar" |
4846 | |
4847 | @expose() |
4848 | @@ -102,11 +102,11 @@ |
4849 | params, data = TinyDict.split(kw) |
4850 | |
4851 | error = None |
4852 | - |
4853 | + |
4854 | ctx = rpc.session.context.copy() |
4855 | ctx.update(params.context or {}) |
4856 | ctx = context_with_concurrency_info(ctx, params.concurrency_info) |
4857 | - |
4858 | + |
4859 | proxy = rpc.RPCProxy(params.model) |
4860 | |
4861 | try: |
4862 | @@ -263,7 +263,7 @@ |
4863 | return dict() |
4864 | |
4865 | class CalendarPopup(Form): |
4866 | - |
4867 | + |
4868 | _cp_path = "/calpopup" |
4869 | |
4870 | @expose(template="templates/calpopup.mako") |
4871 | @@ -312,6 +312,3 @@ |
4872 | ctx.update(params.context or {}) |
4873 | |
4874 | return data |
4875 | - |
4876 | -# vim: ts=4 sts=4 sw=4 si et |
4877 | - |
4878 | |
4879 | === modified file 'addons/view_calendar/widgets/_base.py' |
4880 | --- addons/view_calendar/widgets/_base.py 2010-02-04 12:16:22 +0000 |
4881 | +++ addons/view_calendar/widgets/_base.py 2010-03-09 13:30:53 +0000 |
4882 | @@ -389,6 +389,3 @@ |
4883 | info_fields += [attrs['name']] |
4884 | |
4885 | return info_fields |
4886 | - |
4887 | -# vim: ts=4 sts=4 sw=4 si et |
4888 | - |
4889 | |
4890 | === modified file 'addons/view_calendar/widgets/_views.py' |
4891 | --- addons/view_calendar/widgets/_views.py 2010-02-04 12:16:22 +0000 |
4892 | +++ addons/view_calendar/widgets/_views.py 2010-03-09 13:30:53 +0000 |
4893 | @@ -5,14 +5,14 @@ |
4894 | from widgets import GanttCalendar |
4895 | |
4896 | class CalendarView(TinyView): |
4897 | - |
4898 | + |
4899 | _type = "calendar" |
4900 | _name = _("Calendar") |
4901 | _desc = _("Calendar view...") |
4902 | _priority = 4 |
4903 | - |
4904 | + |
4905 | def __call__(self, screen): |
4906 | - |
4907 | + |
4908 | widget = get_calendar(view=screen.view, |
4909 | model=screen.model, |
4910 | ids=screen.ids, |
4911 | @@ -23,12 +23,12 @@ |
4912 | |
4913 | |
4914 | class GanttView(TinyView): |
4915 | - |
4916 | + |
4917 | _type = "gantt" |
4918 | _name = _("Gantt") |
4919 | _desc = _("Gantt view...") |
4920 | _priority = 5 |
4921 | - |
4922 | + |
4923 | def __call__(self, screen): |
4924 | widget = GanttCalendar(model=screen.model, |
4925 | view=screen.view, |
4926 | @@ -37,4 +37,3 @@ |
4927 | context=screen.context, |
4928 | options=screen.kalendar) |
4929 | return widget |
4930 | - |
4931 | |
4932 | === modified file 'addons/view_calendar/widgets/utils.py' |
4933 | --- addons/view_calendar/widgets/utils.py 2009-04-15 07:40:52 +0000 |
4934 | +++ addons/view_calendar/widgets/utils.py 2010-03-09 13:30:53 +0000 |
4935 | @@ -349,6 +349,3 @@ |
4936 | |
4937 | def __repr__(self): |
4938 | return "Year %s" % self.year |
4939 | - |
4940 | -# vim: ts=4 sts=4 sw=4 si et |
4941 | - |
4942 | |
4943 | === modified file 'addons/view_calendar/widgets/widgets.py' |
4944 | --- addons/view_calendar/widgets/widgets.py 2010-02-04 12:16:22 +0000 |
4945 | +++ addons/view_calendar/widgets/widgets.py 2010-03-09 13:30:53 +0000 |
4946 | @@ -410,6 +410,3 @@ |
4947 | keys.append(group_id) |
4948 | |
4949 | return [groups[i] for i in keys] |
4950 | - |
4951 | -# vim: ts=4 sts=4 sw=4 si et |
4952 | - |
4953 | |
4954 | === modified file 'addons/view_graph/__init__.py' |
4955 | --- addons/view_graph/__init__.py 2010-02-04 12:34:58 +0000 |
4956 | +++ addons/view_graph/__init__.py 2010-03-09 13:30:53 +0000 |
4957 | @@ -1,2 +1,1 @@ |
4958 | import widgets |
4959 | - |
4960 | |
4961 | === modified file 'addons/view_graph/__terp__.py' |
4962 | --- addons/view_graph/__terp__.py 2010-02-04 12:34:58 +0000 |
4963 | +++ addons/view_graph/__terp__.py 2010-03-09 13:30:53 +0000 |
4964 | @@ -8,4 +8,3 @@ |
4965 | "website": 'http://www.openerp.com/', |
4966 | "active": True, |
4967 | } |
4968 | - |
4969 | |
4970 | === modified file 'addons/view_graph/widgets/_graph.py' |
4971 | --- addons/view_graph/widgets/_graph.py 2010-02-04 12:34:58 +0000 |
4972 | +++ addons/view_graph/widgets/_graph.py 2010-03-09 13:30:53 +0000 |
4973 | @@ -27,29 +27,19 @@ |
4974 | # You can see the MPL licence at: http://www.mozilla.org/MPL/MPL-1.1.html |
4975 | # |
4976 | ############################################################################### |
4977 | - |
4978 | -import os |
4979 | -import time |
4980 | +import locale |
4981 | import random |
4982 | -import locale |
4983 | -import base64 |
4984 | -import xml.dom.minidom |
4985 | - |
4986 | import re |
4987 | +import time |
4988 | import urllib |
4989 | +import xml.dom.minidom |
4990 | |
4991 | import simplejson |
4992 | - |
4993 | +from openerp.utils import rpc, cache, node_attributes |
4994 | +from openerp.widgets import TinyWidget |
4995 | from openobject.tools import url_plus |
4996 | from openobject.widgets import JSSource, JSLink |
4997 | |
4998 | -from openerp.utils import rpc |
4999 | -from openerp.utils import common |
5000 | -from openerp.utils import cache |
The diff has been truncated for viewing.
rev2943 seems to break <group> tag (as it generate a Frame object instead of a Group object)