Merge pull request #116 from expsa/zainab_sale

Zainab sale
This commit is contained in:
zainab2097 2024-07-08 17:44:45 +03:00 committed by GitHub
commit db940791c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 352 additions and 123 deletions

View File

@ -70,6 +70,7 @@ odoo app manage Membership subscription plans, odoo membership memeber, odoo mem
'data/sequence.xml',
'views/main_menu.xml',
'wizard/renew_membership.xml',
'wizard/cancel_membership.xml',
'views/partner_extended.xml',
'views/dev_membership.xml',
'views/product_template.xml',

View File

@ -1,5 +1,6 @@
<?xml version="1.0" ?>
<odoo>
<record id="template_membership" model="mail.template">
<field name="name">membership.email.template</field>
<field name="subject">Membership Detail</field>
@ -12,7 +13,9 @@
<field name="body_html" type="html">
<div style="font-family:Arial,Helvetica,sans-serif;font-size:14px;">
<h3>Hello ${object.partner_id.name},</h3>
<p>Your <b>${object.product_id.name}</b> membership of amount <b>${object.membership_fees}</b> have activated on <b>${object.from_date}</b> - <b>${object.to_date}</b> . </p>
<p>Your <b>${object.product_id.name}</b> membership of amount <b>${object.membership_fees}</b> have
activated on <b>${object.from_date}</b> - <b>${object.to_date}</b> .
</p>
<br/>
<br/>
<br/>
@ -21,21 +24,35 @@
</div>
</field>
</record>
<record id="dev_membership_expire_reminder_mail_template" model="mail.template">
<field name="name">Membership Expire Reminder</field>
<field name="email_from">${(object.company_id.email or '') | safe}</field>
<field name="email_to">${(object.partner_id.email or '') | safe}</field>
<field name="subject">Membership Expire Reminder</field>
<field name="model_id" ref="dev_membership.model_dev_membership"/>
<field name="auto_delete" eval="True"/>
<field name="body_html"><![CDATA[
<field name="name">Membership Expire Reminder</field>
<field name="email_from">${(object.company_id.email or '') | safe}</field>
<field name="email_to">${(object.partner_id.email or '') | safe}</field>
<field name="subject">Membership Expire Reminder</field>
<field name="model_id" ref="dev_membership.model_dev_membership"/>
<field name="auto_delete" eval="True"/>
<field name="body_html"><![CDATA[
<p>Hello ${object.partner_id.name}.</p>
<p>Hope you doing well!</p>
<p>It's gentle reminder that your membership is about to expire on ${object.datetime_convert()}.</p>
]]></field>
</record>
</record>
<!-- todo start -->
<record id="dev_membership_expire_second_reminder_mail_template" model="mail.template">
<field name="name">Membership Expire Second Reminder</field>
<field name="email_from">${(object.company_id.email or '') | safe}</field>
<field name="email_to">${(object.partner_id.email or '') | safe}</field>
<field name="subject">Membership Second Expire Reminder</field>
<field name="model_id" ref="dev_membership.model_dev_membership"/>
<field name="auto_delete" eval="True"/>
<field name="body_html"><![CDATA[
<p>Hello ${object.partner_id.name}.</p>
<p>Hope you doing well!</p>
<p>It's gentle reminder that your membership is about to expire on ${object.datetime_convert()}.</p>
]]></field>
</record>
<!-- todo end -->
<record id="dev_membership_expired_mail_template" model="mail.template">
<field name="name">Membership Expired Mail</field>
<field name="email_from">${(object.company_id.email or '') | safe}</field>
@ -49,5 +66,5 @@
<p>Your membership <b>${(object.name)}</b> was expired on <b>${object.datetime_convert()}</b> date.</p>
]]></field>
</record>
</odoo>

View File

@ -26,7 +26,20 @@
<field name="code">model.membership_reminder_email_cron()</field>
</record>
<!-- todo start -->
<record id="cron_dev_membership_seacond_reminder" model="ir.cron">
<field name="name">Membership Secand Reminder</field>
<field name="user_id" ref="base.user_admin"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
<field name="numbercall">-1</field>
<field name="doall" eval="False"/>
<field name="model_id" ref="model_dev_membership"/>
<field name="state">code</field>
<field name="code">model.membership_secand_reminder_email_cron()</field>
</record>
<!-- todo end -->
<record id="cron_membership_auto_expire" model="ir.cron">
<field name="name">Auto Expire Membership</field>
<field name="user_id" ref="base.user_admin"/>

View File

@ -26,10 +26,15 @@ class DevMembership(models.Model):
from_date = fields.Date(string="Membership From Date", tracking=3, required=1, default=lambda *a: (datetime.now().date()))
to_date = fields.Date(string="Membership To Date", tracking=3)
partner_id = fields.Many2one('res.partner', string="Partner", domain="[('is_member', '=', True)]", tracking=2, required=1)
id_no = fields.Char(string='',related='partner_id.identification_number',store=True)
phone = fields.Char(string='Phone',related='partner_id.phone',store=True)
email = fields.Char(string='Email',related='partner_id.email',store=True)
product_id = fields.Many2one('product.product', string="Membership Product", domain="[('is_membership', '=', True)]", tracking=2, required=1)
membership_fees = fields.Float(string="Membership Fees", related="product_id.list_price", readonly=1)
membership_fees = fields.Float(string="Membership Fees",readonly=0)
is_free = fields.Boolean(string="Is Free",related="product_id.is_free",)
company_id = fields.Many2one('res.company', string="Company", default=lambda self: self.env.company, required=1, tracking=3)
duration = fields.Integer(string="Duration", related="product_id.duration")
duration = fields.Integer(string="Duration",readonly=0,)
description = fields.Text(string="Description", related="product_id.description", readonly=False)
interval = fields.Selection(string="Interval", related="product_id.interval")
@ -42,14 +47,55 @@ class DevMembership(models.Model):
membership_id = fields.Many2one('dev.membership', string='Renew Membership')
invoice_id = fields.Many2one('account.move', string='Invoice')
user_id = fields.Many2one('res.users', string='Resposible', default=lambda self:self.env.user)
cancel_reason_id = fields.Many2one('cancellation.reason',string='Cancel Membership Reason')
@api.onchange('product_id')
def _onchange_membership_type(self):
if self.product_id:
self.membership_fees = self.product_id.list_price
self.duration = self.product_id.duration
@api.constrains('membership_fees')
def _check_subscription_fee(self):
for record in self:
if record.membership_fees < record.product_id.list_price:
raise ValidationError(_('Membership fees cannot be less than the default value in Setting of membrship type.'))
@api.constrains('duration')
def _check_duration(self):
for record in self:
if record.duration < record.product_id.duration:
raise ValidationError(_('Duration cannot be less than the default value in Setting of membrship type.'))
@api.constrains('from_date')
def _check_from_date(self):
for rec in self:
if not rec.from_date >= datetime.now().date():
raise ValidationError("Membership date should be greater than or equal to today's date!!")
def make_activity_group(self):
# templet_id = self.env.ref('dev_membership.template_membership_cancell')
# templet2_id = self.env.ref('dev_membership.template_membership_cancell2')
date_deadline = fields.Date.today()
note=_('Membership %s is Cancelled') % self.name
summary = _("Membership Cancellation")
self.sudo().activity_schedule(
'mail.mail_activity_data_todo', date_deadline,
note=note,
user_id=self.partner_id.user_id.id,
res_id=self.id,
summary=summary
)
self.sudo().activity_schedule(
'mail.mail_activity_data_todo', date_deadline,
note=note,
user_id=self.user_id.id,
res_id=self.id,
summary=summary
)
@api.constrains('partner_id', 'from_date')
def _check_if_membership_exists(self):
membership_obj = self.env['dev.membership'].search([('partner_id.id', '=', self.partner_id.id), ('state', 'in', ['draft', 'active', 'confirm']), ('id', '!=', self.id)])
@ -75,9 +121,9 @@ class DevMembership(models.Model):
self.state = 'confirm'
def action_active_membership(self):
if not self.invoice_id:
if not self.invoice_id and not self.is_free:
raise ValidationError(_('Please Create Membership Invoice'))
if self.invoice_id.payment_state != 'paid':
if self.invoice_id.payment_state != 'paid' and not self.is_free:
raise ValidationError(_('Membership Invoice is not paid.\nPlease Paid membership invoice and active the membership.'))
self.state = 'active'
@ -141,7 +187,17 @@ class DevMembership(models.Model):
for membership in membership_ids:
tmpl_id.send_mail(membership.id, force_send=True)
return True
def membership_secand_reminder_email_cron(self):
membership_pool = self.env['dev.membership']
tmpl_id = self.env.ref('dev_membership.dev_membership_expire_second_reminder_mail_template')
days_before_second = self.env['ir.config_parameter'].get_param('dev_membership.days_before_second')
if tmpl_id:
date = datetime.now().date() + relativedelta(days=int(days_before))
membership_ids = membership_pool.search([('state', '=', 'active'),
('to_date', '<=', date)])
for membership in membership_ids:
tmpl_id.send_mail(membership.id, force_send=True)
return True
def datetime_convert(self):
convert_date = self.to_date.strftime("%d-%m-%Y")
return convert_date

View File

@ -6,5 +6,7 @@ access_dev_membership_user,dev.membership.user,model_dev_membership,group_member
access_dev_membership_manager,dev.membership.manager,model_dev_membership,group_membership_manager,1,1,1,1
access_renew_membership_user,renew.membership.user,model_renew_membership,group_membership_user,1,1,1,1
access_renew_membership_manager,renew.membership.manager,model_renew_membership,group_membership_manager,1,1,1,1
access_renew_membership_resone,renew.membership.resone,model_cancellation_reason,,1,1,1,1
access_renew_membership_resone,renew.membership.resone,model_cancellation_reason,group_membership_manager,1,1,1,1
access_renew_membership_resone2,renew.membership.resone2,model_cancellation_reason,group_membership_user,1,0,0,0
access_renew_membership_wiz_resone2,renew.membership.wiz.resone2,model_membership_request_cancel_wizard,,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
6 access_renew_membership_user renew.membership.user model_renew_membership group_membership_user 1 1 1 1
7 access_renew_membership_manager renew.membership.manager model_renew_membership group_membership_manager 1 1 1 1
8 access_renew_membership_resone renew.membership.resone model_cancellation_reason group_membership_manager 1 1 1 1
9 access_renew_membership_resone2 renew.membership.resone2 model_cancellation_reason group_membership_user 1 0 0 0
10 access_renew_membership_wiz_resone2 renew.membership.wiz.resone2 model_membership_request_cancel_wizard 1 1 1 1
11
12

View File

@ -8,9 +8,13 @@
<tree string="Dev Membership Tree View">
<field name="name"/>
<field name="partner_id"/>
<field optional="hide" name="id_no"/>
<field optional="hide" name="phone"/>
<field optional="hide" name="email"/>
<field name="product_id"/>
<field name="membership_fees"/>
<field name="date"/>
<field name="activity_ids" widget="list_activity"/>
<field name="from_date"/>
<field name="to_date"/>
<field name="state" widget="badge" decoration-success="state in ['active', 'confirm']"
@ -27,7 +31,8 @@
<form string="Dev Membership Form View">
<header>
<button name='create_membership_invoice' type="object" string='Create Invoice' class="oe_highlight"
attrs="{'invisible':['|',('state','!=','confirm'),('invoice_id','!=',False)]}"/>
attrs="{'invisible':['|','|',('is_free','=',True),
('state','!=','confirm'),('invoice_id','!=',False)]}"/>
<button name="action_active_membership" type="object" string="Active" class="oe_highlight"
attrs="{'invisible': ([('state', '!=', 'confirm')])}"/>
<button name="action_confirm_membership" type="object" string="Confirm" class="oe_highlight"
@ -37,9 +42,10 @@
<button string="Send by Mail" name="membership_send_by_mail" type="object" class="oe_highlight"
attrs="{'invisible': ([('state', 'not in', ['confirm', 'draft'])])}"/>
<button string="Renew Membership" name="%(dev_membership.action_renew_membership)d" type="action"
class="oe_highlight" attrs="{'invisible':['|',('membership_id','!=',False),('state','!=','expire')]}"/>
<button name="action_cancel_membership" type="object" string="Cancel"
attrs="{'invisible': ([('state', 'in', ['active','expire','cancel'])])}"/>
class="oe_highlight"
attrs="{'invisible':['|',('membership_id','!=',False),('state','not in',['expire','active','cancel'])]}"/>
<button name="%(dev_membership.membership_request_cancel_wizard_action)d" type="action" string="Cancel"
attrs="{'invisible': ([('state', 'in', ['cancel'])])}"/>
<field name="state" widget="statusbar" statusbar_visible="draft,confirm,active"/>
</header>
<sheet>
@ -65,6 +71,10 @@
<group>
<group>
<field name="partner_id" attrs="{'readonly': ([('state', '!=', 'draft')])}"/>
<field name="id_no"/>
<field invisible='1' name="is_free"/>
<field name="phone"/>
<field name="email"/>
<field name="product_id"
context="{'form_view_ref': 'dev_membership.form_membership_product'}"
attrs="{'readonly': ([('state', '!=', 'draft')])}"/>
@ -101,7 +111,7 @@
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="activity_ids" />
<field name="message_ids"/>
</div>
</form>
@ -121,6 +131,7 @@
<field name="from_date"/>
<field name="to_date"/>
<field name="state"/>
<field name="activity_ids" widget="list_activity" optional="show"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_global_click">
@ -137,7 +148,9 @@
Membership
</strong>
<div name="from_date">
<field name="from_date"/> - <field name="to_date"/>
<field name="from_date"/>
-
<field name="to_date"/>
</div>
<div t-if="record.partner_id.value">
<t t-esc="record.partner_id.value"/>
@ -151,6 +164,15 @@
options="{'classes': {'draft': 'warning', 'expire': 'danger', 'confirm': 'success', 'active' : 'success'}}"/>
</h5>
</div>
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left text-muted">
<span>
<t t-esc="record.from_date.value"/>
</span>
</div>
</div>
<field name="activity_ids" widget="kanban_activity"/>
<br/>
</div>
</div>
</div>
@ -181,31 +203,52 @@
</search>
</field>
</record>
<!-- add activity -->
<record id="view_dev_membership_activity" model="ir.ui.view">
<field name="name">activity.dev.membership</field>
<field name="model">dev.membership</field>
<field name="arch" type="xml">
<activity string="Memberships">
<field name="id"/>
<templates>
<div t-name="activity-box">
<img t-att-src="activity_image('dev.membership', 'image_128', record.id.raw_value)" role="img"
t-att-title="record.id.value" t-att-alt="record.id.value"/>
<div>
<field name="name" display="full"/>
<field name="partner_id" muted="1" display="full"/>
</div>
</div>
</templates>
</activity>
</field>
</record>
<!-- end -->
<!--All Membership Action-->
<record id="action_dev_membership" model="ir.actions.act_window">
<field name="name">Memberships</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dev.membership</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_mode">kanban,tree,activity,form</field>
</record>
<!-- Active Membership-->
<record id="action_active_membership" model="ir.actions.act_window">
<field name="name">Active Memberships</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dev.membership</field>
<field name="view_mode">kanban,tree,form</field>
<field name="view_mode">kanban,tree,activity,form</field>
<field name="domain">[('state', '=', 'active')]</field>
</record>
<!-- Expire Membership-->
<record id="action_expire_membership" model="ir.actions.act_window">
<field name="name">Expire Memberships</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">dev.membership</field>
<field name="view_mode">kanban,tree,form</field>
<field name="domain">[('state', '=', 'expire')]</field>
<field name="view_mode">kanban,tree,activity,form</field>
<field name="domain">[('state', 'in', ['cancel','expire'])]</field>
</record>
<menuitem name="Memberships"
@ -213,13 +256,13 @@
parent="menu_membership_root"
action="action_dev_membership"
sequence="1"/>
<menuitem name="Active Memberships"
id="menu_active_membership"
parent="menu_membership_root"
action="action_active_membership"
sequence="3"/>
<menuitem name="Expire Memberships"
id="menu_expire_membership"
parent="menu_membership_root"

View File

@ -16,7 +16,7 @@
<field name="memebership_end_date" optional="show"/>
<field name="product_id" optional="show"/>
<field name="category_id" widget="many2many_tags" optional="show"/>
<field name="activity_ids" optional="show"/>
<field name="activity_ids" widget="list_activity" optional="show"/>
</tree>
</field>
</record>
@ -43,7 +43,9 @@
<field name="country_id"/>
<field name="mobile"/>
<field name="state_id"/>
<field name="join_date"/>
<field name="category_id" widget="many2many_tags"/>
<field name="image_128"/>
<field name="type"/>
<field name="active_membership_id"/>
@ -122,99 +124,112 @@
<span class="oe_kanban_partner_links"/>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- -->
<div class="o_kanban_record_bottom">
<div class="oe_kanban_bottom_left text-muted">
<span>
<t t-esc="record.join_date.value"/>
</span>
</div>
</div>
<field name="activity_ids" widget="kanban_activity"/>
<br/>
<!-- -->
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!--form-->
<record id="view_res_partner_memeber_form" model="ir.ui.view">
<field name="name">view.res.partner.member.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='vat']" position="before">
<field name="nationality_id"/>
<field name="birth_date"/>
<field name="age"/>
</xpath>
<xpath expr="//field[@name='function']" position="after">
<field name="employer"/>
</xpath>
<xpath expr="//page" position="after">
<page name="memebership" string='Memebership'>
<group>
<group name="memeber">
<field name="is_member"/>
<field name="product_id"/>
<!--form-->
<record id="view_res_partner_memeber_form" model="ir.ui.view">
<field name="name">view.res.partner.member.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='vat']" position="before">
<field name="nationality_id"/>
<field name="birth_date"/>
<field name="age"/>
</xpath>
<xpath expr="//field[@name='function']" position="after">
<field name="employer"/>
</xpath>
<xpath expr="//page" position="after">
<page name="memebership" string='Memebership'>
<group>
<group name="memeber">
<field name="is_member"/>
<field name="product_id"/>
</group>
<group name="other">
<field name="join_date"/>
<field name="memebership_end_date"/>
</group>
</group>
</page>
</xpath>
<xpath expr="//field[@name='mobile']" position="attributes">
<attribute name="required">True</attribute>
</xpath>
<xpath expr="//field[@name='email']" position="attributes">
<attribute name="required">True</attribute>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
<button name="view_membership" type="object"
class="oe_stat_button"
icon="fa-vcard-o" attrs="{'invisible' : [('membership_count', '=', 0)]}">
<div class="o_stat_info">
<field name="membership_count" class="o_stat_value"/>
<span class="o_stat_text">Membership</span>
</div>
</button>
</xpath>
</field>
</record>
<!-- search -->
<record id="view_search_res_partner" model="ir.ui.view">
<field name="name">res.partner.search</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<search string="Res Partner Search">
<field name="name"/>
<field name="phone"/>
<field name="identification_number"/>
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
<filter string="Expired Membership" name="memebership_end_date"/>
<group string="Group By">
<filter string="Membership Type" name="product_id" context="{'group_by': 'product_id'}"/>
<filter string="Branch" name="branch_id" context="{'group_by': 'branch_id'}"/>
</group>
</search>
</field>
</record>
<!--end -->
<!--Action-->
<record id="action_members" model="ir.actions.act_window">
<field name="name">Member</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="domain">[('is_member', '=', True)]</field>
<field name="context">{'default_is_member' : 1}</field>
<field name="view_mode">kanban,tree,activity,form</field>
<field name="search_view_id" ref="dev_membership.view_search_res_partner"/>
<group name="other">
<field name="join_date"/>
<field name="memebership_end_date"/>
</group>
</group>
</page>
</xpath>
<xpath expr="//field[@name='mobile']" position="attributes">
<attribute name="required">True</attribute>
</xpath>
<xpath expr="//field[@name='email']" position="attributes">
<attribute name="required">True</attribute>
</xpath>
<xpath expr="//div[@name='button_box']" position="inside">
<button name="view_membership" type="object"
class="oe_stat_button"
icon="fa-vcard-o" attrs="{'invisible' : [('membership_count', '=', 0)]}">
<div class="o_stat_info">
<field name="membership_count" class="o_stat_value"/>
<span class="o_stat_text">Membership</span>
</div>
</button>
</xpath>
</field>
</record>
<!-- search -->
<record id="view_search_res_partner" model="ir.ui.view">
<field name="name">res.partner.search</field>
<field name="model">res.partner</field>
<field name="arch" type="xml">
<search string="Res Partner Search">
<field name="name"/>
<field name="phone"/>
<field name="category_id"/>
<field name="identification_number"/>
<filter string="Archived" name="archived" domain="[('active', '=', False)]"/>
<filter string="Expired Membership" name="membership_end_date"
domain="[('memebership_end_date', '&lt;=',context_today().strftime('%Y-%m-%d'))]"/>
<group string="Group By">
<filter string="Membership Type" name="product_id" context="{'group_by': 'product_id'}"/>
<filter string="Branch" name="branch_id" context="{'group_by': 'branch_id'}"/>
</group>
</search>
</field>
</record>
<!--end -->
<!--Action-->
<record id="action_members" model="ir.actions.act_window">
<field name="name">Member</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.partner</field>
<field name="domain">[('is_member', '=', True)]</field>
<field name="context">{'default_is_member' : 1}</field>
<field name="view_mode">kanban,tree,activity,form</field>
<field name="search_view_id" ref="dev_membership.view_search_res_partner"/>
<field name="view_ids" eval="[(5,0,0),
<field name="view_ids" eval="[(5,0,0),
(0,0,{'sequence' : 3, 'view_mode': 'kanban' , 'view_id' : ref('dev_membership.dev_res_partner_member_kanban_view')}),
(0,0,{'sequence' : 3, 'view_mode': 'tree' , 'view_id' : ref('dev_membership.view_res_partner_member_tree')})]"/>
</record>
</record>
<!--Menus-->
<menuitem name="Members"
id="menu_members"
parent="menu_membership_main"
action="action_members"
sequence="2"/>
</odoo>
<!--Menus-->
<menuitem name="Members"
id="menu_members"
parent="menu_membership_main"
action="action_members"
sequence="2"/>
</odoo>

View File

@ -110,10 +110,24 @@
<field name="context">{'module' : 'dev_membership', 'bin_size': False}</field>
</record>
<record id="action_dev_membership_config_refuse_resone" model="ir.actions.act_window">
<field name="name">Cancell Resone</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">cancellation.reason</field>
<field name="view_mode">form,tree</field>
</record>
<!--Menu-->
<menuitem id="menu_dev_membership_general_settings"
name="Settings"
parent="menu_configuration_root"
sequence="0"
action="action_dev_membership_config_settings"/>
<menuitem id="menu_dev_membership_general_reasons"
name="Cancell Resones"
parent="menu_configuration_root"
sequence="2"
action="action_dev_membership_config_refuse_resone"/>
</odoo>

View File

@ -2,3 +2,4 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import renew_membership
from . import cancel_membership

View File

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
class MembershipRefues(models.TransientModel):
_name = "membership.request.cancel.wizard"
_description = "Membership refuse Reason wizard"
reason_id = fields.Many2one('cancellation.reason',string='Cancel Membership Reason' ,required=True)
request_id = fields.Many2one('dev.membership')
user_id = fields.Many2one('res.users', string='User', default=lambda self: self.env.user,)
@api.model
def default_get(self, fields):
res = super(MembershipRefues, self).default_get(fields)
active_ids = self.env.context.get('active_ids', [])
active_model = self.env.context.get('active_model', [])
if active_model == 'dev.membership':
res.update({'request_id': active_ids[0] if active_ids else False})
return res
def request_cancel_reason(self):
for record in self:
record.ensure_one()
subject = _("Membership Cancelled")
body = _('The Membership was Cancelled by %s for the following reason: %s ') % (
self.env.user.name, record.reason_id.name)
if record.request_id:
record.request_id.cancel_reason_id.name = record.reason_id.name
record.request_id.state = 'cancel'
record.request_id.message_post(body=body, subject=subject)
record.request_id.make_activity_group()
# end chatter
return {'type': 'ir.actions.act_window_close'}

View File

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="membership_cancel_wizard_view_form" model="ir.ui.view">
<field name="name">membership.request.cancel.wizard.form</field>
<field name="model">membership.request.cancel.wizard</field>
<field name="arch" type="xml">
<form string="Cancel Membership Reason">
<separator string="Cancel Membership Reason"/>
<group>
<field name="reason_id"/>
</group>
<footer>
<button string='Save' name="request_cancel_reason" type="object" class="oe_highlight"/>
<button string="Cancel" class="oe_link" special="cancel"/>
</footer>
</form>
</field>
</record>
<record id="membership_request_cancel_wizard_action" model="ir.actions.act_window">
<field name="name">Cancel Membership Reason</field>
<field name="res_model">membership.request.cancel.wizard</field>
<field name="view_mode">form</field>
<field name="view_id" ref="membership_cancel_wizard_view_form"/>
<field name="target">new</field>
</record>
</odoo>