- Replace the Phase-0 "content to be completed" placeholder Usage section in every community_* README.rst with the actual features built across Phases 1-6 (routes, crons, portal pages). - Add CHANGELOG.rst (19.0.1.0.0) to every community_* module. - Note independent-vs-bundled module relationships in the root README. - Fix HANDOFF.md: Phase 8 was already committed (9a24691) and a git remote is configured, contrary to what it still said; record 9-A progress and the open gaps (missing banner.png assets, live --test-enable suite not re-run this session, no v1.0.0 tag yet).
108 lines
5.6 KiB
Markdown
108 lines
5.6 KiB
Markdown
# 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 |
|
|
|
|
### Independent vs. bundled
|
|
|
|
Every product module installs standalone on a stock Odoo 19 CE with only
|
|
its declared Community-core dependencies — none require another
|
|
`community_*` module to function, with one deliberate exception:
|
|
`community_benefits` hard-depends on `community_membership` (a benefit is
|
|
entitled per membership tier, so the dependency is intrinsic to what it
|
|
does). `community_school` and `community_classifieds` *soft*-detect
|
|
`event_qr_ticketing`/`community_membership` when present and degrade
|
|
gracefully without them. `community_portal` soft-detects all of the above
|
|
and only renders cards for whichever are installed. This means each module
|
|
can be sold and installed on its own, or bundled as the full suite.
|
|
|
|
## Local development
|
|
|
|
```bash
|
|
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, and `HANDOFF.md` for exactly where the build
|
|
currently stands, how to resume it, and known gotchas.
|
|
|
|
## 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.
|