From 35a6e4bb83686371ac206a97654c513992848d4e Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Wed, 25 Apr 2018 22:34:38 +0200
Subject: [PATCH] Institutions go public

---
 affiliations/managers.py                      |  4 +++
 affiliations/models.py                        | 11 +++++---
 affiliations/templates/affiliations/base.html | 13 ++++++++++
 .../affiliations/institution_detail.html      | 26 +++++++++++++++++++
 .../affiliations/institution_list.html        | 14 +++++++---
 affiliations/urls.py                          |  4 ++-
 affiliations/views.py                         | 11 +++++---
 funders/templates/funders/base.html           |  2 +-
 .../journals/publication_detail.html          | 20 +++++---------
 9 files changed, 79 insertions(+), 26 deletions(-)
 create mode 100644 affiliations/templates/affiliations/base.html
 create mode 100644 affiliations/templates/affiliations/institution_detail.html

diff --git a/affiliations/managers.py b/affiliations/managers.py
index e6a087205..11d16f9ec 100644
--- a/affiliations/managers.py
+++ b/affiliations/managers.py
@@ -16,3 +16,7 @@ class AffiliationQuerySet(models.QuerySet):
             Q(begin_date__isnull=True, end_date__gte=today) |
             Q(begin_date__lte=today, end_date__gte=today) |
             Q(begin_date__isnull=True, end_date__isnull=True))
+
+class InstitutionQuerySet(models.QuerySet):
+    def has_publications(self):
+        return self.filter(publications__isnull=False)
diff --git a/affiliations/models.py b/affiliations/models.py
index 40f41195d..faf522846 100644
--- a/affiliations/models.py
+++ b/affiliations/models.py
@@ -10,18 +10,19 @@ from django_countries.fields import CountryField
 from scipost.models import Contributor
 
 from .constants import INSTITUTION_TYPES, TYPE_UNIVERSITY
-from .managers import AffiliationQuerySet
+from .managers import AffiliationQuerySet, InstitutionQuerySet
 
 
 class Institution(models.Model):
-    """
-    Any (scientific) Institution in the world should ideally have a SciPost registration.
-    """
+    """Any (scientific) Institution with a SciPost registration."""
+
     name = models.CharField(max_length=255)
     acronym = models.CharField(max_length=16, blank=True)
     country = CountryField()
     type = models.CharField(max_length=16, choices=INSTITUTION_TYPES, default=TYPE_UNIVERSITY)
 
+    objects = InstitutionQuerySet.as_manager()
+
     class Meta:
         default_related_name = 'institutions'
         ordering = ['country']
@@ -30,9 +31,11 @@ class Institution(models.Model):
         return '{name} ({country})'.format(name=self.name, country=self.get_country_display())
 
     def get_absolute_url(self):
+        """Return the Institution detail page."""
         return reverse('affiliations:institution_details', args=(self.id,))
 
     def contributors(self):
+        """All Contributor instances related to the Institution."""
         return Contributor.objects.filter(affiliations__institution=self)
 
 
diff --git a/affiliations/templates/affiliations/base.html b/affiliations/templates/affiliations/base.html
new file mode 100644
index 000000000..6e6300f5f
--- /dev/null
+++ b/affiliations/templates/affiliations/base.html
@@ -0,0 +1,13 @@
+{% extends 'scipost/base.html' %}
+
+{% block breadcrumb %}
+    <div class="container-outside header">
+        <div class="container">
+            <nav class="breadcrumb hidden-sm-down">
+                {% block breadcrumb_items %}
+                    <a href="{% url 'affiliations:institutions' %}" class="breadcrumb-item">Institutions</a>
+                {% endblock %}
+            </nav>
+        </div>
+    </div>
+{% endblock %}
diff --git a/affiliations/templates/affiliations/institution_detail.html b/affiliations/templates/affiliations/institution_detail.html
new file mode 100644
index 000000000..641f62929
--- /dev/null
+++ b/affiliations/templates/affiliations/institution_detail.html
@@ -0,0 +1,26 @@
+{% extends 'affiliations/base.html' %}
+
+{% load bootstrap %}
+
+{% block pagetitle %}: Institution details{% endblock pagetitle %}
+
+{% block breadcrumb_items %}
+    {{ block.super }}
+    <span class="breadcrumb-item">{{ institution }}</span>
+{% endblock %}
+
+{% block content %}
+
+<h1 class="highlight">Institution {{ institution }}</h1>
+
+<ul>
+    {% for publication in institution.publications.all %}
+        <li>
+            <a href="{{ publication.get_absolute_url }}">{{ publication.title }}</a>
+            <br>by {{ publication.author_list }},
+            <br>{{ publication.citation }}
+        </li>
+    {% endfor %}
+</ul>
+
+{% endblock content %}
diff --git a/affiliations/templates/affiliations/institution_list.html b/affiliations/templates/affiliations/institution_list.html
index 50d0b8ea3..a76c137dd 100644
--- a/affiliations/templates/affiliations/institution_list.html
+++ b/affiliations/templates/affiliations/institution_list.html
@@ -1,23 +1,29 @@
-{% extends 'scipost/_personal_page_base.html' %}
+{% extends 'affiliations/base.html' %}
 
 
 {% block pagetitle %}: Institutions{% endblock pagetitle %}
 
+
 {% block breadcrumb_items %}
-    {{ block.super }}
     <span class="breadcrumb-item">Institutions</span>
 {% endblock %}
 
 {% block content %}
 
-<h1>All Institutions in the database</h1>
+<h1 class="highlight">Institutions</h1>
+
+<h3>All Institutions with a SciPost publication</h3>
 
 {% if is_paginated %}
     {% include 'partials/pagination.html' with page_obj=page_obj %}
 {% endif %}
+
 <ul>
     {% for institution in object_list %}
-        <li><a href="{% url 'affiliations:institution_details' institution.id %}">{{ institution }}</a></li>
+        <li>
+            <a href="{{ institution.get_absolute_url }}">{{ institution }}</a>
+            {% if perms.scipost.can_manage_affiliations %} &middot; <a href="{% url 'affiliations:institution_edit' institution.id %}"><i class="fa fa-pencil"></i></a>{% endif %}
+        </li>
     {% empty %}
         <li><em>There are no Institutions known yet.</em><li>
     {% endfor %}
diff --git a/affiliations/urls.py b/affiliations/urls.py
index 0b839a465..22b6fc62e 100644
--- a/affiliations/urls.py
+++ b/affiliations/urls.py
@@ -8,8 +8,10 @@ from . import views
 
 urlpatterns = [
     url(r'^$', views.InstitutionListView.as_view(), name='institutions'),
-    url(r'^(?P<institution_id>[0-9]+)/$', views.InstitutionUpdateView.as_view(),
+    url(r'^(?P<institution_id>[0-9]+)/$', views.InstitutionDetailView.as_view(),
         name='institution_details'),
+    url(r'^(?P<institution_id>[0-9]+)/edit', views.InstitutionUpdateView.as_view(),
+        name='institution_edit'),
     url(r'^(?P<institution_id>[0-9]+)/merge$', views.merge_institutions,
         name='merge_institutions'),
 ]
diff --git a/affiliations/views.py b/affiliations/views.py
index 83e94a2c9..9de5a4d02 100644
--- a/affiliations/views.py
+++ b/affiliations/views.py
@@ -7,6 +7,7 @@ from django.contrib import messages
 from django.contrib.auth.decorators import permission_required
 from django.urls import reverse
 from django.utils.decorators import method_decorator
+from django.views.generic.detail import DetailView
 from django.views.generic.edit import UpdateView
 from django.views.generic.list import ListView
 from django.shortcuts import get_object_or_404
@@ -15,10 +16,14 @@ from .forms import InstitutionMergeForm
 from .models import Institution
 
 
-@method_decorator(permission_required('scipost.can_manage_affiliations'), name='dispatch')
 class InstitutionListView(ListView):
+    queryset = Institution.objects.has_publications()
+    paginate_by = 20
+
+
+class InstitutionDetailView(DetailView):
     model = Institution
-    paginate_by = 100
+    pk_url_kwarg = 'institution_id'
 
 
 @method_decorator(permission_required('scipost.can_manage_affiliations'), name='dispatch')
@@ -53,4 +58,4 @@ def merge_institutions(request, institution_id):
         messages.success(request, 'Institution {a} merged into {b}'.format(
             a=form.cleaned_data.get('institution', '?'), b=institution))
 
-    return redirect(reverse('affiliations:institution_details', args=(institution.id,)))
+    return redirect(reverse('affiliations:institution_edit', args=(institution.id,)))
diff --git a/funders/templates/funders/base.html b/funders/templates/funders/base.html
index 45d65898c..b36e0fc49 100644
--- a/funders/templates/funders/base.html
+++ b/funders/templates/funders/base.html
@@ -1,7 +1,7 @@
 {% extends 'scipost/base.html' %}
 
 {% block breadcrumb %}
-    <div class="container-outside breadcrumb-nav">
+    <div class="container-outside header">
         <div class="container">
             <nav class="breadcrumb hidden-sm-down">
                 {% block breadcrumb_items %}
diff --git a/journals/templates/journals/publication_detail.html b/journals/templates/journals/publication_detail.html
index a96613517..9566a2284 100644
--- a/journals/templates/journals/publication_detail.html
+++ b/journals/templates/journals/publication_detail.html
@@ -116,19 +116,13 @@
                 </ul>
             {% endif %}
 
-            {% if is_edcol_admin %}
-                {# This function is not available for public yet! #}
-                <em>The following is not available for the public yet:</em>
-                {% include 'partials/journals/references.html' with publication=publication %}
-
-                {% if publication.institutions.exists %}
-                    <h3>Institution{{ publication.institutions.count|pluralize }} related to this Publication</h3>
-                    <ul>
-                        {% for institution in publication.institutions.all %}
-                            <li>{{ institution }}</li>
-                        {% endfor %}
-                    </ul>
-                {% endif %}
+            {% if publication.institutions.all %}
+                <h3>Institution{{ publication.institutions.count|pluralize }} related to this Publication</h3>
+                <ul>
+                    {% for institution in publication.institutions.all %}
+                        <li><a href="{{ institution.get_absolute_url }}">{{ institution }}</a></li>
+                    {% endfor %}
+                </ul>
             {% endif %}
         </div>
     </div>
-- 
GitLab