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_events on 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

Merge request reports

Loading