[IMP] contract_price_revision: black, isort, prettier

This commit is contained in:
Denis Roussel
2021-02-14 19:11:42 +01:00
parent fbf62c1036
commit 4569dcf841
9 changed files with 108 additions and 102 deletions

View File

@@ -3,22 +3,16 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
'name': 'Contract Price Revision',
'summary': 'Easy revision of contract prices',
'version': '12.0.1.0.1',
'category': 'Contract',
'author': 'Tecnativa, '
'Odoo Community Association (OCA)',
'license': 'AGPL-3',
'website': 'https://github.com/OCA/contract',
'depends': [
'contract',
],
'data': [
'views/contract_line.xml',
'wizards/contract_price_revision_views.xml',
],
'installable': True,
'development_status': 'Production/Stable',
'maintainers': ['carlosdauden'],
"name": "Contract Price Revision",
"summary": "Easy revision of contract prices",
"version": "12.0.1.0.1",
"category": "Contract",
"author": "Tecnativa, " "Odoo Community Association (OCA)",
"license": "AGPL-3",
"website": "https://github.com/OCA/contract",
"depends": ["contract",],
"data": ["views/contract_line.xml", "wizards/contract_price_revision_views.xml",],
"installable": True,
"development_status": "Production/Stable",
"maintainers": ["carlosdauden"],
}

View File

@@ -13,8 +13,7 @@ def migrate(env, version):
"""
Update values from old previous_revision_id to predecessor_contract_line_id
"""
if not openupgrade.column_exists(
env.cr, 'contract_line', 'previous_revision_id'):
if not openupgrade.column_exists(env.cr, "contract_line", "previous_revision_id"):
return
_logger.info("previous_revision_id to predecessor_contract_line_id")

View File

@@ -3,29 +3,31 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
import odoo.addons.decimal_precision as dp
class ContractLine(models.Model):
_inherit = 'contract.line'
_inherit = "contract.line"
previous_price = fields.Float(
string='Previous price',
related='predecessor_contract_line_id.price_unit',
string="Previous price",
related="predecessor_contract_line_id.price_unit",
readonly=True,
)
variation_percent = fields.Float(
compute='_compute_variation_percent',
compute="_compute_variation_percent",
store=True,
digits=dp.get_precision('Product Price'),
string='Variation %',
digits=dp.get_precision("Product Price"),
string="Variation %",
)
@api.depends('price_unit', 'predecessor_contract_line_id.price_unit')
@api.depends("price_unit", "predecessor_contract_line_id.price_unit")
def _compute_variation_percent(self):
for line in self:
if line.price_unit and line.previous_price:
line.variation_percent = (
(line.price_unit / line.previous_price - 1) * 100)
line.price_unit / line.previous_price - 1
) * 100
else:
line.variation_percent = 0.0

View File

@@ -6,32 +6,36 @@ from odoo.addons.contract.tests.test_contract import TestContractBase
class TestContractPriceRevision(TestContractBase):
def execute_wizard(self):
wizard = self.env['contract.price.revision.wizard'].create({
'date_start': '2018-02-15',
'variation_percent': 100.0,
})
wizard.with_context(
{'active_ids': [self.contract.id]}).action_apply()
wizard = self.env["contract.price.revision.wizard"].create(
{"date_start": "2018-02-15", "variation_percent": 100.0,}
)
wizard.with_context({"active_ids": [self.contract.id]}).action_apply()
def test_contract_price_revision_wizard(self):
# This is for checking if this line is not versioned
self.acct_line.copy({'automatic_price': True})
self.acct_line.copy({"automatic_price": True})
self.assertEqual(len(self.contract.contract_line_ids.ids), 2)
self.execute_wizard()
self.assertEqual(len(self.contract.contract_line_ids.ids), 3)
lines = self.contract.contract_line_ids.filtered(
lambda x: x.price_unit == 200.0)
lambda x: x.price_unit == 200.0
)
self.assertEqual(len(lines), 1)
def test_contract_price_revision_invoicing(self):
self.acct_line.copy({'automatic_price': True})
self.acct_line.copy({"automatic_price": True})
self.execute_wizard()
invoice = self.contract.recurring_create_invoice()
invoices = self.env['account.invoice'].search([
('invoice_line_ids.contract_line_id', 'in',
self.contract.contract_line_ids.ids)])
invoices = self.env["account.invoice"].search(
[
(
"invoice_line_ids.contract_line_id",
"in",
self.contract.contract_line_ids.ids,
)
]
)
self.assertEqual(len(invoices), 1)
lines = invoice.invoice_line_ids
self.assertEqual(len(lines), 2)

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="contract_line_tree_view" model="ir.ui.view">
<field name="model">contract.line</field>
<field name="inherit_id" ref="contract.contract_line_tree_view" />
@@ -10,17 +9,17 @@
</field>
</field>
</record>
<record id="contract_line_form_view" model="ir.ui.view">
<field name="model">contract.line</field>
<field name="inherit_id" ref="contract.contract_line_form_view" />
<field name="arch" type="xml">
<field name="discount" position="after">
<field name="variation_percent"
<field
name="variation_percent"
groups="base.group_no_one"
attrs="{'invisible': [('predecessor_contract_line_id', '=', False)]}"/>
attrs="{'invisible': [('predecessor_contract_line_id', '=', False)]}"
/>
</field>
</field>
</record>
</odoo>

View File

@@ -5,60 +5,57 @@
from dateutil.relativedelta import relativedelta
from odoo import fields, models
import odoo.addons.decimal_precision as dp
class ContractPriceRevisionWizard(models.TransientModel):
""" Update contract price based on percentage variation """
_name = 'contract.price.revision.wizard'
_name = "contract.price.revision.wizard"
_description = "Wizard to update price based on percentage variation"
date_start = fields.Date(
required=True,
)
date_start = fields.Date(required=True,)
date_end = fields.Date()
variation_percent = fields.Float(
digits=dp.get_precision('Product Price'),
required=True,
string='Variation %',
digits=dp.get_precision("Product Price"), required=True, string="Variation %",
)
def action_apply(self):
ContractLine = self.env['contract.line']
active_ids = self.env.context.get('active_ids')
contracts = self.env['contract.contract'].browse(active_ids)
ContractLine = self.env["contract.line"]
active_ids = self.env.context.get("active_ids")
contracts = self.env["contract.contract"].browse(active_ids)
for line in self._get_contract_lines_to_revise(contracts):
line.update({
'date_end': self.date_start - relativedelta(days=1),
})
new_vals = line.copy_data({
'date_start': self.date_start,
'date_end': self.date_end,
'predecessor_contract_line_id': line.id,
'price_unit': line.price_unit * (
1.0 + self.variation_percent / 100.0),
})[0]
line.update(
{"date_end": self.date_start - relativedelta(days=1),}
)
new_vals = line.copy_data(
{
"date_start": self.date_start,
"date_end": self.date_end,
"predecessor_contract_line_id": line.id,
"price_unit": line.price_unit
* (1.0 + self.variation_percent / 100.0),
}
)[0]
tmp_line = ContractLine.new(new_vals)
tmp_line._onchange_date_start()
new_line = ContractLine.create(
tmp_line._convert_to_write(tmp_line._cache))
line.update({
'successor_contract_line_id': new_line.id,
})
action = self.env['ir.actions.act_window'].for_xml_id(
'contract', 'action_customer_contract')
action['domain'] = [('id', 'in', active_ids)]
new_line = ContractLine.create(tmp_line._convert_to_write(tmp_line._cache))
line.update(
{"successor_contract_line_id": new_line.id,}
)
action = self.env["ir.actions.act_window"].for_xml_id(
"contract", "action_customer_contract"
)
action["domain"] = [("id", "in", active_ids)]
return action
def _get_contract_lines_to_revise(self, contracts):
self.ensure_one()
to_revise = (
contracts.mapped("contract_line_ids")
.filtered(
to_revise = contracts.mapped("contract_line_ids").filtered(
lambda x: not x.automatic_price
and not x.successor_contract_line_id
and x.recurring_next_date
and (not x.date_end or x.date_end >= self.date_start)
)
)
return to_revise

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="contract_line_duplicate_wizard_view" model="ir.ui.view">
<field name="name">Create Revision Line</field>
<field name="model">contract.price.revision.wizard</field>
@@ -21,20 +20,25 @@
</group>
</group>
<footer>
<button string="Apply" name="action_apply"
type="object" class="oe_highlight"/>
<button
string="Apply"
name="action_apply"
type="object"
class="oe_highlight"
/>
<button string="Cancel" class="oe_link" special="cancel" />
</footer>
</form>
</field>
</record>
<act_window id="contract_line_duplicate_wizard_action"
<act_window
id="contract_line_duplicate_wizard_action"
name="Create revision of contract lines"
src_model="contract.contract"
res_model="contract.price.revision.wizard"
view_type="form" view_mode="form"
key2="client_action_multi" target="new"
view_type="form"
view_mode="form"
key2="client_action_multi"
target="new"
/>
</odoo>

View File

@@ -0,0 +1 @@
../../../../contract_price_revision

View File

@@ -0,0 +1,6 @@
import setuptools
setuptools.setup(
setup_requires=['setuptools-odoo'],
odoo_addon=True,
)