Adds the membership foundation: community.membership.tier (admin-configurable
tiers, each auto-creating a linked invoicing product), res.partner membership
fields (member ID, tier, state, family grouping, volunteer tracking), and a
res.config.settings page (org name, member-ID format, renewal offsets, portal
toggle) - all backed by ir.config_parameter so nothing is hardcoded.
Member IDs are generated on activation via a configurable format string
({year}/{seq}) resolved against an ir.sequence. Adds the Membership Manager
group/menu and views (tier list/form, partner form tab, list columns, search
filters, settings page).
Along the way, hit two real Odoo 19 API changes vs. older tutorials/docs:
res.groups.category_id was replaced by privilege_id -> res.groups.privilege,
and module settings pages now use the <app>/<block>/<setting> pattern
inherited from base.res_config_settings_view_form rather than raw divs.
Verified by upgrading the module against a live Odoo 19 + Postgres 16
container: installs clean, all 4 tests pass (tier->product creation, member
ID generation on activation, one-time/lifetime tiers never expire,
configurable ID format), and the module still installs cleanly for its
dependents (community_benefits, tncsc_deployment).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
41 lines
2.2 KiB
XML
41 lines
2.2 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<record id="res_config_settings_view_form_membership" model="ir.ui.view">
|
|
<field name="name">res.config.settings.view.form.membership</field>
|
|
<field name="model">res.config.settings</field>
|
|
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
|
|
<field name="arch" type="xml">
|
|
<xpath expr="//form" position="inside">
|
|
<app data-string="Membership" string="Membership" name="community_membership"
|
|
groups="community_membership.group_membership_manager">
|
|
<block title="Membership" id="membership_settings">
|
|
<setting id="membership_org_name_setting" string="Organization Name"
|
|
help="Used in membership emails, the QR card, and the verification page">
|
|
<field name="membership_org_name" placeholder="e.g. My Community Organization"/>
|
|
</setting>
|
|
<setting id="membership_member_id_format_setting" string="Member ID Format"
|
|
help="Placeholders: {year}, {seq}">
|
|
<field name="membership_member_id_format"/>
|
|
</setting>
|
|
<setting id="membership_renewal_offsets_setting" string="Renewal Reminder Offsets"
|
|
help="Comma-separated days-before-expiry to send renewal reminders">
|
|
<field name="membership_renewal_offsets"/>
|
|
</setting>
|
|
<setting id="membership_portal_enabled_setting" string="Member Portal">
|
|
<field name="membership_portal_enabled"/>
|
|
</setting>
|
|
</block>
|
|
</app>
|
|
</xpath>
|
|
</field>
|
|
</record>
|
|
|
|
<record id="action_membership_config_settings" model="ir.actions.act_window">
|
|
<field name="name">Membership Settings</field>
|
|
<field name="res_model">res.config.settings</field>
|
|
<field name="view_mode">form</field>
|
|
<field name="target">current</field>
|
|
<field name="context">{'module': 'community_membership'}</field>
|
|
</record>
|
|
</odoo>
|