From 316ea2d56d62d3bf2d42b87975500af7c8a7e07c Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Mon, 29 Oct 2018 19:41:23 +0100
Subject: [PATCH] Add topics to Publications; correct perms bug on
 publication_detail

---
 .../journals/publication_detail.html          | 44 +++++++++++++++++--
 journals/urls/general.py                      |  8 ++++
 journals/views.py                             | 20 ++++++++-
 ontology/forms.py                             |  2 +-
 4 files changed, 69 insertions(+), 5 deletions(-)

diff --git a/journals/templates/journals/publication_detail.html b/journals/templates/journals/publication_detail.html
index 8c03853e6..b640b83dc 100644
--- a/journals/templates/journals/publication_detail.html
+++ b/journals/templates/journals/publication_detail.html
@@ -6,9 +6,6 @@
 {% load scipost_extras %}
 {% load user_groups %}
 
-{% is_scipost_admin request.user as is_scipost_admin %}
-{% is_edcol_admin request.user as is_edcol_admin %}
-
 {% block pagetitle %}: {{ publication.citation }} - {{ publication.title }}{% endblock pagetitle %}
 
 {% block body_class %}{{ block.super }} publication{% endblock %}
@@ -57,6 +54,10 @@
 {% endblock headsup %}
 
 {% block content %}
+
+{% is_scipost_admin request.user as is_scipost_admin %}
+{% is_edcol_admin request.user as is_edcol_admin %}
+
 {% if not publication.is_published and perms.can_publish_accepted_submission %}
 <div class="card bg-warning text-white">
   <div class="card-body">
@@ -96,6 +97,37 @@
 {% endif %}
 <hr/>
 
+{% if publication.topics.all or is_scipost_admin or is_edcol_admin %}
+<div class="card">
+  <div class="card-header">
+    <a href="{% url 'ontology:ontology' %}">Ontology</a>/<a href="{% url 'ontology:topics' %}">Topics</a>
+  </div>
+  <div class="card-body">
+    <ul class="list-inline mb-0">
+      {% for topic in publication.topics.all %}
+      <li class="list-inline-item p-1"><a href="{% url 'ontology:topic_details' slug=topic.slug %}">{{ topic }}</a>{% if perms.scipost.can_manage_ontology %} <a href="{% url 'journals:publication_remove_topic' doi_label=publication.doi_label slug=topic.slug %}"><i class="fa fa-times-circle text-danger"></i></a>{% endif %}</li>
+      {% empty %}
+      <li class="list-inline-item">No Topic has yet been associated to this Publication</li>
+      {% endfor %}
+    </ul>
+    {% if perms.scipost.can_manage_ontology %}
+    <ul class="list-inline">
+      <li class="list-inline-item">
+	<form class="form-inline" action="{% url 'journals:publication_add_topic' doi_label=publication.doi_label %}" method="post">
+	  <ul class="list-inline">
+	    <li class="list-inline-item">Add a Topic:</li>
+	    <li class="list-inline-item">{% csrf_token %}{{ select_topic_form }}</li>
+	    <li class="list-inline-item"><input class="btn btn-outline-secondary" type="submit" value="Link"></li>
+	  </ul>
+	</form>
+      </li>
+      <li class="list-inline-item p-2">Can't find the Topic you need? <a href="{% url 'ontology:topic_create' %}" target="_blank">Create it</a> (opens in new window)</li>
+    </ul>
+    {% endif %}
+  </div>
+</div>
+{% endif %}
+
 <div class="card">
   <div class="card-header">
     Author{{ publication.authors.all|length|pluralize }}/Affiliation{{ affiliations_list|length|pluralize }}: mappings to Contributors and <a href="{% url 'organizations:organizations' %}" target="_blank">Organizations</a>
@@ -145,6 +177,7 @@
 </div>
 {% endif %}
 
+
 {% if is_scipost_admin or is_edcol_admin %}
 {% if publication.institutions.all %}
 <div class="card">
@@ -190,3 +223,8 @@
 {% endif %}
 
 {% endblock content %}
+
+{% block footer_script %}
+{{ block.super }}
+{{ select_topic_form.media }}
+{% endblock footer_script %}
diff --git a/journals/urls/general.py b/journals/urls/general.py
index 3ddd5a071..65ce48356 100644
--- a/journals/urls/general.py
+++ b/journals/urls/general.py
@@ -135,6 +135,14 @@ urlpatterns = [
         journals_views.email_object_made_citable,
         name='email_object_made_citable'),
 
+    # Topics:
+    url(r'^publication_add_topic/(?P<doi_label>{regex})$'.format(regex=PUBLICATION_DOI_REGEX),
+        journals_views.publication_add_topic,
+        name='publication_add_topic'),
+    url(r'^publication_remove_topic/(?P<doi_label>{regex})/(?P<slug>[-\w]+)/$'.format(regex=PUBLICATION_DOI_REGEX),
+        journals_views.publication_remove_topic,
+        name='publication_remove_topic'),
+
     # PubFraction allocation:
     url(r'^allocate_orgpubfractions/(?P<doi_label>{regex})$'.format(regex=PUBLICATION_DOI_REGEX),
         journals_views.allocate_orgpubfractions,
diff --git a/journals/views.py b/journals/views.py
index 555f39b80..ed68542be 100644
--- a/journals/views.py
+++ b/journals/views.py
@@ -46,6 +46,8 @@ from comments.models import Comment
 from funders.forms import FunderSelectForm, GrantSelectForm
 from funders.models import Grant
 from mails.views import MailEditingSubView
+from ontology.models import Topic
+from ontology.forms import SelectTopicForm
 from organizations.models import Organization
 from submissions.constants import STATUS_PUBLISHED
 from submissions.models import Submission, Report
@@ -774,13 +776,28 @@ def metadata_DOAJ_deposit(request, doi_label):
 def publication_add_topic(request, doi_label):
     """
     Add a predefined Topic to an existing Publication object.
-    This also adds the Topic to all authors' Profiles.
     """
     publication = get_object_or_404(Publication, doi_label=doi_label)
     select_topic_form = SelectTopicForm(request.POST or None)
     if select_topic_form.is_valid():
         publication.topics.add(select_topic_form.cleaned_data['topic'])
         publication.save()
+        messages.success(request, 'Successfully linked Topic to this publication')
+    return redirect(reverse('scipost:publication_detail',
+                            kwargs={'doi_label': publication.doi_label}))
+
+
+@permission_required('scipost.can_manage_ontology', return_403=True)
+def publication_remove_topic(request, doi_label, slug):
+    """
+    Remove the Topic from the Publication.
+    """
+    publication = get_object_or_404(Publication, doi_label=doi_label)
+    topic = get_object_or_404(Topic, slug=slug)
+    publication.topics.remove(topic)
+    messages.success(request, 'Successfully removed Topic')
+    return redirect(reverse('scipost:publication_detail',
+                            kwargs={'doi_label': publication.doi_label}))
 
 
 @login_required
@@ -1281,6 +1298,7 @@ def publication_detail(request, doi_label):
         'publication': publication,
         'affiliations_list': publication.get_all_affiliations(),
         'journal': publication.get_journal(),
+        'select_topic_form': SelectTopicForm(),
     }
     return render(request, 'journals/publication_detail.html', context)
 
diff --git a/ontology/forms.py b/ontology/forms.py
index dcd7c7e09..7f85b113c 100644
--- a/ontology/forms.py
+++ b/ontology/forms.py
@@ -14,7 +14,7 @@ class SelectTagForm(forms.Form):
 
 
 class SelectTopicForm(forms.Form):
-    topic = AutoCompleteSelectField('topic_lookup')
+    topic = AutoCompleteSelectField('topic_lookup', label='', help_text='')
 
 
 class SelectLinkedTopicForm(forms.Form):
-- 
GitLab