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_hash.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
avatar.py settings: Make DEFAULT_LOGO_URI/DEFAULT_AVATAR_URI use staticfiles. 2023-02-14 17:17:06 -05: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_helpers.py python: Import F, Q, QuerySet from their canonical module. 2023-03-05 14:46:28 -08:00
cache.py cache: Use QuerySetAny for isinstance check. 2023-03-17 08:38:20 -07: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_helpers.py email_mirror: Move ZulipEmailForwardUserError into email_mirror_helpers. 2021-08-31 16:37:54 -07:00
email_mirror.py requirements: Upgrade Python requirements. 2023-04-03 22:39:21 -07:00
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 initial_password: Add explicit development environment assertion. 2022-03-21 12:05:59 -07:00
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 typing: Replace CursorObj by CursorWrapper. 2021-08-20 05:54:19 -07:00
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 python: Replace requests.packages.urllib3 alias with urllib3. 2022-01-23 22:14:17 -08:00
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 profile: Strengthen decorator types using ParamSpec. 2022-04-14 12:44:35 -07:00
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 markdown: Refactor out additional properties added to Message. 2021-06-24 18:14:53 -07:00
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 session: Enforce that changes cannot happen in a transaction. 2022-03-15 13:52:15 -07:00
scim_filter.py scim: Order Users by id when queried using filter syntax. 2021-11-26 16:06:16 -08:00
scim.py mypy: Enable redundant-expr errors. 2022-06-23 19:22:12 -07:00
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 actions: Split out zerver.lib.sounds. 2022-04-14 14:26:40 -07:00
sqlalchemy_utils.py sqlalchemy_utils: Remove NonClosingPool.recreate override. 2022-02-10 11:59:41 -08:00
storage.py ruff: Fix PLE0101 Explicit return in __init__. 2023-02-23 11:47:08 -08:00
stream_color.py streams: Extract stream_color library. 2022-03-14 18:01:36 -07:00
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: Extract stream_traffic library. 2022-03-14 18:01:36 -07:00
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 Rename default branch to ‘main’. 2021-09-06 12:56:35 -07:00
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 python: Replace universal_newlines with text. 2022-01-23 22:16:01 -08:00
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 actions: Split out zerver.lib.user_message. 2022-04-14 17:14:30 -07:00
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 utils: Remove unused split_by function. 2021-08-19 01:51:37 -07:00
validator.py black: Reformat with Black 23. 2023-02-02 10:40:13 -08:00
widget.py poll widget: Add server validation. 2021-06-14 17:46:16 -07:00
zcommand.py actions: Split out zerver.actions.user_settings. 2022-04-14 17:14:34 -07:00
zephyr.py