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>
30 lines
1.1 KiB
Python
30 lines
1.1 KiB
Python
from odoo import fields, models
|
|
|
|
|
|
class ResConfigSettings(models.TransientModel):
|
|
_inherit = 'res.config.settings'
|
|
|
|
membership_org_name = fields.Char(
|
|
string='Organization Display Name',
|
|
config_parameter='community_membership.org_name',
|
|
help="Used in membership emails, the QR card, and the verification page. "
|
|
"Never hardcode an organization name in module code - set it here.",
|
|
)
|
|
membership_member_id_format = fields.Char(
|
|
string='Member ID Format',
|
|
config_parameter='community_membership.member_id_format',
|
|
default='MEM-{year}-{seq}',
|
|
help="Placeholders: {year} = activation year, {seq} = sequence number.",
|
|
)
|
|
membership_renewal_offsets = fields.Char(
|
|
string='Renewal Reminder Offsets (days)',
|
|
config_parameter='community_membership.renewal_offsets',
|
|
default='30,14,7',
|
|
help="Comma-separated list of days-before-expiry to send renewal reminders.",
|
|
)
|
|
membership_portal_enabled = fields.Boolean(
|
|
string='Enable Member Portal',
|
|
config_parameter='community_membership.portal_enabled',
|
|
default=True,
|
|
)
|