diff --git a/bin/addons/base/i18n/hr.po b/bin/addons/base/i18n/hr.po index fe85341c5a1..b2585d13aa1 100644 --- a/bin/addons/base/i18n/hr.po +++ b/bin/addons/base/i18n/hr.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-12-18 08:39+0000\n" -"PO-Revision-Date: 2010-06-08 04:33+0000\n" -"Last-Translator: goranc \n" +"PO-Revision-Date: 2010-06-10 07:58+0000\n" +"Last-Translator: Goran Kliska \n" "Language-Team: openerp-translators\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-06-09 03:34+0000\n" +"X-Launchpad-Export-Date: 2010-06-11 03:41+0000\n" "X-Generator: Launchpad (build Unknown)\n" "Language: hr\n" @@ -1381,7 +1381,7 @@ msgstr "Gruzija" #. module: base #: model:res.country,name:base.pl msgid "Poland" -msgstr "" +msgstr "Poljska" #. module: base #: selection:ir.module.module,state:0 @@ -2703,7 +2703,7 @@ msgstr "" #: help:ir.values,key2:0 msgid "" "The kind of action or button in the client side that will trigger the action." -msgstr "" +msgstr "Vrsta akcije ili gumba na klijentskoj strani koja će okinuti akciju." #. module: base #: selection:ir.ui.menu,icon:0 diff --git a/bin/addons/base/i18n/ja.po b/bin/addons/base/i18n/ja.po index 45688b7f91e..ae156a7db4c 100644 --- a/bin/addons/base/i18n/ja.po +++ b/bin/addons/base/i18n/ja.po @@ -8,13 +8,13 @@ msgstr "" "Project-Id-Version: openobject-server\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-12-18 08:39+0000\n" -"PO-Revision-Date: 2010-06-08 04:29+0000\n" +"PO-Revision-Date: 2010-06-10 04:00+0000\n" "Last-Translator: Harry (Open ERP) \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-06-09 03:34+0000\n" +"X-Launchpad-Export-Date: 2010-06-11 03:41+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base diff --git a/bin/addons/base/i18n/sv.po b/bin/addons/base/i18n/sv.po index 08beca7e584..583db00b633 100644 --- a/bin/addons/base/i18n/sv.po +++ b/bin/addons/base/i18n/sv.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.0\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-12-18 08:39+0000\n" -"PO-Revision-Date: 2010-06-08 04:08+0000\n" +"PO-Revision-Date: 2010-06-10 04:02+0000\n" "Last-Translator: Anders Wallenquist \n" "Language-Team: <>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-06-09 03:34+0000\n" +"X-Launchpad-Export-Date: 2010-06-11 03:41+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base diff --git a/bin/addons/base/i18n/uk.po b/bin/addons/base/i18n/uk.po index e15b9b259b8..b67c74943f1 100644 --- a/bin/addons/base/i18n/uk.po +++ b/bin/addons/base/i18n/uk.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.0\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-12-18 08:39+0000\n" -"PO-Revision-Date: 2010-06-08 04:37+0000\n" +"PO-Revision-Date: 2010-06-10 03:58+0000\n" "Last-Translator: Fabien (Open ERP) \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-06-09 03:34+0000\n" +"X-Launchpad-Export-Date: 2010-06-11 03:42+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base diff --git a/bin/addons/base/i18n/zh_CN.po b/bin/addons/base/i18n/zh_CN.po index ffc929558d9..7a90b088d99 100644 --- a/bin/addons/base/i18n/zh_CN.po +++ b/bin/addons/base/i18n/zh_CN.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2009-12-18 08:39+0000\n" -"PO-Revision-Date: 2010-06-08 04:26+0000\n" +"PO-Revision-Date: 2010-06-10 03:59+0000\n" "Last-Translator: Eleanor Chen \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-06-09 03:35+0000\n" +"X-Launchpad-Export-Date: 2010-06-11 03:42+0000\n" "X-Generator: Launchpad (build Unknown)\n" #. module: base diff --git a/bin/addons/base/ir/ir_rule.py b/bin/addons/base/ir/ir_rule.py index ba508b48920..23981458606 100644 --- a/bin/addons/base/ir/ir_rule.py +++ b/bin/addons/base/ir/ir_rule.py @@ -21,11 +21,14 @@ from osv import fields,osv import time +from operator import itemgetter +from functools import partial import tools from tools.safe_eval import safe_eval as eval class ir_rule(osv.osv): _name = 'ir.rule' + _MODES = ['read', 'write', 'create', 'unlink'] def _domain_force_get(self, cr, uid, ids, field_name, arg, context={}): res = {} @@ -45,13 +48,7 @@ class ir_rule(osv.osv): return res def _check_model_obj(self, cr, uid, ids, context={}): - model_obj = self.pool.get('ir.model') - for rule in self.browse(cr, uid, ids, context): - model = model_obj.browse(cr, uid, rule.model_id.id, context).model - obj = self.pool.get(model) - if isinstance(obj, osv.osv_memory): - return False - return True + return not any(isinstance(self.pool.get(rule.model_id.model), osv.osv_memory) for rule in self.browse(cr, uid, ids, context)) _columns = { 'name': fields.char('Name', size=128, select=1), @@ -90,6 +87,8 @@ class ir_rule(osv.osv): @tools.cache() def _compute_domain(self, cr, uid, model_name, mode="read"): + if mode not in self._MODES: + raise ValueError('Invalid mode: %r' % (mode,)) group_rule = {} global_rules = [] @@ -115,6 +114,24 @@ class ir_rule(osv.osv): dom += self.domain_create(cr, uid, value) return dom + def clear_cache(self, cr, uid): + cr.execute("""SELECT DISTINCT m.model + FROM ir_rule r + JOIN ir_model m + ON r.model_id = m.id + WHERE r.global + OR EXISTS (SELECT 1 + FROM rule_group_rel g_rel + JOIN res_groups_users_rel u_rel + ON g_rel.group_id = u_rel.gid + WHERE g_rel.rule_group_id = r.id + AND u_rel.uid = %s) + """, (uid,)) + models = map(itemgetter(0), cr.fetchall()) + clear = partial(self._compute_domain.clear_cache, cr.dbname, uid) + [clear(model, mode) for model in models for mode in self._MODES] + + def domain_get(self, cr, uid, model_name, mode='read', context={}): dom = self._compute_domain(cr, uid, model_name, mode=mode) if dom: diff --git a/bin/addons/base/res/ir_property.py b/bin/addons/base/res/ir_property.py index 5a8ce755125..462cb433998 100644 --- a/bin/addons/base/res/ir_property.py +++ b/bin/addons/base/res/ir_property.py @@ -63,6 +63,7 @@ class ir_property(osv.osv): 'type' : fields.selection([('char', 'Char'), ('float', 'Float'), + ('boolean', 'Boolean'), ('integer', 'Integer'), ('integer_big', 'Integer Big'), ('text', 'Text'), @@ -84,10 +85,20 @@ class ir_property(osv.osv): value = values.pop('value', None) if not value: return values - type_ = values.get('type', 'many2one') + + prop = None + type_ = values.get('type') + if not type_: + if ids: + prop = self.browse(cr, uid, ids[0]) + type_ = prop.type + else: + type_ = self._defaults['type'] + type2field = { 'char': 'value_text', 'float': 'value_float', + 'boolean' : 'value_integer', 'integer': 'value_integer', 'integer_big': 'value_integer', 'text': 'value_text', @@ -106,9 +117,9 @@ class ir_property(osv.osv): elif isinstance(value, (int, long)): field_id = values.get('fields_id') if not field_id: - if not ids: + if not prop: raise ValueError() - field_id = self.browse(cr, uid, ids[0]).fields_id + field_id = prop.fields_id else: field_id = self.pool.get('ir.model.fields').browse(cr, uid, field_id) @@ -137,6 +148,8 @@ class ir_property(osv.osv): return record.value_text elif record.type == 'float': return record.value_float + elif record.type == 'boolean': + return bool(record.value_integer) elif record.type in ('integer', 'integer_big'): return record.value_integer elif record.type == 'binary': @@ -146,6 +159,8 @@ class ir_property(osv.osv): elif record.type == 'datetime': return record.value_datetime elif record.type == 'date': + if not record.value_datetime: + return False return time.strftime('%Y-%m-%d', time.strptime(record.value_datetime, '%Y-%m-%d %H:%M:%S')) return False @@ -158,18 +173,27 @@ class ir_property(osv.osv): return self.get_by_id(cr, uid, nid, context=context) return False + def _get_domain_default(self, cr, uid, prop_name, model, context=None): + domain = self._get_domain(cr, uid, prop_name, model, context=context) + if domain is None: + return None + return ['&', ('res_id', '=', False)] + domain + def _get_domain(self, cr, uid, prop_name, model, context=None): cr.execute('select id from ir_model_fields where name=%s and model=%s', (prop_name, model)) res = cr.fetchone() if not res: return None - company = self.pool.get('res.company') - cid = company._company_default_get(cr, uid, model, res[0], + if 'force_company' in context and context['force_company']: + cid = context['force_company'] + else: + company = self.pool.get('res.company') + cid = company._company_default_get(cr, uid, model, res[0], context=context) domain = ['&', ('fields_id', '=', res[0]), - '|', ('company_id', '=', cid), ('company_id', '=', False)] + '|', ('company_id', '=', cid), ('company_id', '=', False)] return domain ir_property() diff --git a/bin/addons/base/res/ir_property_view.xml b/bin/addons/base/res/ir_property_view.xml index e2a98f30445..c6aba4996a0 100644 --- a/bin/addons/base/res/ir_property_view.xml +++ b/bin/addons/base/res/ir_property_view.xml @@ -30,7 +30,7 @@ - + diff --git a/bin/addons/base/res/partner/partner.py b/bin/addons/base/res/partner/partner.py index a1960c7fc7b..3a12868fb91 100644 --- a/bin/addons/base/res/partner/partner.py +++ b/bin/addons/base/res/partner/partner.py @@ -278,7 +278,7 @@ class res_partner_address(osv.osv): _description ='Partner Addresses' _name = 'res.partner.address' _columns = { - 'partner_id': fields.many2one('res.partner', 'Company Name', ondelete='set null', select=True, help="Keep empty for a private address, not related to partner."), + 'partner_id': fields.many2one('res.partner', 'Partner Name', ondelete='set null', select=True, help="Keep empty for a private address, not related to partner."), 'type': fields.selection( [ ('default','Default'),('invoice','Invoice'), ('delivery','Delivery'), ('contact','Contact'), ('other','Other') ],'Address Type', help="Used to select automatically the right address according to the context in sales and purchases documents."), 'function': fields.char('Function', size=64), 'title': fields.selection(_contact_title_get, 'Title', size=32), diff --git a/bin/addons/base/res/partner/partner_view.xml b/bin/addons/base/res/partner/partner_view.xml index 94b57f268b9..0af1fdc7d7a 100644 --- a/bin/addons/base/res/partner/partner_view.xml +++ b/bin/addons/base/res/partner/partner_view.xml @@ -5,7 +5,7 @@ - - - - + + + @@ -333,8 +333,8 @@ - - + + @@ -357,7 +357,7 @@ ir.actions.act_window res.partner form - {"search_default_supplier":supplier} + {"search_default_customer":1} @@ -384,7 +384,7 @@ res.partner form [('customer','=',1)] - {'default_customer':1} + {'default_customer':1, 'search_default_customer':1} @@ -417,15 +417,6 @@ - - New Partner - ir.actions.act_window - res.partner - form - form,tree - - - res.payterm res.payterm @@ -549,6 +540,7 @@ + Partner Categories diff --git a/bin/addons/base/res/res_company.py b/bin/addons/base/res/res_company.py index c076eef612a..4b6ec1dc00a 100644 --- a/bin/addons/base/res/res_company.py +++ b/bin/addons/base/res/res_company.py @@ -133,12 +133,12 @@ class res_company(osv.osv): ids = self._get_company_children(cr, uid, company) return ids + @tools.cache() def _get_company_children(self, cr, uid=None, company=None): if not company: return [] ids = self.search(cr, uid, [('parent_id','child_of',[company])]) return ids - _get_company_children = tools.cache()(_get_company_children) def _get_partner_hierarchy(self, cr, uid, company_id, context={}): if company_id: @@ -168,7 +168,6 @@ class res_company(osv.osv): def write(self, cr, *args, **argv): self.cache_restart(cr) - # Restart the cache on the company_get method return super(res_company, self).write(cr, *args, **argv) def _get_euro(self, cr, uid, context={}): diff --git a/bin/addons/base/res/res_user.py b/bin/addons/base/res/res_user.py index 9040f90be95..c71982527d8 100644 --- a/bin/addons/base/res/res_user.py +++ b/bin/addons/base/res/res_user.py @@ -20,9 +20,9 @@ ############################################################################## from osv import fields,osv -from osv.orm import except_orm, browse_record +from osv.orm import browse_record import tools -import operator +from functools import partial import pytz import pooler from tools.translate import _ @@ -55,7 +55,6 @@ class groups(osv.osv): raise osv.except_osv(_('Error'), _('The name of the group can not start with "-"')) res = super(groups, self).write(cr, uid, ids, vals, context=context) - # Restart the cache on the company_get method self.pool.get('ir.model.access').call_cache_clearing_methods(cr) return res @@ -332,11 +331,14 @@ class users(osv.osv): 'groups_id': _get_group, 'address_id': False, } + + @tools.cache() def company_get(self, cr, uid, uid2, context=None): return self._get_company(cr, uid, context=context, uid2=uid2) - company_get = tools.cache()(company_get) def write(self, cr, uid, ids, values, context=None): + if not hasattr(ids, '__iter__'): + ids = [ids] if ids == [uid]: for key in values.keys(): if not (key in ('view', 'password','signature','action_id', 'company_id') or key.startswith('context_')): @@ -344,9 +346,13 @@ class users(osv.osv): else: uid = 1 res = super(users, self).write(cr, uid, ids, values, context=context) + + # clear caches linked to the users self.company_get.clear_cache(cr.dbname) - # Restart the cache on the company_get method self.pool.get('ir.model.access').call_cache_clearing_methods(cr) + clear = partial(self.pool.get('ir.rule').clear_cache, cr) + map(clear, ids) + return res def unlink(self, cr, uid, ids, context=None): diff --git a/bin/addons/base/security/ir.model.access.csv b/bin/addons/base/security/ir.model.access.csv index ba9a7287d81..48d015c1744 100644 --- a/bin/addons/base/security/ir.model.access.csv +++ b/bin/addons/base/security/ir.model.access.csv @@ -1,5 +1,6 @@ "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" -"access_ir_attachment_group_system","ir_attachment group_system","model_ir_attachment",,1,1,1,1 +"access_ir_attachment_all","ir_attachment all","model_ir_attachment",,1,0,0,0 +"access_ir_attachment_group_user","ir_attachment group_user","model_ir_attachment",group_user,1,1,1,1 "access_ir_cron_group_cron","ir_cron group_cron","model_ir_cron","group_system",1,1,1,1 "access_ir_cron_user","ir_cron user","model_ir_cron","group_user",1,0,0,0 "access_ir_default_group_system","ir_default group_system","model_ir_default",,1,1,1,1 @@ -26,8 +27,9 @@ "access_ir_rule_group_erp_manager","ir_rule group_erp_manager","model_ir_rule","group_erp_manager",1,1,1,1 "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,1,0 +"access_ir_translation_all","ir_translation all","model_ir_translation",,1,0,0,0 +"access_ir_translation_group_system","ir_translation group_system","model_ir_translation","group_system",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_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 @@ -97,7 +99,7 @@ "access_workflow_group_system","workflow_group_system","model_workflow","group_system",1,1,1,1 "access_workflow_activity_all","workflow_activity_all","model_workflow_activity",,1,0,0,0 "access_workflow_activity_group_system","workflow_activity_group_system","model_workflow_activity","group_system",1,1,1,1 -"access_workflow_instance_all","workflow_instance_all","model_workflow_instance",,1,1,1,1 +"access_workflow_instance_all","workflow_instance_all","model_workflow_instance",,1,0,0,0 "access_workflow_transition_all","workflow_transition_all","model_workflow_transition",,1,0,0,0 "access_workflow_transition_group_system","workflow_transition_group_system","model_workflow_transition","group_system",1,1,1,1 "access_workflow_triggers_all","workflow_triggers_all","model_workflow_triggers",,1,0,0,0 @@ -125,5 +127,5 @@ "access_maintenance_group_user","maintenance_contract group_user","model_maintenance_contract","group_maintenance_manager",1,1,1,1 "access_maintenance_contract_module","maintenance.contract.module","model_maintenance_contract_module","group_maintenance_manager",1,1,1,1 "access_maintenance_contract_wizard","maintenance.contract.wizard","model_maintenance_contract_wizard","group_maintenance_manager",1,1,1,1 -"access_multi_company_default user","multi_company_default User","model_multi_company_default","group_user",1,0,0,0 +"access_multi_company_default user","multi_company_default all","model_multi_company_default",,1,0,0,0 "access_multi_company_default manager","multi_company_default Manager","model_multi_company_default","group_erp_manager",1,1,1,1 diff --git a/bin/import_xml.rng b/bin/import_xml.rng index 3a698f4a897..2ddc2336cc0 100644 --- a/bin/import_xml.rng +++ b/bin/import_xml.rng @@ -201,6 +201,9 @@ + + + diff --git a/bin/osv/fields.py b/bin/osv/fields.py index dbddbb913e9..bce5ea8829f 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -874,12 +874,17 @@ class serialized(_column): class property(function): def _get_default(self, obj, cr, uid, prop_name, context=None): + from orm import browse_record prop = obj.pool.get('ir.property') - domain = prop._get_domain(cr, uid, prop_name, obj._name, context) + domain = prop._get_domain_default(cr, uid, prop_name, obj._name, context) ids = prop.search(cr, uid, domain, order='company_id', context=context) if not ids: return False - return prop.get_by_id(cr, uid, ids, context=context) + + default_value = prop.get_by_id(cr, uid, ids, context=context) + if isinstance(default_value, browse_record): + return default_value.id + return default_value def _get_by_id(self, obj, cr, uid, prop_name, ids, context=None): prop = obj.pool.get('ir.property') @@ -903,7 +908,7 @@ class property(function): default_val = self._get_default(obj, cr, uid, prop_name, context) - if id_val and id_val != default_val: + if id_val is not default_val: def_id = self._field_get(cr, uid, obj._name, prop_name) company = obj.pool.get('res.company') cid = company._company_default_get(cr, uid, obj._name, def_id, @@ -924,23 +929,16 @@ class property(function): def _fnct_read(self, obj, cr, uid, ids, prop_name, obj_dest, context=None): from orm import browse_record - if context is None: - context = {} - - property = obj.pool.get('ir.property') + properties = obj.pool.get('ir.property') default_val = self._get_default(obj, cr, uid, prop_name, context) - if isinstance(default_val, browse_record): - default_val = default_val.id - else: - default_val = False nids = self._get_by_id(obj, cr, uid, prop_name, ids, context) res = {} for id in ids: res[id] = default_val - for prop in property.browse(cr, uid, nids): + for prop in properties.browse(cr, uid, nids): value = prop.get_by_id(context=context) if isinstance(value, browse_record): if not value.exists(): diff --git a/bin/osv/orm.py b/bin/osv/orm.py index b166881798b..4e19ecf4574 100644 --- a/bin/osv/orm.py +++ b/bin/osv/orm.py @@ -3118,9 +3118,10 @@ class orm(orm_template): ids = [ids] self._check_concurrency(cr, ids, context) - self.pool.get('ir.model.access').check(cr, user, self._name, 'write', context=context) + result = self._store_get_values(cr, user, ids, vals.keys(), context) or [] + # No direct update of parent_left/right vals.pop('parent_left', None) vals.pop('parent_right', None) @@ -3208,7 +3209,6 @@ class orm(orm_template): if c[0].startswith('default_'): del rel_context[c[0]] - result = [] for field in upd_todo: for id in ids: result += self._columns[field].set(cr, self, id, field, vals[field], user, context=rel_context) or [] @@ -3279,8 +3279,19 @@ class orm(orm_template): cr.execute('update '+self._table+' set parent_left=parent_left-%s, parent_right=parent_right-%s where parent_left>=%s and parent_left<%s', (pleft-position+distance,pleft-position+distance, pleft+distance, pright+distance)) result += self._store_get_values(cr, user, ids, vals.keys(), context) + result.sort() + + done = {} for order, object, ids, fields in result: - self.pool.get(object)._store_set_values(cr, user, ids, fields, context) + key = (object,tuple(fields)) + done.setdefault(key, {}) + # avoid to do several times the same computation + todo = [] + for id in ids: + if id not in done[key]: + done[key][id] = True + todo.append(id) + self.pool.get(object)._store_set_values(cr, user, todo, fields, context) wf_service = netsvc.LocalService("workflow") for id in ids: @@ -3543,6 +3554,8 @@ class orm(orm_template): return result2 def _store_set_values(self, cr, uid, ids, fields, context): + if not ids: + return True field_flag = False field_dict = {} if self._log_access: