donation_recurring: black, isort and other automatic reformatting

14.0
Alexis de Lattre 3 years ago
parent 03a9125ddd
commit b08cf6d2d1

@ -4,23 +4,21 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
{
'name': 'Donation Recurring',
'version': '14.0.1.0.0',
'category': 'Accounting',
'license': 'AGPL-3',
'summary': 'Manage recurring donations',
'author': 'Barroux Abbey, Akretion, Odoo Community Association (OCA)',
'website': 'https://github.com/OCA/donation',
'depends': [
'donation',
"name": "Donation Recurring",
"version": "14.0.1.0.0",
"category": "Accounting",
"license": "AGPL-3",
"summary": "Manage recurring donations",
"author": "Barroux Abbey, Akretion, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/donation",
"depends": [
"donation",
],
'data': [
'views/donation.xml',
'wizard/donation_recurring_generate_view.xml',
'security/ir.model.access.csv',
"data": [
"views/donation.xml",
"wizard/donation_recurring_generate_view.xml",
"security/ir.model.access.csv",
],
'demo': [
'demo/donation_recurring_demo.xml'
],
'installable': True,
"demo": ["demo/donation_recurring_demo.xml"],
"installable": True,
}

@ -1,42 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
Copyright 2014-2021 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo noupdate="1">
<record id="donor_rec1" model="res.partner">
<field name="name">Emilie Legrand</field>
<field name="donor_rank" eval="1"/>
<field name="donor_rank" eval="1" />
<field name="street">24 chemin des oliviers</field>
<field name="zip">74210</field>
<field name="city">Seythenex</field>
<field name="country_id" ref="base.fr"/>
<field name="country_id" ref="base.fr" />
<field name="email">emilie.legrand@laposte.example.com</field>
<field name="tax_receipt_option">annual</field>
</record>
<record id="donor_rec2" model="res.partner">
<field name="name">Marie Durand</field>
<field name="donor_rank" eval="1"/>
<field name="donor_rank" eval="1" />
<field name="street">9 avenue du Général de Lattre</field>
<field name="zip">75017</field>
<field name="city">Paris</field>
<field name="country_id" ref="base.fr"/>
<field name="country_id" ref="base.fr" />
<field name="email">marie.durand@free.example.com</field>
<field name="tax_receipt_option">annual</field>
</record>
<record id="donor_rec3" model="res.partner">
<field name="name">Olivier Dumesnil</field>
<field name="donor_rank" eval="1"/>
<field name="donor_rank" eval="1" />
<field name="street">9 avenue Foch</field>
<field name="zip">92400</field>
<field name="city">Courbevoie</field>
<field name="country_id" ref="base.fr"/>
<field name="country_id" ref="base.fr" />
<field name="email">olivier.dumesnil@free.example.com</field>
<field name="tax_receipt_option">annual</field>
</record>

@ -3,82 +3,85 @@
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields, api, _
from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class DonationDonation(models.Model):
_inherit = 'donation.donation'
_inherit = "donation.donation"
recurring_template = fields.Selection([
('active', 'Active'),
('suspended', 'Suspended')],
string='Recurring Template',
recurring_template = fields.Selection(
[("active", "Active"), ("suspended", "Suspended")],
string="Recurring Template",
copy=False,
index=True,
tracking=True,
)
source_recurring_id = fields.Many2one(
'donation.donation',
string='Source Recurring Template',
states={'done': [('readonly', True)]}
"donation.donation",
string="Source Recurring Template",
states={"done": [("readonly", True)]},
)
recurring_donation_ids = fields.One2many(
'donation.donation',
'source_recurring_id',
string='Past Recurring Donations',
"donation.donation",
"source_recurring_id",
string="Past Recurring Donations",
readonly=True,
copy=False
copy=False,
)
@api.constrains(
'recurring_template', 'source_recurring_id', 'state',
'tax_receipt_option')
"recurring_template", "source_recurring_id", "state", "tax_receipt_option"
)
def _check_recurring_donation(self):
for donation in self:
if donation.recurring_template and donation.state != 'draft':
raise ValidationError(_(
"The recurring donation template %s must stay in "
"draft state.") % donation.number)
if donation.recurring_template and donation.state != "draft":
raise ValidationError(
_("The recurring donation template %s must stay in " "draft state.")
% donation.number
)
if donation.source_recurring_id and donation.recurring_template:
raise ValidationError(_(
"The recurring donation template %s cannot have "
"a Source Recurring Template")
% donation.number)
if (
donation.recurring_template and
donation.tax_receipt_option == 'each'):
raise ValidationError(_(
"The recurring donation %s cannot have a tax "
"receipt option 'Each'.")
% donation.number)
raise ValidationError(
_(
"The recurring donation template %s cannot have "
"a Source Recurring Template"
)
% donation.number
)
if donation.recurring_template and donation.tax_receipt_option == "each":
raise ValidationError(
_(
"The recurring donation %s cannot have a tax "
"receipt option 'Each'."
)
% donation.number
)
@api.depends('state', 'partner_id', 'move_id', 'recurring_template')
@api.depends("state", "partner_id", "move_id", "recurring_template")
def name_get(self):
res = []
for donation in self:
if donation.recurring_template == 'active':
name = _('Recurring Donation %s') % (
donation.number)
elif donation.recurring_template == 'suspended':
name = _('Suspended Recurring Donation %s') % (
donation.number)
if donation.recurring_template == "active":
name = _("Recurring Donation %s") % (donation.number)
elif donation.recurring_template == "suspended":
name = _("Suspended Recurring Donation %s") % (donation.number)
else:
name = super(DonationDonation, donation).name_get()[0][1]
res.append((donation.id, name))
return res
@api.onchange('recurring_template')
@api.onchange("recurring_template")
def recurring_template_change(self):
res = {'warning': {}}
if self.recurring_template and self.tax_receipt_option == 'each':
self.tax_receipt_option = 'annual'
res['warning']['title'] = _('Update of Tax Receipt Option')
res['warning']['message'] = _(
res = {"warning": {}}
if self.recurring_template and self.tax_receipt_option == "each":
self.tax_receipt_option = "annual"
res["warning"]["title"] = _("Update of Tax Receipt Option")
res["warning"]["message"] = _(
"As it is a recurring donation, "
"the Tax Receipt Option has been changed from Each to "
"Annual. You may want to change it also on the Donor "
"form.")
"form."
)
if not self.recurring_template and self.commercial_partner_id:
if self.commercial_partner_id.tax_receipt_option != self.tax_receipt_option:
self.tax_receipt_option = self.commercial_partner_id.tax_receipt_option
@ -86,10 +89,10 @@ class DonationDonation(models.Model):
def active2suspended(self):
self.ensure_one()
assert self.recurring_template == 'active'
self.write({'recurring_template': 'suspended'})
assert self.recurring_template == "active"
self.write({"recurring_template": "suspended"})
def suspended2active(self):
self.ensure_one()
assert self.recurring_template == 'suspended'
self.write({'recurring_template': 'active'})
assert self.recurring_template == "suspended"
self.write({"recurring_template": "active"})

@ -3,4 +3,3 @@
* Alexis de Lattre <alexis.delattre@akretion.com>
* Serpent Consulting Services Pvt. Ltd. <support@serpentcs.com>
* Nikul Chaudhary <nikul.chaudhary.serpentcs@gmail.com>

@ -3,10 +3,9 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import time
from odoo.tests.common import TransactionCase
from odoo import tools
from odoo.modules.module import get_resource_path
from odoo.exceptions import UserError
from odoo.tests.common import TransactionCase
class TestDonationRecurring(TransactionCase):
@ -16,77 +15,107 @@ class TestDonationRecurring(TransactionCase):
def setUp(self):
super().setUp()
self.bank_journal = self.env['account.journal'].create({
'type': 'bank',
'name': 'test bank journal',
})
self.payment_mode = self.env['account.payment.mode'].create({
'name': 'test_payment_mode',
'bank_account_link': 'fixed',
'fixed_journal_id': self.bank_journal.id,
'payment_method_id': self.env.ref('account.account_payment_method_manual_in').id,
})
self.product = self.env.ref(
'donation_base.product_product_donation')
self.ddo = self.env['donation.donation']
self.don_rec1 = self.ddo.create({
'check_total': 30,
'partner_id': self.env.ref('donation_recurring.donor_rec1').id,
'donation_date': time.strftime('%Y-01-01'),
'payment_mode_id': self.payment_mode.id,
'tax_receipt_option': 'annual',
'recurring_template': 'active',
'line_ids': [(0, 0, {
'product_id': self.product.id,
'quantity': 1,
'unit_price': 30,
})],
})
self.don_rec2 = self.ddo.create({
'check_total': 25,
'partner_id': self.env.ref('donation_recurring.donor_rec2').id,
'donation_date': time.strftime('%Y-01-01'),
'payment_mode_id': self.payment_mode.id,
'tax_receipt_option': 'annual',
'recurring_template': 'active',
'line_ids': [(0, 0, {
'product_id': self.product.id,
'quantity': 1,
'unit_price': 25,
})],
})
self.don_rec3 = self.ddo.create({
'check_total': 35,
'partner_id': self.env.ref('donation_recurring.donor_rec3').id,
'donation_date': time.strftime('%Y-01-01'),
'payment_mode_id': self.payment_mode.id,
'tax_receipt_option': 'annual',
'recurring_template': 'suspended',
'line_ids': [(0, 0, {
'product_id': self.product.id,
'quantity': 1,
'unit_price': 35,
})],
})
self.bank_journal = self.env["account.journal"].create(
{
"type": "bank",
"name": "test bank journal",
}
)
self.payment_mode = self.env["account.payment.mode"].create(
{
"name": "test_payment_mode",
"bank_account_link": "fixed",
"fixed_journal_id": self.bank_journal.id,
"payment_method_id": self.env.ref(
"account.account_payment_method_manual_in"
).id,
}
)
self.product = self.env.ref("donation_base.product_product_donation")
self.ddo = self.env["donation.donation"]
self.don_rec1 = self.ddo.create(
{
"check_total": 30,
"partner_id": self.env.ref("donation_recurring.donor_rec1").id,
"donation_date": time.strftime("%Y-01-01"),
"payment_mode_id": self.payment_mode.id,
"tax_receipt_option": "annual",
"recurring_template": "active",
"line_ids": [
(
0,
0,
{
"product_id": self.product.id,
"quantity": 1,
"unit_price": 30,
},
)
],
}
)
self.don_rec2 = self.ddo.create(
{
"check_total": 25,
"partner_id": self.env.ref("donation_recurring.donor_rec2").id,
"donation_date": time.strftime("%Y-01-01"),
"payment_mode_id": self.payment_mode.id,
"tax_receipt_option": "annual",
"recurring_template": "active",
"line_ids": [
(
0,
0,
{
"product_id": self.product.id,
"quantity": 1,
"unit_price": 25,
},
)
],
}
)
self.don_rec3 = self.ddo.create(
{
"check_total": 35,
"partner_id": self.env.ref("donation_recurring.donor_rec3").id,
"donation_date": time.strftime("%Y-01-01"),
"payment_mode_id": self.payment_mode.id,
"tax_receipt_option": "annual",
"recurring_template": "suspended",
"line_ids": [
(
0,
0,
{
"product_id": self.product.id,
"quantity": 1,
"unit_price": 35,
},
)
],
}
)
def test_donation_recurring(self):
wizard = self.env['donation.recurring.generate'].create(
{'payment_ref': 'Don Abbaye Sainte Madeleine'})
wizard = self.env["donation.recurring.generate"].create(
{"payment_ref": "Don Abbaye Sainte Madeleine"}
)
action = wizard.generate()
active_don_recs = self.don_rec1 + self.don_rec2
for don_rec in active_don_recs:
self.assertTrue(don_rec.recurring_donation_ids)
don = don_rec.recurring_donation_ids[0]
self.assertEqual(don.state, 'draft')
self.assertEqual(
don.payment_ref,
'Don Abbaye Sainte Madeleine')
self.assertEqual(don.state, "draft")
self.assertEqual(don.payment_ref, "Don Abbaye Sainte Madeleine")
self.assertEqual(don.campaign_id, don_rec.campaign_id)
self.assertFalse(self.don_rec3.recurring_donation_ids)
active_ids = action['domain'][0][2]
wizard_val = self.env['donation.validate'].with_context(
active_ids=active_ids, active_model='donation.donation').\
create({})
active_ids = action["domain"][0][2]
wizard_val = (
self.env["donation.validate"]
.with_context(active_ids=active_ids, active_model="donation.donation")
.create({})
)
with self.assertRaises(UserError):
wizard_val.run()
self.don_rec1.recurring_template_change()

@ -1,36 +1,59 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
Copyright 2014-2021 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="donation_form" model="ir.ui.view">
<field name="name">donation.recurring.form</field>
<field name="model">donation.donation</field>
<field name="inherit_id" ref="donation.donation_form"/>
<field name="inherit_id" ref="donation.donation_form" />
<field name="arch" type="xml">
<group name="other-right" position="inside">
<field name="recurring_template"
attrs="{'invisible': [('source_recurring_id', '!=', False)]}"/>
<field name="source_recurring_id"
attrs="{'invisible': [('recurring_template', '!=', False)]}"/>
<field
name="recurring_template"
attrs="{'invisible': [('source_recurring_id', '!=', False)]}"
/>
<field
name="source_recurring_id"
attrs="{'invisible': [('recurring_template', '!=', False)]}"
/>
</group>
<page name="lines" position="after">
<page name="recurring" string="History"
attrs="{'invisible': [('recurring_template', '=', False)]}">
<field name="recurring_donation_ids" nolabel="1"/>
<page
name="recurring"
string="History"
attrs="{'invisible': [('recurring_template', '=', False)]}"
>
<field name="recurring_donation_ids" nolabel="1" />
</page>
</page>
<button name="done2cancel" position="after">
<button name="active2suspended" type="object" string="Suspend" attrs="{'invisible': [('recurring_template', '!=', 'active')]}"/>
<button name="suspended2active" type="object" string="Re-activate" attrs="{'invisible': [('recurring_template', '!=', 'suspended')]}"/>
<button
name="active2suspended"
type="object"
string="Suspend"
attrs="{'invisible': [('recurring_template', '!=', 'active')]}"
groups="donation.group_donation_user"
/>
<button
name="suspended2active"
type="object"
string="Re-activate"
attrs="{'invisible': [('recurring_template', '!=', 'suspended')]}"
groups="donation.group_donation_user"
/>
</button>
<div class="oe_title" position="before">
<widget name="web_ribbon" title="Suspended" bg_color="bg-danger" attrs="{'invisible': [('recurring_template', '!=', 'suspended')]}"/>
<widget
name="web_ribbon"
title="Suspended"
bg_color="bg-danger"
attrs="{'invisible': [('recurring_template', '!=', 'suspended')]}"
/>
</div>
</field>
</record>
@ -38,11 +61,16 @@
<record id="donation_tree" model="ir.ui.view">
<field name="name">donation.recurring.tree</field>
<field name="model">donation.donation</field>
<field name="inherit_id" ref="donation.donation_tree"/>
<field name="arch" type="xml">
<field name="inherit_id" ref="donation.donation_tree" />
<field name="arch" type="xml">
<field name="state" position="after">
<field name="recurring_template"
invisible="not context.get('recurring_view')" widget="badge" decoration-danger="recurring_template == 'suspended'" decoration-info="recurring_template == 'active'"/>
<field
name="recurring_template"
invisible="not context.get('recurring_view')"
widget="badge"
decoration-danger="recurring_template == 'suspended'"
decoration-info="recurring_template == 'active'"
/>
</field>
</field>
</record>
@ -50,19 +78,25 @@
<record id="donation_search" model="ir.ui.view">
<field name="name">donation.search</field>
<field name="model">donation.donation</field>
<field name="inherit_id" ref="donation.donation_search"/>
<field name="arch" type="xml">
<field name="inherit_id" ref="donation.donation_search" />
<field name="arch" type="xml">
<filter name="cancel" position="after">
<separator/>
<filter name="from_recurring"
<separator />
<filter
name="from_recurring"
string="From Recurring"
domain="[('source_recurring_id', '!=', False)]"/>
<filter name="recurring_active"
domain="[('source_recurring_id', '!=', False)]"
/>
<filter
name="recurring_active"
string="Active Recurring Template"
domain="[('recurring_template', '=', 'active')]"/>
<filter name="recurring_suspended"
domain="[('recurring_template', '=', 'active')]"
/>
<filter
name="recurring_suspended"
string="Suspended Recurring Template"
domain="[('recurring_template', '=', 'suspended')]"/>
domain="[('recurring_template', '=', 'suspended')]"
/>
</filter>
</field>
</record>
@ -75,11 +109,17 @@
<field name="name">Recurring Donations</field>
<field name="res_model">donation.donation</field>
<field name="view_mode">tree,form,pivot,graph</field>
<field name="context">{'default_recurring_template': 'active', 'recurring_view': True}</field>
<field
name="context"
>{'default_recurring_template': 'active', 'recurring_view': True}</field>
<field name="domain">[('recurring_template', '!=', False)]</field>
</record>
<menuitem id="donation_recurring_menu" action="donation_recurring_action"
parent="donation.donation_title_menu" sequence="20"/>
<menuitem
id="donation_recurring_menu"
action="donation_recurring_action"
parent="donation.donation_title_menu"
sequence="20"
/>
</odoo>

@ -3,56 +3,65 @@
# @author: Alexis de Lattre <alexis.delattre@akretion.com>
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
from odoo import models, fields, api, _
from odoo import _, api, fields, models
from odoo.exceptions import UserError
from odoo.tools.misc import format_date
class DonationRecurringGenerate(models.TransientModel):
_name = 'donation.recurring.generate'
_description = 'Generate Recurring Donations'
_rec_name = 'date'
_name = "donation.recurring.generate"
_description = "Generate Recurring Donations"
_rec_name = "date"
date = fields.Date(
date = fields.Date(required=True, default=fields.Date.context_today)
payment_ref = fields.Char(string="Payment Reference")
company_id = fields.Many2one(
"res.company",
required=True,
default=fields.Date.context_today
string="Company",
default=lambda self: self.env.company,
)
payment_ref = fields.Char(string='Payment Reference')
company_id = fields.Many2one(
'res.company', required=True, string='Company',
default=lambda self: self.env.company)
@api.model
def _prepare_donation_default(self, donation):
default = {
'donation_date': self.date,
'source_recurring_id': donation.id,
'payment_ref': self.payment_ref,
"donation_date": self.date,
"source_recurring_id": donation.id,
"payment_ref": self.payment_ref,
}
return default
def generate(self):
self.ensure_one()
doo = self.env['donation.donation']
donations = doo.search([
('recurring_template', '=', 'active'),
('company_id', '=', self.company_id.id)])
doo = self.env["donation.donation"]
donations = doo.search(
[
("recurring_template", "=", "active"),
("company_id", "=", self.company_id.id),
]
)
new_donation_ids = []
existing_recur_donations = doo.search([
('donation_date', '=', self.date),
('source_recurring_id', '!=', False),
('company_id', '=', self.company_id.id)])
existing_recur_donations = doo.search(
[
("donation_date", "=", self.date),
("source_recurring_id", "!=", False),
("company_id", "=", self.company_id.id),
]
)
if existing_recur_donations:
raise UserError(
_('Recurring donations have already been generated for %s.')
% format_date(self.env, self.date))
_("Recurring donations have already been generated for %s.")
% format_date(self.env, self.date)
)
for donation in donations:
default = self._prepare_donation_default(donation)
new_donation = donation.copy(default=default)
new_donation_ids.append(new_donation.id)
action = self.env.ref('donation.donation_action').sudo().read([])[0]
action.update({
'domain': [('id', 'in', new_donation_ids)],
'limit': 500,
})
action = self.env.ref("donation.donation_action").sudo().read([])[0]
action.update(
{
"domain": [("id", "in", new_donation_ids)],
"limit": 500,
}
)
return action

@ -1,26 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2014-2021 Barroux Abbey (http://www.barroux.org)
Copyright 2014-2021 Akretion France (http://www.akretion.com/)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo>
<record id="donation_recurring_generate_form" model="ir.ui.view">
<field name="name">donation_recurring_generate.form</field>
<field name="model">donation.recurring.generate</field>
<field name="arch" type="xml">
<field name="arch" type="xml">
<form string="Generate Recurring Donations">
<group name="main">
<field name="date"/>
<field name="payment_ref"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="date" />
<field name="payment_ref" />
<field name="company_id" groups="base.group_multi_company" />
</group>
<footer>
<button type="object" name="generate" string="Generate" class="btn-primary"/>
<button special="cancel" string="Cancel"/>
<button
type="object"
name="generate"
string="Generate"
class="btn-primary"
/>
<button special="cancel" string="Cancel" />
</footer>
</form>
</field>
@ -33,9 +37,12 @@
<field name="target">new</field>
</record>
<menuitem id="donation_recurring_generate_menu" sequence="30"
<menuitem
id="donation_recurring_generate_menu"
sequence="30"
action="donation_recurring_generate_action"
parent="donation.donation_title_menu"
groups="donation.group_donation_user"/>
groups="donation.group_donation_user"
/>
</odoo>

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