zulip/zerver/lib
Zixuan James Li 268f858f39 linkifier: Support URL templates for linkifiers.
This swaps out url_format_string from all of our APIs and replaces it
with url_template. Note that the documentation changes in the following
commits  will be squashed with this commit.

We change the "url_format" key to "url_template" for the
realm_linkifiers events in event_schema, along with updating
LinkifierDict. "url_template" is the name chosen to normalize
mixed usages of "url_format_string" and "url_format" throughout
the backend.

The markdown processor is updated to stop handling the format string
interpolation and delegate the task template expansion to the uri_template
library instead.

This change affects many test cases. We mostly just replace "%(name)s"
with "{name}", "url_format_string" with "url_template" to make sure that
they still pass. There are some test cases dedicated for testing "%"
escaping, which aren't relevant anymore and are subject to removal.
But for now we keep most of them as-is, and make sure that "%" is always
escaped since we do not use it for variable substitution any more.

Since url_format_string is not populated anymore, a migration is created
to remove this field entirely, and make url_template non-nullable since
we will always populate it. Note that it is possible to have
url_template being null after migration 0422 and before 0424, but
in practice, url_template will not be None after backfilling and the
backend now is always setting url_template.

With the removal of url_format_string, RealmFilter model will now be cleaned
with URL template checks, and the old checks for escapes are removed.

We also modified RealmFilter.clean to skip the validation when the
url_template is invalid. This avoids raising mulitple ValidationError's
when calling full_clean on a linkifier. But we might eventually want to
have a more centric approach to data validation instead of having
the same validation in both the clean method and the validator.

Fixes #23124.

Signed-off-by: Zixuan James Li <p359101898@gmail.com>
2023-04-19 12:20:49 -07:00
..
markdown linkifier: Support URL templates for linkifiers. 2023-04-19 12:20:49 -07:00
upload uploads: Add a method to copy attachment contents out. 2023-04-07 09:13:48 -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 message: Use `recipient_type_name` for API message type references. 2023-04-18 12:29:33 -07: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 db: Force use of TimeTrackingCursor to work around Django 4.2 bug. 2023-04-06 17:58:44 -07: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 message: Use `recipient_type_name` for API message type references. 2023-04-18 12:29:33 -07:00
email_mirror_helpers.py
email_notifications.py email: Rewrite followup_day2 email. 2023-04-10 17:44:18 -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 error-bot: Remove ERROR_BOT support. 2023-04-13 14:59:58 -07:00
event_schema.py linkifier: Support URL templates for linkifiers. 2023-04-19 12:20:49 -07:00
events.py linkifier: Support URL templates for linkifiers. 2023-04-19 12:20:49 -07:00
exceptions.py message: Don't allow moving messages that have passed the time limit. 2023-04-11 11:07:23 -07:00
export.py auth: Rewrite data model for tracking enabled auth backends. 2023-04-18 09:22:56 -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 linkifier: Support URL templates for linkifiers. 2023-04-19 12:20:49 -07: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 auth: Rewrite data model for tracking enabled auth backends. 2023-04-18 09:22:56 -07:00
initial_password.py initial_password: Add explicit development environment assertion. 2022-03-21 12:05:59 -07:00
integrations.py integrations: Add Rundeck webhook integration. 2023-04-07 10:13:21 -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 message: Use more accurate `recipient_type` when applying unread event. 2023-04-18 12:29:33 -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 message: Use `recipient_type_name` for API message type references. 2023-04-18 12:29:33 -07: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 zilencer: Avoid creating duplicate remote push registrations. 2023-04-13 15:17:20 -07: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 session: Enforce that changes cannot happen in a transaction. 2022-03-15 13:52:15 -07:00
scheduled_messages.py message_send: Edit scheduled message if its ID is present. 2023-04-14 17:38:37 -07:00
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 auth: Rewrite data model for tracking enabled auth backends. 2023-04-18 09:22:56 -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
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 error-bot: Remove ERROR_BOT support. 2023-04-13 14:59:58 -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 linkifier: Support URL templates for linkifiers. 2023-04-19 12:20:49 -07: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 allow_nobody_group to access_user_group_for_setting. 2023-04-11 09:02:09 -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 'topic_has_visibility_policy' to support INHERIT. 2023-04-18 16:40:57 -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