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