Skip to content

v0.7.5

Choose a tag to compare

@mpge mpge released this 22 Oct 16:47
· 60 commits to main since this release
be12fed

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.