Integrated Training & Resource Platform
A Django and Wagtail application combining content management, training events, authenticated resources, Salesforce data, learning management, user provisioning, and custom file workflows in a single web platform.
- AWS S3
- Celery
- Django
- Heroku
- LMS
- PostgreSQL
- Python
- REST API
- Salesforce
- Wagtail
- Webhooks
This project combines a public-facing website with an authenticated training and resource platform. Rather than operating as a standalone website, the application connects several systems responsible for different parts of the organization's training program.
Salesforce serves as a primary source for program, participant, and training data, while Coassemble provides online learning. Django provides the core application platform, including authentication, user provisioningbusiness logic, integrations, and data processing. Wagtail adds the content management layer, allowing editors to manage the public-facing website and other editorial content within the same application. PostgreSQL stores application data and synchronized information needed by the website.
The goal is to provide users with a consistent experience across website content, events, resources, and online training without requiring them to understand which underlying system manages each piece of information.
A central design principle is to keep responsibilities clearly divided between systems rather than attempting to make one platform the source of truth for everything.
The application is built on Django, which provides the core application architecture, data models, authentication, business logic, integrations, and background processing. Wagtail runs on top of Django as the content management layer, giving editors control over pages and other editorial content without requiring the CMS to own application data or integration workflows.
Salesforce remains the source for business records and most training information, while Coassemble manages online courses and learning activity. Django connects these systems and combines their data with Wagtail-managed content to provide a single web experience.
Data moves between systems using REST APIs, webhooks, background processing, and scheduled synchronization. Information needed frequently by the website is stored locally in PostgreSQL rather than requiring an external API request for every visitor interaction.
This separation allows each platform to handle the work it is best suited for while keeping the website responsive and reducing unnecessary dependencies between systems.
Salesforce is deeply integrated with the application rather than treated as a separate administrative system.
Information maintained in Salesforce is synchronized with the website so it does not have to be maintained independently in multiple places. Depending on the workflow, updates can be delivered through webhooks for near-real-time processing or retrieved through scheduled synchronization.
Incoming information is validated and transformed before being stored in the application's own data model. This provides a deliberate boundary between Salesforce's representation of the data and the representation needed by the website.
Keeping frequently used information in PostgreSQL also allows the application to provide responsive searches, calendars, and other functionality without depending on Salesforce being available for every web request.
User management and training activity span Salesforce, the website, and Coassemble, with Django coordinating the workflows between them.
User provisioning begins with information maintained in Salesforce. Integration workflows create or update the corresponding application account and coordinate access to Coassemble, reducing the need for administrators to maintain the same users manually across multiple systems.
The integration also works in the opposite direction. Coassemble sends training activity, including enrollment and completion information, to Django through webhooks. The application validates and processes those updates before writing the relevant information back to Salesforce through its API.
This allows Salesforce to remain informed about participant training activity without becoming responsible for delivering online learning, while Coassemble can remain focused on course delivery rather than serving as the organization's broader system of record.
The website also provides authenticated and gated resources alongside public content, allowing account and program information from the same application architecture to control access where appropriate.
Training events represent a significant part of the application and are primarily managed in Salesforce.
When events are created or updated, integration workflows synchronize those changes with the website so updated information can be displayed with minimal delay. A scheduled full synchronization provides an additional safety net, reconciling the systems if an individual update is missed because of a webhook failure, network problem, authentication issue, or temporary service outage.
Not every event follows the same workflow. Annual conferences and selected industry events can be managed through the website CMS when Salesforce is not the appropriate source.
The application brings these different sources together into a consistent event experience, including calendar and event-detail interfaces, while allowing each type of event to be maintained in the system best suited to managing it.
External integrations are designed around the assumption that individual requests and services will occasionally fail.
Webhooks provide timely updates where appropriate, while scheduled synchronization provides redundancy and eventual consistency. Longer-running work can be handled asynchronously with Celery and Redis rather than delaying normal web requests.
Logging and error reporting provide visibility into failed operations, while synchronization processes are designed to isolate individual failures where possible rather than requiring an entire data set to be rebuilt.
The application also includes custom file-management workflows that use Amazon S3 for file storage while retaining the appropriate associations with business records. Short-lived signed URLs allow files to move directly between the browser and S3 without exposing AWS credentials or unnecessarily routing large uploads through other systems.
Accessibility, security, testing, backups, and ongoing maintenance are treated as part of the application's operational requirements. The interface is developed with WCAG 2.2 AA as a general accessibility target, while structured CMS components help content managers maintain accessible and consistent pages over time.
The application is deployed through separate development, staging, and production environments, with automated testing, database backups, logging, and dependency maintenance supporting continued development as program requirements and connected systems evolve.