← Back to team overview

openerp-dev-web team mailing list archive

lp:~openerp-dev/openobject-client-web/backport-stable-trunk-bugfixes into lp:~openerp-dev/openobject-client-web/trunk-dev-web

 

sma (Open ERP) has proposed merging lp:~openerp-dev/openobject-client-web/backport-stable-trunk-bugfixes into lp:~openerp-dev/openobject-client-web/trunk-dev-web.

Requested reviews:
  OpenERP SA's Web Client R&D (openerp-dev-web)


- Backporting stable bugs to trunk.
-- 
https://code.launchpad.net/~openerp-dev/openobject-client-web/backport-stable-trunk-bugfixes/+merge/26683
Your team OpenERP SA's Web Client R&D is requested to review the proposed merge of lp:~openerp-dev/openobject-client-web/backport-stable-trunk-bugfixes into lp:~openerp-dev/openobject-client-web/trunk-dev-web.
=== modified file 'addons/openerp/controllers/actions.py'
--- addons/openerp/controllers/actions.py	2010-05-31 12:33:26 +0000
+++ addons/openerp/controllers/actions.py	2010-06-03 10:51:23 +0000
@@ -71,6 +71,8 @@
 
     cherrypy.request._terp_view_name = name or None
     cherrypy.request._terp_view_target = target or None
+    if name:
+        params.context['_terp_view_name'] = name
 
     if params.ids and not isinstance(params.ids, list):
         params.ids = [params.ids]
@@ -271,9 +273,19 @@
 
         res = rpc.RPCProxy('ir.actions.server').run([action['id']], ctx)
         if res:
+<<<<<<< TREE
             return execute(res, **data)
         else:
             return ''
+=======
+            if not isinstance(res, list):
+                res = [res]
+                
+            output = None
+            for r in res:
+                output = execute(r, **data)
+            return output
+>>>>>>> MERGE-SOURCE
 
     elif action['type']=='ir.actions.wizard':
         if 'window' in data:
@@ -284,7 +296,7 @@
 
         ctx1.update(ctx2)
 
-        data['context'] = ctx2
+        data['context'] = ctx1
 
         return execute_wizard(action['wiz_name'], **data)
 
@@ -339,8 +351,12 @@
 
     if type is None:
         type = get_action_type(act_id)
+        
+    ctx = {}
+    ctx.update(rpc.session.context.copy())
+    ctx.update(data.get('context') or {})   
 
-    res = rpc.session.execute('object', 'execute', type, 'read', act_id, False, rpc.session.context)
+    res = rpc.session.execute('object', 'execute', type, 'read', act_id, False, ctx)
     return execute(res, **data)
 
 def execute_by_keyword(keyword, adds=None, **data):

=== modified file 'addons/openerp/controllers/fieldpref.py'
--- addons/openerp/controllers/fieldpref.py	2010-05-13 09:21:46 +0000
+++ addons/openerp/controllers/fieldpref.py	2010-06-03 10:51:23 +0000
@@ -87,6 +87,10 @@
         field = field.split('/')[-1]
 
         proxy = rpc.RPCProxy('ir.values')
+        
+        if type(value) == type('') and not len(value):
+            value = False
+            
         res = proxy.set('default', deps, field, [(model,False)], value, True, False, False, params.you or False, True)
 
         return dict(model=params.model, click_ok=click_ok, field=params.field, deps=params.deps2, should_close=True)

=== modified file 'addons/openerp/controllers/form.py'
--- addons/openerp/controllers/form.py	2010-05-24 13:21:09 +0000
+++ addons/openerp/controllers/form.py	2010-06-03 10:51:23 +0000
@@ -274,6 +274,9 @@
 
         params.editable = True
         params.view_type = 'form'
+        
+        if kw.get('default_date'):
+            params.context.update({'default_date' : kw.get('default_date')})
 
         cherrypy.request._terp_view_target = kw.get('target')
 
@@ -384,7 +387,9 @@
             proxy = rpc.RPCProxy(params.model)
 
             if not params.id:
-                id = proxy.create(data, params.context)
+                ctx = params.context or {}
+                ctx.update(rpc.session.context.copy())
+                id = proxy.create(data, ctx)
                 params.ids = (params.ids or []) + [int(id)]
                 params.id = int(id)
                 params.count += 1
@@ -467,6 +472,10 @@
 
         id = (id or False) and int(id)
         ids = (id or []) and [id]
+        
+        ctx = (params.context or {}).copy()
+        ctx.update(rpc.session.context.copy())
+        ctx.update(button.context or {})
 
         if btype == 'cancel':
             if name:
@@ -489,8 +498,7 @@
                 return actions.execute(res, ids=[id])
 
         elif btype == 'object':
-            ctx = params.context or {}
-            ctx.update(rpc.session.context.copy())
+
             res = rpc.session.execute('object', 'execute', model, name, ids, ctx)
 
             if isinstance(res, dict):
@@ -509,7 +517,7 @@
 
             res = actions.execute_by_id(action_id, type=action_type,
                                         model=model, id=id, ids=ids,
-                                        context=params.context or {})
+                                        context=ctx or {})
             if res:
                 return res
 
@@ -861,7 +869,7 @@
         model = params.model
 
         id = params.id or False
-        ids = params.ids or []
+        ids = params.selection or params.ids or []
 
         if params.view_type == 'form':
             #TODO: save current record
@@ -993,12 +1001,21 @@
         values2 = {}
         for k, v in values.items():
             key = ((prefix or '') and prefix + '/') + k
+            kind = ''
+            if data.get(key):
+                kind =  data[key].get('type')
 
             if key in data and key != 'id':
                 values2[k] = data[key]
                 values2[k]['value'] = v
             else:
                 values2[k] = {'value': v}
+                
+            if kind == 'float':
+                field = proxy.fields_get([k], ctx2)
+                digit = field[k].get('digits')
+                if digit: digit = digit[1]
+                values2[k]['digit'] = digit or 2
 
         values = TinyForm(**values2).from_python().make_plain()
 

=== modified file 'addons/openerp/controllers/impex.py'
--- addons/openerp/controllers/impex.py	2010-05-13 09:21:46 +0000
+++ addons/openerp/controllers/impex.py	2010-06-03 10:51:23 +0000
@@ -71,7 +71,10 @@
     except IOError, (errno, strerror):
         raise common.message(_("Operation failed!\nI/O error")+"(%s)" % (errno,))
 
-def _fields_get_all(model, views):
+def _fields_get_all(model, views, context=None):
+    
+    if not context:
+        context = {}
 
     def parse(root, fields):
 
@@ -90,8 +93,8 @@
 
     proxy = rpc.RPCProxy(model)
 
-    v1 = proxy.fields_view_get(views.get('tree', False), 'tree', rpc.session.context)
-    v2 = proxy.fields_view_get(views.get('form', False), 'form', rpc.session.context)
+    v1 = proxy.fields_view_get(views.get('tree', False), 'tree', context)
+    v2 = proxy.fields_view_get(views.get('form', False), 'form', context)
 
     dom = xml.dom.minidom.parseString(v1['arch'].encode('utf-8'))
     root = dom.childNodes[0]
@@ -116,6 +119,9 @@
     @expose(template="templates/exp.mako")
     def exp(self, **kw):
         params, data = TinyDict.split(kw)
+        
+        ctx = params.context or {}
+        ctx.update(rpc.session.context.copy())
 
         views = {}
         if params.view_mode and params.view_ids:
@@ -132,17 +138,18 @@
                                  headers=headers,
                                  url=tools.url('/openerp/impex/get_fields'),
                                  field_parent='relation',
+                                 context=ctx,
                                  views=views)
 
         tree.show_headers = False
 
-        view = proxy.fields_view_get(False, 'tree', rpc.session.context)
+        view = proxy.fields_view_get(False, 'tree', ctx)
         new_list = listgrid.List(name='_terp_list', model='ir.exports', view=view, ids=None,
                                  domain=[('resource', '=', params.model)],
-                                 context=rpc.session.context, selectable=1, editable=False, pageable=False)
-
-
-        return dict(new_list=new_list, model=params.model, ids=params.ids,
+                                 context=ctx, selectable=1, editable=False, pageable=False)
+
+
+        return dict(new_list=new_list, model=params.model, ids=params.ids, ctx=ctx,
                     search_domain=params.search_domain, source=params.source,
                     tree=tree)
 
@@ -176,6 +183,13 @@
     def get_fields(self, model, prefix='', name='', field_parent=None, **kw):
 
         is_importing = kw.get('is_importing', False)
+        
+        ctx = {}
+        try:
+            ctx = eval(kw['context'])
+        except:
+            pass
+        ctx.update(rpc.session.context.copy())
 
         ids = kw.get('ids', '').split(',')
         ids = [i for i in ids if i]
@@ -186,7 +200,7 @@
         except:
             pass
 
-        fields = _fields_get_all(model, views)
+        fields = _fields_get_all(model, views, ctx)
         fields.update({'id': {'string': 'ID'}, 'db_id': {'string': 'Database ID'}})
 
         fields_order = fields.keys()
@@ -259,12 +273,15 @@
     def get_namelist(self, **kw):
 
         params, data = TinyDict.split(kw)
+        
+        ctx = params.context or {}
+        ctx.update(rpc.session.context.copy())
 
         res = []
         ids = []
         id = params.id
 
-        res = self.get_data(params.model)
+        res = self.get_data(params.model, ctx)
 
         ir_export = rpc.RPCProxy('ir.exports')
         ir_export_line = rpc.RPCProxy('ir.exports.line')
@@ -280,11 +297,14 @@
 
         return dict(name_list=name_list)
 
-    def get_data(self, model):
+    def get_data(self, model, context=None):
 
         name = ''
         prefix = ''
         ids = []
+        
+        if not context:
+            context = {}
 
         fields_data = {}
         proxy = rpc.RPCProxy(model)
@@ -292,8 +312,8 @@
 
         # XXX: in GTK client, top fields comes from Screen
         if not ids:
-            f1 = proxy.fields_view_get(False, 'tree', rpc.session.context)['fields']
-            f2 = proxy.fields_view_get(False, 'form', rpc.session.context)['fields']
+            f1 = proxy.fields_view_get(False, 'tree', context)['fields']
+            f2 = proxy.fields_view_get(False, 'form', context)['fields']
 
             fields = {}
             fields.update(f1)
@@ -332,7 +352,7 @@
         if isinstance(fields, basestring):
             fields = [fields]
 
-        ctx = {}
+        ctx = params.context or {}
         ctx.update(rpc.session.context.copy())
         ctx['import_comp'] = import_compat
 
@@ -362,8 +382,8 @@
             wb = xlwt.Workbook()
             worksheet = wb.add_sheet('Sheet 1')
 
-            for col in range(len(fields)):
-                worksheet.write(0, col, str(fields[col]))
+            for col in range(len(params.fields2)):
+                worksheet.write(0, col, ustr(params.fields2[col]))
                 col+1
 
             heading_xf = ezxf('align: wrap yes')
@@ -371,7 +391,7 @@
             for data in range(len(result)):
                 for d in range(len(result[data])):
                     try:
-                        result[data][d] = str(result[data][d])
+                        result[data][d] = ustr(result[data][d])
                     except:
                         pass
                     result[data][d] = re.sub("\r", " ", result[data][d])
@@ -390,7 +410,10 @@
     @expose(template="templates/imp.mako")
     def imp(self, **kw):
         params, data = TinyDict.split(kw)
-
+        
+        ctx = params.context or {}
+        ctx.update(rpc.session.context.copy())
+        
         views = {}
         if params.view_mode and params.view_ids:
             for i, view in enumerate(params.view_mode):
@@ -403,6 +426,7 @@
                                     url=tools.url('/openerp/impex/get_fields'),
                                     field_parent='relation',
                                     views=views,
+                                    context=ctx,
                                     is_importing=1)
 
         tree.show_headers = False
@@ -415,6 +439,9 @@
 
         _fields = {}
         _fields_invert = {}
+        
+        proxy = rpc.RPCProxy(params.model)
+        fields = proxy.fields_get(False, rpc.session.context)
 
         def model_populate(fields, prefix_node='', prefix=None, prefix_value='', level=2):
             def str_comp(x,y):
@@ -425,17 +452,23 @@
             fields_order = fields.keys()
             fields_order.sort(lambda x,y: str_comp(fields[x].get('string', ''), fields[y].get('string', '')))
             for field in fields_order:
-                if (fields[field]['type'] not in ('reference',)) and (not fields[field].get('readonly', False)):
+                if (fields[field].get('type','') not in ('reference',))\
+                            and (not fields[field].get('readonly', False)\
+                            or not dict(fields[field].get('states', {}).get(
+                            'draft', [('readonly', True)])).get('readonly',True)):
+                    
                     st_name = prefix_value+fields[field]['string'] or field
                     _fields[prefix_node+field] = st_name
                     _fields_invert[st_name] = prefix_node+field
-                    if fields[field]['type']=='one2many' and level>0:
+                    if fields[field].get('type','')=='one2many' and level>0:
                         fields2 = rpc.session.execute('object', 'execute', fields[field]['relation'], 'fields_get', False, rpc.session.context)
+                        fields2.update({'id': {'type': 'char', 'string': 'ID'}, 'db_id':{'type': 'char', 'string': 'Database ID'}})
                         model_populate(fields2, prefix_node+field+'/', None, st_name+'/', level-1)
+                    if fields[field].get('type','') in ('many2one', 'many2many' ) and level>0:
+                        model_populate({'id': {'type': 'char', 'string': 'ID'}, 'db_id': {'type': 'char', 'string': 'Database ID'}},
+                                       prefix_node+field+':', None, st_name+'/', level-1)
 
-        proxy = rpc.RPCProxy(params.model)
-        fields = proxy.fields_get(False, rpc.session.context)
-        fields.update({'id': {'string': 'ID'}, 'db_id': {'string': 'Database ID'}})
+        fields.update({'id': {'type': 'char', 'string': 'ID'}, 'db_id': {'type': 'char', 'string': 'Database ID'}})
         model_populate(fields)
 
         try:
@@ -449,10 +482,12 @@
             for line in data:
                 for word in line:
                     word = ustr(word.decode(csvcode))
-                    if word in _fields_invert.keys():
+                    if word in _fields:
+                        fields += [(word, _fields[word])]
+                    elif word in _fields_invert.keys():
                         fields += [(_fields_invert[word], word)]
                     else:
-                        fields += [(word, _fields[word])]
+                        raise common.warning(_("You cannot import this field %s, because we cannot auto-detect it" % (word,)))
                 break
         except:
             raise common.warning(_('Error processing your first line of the file.\nField %s is unknown!') % (word,), _('Import Error.'))
@@ -477,7 +512,10 @@
             fields = [fields]
 
         for line in data:
-            datas.append(map(lambda x:x.decode(csvcode).encode('utf-8'), line))
+            try:
+                datas.append(map(lambda x:x.decode(csvcode).encode('utf-8'), line))
+            except:
+                datas.append(map(lambda x:x.decode('latin').encode('utf-8'), line))
         try:
             res = rpc.session.execute('object', 'execute', params.model, 'import_data', fields, datas, 'init', '', False, ctx)
         except Exception, e:

=== modified file 'addons/openerp/controllers/listgrid.py'
--- addons/openerp/controllers/listgrid.py	2010-05-31 06:01:58 +0000
+++ addons/openerp/controllers/listgrid.py	2010-06-03 10:51:23 +0000
@@ -64,9 +64,10 @@
             frm = TinyForm(**kw).to_python()
             data = {}
             ctx = context_with_concurrency_info(params.parent.context, params.concurrency_info)
-
-            if model != params.model:
-                source = params.source
+            
+            source = params.source
+            if source and source != '_terp_list':
+                
                 data = frm.chain_get(source)
 
                 if '__id' in data: data.pop('__id')

=== modified file 'addons/openerp/controllers/openo2m.py'
--- addons/openerp/controllers/openo2m.py	2010-05-13 09:21:46 +0000
+++ addons/openerp/controllers/openo2m.py	2010-06-03 10:51:23 +0000
@@ -54,10 +54,6 @@
         # to get proper view, first generate form using the view_params
         vp = params.view_params
 
-        # this prevents calling default_get, causes unnecessary
-        # auto increment of sequence
-        vp.id = params.parent_id or False
-
         form = tw.form_view.ViewForm(vp, name="view_form", action="/openerp/openo2m/save")
         cherrypy.request.terp_validators = {}
         wid = form.screen.widget.get_widgets_by_name(params.o2m)[0]

=== modified file 'addons/openerp/controllers/requests.py'
--- addons/openerp/controllers/requests.py	2010-05-24 13:21:09 +0000
+++ addons/openerp/controllers/requests.py	2010-06-03 10:51:23 +0000
@@ -62,7 +62,7 @@
     def default(self):
         import actions
         return actions.execute_window(False, 'res.request', res_id=None,
-            domain=[('act_to','=',rpc.session.uid)], view_type='form', mode='tree,form')
+            domain=[], view_type='form', mode='tree,form')
 
 
 # vim: ts=4 sts=4 sw=4 si et

=== modified file 'addons/openerp/controllers/search.py'
--- addons/openerp/controllers/search.py	2010-05-31 06:01:58 +0000
+++ addons/openerp/controllers/search.py	2010-06-03 10:51:23 +0000
@@ -96,7 +96,7 @@
         params, data = TinyDict.split(kw)
 
         domain = kw.get('_terp_domain', [])
-        context = kw.get('_terp_context', {})
+        context = params.context or {}
 
         parent_context = params.parent_context or {}
         parent_context.update(rpc.session.context.copy())
@@ -120,6 +120,10 @@
         if prefix and '/' in prefix:
             prefix = prefix.rsplit('/', 1)[0]
             pctx = pctx.chain_get(prefix)
+            
+        #update active_id in context for links
+        parent_context['active_id'] = params.active_id or False
+        parent_context['active_ids'] = params.active_ids or []
 
         ctx['parent'] = pctx
         ctx['context'] = parent_context
@@ -148,6 +152,9 @@
             for key, val in context.items():
                 if val==None:
                     context[key] = False
+                    
+        if isinstance(context, dict):
+            context = expr_eval(context, ctx)
 
         ctx2 = parent_context
         parent_context.update(context)

=== modified file 'addons/openerp/controllers/templates/about.mako'
--- addons/openerp/controllers/templates/about.mako	2010-03-05 13:19:04 +0000
+++ addons/openerp/controllers/templates/about.mako	2010-06-03 10:51:23 +0000
@@ -92,7 +92,7 @@
                     </td>
                 </tr><tr>
                     <td>
-                        <a target="_blank" href="http://openerp.com/en/downloads.html";>${_("Download")}</a>
+                        <a target="_blank" href="http://openerp.com/downloads.html";>${_("Download")}</a>
                     </td>                
                 </tr><tr>
                     <td>
@@ -116,11 +116,11 @@
                     </td>
                 </tr><tr>
                     <td>
-                        <a target="_blank" href="http://openerp.com/en/buy/trainings.html";>${_("Trainings")}</a>
+                        <a target="_blank" href="http://openerp.com/buy/trainings.html";>${_("Trainings")}</a>
                     </td>
                 </tr><tr>
                     <td>
-                        <a target="_blank" href="http://openerp.com/en/buy.html";>${_("Services")}</a>
+                        <a target="_blank" href="http://openerp.com/buy.html";>${_("Services")}</a>
                     </td>
                 </tr>
             </table>

=== modified file 'addons/openerp/controllers/templates/error_page.mako'
--- addons/openerp/controllers/templates/error_page.mako	2010-05-24 13:21:09 +0000
+++ addons/openerp/controllers/templates/error_page.mako	2010-06-03 10:51:23 +0000
@@ -99,7 +99,7 @@
                                     <tr>
                                         <td class="label" width="5%" nowrap="nowrap">${_("Explain what you did:")}</td>
                                         <td class="item">
-                                            <textarea id="explanation" class="text" rows="10"/>
+                                            <textarea id="explanation" class="text" rows="10"></textarea> 
                                             <script type="text/javascript">
                                                 new openerp.ui.TextArea('explanation');
                                             </script>
@@ -108,7 +108,7 @@
                                     <tr>
                                         <td class="label">${_("Other Comments:")}</td>
                                         <td class="item">
-                                            <textarea id="remarks" class="text" rows="10"/>
+                                            <textarea id="remarks" class="text" rows="10"></textarea>
                                             <script type="text/javascript">
                                                 new openerp.ui.TextArea('remarks');
                                             </script>

=== modified file 'addons/openerp/controllers/templates/exp.mako'
--- addons/openerp/controllers/templates/exp.mako	2010-05-25 13:38:53 +0000
+++ addons/openerp/controllers/templates/exp.mako	2010-06-03 10:51:23 +0000
@@ -169,6 +169,7 @@
     <input type="hidden" id="_terp_ids" name="_terp_ids" value="${ids}"/>
     <input type="hidden" id="_terp_search_domain" name="_terp_search_domain" value="${search_domain}"/>
     <input type="hidden" id="_terp_fields2" name="_terp_fields2" value="[]"/>
+    <input type="hidden" id="_terp_context" name="_terp_context" value="${ctx}"/>
 
     <table class="view" cellspacing="5" border="0" width="100%">
         <tr>

=== modified file 'addons/openerp/controllers/templates/form.mako'
--- addons/openerp/controllers/templates/form.mako	2010-06-01 10:22:50 +0000
+++ addons/openerp/controllers/templates/form.mako	2010-06-03 10:51:23 +0000
@@ -5,6 +5,7 @@
 
     <script type="text/javascript">
         var form_controller = '${path}';
+        var USER_ID = '${rpc.session.uid}';
     </script>
 
     <script type="text/javascript">
@@ -97,6 +98,7 @@
                                     </td>
                                     % endif
                                     % if form.screen.view_type in ('form'):
+<<<<<<< TREE
 	                                    <td align="center" valign="middle" width="16" class="content_header_space">
 	                                        <img 
 	                                            class="button" width="16" height="16"
@@ -110,6 +112,23 @@
 	                                            src="/openerp/static/images/stock/stock_log.png"
 	                                            onclick="openobject.tools.openWindow('${py.url('/openerp/viewlog', _terp_model=form.screen.model, _terp_id=form.screen.id)}', {width: 500, height: 300})"/>
 	                                    </td>
+=======
+                                    <td align="center" valign="middle" width="16" style="padding: 0px 5px 0px 0px;">
+                                        <img 
+                                            class="button" width="16" height="16"
+                                            title="${_('Translate this resource.')}" 
+                                            src="/openerp/static/images/stock/stock_translate.png" onclick="openobject.tools.openWindow(openobject.http.getURL('/openerp/translator', {_terp_model: '${form.screen.model}', _terp_id: ${form.screen.id}, _terp_context: $('_terp_context').value}));"/>
+                                    </td>
+                                    % endif
+                                    % if form.screen.view_type in ('form'):
+                                    <td align="center" valign="middle" width="16" style="padding: 0px 5px 0px 0px;">
+                                        <img 
+                                            class="button" width="16" height="16"
+                                            title="${_('View Log.')}" 
+                                            src="/openerp/static/images/stock/stock_log.png"
+                                            onclick="openobject.tools.openWindow('${py.url('/openerp/viewlog', _terp_model=form.screen.model, _terp_id=form.screen.id)}', {width: 500, height: 300})"/>
+                                    </td>
+>>>>>>> MERGE-SOURCE
                                     % endif
                                 </tr>
                             </table>

=== modified file 'addons/openerp/controllers/templates/search.mako'
--- addons/openerp/controllers/templates/search.mako	2010-06-03 09:55:52 +0000
+++ addons/openerp/controllers/templates/search.mako	2010-06-03 10:51:23 +0000
@@ -21,14 +21,14 @@
     % if params.selectable == 1:
     <script type="text/javascript">
 
-        function do_select(id){
-            if (!id) {
+        function do_select(res_id){
+            if (!res_id) {
                 var ids = new ListView('_terp_list').getSelectedRecords();
 
                 if (ids.length<1)
                     return;
 
-                id = ids[0];
+                res_id = ids[0];
             }
             
             with (window.opener) {
@@ -36,7 +36,7 @@
                 var value_field = openobject.dom.get('${params.source}');
                 var text_field = openobject.dom.get('${params.source}_text');
                 
-                value_field.value = id;
+                value_field.value = res_id;
             
                 if (text_field){
                     text_field.value = '';

=== modified file 'addons/openerp/controllers/templates/translator.mako'
--- addons/openerp/controllers/templates/translator.mako	2010-05-24 13:21:09 +0000
+++ addons/openerp/controllers/templates/translator.mako	2010-06-03 10:51:23 +0000
@@ -10,7 +10,7 @@
 <form action="/openerp/translator/save" method="post" enctype="multipart/form-data">
     <input type="hidden" id="_terp_model" name="_terp_model" value="${model}"/>
     <input type="hidden" id="_terp_id" name="_terp_id" value="${id}"/>
-
+    <input type="hidden" id="_terp_context" name="_terp_context" value="${ctx}"/>
     <table class="view" cellspacing="5" border="0" width="100%">
         <tr>
             <td>
@@ -31,7 +31,7 @@
                         <tr>
                             <td class="label"><label for="translate">${_("Add Translation for:")}</label></td>
                             <td>
-                                <select name="translate" onchange="window.location.href=openobject.http.getURL('/openerp/translator', {_terp_model: '${model}', _terp_id: '${id}', translate: this.value})">
+                                <select name="translate" onchange="window.location.href=openobject.http.getURL('/openerp/translator', {_terp_model: '${model}', _terp_id: '${id}', _terp_context: $('_terp_context').value, translate: this.value})">
                                     <option value="fields" ${py.selector(translate=='fields')}>${_("Fields")}</option>
                                     <option value="labels" ${py.selector(translate=='labels')}>${_("Labels")}</option>
                                     <option value="relates" ${py.selector(translate=='relates')}>${_("Relates")}</option>

=== modified file 'addons/openerp/controllers/translator.py'
--- addons/openerp/controllers/translator.py	2010-05-13 09:21:46 +0000
+++ addons/openerp/controllers/translator.py	2010-06-03 10:51:23 +0000
@@ -48,6 +48,11 @@
     @expose(template="templates/translator.mako")
     def index(self, translate='fields', **kw):
         params, data = TinyDict.split(kw)
+        
+        ctx = {}
+        ctx = params.context or {}
+        ctx.update(rpc.session.context.copy())
+        params['context'] = ustr(ctx)
 
         proxy = rpc.RPCProxy('res.lang')
 
@@ -59,7 +64,7 @@
         data = []
         view = []
 
-        view_view = cache.fields_view_get(params.model, False, 'form', rpc.session.context, True)
+        view_view = cache.fields_view_get(params.model, False, 'form', ctx, True)
 
         view_fields = view_view['fields']
         view_relates = view_view.get('toolbar')
@@ -73,7 +78,7 @@
                 if attrs.get('translate'):
                     value = {}
                     for lang in langs:
-                        context = copy.copy(rpc.session.context)
+                        context = copy.copy(ctx)
                         context['lang'] = adapt_context(lang['code'])
 
                         val = proxy.read([params.id], [name], context)
@@ -123,11 +128,16 @@
                 if values:
                     view += [(code, values)]
 
-        return dict(translate=translate, langs=langs, data=data, view=view, model=params.model, id=params.id)
+        return dict(translate=translate, langs=langs, data=data, view=view, model=params.model, id=params.id, ctx=params.context)
 
     @expose()
     def save(self, translate='fields', **kw):
         params, data = TinyDict.split(kw)
+        
+        ctx = {}
+        ctx = params.context or {}
+        ctx.update(rpc.session.context.copy())
+        params['context'] = ustr(ctx)
 
         if translate == 'fields':
             if not params.id:
@@ -135,7 +145,7 @@
 
             for lang, value in data.items():
 
-                context = copy.copy(rpc.session.context)
+                context = copy.copy(ctx)
                 context['lang'] = adapt_context(lang)
 
                 for name, val in value.items():
@@ -160,6 +170,6 @@
                 for id, val in value.items():
                     rpc.session.execute('object', 'execute', 'ir.translation', 'write', [int(id)], {'value': val})
 
-        return self.index(translate=translate, _terp_model=params.model, _terp_id=params.id)
+        return self.index(translate=translate, _terp_model=params.model, _terp_id=params.id, ctx=params.context)
 
 # vim: ts=4 sts=4 sw=4 si et

=== modified file 'addons/openerp/controllers/viewed.py'
--- addons/openerp/controllers/viewed.py	2010-05-24 05:03:10 +0000
+++ addons/openerp/controllers/viewed.py	2010-06-03 10:51:23 +0000
@@ -741,7 +741,7 @@
     'image' : ['filename', 'width', 'height', 'groups'],
     'separator' : ['string', 'colspan', 'groups'],
     'label': ['string', 'align', 'colspan', 'groups'],
-    'button': ['name', 'string', 'icon', 'type', 'states', 'readonly', 'special', 'target', 'confirm', 'attrs', 'groups'],
+    'button': ['name', 'string', 'icon', 'type', 'states', 'readonly', 'special', 'target', 'confirm', 'context', 'attrs', 'groups'],
     'newline' : [],
     'hpaned': ['position', 'groups'],
     'vpaned': ['position', 'groups'],
@@ -868,8 +868,7 @@
 class ActionProperty(widgets.form.M2O):
 
     def __init__(self, name, default=None):
-        attrs = dict(name=name, relation='ir.actions.actions')
-        super(ActionProperty, self).__init__(attrs)
+        super(ActionProperty, self).__init__(name=name, relation='ir.actions.actions')
         self.set_value(default or False)
 
 class IconProperty(widgets.SelectField):

=== modified file 'addons/openerp/controllers/wizard.py'
--- addons/openerp/controllers/wizard.py	2010-05-13 09:21:46 +0000
+++ addons/openerp/controllers/wizard.py	2010-06-03 10:51:23 +0000
@@ -85,6 +85,9 @@
                 for f in fields:
                     if 'value' in fields[f]:
                         form_values[f] = fields[f]['value']
+                    
+                    if f in datas['form'] and fields[f]['type'] == "one2many":
+                        datas['form'][f] = [(1, d, {}) for d in datas['form'][f]]
 
                 form_values.update(datas['form'])
 

=== modified file 'addons/openerp/static/calendar/lang/calendar-de.js'
--- addons/openerp/static/calendar/lang/calendar-de.js	2009-04-13 14:25:09 +0000
+++ addons/openerp/static/calendar/lang/calendar-de.js	2010-06-03 10:51:23 +0000
@@ -27,7 +27,7 @@
  "So");
 
 // First day of the week. "0" means display Sunday first.
-Calendar._FD = 0;
+Calendar._FD = 1;
 
 // full month names
 Calendar._MN = new Array

=== modified file 'addons/openerp/static/calendar/lang/calendar-de_at.js'
--- addons/openerp/static/calendar/lang/calendar-de_at.js	2009-04-13 14:25:09 +0000
+++ addons/openerp/static/calendar/lang/calendar-de_at.js	2010-06-03 10:51:23 +0000
@@ -27,7 +27,7 @@
  "So");
 
 // First day of the week. "0" means display Sunday first.
-Calendar._FD = 0;
+Calendar._FD = 1;
 
 // full month names
 Calendar._MN = new Array

=== modified file 'addons/openerp/static/calendar/lang/calendar-de_de.js'
--- addons/openerp/static/calendar/lang/calendar-de_de.js	2009-04-13 14:25:09 +0000
+++ addons/openerp/static/calendar/lang/calendar-de_de.js	2010-06-03 10:51:23 +0000
@@ -27,7 +27,7 @@
  "So");
 
 // First day of the week. "0" means display Sunday first.
-Calendar._FD = 0;
+Calendar._FD = 1;
 
 // full month names
 Calendar._MN = new Array

=== modified file 'addons/openerp/static/calendar/lang/calendar-en.js'
--- addons/openerp/static/calendar/lang/calendar-en.js	2009-04-13 14:25:09 +0000
+++ addons/openerp/static/calendar/lang/calendar-en.js	2010-06-03 10:51:23 +0000
@@ -45,7 +45,7 @@
 
 // First day of the week. "0" means display Sunday first, "1" means display
 // Monday first, etc.
-Calendar._FD = 0;
+Calendar._FD = 1;
 
 // full month names
 Calendar._MN = new Array

=== modified file 'addons/openerp/static/javascript/form.js'
--- addons/openerp/static/javascript/form.js	2010-05-31 06:57:23 +0000
+++ addons/openerp/static/javascript/form.js	2010-06-03 10:51:23 +0000
@@ -159,6 +159,7 @@
 
     params['_terp_source'] = src;
     params['_terp_source_view_type'] = view_type;
+    params['_terp_editable'] = $(prefix + '_terp_editable').value
 
     if (openobject.dom.get('_terp_list')) {
         var ids = new ListView('_terp_list').getSelectedRecords();
@@ -312,9 +313,19 @@
         '_terp_button/model': model,
         '_terp_button/id': id
     };
+    
+    if (!context || context == "{}") {
+        var act = get_form_action(btype == 'cancel' ? 'cancel' : 'save', params);
+        return submit_form(act, null, target);
+    }
+    
+    var req = eval_domain_context_request({source: "", domain: "[]", context: context});
+    req.addCallback(function(obj) {
+        params['_terp_button/context'] = obj.context || 0;
 
-    var act = get_form_action(btype == 'cancel' ? 'cancel' : 'save', params);
-    submit_form(act, null, target);
+        var act = get_form_action(btype == 'cancel' ? 'cancel' : 'save', params);
+        submit_form(act, null, target);
+     });
 }
 
 function onBooleanClicked(name) {
@@ -442,7 +453,9 @@
             }
 
             if (kind == 'text_html') {
-                attrs['value'] = tinyMCE.get(e.name).getContent();
+                if(tinyMCE.get(e.name)){
+                    attrs['value'] =  tinyMCE.get(e.name).getContent();
+                }
             }
             
             if (kind == 'reference' && value) { 
@@ -577,7 +590,9 @@
                         openobject.dom.get(prefix + k + '_checkbox_').checked = value || false;
                         break;
                     case 'text_html':
-                        tinyMCE.execInstanceCommand(k, 'mceSetContent', false, value || '');
+                        if(tinyMCE.get(prefix + k)){
+                            tinyMCE.execInstanceCommand(prefix + k, 'mceSetContent', false, value || '')
+                        }
                         break;
                     case 'selection':
                         var opts = [];

=== modified file 'addons/openerp/static/javascript/form_state.js'
--- addons/openerp/static/javascript/form_state.js	2009-10-22 09:49:28 +0000
+++ addons/openerp/static/javascript/form_state.js	2010-06-03 10:51:23 +0000
@@ -161,6 +161,7 @@
         attrs = attrs.replace(/\)/g, ']');
         attrs = attrs.replace(/True/g, '1');
         attrs = attrs.replace(/False/g, '0');
+        attrs = attrs.replace(/uid/g, window.USER_ID);
         
         try {
             attrs = eval('(' + attrs + ')');
@@ -274,15 +275,16 @@
 
     if (!kind && 
             openobject.dom.get(field.id + '_id') && 
-            openobject.dom.get(field.id + '_text') &&
+            MochiKit.DOM.getElement(field.id + '_set') &&
             MochiKit.DOM.getNodeAttribute(field.id + '_id', 'kind') == "many2many") {
         return Many2Many(field.id).setReadonly(readonly);
     }
-
+    
+    var type = MochiKit.DOM.getNodeAttribute(field, 'type');
     field.readOnly = readonly;
     field.disabled = readonly;
     
-    if (readonly) {
+    if (readonly && (type != 'button')) {
         MochiKit.DOM.addElementClass(field, 'readonlyfield');
     } else {
         MochiKit.DOM.removeElementClass(field, 'readonlyfield');
@@ -293,6 +295,10 @@
         return ManyToOne(field).setReadonly(readonly);
     }
     
+    if (!kind && MochiKit.DOM.getElement(field.id + '_btn_') || MochiKit.DOM.getElement('_o2m_'+field.id)) { // one2many
+        return new One2Many(field.id).setReadonly(readonly);
+    }
+    
     if (kind == 'date' || kind == 'datetime' || kind == 'time') {
         var img = openobject.dom.get(field.name + '_trigger');
         if (img)
@@ -339,7 +345,12 @@
         try {
             var label = getNodeAttribute(container, 'for');
             label = MochiKit.Selector.findChildElements(container.parentNode, ['td.label[for="' + label + '"]'])[0];
-            if (label) label.style.display = visible ? '' : 'none';
+            if (!label){
+                container.style.display = visible ? '' : 'none';
+            }
+            else{
+                getFirstParentByTagAndClassName(container).style.display = visible ? '' : 'none';
+            }
         }catch(e){}
     }
 }

=== modified file 'addons/openerp/static/javascript/listgrid.js'
--- addons/openerp/static/javascript/listgrid.js	2010-05-31 06:01:58 +0000
+++ addons/openerp/static/javascript/listgrid.js	2010-06-03 10:51:23 +0000
@@ -585,7 +585,7 @@
         }
 
         var parent_field = this.name.split('/');
-        var data = getFormData(true);
+        var data = getFormData(2);
         var args = getFormParams('_terp_concurrency_info');
 
         for (var k in data) {
@@ -719,11 +719,14 @@
         var self = this;
         var args = this.makeArgs();
         
+        var current_id = edit_inline ? (parseInt(edit_inline) || 0) : edit_inline;
+        
         // add args
         args['_terp_source'] = this.name;
         args['_terp_edit_inline'] = edit_inline;
         args['_terp_source_default_get'] = default_get_ctx;
         args['_terp_concurrency_info'] = concurrency_info;
+        args['_terp_editable'] = openobject.dom.get('_terp_editable').value;
         args['_terp_group_by_ctx'] = openobject.dom.get('_terp_group_by_ctx').value;
         
         if (this.name == '_terp_list') {
@@ -747,9 +750,13 @@
             var _terp_id = openobject.dom.get(self.name + '/_terp_id') || openobject.dom.get('_terp_id');
             var _terp_ids = openobject.dom.get(self.name + '/_terp_ids') || openobject.dom.get('_terp_ids');
             var _terp_count = openobject.dom.get(self.name + '/_terp_count') || openobject.dom.get('_terp_count');
-
+            _terp_id.value = current_id > 0 ? current_id : 'False';
+            
             if (obj.ids) {
-                _terp_id.value = obj.ids.length ? obj.ids[0] : 'False';
+                if (typeof(current_id) == "undefined" && obj.ids.length) {
+                    current_id = obj.ids[0];
+                }
+                _terp_id.value = current_id > 0 ? current_id : 'False';
                 _terp_ids.value = '[' + obj.ids.join(',') + ']';
                 _terp_count.value = obj.count;
             }
@@ -846,6 +853,7 @@
 
         openobject.tools.openWindow(openobject.http.getURL('/openerp/impex/exp', {_terp_model: this.model,
             _terp_source: this.name,
+            _terp_context: $('_terp_context').value,
             _terp_search_domain: openobject.dom.get('_terp_search_domain').value,
             _terp_ids: ids,
             _terp_view_ids : this.view_ids,
@@ -854,6 +862,7 @@
 
     importData: function() {
         openobject.tools.openWindow(openobject.http.getURL('/openerp/impex/imp', {_terp_model: this.model,
+            _terp_context: $('_terp_context').value,
             _terp_source: this.name,
             _terp_view_ids : this.view_ids,
             _terp_view_mode : this.view_mode}));

=== modified file 'addons/openerp/static/javascript/m2o.js'
--- addons/openerp/static/javascript/m2o.js	2010-05-31 06:01:58 +0000
+++ addons/openerp/static/javascript/m2o.js	2010-06-03 10:51:23 +0000
@@ -49,7 +49,7 @@
 
     this.field = openobject.dom.get(name);
     this.text = openobject.dom.get(name + '_text');
-    
+    this.editable = getElement('_terp_editable') ? getElement('_terp_editable').value : 'True';
     //for autocomplete
     this.auto_hidden_id = openobject.dom.get('_hidden_' + name)
     
@@ -81,38 +81,40 @@
     this.field_class = getNodeAttribute(this.field, 'class');
     setNodeAttribute(this.text, 'autocomplete', 'OFF');
     
-    connect(this.field, 'onchange', this, this.on_change);
-    //connect(this.text, 'onchange', this, this.on_change_text);
-    connect(this.text, 'onkeydown', this, this.on_keydown);
-    connect(this.text, 'onkeypress', this, this.on_keypress);
-    connect(this.text, 'onkeyup', this, this.on_keyup);
-    connect(this.text, 'onfocus', this, this.gotFocus);
-    connect(this.text, 'onblur', this, this.lostFocus);
-    
-    if (this.hiddenField)
-    	this.lastHiddenResult = this.field.value;
-	this.lastTextResult = this.text.value;
-	
-    if (this.select_img)
-        connect(this.select_img, 'onclick', this, this.select);
-    if (this.open_img)
-        connect(this.open_img, 'onclick', this, this.open_record);
-    
-    if (this.reference) {
-        connect(this.reference, 'onchange', this, this.on_reference_changed);
-    }
-    
-    this.is_inline = name.indexOf('_terp_listfields/') == 0;
-
-    this.field._m2o = this;
-
-    this.change_icon();
-    
-    if (this.takeFocus) {
-        this.text.focus();
-        this.gotFocus();
-    }
-     bindMethods(this);
+    if (this.editable == 'True'){
+	    connect(this.field, 'onchange', this, this.on_change);
+	    //connect(this.text, 'onchange', this, this.on_change_text);
+	    connect(this.text, 'onkeydown', this, this.on_keydown);
+	    connect(this.text, 'onkeypress', this, this.on_keypress);
+	    connect(this.text, 'onkeyup', this, this.on_keyup);
+	    connect(this.text, 'onfocus', this, this.gotFocus);
+	    connect(this.text, 'onblur', this, this.lostFocus);
+	    
+	    if (this.hiddenField)
+	    	this.lastHiddenResult = this.field.value;
+		this.lastTextResult = this.text.value;
+		
+	    if (this.select_img)
+	        connect(this.select_img, 'onclick', this, this.select);
+	    if (this.open_img)
+	        connect(this.open_img, 'onclick', this, this.open_record);
+	    
+	    if (this.reference) {
+	        connect(this.reference, 'onchange', this, this.on_reference_changed);
+	    }
+	    
+	    this.is_inline = name.indexOf('_terp_listfields/') == 0;
+	
+	    this.field._m2o = this;
+	
+	    this.change_icon();
+	    
+	    if (this.takeFocus) {
+	        this.text.focus();
+	        this.gotFocus();
+	    }
+	     bindMethods(this);
+    }
 }
 
 ManyToOne.prototype.gotFocus = function(evt) {
@@ -139,6 +141,7 @@
 }
 
 ManyToOne.prototype.open_record = function(evt){
+    this.field.value = this.field.value || getNodeAttribute(this.field, 'value');
 	if (this.field.value) {
 	    this.open(this.field.value);
 	}
@@ -155,13 +158,14 @@
 
     var model = this.relation;
     var source = this.name;
-    var editable = 'True';
+    var editable = this.editable || 'True';
     
-    // To open popup form in readonly mode.
-    if (this.field_class.indexOf('readonlyfield') != -1) {
-        var editable = 'False';
+    if (editable ==  'True'){
+	    // To open popup form in readonly mode.
+	    if (this.field_class.indexOf('readonlyfield') != -1) {
+	        var editable = 'False';
+	    }
     }
-
     var req = eval_domain_context_request({source: source, domain: domain, context: context});
 
     req.addCallback(function(obj){

=== modified file 'addons/openerp/static/javascript/o2m.js'
--- addons/openerp/static/javascript/o2m.js	2010-05-13 09:21:46 +0000
+++ addons/openerp/static/javascript/o2m.js	2010-06-03 10:51:23 +0000
@@ -88,8 +88,11 @@
 
         // get the required view params to get proper view
         params['_terp_view_params/_terp_model'] = openobject.dom.get('_terp_model').value;
+        params['_terp_view_params/_terp_id'] = $('_terp_id').value;
+        params['_terp_view_params/_terp_ids'] = $('_terp_ids').value;
         params['_terp_view_params/_terp_view_ids'] = openobject.dom.get('_terp_view_ids').value;
         params['_terp_view_params/_terp_view_mode'] = openobject.dom.get('_terp_view_mode').value;
+        params['_terp_view_params/_terp_context'] = openobject.dom.get('_terp_context').value || {};
         params['_terp_view_params/_terp_view_type'] = 'form';
 
         while(names.length) {
@@ -98,8 +101,11 @@
             var prefix = parents.join('/');
 
             params['_terp_view_params/' + prefix + '/_terp_model'] = openobject.dom.get(prefix + '/_terp_model').value;
+            params['_terp_view_params/' + prefix + '/_terp_id'] = $(prefix + '/_terp_id').value;
+            params['_terp_view_params/' + prefix + '/_terp_ids'] = $(prefix + '/_terp_ids').value;
             params['_terp_view_params/' + prefix + '/_terp_view_ids'] = openobject.dom.get(prefix + '/_terp_view_ids').value;
             params['_terp_view_params/' + prefix + '/_terp_view_mode'] = openobject.dom.get(prefix + '/_terp_view_mode').value;
+            params['_terp_view_params/' + prefix + '/_terp_context'] = openobject.dom.get(prefix + '/_terp_context').value || {};
             params['_terp_view_params/' + prefix + '/_terp_view_type'] = 'form';
         }
 
@@ -136,6 +142,23 @@
                 openobject.http.delCookie('_terp_parent_context');
             }
         });
+    },
+    
+    setReadonly: function(readonly) {
+        var btn=MochiKit.DOM.getElement(this.name+'_btn_');
+        var grid=MochiKit.DOM.getElement(this.name+'_grid');
+        var edit=MochiKit.DOM.getElement(this.name + '/_terp_editable');
+        
+        if (readonly) {
+            if(btn){btn.style.display='none';}
+            MochiKit.Base.map(function (el) {el.style.display='none'},MochiKit.Selector.findChildElements(grid,['.selector']));
+            edit.value= 0;
+        }
+        else{
+            if(btn){btn.style.display='';}
+            MochiKit.Base.map(function (el) {el.style.display=''},MochiKit.Selector.findChildElements(grid,['.selector']));
+             edit.value = 1;
+        }
     }
 }
 

=== modified file 'addons/openerp/utils/tools.py'
--- addons/openerp/utils/tools.py	2010-05-20 06:33:09 +0000
+++ addons/openerp/utils/tools.py	2010-06-03 10:51:23 +0000
@@ -48,6 +48,10 @@
             return {}
         return temp
     else:
+        if isinstance(string, dict):
+            for i,v in string.items():
+                if v=='active_id':
+                    string[i] = eval(v,context)
         return string
 
 def node_attributes(node):
@@ -156,8 +160,9 @@
 
     if pn and pn.localName and pn.localName != 'view':
         xp = get_node_xpath(pn) + xp
-
-    nodes = xml_locate(root, node.parentNode)
+#    Fixed when child used anywhere except dashboard(notebook/page/vpaned/child).
+#    nodes = xml_locate(root, node.parentNode)
+    nodes = [n for n in pn.childNodes if n.localName == node.localName]
     xp += '[%s]' % (nodes.index(node) + 1)
 
     return xp
@@ -194,11 +199,15 @@
         fd, fn = tempfile.mkstemp(suffix=suffix, prefix=prefix, dir=dir, text=text)
         os.close(fd)
         return str.__new__(cls, fn)
+    
+    def __init__(self, *args, **kwargs):
+        self.__os_path_exists = os.path.exists
+        self.__os_unlink = os.unlink
+        str.__init__(self, *args, **kwargs)
 
     def __del__(self):
-        import os   # ensure os module exists
-        if os.path.exists(str(self)):
-            os.unlink(str(self))
+        if self.__os_path_exists(self):
+            self.__os_unlink(self)
 
     def __copy__(self):
         return self

=== modified file 'addons/openerp/utils/utils.py'
--- addons/openerp/utils/utils.py	2010-03-08 11:44:48 +0000
+++ addons/openerp/utils/utils.py	2010-06-03 10:51:23 +0000
@@ -157,7 +157,7 @@
 
         def _plain(data, prefix):
             for k, v in data.items():
-                if isinstance(v, dict):
+                if isinstance(v, dict) and not k.startswith('_terp_'):
                     _plain(v, prefix + k +'/')
                 else:
                     res[prefix + k] = v
@@ -189,6 +189,7 @@
     'text': lambda *a: validators.String(),
     'text_tag': lambda *a: validators.String(),
     'many2many': lambda *a: validators.many2many(),
+    'one2many': lambda *a: validators.one2many(),
     'many2one': lambda *a: validators.many2one(),
     'email' : lambda *a: validators.Email(),
     'url' : lambda *a: validators.URL(),
@@ -243,12 +244,21 @@
                         from openerp.utils import rpc
                         proxy = rpc.RPCProxy(attrs['relation'])
                         res = proxy.read(value, [], rpc.session.context)
+                        res1 = proxy.fields_get(False, rpc.session.context)
+                        for values in res:
+                            for key, val in values.items():
+                                if key in res1.keys():
+                                    if res1[key]['type'] == 'many2many':
+                                        if val == []:
+                                            values[key] = [(6, 0, [])]
+                                        else:
+                                            values[key] = [(6, 0, val)]
                         value = []
                         for r in res:
                             id = r.pop('id')
                             value += [(1, id, r)]
                     else:
-                        value = [(0, 0, [])]
+                        value = []
                 except:
                     pass
 
@@ -256,6 +266,8 @@
                 kind = 'char'
 
             v = _VALIDATORS.get(kind, validators.DefaultValidator)()
+            if kind == "float" and attrs.get("digit"):
+                v = validators.Float(digit=attrs.get("digit"))
             v.not_empty = (required or False) and True
 
             try:

=== modified file 'addons/openerp/validators/validators.py'
--- addons/openerp/validators/validators.py	2010-03-08 11:44:48 +0000
+++ addons/openerp/validators/validators.py	2010-06-03 10:51:23 +0000
@@ -78,8 +78,8 @@
         try:
             value = format.parse_decimal(value)
         except ValueError:
-            pass
-        return Number.to_python(value, state)
+            raise Invalid(_('Invalid literal for float'), value, state)
+        return value
 
 class FloatTime(Float):
 
@@ -227,6 +227,10 @@
             value = (len(value) or False) and value[0]
 
         return value or ''
+    
+class one2many(FancyValidator):
+    
+    if_empty = []
 
 
 # Let some FormEncode strings goes into message catalog.

=== modified file 'addons/openerp/widgets/form/_action.py'
--- addons/openerp/widgets/form/_action.py	2010-03-23 12:46:22 +0000
+++ addons/openerp/widgets/form/_action.py	2010-06-03 10:51:23 +0000
@@ -58,7 +58,7 @@
         super(Action, self).__init__(**attrs)
         self.nolabel = True
 
-        self.act_id = int(attrs['name'])
+        self.act_id= self.name
         
         proxy = rpc.RPCProxy("ir.actions.actions")
         res = proxy.read([self.act_id], ['type'], rpc.session.context)

=== modified file 'addons/openerp/widgets/form/_form.py'
--- addons/openerp/widgets/form/_form.py	2010-06-03 08:24:14 +0000
+++ addons/openerp/widgets/form/_form.py	2010-06-03 10:51:23 +0000
@@ -285,7 +285,7 @@
 
         self.fake_widget = '_fake'
         if attrs.get('prefix'):
-            self.fake_widge = attrs['prefix'] + '/_fake'
+            self.fake_widget = attrs['prefix'] + '/_fake'
 
 register_widget(Notebook, ["notebook"])
 
@@ -631,7 +631,7 @@
 class Button(TinyInputWidget):
 
     template = "templates/button.mako"
-    params = ["btype", "id", "confirm", "icon", "target"]
+    params = ["btype", "id", "confirm", "icon", "target", "context"]
 
     visible = True
     target = 'current'
@@ -644,6 +644,7 @@
         self.string = re.sub('_(?!_)', '', self.string or '')
 
         self.btype = attrs.get('special', attrs.get('type', 'workflow'))
+        self.context = attrs.get("context", {})
 
         self.nolabel = True
 
@@ -798,9 +799,11 @@
                     values[d[0]] = d[2][0]
 
         if ids:
-            values = proxy.read(ids[:1], fields.keys() + ['__last_update'], ctx)[0]
-            self.id = ids[0]
-            self._update_concurrency_info(self.model, [values])
+            lval = proxy.read(ids[:1], fields.keys() + ['__last_update'], ctx)
+            if lval:
+                values = lval[0]
+                self.id = ids[0]
+                self._update_concurrency_info(self.model, [values])
 
         elif 'datas' in view: # wizard data
 
@@ -911,6 +914,7 @@
                 name = attrs['name']
 
                 try:
+                    fields[name]['link'] = attrs.get('link', '1')
                     fields[name].update(attrs)
                 except:
                     print "-"*30,"\n malformed tag for:", attrs
@@ -974,7 +978,8 @@
     def _make_field_widget(self, attrs, value=False):
 
         attrs['editable'] = self.editable
-        attrs['link'] = self.link
+        if not attrs['type'] == 'many2one':
+            attrs['link'] = self.link
 
         attrs.setdefault('context', self.context)
         attrs.setdefault('model', self.model)

=== modified file 'addons/openerp/widgets/form/_o2m.py'
--- addons/openerp/widgets/form/_o2m.py	2010-06-03 09:55:52 +0000
+++ addons/openerp/widgets/form/_o2m.py	2010-06-03 10:51:23 +0000
@@ -112,6 +112,9 @@
 
         if ids and isinstance(ids[0], dict):
             ids = []
+            
+        if ids and isinstance(ids[0], tuple):
+            ids = [i[1] for i in ids]
 
         id = (ids or None) and ids[0]
 

=== modified file 'addons/openerp/widgets/form/templates/button.mako'
--- addons/openerp/widgets/form/templates/button.mako	2010-05-26 08:41:51 +0000
+++ addons/openerp/widgets/form/templates/button.mako	2010-06-03 10:51:23 +0000
@@ -1,8 +1,8 @@
-<a ${py.attrs(attrs)} 
+<a ${py.attrs(attrs, context=ctx)} 
 	class="button-b" 
 	id="${name}" 
 	href="javascript: void(0)" 
-	onclick="buttonClicked('${name}', '${btype}', '${model}', '${id}', '${confirm}', '${target}');" style="height: 18px;">
+	onclick="buttonClicked('${name}', '${btype}', '${model}', '${id}', '${confirm}', '${target}', getNodeAttribute(this, 'context'));" style="height: 18px;">
 	% if string:
 		% if icon:
 			<div class="button_wid_string" style="background-image: url(${icon});">${string}</div>

=== modified file 'addons/openerp/widgets/form/templates/char.mako'
--- addons/openerp/widgets/form/templates/char.mako	2010-04-21 14:22:43 +0000
+++ addons/openerp/widgets/form/templates/char.mako	2010-06-03 10:51:23 +0000
@@ -8,7 +8,7 @@
 % endif
 
 % if not editable and not password:
-    <span kind="${kind}" id="${name}">${value}</span>
+    <span kind="${kind}" id="${name}" value="${value}">${value}</span>
 % endif
 
 % if not editable and password and value:

=== modified file 'addons/openerp/widgets/form/templates/many2many.mako'
--- addons/openerp/widgets/form/templates/many2many.mako	2010-05-24 13:21:09 +0000
+++ addons/openerp/widgets/form/templates/many2many.mako	2010-06-03 10:51:23 +0000
@@ -21,6 +21,9 @@
     	<td id='${name}_container'>
             ${screen.display()}
             <!-- IMP: IE problem, openobject.dom.get('some_name') returns field with name="some_id" instead of id="some_id" -->
+            % if not editable:
+                <input type="hidden" class="${css_class}" id='${name}_set' kind="${kind}" ${py.attrs(attrs)} style="width: 100%;"/>
+            % endif
             <input type="hidden" class="${css_class}" kind="${kind}" id='${name}_id' name="${name}" value="${screen.ids}" ${py.attrs(attrs)} relation="${relation}"/>
         </td>
         % endif

=== modified file 'addons/openerp/widgets/form/templates/many2one.mako'
--- addons/openerp/widgets/form/templates/many2one.mako	2010-05-31 06:01:58 +0000
+++ addons/openerp/widgets/form/templates/many2one.mako	2010-06-03 10:51:23 +0000
@@ -36,20 +36,12 @@
 
 % if not editable and link:
     % if link=='1':
-        <span id="${name}" ${py.attrs(kind=kind, value=value)}>
-            <a href="${py.url('/openerp/form/view', model=relation, id=value)}">${text}</a>
+        <span id="${name}" name="${name}" ${py.attrs(kind=kind, value=value, relation=relation, context=ctx, domain=domain, link=link)}>
+            <a href="javascript: void(0)" onclick="new ManyToOne('${name}').open_record('${value}')">${text}</a>
         </span>
     % endif
     % if link=='0':
-        <span id="${name}" ${py.attrs(kind=kind, value=value)}>${text}</span>
+        <span id="${name}" ${py.attrs(kind=kind, value=value, relation=relation, link=link)}>${text}</span>
     % endif
 % endif
 
-% if not editable and not link == '0':
-    <span>
-        <span id="${name}" ${py.attrs(kind=kind, value=value, relation=relation)}>
-            <a href="${py.url('/openerp/form/view', model=relation, id=value)}">${text}</a>
-        </span>
-    </span>
-% endif
-

=== modified file 'addons/openerp/widgets/form/templates/one2many.mako'
--- addons/openerp/widgets/form/templates/one2many.mako	2010-06-03 09:55:52 +0000
+++ addons/openerp/widgets/form/templates/one2many.mako	2010-06-03 10:51:23 +0000
@@ -36,7 +36,7 @@
                         % if not screen.editable and screen.view_type=='form':
                         <img class="button" title="${_('Translate me.')}" alt="${_('Translate me.')}" 
                              src="/openerp/static/images/stock/stock_translate.png" width="16" height="16"
-                             onclick="openobject.tools.openWindow('${py.url('/openerp/translator', _terp_model=screen.model, _terp_id=screen.id)}')"/>
+                             onclick="openobject.tools.openWindow(openobject.http.getURL('/openerp/translator', {_terp_model: '${screen.model}', _terp_id: ${screen.id}, _terp_context: $('_terp_context').value}));"/>
                         % endif
                     </td>
                 </tr>
@@ -46,7 +46,7 @@
     <tr>
         % if screen:
         <td>
-            <input type="hidden" name="${name}/__id" id="${name}/__id" value="${id}"/>
+            <input type="hidden" name="${name}/__id" id="${name}/__id" value="${id}" ${py.disabled(screen.view_type!="form")}/>
             <input type="hidden" name="${name}/_terp_default_get_ctx" id="${name}/_terp_default_get_ctx" value="${default_get_ctx}"/>
             ${screen.display()}
         </td>

=== modified file 'addons/openerp/widgets/form/templates/reference.mako'
--- addons/openerp/widgets/form/templates/reference.mako	2010-01-11 09:32:25 +0000
+++ addons/openerp/widgets/form/templates/reference.mako	2010-06-03 10:51:23 +0000
@@ -48,6 +48,10 @@
         new ManyToOne('${name}');
     </script>    
 % else:
-    <span>${'(%s) %s' % (dict(options).get(relation), text)}</span>
+    <span>
+        <span id="${name}" ${py.attrs(kind=kind, value=value, relation=relation)}>
+            <a href="${py.url('/form/view', model=relation, id=value)}">${text}</a>
+        </span>
+    </span>
 % endif
 

=== modified file 'addons/openerp/widgets/form_view.py'
--- addons/openerp/widgets/form_view.py	2010-05-10 12:45:17 +0000
+++ addons/openerp/widgets/form_view.py	2010-06-03 10:51:23 +0000
@@ -103,9 +103,16 @@
 
         if params.view_type == 'tree':
             self.screen.id = False
+            
+        if 'form' not in self.screen.view_mode:
+            self.screen.widget.link = 0
+            self.screen.editable = False
+            self.screen.widget.editable = False
 
         # get the correct view title
-        self.screen.string = getattr(cherrypy.request, '_terp_view_name', self.screen.string) or self.screen.string
+        if params.context:
+            self.screen.string = params.context.get('_terp_view_name', self.screen.string)
+        self.screen.string = self.screen.string
 
         # get the actual pager data
         self.limit = self.screen.limit
@@ -120,6 +127,11 @@
             self.hidden_fields = params.hidden_fields
 
         #self.fields = cherrypy.request.terp_fields
+    def update_params(self, d):
+        super(ViewForm, self).update_params(d)
+        if self.search:            
+            d.attrs['onsubmit']='submit_search_form()';    
+        
 
 
 # vim: ts=4 sts=4 sw=4 si et

=== modified file 'addons/openerp/widgets/listgrid.py'
--- addons/openerp/widgets/listgrid.py	2010-05-26 10:13:57 +0000
+++ addons/openerp/widgets/listgrid.py	2010-06-03 10:51:23 +0000
@@ -47,7 +47,7 @@
 
     template = "templates/listgrid.mako"
     params = ['name', 'data', 'columns', 'headers', 'model', 'selectable', 'editable',
-              'pageable', 'selector', 'source', 'offset', 'limit', 'show_links', 'editors',
+              'pageable', 'selector', 'source', 'offset', 'limit', 'show_links', 'editors', 'view_mode',
               'hiddens', 'edit_inline', 'field_total', 'link', 'checkbox_name', 'm2m', 'min_rows', 'string']
 
     member_widgets = ['pager', 'buttons', 'editors', 'concurrency_info']
@@ -94,7 +94,8 @@
         self.selectable = kw.get('selectable', 0)
         self.editable = kw.get('editable', False)
         self.pageable = kw.get('pageable', True)
-
+        self.view_mode = kw.get('view_mode', [])
+        
         self.offset = kw.get('offset', 0)
         self.limit = kw.get('limit', 0)
         self.count = kw.get('count', 0)
@@ -444,6 +445,9 @@
 
     def get_text(self):
         if self.value:
+            if isinstance(self.value, (tuple, list)):
+                self.value = self.value[0]
+
             selection = self.attrs['selection']
             for k, v in selection:
                 if k == self.value:
@@ -468,6 +472,10 @@
     def get_text(self):
         val = self.value or 0.0
         t = '%02d:%02d' % (math.floor(abs(val)),round(abs(val)%1+0.01,2) * 60)
+        
+        hour, min = t.split(':')
+        if int(min) == 60:
+            t = str(int(hour) + 1) + ":00"
         if val < 0:
             t = '-' + t
 

=== modified file 'addons/openerp/widgets/sidebar.py'
--- addons/openerp/widgets/sidebar.py	2010-05-31 06:01:58 +0000
+++ addons/openerp/widgets/sidebar.py	2010-06-03 10:51:23 +0000
@@ -123,18 +123,16 @@
                 rep['context'] = self.context
                 self.reports.append(rep)
 
-        if self.view_type == 'form':
+        if self.view_type == 'form' and id:
 
             proxy = rpc.RPCProxy('ir.attachment')
             ids = proxy.search([('res_model', '=', model), ('res_id', '=', id)], 0, 0, 0, self.context)
 
             if ids:
                 attach = []
-                datas = proxy.read(ids, ['datas_fname'])
-                self.attachments = [(d['id'], d['datas_fname']) for d in datas if d['datas_fname']]
+                datas = proxy.read(ids, ['datas_fname', 'name'])
+                self.attachments = [(d['id'], d['datas_fname'] or d['name']) for d in datas if d['datas_fname'] or d['name']]
 
             self.sub_menu = submenu
-        else:
-            self.relates = []
 
 # vim: ts=4 sts=4 sw=4 si et

=== modified file 'addons/openerp/widgets/templates/listgrid.mako'
--- addons/openerp/widgets/templates/listgrid.mako	2010-05-31 06:01:58 +0000
+++ addons/openerp/widgets/templates/listgrid.mako	2010-06-03 10:51:23 +0000
@@ -108,13 +108,21 @@
 	        						}
 	        					}
 	        					else if(jQuery('#_o2m_${name}').length>0) {
-	        						jQuery('#${name}').find('td.pager-cell:first').after('<td style="width: 10%;" class="pager-cell"><a class="button-a" href="javascript: void(0)" id="${name}_btn_" title="${_('Create new record.')}">new<a/></td>');
+	        					    if('${editable}' != 'False') {
+	        						     jQuery('#${name}').find('td.pager-cell:first').after('<td style="width: 10%;" class="pager-cell"><a class="button-a" href="javascript: void(0)" id="${name}_btn_" title="${_('Create new record.')}">new<a/></td>');
+	        						}
 	        						jQuery('#${name}_btn_').click(function() {
 	        							new One2Many('${name}', jQuery('#_o2m_${name}').attr('detail')).create()
 	        						});
 	        					}
 	        					else {
+<<<<<<< TREE
 	        						jQuery('#${name}').find('td.pager-cell:first').after('<td class="pager-cell-button"><a class="button-a" href="javascript: void(0)" title="${_('Create new record.')}">new</a></td>');
+=======
+	        					    if('${editable}' != 'False') {
+	        						     jQuery('#${name}').find('td.pager-cell:first').after('<td style="width: 10%;" class="pager-cell-button"><a class="button-a" href="javascript: void(0)" title="${_('Create new record.')}">new<a/></td>');
+	        						}
+>>>>>>> MERGE-SOURCE
 	        						if("${editors}" == "{}") {
 	        							jQuery('#${name}').find('td.pager-cell-button:first').find('a:first').click(function() {
 	        								editRecord(null);
@@ -284,51 +292,52 @@
 		            }
 				</script>
 			% endif
-			
-			<script type="text/javascript">
-				//Make all records Editable by Double-click
-				var view_type = jQuery('[id*=_terp_view_type]').val();
-            	var editable = jQuery('[id*=_terp_editable]').val();
-            	jQuery('table#${name}_grid tr.grid-row').each(function(index, row) {
-            		jQuery(row).dblclick(function(event) {
-            			if (!(event.target.className == 'checkbox grid-record-selector' || event.target.className == 'listImage')) {
-            				if (view_type == 'tree') {
-            					if (editable != 'True') {
-            						do_select(jQuery(row).attr('record'));
-            					}
-            					else {
-            						editRecord(jQuery(row).attr('record'));
-            					}
-            				}
-            			}
-            		});
-            	});
-            	
-            	jQuery('table#${name}_grid tr.grid-row').each(function(index, row) {
-            		jQuery(row).click(function(event) {
-            			if (!(event.target.className == 'grid-cell selector' || event.target.className == 'checkbox grid-record-selector' || event.target.className == 'listImage')) {
-            				if (view_type == 'tree') {
-            					do_select(jQuery(row).attr('record'));
-            				}
-            			}
-            		});
-            	});
-
-                if (view_type == 'form') {
-                    if (jQuery('#${name}_set').length) {
-                        if (jQuery('input#${name}/_terp_ids').val() != '[]') {
-                            jQuery('table#${name}_grid tr.grid-row td:nth-child(2) span span').each(function(index, span) {
-                                var link_text = jQuery(span).text();
-                                var record_id = jQuery(span).parents('tr.grid-row').attr('record');
-                                jQuery(span).empty().append(
-	                                jQuery('<a>').attr('href', '#').click(function () {
-	                                    do_select(record_id, '${name}');
-	                                    return false;
-	                                }).text(link_text));});
-                        }
-                    }
-                }
-            </script>
+			% if 'form' in view_mode:
+				<script type="text/javascript">
+					//Make all records Editable by Double-click
+					var view_type = jQuery('[id*=_terp_view_type]').val();
+	            	var editable = jQuery('[id*=_terp_editable]').val();
+	            	jQuery('table#${name}_grid tr.grid-row').each(function(index, row) {
+	            		jQuery(row).dblclick(function(event) {
+	            			if (!(event.target.className == 'checkbox grid-record-selector' || event.target.className == 'listImage')) {
+	            				if (view_type == 'tree') {
+	            					if (editable != 'True') {
+	            						do_select(jQuery(row).attr('record'));
+	            					}
+	            					else {
+	            						editRecord(jQuery(row).attr('record'));
+	            					}
+	            				}
+	            			}
+	            		});
+	            	});
+	            	
+	            	jQuery('table#${name}_grid tr.grid-row').each(function(index, row) {
+	            		jQuery(row).click(function(event) {
+	            			if (!(event.target.className == 'grid-cell selector' || event.target.className == 'checkbox grid-record-selector' || event.target.className == 'listImage')) {
+	            				if (view_type == 'tree') {
+	            					do_select(jQuery(row).attr('record'));
+	            				}
+	            			}
+	            		});
+	            	});
+	
+	                if (view_type == 'form') {
+	                    if (jQuery('#${name}_set').length) {
+	                        if (jQuery('input#${name}/_terp_ids').val() != '[]') {
+	                            jQuery('table#${name}_grid tr.grid-row td:nth-child(2) span span').each(function(index, span) {
+	                                var link_text = jQuery(span).text();
+	                                var record_id = jQuery(span).parents('tr.grid-row').attr('record');
+	                                jQuery(span).empty().append(
+		                                jQuery('<a>').attr('href', '#').click(function () {
+		                                    do_select(record_id, '${name}');
+		                                    return false;
+		                                }).text(link_text));});
+	                        }
+	                    }
+	                }
+	            </script>
+            % endif
         </td>
     </tr>
 

=== modified file 'addons/openerp/widgets/tree_view.py'
--- addons/openerp/widgets/tree_view.py	2010-05-13 09:21:46 +0000
+++ addons/openerp/widgets/tree_view.py	2010-06-03 10:51:23 +0000
@@ -121,7 +121,7 @@
             self.sidebar = Sidebar(self.model, submenu, toolbar, context=self.context)
 
         # get the correct view title
-        self.string = getattr(cherrypy.request, '_terp_view_name', self.string)
+        self.string = self.context.get('_terp_view_name', self.string) or self.string
 
     def parse(self, root, fields=None):
 

=== modified file 'addons/view_calendar/static/javascript/calendar_month.js'
--- addons/view_calendar/static/javascript/calendar_month.js	2009-10-22 09:49:28 +0000
+++ addons/view_calendar/static/javascript/calendar_month.js	2010-06-03 10:51:23 +0000
@@ -168,7 +168,10 @@
         if (!hasElementClass(target, 'calMonthDay'))
             return;
 
-        editCalendarRecord(null);
+        var elem = getElement('calEventNew');
+        var dt = MochiKit.DateTime.isoTimestamp(getNodeAttribute(elem, 'dtStart'));
+        
+        editCalendarRecord(null, toISOTimestamp(dt));
     },
 
     splitEvent : function(record, params){

=== modified file 'addons/view_calendar/static/javascript/calendar_utils.js'
--- addons/view_calendar/static/javascript/calendar_utils.js	2010-05-24 13:21:09 +0000
+++ addons/view_calendar/static/javascript/calendar_utils.js	2010-06-03 10:51:23 +0000
@@ -184,7 +184,7 @@
     });
 }
 
-var editCalendarRecord = function(record_id){
+var editCalendarRecord = function(record_id, date){
 
     var params = {
         'id': record_id,
@@ -192,7 +192,8 @@
         'view_mode': openobject.dom.get('_terp_view_mode').value,
         'view_ids': openobject.dom.get('_terp_view_ids').value,
         'domain': openobject.dom.get('_terp_domain').value,
-        'context': openobject.dom.get('_terp_context').value
+        'context': openobject.dom.get('_terp_context').value,
+        'default_date': date
     }
 
     var act = openobject.http.getURL('/view_calendar/calpopup/edit', params);

=== modified file 'addons/view_calendar/static/javascript/calendar_week.js'
--- addons/view_calendar/static/javascript/calendar_week.js	2009-11-02 06:23:10 +0000
+++ addons/view_calendar/static/javascript/calendar_week.js	2010-06-03 10:51:23 +0000
@@ -310,8 +310,11 @@
         var target = evt.target();
         if (!hasElementClass(target, 'calVRule'))
             return;
-
-        editCalendarRecord(null);
+            
+        var elem = getElement('calEventNew');
+        var dt = MochiKit.DateTime.isoTimestamp(getNodeAttribute(elem, 'dtStart'));
+        
+        editCalendarRecord(null, toISOTimestamp(dt));
     },
 
     splitEvent : function(record, params){
@@ -403,7 +406,10 @@
         forEach(events, function(e){
             var dt = toISODate(e.starts);
 
-            if (!(dt in containers)) return;
+            if (!(dt in containers)){
+                 e.style.display = 'none';
+                 return;
+            }
 
             var container = containers[dt];
 
@@ -724,7 +730,7 @@
 
         setNodeAttribute(elem, 'dtend', toISOTimestamp(e));
 
-        editCalendarRecord(null);
+        editCalendarRecord(null, toISOTimestamp(dt));
 
         hideElement('calEventNew');
     },

=== modified file 'addons/view_calendar/widgets/_base.py'
--- addons/view_calendar/widgets/_base.py	2010-03-08 11:44:48 +0000
+++ addons/view_calendar/widgets/_base.py	2010-06-03 10:51:23 +0000
@@ -332,7 +332,7 @@
             h = ends
 
             if ends == self.day_length:
-                n += 1
+                span = 1
 
             elif ends > self.day_length:
                 n = ends / self.day_length
@@ -340,9 +340,11 @@
 
                 n = int(math.floor(n))
 
-                if h > 0: n += 1
+                if h > 0:
+                    span = n + 1
+                else:
+                    span = n
 
-            span = n
             ends = time.localtime(time.mktime(starts) + (h * 60 * 60) + (n * 24 * 60 * 60))
 
         if starts and self.date_stop:

=== modified file 'addons/view_diagram/controllers/process.py'
--- addons/view_diagram/controllers/process.py	2010-05-14 05:23:53 +0000
+++ addons/view_diagram/controllers/process.py	2010-06-03 10:51:23 +0000
@@ -105,5 +105,10 @@
             node['res']['perm'] = update_perm(node['res']['perm'] or {})
 
         return graph
+    
+    @expose(template="templates/process_tip.mako")
+    def open_tip(self, **kw):
+        title_tip = kw.get('title_tip')
+        return dict(id=None, res_model=None, res_id=None, title=None, selection=None, title_tip=title_tip)
 
 # vim: ts=4 sts=4 sw=4 si et

=== added file 'addons/view_diagram/controllers/templates/process_tip.mako'
--- addons/view_diagram/controllers/templates/process_tip.mako	1970-01-01 00:00:00 +0000
+++ addons/view_diagram/controllers/templates/process_tip.mako	2010-06-03 10:51:23 +0000
@@ -0,0 +1,26 @@
+<%inherit file="master.mako"/>
+<%! show_header_footer = False %>
+
+<%def name="header()">
+    <title>${_("Process")}</title>
+</%def>
+
+<%def name="content()">
+<table class="view" cellspacing="5" border="0" width="100%">
+    <tr>
+        <td>
+            <div class="box2">
+                ${title_tip | n}
+            </div>
+        </td>
+    </tr>
+    <tr>
+        <td align="right">
+            <div class="box2">
+                <button type="button" onclick="window.close()">${_("Close")}</button>
+            </div>
+        </td>
+    </tr>
+</table>
+
+</%def>
\ No newline at end of file

=== modified file 'addons/view_diagram/static/javascript/process.js'
--- addons/view_diagram/static/javascript/process.js	2010-05-14 05:23:53 +0000
+++ addons/view_diagram/static/javascript/process.js	2010-06-03 10:51:23 +0000
@@ -260,7 +260,7 @@
         var bbar = openobject.dom.select('td.node-buttons', elem)[0];        
         var menu = openobject.dom.select('td.node-menu', elem)[0];
 
-        title.innerHTML = title.title = this.data.name || '';
+        title.innerHTML = this.data.name || '';
         text.innerHTML = this.data.notes || '';
 
         if (this.data.subflow && this.data.subflow.length) {
@@ -342,7 +342,7 @@
 
         this.setTargetDecorator(new openobject.process.TargetDecorator(color));
         this.setColor(color);
-        this.setLineWidth(2);
+        this.setLineWidth(3);
         this.setSelectable(false);
 
         this.data = data;
@@ -352,7 +352,8 @@
         var elem = this.getHTMLElement();
         elem.style.cursor = 'pointer';
         elem.title = this._makeTipText();
-
+        MochiKit.Signal.connect(elem, 'ondblclick', this, this._makeTipText);
+        
         if (roles.length) {
             var role_img = new draw2d.ImageFigure('/openerp/static/images/stock/stock_person.png');
             role_img.setDimension(32, 32);
@@ -389,8 +390,10 @@
         if (buttons.length) {
             title += '<span>Actions:</span>' + _mkList(buttons);
         }
-
-        return title;
+        
+        var params = {'title_tip': MochiKit.DOM.emitHTML(title)}
+        
+        openobject.tools.openWindow(openobject.http.getURL("/process/open_tip", params), {width: 450, height: 250});
     }
 });
 

=== modified file 'addons/view_graph/widgets/_graph.py'
--- addons/view_graph/widgets/_graph.py	2010-05-13 09:21:46 +0000
+++ addons/view_graph/widgets/_graph.py	2010-06-03 10:51:23 +0000
@@ -159,23 +159,29 @@
                     for i in fields[x]['selection']:
                         if value[x] in i:
                             res[x] = i[1]
-                elif fields[x]['type'] == 'date' and value[x]:
-                    date = time.strptime(value[x], DT_FORMAT)
-                    res[x] = time.strftime(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y'), date)
-                elif fields[x]['type'] == 'datetime' and value[x]:
-                    date = time.strptime(value[x], DHM_FORMAT)
-                    if 'tz' in rpc.session.context:
-                        try:
-                            import pytz
-                            lzone = pytz.timezone(rpc.session.context['tz'])
-                            szone = pytz.timezone(rpc.session.timezone)
-                            dt = DT.datetime(date[0], date[1], date[2], date[3], date[4], date[5], date[6])
-                            sdt = szone.localize(dt, is_dst=True)
-                            ldt = sdt.astimezone(lzone)
-                            date = ldt.timetuple()
-                        except:
-                            pass
-                    res[x] = time.strftime(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y')+' %H:%M:%S', date)
+                elif fields[x]['type'] == 'date':
+                    if value[x]:
+                        date = time.strptime(value[x], DT_FORMAT)
+                        res[x] = time.strftime(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y'), date)
+                    else:
+                        res[x] = ''
+                elif fields[x]['type'] == 'datetime':
+                    if value[x]:
+                        date = time.strptime(value[x], DHM_FORMAT)
+                        if 'tz' in rpc.session.context:
+                            try:
+                                import pytz
+                                lzone = pytz.timezone(rpc.session.context['tz'])
+                                szone = pytz.timezone(rpc.session.timezone)
+                                dt = DT.datetime(date[0], date[1], date[2], date[3], date[4], date[5], date[6])
+                                sdt = szone.localize(dt, is_dst=True)
+                                ldt = sdt.astimezone(lzone)
+                                date = ldt.timetuple()
+                            except:
+                                pass
+                        res[x] = time.strftime(locale.nl_langinfo(locale.D_FMT).replace('%y', '%Y')+' %H:%M:%S', date)
+                    else:
+                        res[x] = ''
                 else:
                     res[x] = float(value[x])
 

=== modified file 'addons/view_graph/widgets/templates/graph.mako'
--- addons/view_graph/widgets/templates/graph.mako	2010-02-04 12:34:58 +0000
+++ addons/view_graph/widgets/templates/graph.mako	2010-06-03 10:51:23 +0000
@@ -1,6 +1,6 @@
 <div class="graph-block" style="text-align: center; padding: 10px; min-width: $width">
 
-    <div id="${name}"></div>
+    <div id="${name}_"></div>
     
     <script type="text/javascript">
         var get_chart_${name} = function(name){

=== modified file 'addons/widget_wiki/widgets/wiki.py'
--- addons/widget_wiki/widgets/wiki.py	2010-05-14 05:23:53 +0000
+++ addons/widget_wiki/widgets/wiki.py	2010-06-03 10:51:23 +0000
@@ -175,8 +175,8 @@
         proxy = rpc.RPCProxy('wiki.wiki')
         def link(path):
             link = path.group().replace('[','').replace('[','').replace(']','').replace(']','').split("|")
-
-            mids = proxy.search([('name','ilike',link[0])])
+            name_to_search = link[0].strip()
+            mids = proxy.search([('name','ilike', name_to_search)])
             link_str = ""
             if mids:
                if len(link) == 2:


Follow ups