diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index 49bb719bad7..fd4bb2f89b4 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -1185,6 +1185,9 @@ ir.translation
+
+ +
diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py index a5d04d7f1bc..019ef62a6bd 100644 --- a/openerp/addons/base/ir/ir_actions.py +++ b/openerp/addons/base/ir/ir_actions.py @@ -35,6 +35,7 @@ from tools.config import config from tools.safe_eval import safe_eval as eval from tools.translate import _ from socket import gethostname +from openerp import SUPERUSER_ID _logger = logging.getLogger(__name__) @@ -271,7 +272,7 @@ class act_window(osv.osv): :return: A read() view of the ir.actions.act_window """ dataobj = self.pool.get('ir.model.data') - data_id = dataobj._get_id (cr, 1, module, xml_id) + data_id = dataobj._get_id (cr, SUPERUSER_ID, module, xml_id) res_id = dataobj.browse(cr, uid, data_id, context).res_id return self.read(cr, uid, res_id, [], context) diff --git a/openerp/addons/base/ir/ir_config_parameter.py b/openerp/addons/base/ir/ir_config_parameter.py index f21c2db8d0a..120fcfca554 100644 --- a/openerp/addons/base/ir/ir_config_parameter.py +++ b/openerp/addons/base/ir/ir_config_parameter.py @@ -26,6 +26,7 @@ from osv import osv,fields import uuid import datetime from tools import misc, config +from openerp import SUPERUSER_ID """ A dictionary holding some configuration parameters to be initialized when the database is created. @@ -55,9 +56,9 @@ class ir_config_parameter(osv.osv): Initializes the parameters listed in _default_parameters. """ for key, func in _default_parameters.iteritems(): - ids = self.search(cr, 1, [('key','=',key)]) + ids = self.search(cr, SUPERUSER_ID, [('key','=',key)]) if not ids: - self.set_param(cr, 1, key, func()) + self.set_param(cr, SUPERUSER_ID, key, func()) def get_param(self, cr, uid, key, default=False, context=None): """Retrieve the value for a given key. diff --git a/openerp/addons/base/ir/ir_rule.py b/openerp/addons/base/ir/ir_rule.py index 2b864a7f8c6..75882051e6b 100644 --- a/openerp/addons/base/ir/ir_rule.py +++ b/openerp/addons/base/ir/ir_rule.py @@ -44,7 +44,7 @@ class ir_rule(osv.osv): def _eval_context(self, cr, uid): """Returns a dictionary to use as evaluation context for ir.rule domains.""" - return {'user': self.pool.get('res.users').browse(cr, 1, uid), + return {'user': self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid), 'time':time} def _domain_force_get(self, cr, uid, ids, field_name, arg, context=None): @@ -152,7 +152,7 @@ class ir_rule(osv.osv): # involve objects on which the real uid has no acces rights. # This means also there is no implicit restriction (e.g. an object # references another object the user can't see). - query = self.pool.get(model_name)._where_calc(cr, 1, dom, active_test=False) + query = self.pool.get(model_name)._where_calc(cr, SUPERUSER_ID, dom, active_test=False) return query.where_clause, query.where_clause_params, query.tables return [], [], ['"'+self.pool.get(model_name)._table+'"'] diff --git a/openerp/addons/base/ir/ir_translation.py b/openerp/addons/base/ir/ir_translation.py index 78dda4ab5b5..231b9ba0e93 100644 --- a/openerp/addons/base/ir/ir_translation.py +++ b/openerp/addons/base/ir/ir_translation.py @@ -77,14 +77,14 @@ class ir_translation_import_cursor(object): def push(self, ddict): """Feed a translation, as a dictionary, into the cursor """ - + state = "translated" if (ddict['value'] and ddict['value'] != "") else "to_translate" self._cr.execute("INSERT INTO " + self._table_name \ + """(name, lang, res_id, src, type, - imd_model, imd_module, imd_name, value) - VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s)""", + imd_model, imd_module, imd_name, value,state) + VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", (ddict['name'], ddict['lang'], ddict.get('res_id'), ddict['src'], ddict['type'], ddict.get('imd_model'), ddict.get('imd_module'), ddict.get('imd_name'), - ddict['value'])) + ddict['value'],state)) def finish(self): """ Transfer the data from the temp table to ir.translation @@ -125,15 +125,16 @@ class ir_translation_import_cursor(object): # Step 2: update existing (matching) translations if self._overwrite: cr.execute("""UPDATE ONLY %s AS irt - SET value = ti.value + SET value = ti.value, + state = 'translated' FROM %s AS ti WHERE %s AND ti.value IS NOT NULL AND ti.value != '' """ % (self._parent_table, self._table_name, find_expr)) # Step 3: insert new translations - cr.execute("""INSERT INTO %s(name, lang, res_id, src, type, value) - SELECT name, lang, res_id, src, type, value + cr.execute("""INSERT INTO %s(name, lang, res_id, src, type, value,state) + SELECT name, lang, res_id, src, type, value,state FROM %s AS ti WHERE NOT EXISTS(SELECT 1 FROM ONLY %s AS irt WHERE %s); """ % (self._parent_table, self._table_name, self._parent_table, find_expr)) @@ -167,6 +168,11 @@ class ir_translation(osv.osv): 'type': fields.selection(TRANSLATION_TYPE, string='Type', size=16, select=True), 'src': fields.text('Source'), 'value': fields.text('Translation Value'), + 'state':fields.selection([('to_translate','To Translate'),('inprogress','Translation in Progress'),('translated','Translated')]) + } + + _defaults = { + 'state':'to_translate', } _sql_constraints = [ ('lang_fkey_res_lang', 'FOREIGN KEY(lang) REFERENCES res_lang(code)', @@ -301,6 +307,10 @@ class ir_translation(osv.osv): context = {} if isinstance(ids, (int, long)): ids = [ids] + if vals.get('src') or ('value' in vals and not(vals.get('value'))): + result = vals.update({'state':'to_translate'}) + if vals.get('value'): + result = vals.update({'state':'translated'}) result = super(ir_translation, self).write(cursor, user, ids, vals, context=context) for trans_obj in self.read(cursor, user, ids, ['name','type','res_id','src','lang'], context=context): self._get_source.clear_cache(self, user, trans_obj['name'], trans_obj['type'], trans_obj['lang'], trans_obj['src']) diff --git a/openerp/addons/base/ir/ir_ui_menu.py b/openerp/addons/base/ir/ir_ui_menu.py index 77c0c4d738a..add4a39a182 100644 --- a/openerp/addons/base/ir/ir_ui_menu.py +++ b/openerp/addons/base/ir/ir_ui_menu.py @@ -28,6 +28,7 @@ import tools import openerp.modules from osv import fields, osv from tools.translate import _ +from openerp import SUPERUSER_ID def one_in(setA, setB): """Check the presence of an element of setA in setB @@ -59,7 +60,7 @@ class ir_ui_menu(osv.osv): """ with self.cache_lock: modelaccess = self.pool.get('ir.model.access') - user_groups = set(self.pool.get('res.users').read(cr, 1, uid, ['groups_id'])['groups_id']) + user_groups = set(self.pool.get('res.users').read(cr, SUPERUSER_ID, uid, ['groups_id'])['groups_id']) result = [] for menu in self.browse(cr, uid, ids, context=context): # this key works because user access rights are all based on user's groups (cfr ir_model_access.check) diff --git a/openerp/addons/base/module/wizard/base_update_translations_view.xml b/openerp/addons/base/module/wizard/base_update_translations_view.xml index 1fe52511ebb..4a20ef30bee 100644 --- a/openerp/addons/base/module/wizard/base_update_translations_view.xml +++ b/openerp/addons/base/module/wizard/base_update_translations_view.xml @@ -10,7 +10,9 @@
diff --git a/openerp/addons/base/res/res_company.py b/openerp/addons/base/res/res_company.py index c1062f2af2c..f6f0d1808e4 100644 --- a/openerp/addons/base/res/res_company.py +++ b/openerp/addons/base/res/res_company.py @@ -24,6 +24,7 @@ from osv import fields import os import tools import openerp +from openerp import SUPERUSER_ID from tools.translate import _ from tools.safe_eval import safe_eval as eval @@ -156,7 +157,7 @@ class res_company(osv.osv): # select only the currently visible companies (according to rules, # which are probably to allow to see the child companies) even if # she belongs to some other companies. - user = self.pool.get('res.users').browse(cr, 1, uid, context=context) + user = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context) cmp_ids = list(set([user.company_id.id] + [cmp.id for cmp in user.company_ids])) return cmp_ids return super(res_company, self)._search(cr, uid, args, offset=offset, limit=limit, order=order, diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index 93d12228ebe..56cb08fa41d 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -225,12 +225,24 @@ class res_partner(osv.osv): return [context['category_id']] return False - def _get_default_image(self, cr, uid, is_company, context=None): + def _get_default_image(self, cr, uid, is_company, context=None, colorize=False): if is_company: - image_path = openerp.modules.get_module_resource('base', 'static/src/img', 'company_image.png') + image = open(openerp.modules.get_module_resource('base', 'static/src/img', 'company_image.png')).read() else: - image_path = openerp.modules.get_module_resource('base', 'static/src/img', 'partner_image.png') - return tools.image_resize_image_big(open(image_path, 'rb').read().encode('base64')) + from PIL import Image + from StringIO import StringIO + color = (255,255,255) + if colorize: + from random import random + color = (int(random() * 192 + 32), int(random() * 192 + 32), int(random() * 192 + 32)) + face = Image.open(openerp.modules.get_module_resource('base', 'static/src/img', 'avatar.png')) + avatar = Image.new('RGB', face.size) + avatar.paste(color) + avatar.paste(face, mask=face) + buffer = StringIO() + avatar.save(buffer, 'PNG') + image = buffer.getvalue() + return image.encode('base64') _defaults = { 'active': True, @@ -243,9 +255,7 @@ class res_partner(osv.osv): 'is_company': False, 'type': 'default', 'use_parent_address': True, - 'image': lambda self, cr, uid, context: self._get_default_image(cr, uid, False, context), - 'image_small': lambda self, cr, uid, context: self._get_default_image(cr, uid, False, context), - 'image_medium': lambda self, cr, uid, context: self._get_default_image(cr, uid, False, context), + 'image': lambda self, cr, uid, context: self._get_default_image(cr, uid, context.get('default_is_company', False), context), } def copy(self, cr, uid, id, default=None, context=None): @@ -323,9 +333,6 @@ class res_partner(osv.osv): domain_siblings = [('parent_id', '=', vals['parent_id']), ('use_parent_address', '=', True)] update_ids = [vals['parent_id']] + self.search(cr, uid, domain_siblings, context=context) self.update_address(cr, uid, update_ids, vals, context) - if 'image' not in vals : - image_value = self._get_default_image(cr, uid, vals.get('is_company', False) or context.get('default_is_company'), context) - vals.update(tools.image_get_resized_images(image_value, return_big=True)) return super(res_partner,self).create(cr, uid, vals, context=context) def update_address(self, cr, uid, ids, vals, context=None): @@ -369,18 +376,17 @@ class res_partner(osv.osv): email_regex = re.compile('([a-zA-Z0-9._%-]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9._]{1,8})') contact_regex_res = contact_regex.findall(name) email_regex_res = email_regex.findall(name) + email = False if contact_regex_res: name = contact_regex_res[0][0].rstrip(' ') # remove extra spaces on the right email = contact_regex_res[0][1] - rec_id = self.create(cr, uid, {self._rec_name: name, 'email': email}, context); - return self.name_get(cr, uid, [rec_id], context)[0] elif email_regex_res: email = '%s' % (email_regex_res[0]) - rec_id = self.create(cr, uid, {self._rec_name: email, 'email': email}, context); - return self.name_get(cr, uid, [rec_id], context)[0] else: - rec_id = super(res_partner, self).create(cr, uid, {self._rec_name: name}, context) - return self.name_get(cr, uid, [rec_id], context)[0] + pass + data = {self._rec_name: name, 'email': email} + rec_id = self.create(cr, uid, data, context); + return self.name_get(cr, uid, [rec_id], context)[0] def name_search(self, cr, uid, name, args=None, operator='ilike', context=None, limit=100): if not args: diff --git a/openerp/addons/base/res/res_partner_view.xml b/openerp/addons/base/res/res_partner_view.xml index 7e70e68c35c..a369be28dc9 100644 --- a/openerp/addons/base/res/res_partner_view.xml +++ b/openerp/addons/base/res/res_partner_view.xml @@ -95,7 +95,7 @@
- +