metatroncubeswdev 190e51a7da feat(community_membership): QR card, verification endpoint, member portal (Session 1-C)
Adds a QWeb PDF "Membership Card" report (85x54mm landscape, custom
report.paperformat) showing the company logo, member name/ID, tier, and
a QR code generated with the qrcode library (embedded as a base64 PNG via
a non-stored res.partner.membership_card_qr compute field). The QR encodes
a public verification URL built from ir.config_parameter's web.base.url.

Adds the public GET /membership/verify/<member_id> controller: shows
valid/expired/not-found with no personal data beyond name (and tier, for
valid members) - internal states like 'invoiced'/'none' are deliberately
reported as not-found so partial signup state isn't leaked.

Adds the member portal: /my/membership (status/tier/expiry), /my/membership/
renew (finds or creates a draft renewal invoice, redirects to the existing
portal invoice page), and /my/membership/card (PDF download) - plus a
"Membership" entry card on the main /my portal home page. Since
community_theme_base doesn't exist yet (that's Phase 6), the card uses
res.company.logo rather than a theme setting - still brand-neutral,
just resolved from the standard company record for now.

Verified against a live Odoo 19 + Postgres 16 container, both via the
test suite (12/12 tests: unit tests, HttpCase tests hitting the real verify
endpoint for valid/expired/unknown IDs) and by hand end-to-end - created a
tier and member over JSON-RPC, activated the membership, fetched the live
/membership/verify/ page, and rendered the actual PDF card via
/report/pdf/... (11.7KB single-page PDF, confirmed non-blank).

Along the way, hit a third real Odoo 19 API change: res.users.groups_id
was renamed to group_ids.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-17 21:19:30 -04:00

Community OS

A brand-neutral, resellable suite of Odoo 19 Community modules for community and cultural organizations. First deployment: the Tamil Nadu Cultural Society of Canada (TNCSC).

Vendor: Metatroncube Software Solutions LLP · Waterloo, Ontario Target platform: Odoo 19 Community Edition (LGPL-3) · PostgreSQL 16 · Python 3.12

community_* is a placeholder module prefix. Replace it with a unique vendor prefix before publishing to the Odoo App Store so technical names never collide with anything already listed.

Layered architecture

┌─────────────────────────────────────────────────────────────┐
│  DEPLOYMENT LAYER  (per client — data only, no logic)        │
│  tncsc_deployment:  branding, tiers & prices, chart of        │
│  accounts, email copy, website pages, user groups             │
└───────────────▲─────────────────────────────────────────────┘
                │ depends on
┌───────────────┴─────────────────────────────────────────────┐
│  PRODUCT LAYER  (brand-neutral, resellable, LGPL-3)          │
│  community_membership   event_qr_ticketing   community_school │
│  community_classifieds  community_benefits    community_interac│
│  community_theme_base   community_portal                      │
└───────────────▲─────────────────────────────────────────────┘
                │ depends only on
┌───────────────┴─────────────────────────────────────────────┐
│  ODOO 19 COMMUNITY CORE  (never Enterprise)                  │
└─────────────────────────────────────────────────────────────┘

Product-layer modules never mention a client name, never hardcode a price, a colour, an account code, or an email address. Anything client-specific is a configuration record, seeded only by a *_deployment module. Landing a new client means writing a new clientname_deployment module — the product code never changes.

Modules

Product layer (brand-neutral, sellable)

Module Purpose
community_theme_base Configurable brand tokens (colours, logo, fonts) via settings
community_membership Member profiles, tiers, family grouping, renewals, QR membership card
event_qr_ticketing QR ticket per event registration, staff check-in / verification
community_school Programs, classes, enrollment, attendance, LMS link, parent portal
community_classifieds Member-gated classifieds board with moderation and auto-expiry
community_benefits Benefit centres and per-tier member benefit entitlements
community_interac Interac e-Transfer semi-automated payment provider (Canada)
community_portal Unified member portal dashboard, soft-detects installed modules

Deployment layer (per client — data only)

Module Purpose
tncsc_deployment TNCSC branding, tiers/prices, chart of accounts, email copy, website pages, user groups

Local development

cd deploy
docker compose up

Odoo will be available at http://localhost:8069. The ../addons folder is mounted read-write, so changes to module code are picked up on restart (dev mode reload is enabled in deploy/odoo.conf).

Licensing & resellability guardrails

  1. Every product module is licensed LGPL-3.
  2. No community_* module may depend on an Odoo Enterprise module — see Appendix A in the project plan for the Community-only allowlist.
  3. No client identity (name, email, colour, price, account code) may appear in a product module. This is enforced in CI by scripts/check_brand_leak.py.
  4. All client-variable behaviour is configuration data, seeded by the deployment layer, never a literal in product code.
  5. Every product module ships an App-Store-ready manifest, a tests/ package, and a static/description/index.html listing page.

See CommunityOS_Implementation_Plan_for_Claude_Code.md for the full, phase-by-phase build plan.

CI

.github/workflows/ci.yml installs every module against Odoo 19 + Postgres 16 with --test-enable, runs the brand-leak grep, and lints with flake8 / pylint-odoo.

Description
No description provided
Readme 5.6 MiB
Languages
Python 94.6%
JavaScript 3.3%
HTML 2.1%