diff --git a/addons/account/models/account.py b/addons/account/models/account.py index d666b9df1df98ba6d5f1ca070de34cb012f588c0..a06a5bfd634701d50c1896f2fd45c655d06e8051 100644 --- a/addons/account/models/account.py +++ b/addons/account/models/account.py @@ -160,6 +160,13 @@ class AccountAccount(models.Model): for account in self: 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.')) + # 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) @api.multi diff --git a/addons/account/models/account_journal_dashboard.py b/addons/account/models/account_journal_dashboard.py index 118955b00bf7c71792bbf0f12a831cc76ecbe3c9..a76bb3c21e9b0740202c18f4341e49c4c2a70648 100644 --- a/addons/account/models/account_journal_dashboard.py +++ b/addons/account/models/account_journal_dashboard.py @@ -314,7 +314,7 @@ class account_journal(models.Model): }) ir_model_obj = self.pool['ir.model.data'] 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['domain'] = self._context.get('use_domain', []) return action @@ -357,7 +357,7 @@ class account_journal(models.Model): ctx.pop('group_by', None) ir_model_obj = self.pool['ir.model.data'] 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 if ctx.get('use_domain', False): action['domain'] = ['|', ('journal_id', '=', self.id), ('journal_id', '=', False)] diff --git a/addons/account_bank_statement_import/account_journal.py b/addons/account_bank_statement_import/account_journal.py index 7964ecc9aec2418a08157a6371a4aff6669dd3f2..eac0cdb71f29236c6369505d74d2d988eb093b3f 100644 --- a/addons/account_bank_statement_import/account_journal.py +++ b/addons/account_bank_statement_import/account_journal.py @@ -14,7 +14,7 @@ class AccountJournal(models.Model): action_name = 'action_account_bank_statement_import' 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) - 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 action.update({'context': (u"{'journal_id': " + str(self.id) + u"}")}) return action diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index 1282d35d3a963772d680ab7fa741e2acd67f609e..b34e9c32290af6d1da8a346cb75560121dd39020 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -1924,7 +1924,7 @@ exports.Order = Backbone.Model.extend({ }, initialize_validation_date: function () { - this.validation_date = this.validation_date || new Date(); + this.validation_date = new Date(); }, set_tip: function(tip) { diff --git a/addons/purchase_requisition/views/purchase_requisition_views.xml b/addons/purchase_requisition/views/purchase_requisition_views.xml index 6e3190dab07808f69e88b36e8f39b7be06d0164f..93a9c3f817e50c2872734c8175c60d11162a4ad4 100644 --- a/addons/purchase_requisition/views/purchase_requisition_views.xml +++ b/addons/purchase_requisition/views/purchase_requisition_views.xml @@ -139,7 +139,7 @@ <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="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'))]}"/> </group> </group> diff --git a/addons/sale_margin/views/sale_margin_view.xml b/addons/sale_margin/views/sale_margin_view.xml index fa9c56fe28a199d53ea20ab647686c865b3e5e15..b0da87326faec5a322508b8de41ae93da5634173 100644 --- a/addons/sale_margin/views/sale_margin_view.xml +++ b/addons/sale_margin/views/sale_margin_view.xml @@ -20,7 +20,7 @@ <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='order_line']/form//field[@name='price_unit']" position="after"> - <field name="purchase_price" groups="base.group_user" invisible="True"/> + <field name="purchase_price" groups="base.group_user"/> </xpath> </field> </record> diff --git a/doc/cla/individual/tiangolo.md b/doc/cla/individual/tiangolo.md new file mode 100644 index 0000000000000000000000000000000000000000..dfb1c19c218007de4848389bf3d7b16385d6765a --- /dev/null +++ b/doc/cla/individual/tiangolo.md @@ -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 diff --git a/doc/howtos/backend.rst b/doc/howtos/backend.rst index 4904c64618d82f858c52103276f126fd2222117a..b17fd684ec9c875c5e5c29db92cf0d49d5b81377 100644 --- a/doc/howtos/backend.rst +++ b/doc/howtos/backend.rst @@ -211,7 +211,7 @@ overridden by setting :attr:`~openerp.models.Model._rec_name`. .. 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:: @@ -255,7 +255,7 @@ be declared in the ``'data'`` list (always loaded) or in the ``'demo'`` list .. only:: solutions - Edit the file ``openacademy/demo.xml`` to include some data. + Edit the file ``openacademy/demo/demo.xml`` to include some data. .. patch:: @@ -484,7 +484,7 @@ client data; it is also related to its sale order line records. .. 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``. .. 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 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`` #. Create a file ``openacademy/views/partner.xml`` and add it to ``__openerp__.py`` diff --git a/openerp/addons/base/ir/ir_model.py b/openerp/addons/base/ir/ir_model.py index eb19a443ac8a7c3f7c4f8f4c7abd4d6e719af765..aa67546e346d724290dfacb55be0e28b51d95d51 100644 --- a/openerp/addons/base/ir/ir_model.py +++ b/openerp/addons/base/ir/ir_model.py @@ -1187,7 +1187,7 @@ class IrModelData(models.Model): self._cr.commit() - self.unlink() + datas.unlink() @api.model def _process_end(self, modules): diff --git a/openerp/models.py b/openerp/models.py index d04a95aa14989763bfc1502b308c3d2fd5426026..6329d30cbd787de14f9f273e3b2efdca2039a32b 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -1910,7 +1910,7 @@ class BaseModel(object): for order_part in orderby.split(','): order_split = order_part.split() 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': order_clause = self._generate_order_by(order_part, query).replace('ORDER BY ', '') diff --git a/openerp/tools/misc.py b/openerp/tools/misc.py index 2dbe2bad3824970c4a47a16c783ceac401991f6e..18f9dc1820564ff5ec1cfcb64c7e97ec5c48e51c 100644 --- a/openerp/tools/misc.py +++ b/openerp/tools/misc.py @@ -340,13 +340,13 @@ try: # add some sanitizations to respect the excel sheet name restrictions # as the sheet name is often translatable, can not control the input class PatchedWorkbook(xlwt.Workbook): - def add_sheet(self, name): + def add_sheet(self, name, cell_overwrite_ok=False): # invalid Excel character: []:*?/\ name = re.sub(r'[\[\]:*?/\\]', '', name) # maximum size is 31 characters 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