-
-
Notifications
You must be signed in to change notification settings - Fork 306
Image optimization, lazy loading, and static asset performance improvements #5252
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Image optimization, lazy loading, and static asset performance improvements #5252
Conversation
|
👋 Hi @Nachiket-Roy! This pull request needs a peer review before it can be merged. Please request a review from a team member who is not:
Once a valid peer review is submitted, this check will pass automatically. Thank you! |
WalkthroughThis PR integrates development and debugging tools (Silk, Django Debug Toolbar, LiveReload), adds WhiteNoise static file storage, restructures template configuration based on DEBUG mode, updates project dependencies, and introduces a PNG-to-WebP image conversion utility script. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
blt/settings.py (1)
114-136: SilkyMiddleware enabled unconditionally in production.
silk.middleware.SilkyMiddlewareat line 115 is outside the DEBUG block. This will intercept and profile every request in production, causing performance degradation and storing profiling data unnecessarily.Move SilkyMiddleware inside the DEBUG condition:
MIDDLEWARE = [ - "silk.middleware.SilkyMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", # ... other middleware ... ] if DEBUG: - MIDDLEWARE += ("livereload.middleware.LiveReloadScript", "debug_toolbar.middleware.DebugToolbarMiddleware") + MIDDLEWARE = ["silk.middleware.SilkyMiddleware"] + MIDDLEWARE + MIDDLEWARE += ["livereload.middleware.LiveReloadScript", "debug_toolbar.middleware.DebugToolbarMiddleware"] INTERNAL_IPS = ["127.0.0.1"]
🧹 Nitpick comments (1)
scripts/convert_images_to_webp.py (1)
43-45: Silent exception handling hides errors.While the comment states this is "CI-safe by design," silently swallowing all exceptions makes debugging difficult. Consider logging the error at minimum, or re-raising after logging in non-CI environments.
- except Exception: - # Silent failure by design (CI-safe) - pass + except Exception as e: + # Log but don't fail (CI-safe) + print(f"Warning: Failed to convert {png_path}: {e}")
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting
⛔ Files ignored due to path filters (296)
poetry.lockis excluded by!**/*.lockwebsite/static/_image_backups/images/bacon.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/bch gold block.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/bch qr.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/close.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/default-team-logo.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/dummy-user.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/googlelogo_color_272x92dp.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/gsoc.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/next.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/prev.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/report_issue.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/slack_icon.pngis excluded by!**/*.pngwebsite/static/_image_backups/images/sorting-hat.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/ChromeWebStore_Badge_v2_496x150.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/TM.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/ci-build-passed.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/conflict-resolve.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/default_badge.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-api-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-bid-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-blog-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-branch-80.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-bug-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-bug-bounty-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-close-window-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-code-review-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-commit-git-80.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-complete-100.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-conference-80.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-contribution-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-dashboard-100.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-demo-60.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-dependency-60.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-discussion-100.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-documentation-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-edit-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-eslint-pluggable-and-configurable-linter-tool-for-identifying-and-reporting-on-patterns-in-javascript-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-fail-32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-feedback-80.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-forum-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-host-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-ip-48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-markdown-56.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-mentor-94.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-merge-40.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-milestone-50.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-newsletter-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-optimize-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-performance-goal-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-refactoring-60.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-request-review-48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-run-into-men-100.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-security-configuration-40.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-security-shield-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-social-50.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-star-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-survey-96.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-tag-100.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-test-60.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-tutorial-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-webinar-100.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/icons8-wiki-64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/badges/linter-fail.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/adblock/adblock_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android-webview-beta/android-webview-beta_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/android/android_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/avant/avant_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/blisk/blisk_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/boat/boat_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/brave/brave_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser.html/browser.html_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/browser_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cent/cent_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome mobile ios_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile ios/chrome_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome mobile_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome mobile/chrome_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-beta/chrome-beta_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-canary/chrome-canary_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome-dev/chrome-dev_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chrome/chrome_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/chromium/chromium_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cm/cm_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/coast/coast_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/comodo-dragon/comodo-dragon_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/cốc-cốc/cốc-cốc_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin-zero/dolphin-zero_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dolphin/dolphin_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/dooble/dooble_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/duckduckgo mobile/duckduckgo mobile_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge-tile/edge-tile_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/edge/edge_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic_24x24.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic_256x256.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic_32x32.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic_48x48.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic_512x512.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/epic/epic_64x64.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/firefox-beta/firefox-beta.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/firefox-beta/firefox-beta_128x128.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/firefox-beta/firefox-beta_16x16.pngis excluded by!**/*.pngwebsite/static/_image_backups/img/browser-logos/firefox-beta/firefox-beta_24x24.pngis excluded by!**/*.png
📒 Files selected for processing (4)
blt/settings.py(4 hunks)blt/urls.py(1 hunks)pyproject.toml(1 hunks)scripts/convert_images_to_webp.py(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
- GitHub Check: Run Tests
- GitHub Check: Run pre-commit
- GitHub Check: docker-test
🔇 Additional comments (2)
scripts/convert_images_to_webp.py (1)
22-45: Overall implementation looks reasonable for the use case.The function correctly handles backup, conversion to WebP, and re-optimization of the original PNG. The skip-if-exists check at line 27-28 prevents re-processing.
blt/settings.py (1)
165-211: Template configuration split is well-structured.The conditional template loading with
APP_DIRS=Truefor development and cached loaders for production is a good performance optimization pattern.
| "silk", | ||
| ) | ||
|
|
||
| if DEBUG: | ||
| INSTALLED_APPS += ("livereload",) | ||
| INSTALLED_APPS += ("debug_toolbar", "livereload") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Silk enabled unconditionally in production.
"silk" is added to INSTALLED_APPS outside the DEBUG block, meaning it will be installed and active in production. This adds unnecessary overhead and potential security exposure.
Move silk inside the DEBUG condition:
"channels",
- "silk",
)
if DEBUG:
- INSTALLED_APPS += ("debug_toolbar", "livereload")
+ INSTALLED_APPS += ("silk", "debug_toolbar", "livereload")📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "silk", | |
| ) | |
| if DEBUG: | |
| INSTALLED_APPS += ("livereload",) | |
| INSTALLED_APPS += ("debug_toolbar", "livereload") | |
| "channels", | |
| ) | |
| if DEBUG: | |
| INSTALLED_APPS += ("silk", "debug_toolbar", "livereload") |
🤖 Prompt for AI Agents
In blt/settings.py around lines 104 to 107, "silk" is currently added to
INSTALLED_APPS unconditionally; remove it from the global INSTALLED_APPS list
and instead append it only when DEBUG is True (e.g. inside the DEBUG block do
INSTALLED_APPS += ("silk",) or similar), so silk is enabled only in development;
ensure tuple/comma syntax is correct when appending.
| STATIC_ROOT = os.path.join(PROJECT_ROOT, "staticfiles") | ||
| STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🌐 Web query:
Django 5.2 STATICFILES_STORAGE deprecated STORAGES setting precedence
💡 Result:
Short answer: In Django 4.2+ (including 5.2) STATICFILES_STORAGE is deprecated in favour of the new STORAGES mapping. Django will use the storage configured under STORAGES["staticfiles"] as the staticfiles backend; STATICFILES_STORAGE is only used as the deprecated fallback when no STORAGES["staticfiles"] config is provided. See the STORAGES note in the 4.2 release notes and the SETTINGS docs. [1][2]
Sources
- Django 4.2 release notes (STORAGES / deprecation of STATICFILES_STORAGE). [1]
- django.conf.settings — STATICFILES_STORAGE doc (notes about STORAGES["staticfiles"] and deprecated STATICFILES_STORAGE). [2]
🏁 Script executed:
fd -t f "settings.py" | head -5Repository: OWASP-BLT/BLT
Length of output: 121
🏁 Script executed:
sed -n '308,334p' blt/settings.py
sed -n '375,385p' blt/settings.pyRepository: OWASP-BLT/BLT
Length of output: 1135
Remove deprecated STATICFILES_STORAGE and update STORAGES["staticfiles"] to use WhiteNoise.
In Django 4.2+, STORAGES["staticfiles"] takes precedence over the deprecated STATICFILES_STORAGE setting. Line 380 is dead code since both STORAGES configurations (lines 316-318 and 331-333) already define the staticfiles backend.
To enable WhiteNoise compressed static files storage, remove the deprecated setting and update both STORAGES definitions:
-STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"Update the GCS STORAGES block (around line 316):
"staticfiles": {
- "BACKEND": "django.contrib.staticfiles.storage.ManifestStaticFilesStorage",
+ "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
},Update the non-GCS STORAGES block (around line 331):
"staticfiles": {
- "BACKEND": "django.contrib.staticfiles.storage.ManifestStaticFilesStorage",
+ "BACKEND": "whitenoise.storage.CompressedManifestStaticFilesStorage",
},Committable suggestion skipped: line range outside the PR's diff.
|
|
||
| if settings.DEBUG: | ||
| urlpatterns += [ | ||
| path("silk/", include("silk.urls", namespace="silk")), | ||
| path("__debug__/", include("debug_toolbar.urls")), | ||
| ] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate debug_toolbar URL registration.
The __debug__/ URL pattern for debug_toolbar is already registered at line 1249. This block adds it again at line 1268, resulting in duplicate URL patterns when DEBUG=True.
Remove the duplicate debug_toolbar registration and keep only the silk URLs:
if settings.DEBUG:
urlpatterns += [
path("silk/", include("silk.urls", namespace="silk")),
- path("__debug__/", include("debug_toolbar.urls")),
]📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| if settings.DEBUG: | |
| urlpatterns += [ | |
| path("silk/", include("silk.urls", namespace="silk")), | |
| path("__debug__/", include("debug_toolbar.urls")), | |
| ] | |
| if settings.DEBUG: | |
| urlpatterns += [ | |
| path("silk/", include("silk.urls", namespace="silk")), | |
| ] |
🤖 Prompt for AI Agents
In blt/urls.py around lines 1264 to 1269, the debug_toolbar "__debug__/" URL is
being registered a second time causing duplicate URL patterns; edit this
DEBUG-only block to remove the path("__debug__/", include("debug_toolbar.urls"))
entry and leave only the silk registration (path("silk/", include("silk.urls",
namespace="silk"))), ensuring imports remain correct and no other code relies on
this redundant registration.
| django-silk = "^5.0.1" | ||
| django-debug-toolbar = "^4.3.0" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Development tools added to production dependencies.
django-silk and django-debug-toolbar are development/debugging tools that shouldn't be installed in production. Additionally, django-debug-toolbar is already declared in dev dependencies at line 85 with version ^4.4.6, creating a version conflict with ^4.3.0 here.
Move these to dev dependencies and remove the duplicate:
pyjwt = {extras = ["crypto"], version = "^2.0.0"}
-django-silk = "^5.0.1"
-django-debug-toolbar = "^4.3.0"In the dev dependencies section, add silk:
[tool.poetry.group.dev.dependencies]
black = "^25.12.0"
isort = "^5.13.2"
ruff = "^0.14.8"
pre-commit = "^4.5.0"
selenium = "^4.39.0"
webdriver-manager = "^4.0.2"
chromedriver-autoinstaller = "^0.6.4"
django-debug-toolbar = "^4.4.6"
django-livereload-server = "^0.5.1"
watchfiles = "^1.0.4"
+django-silk = "^5.0.1"Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In pyproject.toml around lines 73-74, django-silk and django-debug-toolbar are
incorrectly listed in production dependencies and django-debug-toolbar is
duplicated with a conflicting version at line 85; remove the two lines from the
main [tool.poetry.dependencies] (or equivalent production deps section), add
django-silk = "^5.0.1" to the dev dependencies section alongside the existing
django-debug-toolbar entry, and ensure the duplicate django-debug-toolbar =
"^4.3.0" is removed so only the dev dependency entry (keep ^4.4.6) remains.
| SOURCE_DIRS = [ | ||
| "website/static/images", | ||
| "website/static/img", | ||
| "website/static/img/browser-logos", | ||
| ] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Overlapping directories will cause duplicate processing.
website/static/img/browser-logos is a subdirectory of website/static/img. Since rglob("*.png") is used, PNGs in browser-logos will be processed twice - once when iterating website/static/img and again when iterating website/static/img/browser-logos.
Remove the subdirectory from SOURCE_DIRS:
SOURCE_DIRS = [
"website/static/images",
"website/static/img",
- "website/static/img/browser-logos",
]📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| SOURCE_DIRS = [ | |
| "website/static/images", | |
| "website/static/img", | |
| "website/static/img/browser-logos", | |
| ] | |
| SOURCE_DIRS = [ | |
| "website/static/images", | |
| "website/static/img", | |
| ] |
🤖 Prompt for AI Agents
In scripts/convert_images_to_webp.py around lines 9 to 13, the SOURCE_DIRS list
contains a nested path ("website/static/img/browser-logos") inside
"website/static/img", causing duplicate processing because rglob("*.png") will
find files twice; remove the nested "website/static/img/browser-logos" entry
from SOURCE_DIRS (or alternatively dedupe paths before walking) so each PNG is
processed only once.
|
@coderabbitai I may have converted more images than necessary. Could you please identify which high-impact images should specifically be prioritized for WebP? I haven’t updated the template image sources yet. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: Length of output: 11439 🏁 Script executed: Length of output: 492 🏁 Script executed: Length of output: 411 🏁 Script executed: Length of output: 1284 🏁 Script executed: Length of output: 34860 🏁 Script executed: Length of output: 2873 🏁 Script executed: Length of output: 659 🏁 Script executed: Length of output: 550 🏁 Script executed: Length of output: 98955 @Nachiket-Roy, great question! Based on my analysis of template usage and file sizes, here's a prioritized list of images to convert to WebP format in your templates: 🔴 Critical Priority (Update First)These images have the highest impact due to frequent use across multiple pages:
🟠 High Priority (Update Soon)Visible on homepage and key landing pages:
🟡 Medium Priority (Feature Pages)Images displayed on the features page (
🟢 Low Priority (Defer)
📝 Recommended Action Plan
Pro tip: Consider adding a <picture>
<source srcset="{% static 'images/dummy-user.webp' %}" type="image/webp">
<img src="{% static 'images/dummy-user.png' %}" alt="User avatar">
</picture>Would you like me to help generate a script to update all the template references in bulk? |
❌ Tests failedThe Django tests found issues that need to be fixed. Please review the test output below and fix the failing tests. How to run tests locally# Install dependencies
poetry install --with dev
# Run all tests
poetry run python manage.py test
# Run tests with verbose output
poetry run python manage.py test -v 3
# Run a specific test
poetry run python manage.py test app.tests.TestClass.test_methodTest output (last 100 lines)For more information, see the Django testing documentation. |
|
@coderabbitai Should I keep all these images for now (over 2000), and start by replacing the large ones first, then the medium, and eventually the small ones so the changes don’t overwhelm anyone? |
|
Tip For best results, initiate chat on the files or code changes. @Nachiket-Roy, your phased approach is smart from a review perspective, but I'd recommend a hybrid strategy that balances both impact and review manageability: 🎯 Recommended StrategyPhase 1: High-Impact Images (Current PR)Focus on images with high frequency × large size:
Why: These provide immediate measurable performance gains and are manageable in one PR (~70 template updates). Phase 2: Medium Priority (Follow-up PR)
Phase 3: Low Priority (Optional, Future PR)
🧹 Important: Clean Up Low-Value ConversionsBrowser logos directory (
# Suggest removing these WebP conversions:
rm -rf website/static/img/browser-logos/*.webp
# Keep only the ones actually referenced in templates📊 Impact vs. Effort Matrix💡 Why Not Keep All 2000+ Files?
✅ Concrete Next Steps
This approach gives you:
Would you like me to generate a script to:
|
|
💬 Reminder: Unresolved Conversations Hi @Nachiket-Roy! This pull request has 5 unresolved conversations that need to be addressed. Please review and resolve the pending discussions so we can move forward with merging this PR. Thank you! 🙏 |
CLOSES : #5251
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.