diff --git a/bin/addons/base/base_data.xml b/bin/addons/base/base_data.xml
index 9597ac83f92..b4340e3faf0 100644
--- a/bin/addons/base/base_data.xml
+++ b/bin/addons/base/base_data.xml
@@ -1052,6 +1052,7 @@
Administrator
+
diff --git a/bin/addons/base/base_menu.xml b/bin/addons/base/base_menu.xml
index 5da97026e48..830ead09f6f 100644
--- a/bin/addons/base/base_menu.xml
+++ b/bin/addons/base/base_menu.xml
@@ -5,24 +5,24 @@
-
+ groups="base.group_no_one"/>
+
-
+
+ groups="base.group_extended" parent="base.menu_translation" sequence="3"/>
-
-
+
diff --git a/bin/addons/base/base_update.xml b/bin/addons/base/base_update.xml
index 4218d6ce278..7f6cb5e58df 100644
--- a/bin/addons/base/base_update.xml
+++ b/bin/addons/base/base_update.xml
@@ -114,21 +114,30 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -142,7 +151,7 @@
-
+
@@ -157,8 +166,8 @@
-
-
+
+
@@ -172,7 +181,7 @@
-
+
diff --git a/bin/addons/base/ir/__init__.py b/bin/addons/base/ir/__init__.py
index 01e33494717..343b50a6998 100644
--- a/bin/addons/base/ir/__init__.py
+++ b/bin/addons/base/ir/__init__.py
@@ -25,7 +25,6 @@ import ir_ui_menu
import ir_ui_view
import ir_default
import ir_actions
-import ir_report_custom
import ir_attachment
import ir_cron
import ir_filters
diff --git a/bin/addons/base/ir/ir.xml b/bin/addons/base/ir/ir.xml
index e76af79ea01..8d35e469bd8 100644
--- a/bin/addons/base/ir/ir.xml
+++ b/bin/addons/base/ir/ir.xml
@@ -10,17 +10,41 @@
20
+
+
+
@@ -47,12 +71,17 @@
+
+
+
+
+
- Client Actions
+ Client Events
ir.actions.act_window
ir.values
form
@@ -63,20 +92,20 @@
-
- tree
-
-
-
+
+ tree
+
+
+
+
+
+
+ form
+
+
+
-
-
- form
-
-
-
-
@@ -254,7 +283,7 @@
- Sequence Types
+ Sequence Codes
ir.actions.act_window
ir.sequence.type
form
@@ -310,8 +339,9 @@
-
+
+
@@ -321,10 +351,10 @@
form
@@ -389,72 +420,18 @@
-
-
- ir.actions.report.custom
- ir.actions.report.custom
- form
-
-
-
-
-
- ir.actions.report.custom.tree
- ir.actions.report.custom
- tree
-
-
-
-
-
-
-
-
- ir.actions.report.custom.search
- ir.actions.report.custom
- search
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Report Custom
- ir.actions.act_window
- ir.actions.report.custom
- form
-
-
-
-
-
ir.actions.report.xml
ir.actions.report.xml
form
-
- Report Xml
+ Reports
ir.actions.act_window
ir.actions.report.xml
form
@@ -600,8 +577,6 @@
-
-
@@ -668,10 +643,14 @@
form
-
- Roles Structure
- ir.actions.act_window
- res.roles
- tree
-
-
-
-
-
+
Roles
ir.actions.act_window
res.roles
form
-
+
@@ -857,21 +830,25 @@
form
@@ -898,6 +875,18 @@
search
+
+
+
+
+
+
@@ -905,7 +894,7 @@
-
+
@@ -927,14 +916,12 @@
form
-
-
- ir.report.custom.fields.tree
- ir.report.custom.fields
- tree
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ir.report.custom.fields
- ir.report.custom.fields
- form
-
-
-
-
-
-
- ir.report.custom
- ir.report.custom
- form
-
-
-
-
-
- Custom Report
- ir.actions.act_window
- ir.report.custom
- tree
-
-
-
-
-
ir.model.form
@@ -1155,7 +1050,7 @@
-
+
@@ -1208,12 +1103,26 @@
search
+
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
@@ -1225,12 +1134,12 @@
form
@@ -1434,7 +1363,7 @@
form
-
+
@@ -1741,9 +1687,21 @@
search
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1866,13 +1824,13 @@
-
-
-
-
+
+
+
+
-
+
@@ -1888,15 +1846,7 @@
{'key':'server_action'}
-
-
-
- Access Controls Grid
- ir.model.grid
- form
- tree,form
-
-
+
ir.actions.todo
@@ -1908,8 +1858,10 @@
-
-
+
+
@@ -1929,8 +1881,10 @@
-
-
+
+
@@ -1942,8 +1896,8 @@
search
-
-
+
+
@@ -1960,6 +1914,5 @@
-
diff --git a/bin/addons/base/ir/ir_actions.py b/bin/addons/base/ir/ir_actions.py
index 27704687f93..074bfa04f85 100644
--- a/bin/addons/base/ir/ir_actions.py
+++ b/bin/addons/base/ir/ir_actions.py
@@ -37,7 +37,7 @@ class actions(osv.osv):
_table = 'ir_actions'
_columns = {
'name': fields.char('Action Name', required=True, size=64),
- 'type': fields.char('Action Type', required=True, size=32),
+ 'type': fields.char('Action Type', required=True, size=32,readonly=True),
'usage': fields.char('Action Usage', size=32),
}
_defaults = {
@@ -45,23 +45,6 @@ class actions(osv.osv):
}
actions()
-class report_custom(osv.osv):
- _name = 'ir.actions.report.custom'
- _table = 'ir_act_report_custom'
- _sequence = 'ir_actions_id_seq'
- _columns = {
- 'name': fields.char('Report Name', size=64, required=True, translate=True),
- 'type': fields.char('Report Type', size=32, required=True),
- 'model':fields.char('Object', size=64, required=True),
- 'report_id': fields.integer('Report Ref.', required=True),
- 'usage': fields.char('Action Usage', size=32),
- 'multi': fields.boolean('On multiple doc.', help="If set to true, the action will not be displayed on the right toolbar of a form view.")
- }
- _defaults = {
- 'multi': lambda *a: False,
- 'type': lambda *a: 'ir.actions.report.custom',
- }
-report_custom()
class report_xml(osv.osv):
@@ -259,7 +242,6 @@ class act_window(osv.osv):
'search_view_id': fields.many2one('ir.ui.view', 'Search View Ref.'),
'filter': fields.boolean('Filter'),
'auto_search':fields.boolean('Auto Search'),
- 'default_user_ids': fields.many2many('res.users', 'ir_act_window_user_rel', 'act_id', 'uid', 'Users'),
'search_view' : fields.function(_search_view, type='text', method=True, string='Search View'),
'menus': fields.char('Menus', size=4096),
'help': fields.text('Action description',
diff --git a/bin/addons/base/ir/ir_cron.py b/bin/addons/base/ir/ir_cron.py
index 33962c557c4..06121533922 100644
--- a/bin/addons/base/ir/ir_cron.py
+++ b/bin/addons/base/ir/ir_cron.py
@@ -47,15 +47,15 @@ class ir_cron(osv.osv, netsvc.Agent):
'name': fields.char('Name', size=60, required=True),
'user_id': fields.many2one('res.users', 'User', required=True),
'active': fields.boolean('Active'),
- 'interval_number': fields.integer('Interval Number'),
+ 'interval_number': fields.integer('Interval Number',help="Repeat every x."),
'interval_type': fields.selection( [('minutes', 'Minutes'),
('hours', 'Hours'), ('work_days','Work Days'), ('days', 'Days'),('weeks', 'Weeks'), ('months', 'Months')], 'Interval Unit'),
- 'numbercall': fields.integer('Number of Calls', help='Number of time the function is called,\na negative number indicates that the function will always be called'),
- 'doall' : fields.boolean('Repeat Missed'),
- 'nextcall' : fields.datetime('Next Call Date', required=True),
- 'model': fields.char('Object', size=64),
- 'function': fields.char('Function', size=64),
- 'args': fields.text('Arguments'),
+ 'numbercall': fields.integer('Number of Calls', help='Number of time the function is called,\na negative number indicates no limit'),
+ 'doall' : fields.boolean('Repeat Missed', help="Enable this if you want to execute missed occurences as soon as the server restarts."),
+ 'nextcall' : fields.datetime('Next Execution Date', required=True, help="Next planned execution date for this scheduler"),
+ 'model': fields.char('Object', size=64, help="Name of object whose function will be called when this scheduler will run. e.g. 'res.partener'"),
+ 'function': fields.char('Function', size=64, help="Name of the method to be called on the object when this scheduler is executed."),
+ 'args': fields.text('Arguments', help="Arguments to be passed to the method. e.g. (uid,)"),
'priority': fields.integer('Priority', help='0=Very Urgent\n10=Not urgent')
}
diff --git a/bin/addons/base/ir/ir_filters.py b/bin/addons/base/ir/ir_filters.py
index 2821d0c94b7..8f9869a6922 100644
--- a/bin/addons/base/ir/ir_filters.py
+++ b/bin/addons/base/ir/ir_filters.py
@@ -42,7 +42,7 @@ class ir_filters(osv.osv):
'user_id':fields.many2one('res.users', 'User', help='False means for every user'),
'domain': fields.text('Domain Value', required=True),
'context': fields.text('Context Value', required=True),
- 'model_id': fields.selection(_list_all_models, 'Model', required=True),
+ 'model_id': fields.selection(_list_all_models, 'Object', required=True),
}
ir_filters()
diff --git a/bin/addons/base/ir/ir_model.py b/bin/addons/base/ir/ir_model.py
index 69a9e2990c5..5410cba10a6 100644
--- a/bin/addons/base/ir/ir_model.py
+++ b/bin/addons/base/ir/ir_model.py
@@ -63,6 +63,7 @@ class ir_model(osv.osv):
is_osv_mem = self._is_osv_memory(cr, uid, all_model_ids, 'osv_memory', arg=None, context=context)
return [('id', 'in', [id for id in is_osv_mem if bool(is_osv_mem[id]) == value])]
+
_columns = {
'name': fields.char('Object Name', size=64, translate=True, required=True),
'model': fields.char('Object', size=64, required=True, select=1),
@@ -142,103 +143,6 @@ class ir_model(osv.osv):
x_custom_model._rec_name = x_name
ir_model()
-
-class ir_model_grid(osv.osv):
- _name = 'ir.model.grid'
- _table = 'ir_model'
- _inherit = 'ir.model'
- _description = "Objects Security Grid"
-
- def create(self, cr, uid, vals, context=None):
- raise osv.except_osv('Error !', 'You cannot add an entry to this view !')
-
- def unlink(self, *args, **argv):
- raise osv.except_osv('Error !', 'You cannot delete an entry of this view !')
-
- def read(self, cr, uid, ids, fields=None, context=None, load='_classic_read'):
- result = super(osv.osv, self).read(cr, uid, ids, fields, context, load)
- allgr = self.pool.get('res.groups').search(cr, uid, [], context=context)
- acc_obj = self.pool.get('ir.model.access')
-
- if not isinstance(result,list):
- result=[result]
-
- for res in result:
- rules = acc_obj.search(cr, uid, [('model_id', '=', res['id'])])
- rules_br = acc_obj.browse(cr, uid, rules, context=context)
- for g in allgr:
- res['group_'+str(g)] = ''
- for rule in rules_br:
- perm_list = []
- if rule.perm_read:
- perm_list.append('r')
- if rule.perm_write:
- perm_list.append('w')
- if rule.perm_create:
- perm_list.append('c')
- if rule.perm_unlink:
- perm_list.append('u')
- perms = ",".join(perm_list)
- if rule.group_id:
- res['group_%d'%rule.group_id.id] = perms
- else:
- res['group_0'] = perms
- return result
-
- #
- # This function do not write fields from ir.model because
- # access rights may be different for managing models and
- # access rights
- #
- def write(self, cr, uid, ids, vals, context=None):
- vals_new = vals.copy()
- acc_obj = self.pool.get('ir.model.access')
- for grid in self.browse(cr, uid, ids, context=context):
- model_id = grid.id
- perms_rel = ['read','write','create','unlink']
- for val in vals:
- if not val[:6]=='group_':
- continue
- group_id = int(val[6:]) or False
- rules = acc_obj.search(cr, uid, [('model_id', '=', model_id),('group_id', '=', group_id)])
- if not rules:
- rules = [acc_obj.create(cr, uid, {
- 'name': grid.name,
- 'model_id':model_id,
- 'group_id':group_id
- }) ]
- vals2 = dict(map(lambda x: ('perm_'+x, x[0] in (vals[val] or '')), perms_rel))
- acc_obj.write(cr, uid, rules, vals2, context=context)
- return True
-
- def fields_get(self, cr, uid, fields=None, context=None):
- result = super(ir_model_grid, self).fields_get(cr, uid, fields, context)
- groups = self.pool.get('res.groups').search(cr, uid, [])
- groups_br = self.pool.get('res.groups').browse(cr, uid, groups)
- result['group_0'] = {'string': 'All Users','type': 'char','size': 7}
- for group in groups_br:
- result['group_%d'%group.id] = {'string': '%s'%group.name,'type': 'char','size': 7}
- return result
-
- def fields_view_get(self, cr, uid, view_id=None, view_type='form', context={}, toolbar=False, submenu=False):
- result = super(ir_model_grid, self).fields_view_get(cr, uid, view_id, view_type, context=context, toolbar=toolbar, submenu=submenu)
- groups = self.pool.get('res.groups').search(cr, uid, [])
- groups_br = self.pool.get('res.groups').browse(cr, uid, groups)
- cols = ['model', 'name']
- xml = '''
-<%s editable="bottom">
-
-
-
- ''' % (view_type,)
- for group in groups_br:
- xml += '''''' % (group.id, )
- xml += '''%s>''' % (view_type,)
- result['arch'] = xml
- result['fields'] = self.fields_get(cr, uid, cols, context)
- return result
-ir_model_grid()
-
class ir_model_fields(osv.osv):
_name = 'ir.model.fields'
_description = "Fields"
@@ -327,7 +231,7 @@ class ir_model_access(osv.osv):
'perm_read': fields.boolean('Read Access'),
'perm_write': fields.boolean('Write Access'),
'perm_create': fields.boolean('Create Access'),
- 'perm_unlink': fields.boolean('Delete Permission'),
+ 'perm_unlink': fields.boolean('Delete Access'),
}
def check_groups(self, cr, uid, group):
diff --git a/bin/addons/base/ir/ir_report_custom.py b/bin/addons/base/ir/ir_report_custom.py
deleted file mode 100644
index 3c7daa09d34..00000000000
--- a/bin/addons/base/ir/ir_report_custom.py
+++ /dev/null
@@ -1,206 +0,0 @@
-# -*- coding: utf-8 -*-
-##############################################################################
-#
-# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2009 Tiny SPRL ().
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Affero General Public License as
-# published by the Free Software Foundation, either version 3 of the
-# License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU Affero General Public License for more details.
-#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see .
-#
-##############################################################################
-
-from osv import fields,osv
-from osv.orm import browse_null
-import ir
-import report.custom
-from tools.translate import _
-from tools.safe_eval import safe_eval as eval
-import netsvc
-
-class report_custom(osv.osv):
- _name = 'ir.report.custom'
- _columns = {
- 'name': fields.char('Report Name', size=64, required=True, translate=True),
- 'model_id': fields.many2one('ir.model','Object', required=True, change_default=True),
- 'type': fields.selection([('table','Tabular'),('pie','Pie Chart'),('bar','Bar Chart'),('line','Line Plot')], "Report Type", size=64, required='True'),
- 'title': fields.char("Report Title", size=64, required='True', translate=True),
- 'print_format': fields.selection((('A4','a4'),('A5','a5')), 'Print format', required=True),
- 'print_orientation': fields.selection((('landscape','Landscape'),('portrait','Portrait')), 'Print orientation', required=True, size=16),
- 'repeat_header': fields.boolean('Repeat Header'),
- 'footer': fields.char('Report Footer', size=64, required=True),
- 'sortby': fields.char('Sorted By', size=64),
- 'fields_child0': fields.one2many('ir.report.custom.fields', 'report_id','Fields', required=True),
- 'field_parent': fields.many2one('ir.model.fields','Child Field'),
- 'state': fields.selection([('unsubscribed','Unsubscribed'),('subscribed','Subscribed')], 'State', size=64),
- 'frequency': fields.selection([('Y','Yearly'),('M','Monthly'),('D','Daily')], 'Frequency', size=64),
- 'limitt': fields.char('Limit', size=9),
- 'menu_id': fields.many2one('ir.ui.menu', 'Menu')
- }
- _defaults = {
- 'print_format': lambda *a: 'A4',
- 'print_orientation': lambda *a: 'portrait',
- 'state': lambda *a: 'unsubscribed',
- 'type': lambda *a: 'table',
- 'footer': lambda *a: 'Generated by OpenERP'
- }
-
- def onchange_model_id(self, cr, uid, ids, model_id):
- if not(model_id):
- return {}
- return {'domain': {'field_parent': [('model_id','=',model_id)]}}
-
- def unsubscribe(self, cr, uid, ids, context={}):
-#TODO: should delete the ir.actions.report.custom for these reports and do an ir_del
- self.write(cr, uid, ids, {'state':'unsubscribed'})
- return True
-
- def subscribe(self, cr, uid, ids, context={}):
- for report in self.browse(cr, uid, ids):
- report.fields_child0.sort(lambda x,y : x.sequence - y.sequence)
-
- # required on field0 does not seem to work( cause we use o2m_l ?)
- if not report.fields_child0:
- raise osv.except_osv(_('Invalid operation'), _('Enter at least one field !'))
-
- if report.type in ['pie', 'bar', 'line'] and report.field_parent:
- raise osv.except_osv(_('Invalid operation'), _('Tree can only be used in tabular reports'))
-
- # Otherwise it won't build a good tree. See level.pop in custom.py.
- if report.type == 'table' and report.field_parent and report.fields_child0 and not report.fields_child0[0].groupby:
- raise osv.except_osv('Invalid operation :', 'When creating tree (field child) report, data must be group by the first field')
-
- if report.type == 'pie':
- if len(report.fields_child0) != 2:
- raise osv.except_osv(_('Invalid operation'), _('Pie charts need exactly two fields'))
- else:
- c_f = {}
- for i in range(2):
- c_f[i] = []
- tmp = report.fields_child0[i]
- for j in range(3):
- c_f[i].append((not isinstance(eval('tmp.field_child'+str(j),{},{'tmp':tmp}), browse_null) and eval('tmp.field_child'+str(j)+'.ttype',{},{'tmp':tmp})) or None)
- if not reduce(lambda x,y : x or y, map(lambda x: x in ['integer', 'float'], c_f[1])):
- raise osv.except_osv(_('Invalid operation'), _('Second field should be figures'))
-
- if report.type == 'bar':
- if len(report.fields_child0) < 2:
- raise osv.except_osv(_('Invalid operation'), _('Bar charts need at least two fields'))
- else:
- c_f = {}
- for i in range(len(report.fields_child0)):
- c_f[i] = []
- tmp = report.fields_child0[i]
- for j in range(3):
- c_f[i].append((not isinstance(eval('tmp.field_child'+str(j),{},{'tmp':tmp}), browse_null) and eval('tmp.field_child'+str(j)+'.ttype',{},{'tmp':tmp})) or None)
-
- if i == 0:
- pass
- else:
- if not reduce(lambda x,y : x or y, map(lambda x: x in ['integer', 'float'], c_f[i])):
- raise osv.except_osv(_('Invalid operation'), _('Field %d should be a figure') %(i,))
-
- if report.state=='subscribed':
- continue
-
- name = report.name
- model = report.model_id.model
-
- action_def = {'report_id':report.id, 'type':'ir.actions.report.custom', 'model':model, 'name':name}
- id = self.pool.get('ir.actions.report.custom').create(cr, uid, action_def)
- m_id = report.menu_id.id
- action = "ir.actions.report.custom,%d" % (id,)
- if not report.menu_id:
- ir.ir_set(cr, uid, 'action', 'client_print_multi', name, [(model, False)], action, False, True)
- else:
- ir.ir_set(cr, uid, 'action', 'tree_but_open', 'Menuitem', [('ir.ui.menu', int(m_id))], action, False, True)
-
- self.write(cr, uid, [report.id], {'state':'subscribed'}, context)
- return True
-report_custom()
-
-
-class report_custom_fields(osv.osv):
- _name = 'ir.report.custom.fields'
- _columns = {
- 'name': fields.char('Name', size=64, required=True),
- 'report_id': fields.many2one('ir.report.custom', 'Report Ref', select=True),
- 'field_child0': fields.many2one('ir.model.fields', 'Field child0', required=True),
- 'fc0_operande': fields.many2one('ir.model.fields', 'Constraint'),
- 'fc0_condition': fields.char('Condition', size=64),
- 'fc0_op': fields.selection((('>','>'),('<','<'),('==','='),('in','in'),('gety,==','(year)=')), 'Relation'),
- 'field_child1': fields.many2one('ir.model.fields', 'Field child1'),
- 'fc1_operande': fields.many2one('ir.model.fields', 'Constraint'),
- 'fc1_condition': fields.char('condition', size=64),
- 'fc1_op': fields.selection((('>','>'),('<','<'),('==','='),('in','in'),('gety,==','(year)=')), 'Relation'),
- 'field_child2': fields.many2one('ir.model.fields', 'Field child2'),
- 'fc2_operande': fields.many2one('ir.model.fields', 'Constraint'),
- 'fc2_condition': fields.char('condition', size=64),
- 'fc2_op': fields.selection((('>','>'),('<','<'),('==','='),('in','in'),('gety,==','(year)=')), 'Relation'),
- 'field_child3': fields.many2one('ir.model.fields', 'Field child3'),
- 'fc3_operande': fields.many2one('ir.model.fields', 'Constraint'),
- 'fc3_condition': fields.char('condition', size=64),
- 'fc3_op': fields.selection((('>','>'),('<','<'),('==','='),('in','in'),('gety,==','(year)=')), 'Relation'),
- 'alignment': fields.selection((('left','left'),('right','right'),('center','center')), 'Alignment', required=True),
- 'sequence': fields.integer('Sequence', required=True),
- 'width': fields.integer('Fixed Width'),
- 'operation': fields.selection((('none', 'None'),('calc_sum','Calculate Sum'),('calc_avg','Calculate Average'),('calc_count','Calculate Count'),('calc_max', 'Get Max'))),
- 'groupby' : fields.boolean('Group By'),
- 'bgcolor': fields.char('Background Color', size=64),
- 'fontcolor': fields.char('Font color', size=64),
- 'cumulate': fields.boolean('Accumulate')
- }
- _defaults = {
- 'alignment': lambda *a: 'left',
- 'bgcolor': lambda *a: 'white',
- 'fontcolor': lambda *a: 'black',
- 'operation': lambda *a: 'none',
- }
- _order = "sequence"
-
- def onchange_any_field_child(self, cr, uid, ids, field_id, level):
- if not(field_id):
- return {}
- next_level_field_name = 'field_child%d' % (level+1)
- next_level_operande = 'fc%d_operande' % (level+1)
- field = self.pool.get('ir.model.fields').browse(cr, uid, [field_id])[0]
- res = self.pool.get(field.model).fields_get(cr, uid, field.name)
- if res[field.name].has_key('relation'):
- cr.execute('select id from ir_model where model=%s', (res[field.name]['relation'],))
- (id,) = cr.fetchone() or (False,)
- if id:
- return {
- 'domain': {
- next_level_field_name: [('model_id', '=', id)],
- next_level_operande: [('model_id', '=', id)]
- },
- 'required': {
- next_level_field_name: True
- }
- }
- else:
- netsvc.Logger().notifyChannel('web-services', netsvc.LOG_WARNING, _("Using a relation field which uses an unknown object"))
- return {'required': {next_level_field_name: True}}
- else:
- return {'domain': {next_level_field_name: []}}
-
- def get_field_child_onchange_method(level):
- return lambda self, cr, uid, ids, field_id: self.onchange_any_field_child(cr, uid, ids, field_id, level)
-
- onchange_field_child0 = get_field_child_onchange_method(0)
- onchange_field_child1 = get_field_child_onchange_method(1)
- onchange_field_child2 = get_field_child_onchange_method(2)
-report_custom_fields()
-
-
-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
-
diff --git a/bin/addons/base/ir/ir_ui_menu.py b/bin/addons/base/ir/ir_ui_menu.py
index d16b4554d41..6b4d98962b4 100644
--- a/bin/addons/base/ir/ir_ui_menu.py
+++ b/bin/addons/base/ir/ir_ui_menu.py
@@ -125,7 +125,6 @@ class ir_ui_menu(osv.osv):
data = menu.action
if data:
model_field = { 'ir.actions.act_window': 'res_model',
- 'ir.actions.report.custom': 'model',
'ir.actions.report.xml': 'model',
'ir.actions.wizard': 'model',
'ir.actions.server': 'model_id',
@@ -272,7 +271,6 @@ class ir_ui_menu(osv.osv):
'action': fields.function(_action, fnct_inv=_action_inv,
method=True, type='reference', string='Action',
selection=[
- ('ir.actions.report.custom', 'ir.actions.report.custom'),
('ir.actions.report.xml', 'ir.actions.report.xml'),
('ir.actions.act_window', 'ir.actions.act_window'),
('ir.actions.wizard', 'ir.actions.wizard'),
diff --git a/bin/addons/base/ir/ir_ui_view.py b/bin/addons/base/ir/ir_ui_view.py
index 62e4bd9dd6e..810bfcf108a 100644
--- a/bin/addons/base/ir/ir_ui_view.py
+++ b/bin/addons/base/ir/ir_ui_view.py
@@ -55,7 +55,7 @@ class view(osv.osv):
_columns = {
'name': fields.char('View Name',size=64, required=True),
'model': fields.char('Object', size=64, required=True),
- 'priority': fields.integer('Priority', required=True),
+ 'priority': fields.integer('Sequence', required=True),
'type': fields.selection((
('tree','Tree'),
('form','Form'),
@@ -212,7 +212,7 @@ class view_sc(osv.osv):
_sql_constraints = [
('shortcut_unique', 'unique(res_id, resource, user_id)', 'Shortcut for this menu already exists!'),
]
-
+
view_sc()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/bin/addons/base/ir/ir_values.py b/bin/addons/base/ir/ir_values.py
index 1f9a54516b6..310f3552403 100644
--- a/bin/addons/base/ir/ir_values.py
+++ b/bin/addons/base/ir/ir_values.py
@@ -176,7 +176,7 @@ class ir_values(osv.osv):
where.append('res_id=%s')
params.append(res_id)
- where.append('(user_id=%s or (user_id IS NULL))')
+ where.append('(user_id=%s or (user_id IS NULL)) order by id')
params.append(uid)
clause = ' and '.join(where)
cr.execute('select id,name,value,object,meta, key from ir_values where ' + clause, params)
diff --git a/bin/addons/base/ir/wizard/__init__.py b/bin/addons/base/ir/wizard/__init__.py
index b1a92b51272..99c6cdcd0de 100644
--- a/bin/addons/base/ir/wizard/__init__.py
+++ b/bin/addons/base/ir/wizard/__init__.py
@@ -19,6 +19,7 @@
#
##############################################################################
import wizard_menu
+import wizard_screen
import create_action
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/bin/addons/base/ir/wizard/wizard_screen.py b/bin/addons/base/ir/wizard/wizard_screen.py
new file mode 100644
index 00000000000..56f104d0b13
--- /dev/null
+++ b/bin/addons/base/ir/wizard/wizard_screen.py
@@ -0,0 +1,48 @@
+# -*- coding: utf-8 -*-
+##############################################################################
+#
+# Copyright (C) 2010 OpenERP s.a. ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+import base64
+import os
+import random
+
+import tools
+from osv import fields,osv
+
+# Simple base class for wizards that wish to use random images on the left
+# side of the form.
+class wizard_screen(osv.osv_memory):
+ _name = 'ir.wizard.screen'
+
+ def _get_image(self, cr, uid, context=None):
+ path = os.path.join('base','res','config_pixmaps','%d.png'%random.randrange(1,4))
+ file_data = tools.file_open(path,'rb').read()
+ return base64.encodestring(file_data)
+
+ def _get_image_fn(self, cr, uid, ids, name, args, context=None):
+ image = self._get_image(cr, uid, context)
+ return dict.fromkeys(ids, image) # ok to use .fromkeys() as the image is same for all
+
+ _columns = {
+ 'config_logo': fields.function(_get_image_fn, string='Image', type='binary', method=True),
+ }
+
+ _defaults = {
+ 'config_logo': _get_image
+ }
+wizard_screen()
\ No newline at end of file
diff --git a/bin/addons/base/ir/workflow/workflow.py b/bin/addons/base/ir/workflow/workflow.py
index 8074d784e3c..30fd666c03e 100644
--- a/bin/addons/base/ir/workflow/workflow.py
+++ b/bin/addons/base/ir/workflow/workflow.py
@@ -171,7 +171,6 @@ class wkf_instance(osv.osv):
_log_access = False
_columns = {
'wkf_id': fields.many2one('workflow', 'Workflow', ondelete='cascade', select=True),
- 'uid': fields.integer('User ID'),
'res_id': fields.integer('Resource ID', select=True),
'res_type': fields.char('Resource Object', size=64, select=True),
'state': fields.char('State', size=32, select=True),
@@ -194,6 +193,7 @@ class wkf_workitem(osv.osv):
_rec_name = 'state'
_columns = {
'act_id': fields.many2one('workflow.activity', 'Activity', required=True, ondelete="cascade", select=True),
+ 'wkf_id': fields.related('act_id','wkf_id', type='many2one', relation='workflow', string='Workflow'),
'subflow_id': fields.many2one('workflow.instance', 'Subflow', ondelete="cascade", select=True),
'inst_id': fields.many2one('workflow.instance', 'Instance', required=True, ondelete="cascade", select=True),
'state': fields.char('State', size=64, select=True),
diff --git a/bin/addons/base/ir/workflow/workflow_view.xml b/bin/addons/base/ir/workflow/workflow_view.xml
index 089d5ee777f..b4e9b0daf46 100644
--- a/bin/addons/base/ir/workflow/workflow_view.xml
+++ b/bin/addons/base/ir/workflow/workflow_view.xml
@@ -1,7 +1,7 @@
-
+
+ Resource: res.partner.title
+ -->
partner
Corp.
@@ -49,9 +49,9 @@
-
+
Partner
diff --git a/bin/addons/base/res/partner/partner_view.xml b/bin/addons/base/res/partner/partner_view.xml
index dbe19959445..fcf007deb0f 100644
--- a/bin/addons/base/res/partner/partner_view.xml
+++ b/bin/addons/base/res/partner/partner_view.xml
@@ -123,7 +123,7 @@