From fb2af5fb7812d82036c0b6dcd6742c2e4a72e69a Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Fri, 23 Jun 2017 14:34:12 +0200
Subject: [PATCH] Update + upgrade dashboard/manage templates

---
 partners/forms.py                             |   3 +-
 partners/models.py                            |   9 ++
 .../templates/partners/_partner_card.html     |  41 +++----
 .../partners/add_prospective_partner.html     |   8 +-
 partners/templates/partners/dashboard.html    |  98 +++++++++++++++--
 .../templates/partners/manage_partners.html   | 104 ------------------
 .../partners/supporting_partners.html         |   2 +-
 partners/urls.py                              |   1 -
 partners/views.py                             |  24 ++--
 .../commands/add_groups_and_permissions.py    |  13 +++
 10 files changed, 149 insertions(+), 154 deletions(-)
 delete mode 100644 partners/templates/partners/manage_partners.html

diff --git a/partners/forms.py b/partners/forms.py
index 1e2291c44..0d6265432 100644
--- a/partners/forms.py
+++ b/partners/forms.py
@@ -88,7 +88,8 @@ class PromoteToContactForm(forms.ModelForm):
             first_name=self.cleaned_data['first_name'],
             last_name=self.cleaned_data['last_name'],
             email=self.cleaned_data['email'],
-            username=self.cleaned_data['email']
+            username=self.cleaned_data['email'],
+            is_active=False,
         )
         user.save()
         contact = Contact(
diff --git a/partners/models.py b/partners/models.py
index 71f6fc10d..7148f51e6 100644
--- a/partners/models.py
+++ b/partners/models.py
@@ -130,6 +130,15 @@ class Contact(models.Model):
     def __str__(self):
         return '%s %s, %s' % (self.get_title_display(), self.user.last_name, self.user.first_name)
 
+    @property
+    def kind_display(self):
+        """
+        Due to a lack of support of to use get_FOO_display in a ArrayField, one has to create
+        one 'manually'.
+        """
+        choices = dict(CONTACT_TYPES)
+        return ', '.join([choices[value] for index, value in enumerate(self.kind)])
+
 
 class Partner(models.Model):
     """
diff --git a/partners/templates/partners/_partner_card.html b/partners/templates/partners/_partner_card.html
index 0a5e7df59..bfc788abf 100644
--- a/partners/templates/partners/_partner_card.html
+++ b/partners/templates/partners/_partner_card.html
@@ -2,29 +2,32 @@
 
 <div class="card-block">
   <div class="row">
-    <div class="col-1">
+    <div class="col-md-1">
       <p>{{ partner.institution.country }}</p>
     </div>
-    <div class="col-4">
-      <h3>{{ partner.institution.name }}</h3>
-      <p>{{ partner.institution.acronym }}</p>
-      <p>({{ pp.get_kind_display }})</p>
+    <div class="col-md-4">
+      <address>
+        <h3>{{ partner.institution.name }}</h3>
+        <strong>{{ partner.institution.acronym }} ({{ partner.institution.get_kind_display }})</strong><br>
+        {{ partner.institution.address|linebreaks }}
+        {{ partner.institution.get_country_display }}<br>
+        Main contact: {{ partner.main_contact|default_if_none:'<em>Unknown</em>' }}
+      </address>
     </div>
-    <div class="col-4">
-      {% if partner.main_contact %}
-      <p>Main contact: {{ partner.main_contact..get_title_display }} {{ partner.main_contact.user.first_name }} {{ partner.main_contact.user.last_name }}</p>
-      <p>{{ partner.main_contact.user.email }}</p>
-      {% endif %}
-      {% if partner.financial_contact %}
-      <p>Financial contact: {{ partner.financial_contact..get_title_display }} {{ partner.financial_contact.user.first_name }} {{ partner.financial_contact.user.last_name }}</p>
-      <p>{{ partner.financial_contact.user.email }}</p>
-      {% endif %}
-      {% if partner.technical_contact %}
-      <p>Technical contact: {{ partner.technical_contact..get_title_display }} {{ partner.technical_contact.user.first_name }} {{ partner.technical_contact.user.last_name }}</p>
-      <p>{{ partner.technical_contact.user.email }}</p>
-      {% endif %}
+    <div class="col-md-4">
+
+      <h3>Contacts</h3>
+      <ul>
+          {% for contact in partner.contact_set.all %}
+              <li>
+                  <h4>{{ contact.get_title_display }} {{ contact.user.first_name }} {{ contact.user.last_name }}</h4>
+                  <div>({{ contact.kind_display }})</div>
+                  <div class="mb-2"><a href="mailto:{{ contact.user.email }}">{{ contact.user.email }}</a></div>
+              </li>
+          {% endfor %}
+      </ul>
     </div>
-    <div class="col-3">
+    <div class="col-md-3">
       <p>Edit</p>
     </div>
   </div>
diff --git a/partners/templates/partners/add_prospective_partner.html b/partners/templates/partners/add_prospective_partner.html
index 8475f8374..28abef26c 100644
--- a/partners/templates/partners/add_prospective_partner.html
+++ b/partners/templates/partners/add_prospective_partner.html
@@ -1,4 +1,10 @@
-{% extends 'scipost/base.html' %}
+{% extends 'partners/_partners_page_base.html' %}
+
+{% block breadcrumb_items %}
+    {{block.super}}
+    <span class="breadcrumb-item">Add a Prospective Partner</span>
+{% endblock %}
+
 
 {% block pagetitle %}: Supporting Partners: add{% endblock pagetitle %}
 
diff --git a/partners/templates/partners/dashboard.html b/partners/templates/partners/dashboard.html
index 560a8f254..a7b5c0a0a 100644
--- a/partners/templates/partners/dashboard.html
+++ b/partners/templates/partners/dashboard.html
@@ -1,5 +1,6 @@
 {% extends 'scipost/base.html' %}
 
+{% load partners_extras %}
 {% load bootstrap %}
 
 {% block pagetitle %}: partner page{% endblock pagetitle %}
@@ -25,6 +26,17 @@
                   <li class="nav-item btn btn-secondary">
                     <a href="#agreements" class="nav-link" data-toggle="tab">Membership Agreements</a>
                   </li>
+                  {% if perms.scipost.can_manage_SPB %}
+                    <li class="nav-item btn btn-secondary">
+                        <a href="#prospartners" class="nav-link" data-toggle="tab">Prospective Partners</a>
+                    </li>
+                    <li class="nav-item btn btn-secondary">
+                        <a href="#partners" class="nav-link" data-toggle="tab">Partners</a>
+                    </li>
+                    <li class="nav-item btn btn-secondary">
+                        <a href="#agreements" class="nav-link" data-toggle="tab">Agreements</a>
+                    </li>
+                  {% endif %}
                 </ul>
             </div>
         </div>
@@ -36,11 +48,7 @@
     <div class="tab-pane active" id="account" role="tabpanel">
         <div class="row">
             <div class="col-12">
-                <div class="card card-grey">
-                    <div class="card-block">
-                        <h2 class="card-title mb-0">Your Account</h2>
-                    </div>
-                </div>
+                <h2 class="highlight">Your Account</h2>
             </div>
         </div>
         <div class="row">
@@ -81,11 +89,7 @@
     <div class="tab-pane" id="agreements" role="tabpanel">
         <div class="row">
             <div class="col-12">
-                <div class="card card-grey">
-                    <div class="card-block">
-                        <h2 class="card-title mb-0">Membership Agreements</h2>
-                    </div>
-                </div>
+                <h2 class="highlight">Membership Agreements</h2>
             </div>
         </div>
         <div class="row">
@@ -95,6 +99,80 @@
             </div>
         </div>
     </div><!-- End tab -->
+
+    {% if perms.scipost.can_manage_SPB %}
+        <!-- Tab: prospective partners -->
+        <div class="tab-pane" id="prospartners" role="tabpanel">
+              <div class="row">
+            	<div class="col-12">
+            	  <h2 class="highlight">Prospective Partners</h2>
+            	</div>
+              </div>
+              <h3><a href="{% url 'partners:add_prospective_partner' %}">Add a prospective partner</a></h3>
+              <br/>
+
+              <table class="table table-hover mb-5">
+                  <thead class="thead-default">
+                      <tr>
+                    	<th>Country</th>
+                    	<th>Institution name</th>
+                    	<th>Kind</th>
+                    	<th>Status</th>
+                    	<th>Date received</th>
+                    </tr>
+                  </thead>
+
+                  <tbody id="accordion" role="tablist" aria-multiselectable="true">
+                    {% for partner in prospective_partners %}
+            	      <tr data-toggle="collapse" data-parent="#accordion" href="#collapse{{ partner.id }}" aria-expanded="true" aria-controls="collapse{{ partner.id }}" style="cursor: pointer;">
+                    		  <td>{{ partner.get_country_display }}</td>
+                    		  <td>{{ partner.institution_name }}</td>
+                    		  <td>{{ partner.get_kind_display }}</td>
+                    		  <td style="background-color:{{ partner.status|partnerstatuscolor }}">{{ partner.get_status_display }}</td>
+                    		  <td>{{ partner.date_received|date:"Y-m-d" }}</td>
+                    	</tr>
+                        <tr id="collapse{{ partner.id }}" class="collapse" role="tabpanel" aria-labelledby="heading{{ partner.id}}" style="background-color: #fff;">
+                            <td colspan="5">
+                        	    {% include 'partners/_prospective_partner_card.html' with pp=partner %}
+                            </td>
+                        </tr>
+                    {% empty %}
+                        <tr>
+                            <td colspan="5">No prospects found.</td>
+                        </tr>
+                	{% endfor %}
+                </tbody>
+            </table>
+        </div><!-- End tab -->
+
+        <!-- Tab: Partners -->
+        <div class="tab-pane" id="partners" role="tabpanel">
+          <div class="row">
+        	<div class="col-12">
+        	  <h2 class="highlight">Partners</h2>
+        	</div>
+          </div>
+          <ul class="list-group list-group-flush">
+        	{% for partner in partners %}
+        	<li class="list-group-item">{% include 'partners/_partner_card.html' with partner=partner %}</li>
+        	{% endfor %}
+          </ul>
+      </div><!-- End tab -->
+
+      <!-- Tab: Agreements -->
+      <div class="tab-pane" id="agreements" role="tabpanel">
+          <div class="row">
+        	<div class="col-12">
+        	  <h2 class="highlight">Agreements</h2>
+        	</div>
+          </div>
+          <ul>
+        	{% for agreement in agreements %}
+            	<li>{{ agreement }}</li>
+        	{% endfor %}
+          </ul>
+      </div><!-- End tab -->
+    {% endif %}
 </div>
 
 
diff --git a/partners/templates/partners/manage_partners.html b/partners/templates/partners/manage_partners.html
deleted file mode 100644
index 903a78b05..000000000
--- a/partners/templates/partners/manage_partners.html
+++ /dev/null
@@ -1,104 +0,0 @@
-{% extends 'scipost/base.html' %}
-
-{% load partners_extras %}
-
-{% block pagetitle %}: Supporting Partners: manage{% endblock pagetitle %}
-
-
-{% block content %}
-
-<div class="row">
-    <div class="col-12">
-      <h1 class="highlight">Partners Management Page</h1>
-    </div>
-</div>
-
-
-<div class="row">
-    <div class="col-12">
-      <div class="tab-nav-container">
-	<div class="tab-nav-inner">
-	  <ul class="nav btn-group personal-page-nav" role="tablist">
-	    <li class="nav-item btn btn-secondary">
-	      <a href="#prospartners" class="nav-link active" data-toggle="tab">Prospective Partners</a>
-	    </li>
-	    <li class="nav-item btn btn-secondary">
-	      <a href="#partners" class="nav-link" data-toggle="tab">Partners</a>
-	    </li>
-	    <li class="nav-item btn btn-secondary">
-	      <a href="#agreements" class="nav-link" data-toggle="tab">Agreements</a>
-	    </li>
-	  </ul>
-	</div>
-      </div>
-    </div>
-</div>
-
-  <div class="tab-content">
-    <div class="tab-pane active" id="prospartners" role="tabpanel">
-          <div class="row">
-        	<div class="col-12">
-        	  <h2 class="highlight">Prospective Partners</h2>
-        	</div>
-          </div>
-          <h3><a href="{% url 'partners:add_prospective_partner' %}">Add a prospective partner</a></h3>
-          <br/>
-
-          <table class="table table-hover">
-              <thead class="thead-default">
-                  <tr>
-                	<th>Country</th>
-                	<th>Institution name</th>
-                	<th>Kind</th>
-                	<th>Status</th>
-                	<th>Date received</th>
-                </tr>
-              </thead>
-
-              <tbody id="accordion" role="tablist" aria-multiselectable="true">
-                {% for partner in prospective_partners %}
-        	      <tr data-toggle="collapse" data-parent="#accordion" href="#collapse{{ partner.id }}" aria-expanded="true" aria-controls="collapse{{ partner.id }}" style="cursor: pointer;">
-                		  <td>{{ partner.get_country_display }}</td>
-                		  <td>{{ partner.institution_name }}</td>
-                		  <td>{{ partner.get_kind_display }}</td>
-                		  <td style="background-color:{{ partner.status|partnerstatuscolor }}">{{ partner.get_status_display }}</td>
-                		  <td>{{ partner.date_received|date:"Y-m-d" }}</td>
-                	</tr>
-                    <tr id="collapse{{ partner.id }}" class="collapse" role="tabpanel" aria-labelledby="heading{{ partner.id}}" style="background-color: #fff;">
-                        <td colspan="5">
-                    	    {% include 'partners/_prospective_partner_card.html' with pp=partner %}
-                        </td>
-                    </tr>
-            	{% endfor %}
-            </tbody>
-        </table>
-    </div>
-
-    <div class="tab-pane" id="partners" role="tabpanel">
-      <div class="row">
-	<div class="col-12">
-	  <h2 class="highlight">Partners</h2>
-	</div>
-      </div>
-      <ul class="list-group list-group-flush">
-	{% for partner in partners %}
-	<li class="list-group-item">{% include 'partners/_partner_card.html' with partner=partner %}</li>
-	{% endfor %}
-      </ul>
-    </div>
-
-    <div class="tab-pane" id="agreements" role="tabpanel">
-      <div class="row">
-	<div class="col-12">
-	  <h2 class="highlight">Agreements</h2>
-	</div>
-      </div>
-      <ul>
-	{% for agreement in agreements %}
-	<li>{{ agreement }}</li>
-	{% endfor %}
-      </ul>
-    </div>
-  </div>
-
-{% endblock content %}
diff --git a/partners/templates/partners/supporting_partners.html b/partners/templates/partners/supporting_partners.html
index e7ee9a584..2c0d931cf 100644
--- a/partners/templates/partners/supporting_partners.html
+++ b/partners/templates/partners/supporting_partners.html
@@ -12,7 +12,7 @@
   <div class="col-12">
       <h1 class="highlight">SciPost Supporting Partners</h1>
       {% if perms.scipost.can_manage_SPB %}
-          <a href="{% url 'partners:manage' %}">Manage Partners</a>
+          <a href="{% url 'partners:dashboard' %}">Manage Partners</a>
       {% endif %}
     </div>
 </div>
diff --git a/partners/urls.py b/partners/urls.py
index 1c092ae45..3297d6d0d 100644
--- a/partners/urls.py
+++ b/partners/urls.py
@@ -6,7 +6,6 @@ urlpatterns = [
     url(r'^$', views.supporting_partners, name='partners'),
     url(r'^dashboard$', views.dashboard, name='dashboard'),
     url(r'^membership_request$', views.membership_request, name='membership_request'),
-    url(r'^manage$', views.manage, name='manage'),
     url(r'^prospect_partners/add$', views.add_prospective_partner,
         name='add_prospective_partner'),
     url(r'^prospect_partners/contacts/(?P<contact_id>[0-9]+)/email$',
diff --git a/partners/views.py b/partners/views.py
index 26c5eb3d0..83b383e5f 100644
--- a/partners/views.py
+++ b/partners/views.py
@@ -34,6 +34,12 @@ def dashboard(request):
     to read their personal data and agreements.
     '''
     context = {}
+    if request.user.has_perm('scipost.can_manage_SPB'):
+        context['partners'] = Partner.objects.all()
+        context['prospective_partners'] = (ProspectivePartner.objects.not_yet_partner()
+                                           .order_by('country', 'institution_name'))
+        context['ppevent_form'] = ProspectivePartnerEventForm()
+        context['agreements'] = MembershipAgreement.objects.order_by('date_requested')
     return render(request, 'partners/dashboard.html', context)
 
 
@@ -70,23 +76,7 @@ def membership_request(request):
     return render(request, 'partners/membership_request.html', context)
 
 
-@permission_required('scipost.can_manage_SPB', return_403=True)
-def manage(request):
-    """
-    Lists relevant info regarding management of Supporting Partners Board.
-    """
-    partners = Partner.objects.all()
-    prospective_partners = ProspectivePartner.objects.order_by('country', 'institution_name')
-    ppevent_form = ProspectivePartnerEventForm()
-    agreements = MembershipAgreement.objects.order_by('date_requested')
-    context = {'partners': partners,
-               'prospective_partners': prospective_partners,
-               'ppevent_form': ppevent_form,
-               'agreements': agreements, }
-    return render(request, 'partners/manage_partners.html', context)
-
-
-@permission_required('scipost.can_manage_SPB', return_403=True)
+@permission_required('scipost.can_promote_prospect_to_partner', return_403=True)
 @transaction.atomic
 def promote_prospartner(request, prospartner_id):
     prospartner = get_object_or_404(ProspectivePartner.objects.not_yet_partner(),
diff --git a/scipost/management/commands/add_groups_and_permissions.py b/scipost/management/commands/add_groups_and_permissions.py
index 2a8874827..c802b141e 100644
--- a/scipost/management/commands/add_groups_and_permissions.py
+++ b/scipost/management/commands/add_groups_and_permissions.py
@@ -3,6 +3,7 @@ from django.core.management.base import BaseCommand
 from django.contrib.auth.models import Group, Permission
 from django.contrib.contenttypes.models import ContentType
 
+from partners.models import Contact
 from scipost.models import Contributor
 
 
@@ -32,6 +33,7 @@ class Command(BaseCommand):
 
         # Create Permissions
         content_type = ContentType.objects.get_for_model(Contributor)
+        content_type_contact = ContentType.objects.get_for_model(Contact)
 
         # Supporting Partners
         can_manage_SPB, created = Permission.objects.get_or_create(
@@ -42,6 +44,14 @@ class Command(BaseCommand):
             codename='can_email_prospartner_contact',
             name='Can email Prospective Partner Contact',
             content_type=content_type)
+        can_read_personal_page, created = Permission.objects.get_or_create(
+            codename='can_read_personal_page',
+            name='Can read Prospective Partner personal page',
+            content_type=content_type_contact)
+        can_promote_prospect_to_partner, created = Permission.objects.get_or_create(
+            codename='can_promote_prospect_to_partner',
+            name='Can promote Prospective Partner to Partner',
+            content_type=content_type_contact)
 
         # Registration and invitations
         can_vet_registration_requests, created = Permission.objects.get_or_create(
@@ -256,10 +266,13 @@ class Command(BaseCommand):
         ])
 
         PartnersAdmin.permissions.set([
+            can_read_personal_page,
             can_manage_SPB,
+            can_promote_prospect_to_partner,
             can_email_prospartner_contact,
         ])
         PartnersOfficers.permissions.set([
+            can_read_personal_page,
             can_manage_SPB,
         ])
 
-- 
GitLab