[IMP] contract: black, isort, prettier

This commit is contained in:
Francisco Ivan Anton Prieto
2021-04-01 14:02:43 +02:00
parent 9b6f790dc1
commit 5e22708411
17 changed files with 191 additions and 75 deletions

View File

@@ -15,7 +15,7 @@
"category": "Contract Management",
"license": "AGPL-3",
"author": "Tecnativa, ACSONE SA/NV, Odoo Community Association (OCA)",
"website": "https://github.com/oca/contract",
"website": "https://github.com/OCA/contract",
"depends": ["base", "account", "product", "portal"],
"external_dependencies": {"python": ["dateutil"]},
"data": [

View File

@@ -34,7 +34,9 @@ class ContractAbstractContractLine(models.AbstractModel):
inverse="_inverse_price_unit",
)
price_subtotal = fields.Float(
compute="_compute_price_subtotal", digits="Account", string="Sub Total",
compute="_compute_price_subtotal",
digits="Account",
string="Sub Total",
)
discount = fields.Float(
string="Discount (%)",
@@ -69,13 +71,18 @@ class ContractAbstractContractLine(models.AbstractModel):
copy=True,
)
date_start = fields.Date(
compute="_compute_date_start", store=True, readonly=False, copy=True,
compute="_compute_date_start",
store=True,
readonly=False,
copy=True,
)
last_date_invoiced = fields.Date(string="Last Date Invoiced")
is_canceled = fields.Boolean(string="Canceled", default=False)
is_auto_renew = fields.Boolean(string="Auto Renew", default=False)
auto_renew_interval = fields.Integer(
default=1, string="Renew Every", help="Renew every (Days/Week/Month/Year)",
default=1,
string="Renew Every",
help="Renew every (Days/Week/Month/Year)",
)
auto_renew_rule_type = fields.Selection(
[
@@ -184,7 +191,10 @@ class ContractAbstractContractLine(models.AbstractModel):
).property_product_pricelist
)
product = line.product_id.with_context(
quantity=line.env.context.get("contract_line_qty", line.quantity,),
quantity=line.env.context.get(
"contract_line_qty",
line.quantity,
),
pricelist=pricelist.id,
partner=line.contract_id.partner_id.id,
date=line.env.context.get(

View File

@@ -25,10 +25,16 @@ class ContractContract(models.Model):
"portal.mixin",
]
active = fields.Boolean(default=True,)
code = fields.Char(string="Reference",)
active = fields.Boolean(
default=True,
)
code = fields.Char(
string="Reference",
)
group_id = fields.Many2one(
string="Group", comodel_name="account.analytic.account", ondelete="restrict",
string="Group",
comodel_name="account.analytic.account",
ondelete="restrict",
)
currency_id = fields.Many2one(
compute="_compute_currency_id",
@@ -36,7 +42,10 @@ class ContractContract(models.Model):
comodel_name="res.currency",
string="Currency",
)
manual_currency_id = fields.Many2one(comodel_name="res.currency", readonly=True,)
manual_currency_id = fields.Many2one(
comodel_name="res.currency",
readonly=True,
)
contract_template_id = fields.Many2one(
string="Contract Template", comodel_name="contract.template"
)
@@ -77,7 +86,9 @@ class ContractContract(models.Model):
ondelete="restrict",
)
invoice_partner_id = fields.Many2one(
string="Invoicing contact", comodel_name="res.partner", ondelete="restrict",
string="Invoicing contact",
comodel_name="res.partner",
ondelete="restrict",
)
partner_id = fields.Many2one(
comodel_name="res.partner", inverse="_inverse_partner_id", required=True
@@ -103,10 +114,16 @@ class ContractContract(models.Model):
tracking=True,
)
terminate_comment = fields.Text(
string="Termination Comment", readonly=True, copy=False, tracking=True,
string="Termination Comment",
readonly=True,
copy=False,
tracking=True,
)
terminate_date = fields.Date(
string="Termination Date", readonly=True, copy=False, tracking=True,
string="Termination Date",
readonly=True,
copy=False,
tracking=True,
)
modification_ids = fields.One2many(
comodel_name="contract.modification",
@@ -198,7 +215,15 @@ class ContractContract(models.Model):
invoices = (
self.env["account.move.line"]
.search([("contract_line_id", "in", self.contract_line_ids.ids,)])
.search(
[
(
"contract_line_id",
"in",
self.contract_line_ids.ids,
)
]
)
.mapped("move_id")
)
# we are forced to always search for this for not losing possible <=v11
@@ -221,7 +246,11 @@ class ContractContract(models.Model):
return currency or self.journal_id.currency_id or self.company_id.currency_id
@api.depends(
"manual_currency_id", "pricelist_id", "partner_id", "journal_id", "company_id",
"manual_currency_id",
"pricelist_id",
"partner_id",
"journal_id",
"company_id",
)
def _compute_currency_id(self):
for rec in self:
@@ -268,7 +297,8 @@ class ContractContract(models.Model):
contract.date_end = max(date_end)
@api.depends(
"contract_line_ids.recurring_next_date", "contract_line_ids.is_canceled",
"contract_line_ids.recurring_next_date",
"contract_line_ids.is_canceled",
)
def _compute_recurring_next_date(self):
for contract in self:

View File

@@ -22,7 +22,9 @@ class ContractLine(models.Model):
]
_order = "sequence,id"
sequence = fields.Integer(string="Sequence",)
sequence = fields.Integer(
string="Sequence",
)
contract_id = fields.Many2one(
comodel_name="contract.contract",
string="Contract",
@@ -32,10 +34,12 @@ class ContractLine(models.Model):
ondelete="cascade",
)
analytic_account_id = fields.Many2one(
string="Analytic account", comodel_name="account.analytic.account",
string="Analytic account",
comodel_name="account.analytic.account",
)
analytic_tag_ids = fields.Many2many(
comodel_name="account.analytic.tag", string="Analytic Tags",
comodel_name="account.analytic.tag",
string="Analytic Tags",
)
date_start = fields.Date(required=True)
date_end = fields.Date(compute="_compute_date_end", store=True, readonly=False)
@@ -132,13 +136,16 @@ class ContractLine(models.Model):
self._set_recurrence_field("date_end")
@api.depends(
"date_end", "termination_notice_rule_type", "termination_notice_interval",
"date_end",
"termination_notice_rule_type",
"termination_notice_interval",
)
def _compute_termination_notice_date(self):
for rec in self:
if rec.date_end:
rec.termination_notice_date = rec.date_end - self.get_relative_delta(
rec.termination_notice_rule_type, rec.termination_notice_interval,
rec.termination_notice_rule_type,
rec.termination_notice_interval,
)
else:
rec.termination_notice_date = False
@@ -412,7 +419,10 @@ class ContractLine(models.Model):
)
@api.onchange(
"date_start", "is_auto_renew", "auto_renew_rule_type", "auto_renew_interval",
"date_start",
"is_auto_renew",
"auto_renew_rule_type",
"auto_renew_interval",
)
def _onchange_is_auto_renew(self):
"""Date end should be auto-computed if a contract line is set to
@@ -420,7 +430,9 @@ class ContractLine(models.Model):
for rec in self.filtered("is_auto_renew"):
if rec.date_start:
rec.date_end = self._get_first_date_end(
rec.date_start, rec.auto_renew_rule_type, rec.auto_renew_interval,
rec.date_start,
rec.auto_renew_rule_type,
rec.auto_renew_interval,
)
@api.constrains("is_canceled", "is_auto_renew")
@@ -828,7 +840,10 @@ class ContractLine(models.Model):
post_message=False,
)
contract_line |= rec.plan_successor(
new_date_start, new_date_end, is_auto_renew, post_message=False,
new_date_start,
new_date_end,
is_auto_renew,
post_message=False,
)
else:
new_date_start = date_end + relativedelta(days=1)
@@ -847,7 +862,10 @@ class ContractLine(models.Model):
post_message=False,
)
contract_line |= rec.plan_successor(
new_date_start, new_date_end, is_auto_renew, post_message=False,
new_date_start,
new_date_end,
is_auto_renew,
post_message=False,
)
msg = _(
"""Contract line for <strong>{product}</strong>
@@ -856,7 +874,9 @@ class ContractLine(models.Model):
<br/>
- <strong>Suspension End</strong>: {new_date_end}
""".format(
product=rec.name, new_date_start=date_start, new_date_end=date_end,
product=rec.name,
new_date_start=date_start,
new_date_end=date_end,
)
)
rec.contract_id.message_post(body=msg)
@@ -1017,7 +1037,9 @@ class ContractLine(models.Model):
<br/>
- <strong>End</strong>: {new_date_end}
""".format(
product=rec.name, new_date_start=date_start, new_date_end=date_end,
product=rec.name,
new_date_start=date_start,
new_date_end=date_end,
)
)
rec.contract_id.message_post(body=msg)

View File

@@ -28,7 +28,8 @@ Criteria = namedtuple(
],
)
Allowed = namedtuple(
"Allowed", ["plan_successor", "stop_plan_successor", "stop", "cancel", "uncancel"],
"Allowed",
["plan_successor", "stop_plan_successor", "stop", "cancel", "uncancel"],
)

View File

@@ -19,7 +19,10 @@ class ContractModification(models.Model):
ondelete="cascade",
index=True,
)
sent = fields.Boolean(string="Sent", default=False,)
sent = fields.Boolean(
string="Sent",
default=False,
)
@api.model_create_multi
def create(self, vals_list):

View File

@@ -43,7 +43,9 @@ class ContractRecurrencyBasicMixin(models.AbstractModel):
),
)
recurring_interval = fields.Integer(
default=1, string="Invoice Every", help="Invoice every (Days/Week/Month/Year)",
default=1,
string="Invoice Every",
help="Invoice every (Days/Week/Month/Year)",
)
date_start = fields.Date(string="Date Start")
recurring_next_date = fields.Date(string="Date of Next Invoice")
@@ -80,10 +82,12 @@ class ContractRecurrencyMixin(models.AbstractModel):
)
date_end = fields.Date(string="Date End", index=True)
next_period_date_start = fields.Date(
string="Next Period Start", compute="_compute_next_period_date_start",
string="Next Period Start",
compute="_compute_next_period_date_start",
)
next_period_date_end = fields.Date(
string="Next Period End", compute="_compute_next_period_date_end",
string="Next Period End",
compute="_compute_next_period_date_end",
)
last_date_invoiced = fields.Date(
string="Last Date Invoiced", readonly=True, copy=False

View File

@@ -11,5 +11,7 @@ class ContractTag(models.Model):
name = fields.Char(required=True)
company_id = fields.Many2one(
"res.company", string="Company", default=lambda self: self.env.company.id,
"res.company",
string="Company",
default=lambda self: self.env.company.id,
)

View File

@@ -10,13 +10,17 @@ class ResPartner(models.Model):
_inherit = "res.partner"
sale_contract_count = fields.Integer(
string="Sale Contracts", compute="_compute_contract_count",
string="Sale Contracts",
compute="_compute_contract_count",
)
purchase_contract_count = fields.Integer(
string="Purchase Contracts", compute="_compute_contract_count",
string="Purchase Contracts",
compute="_compute_contract_count",
)
contract_ids = fields.One2many(
comodel_name="contract.contract", inverse_name="partner_id", string="Contracts",
comodel_name="contract.contract",
inverse_name="partner_id",
string="Contracts",
)
def _get_partner_contract_domain(self):

View File

@@ -539,7 +539,8 @@ class TestContract(TestContractBase):
self.contract.contract_template_id = self.template
self.assertFalse(
self.contract.contract_line_ids, "Recurring lines were not removed.",
self.contract.contract_line_ids,
"Recurring lines were not removed.",
)
self.contract.contract_template_id = self.template
self.contract._onchange_contract_template_id()
@@ -1627,7 +1628,8 @@ class TestContract(TestContractBase):
self.assertFalse(new_line.is_canceled)
self.assertEqual(self.acct_line.successor_contract_line_id, new_line)
self.assertEqual(
new_line.recurring_next_date, suspension_end + relativedelta(days=1),
new_line.recurring_next_date,
suspension_end + relativedelta(days=1),
)
def test_cancel_uncancel_with_predecessor_has_successor(self):
@@ -1737,7 +1739,8 @@ class TestContract(TestContractBase):
[("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)]
)
self.assertEqual(
len(contracts.mapped("contract_line_ids")), len(invoice_lines),
len(contracts.mapped("contract_line_ids")),
len(invoice_lines),
)
def test_contract_manually_create_invoice(self):
@@ -1764,7 +1767,8 @@ class TestContract(TestContractBase):
[("contract_line_id", "in", contracts.mapped("contract_line_ids").ids)]
)
self.assertEqual(
len(contracts.mapped("contract_line_ids")), len(invoice_lines),
len(contracts.mapped("contract_line_ids")),
len(invoice_lines),
)
invoices = self.env["account.move"].search(action["domain"])
self.assertFalse(invoice_lines.mapped("move_id") - invoices)
@@ -1776,19 +1780,22 @@ class TestContract(TestContractBase):
self.acct_line.recurring_rule_type = "monthlylastday"
self.acct_line.date_end = "2018-03-15"
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-01-05"))
self.assertEqual(last, to_date("2018-01-31"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-02-01"))
self.assertEqual(last, to_date("2018-02-28"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-03-01"))
self.assertEqual(last, to_date("2018-03-15"))
@@ -1800,7 +1807,8 @@ class TestContract(TestContractBase):
self.acct_line.recurring_rule_type = "monthlylastday"
self.acct_line.date_end = "2018-03-15"
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-01-05"))
self.assertEqual(last, to_date("2018-01-31"))
@@ -1808,7 +1816,8 @@ class TestContract(TestContractBase):
self.assertEqual(self.acct_line.recurring_next_date, to_date("2018-01-05"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-02-01"))
self.assertEqual(last, to_date("2018-02-28"))
@@ -1817,7 +1826,8 @@ class TestContract(TestContractBase):
self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-01-31"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-03-01"))
self.assertEqual(last, to_date("2018-03-15"))
@@ -1826,7 +1836,8 @@ class TestContract(TestContractBase):
self.assertEqual(self.acct_line.last_date_invoiced, to_date("2018-02-28"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertFalse(first)
self.assertFalse(last)
@@ -1841,13 +1852,15 @@ class TestContract(TestContractBase):
self.acct_line.date_end = "2018-08-15"
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-02-05"))
self.assertEqual(last, to_date("2018-03-04"))
self.acct_line.recurring_next_date = "2018-06-05"
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-02-05"))
self.assertEqual(last, to_date("2018-07-04"))
@@ -1859,13 +1872,15 @@ class TestContract(TestContractBase):
self.acct_line.date_end = "2018-08-15"
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-02-05"))
self.assertEqual(last, to_date("2018-03-04"))
self.acct_line.recurring_next_date = "2018-06-05"
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-02-05"))
self.assertEqual(last, to_date("2018-06-04"))
@@ -1876,19 +1891,22 @@ class TestContract(TestContractBase):
self.acct_line.recurring_rule_type = "monthly"
self.acct_line.date_end = "2018-03-15"
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-01-05"))
self.assertEqual(last, to_date("2018-02-04"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-02-05"))
self.assertEqual(last, to_date("2018-03-04"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-03-05"))
self.assertEqual(last, to_date("2018-03-15"))
@@ -1899,19 +1917,22 @@ class TestContract(TestContractBase):
self.acct_line.recurring_rule_type = "monthly"
self.acct_line.date_end = "2018-03-15"
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-01-05"))
self.assertEqual(last, to_date("2018-02-04"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-02-05"))
self.assertEqual(last, to_date("2018-03-04"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-03-05"))
self.assertEqual(last, to_date("2018-03-15"))
@@ -1922,19 +1943,22 @@ class TestContract(TestContractBase):
self.acct_line.recurring_rule_type = "yearly"
self.acct_line.date_end = "2020-03-15"
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-01-05"))
self.assertEqual(last, to_date("2019-01-04"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2019-01-05"))
self.assertEqual(last, to_date("2020-01-04"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2020-01-05"))
self.assertEqual(last, to_date("2020-03-15"))
@@ -1945,19 +1969,22 @@ class TestContract(TestContractBase):
self.acct_line.recurring_rule_type = "yearly"
self.acct_line.date_end = "2020-03-15"
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2018-01-05"))
self.assertEqual(last, to_date("2019-01-04"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2019-01-05"))
self.assertEqual(last, to_date("2020-01-04"))
self.contract.recurring_create_invoice()
first, last, recurring_next_date = self.acct_line._get_period_to_invoice(
self.acct_line.last_date_invoiced, self.acct_line.recurring_next_date,
self.acct_line.last_date_invoiced,
self.acct_line.recurring_next_date,
)
self.assertEqual(first, to_date("2020-01-05"))
self.assertEqual(last, to_date("2020-03-15"))
@@ -2302,7 +2329,9 @@ class TestContract(TestContractBase):
group_can_terminate_contract.users |= self.env.user
with self.assertRaises(ValidationError):
self.contract._terminate_contract(
self.terminate_reason, "terminate_comment", to_date("2018-02-13"),
self.terminate_reason,
"terminate_comment",
to_date("2018-02-13"),
)
def test_recurrency_propagation(self):

View File

@@ -24,7 +24,8 @@ class TestContractPortal(odoo.tests.HttpCase):
self.authenticate("portal", "portal")
http.root.session_store.save(self.session)
url_contract = "/my/contracts/{}?access_token={}".format(
contract.id, contract.access_token,
contract.id,
contract.access_token,
)
self.assertEqual(self.url_open(url=url_contract).status_code, 200)
contract.message_unsubscribe(partner_ids=user_portal.partner_id.ids)

View File

@@ -14,7 +14,8 @@ class ContractManuallyCreateInvoice(models.TransientModel):
compute="_compute_contract_to_invoice_ids"
)
contract_to_invoice_ids = fields.Many2many(
comodel_name="contract.contract", compute="_compute_contract_to_invoice_ids",
comodel_name="contract.contract",
compute="_compute_contract_to_invoice_ids",
)
contract_type = fields.Selection(
selection=[("sale", "Customer"), ("purchase", "Supplier")],

2
requirements.txt Normal file
View File

@@ -0,0 +1,2 @@
# generated from manifests external_dependencies
python-dateutil

View File

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

6
setup/contract/setup.py Normal file
View File

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