You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Upgrading
Retention settings default to never, so purge_expired_data removes
nothing new until an admin chooses a period. When one is set, closed tickets
past it are deleted permanently (no soft delete in this package) with their
replies, attachments and stored files; schedule the command daily.
A CSAT or guest-policy save with an invalid value is now rejected instead of
being coerced to a default.
Run the migrations (0034_import_job_user adds a nullable user column).
POST admin/import/<id>/run/ now queues the run instead of running it inside
the request. admin/import/create/ shows the Index screen.
Saving a webhook with the secret field left blank (or not sent) now keeps
the stored secret, because the form no longer receives it. Send clear_secret: true to remove it. The webhook pages read has_secret
instead of secret.
The SSO settings page posts the mask (********) back for a secret the
admin did not change, and it is ignored; any other value replaces the stored
secret, as before. The older abc***** mask is still recognised, here and on
the general Settings page.
Added
Admin Settings sub-pages render the shared Escalated/Admin/Settings/*
screens with escalated-laravel's props and validation:
DataRetention (admin/settings/data-retention/): retention for closed
tickets, attachments and audit logs, the GDPR flag, and a purge preview.
DatabaseConnection (admin/settings/database/): read-only status of
every settings.DATABASES alias (reachable, migrated, ticket count),
marking the one ESCALATED["DATABASE"] routes to. Switching is refused; admin/settings/database/test/ probes one alias as JSON.
EmailSettings (admin/settings/email/): the email channel's addresses
and default reply address (email_addresses, default_reply_address
settings; stored only).
purge_expired_data applies the Data Retention settings.
The admin Import wizard, on escalated-laravel's paths and props: Admin/Import/Index (admin/import/), Connect
(admin/import/<platform>/connect/, with POST .../test-connection/
answering {success[, error]}), Mapping (.../mapping/), Review
(POST .../review/, which writes nothing), start (POST .../start/) and Progress (admin/import/progress/<id>/, polled through admin/import/status/<id>/, with POST admin/import/{pause,resume,cancel}/<id>/).
Sources are still the adapters registered on the import.adapters filter;
core ships none. Tested credentials wait in the session, encrypted, until the
import starts, and are never sent to the browser.
Imports run in the background: after the starting transaction commits, in a
thread by default, or through your task queue by registering the import.run_async action and calling escalated.services.import_runner.run_job.
Import jobs record the admin who started them (ImportJob.user).
Changed
CsatSettings and PublicTickets validate their input, redirect back to
their own page with a success flash (and field errors on a rejected save),
and PublicTickets also accepts PUT. CSAT csat_delay_hours is sent as an
integer. Each sub-page also answers its admin_settings_<page>_update name.
Fixed
Imports wrote no tickets. Contacts failed on any user model without a name
field, which includes Django's own; every ticket failed on a requester_id
the ticket has no field for; a source timestamp broke the save; and an
attachment was written to fields the model does not have. Replies then had
no ticket to attach to.
An imported ticket's status or priority this package does not know is now
saved as open / medium, as escalated-laravel does, and a ticket with no
description takes its subject.
Import mode now also holds back SLA policy attachment and breach checks,
escalation rules and automations, as escalated-laravel's ImportContext does.
The Index, Mapping and Progress screens were sent props the shared pages do
not read; they now get Laravel's.
Security
Stored secrets are no longer sent to admin pages. The SSO settings page
received sso_jwt_secret in plain text, and the general Settings page, which
sends every stored setting, carried the SSO secrets in plain text too; both
now show ******** (an empty string when unset). The general Settings page
also showed the first three characters of the Mailgun signing key, Postmark
inbound token and IMAP password; they are now masked completely. Saving a
webhook with the secret left blank silently removed the stored signing
secret; it now keeps it, and the webhook pages get has_secret instead of secret. Import job pages already left credentials out; they are now built
from an explicit field list with the last 50 errors. 2FA secrets, recovery
codes and API token hashes were already kept out of every page; a test now
guards all of these surfaces.