diff --git a/openerp/addons/base/ir/ir_actions.py b/openerp/addons/base/ir/ir_actions.py
index a130ab13a32..aaaa8513925 100644
--- a/openerp/addons/base/ir/ir_actions.py
+++ b/openerp/addons/base/ir/ir_actions.py
@@ -657,7 +657,7 @@ class actions_server(osv.osv):
if action.state=='client_action':
if not action.action_id:
- raise osv.except_osv(_('Error'), _("Please specify an action to launch !"))
+ raise osv.except_osv(_('Error'), _("Please specify an action to launch!"))
return self.pool[action.action_id.type].read(cr, uid, action.action_id.id, context=context)
if action.state=='code':
diff --git a/openerp/addons/base/ir/ir_actions.xml b/openerp/addons/base/ir/ir_actions.xml
index 82514692c06..145627058ef 100644
--- a/openerp/addons/base/ir/ir_actions.xml
+++ b/openerp/addons/base/ir/ir_actions.xml
@@ -297,7 +297,7 @@
Property multi-company
-
+
['|',('company_id','child_of',[user.company_id.id]),('company_id','=',False)]
diff --git a/openerp/addons/base/ir/ir_filters.xml b/openerp/addons/base/ir/ir_filters.xml
index 72c5dad8885..88cc4b9838a 100644
--- a/openerp/addons/base/ir/ir_filters.xml
+++ b/openerp/addons/base/ir/ir_filters.xml
@@ -4,7 +4,7 @@
ir.filters.owner
-
+
[('user_id','in',[False,user.id])]
diff --git a/openerp/addons/base/ir/ir_mail_server.py b/openerp/addons/base/ir/ir_mail_server.py
index 0ca587f42ab..0805a5f8891 100644
--- a/openerp/addons/base/ir/ir_mail_server.py
+++ b/openerp/addons/base/ir/ir_mail_server.py
@@ -213,14 +213,14 @@ class ir_mail_server(osv.osv):
password=smtp_server.smtp_pass, encryption=smtp_server.smtp_encryption,
smtp_debug=smtp_server.smtp_debug)
except Exception, e:
- raise osv.except_osv(_("Connection test failed!"), _("Here is what we got instead:\n %s") % tools.ustr(e))
+ raise osv.except_osv(_("Connection Test Failed!"), _("Here is what we got instead:\n %s") % tools.ustr(e))
finally:
try:
if smtp: smtp.quit()
except Exception:
# ignored, just a consequence of the previous exception
pass
- raise osv.except_osv(_("Connection test succeeded!"), _("Everything seems properly set up!"))
+ raise osv.except_osv(_("Connection Test Succeeded!"), _("Everything seems properly set up!"))
def connect(self, host, port, user=None, password=None, encryption=False, smtp_debug=False):
"""Returns a new SMTP connection to the give SMTP server, authenticated
diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py
index 222d8f34c9c..165fd8a4be9 100644
--- a/openerp/addons/base/ir/ir_model.py
+++ b/openerp/addons/base/ir/ir_model.py
@@ -82,7 +82,7 @@ class ir_model(osv.osv):
return []
__, operator, value = domain[0]
if operator not in ['=', '!=']:
- raise osv.except_osv(_('Invalid search criterions'), _('The osv_memory field can only be compared with = and != operator.'))
+ raise osv.except_osv(_("Invalid Search Criteria"), _('The osv_memory field can only be compared with = and != operator.'))
value = bool(value) if operator == '=' else not bool(value)
all_model_ids = self.search(cr, uid, [], context=context)
is_osv_mem = self._is_osv_memory(cr, uid, all_model_ids, 'osv_memory', arg=None, context=context)
diff --git a/openerp/addons/base/ir/ir_values.py b/openerp/addons/base/ir/ir_values.py
index dd8501230ec..a21b034d1b0 100644
--- a/openerp/addons/base/ir/ir_values.py
+++ b/openerp/addons/base/ir/ir_values.py
@@ -411,8 +411,8 @@ class ir_values(osv.osv):
(tuple(groups), uid))
if not cr.fetchone():
if action['name'] == 'Menuitem':
- raise osv.except_osv('Error !',
- 'You do not have the permission to perform this operation !!!')
+ raise osv.except_osv('Error!',
+ 'You do not have the permission to perform this operation!!!')
continue
# keep only the first action registered for each action name
results[action['name']] = (action['id'], action['name'], action_def)
diff --git a/openerp/addons/base/ir/workflow/workflow.py b/openerp/addons/base/ir/workflow/workflow.py
index 0ce951940a9..a7e792072e3 100644
--- a/openerp/addons/base/ir/workflow/workflow.py
+++ b/openerp/addons/base/ir/workflow/workflow.py
@@ -94,7 +94,7 @@ class wkf_activity(osv.osv):
def unlink(self, cr, uid, ids, context=None):
if context is None: context = {}
if not context.get('_force_unlink') and self.pool.get('workflow.workitem').search(cr, uid, [('act_id', 'in', ids)]):
- raise osv.except_osv(_('Operation forbidden'),
+ raise osv.except_osv(_('Operation Forbidden'),
_('Please make sure no workitems refer to an activity before deleting it!'))
super(wkf_activity, self).unlink(cr, uid, ids, context=context)
diff --git a/openerp/addons/base/module/module_data.xml b/openerp/addons/base/module/module_data.xml
index 247c2caa145..f59de0af973 100644
--- a/openerp/addons/base/module/module_data.xml
+++ b/openerp/addons/base/module/module_data.xml
@@ -84,6 +84,12 @@
11
+
+ Survey
+ Lets you create, send, share and answer to surveys.
+ 11
+
+
Marketing
Helps you manage your marketing campaigns step by step.
@@ -132,11 +138,11 @@
-
+
-
+
diff --git a/openerp/addons/base/module/wizard/base_module_import.py b/openerp/addons/base/module/wizard/base_module_import.py
index 67408b60669..61694d5f8c3 100644
--- a/openerp/addons/base/module/wizard/base_module_import.py
+++ b/openerp/addons/base/module/wizard/base_module_import.py
@@ -55,7 +55,7 @@ class base_module_import(osv.osv_memory):
try:
file_data = zipfile.ZipFile(fp, 'r')
except zipfile.BadZipfile:
- raise osv.except_osv(_('Error !'), _('File is not a zip file!'))
+ raise osv.except_osv(_('Error!'), _('File is not a zip file!'))
init_file_name = sorted(file_data.namelist())[0]
module_name = os.path.split(init_file_name)[0]
@@ -63,8 +63,8 @@ class base_module_import(osv.osv_memory):
try:
zip_file = open(file_path, 'wb')
except IOError:
- raise osv.except_osv(_('Error !'),
- _('Can not create the module file: %s !') % \
+ raise osv.except_osv(_('Error!'),
+ _('Can not create the module file: %s!') % \
(file_path,) )
zip_file.write(zip_data)
zip_file.close()
diff --git a/openerp/addons/base/module/wizard/base_module_upgrade.py b/openerp/addons/base/module/wizard/base_module_upgrade.py
index c081663d8ed..c75058ab835 100644
--- a/openerp/addons/base/module/wizard/base_module_upgrade.py
+++ b/openerp/addons/base/module/wizard/base_module_upgrade.py
@@ -81,7 +81,7 @@ class base_module_upgrade(osv.osv_memory):
(tuple(ids), ('uninstalled',)))
unmet_packages = [x[0] for x in cr.fetchall()]
if unmet_packages:
- raise osv.except_osv(_('Unmet dependency !'),
+ raise osv.except_osv(_('Unmet Dependency!'),
_('Following modules are not installed or unknown: %s') % ('\n\n' + '\n'.join(unmet_packages)))
ir_module.download(cr, uid, ids, context=context)
diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py
index 9abab79e46c..160e86fd8d2 100644
--- a/openerp/addons/base/res/res_lang.py
+++ b/openerp/addons/base/res/res_lang.py
@@ -182,11 +182,11 @@ class lang(osv.osv):
for language in languages:
ctx_lang = context.get('lang')
if language['code']=='en_US':
- raise osv.except_osv(_('User Error'), _("Base Language 'en_US' can not be deleted !"))
+ raise osv.except_osv(_('User Error'), _("Base Language 'en_US' can not be deleted!"))
if ctx_lang and (language['code']==ctx_lang):
- raise osv.except_osv(_('User Error'), _("You cannot delete the language which is User's Preferred Language !"))
+ raise osv.except_osv(_('User Error'), _("You cannot delete the language which is User's Preferred Language!"))
if language['active']:
- raise osv.except_osv(_('User Error'), _("You cannot delete the language which is Active !\nPlease de-activate the language first."))
+ raise osv.except_osv(_('User Error'), _("You cannot delete the language which is Active!\nPlease de-activate the language first."))
trans_obj = self.pool.get('ir.translation')
trans_ids = trans_obj.search(cr, uid, [('lang','=',language['code'])], context=context)
trans_obj.unlink(cr, uid, trans_ids, context=context)
diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py
index d140fe62ccc..01108939195 100644
--- a/openerp/addons/base/res/res_partner.py
+++ b/openerp/addons/base/res/res_partner.py
@@ -120,7 +120,7 @@ class res_partner_category(osv.osv):
res = self.name_get(cr, uid, ids, context=context)
return dict(res)
- _description = 'Partner Categories'
+ _description = 'Partner Tags'
_name = 'res.partner.category'
_columns = {
'name': fields.char('Category Name', required=True, size=64, translate=True),
@@ -259,8 +259,8 @@ class res_partner(osv.osv, format_address):
'street2': fields.char('Street2', size=128),
'zip': fields.char('Zip', change_default=True, size=24),
'city': fields.char('City', size=128),
- 'state_id': fields.many2one("res.country.state", 'State'),
- 'country_id': fields.many2one('res.country', 'Country'),
+ 'state_id': fields.many2one("res.country.state", 'State', ondelete='restrict'),
+ 'country_id': fields.many2one('res.country', 'Country', ondelete='restrict'),
'country': fields.related('country_id', type='many2one', relation='res.country', string='Country',
deprecated="This field will be removed as of OpenERP 7.1, use country_id instead"),
'email': fields.char('Email', size=240),
@@ -575,7 +575,7 @@ class res_partner(osv.osv, format_address):
context = {}
name, email = self._parse_partner_name(name, context=context)
if context.get('force_email') and not email:
- raise osv.except_osv(_('Warning'), _("Couldn't create contact without email address !"))
+ raise osv.except_osv(_('Warning'), _("Couldn't create contact without email address!"))
if not name and email:
name = email
rec_id = self.create(cr, uid, {self._rec_name: name or email, 'email': email or False}, context=context)
diff --git a/openerp/addons/base/res/res_partner_view.xml b/openerp/addons/base/res/res_partner_view.xml
index 9755d78a7ca..ccf74206967 100644
--- a/openerp/addons/base/res/res_partner_view.xml
+++ b/openerp/addons/base/res/res_partner_view.xml
@@ -139,7 +139,7 @@
@@ -188,7 +188,7 @@
-
+
@@ -288,6 +288,7 @@
+
@@ -512,10 +513,10 @@
- Partner Categories
+ Partner Tags
res.partner.category
-
- Partner Categories
+ Partner Tags
res.partner.category
-
+
@@ -539,7 +540,7 @@
res.partner.category
child_ids
-
+
@@ -558,7 +559,7 @@
-->
- Partner Categories
+ Partner Tags
res.partner
form
tree,form
@@ -575,11 +576,11 @@
- Partner Categories
+ Partner Tags
ir.actions.act_window
res.partner.category
form
- Manage the partner categories in order to better classify them for tracking and analysis purposes. A partner may belong to several categories and categories have a hierarchy structure: a partner belonging to a category also belong to his parent category.
+ Manage the partner tags to better classify them for tracking and analysis purposes. A partner may have several tags and tags have a hierarchical structure: a partner with a tag has also the parent tags.
diff --git a/openerp/addons/base/res/res_security.xml b/openerp/addons/base/res/res_security.xml
index 783243411ef..0c8c0202d60 100644
--- a/openerp/addons/base/res/res_security.xml
+++ b/openerp/addons/base/res/res_security.xml
@@ -16,7 +16,7 @@
company rule
-
+
[('id','child_of',[user.company_id.id])]
@@ -25,7 +25,7 @@
user rule
-
+
[('company_ids','child_of',[user.company_id.id])]
diff --git a/openerp/addons/base/res/res_users_view.xml b/openerp/addons/base/res/res_users_view.xml
index 81be40bd3ad..20106fa48f7 100644
--- a/openerp/addons/base/res/res_users_view.xml
+++ b/openerp/addons/base/res/res_users_view.xml
@@ -187,7 +187,7 @@
-
+
@@ -255,7 +255,7 @@
diff --git a/openerp/import_xml.rng b/openerp/import_xml.rng
index 5f4c40b65d3..716a525b496 100644
--- a/openerp/import_xml.rng
+++ b/openerp/import_xml.rng
@@ -1,17 +1,18 @@
-
+
-
-
-
-
-
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
@@ -125,19 +126,66 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ char
+ file
+
+
-
-
+
+
+ int
+
+
+ None
+
+
+
+ float
+
+
+
+
+
+ list
+ tuple
+
+
+
+
+
+
+
+ html
+ xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py
index 31b3bf5c807..d0a8e8e3a7e 100644
--- a/openerp/osv/orm.py
+++ b/openerp/osv/orm.py
@@ -282,6 +282,9 @@ class browse_null(object):
def __unicode__(self):
return u''
+ def __iter__(self):
+ raise NotImplementedError("Iteration is not allowed on %s" % self)
+
#
# TODO: execute an object method on browse_record_list
@@ -2971,7 +2974,7 @@ class BaseModel(object):
update_custom_fields = context.get('update_custom_fields', False)
self._field_create(cr, context=context)
create = not self._table_exist(cr)
- if getattr(self, '_auto', True):
+ if self._auto:
if create:
self._create_table(cr)
@@ -3205,7 +3208,8 @@ class BaseModel(object):
cr.commit() # start a new transaction
- self._add_sql_constraints(cr)
+ if self._auto:
+ self._add_sql_constraints(cr)
if create:
self._execute_sql(cr)
diff --git a/openerp/service/db.py b/openerp/service/db.py
index a480b65440a..4901ceef4d6 100644
--- a/openerp/service/db.py
+++ b/openerp/service/db.py
@@ -197,7 +197,7 @@ def exp_drop(db_name):
return True
@contextlib.contextmanager
-def _set_pg_password_in_environment(self):
+def _set_pg_password_in_environment():
""" On systems where pg_restore/pg_dump require an explicit
password (i.e. when not connecting via unix sockets, and most
importantly on Windows), it is necessary to pass the PG user
@@ -213,10 +213,10 @@ def _set_pg_password_in_environment(self):
SaaS (giving SaaS users the super-admin password is not a good idea
anyway)
"""
- if os.environ.get('PGPASSWORD') or not tools.config['db_password']:
+ if os.environ.get('PGPASSWORD') or not openerp.tools.config['db_password']:
yield
else:
- os.environ['PGPASSWORD'] = tools.config['db_password']
+ os.environ['PGPASSWORD'] = openerp.tools.config['db_password']
try:
yield
finally:
diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py
index 1feea2f08d3..616abb23fa7 100644
--- a/openerp/tools/convert.py
+++ b/openerp/tools/convert.py
@@ -48,6 +48,7 @@ except:
from datetime import datetime, timedelta
+from dateutil.relativedelta import relativedelta
from lxml import etree
import misc
from config import config
@@ -86,7 +87,9 @@ def _get_idref(self, cr, uid, model_str, context, idref):
idref2 = dict(idref,
time=time,
DateTime=datetime,
+ datetime=datetime,
timedelta=timedelta,
+ relativedelta=relativedelta,
version=openerp.release.major_version,
ref=_ref(self, cr),
pytz=pytz)