openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #00050
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