From c00ba181537db751259b0efca3d2224703cf87c8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jean-S=C3=A9bastien=20Caux?= <git@jscaux.org>
Date: Fri, 11 Feb 2022 07:56:27 +0100
Subject: [PATCH] Optimize `_hx_journals`

---
 scipost_django/ontology/context_processors.py |  3 +-
 .../scipost/portal/_hx_journals.html          | 33 +++++++++----------
 .../scipost/templatetags/scipost_extras.py    |  4 +--
 scipost_django/scipost/urls.py                |  2 +-
 scipost_django/scipost/views.py               | 26 +++++++++++++--
 5 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/scipost_django/ontology/context_processors.py b/scipost_django/ontology/context_processors.py
index 4bf67e3c8..23a693c00 100644
--- a/scipost_django/ontology/context_processors.py
+++ b/scipost_django/ontology/context_processors.py
@@ -19,7 +19,8 @@ def ontology_processor(request):
     if request.session.get('session_acad_field_slug', None):
         try:
             context['session_acad_field'] = AcademicField.objects.get(
-                slug=request.session.get('session_acad_field_slug'))
+                slug=request.session.get('session_acad_field_slug'),
+            )
             initial_acad_field['acad_field_slug'] = request.session.get('session_acad_field_slug')
         except AcademicField.DoesNotExist:
             context['session_acad_field'] = None
diff --git a/scipost_django/scipost/templates/scipost/portal/_hx_journals.html b/scipost_django/scipost/templates/scipost/portal/_hx_journals.html
index 0dea409b7..64b64dc8b 100644
--- a/scipost_django/scipost/templates/scipost/portal/_hx_journals.html
+++ b/scipost_django/scipost/templates/scipost/portal/_hx_journals.html
@@ -7,7 +7,7 @@
 {% if session_acad_field %}
 
   <div class="row">
-    {% for journal in session_acad_field.journals %}
+    {% for journal in journals %}
       {% if journal.active or perms.scipost.can_view_pool %}
 	<div class="col-md-6 col-lg-4 mb-2" style="{{ journal.style }}">
 	  <div class="card">
@@ -46,25 +46,22 @@
 
     <h2 class="highlight">Full list of our Journals</h2>
     <table class="table table-borderless">
-      {% for branch in branches %}
-	{% for acad_field in branch.academic_fields.all %}
-	  {% if acad_field.journals.active.all|length > 0 %}
-	    <tr>
-	      <td class="align-middle"><strong>{{ acad_field.name }}</strong></td>
-	      <td>
-		<ul class="list-group m-2">
-		  {% for journal in acad_field.journals.active.all %}
-		    <li class="list-group-item m-1 px-3 py-2 {{ journal.doi_label }}">
-		      <a href="{{ journal.get_absolute_url }}">{{ journal.name }}</a>
-		    </li>
-		  {% endfor %}
-		</ul>
-	      </td>
-	    </tr>
-	  {% endif %}
+      {% for branch, branch_journals in journals_dict.items %}
+	{% for field, field_journals in branch_journals.items %}
+	  <tr>
+	    <td class="align-middle"><strong>{{ field }}</strong></td>
+	    <td>
+	      <ul class="list-group m-2">
+		{% for journal in field_journals %}
+		  <li class="list-group-item m-1 px-3 py-2 {{ journal.doi_label }}">
+		    <a href="{{ journal.get_absolute_url }}">{{ journal.name }}</a>
+		  </li>
+		{% endfor %}
+	      </ul>
+	    </td>
+	  </tr>
 	{% endfor %}
       {% endfor %}
     </table>
 
-
 {% endif %}
diff --git a/scipost_django/scipost/templatetags/scipost_extras.py b/scipost_django/scipost/templatetags/scipost_extras.py
index 6526c2a83..6f8162628 100644
--- a/scipost_django/scipost/templatetags/scipost_extras.py
+++ b/scipost_django/scipost/templatetags/scipost_extras.py
@@ -72,8 +72,8 @@ def get_admin_url(obj):
 def increment_dt(dt):
     try:
         delta = abs(int(dt))
-        if delta >= 4:
-            return random.randint(delta, int(1.25*delta))
+        if delta >= 8:
+            return random.randint(delta, int(1.4*delta))
     except:
         pass
     return random.randint(8, 12)
diff --git a/scipost_django/scipost/urls.py b/scipost_django/scipost/urls.py
index 3fa117fb9..5cd3eac9e 100644
--- a/scipost_django/scipost/urls.py
+++ b/scipost_django/scipost/urls.py
@@ -85,7 +85,7 @@ urlpatterns = [
     ),
     path(
         'portal/_hx_journals',
-        TemplateView.as_view(template_name='scipost/portal/_hx_journals.html'),
+        views.portal_hx_journals,
         name='portal_hx_journals'
     ),
     path(
diff --git a/scipost_django/scipost/views.py b/scipost_django/scipost/views.py
index a75fb53fc..786aa9ac6 100644
--- a/scipost_django/scipost/views.py
+++ b/scipost_django/scipost/views.py
@@ -168,9 +168,6 @@ def index(request):
             request.session['session_specialty_slug'] = ''
         request.session['session_acad_field_slug'] = request.GET['field']
     context = {
-        'news_items': NewsItem.objects.homepage().order_by('-date')[:3],
-        'publications': Publication.objects.published(
-        ).order_by('-publication_date', '-paper_nr')[:3],
         'load_header_forms': request.GET.get('tab', None) != None
     }
     return render(request, 'scipost/portal/portal.html', context)
@@ -195,6 +192,29 @@ def portal_hx_home(request):
     return render(request, 'scipost/portal/_hx_home.html', context)
 
 
+def portal_hx_journals(request):
+    session_acad_field_slug = request.session.get('session_acad_field_slug', None)
+    journals = Journal.objects.active().select_related('college__acad_field__branch')
+    context = {}
+    if session_acad_field_slug and session_acad_field_slug != 'all':
+        journals = journals.filter(
+            college__acad_field__slug=session_acad_field_slug,
+        ).prefetch_related('series_set')
+        context['journals'] = journals
+    else: # build a dictionary of journals per branch / acad_field
+        journals_dict = {}
+        for journal in journals.all():
+            branch_name = journal.college.acad_field.branch.name
+            acad_field_name = journal.college.acad_field.name
+            if branch_name not in journals_dict:
+                journals_dict[branch_name] = {}
+            if acad_field_name not in journals_dict[branch_name]:
+                journals_dict[branch_name][acad_field_name] = []
+            journals_dict[branch_name][acad_field_name].append(journal)
+        context['journals_dict'] = journals_dict
+    return render(request, 'scipost/portal/_hx_journals.html', context)
+
+
 def portal_hx_publications(request):
     form = PublicationSearchForm(
         acad_field_slug=request.session.get('session_acad_field_slug', None),
-- 
GitLab