') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); annotate after paginate Admin channels and users by jredrejo · Pull Request #2607 · learningequality/studio · GitHub
Skip to content

annotate after paginate Admin channels and users - #2607

Merged
rtibbles merged 2 commits into
learningequality:developfrom
jredrejo:annotate_after_paginate_admin_channels
Dec 7, 2020
Merged

annotate after paginate Admin channels and users#2607
rtibbles merged 2 commits into
learningequality:developfrom
jredrejo:annotate_after_paginate_admin_channels

Conversation

@jredrejo

Copy link
Copy Markdown
Contributor

Description

This PR does queryset annotations after pagination has happened, to increase performance of the queries, limiting the scope of the annotation
It also:

  • removes the previous implementation of defering the calculation of the fields that required a long time to be calculated, done in Cache channel metadata #2333 and Adding delayed calculation of annotation values for AdminUsers #2359. Time for the requests is now bigger, as calculations are done, but it's reasonable (<10 sec, around 3 sec on average) and does not need caching nor changes in the frontend logic.

  • Optimizates calculation of Channel size using CTE

  • It removes the possibility of sorting by size, editors and viewers in the admin channel table as these fields are annotated and would require in some cases hours to compute the whole table & sorting.

Issue Addressed (if applicable)

Addresses #2544 , #2396

Steps to Test

Play with the admin page

Implementation Notes (optional)

At a high level, how did you implement this?

See #2511

@codecov

codecovBot commented Dec 1, 2020

Copy link
Copy Markdown

Codecov Report

Merging #2607 (2d9505f) into develop (fc35107) will increase coverage by 0.41%.
The diff coverage is 56.96%.

Impacted file tree graph

@@ Coverage Diff @@## develop #2607 +/- ##
===========================================
+ Coverage 84.56% 84.97% +0.41% 
===========================================
Files 296 294 -2 Lines 15093 15006 -87 ===========================================
- Hits 12764 12752 -12 + Misses 2329 2254 -75 
Impacted FilesCoverage Δ
contentcuration/contentcuration/tasks.py73.19% <ø> (+0.55%)⬆️
...ion/contentcuration/tests/viewsets/test_channel.py92.64% <ø> (ø)
contentcuration/contentcuration/viewsets/user.py70.81% <19.44%> (+0.81%)⬆️
...ontentcuration/contentcuration/viewsets/channel.py79.72% <88.37%> (+8.58%)⬆️
contentcuration/contentcuration/utils/cache.py31.70% <0.00%> (-12.20%)⬇️
contentcuration/contentcuration/viewsets/base.py88.86% <0.00%> (+0.23%)⬆️
contentcuration/contentcuration/viewsets/common.py94.11% <0.00%> (+0.65%)⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 533b62b...2d9505f. Read the comment docs.

@jredrejo
jredrejoforce-pushed the annotate_after_paginate_admin_channels branch from fe038f4 to 2d9505fCompareDecember 7, 2020 18:11

@rtibblesrtibbles left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Manual testing checks out. Pre-existing issue for sorting by created is here: #2544 but not fixed in the scope of this PR.

@rtibbles
rtibbles merged commit 9889ae2 into learningequality:developDec 7, 2020
@jredrejo
jredrejo deleted the annotate_after_paginate_admin_channels branch December 8, 2020 09:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@jredrejo@rtibbles