diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py
index d0798614e67..b1b140159c1 100644
--- a/bin/addons/__init__.py
+++ b/bin/addons/__init__.py
@@ -306,7 +306,7 @@ def load_information_from_description_file(module):
if os.path.isfile(description_file):
return eval(tools.file_open(description_file).read())
- #TODO: refactor the logger in this file to follow the logging guidelines
+ #TODO: refactor the logger in this file to follow the logging guidelines
# for 6.0
logging.getLogger('addons').debug('The module %s does not contain a description file:'\
'__openerp__.py or __terp__.py (deprecated)', module)
@@ -595,14 +595,14 @@ class MigrationManager(object):
log = logging.getLogger('init')
def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
-
+
def process_sql_file(cr, file):
queries = fp.read().split(';')
for query in queries:
new_query = ' '.join(query.split())
if new_query:
cr.execute(new_query)
-
+
def load_init_update_xml(cr, m, idref, mode, kind):
for filename in package.data.get('%s_xml' % kind, []):
logger.notifyChannel('init', netsvc.LOG_INFO, 'module %s: loading %s' % (m, filename))
@@ -631,20 +631,20 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
else:
tools.convert_xml_import(cr, m, fp, idref, mode=mode, noupdate=True, **kwargs)
fp.close()
-
+
def load_data(cr, module_name, id_map, mode):
_load_data(cr, module_name, id_map, mode, 'data')
-
+
def load_demo(cr, module_name, id_map, mode):
_load_data(cr, module_name, id_map, mode, 'demo')
-
+
def load_test(cr, module_name, id_map, mode):
cr.commit()
try:
_load_data(cr, module_name, id_map, mode, 'test')
finally:
cr.rollback()
-
+
def _load_data(cr, module_name, id_map, mode, kind):
noupdate = (kind == 'demo')
for filename in package.data.get(kind, []):
@@ -660,7 +660,7 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
else:
tools.convert_xml_import(cr, module_name, file, id_map, mode, noupdate)
file.close()
-
+
# **kwargs is passed directly to convert_xml_import
if not status:
status = {}
@@ -722,10 +722,11 @@ def load_module_graph(cr, graph, status=None, perform_checks=True, **kwargs):
if hasattr(package, 'demo') or (package.dbdemo and package.state != 'installed'):
status['progress'] = (float(statusi)+0.75) / len(graph)
load_demo_xml(cr, m, idref, mode)
- load_demo(cr, m, idref, mode)
+ load_demo(cr, m, idref, mode)
cr.execute('update ir_module_module set demo=%s where id=%s', (True, mid))
- load_test(cr, m, idref, mode)
-
+
+ load_test(cr, m, idref, mode)
+
package_todo.append(package.name)
migrations.migrate_module(package, 'post')
diff --git a/bin/addons/base/ir/ir_ui_view.py b/bin/addons/base/ir/ir_ui_view.py
index f7264ac78c0..b04343e821f 100644
--- a/bin/addons/base/ir/ir_ui_view.py
+++ b/bin/addons/base/ir/ir_ui_view.py
@@ -115,13 +115,15 @@ class view(osv.osv):
return super(view, self).write(cr, uid, ids, vals, context)
- def graph_get(self, cr, uid, id, model, node_obj, conn_obj, src_node, des_node,signal,scale,context={}):
+ def graph_get(self, cr, uid, id, model, node_obj, conn_obj, src_node, des_node,label,scale,context={}):
+ if not label:
+ label = []
nodes=[]
nodes_name=[]
transitions=[]
start=[]
tres={}
- sig={}
+ labels={}
no_ancester=[]
blank_nodes = []
@@ -160,9 +162,14 @@ class view(osv.osv):
for t in _Arrow_Obj.read(cr,uid, a[_Destination_Field],[]):
transitions.append((a['id'], t[des_node][0]))
tres[str(t['id'])] = (a['id'],t[des_node][0])
- if t.has_key(str(signal)) and str(t[signal])=='False':
- t[signal]=' '
- sig[str(t['id'])] = (a['id'],t.get(signal,' '))
+ label_string = ""
+ if label:
+ for lbl in eval(label):
+ if t.has_key(str(lbl)) and str(t[lbl])=='False':
+ label_string = label_string + ' '
+ else:
+ label_string = label_string + " " + t[lbl]
+ labels[str(t['id'])] = (a['id'],label_string)
g = graph(nodes, transitions, no_ancester)
g.process(start)
g.scale(*scale)
@@ -171,7 +178,7 @@ class view(osv.osv):
for node in nodes_name:
results[str(node[0])] = result[node[0]]
results[str(node[0])]['name'] = node[1]
- return {'nodes': results, 'transitions': tres, 'signal' : sig, 'blank_nodes': blank_nodes}
+ return {'nodes': results, 'transitions': tres, 'label' : labels, 'blank_nodes': blank_nodes}
view()
class view_sc(osv.osv):
diff --git a/bin/addons/base/ir/workflow/workflow_view.xml b/bin/addons/base/ir/workflow/workflow_view.xml
index 04457f21338..f6bfc0096f1 100644
--- a/bin/addons/base/ir/workflow/workflow_view.xml
+++ b/bin/addons/base/ir/workflow/workflow_view.xml
@@ -30,11 +30,15 @@
diagram
-
+
+
+
+
+
-
+
diff --git a/bin/addons/base/report/custom_new.xsl b/bin/addons/base/report/custom_new.xsl
index dea86903a72..98fba709682 100644
--- a/bin/addons/base/report/custom_new.xsl
+++ b/bin/addons/base/report/custom_new.xsl
@@ -114,14 +114,14 @@
-
+
-
+
diff --git a/bin/addons/base/res/partner/partner_view.xml b/bin/addons/base/res/partner/partner_view.xml
index 90d3ef1a483..38dbeb34bc8 100644
--- a/bin/addons/base/res/partner/partner_view.xml
+++ b/bin/addons/base/res/partner/partner_view.xml
@@ -348,7 +348,7 @@
-
+
@@ -391,7 +391,7 @@
ir.actions.act_window
res.partner
form
- []
+ [('customer','=',1)]
{'default_customer':1}
@@ -401,7 +401,7 @@
ir.actions.act_window
res.partner
form
- []
+ [('supplier','=',1)]
{'default_customer':0, 'default_supplier':1}
diff --git a/bin/addons/base/rng/view.rng b/bin/addons/base/rng/view.rng
index d3c533ab0bf..2979c739764 100644
--- a/bin/addons/base/rng/view.rng
+++ b/bin/addons/base/rng/view.rng
@@ -48,6 +48,7 @@
+
@@ -61,7 +62,8 @@
-
+
+
@@ -552,7 +554,6 @@
-
diff --git a/bin/addons/base/security/ir.model.access.csv b/bin/addons/base/security/ir.model.access.csv
index 1d772991e76..bc291af8b33 100644
--- a/bin/addons/base/security/ir.model.access.csv
+++ b/bin/addons/base/security/ir.model.access.csv
@@ -29,7 +29,7 @@
"access_ir_sequence_group_user","ir_sequence group_user","model_ir_sequence",,1,1,1,1
"access_ir_sequence_type_group_user","ir_sequence_type group_user","model_ir_sequence_type",,1,0,0,0
"access_ir_translation_group_system","ir_translation group_system","model_ir_translation",,1,1,1,1
-"access_ir_ui_menu_group_user","ir_ui_menu group_user","model_ir_ui_menu",,1,0,0,0
+"access_ir_ui_menu_group_user","ir_ui_menu group_user","model_ir_ui_menu",,1,0,1,0
"access_ir_ui_menu_group_system","ir_ui_menu group_system","model_ir_ui_menu","group_system",1,1,1,1
"access_ir_ui_view_group_user","ir_ui_view group_user","model_ir_ui_view",,1,0,0,0
"access_ir_ui_view_group_system","ir_ui_view group_system","model_ir_ui_view","group_system",1,1,1,1
@@ -37,7 +37,7 @@
"access_ir_ui_view_custom_group_system","ir_ui_view_custom_group_system","model_ir_ui_view_custom","group_system",1,1,1,1
"access_ir_ui_view_sc_group_user","ir_ui_view_sc group_user","model_ir_ui_view_sc",,1,1,1,1
"access_ir_values_group_erp_manager","ir_values group_erp_manager","model_ir_values","group_erp_manager",1,1,1,1
-"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,0,0,0
+"access_ir_values_group_all","ir_values group_all","model_ir_values",,1,0,1,0
"access_wizard_ir_model_menu_create_group_system","wizard_ir_model_menu_create group_system","model_wizard_ir_model_menu_create","group_system",1,1,1,1
"access_wizard_ir_model_menu_create_line_group_system","wizard_ir_model_menu_create_line group_system","model_wizard_ir_model_menu_create_line","group_system",1,1,1,1
"access_wizard_module_lang_export_group_system","wizard_module_lang_export group_system","model_wizard_module_lang_export","group_system",1,1,1,1
@@ -89,7 +89,7 @@
"access_res_users_group_erp_manager","res_users group_erp_manager","model_res_users","group_erp_manager",1,1,1,1
"access_ir_actions_all","ir_actions_all","model_ir_actions_actions",,1,0,0,0
"access_ir_actions_group_system","ir_actions_group_system","model_ir_actions_actions","group_system",1,1,1,1
-"access_ir_actions_act_window_all","ir_actions_act_window_all","model_ir_actions_act_window",,1,0,0,0
+"access_ir_actions_act_window_all","ir_actions_act_window_all","model_ir_actions_act_window",,1,0,1,0
"access_ir_actions_act_window_system","ir_actions_act_window_system","model_ir_actions_act_window","group_system",1,1,1,1
"access_ir_actions_act_window_close_all","ir_actions_act_window_close_all","model_ir_actions_act_window_close",,1,0,0,0
"access_ir_actions_act_window_close_group_system","ir_actions_act_window_close_group_system","model_ir_actions_act_window_close","group_system",1,1,1,1
diff --git a/bin/osv/fields.py b/bin/osv/fields.py
index 93b318efbcf..35ff1667418 100644
--- a/bin/osv/fields.py
+++ b/bin/osv/fields.py
@@ -81,7 +81,6 @@ class _column(object):
self.select = select
self.selectable = True
self.group_operator = args.get('group_operator', False)
- self.parent_field = args.get('parent_field', False)
for a in args:
if args[a]:
setattr(self, a, args[a])
@@ -367,7 +366,6 @@ class one2many(_column):
_type = 'one2many'
def __init__(self, obj, fields_id, string='unknown', limit=None, **args):
- args.update({'parent_field':fields_id})
_column.__init__(self, string=string, **args)
self._obj = obj
self._fields_id = fields_id
diff --git a/bin/osv/orm.py b/bin/osv/orm.py
index 9cfec27ee62..1b8e7a83a16 100644
--- a/bin/osv/orm.py
+++ b/bin/osv/orm.py
@@ -1072,7 +1072,7 @@ class orm_template(object):
continue
res[f] = {'type': self._columns[f]._type}
for arg in ('string', 'readonly', 'states', 'size', 'required', 'group_operator',
- 'change_default', 'translate', 'help', 'select', 'selectable','parent_field'):
+ 'change_default', 'translate', 'help', 'select', 'selectable'):
if getattr(self._columns[f], arg):
res[f][arg] = getattr(self._columns[f], arg)
if not read_access:
@@ -1134,7 +1134,31 @@ class orm_template(object):
fields = {}
childs = True
- if node.tag == 'field':
+ def encode(s):
+ if isinstance(s, unicode):
+ return s.encode('utf8')
+ return s
+
+ if node.tag in ('field', 'node', 'arrow'):
+ if node.get('object'):
+ attrs = {}
+ views = {}
+ xml = ""
+ new_xml = etree.fromstring(encode(xml))
+ ctx = context.copy()
+ ctx['base_model_name'] = self._name
+ xarch, xfields = self.pool.get(node.get('object',False)).__view_look_dom_arch(cr, user, new_xml, view_id, ctx)
+ views[str(f.tag)] = {
+ 'arch': xarch,
+ 'fields': xfields
+ }
+ attrs = {'views': views}
+ view = False
+ fields = views.get('field',False) and views['field'].get('fields',False)
if node.get('name'):
attrs = {}
try:
@@ -1167,7 +1191,7 @@ class orm_template(object):
dom = column._domain
dom += eval(node.get('domain','[]'), {'uid':user, 'time':time})
context.update(eval(node.get('context','{}')))
- attrs['selection'] = self.pool.get(relation).name_search(cr, user, '', dom, context=context)
+ attrs['selection'] = self.pool.get(relation).name_search(cr, user, '', dom, context=context,limit=None)
if (node.get('required') and not int(node.get('required'))) or not column.required:
attrs['selection'].append((False,''))
fields[node.get('name')] = attrs
@@ -1253,7 +1277,6 @@ class orm_template(object):
arch = etree.tostring(node, encoding="utf-8").replace('\t', '')
- #code for diagram view.
fields={}
if node.tag=='diagram':
if node.getchildren()[0].tag=='node':
@@ -1266,7 +1289,6 @@ class orm_template(object):
fields[key]=value
else:
fields = self.fields_get(cr, user, fields_def.keys(), context)
-
for field in fields_def:
if field == 'id':
# sometime, the view may containt the (invisible) field 'id' needed for a domain (when 2 objects have cross references)
diff --git a/bin/report/printscreen/ps_list.py b/bin/report/printscreen/ps_list.py
index b3932588cdd..0dea67382fe 100644
--- a/bin/report/printscreen/ps_list.py
+++ b/bin/report/printscreen/ps_list.py
@@ -27,19 +27,24 @@ from report import render
import locale
import time, os
+from operator import itemgetter
from datetime import datetime
class report_printscreen_list(report_int):
def __init__(self, name):
report_int.__init__(self, name)
self.context = {}
+ self.groupby = []
def _parse_node(self, root_node):
result = []
for node in root_node:
+ field_name = node.get('name')
if not eval(str(node.attrib.get('invisible',False)),{'context':self.context}):
if node.tag == 'field':
- result.append(node.get('name'))
+ if field_name in self.groupby:
+ continue
+ result.append(field_name)
else:
result.extend(self._parse_node(node))
return result
@@ -55,6 +60,7 @@ class report_printscreen_list(report_int):
if not context:
context={}
self.context = context
+ self.groupby = context.get('group_by',[])
pool = pooler.get_pool(cr.dbname)
model = pool.get(datas['model'])
model_id = pool.get('ir.model').search(cr, uid, [('model','=',model._name)])
@@ -64,35 +70,37 @@ class report_printscreen_list(report_int):
else:
model_desc = model._description
self.title = model_desc
-
datas['ids'] = ids
model = pooler.get_pool(cr.dbname).get(datas['model'])
result = model.fields_view_get(cr, uid, view_type='tree', context=context)
- fields_order = self._parse_string(result['arch'])
- rows = model.read(cr, uid, datas['ids'], result['fields'].keys(), context)
- ids2 = [x['id'] for x in rows] # getting the ids from read result
- if datas['ids'] != ids2: # sorted ids were not taken into consideration for print screen
- rows_new = []
- for id in datas['ids']:
- element = [elem for elem in rows if elem['id']==id]
- rows_new.append(element[0])
- rows = rows_new
- if context.get('group_by',False):
- if context['group_by'] in fields_order:
- fields_order.remove(context['group_by'])
- fields_order.insert(0, context['group_by'])
- re = model.read_group(cr, uid, [('id','in',ids)], fields_order, context.get('group_by',False),0,None,context)
- rows=[]
- for r in re:
- for f in fields_order:
- if f not in r:
- r.update({f:False})
- r['__group']=True
- rows.append(r)
- _ids = model.search(cr, uid, r['__domain'])
- res=model.read(cr, uid, _ids, result['fields'].keys(), context)
- for r in res:
- rows.append(r)
+ fields_order = self.groupby + self._parse_string(result['arch'])
+ if self.groupby:
+ rows = []
+ def get_groupby_data(groupby = [], domain = []):
+ records = model.read_group(cr, uid, domain, fields_order, groupby , 0, None, context)
+ for rec in records:
+ rec['__group'] = True
+ for f in fields_order:
+ if f not in rec:
+ rec.update({f:False})
+ rows.append(rec)
+ groupby = (rec.get('__context', {})).get('group_by',[])
+ domain = rec.get('__domain', [])
+ if groupby:
+ get_groupby_data(groupby, domain)
+ else:
+ child_ids = model.search(cr, uid, domain)
+ res = model.read(cr, uid, child_ids, result['fields'].keys(), context)
+ rows.extend(res)
+ get_groupby_data(self.groupby, [('id','in',ids)])
+ else:
+ rows = model.read(cr, uid, datas['ids'], result['fields'].keys(), context)
+ ids2 = map(itemgetter('id'), rows) # getting the ids from read result
+ if datas['ids'] != ids2: # sorted ids were not taken into consideration for print screen
+ rows_new = []
+ for id in datas['ids']:
+ rows_new += [elem for elem in rows if elem['id'] == id]
+ rows = rows_new
res = self._create_table(uid, datas['ids'], result['fields'], fields_order, rows, context, model_desc)
return (self.obj.get(), 'pdf')
@@ -116,13 +124,14 @@ class report_printscreen_list(report_int):
l = []
t = 0
- rowcount=0;
+ rowcount = 0;
strmax = (pageSize[0]-40) * 2.8346
temp = []
+ tsum = []
count = len(fields_order)
for i in range(0, count):
temp.append(0)
-
+ tsum.append(0)
ince = -1;
for f in fields_order:
s = 0
@@ -131,7 +140,7 @@ class report_printscreen_list(report_int):
s = 60
strmax -= s
if fields[f]['type'] in ('float','integer'):
- temp[ince]=1;
+ temp[ince] = 1
else:
t += fields[f].get('size', 80) / 28 + 1
@@ -149,10 +158,6 @@ class report_printscreen_list(report_int):
field.text = tools.ustr(fields[f]['string'] or '')
lines = etree.SubElement(new_doc, 'lines')
- tsum = []
- count = len(fields_order)
- for i in range(0,count):
- tsum.append(0)
for line in results:
node_line = etree.SubElement(lines, 'row')
count = -1
@@ -212,9 +217,8 @@ class report_printscreen_list(report_int):
tsum[count] = float(tsum[count]) + float(line[f]);
else:
col.text = '/'
-
node_line = etree.SubElement(lines, 'row')
- for f in range(0,count+1):
+ for f in range(0, count+1):
col = etree.SubElement(node_line, 'col', para='group', tree='no')
if tsum[f] != None:
if tsum[f] >= 0.01 :