[MERGE] forward port branch saas-12 up to 27dc061
This commit is contained in:
@@ -178,6 +178,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
|
||||||
|
|||||||
@@ -92,11 +92,12 @@ class ReportAgedPartnerBalance(models.AbstractModel):
|
|||||||
for partial_line in line.matched_credit_ids:
|
for partial_line in line.matched_credit_ids:
|
||||||
if partial_line.create_date[:10] <= date_from:
|
if partial_line.create_date[:10] <= date_from:
|
||||||
line_amount -= partial_line.amount
|
line_amount -= partial_line.amount
|
||||||
undue_amounts[partner_id] += line_amount
|
if not self.env.user.company_id.currency_id.is_zero(line_amount):
|
||||||
lines[partner_id].append({
|
undue_amounts[partner_id] += line_amount
|
||||||
'line': line,
|
lines[partner_id].append({
|
||||||
'amount': line_amount,
|
'line': line,
|
||||||
'period': 6,
|
'amount': line_amount,
|
||||||
|
'period': 6,
|
||||||
})
|
})
|
||||||
|
|
||||||
# Use one query per period and store results in history (a list variable)
|
# Use one query per period and store results in history (a list variable)
|
||||||
@@ -144,12 +145,13 @@ class ReportAgedPartnerBalance(models.AbstractModel):
|
|||||||
if partial_line.create_date[:10] <= date_from:
|
if partial_line.create_date[:10] <= date_from:
|
||||||
line_amount -= partial_line.amount
|
line_amount -= partial_line.amount
|
||||||
|
|
||||||
partners_amount[partner_id] += line_amount
|
if not self.env.user.company_id.currency_id.is_zero(line_amount):
|
||||||
lines[partner_id].append({
|
partners_amount[partner_id] += line_amount
|
||||||
'line': line,
|
lines[partner_id].append({
|
||||||
'amount': line_amount,
|
'line': line,
|
||||||
'period': i + 1,
|
'amount': line_amount,
|
||||||
})
|
'period': i + 1,
|
||||||
|
})
|
||||||
history.append(partners_amount)
|
history.append(partners_amount)
|
||||||
|
|
||||||
for partner in partners:
|
for partner in partners:
|
||||||
|
|||||||
@@ -339,7 +339,8 @@ class HrExpense(models.Model):
|
|||||||
'product_id': product.id,
|
'product_id': product.id,
|
||||||
'product_uom_id': product.uom_id.id,
|
'product_uom_id': product.uom_id.id,
|
||||||
'quantity': 1,
|
'quantity': 1,
|
||||||
'unit_amount': price
|
'unit_amount': price,
|
||||||
|
'company_id': employee.company_id.id,
|
||||||
})
|
})
|
||||||
return super(HrExpense, self).message_new(msg_dict, custom_values)
|
return super(HrExpense, self).message_new(msg_dict, custom_values)
|
||||||
|
|
||||||
|
|||||||
@@ -1924,7 +1924,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>
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<field name="inherit_id" ref="sale.view_order_form"/>
|
<field name="inherit_id" ref="sale.view_order_form"/>
|
||||||
<field name="arch" type="xml">
|
<field name="arch" type="xml">
|
||||||
<xpath expr="//field[@name='order_line']/form//field[@name='price_unit']" position="after">
|
<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>
|
</xpath>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -211,7 +211,7 @@ overridden by setting :attr:`~odoo.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
|
||||||
``__manifest__.py``
|
``__manifest__.py``
|
||||||
|
|||||||
@@ -1276,7 +1276,7 @@ class IrModelData(models.Model):
|
|||||||
|
|
||||||
self._cr.commit()
|
self._cr.commit()
|
||||||
|
|
||||||
self.unlink()
|
datas.unlink()
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _process_end(self, modules):
|
def _process_end(self, modules):
|
||||||
|
|||||||
+1
-1
@@ -1728,7 +1728,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
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user