[MERGE] forward port branch 9.0 up to 6faf232

This commit is contained in:
Christophe Simonis
2016-10-12 16:56:44 +02:00
9 changed files with 30 additions and 12 deletions
+7
View File
@@ -160,6 +160,13 @@ class AccountAccount(models.Model):
for account in self: for account in self:
if (account.company_id.id <> vals['company_id']) and move_lines: if (account.company_id.id <> vals['company_id']) and move_lines:
raise UserError(_('You cannot change the owner company of an account that already contains journal items.')) raise UserError(_('You cannot change the owner company of an account that already contains journal items.'))
# If user change the reconcile flag, all aml should be recomputed for that account and this is very costly.
# So to prevent some bugs we add a constraint saying that you cannot change the reconcile field if there is any aml existing
# for that account.
if vals.get('reconcile'):
move_lines = self.env['account.move.line'].search([('account_id', 'in', self.ids)], limit=1)
if len(move_lines):
raise UserError(_('You cannot change the value of the reconciliation on this account as it already has some moves'))
return super(AccountAccount, self).write(vals) return super(AccountAccount, self).write(vals)
@api.multi @api.multi
@@ -314,7 +314,7 @@ class account_journal(models.Model):
}) })
ir_model_obj = self.pool['ir.model.data'] ir_model_obj = self.pool['ir.model.data']
model, action_id = ir_model_obj.get_object_reference(self._cr, self._uid, 'account', action_name) model, action_id = ir_model_obj.get_object_reference(self._cr, self._uid, 'account', action_name)
action = self.pool[model].read(self._cr, self._uid, action_id, context=self._context) action = self.pool[model].read(self._cr, self._uid, [action_id], context=self._context)[0]
action['context'] = ctx action['context'] = ctx
action['domain'] = self._context.get('use_domain', []) action['domain'] = self._context.get('use_domain', [])
return action return action
@@ -357,7 +357,7 @@ class account_journal(models.Model):
ctx.pop('group_by', None) ctx.pop('group_by', None)
ir_model_obj = self.pool['ir.model.data'] ir_model_obj = self.pool['ir.model.data']
model, action_id = ir_model_obj.get_object_reference(self._cr, self._uid, 'account', action_name) model, action_id = ir_model_obj.get_object_reference(self._cr, self._uid, 'account', action_name)
action = self.pool[model].read(self._cr, self._uid, action_id, context=self._context) action = self.pool[model].read(self._cr, self._uid, [action_id], context=self._context)[0]
action['context'] = ctx action['context'] = ctx
if ctx.get('use_domain', False): if ctx.get('use_domain', False):
action['domain'] = ['|', ('journal_id', '=', self.id), ('journal_id', '=', False)] action['domain'] = ['|', ('journal_id', '=', self.id), ('journal_id', '=', False)]
@@ -14,7 +14,7 @@ class AccountJournal(models.Model):
action_name = 'action_account_bank_statement_import' action_name = 'action_account_bank_statement_import'
ir_model_obj = self.pool['ir.model.data'] ir_model_obj = self.pool['ir.model.data']
model, action_id = ir_model_obj.get_object_reference(self._cr, self._uid, 'account_bank_statement_import', action_name) model, action_id = ir_model_obj.get_object_reference(self._cr, self._uid, 'account_bank_statement_import', action_name)
action = self.pool[model].read(self._cr, self._uid, action_id, context=self.env.context) action = self.pool[model].read(self._cr, self._uid, [action_id], context=self.env.context)[0]
# Note: this drops action['context'], which is a dict stored as a string, which is not easy to update # Note: this drops action['context'], which is a dict stored as a string, which is not easy to update
action.update({'context': (u"{'journal_id': " + str(self.id) + u"}")}) action.update({'context': (u"{'journal_id': " + str(self.id) + u"}")})
return action return action
+1 -1
View File
@@ -1810,7 +1810,7 @@ exports.Order = Backbone.Model.extend({
}, },
initialize_validation_date: function () { initialize_validation_date: function () {
this.validation_date = this.validation_date || new Date(); this.validation_date = new Date();
}, },
set_tip: function(tip) { set_tip: function(tip) {
@@ -139,7 +139,7 @@
<field name="ordering_date" attrs="{'readonly': [('state','not in',('draft','in_progress','open'))]}"/> <field name="ordering_date" attrs="{'readonly': [('state','not in',('draft','in_progress','open'))]}"/>
<field name="schedule_date" attrs="{'readonly': [('state','not in',('draft','in_progress','open'))]}"/> <field name="schedule_date" attrs="{'readonly': [('state','not in',('draft','in_progress','open'))]}"/>
<field name="origin" placeholder="e.g. PO0025" attrs="{'readonly': [('state', '!=', 'draft')]}"/> <field name="origin" placeholder="e.g. PO0025" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="picking_type_id" widget="selection" groups="stock.group_stock_adv_location" attrs="{'readonly': [('state', '!=', 'draft')]}"/> <field name="picking_type_id" widget="selection" groups="stock.group_adv_location" attrs="{'readonly': [('state', '!=', 'draft')]}"/>
<field name="company_id" groups="base.group_multi_company" options="{'no_create': True}" attrs="{'readonly': [('state','not in',('draft'))]}"/> <field name="company_id" groups="base.group_multi_company" options="{'no_create': True}" attrs="{'readonly': [('state','not in',('draft'))]}"/>
</group> </group>
</group> </group>
+11
View File
@@ -0,0 +1,11 @@
Colombia, 2016-10-04
I hereby agree to the terms of the Odoo Individual Contributor License
Agreement v1.0.
I declare that I am authorized and able to make this agreement and sign this
declaration.
Signed,
Sebastián Ramírez tiangolo@gmail.com https://github.com/tiangolo
+4 -4
View File
@@ -211,7 +211,7 @@ overridden by setting :attr:`~openerp.models.Model._rec_name`.
.. only:: solutions .. only:: solutions
Edit the file ``openacademy/models.py`` to include a *Course* class. Edit the file ``openacademy/models/models.py`` to include a *Course* class.
.. patch:: .. patch::
@@ -255,7 +255,7 @@ be declared in the ``'data'`` list (always loaded) or in the ``'demo'`` list
.. only:: solutions .. only:: solutions
Edit the file ``openacademy/demo.xml`` to include some data. Edit the file ``openacademy/demo/demo.xml`` to include some data.
.. patch:: .. patch::
@@ -484,7 +484,7 @@ client data; it is also related to its sale order line records.
.. only:: solutions .. only:: solutions
#. Create the class *Session* in ``openacademy/models.py``. #. Create the class *Session* in ``openacademy/models/models.py``.
#. Add access to the session object in ``openacademy/view/openacademy.xml``. #. Add access to the session object in ``openacademy/view/openacademy.xml``.
.. patch:: .. patch::
@@ -684,7 +684,7 @@ instead of a single view its ``arch`` field is composed of any number of
inspect the view, find its external ID and the place to put the inspect the view, find its external ID and the place to put the
new field. new field.
#. Create a file ``openacademy/partner.py`` and import it in #. Create a file ``openacademy/models/partner.py`` and import it in
``__init__.py`` ``__init__.py``
#. Create a file ``openacademy/views/partner.xml`` and add it to #. Create a file ``openacademy/views/partner.xml`` and add it to
``__openerp__.py`` ``__openerp__.py``
+1 -1
View File
@@ -2022,7 +2022,7 @@ class BaseModel(object):
for order_part in orderby.split(','): for order_part in orderby.split(','):
order_split = order_part.split() order_split = order_part.split()
order_field = order_split[0] order_field = order_split[0]
if order_field in groupby_fields: if order_field == 'id' or order_field in groupby_fields:
if self._fields[order_field.split(':')[0]].type == 'many2one': if self._fields[order_field.split(':')[0]].type == 'many2one':
order_clause = self._generate_order_by(order_part, query).replace('ORDER BY ', '') order_clause = self._generate_order_by(order_part, query).replace('ORDER BY ', '')
+2 -2
View File
@@ -340,13 +340,13 @@ try:
# add some sanitizations to respect the excel sheet name restrictions # add some sanitizations to respect the excel sheet name restrictions
# as the sheet name is often translatable, can not control the input # as the sheet name is often translatable, can not control the input
class PatchedWorkbook(xlwt.Workbook): class PatchedWorkbook(xlwt.Workbook):
def add_sheet(self, name): def add_sheet(self, name, cell_overwrite_ok=False):
# invalid Excel character: []:*?/\ # invalid Excel character: []:*?/\
name = re.sub(r'[\[\]:*?/\\]', '', name) name = re.sub(r'[\[\]:*?/\\]', '', name)
# maximum size is 31 characters # maximum size is 31 characters
name = name[:31] name = name[:31]
return super(PatchedWorkbook, self).add_sheet(name) return super(PatchedWorkbook, self).add_sheet(name, cell_overwrite_ok=cell_overwrite_ok)
xlwt.Workbook = PatchedWorkbook xlwt.Workbook = PatchedWorkbook