Merge lp:~xmo-deactivatedaccount/openobject-client-web/trunk-various-stuff into lp:openobject-client-web/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
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

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 :

rev2943 seems to break <group> tag (as it generate a Frame object instead of a Group object)

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.