zulip/zerver/lib
Daniil Fadeev 2f203f4de1 emails: Inline CSS in emails in build_email.
Previously, we had an architecture where CSS inlining for emails was
done at provision time in inline_email_css.py. This was necessary
because the library we were using for this, Premailer, was extremely
slow, and doing the inlining for every outgoing email would have been
prohibitively expensive.

Now that we've migrated to a more modern library that inlines the
small amount of CSS we have into emails nearly instantly, we are able
to remove the complex architecture built to work around Premailer
being slow and just do the CSS inlining as the final step in sending
each individual email.

This has several significant benefits:

* Removes a fiddly provisioning step that made the edit/refresh cycle
  for modifying email templates confusing; there's no longer a CSS
  inlining step that, if you forget to do it, results in your testing a
  stale variant of the email templates.
* Fixes internationalization problems related to translators working
  with pre-CSS-inlined emails, and then Django trying to apply the
  translators to the post-CSS-inlined version.
* Makes the send_custom_email pipeline simpler and easier to improve.

Signed-off-by: Daniil Fadeev <fadeevd@zulip.com>
2023-04-05 12:22:29 -07:00
..
markdown help center: Document SAML configuration steps with Auth0. 2023-03-30 09:11:55 -07:00
upload semgrep: Detect some unsafe uses of markupsafe.Markup. 2023-03-22 11:23:27 -07:00
url_preview ruff: Fix RSE102 Unnecessary parentheses on raised exception. 2023-02-04 16:34:55 -08:00
webhooks integration: Support reviewer in `get_pull_request_event_message`. 2023-03-29 18:13:36 -07:00
__init__.py
addressee.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
alert_words.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
async_utils.py requirements: Upgrade Python requirements. 2022-05-03 10:10:06 -07:00
attachments.py upload: Rename delete_message_image to use word "attachment". 2023-03-02 16:36:19 -08:00
avatar.py settings: Make DEFAULT_LOGO_URI/DEFAULT_AVATAR_URI use staticfiles. 2023-02-14 17:17:06 -05:00
avatar_hash.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
bot_config.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
bot_lib.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
bot_storage.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
bulk_create.py settings: Add backend code for using user email_address_visibility setting. 2023-02-10 17:35:49 -08:00
cache.py cache: Use QuerySetAny for isinstance check. 2023-03-17 08:38:20 -07:00
cache_helpers.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
camo.py typing: Apply trivial none-checks with assertions as necessary. 2022-06-23 19:25:48 -07:00
ccache.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
compatibility.py ruff: Fix DTZ004 `datetime.datetime.utcfromtimestamp()`. 2023-01-04 16:25:07 -08:00
context_managers.py
create_user.py actions: Implement do_delete_user_preserving_messages function. 2023-03-29 12:51:21 -07:00
data_types.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
db.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
debug.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
dev_ldap_directory.py tests: Update tests to use example profile picture. 2022-10-31 14:36:54 -07:00
digest.py ruff: Fix C414 Unnecessary `list` call within `sorted()`. 2022-11-03 12:10:15 -07:00
display_recipient.py typing: Import ValuesQuerySet alias from django_stubs_ext. 2022-10-05 16:15:56 -07:00
domains.py
drafts.py typing: Remove ViewFuncT. 2022-08-22 15:46:16 -07:00
email_mirror.py requirements: Upgrade Python requirements. 2023-04-03 22:39:21 -07:00
email_mirror_helpers.py
email_notifications.py user_settings: Automate 'Include realm name in message email subject'. 2023-03-14 17:48:57 -07:00
email_validation.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
emoji.py emoji: Disallow `.` in custom emoji names. 2023-01-31 17:28:33 -08:00
error_notify.py blueslip: Report the built client version, as well as server version. 2023-03-07 10:51:45 -08:00
event_schema.py users: Always pass "delivery_email" field in user objects. 2023-02-10 17:35:49 -08:00
events.py user_topics: Introduce visibility policy enum subclass in models.py. 2023-03-14 17:50:45 -07:00
exceptions.py exceptions: Accept lazy translation as JsonableError argument. 2023-02-03 16:36:54 -08:00
export.py export: Make --deactivate-realm exports be imported as active. 2023-04-03 16:08:43 -07:00
external_accounts.py typing: Import StrPromise alias from django_stubs_ext. 2022-10-05 16:15:56 -07:00
fix_unreads.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
generate_test_data.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
github.py ruff: Fix RSE102 Unnecessary parentheses on raised exception. 2023-02-04 16:34:55 -08:00
home.py sentry: Add frontend event monitoring. 2023-03-07 10:51:45 -08:00
hotspots.py ruff: Fix SIM118 Use `key in dict` instead of `key in dict.keys()`. 2023-01-04 16:25:07 -08:00
html_diff.py html_diff: Fix lxml import. 2023-03-05 14:46:28 -08:00
html_to_text.py
i18n.py django: Use HttpRequest.headers. 2022-05-13 20:42:20 -07:00
import_realm.py import_realm: Keep the realm deactivated until import is complete. 2023-04-03 16:08:43 -07:00
initial_password.py
integrations.py integrations: Add documentation for Mastodon via public RSS feeds. 2023-03-30 09:36:16 -07:00
logging_util.py ruff: Fix SIM105 Use `contextlib.suppress` instead of try-except-pass. 2023-01-23 11:18:36 -08:00
management.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
mdiff.py node_tests: Move to web/tests. 2023-02-23 16:04:17 -08:00
mention.py markdown: Update characters allowed before @ and stream mentions. 2022-08-06 19:29:39 -07:00
message.py user_topics: Update lib functions to work with any visibility_policy. 2023-03-29 09:50:06 -07:00
migrate.py
mobile_auth_otp.py
muted_users.py muted users: Make file naming consistent. 2023-02-10 15:39:57 -08:00
name_restrictions.py name_restrictions: Add your-org.zulipchat.com as a reserved name. 2022-05-17 14:58:31 -07:00
narrow.py narrow: Support underscore version of "pm-with" and "group-pm-with". 2023-03-24 11:54:50 -07:00
notes.py notes: Separate __notes_map per-subclass. 2022-10-10 08:42:13 -07:00
notification_data.py user_topics: Introduce visibility policy enum subclass in models.py. 2023-03-14 17:50:45 -07:00
onboarding.py web: Save a needless 301 redirect from /apps to /apps/. 2023-03-24 14:51:01 -07:00
outgoing_http.py
outgoing_webhook.py outgoing-webhook: Update Slack outgoing webhook error for private messages. 2023-02-24 11:47:26 -08:00
presence.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
profile.py
push_notifications.py push-notifications: Update strings for private messages. 2023-02-24 11:47:26 -08:00
pysa.py
queue.py queue: Allow enabling TLS for the RabbitMQ connection. 2023-03-23 16:02:10 -07:00
rate_limiter.py ruff: Fix RSE102 Unnecessary parentheses on raised exception. 2023-02-04 16:34:55 -08:00
realm_description.py
realm_icon.py settings: Make DEFAULT_LOGO_URI/DEFAULT_AVATAR_URI use staticfiles. 2023-02-14 17:17:06 -05:00
realm_logo.py settings: Make DEFAULT_LOGO_URI/DEFAULT_AVATAR_URI use staticfiles. 2023-02-14 17:17:06 -05:00
recipient_users.py private-messages: Update translated backend strings use "direct message". 2023-02-24 11:47:26 -08:00
redis_utils.py
remote_server.py remote_server: Check for missing ZULIP_ORG_ID, ZULIP_ORG_KEY. 2023-01-04 11:08:56 -08:00
request.py response: Implement ignored parameters with MutableJsonResponse class. 2023-03-06 10:33:13 -08:00
response.py response: Implement ignored parameters with MutableJsonResponse class. 2023-03-06 10:33:13 -08:00
rest.py ruff: Fix RSE102 Unnecessary parentheses on raised exception. 2023-02-04 16:34:55 -08:00
retention.py python: Update tuple handling pattern; returned by a delete() query. 2023-03-27 16:18:23 -07:00
safe_session_cached_db.py
scim.py mypy: Enable redundant-expr errors. 2022-06-23 19:22:12 -07:00
scim_filter.py
send_email.py emails: Inline CSS in emails in build_email. 2023-04-05 12:22:29 -07:00
server_initialization.py realms: Create default system user groups for internal realm. 2022-08-11 04:38:36 -07:00
sessions.py typing: Add none-checks for miscellaneous cases. 2022-05-31 09:43:55 -07:00
singleton_bmemcached.py requirements: Upgrade Python requirements. 2023-04-03 22:39:21 -07:00
soft_deactivation.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
sounds.py
sqlalchemy_utils.py
storage.py ruff: Fix PLE0101 Explicit return in `__init__`. 2023-02-23 11:47:08 -08:00
stream_color.py
stream_subscription.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
stream_topic.py message_send: Handle notifications for UNMUTED topic in a muted stream. 2023-03-06 19:15:45 -08:00
stream_traffic.py
streams.py user_topics: Rename the 'zerver/lib/user_topics' functions. 2023-04-03 22:31:49 -07:00
string_validation.py email_mirror: Replace disallowed characters in incoming email subject. 2022-08-22 17:16:20 -07:00
subdomains.py settings: Allow customization of STATIC_URL. 2023-02-14 17:17:06 -05:00
subscription_info.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
templates.py requirements: Upgrade Python requirements. 2023-04-03 22:39:21 -07:00
test_classes.py tests: Update ZulipTestCase.tearDown to remove local uploads. 2023-03-28 14:38:06 -07:00
test_console_output.py create-test-api-docs: Remove. 2023-03-24 11:55:12 -07:00
test_data.source.txt
test_fixtures.py ruff: Fix ANN204 missing return type annotation for __init__. 2022-11-16 09:29:11 -08:00
test_helpers.py create-test-api-docs: Remove. 2023-03-24 11:55:12 -07:00
test_runner.py avatars: Serve /user_avatars/ through Django, which offloads to nginx. 2023-01-09 18:23:58 -05:00
tex.py
thumbnail.py docs: Remove some outdated references to thumbnailing.md doc. 2022-07-12 17:44:24 -07:00
timeout.py ruff: Fix N818 exception name should be named with an Error suffix. 2022-11-17 16:52:00 -08:00
timestamp.py timestamp: Switch to a slightly faster datetime_to_timestamp. 2023-02-23 12:15:13 -08:00
timezone.py timezone: Improve tzdata parser’s compatibility with zic(8). 2022-09-20 16:58:31 -07:00
topic.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
transfer.py uploads: Add LOCAL_AVATARS_DIR / LOCAL_FILES_DIR computed settings. 2023-01-09 18:23:58 -05:00
types.py streams: Refactor code to set group-based stream settings. 2023-02-22 12:17:46 -08:00
unminify.py unminify: Do not assume /static/ exists in the stacktrace. 2023-02-14 17:17:06 -05:00
url_encoding.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
url_redirects.py web: Save a needless 301 redirect from /hello to /hello/. 2023-03-24 14:51:01 -07:00
user_agent.py
user_counts.py actions: Split out zerver.lib.user_counts. 2022-04-14 17:14:30 -07:00
user_groups.py user_groups: Add "Nobody" system user group. 2023-03-28 14:26:22 -07:00
user_message.py
user_status.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
user_topics.py user_topics: Update 'set visibility policy' codepath for bulk db operations. 2023-03-29 09:50:06 -07:00
users.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
utils.py
validator.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
widget.py
zcommand.py actions: Split out zerver.actions.user_settings. 2022-04-14 17:14:34 -07:00
zephyr.py