Version 13 (modified by 11 years ago) ( diff ) | ,
---|
S3 Subscriptions / Notifications ¶
Table of Contents
The S3Notifications
framework is used to send automatic update notifications to subscribers.
Subscriptions ¶
Users can subscribe to get notified when new records get created or records get updated in a resource.
Subscriptions can be filtered (using saved filters) to limit notifications to records matching certain filter criteria.
Data Model ¶
Subscriptions use the S3SubscriptionsModel in modules/s3db/pr.py:
The pr_subscription
table stores the notification settings and links to the subscriber person entity (user) and the filter.
The pr_subscription_resource
table is a component of pr_subscription
and stores the name of the resource and the URL of the controller to check for updates.
All resources in a subscription use the same filter. If different filters are to be used, multiple subscriptions are required.
GUI ¶
No generic user interface for subscriptions has been implemented so far.
A custom interface can be found in private/templates/DRMP/controllers.py. This interface manages a single subscription per user with multiple resources using a common filter.
Notifications ¶
Data Model ¶
Notifications build on the S3SubscriptionModel
(see above) and the web2py Scheduler (for running tasks and logging).
Process ¶
The notification process has 4 phases:
- A background task "notify_check_subscriptions" (installed in zzz_1st_run.py) is run every 5 minutes to check for updates of resources which have subscriptions. This task schedules a separate, asynchronous "notify_notify" task for each resource/subscription pair which has updates.
- Each "notify_notify" task generates a local HTTP POST request to the subscribed controller (request format "msg"), applying the subscription filters.
- This request is handled by the
S3Notifications.send()
method, impersonating the subscriber. The send() method extracts the new/updated records, and renders and sends the notification message(s) to the subscriber. Sending of the messages usescurrent.msg.send_by_pe_id()
, which in turn uses the contact information of the subscriber stored inpr_contact
. - Messages are send asynchronously by the msg_process_outbox task.
Framework ¶
All parts of the notifications framework are implemented as S3Notifications
class in modules/s3/s3notify.py.
To impersonate the subscriber for send(), S3Notifications.notify()
sends a temporary, single-use auth token together with the POST request. This auth token is handled in models/00_utils.py.
Notifications require a scheduler worker process to run in the background.
Message Templates ¶
Rendering of notification messages happens in two phases:
- Pre-rendering using a hook function
- Rendering via web2py view templates (message templates)
The pre-rendering is to convert the extracted data into a suitable format for the message template. The pre-rendering routine is configurable both per deployment-template and per resource (resource-specific overrides deployment-specific), the default pre-renderer is S3Notifications._render()
.
The message templates are web2py view templates stored in private/template/XYZ/views/msg (falling back to views/msg).
Template names use a prefix (default: "notify") and the notification method name, like: notify_email.html (=template for email notifications).
The template name prefix can be configured per resource (using the "notify_template" setting), the default is "notify".
Message templates for EMAIL can further use a format suffix "html" or "text" (e.g. notify_email_html.html) - where both fall back to the name without suffix.
Any deployment-template-specific message templates (including fallbacks) is preferred over any default templates.
Configuration ¶
Per Deployment ¶
- in private/templates/XYZ/config.py or 000_config.py
Setting | Explanation |
settings.msg.notify_renderer | Pre-renderer function, render(resource, data, meta_data, format=None) |
settings.msg.notify_subject | Template for the subject line of notification emails |
settings.msg.notify_email_format | Preferred email format (can be overridden per subscription) - "html" or "text" |
Per Resource ¶
- with s3db.configure()
Setting | Explanation |
notify_fields | Fields to extract for notification emails (like list_fields) |
notify_renderer | Pre-renderer function, see settings.msg.notify_renderer |
notify_template | Prefix for the message template(s) |
Attachments (2)
- subscription_model.png (18.4 KB ) - added by 12 years ago.
- notification_process.png (30.9 KB ) - added by 12 years ago.
Download all attachments as: .zip