feat: HTTP caching on API endpoints by ankush [frappe] PR#29997
From: https://github.com/frappe/frappe/pull/29997
Date: 2025-01-24 19:32:40+05:30
- test: skip HTTP caching in tests
- fix: only cache if called directly
- perf: proxy-cache website_script.js
- perf: cache "is_document_amended"
- fix: Never use HTTP cache in developer mode
- perf: Cache plain link validation for 30 minutes
- perf: slow down auto-refresh even more
- perf: cache
get_eventson desk load - perf: cache notifications for 1 minute
- feat: Decorator to cache API response using cache-control headers
- refactor: use response_headers to set cache control headers
- feat: custom response header support
- fix: update instead of extend
Diagnostics
pre-commit failed for source commit: 32054b0757061927bacb462dad8a6919c3d11f78
[WARNING] top-level `default_stages` uses deprecated stage names (commit) which will be removed in a future version. run: `pre-commit migrate-config` to automatically fix this.
frappe/desk/reportview.py:646:13: RUF005 Consider `[*filters, [column, "!=", ""]]` instead of concatenation
|
644 | doctype,
645 | fields=[column, "count(*)"],
646 | filters=filters + [[column, "!=", ""]],
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RUF005
647 | group_by=column,
648 | as_list=True,
|
= help: Replace with `[*filters, [column, "!=", ""]]`
frappe/desk/reportview.py:657:14: RUF005 Consider `[*filters, [column, "in", ("", ",")]]` instead of concatenation
|
655 | doctype,
656 | fields=[column, "count(*)"],
657 | filters=filters + [[column, "in", ("", ",")]],
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RUF005
658 | as_list=True,
659 | group_by=column,
|
= help: Replace with `[*filters, [column, "in", ("", ",")]]`
frappe/desk/reportview.py:718:15: RUF005 Consider iterable unpacking instead of concatenation
|
716 | doctype,
717 | fields=[tag["name"], "count(*)"],
718 | filters=filters + ["({0} = '' or {0} is null)".format(tag["name"])],
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ RUF005
719 | as_list=True,
720 | )[0][1],
|
= help: Replace with iterable unpacking
Found 3 errors.
No fixes available (3 hidden fixes can be enabled with the `--unsafe-fixes` option).
pre-commit failed for source commit: 378b638d34044ecedcb7be56dbf9718d11e50b02
[WARNING] top-level `default_stages` uses deprecated stage names (commit) which will be removed in a future version. run: `pre-commit migrate-config` to automatically fix this.
frappe/utils/caching.py:104:31: RUF013 PEP 484 prohibits implicit `Optional`
|
102 | """
103 |
104 | def time_cache_wrapper(func: Callable = None) -> Callable:
| ^^^^^^^^ RUF013
105 | func_key = f"{func.__module__}.{func.__name__}"
|
= help: Convert to `T | None`
frappe/utils/caching.py:171:20: RUF013 PEP 484 prohibits implicit `Optional`
|
169 | """
170 |
171 | def wrapper(func: Callable = None) -> Callable:
| ^^^^^^^^ RUF013
172 | func_key = f"{func.__module__}.{func.__qualname__}"
|
= help: Convert to `T | None`
Found 2 errors.
No fixes available (2 hidden fixes can be enabled with the `--unsafe-fixes` option).
pre-commit failed for source commit: f177bb28a77ef3b55a2b78b1ca9767f009831a57
[WARNING] top-level `default_stages` uses deprecated stage names (commit) which will be removed in a future version. run: `pre-commit migrate-config` to automatically fix this.
frappe/public/js/frappe/ui/notifications/notifications.js
pre-commit failed for source commit: 2b1df9aa56e5ac0eb9827f95b64a70e693ac882a
[WARNING] top-level `default_stages` uses deprecated stage names (commit) which will be removed in a future version. run: `pre-commit migrate-config` to automatically fix this.
frappe/desk/doctype/event/event.py:429:5: F821 Undefined name `field_map`
|
428 | additional_fields = ""
429 | if field_map:
| ^^^^^^^^^ F821
430 | additional_fields = ", " + ", ".join(
431 | [f"`tabEvent`.{f}" for f in frappe.parse_json(field_map).values()]
|
frappe/desk/doctype/event/event.py:431:50: F821 Undefined name `field_map`
|
429 | if field_map:
430 | additional_fields = ", " + ", ".join(
431 | [f"`tabEvent`.{f}" for f in frappe.parse_json(field_map).values()]
| ^^^^^^^^^ F821
432 | )
|
frappe/desk/doctype/event/event.py:434:79: F821 Undefined name `ignore_permissions`
|
432 | )
433 |
434 | filter_condition = get_filters_cond("Event", filters, [], ignore_permissions=ignore_permissions)
| ^^^^^^^^^^^^^^^^^^ F821
435 |
436 | tables = ["`tabEvent`"]
|
frappe/desk/doctype/event/event.py:493:29: F821 Undefined name `limit_page_length`
|
491 | filter_condition=filter_condition,
492 | reminder_condition="AND coalesce(`tabEvent`.send_reminder, 0)=1" if for_reminder else "",
493 | limit_condition=f"LIMIT {limit_page_length} OFFSET {limit_start}" if limit_page_length else "",
| ^^^^^^^^^^^^^^^^^ F821
494 | order_by="`tabEvent`.starts_on desc" if limit_page_length else "`tabEvent`.starts_on",
495 | additional_condition=additional_condition or "",
|
frappe/desk/doctype/event/event.py:493:56: F821 Undefined name `limit_start`
|
491 | filter_condition=filter_condition,
492 | reminder_condition="AND coalesce(`tabEvent`.send_reminder, 0)=1" if for_reminder else "",
493 | limit_condition=f"LIMIT {limit_page_length} OFFSET {limit_start}" if limit_page_length else "",
| ^^^^^^^^^^^ F821
494 | order_by="`tabEvent`.starts_on desc" if limit_page_length else "`tabEvent`.starts_on",
495 | additional_condition=additional_condition or "",
|
frappe/desk/doctype/event/event.py:493:73: F821 Undefined name `limit_page_length`
|
491 | filter_condition=filter_condition,
492 | reminder_condition="AND coalesce(`tabEvent`.send_reminder, 0)=1" if for_reminder else "",
493 | limit_condition=f"LIMIT {limit_page_length} OFFSET {limit_start}" if limit_page_length else "",
| ^^^^^^^^^^^^^^^^^ F821
494 | order_by="`tabEvent`.starts_on desc" if limit_page_length else "`tabEvent`.starts_on",
495 | additional_condition=additional_condition or "",
|
frappe/desk/doctype/event/event.py:494:44: F821 Undefined name `limit_page_length`
|
492 | reminder_condition="AND coalesce(`tabEvent`.send_reminder, 0)=1" if for_reminder else "",
493 | limit_condition=f"LIMIT {limit_page_length} OFFSET {limit_start}" if limit_page_length else "",
494 | order_by="`tabEvent`.starts_on desc" if limit_page_length else "`tabEvent`.starts_on",
| ^^^^^^^^^^^^^^^^^ F821
495 | additional_condition=additional_condition or "",
496 | ),
|
frappe/desk/doctype/event/event.py:495:25: F821 Undefined name `additional_condition`
|
493 | limit_condition=f"LIMIT {limit_page_length} OFFSET {limit_start}" if limit_page_length else "",
494 | order_by="`tabEvent`.starts_on desc" if limit_page_length else "`tabEvent`.starts_on",
495 | additional_condition=additional_condition or "",
| ^^^^^^^^^^^^^^^^^^^^ F821
496 | ),
497 | {
|
Found 8 errors.
1 file reformatted, 1 file left unchanged
pre-commit failed for source commit: 6328421fdedab243678a4435d1a0cc2553c4d95f
[WARNING] top-level `default_stages` uses deprecated stage names (commit) which will be removed in a future version. run: `pre-commit migrate-config` to automatically fix this.
frappe/utils/caching.py:104:31: RUF013 PEP 484 prohibits implicit `Optional`
|
102 | """
103 |
104 | def time_cache_wrapper(func: Callable = None) -> Callable:
| ^^^^^^^^ RUF013
105 | func_key = f"{func.__module__}.{func.__name__}"
|
= help: Convert to `T | None`
frappe/utils/caching.py:171:20: RUF013 PEP 484 prohibits implicit `Optional`
|
169 | """
170 |
171 | def wrapper(func: Callable = None) -> Callable:
| ^^^^^^^^ RUF013
172 | func_key = f"{func.__module__}.{func.__qualname__}"
|
= help: Convert to `T | None`
Found 2 errors.
No fixes available (2 hidden fixes can be enabled with the `--unsafe-fixes` option).
Checkout instructions
# Checkout locally
git fetch upstream
git switch ft-pr-29997
# Alternatively, re-take the changes
git switch develop
ft take ft-pr-29997
# Make changes then rebase
git rebase -i develop
# Fix or ignore conflicts
git checkout --theirs .
git rebase --continue
# Force-push changes
git push --force-with-lease