Module Architecture
flowchart TD
SUBSMOD["sadeem_subscription\nSubscription Base"]
PKG["sadeem.subscription.trial.package\npackage config · duration\nresource limits · trial type"]
LIM["sadeem.subscription.trial.model.limit\nper-model record limits\nfor trial package"]
REQ["sadeem.subscription.trial.requests\ntrial request from customer\ncompany · email · mobile"]
SUB["sadeem.subscription\ncreated from approved request"]
WEB[/public trial form\n/saas/trial or /saas/trial/url/]
SUBSMOD --> SUB
PKG --> LIM
WEB --> REQ
REQ --> PKG
PKG --> A1([define_auto_run\nauto-create + confirm subscription])
PKG --> A2([success_message\ncustomizable per-package message])
REQ --> A3([action_create_subscription\ncreate sadeem.subscription from request])
REQ --> A4([action_create_partner\ncreate res.partner from request data])
REQ --> A5([action_confirm\napprove request → trigger auto-run])
REQ --> A6([action_reject\nreject trial request])
A3 --> SUB
A4 --> REQ
CTRL[/website controller\n/saas/trial route/]
WEB --> CTRL
CTRL --> REQ
Module Description
SAAS Subscription Trial - Allows potential customers to request trial subscriptions through
a public website form. Supports customizable trial packages with configurable duration,
resource limits, and automatic subscription creation.
Dependencies
base, web, mail, website
sadeem_subscription
Website
└─ Trial Subscriptions
├─ Trial Packages
└─ Trial Requests
Trial Flow
Customer fills form → Trial Request created → Partner created → Subscription created → Build & Run
- Customer visits
/saas/trial or /saas/trial/<package-url>
- Fills out the trial form (name, company, email, mobile, company size)
- System creates a trial request record and a partner record
- If Auto Run Subscription is enabled on the package, the subscription is automatically created, confirmed, and queued for deployment
- Customer sees a success message (customizable per package)
Key Fields
Trial Package (sadeem.subscription.trial.package)
| Field |
Type |
Description |
| url_string |
Char |
URL slug for the trial form (e.g., my-package) (required) |
| package_url |
Char |
Full computed URL to the public trial form |
| publish |
Boolean |
Whether this package is publicly visible |
| auto_run_subscription |
Boolean |
Auto-create and confirm subscription on request |
| trial_duration |
Integer |
Trial length in days (required; default: 14) |
| grace_period |
Integer |
Extra days after trial end before stopping (default: 3) |
| user_limit |
Integer |
Maximum users allowed during trial (required) |
| storage_limit |
Integer |
Storage quota in MB (required) |
| stage_count |
Integer |
Number of extra stages allowed (default: 0) |
| backup_enabled |
Boolean |
Whether backups are enabled for trial instances |
| subscription_package_ids |
Many2many |
Odoo module packages installed on trial instances |
| subscription_type |
Selection |
Deployment type (docker or dbfilter) |
| model_limit_ids |
One2many |
Per-model record limits for the trial |
| success_message |
Html |
Message shown to customer after submitting request |
| database_template |
Many2one |
Database template to restore on trial instance creation |
Trial Model Limit (sadeem.subscription.trial.model.limit)
| Field |
Type |
Description |
| trial_package_id |
Many2one |
Parent trial package |
| model_name |
Char |
Technical Odoo model name to limit (required) |
| record_limit |
Integer |
Maximum number of records (required; default: 100) |
Trial Request (sadeem.subscription.trial.requests)
| Field |
Type |
Description |
| name |
Char |
Contact name (required) |
| company_name |
Char |
Customer company name (required) |
| email |
Char |
Contact email (required) |
| mobile |
Char |
Contact mobile number (required) |
| company_size |
Selection |
1_10, 11_50, 51_200, 201_500, 500_plus |
| trial_package_id |
Many2one |
The trial package requested |
| related_partner_id |
Many2one |
Created res.partner linked to this request |
| subscription_id |
Many2one |
Created sadeem.subscription linked to this request |
| state |
Selection |
Request lifecycle: new, processing, done, cancelled |
| notes |
Text |
Internal notes |
| database_template |
Many2one |
Database template override for this specific request |
Subscription — Trial additions (sadeem.subscription inherit)
| Field |
Type |
Description |
| is_trial |
Boolean |
Whether this subscription was created from a trial request |
Lifecycle & States
Trial Request States
| State |
Meaning |
new |
Request received, not yet processed |
processing |
Subscription creation in progress |
done |
Subscription successfully created |
cancelled |
Request was rejected or manually cancelled |
Transitions:
- new → processing → done: action_create_subscription creates the subscription; if auto_run_subscription is True, also confirms and queues deployment
- new → cancelled: action_cancel
- cancelled → new: action_reset_to_new
Key Actions
| Action |
Model |
Description |
action_create_subscription |
sadeem.subscription.trial.requests |
Creates a sadeem.subscription from the request; optionally auto-confirms and runs if auto_run_subscription is set |
action_cancel |
sadeem.subscription.trial.requests |
Cancels the trial request |
action_reset_to_new |
sadeem.subscription.trial.requests |
Resets a cancelled request back to new |
action_view_subscription |
sadeem.subscription.trial.requests |
Opens the linked subscription record |
action_view_partner |
sadeem.subscription.trial.requests |
Opens the linked partner record |
define_auto_run |
sadeem.subscription.trial.package |
Called when auto_run_subscription is True; triggers subscription confirm and provisioning |
success_message |
sadeem.subscription.trial.package |
Returns the HTML success message shown to the customer |
Warnings & Important Notes
- Subscription creation blocked:
action_create_subscription raises ValidationError if state is not new or processing, or if a subscription already exists for the request.
- Cannot cancel completed requests:
action_cancel raises ValidationError if state is done.
- Can only reset cancelled requests:
action_reset_to_new raises ValidationError if state is not cancelled.
- SQL constraint on email:
_sql_constraints enforces unique email per trial request (prevents duplicate submissions).
- Trial duration required:
trial_duration is required=True on the trial package.
- User and storage limits required: Both
user_limit and storage_limit are required=True on the trial package.