From 509a51adeacf14307a8f7fd115aa572f722012d6 Mon Sep 17 00:00:00 2001
From: Jorran de Wit <jorrandewit@outlook.com>
Date: Sat, 24 Jun 2017 18:04:53 +0200
Subject: [PATCH] Basic working Agreements views

---
 partners/forms.py                             | 33 ++++++++++++++++-
 partners/models.py                            |  5 ++-
 .../templates/partners/_agreement_table.html  |  8 ++++
 .../templates/partners/agreements_add.html    | 33 +++++++++++++++++
 .../partners/agreements_details.html          | 37 +++++++++++++++++++
 partners/templates/partners/dashboard.html    | 18 +++++----
 .../templates/partners/partners_detail.html   | 10 ++++-
 partners/urls.py                              |  5 +++
 partners/views.py                             | 34 ++++++++++++++++-
 9 files changed, 172 insertions(+), 11 deletions(-)
 create mode 100644 partners/templates/partners/_agreement_table.html
 create mode 100644 partners/templates/partners/agreements_add.html
 create mode 100644 partners/templates/partners/agreements_details.html

diff --git a/partners/forms.py b/partners/forms.py
index c6d76ba07..b52c14bd2 100644
--- a/partners/forms.py
+++ b/partners/forms.py
@@ -12,11 +12,42 @@ from django_countries.fields import LazyTypedChoiceField
 from .constants import PARTNER_KINDS, PROSPECTIVE_PARTNER_PROCESSED, CONTACT_TYPES,\
                        PARTNER_STATUS_UPDATE
 from .models import Partner, ProspectivePartner, ProspectiveContact, ProspectivePartnerEvent,\
-                    Institution, Contact, PartnerEvent
+                    Institution, Contact, PartnerEvent, MembershipAgreement
 
 from scipost.models import TITLE_CHOICES
 
 
+class MembershipAgreementForm(forms.ModelForm):
+    class Meta:
+        model = MembershipAgreement
+        fields = (
+            'partner',
+            # 'consortium',
+            'status',
+            'date_requested',
+            'start_date',
+            'duration',
+            'offered_yearly_contribution'
+        )
+        widgets = {
+            'start_date': forms.TextInput(attrs={'placeholder': 'YYYY-MM-DD'}),
+            'date_requested': forms.TextInput(attrs={'placeholder': 'YYYY-MM-DD'}),
+        }
+
+    def save(self, current_user, commit=True):
+        agreement = super().save(commit)
+        if commit and agreement.partner and not self.instance.id:
+            # Create PartnerEvent if Agreement is new
+            event = PartnerEvent(
+                partner=agreement.partner,
+                event=PARTNER_STATUS_UPDATE,
+                comments='Membership Agreement added with start date %s' % agreement.start_date,
+                noted_by=current_user
+            )
+            event.save()
+        return agreement
+
+
 class ActivationForm(forms.ModelForm):
     class Meta:
         model = User
diff --git a/partners/models.py b/partners/models.py
index 5aeb7d68f..8381b61e0 100644
--- a/partners/models.py
+++ b/partners/models.py
@@ -235,7 +235,7 @@ class MembershipAgreement(models.Model):
     date_requested = models.DateField()
     start_date = models.DateField()
     duration = models.DurationField(choices=MEMBERSHIP_DURATION)
-    offered_yearly_contribution = models.SmallIntegerField(default=0)
+    offered_yearly_contribution = models.SmallIntegerField(default=0, help_text="Yearly contribution in euro's (€)")
 
     objects = MembershipAgreementManager()
 
@@ -243,3 +243,6 @@ class MembershipAgreement(models.Model):
         return (str(self.partner) +
                 ' [' + self.get_duration_display() +
                 ' from ' + self.start_date.strftime('%Y-%m-%d') + ']')
+
+    def get_absolute_url(self):
+        return reverse('partners:agreement_details', args=(self.id,))
diff --git a/partners/templates/partners/_agreement_table.html b/partners/templates/partners/_agreement_table.html
new file mode 100644
index 000000000..8a878dfe5
--- /dev/null
+++ b/partners/templates/partners/_agreement_table.html
@@ -0,0 +1,8 @@
+<table class="table">
+    <tr><td>Partner: </td><td><a href="{{agreement.partner.get_absolute_url}}">{{ agreement.partner }}</a></td></tr>
+    <tr><td>Status: </td><td>{{ agreement.status }}</td></tr>
+    <tr><td>Request date: </td><td>{{ agreement.date_requested }}</td></tr>
+    <tr><td>Start date: </td><td>{{ agreement.start_date }}</td></tr>
+    <tr><td>Duration: </td><td>{{ agreement.duration }}</td></tr>
+    <tr><td>Yearly contribution: </td><td>€ {{ agreement.offered_yearly_contribution }}</td></tr>
+</table>
diff --git a/partners/templates/partners/agreements_add.html b/partners/templates/partners/agreements_add.html
new file mode 100644
index 000000000..98116017a
--- /dev/null
+++ b/partners/templates/partners/agreements_add.html
@@ -0,0 +1,33 @@
+{% extends 'partners/_partners_page_base.html' %}
+
+{% block breadcrumb_items %}
+    {{block.super}}
+    <span class="breadcrumb-item">Add Membership Agreement</span>
+{% endblock %}
+
+{% block pagetitle %}{{block.super}} Add Membership Agreement{% endblock pagetitle %}
+
+{% load bootstrap %}
+
+{% block content %}
+
+<div class="row">
+    <div class="col-12">
+        <h1 class="highlight">Add Membership Agreement</h1>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-12">
+      <form method="post">
+        {% csrf_token %}
+        <div class="mb-5">
+            {{ form|bootstrap }}
+        </div>
+
+        <input class="btn btn-primary" type="submit" value="Submit"/>
+      </form>
+    </div>
+</div>
+
+{% endblock content %}
diff --git a/partners/templates/partners/agreements_details.html b/partners/templates/partners/agreements_details.html
new file mode 100644
index 000000000..b7971b72d
--- /dev/null
+++ b/partners/templates/partners/agreements_details.html
@@ -0,0 +1,37 @@
+{% extends 'partners/_partners_page_base.html' %}
+
+{% block breadcrumb_items %}
+    {{block.super}}
+    <span class="breadcrumb-item">Membership Agreement details</span>
+{% endblock %}
+
+{% block pagetitle %}{{block.super}} Membership Agreement details{% endblock pagetitle %}
+
+{% load bootstrap %}
+
+{% block content %}
+
+<div class="row">
+    <div class="col-12">
+        <h1 class="highlight">Membership Agreement details</h1>
+    </div>
+</div>
+
+<div class="row">
+    <div class="col-md-6">
+        <h2>Membership Agreement</h2>
+        {% include 'partners/_agreement_table.html' with agreement=agreement %}
+    </div>
+
+    <div class="col-12">
+        <h2>Update Agreement</h2>
+      <form method="post">
+        {% csrf_token %}
+        {{ form|bootstrap }}
+
+        <input class="btn btn-primary" type="submit" value="Update"/>
+      </form>
+    </div>
+</div>
+
+{% endblock content %}
diff --git a/partners/templates/partners/dashboard.html b/partners/templates/partners/dashboard.html
index a2d60a9f2..b75ed6418 100644
--- a/partners/templates/partners/dashboard.html
+++ b/partners/templates/partners/dashboard.html
@@ -34,7 +34,7 @@
                         <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>
+                        <a href="#global_agreements" class="nav-link" data-toggle="tab">Agreements</a>
                     </li>
                   {% endif %}
                 </ul>
@@ -106,10 +106,9 @@
               <div class="row">
             	<div class="col-12">
             	  <h2 class="highlight">Prospective Partners</h2>
+                  <h3><a href="{% url 'partners:add_prospective_partner' %}">Add a prospective partner</a></h3>
             	</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">
@@ -160,15 +159,20 @@
       </div><!-- End tab -->
 
       <!-- Tab: Agreements -->
-      <div class="tab-pane" id="agreements" role="tabpanel">
+      <div class="tab-pane" id="global_agreements" role="tabpanel">
           <div class="row">
         	<div class="col-12">
-        	  <h2 class="highlight">Agreements</h2>
+        	  <h2 class="highlight">Membership Agreements</h2>
+              <h3><a href="{% url 'partners:add_agreement' %}">Add Membership Agreement</a></h3>
         	</div>
           </div>
-          <ul>
+
+          <h3>SciPost's Registered Membership Agreements</h3>
+          <ul class="mb-5">
         	{% for agreement in agreements %}
-            	<li>{{ agreement }}</li>
+            	<li><a href="{{agreement.get_absolute_url}}">{{ agreement }}</a></li>
+            {% empty %}
+                <li>No Agreements found.</li>
         	{% endfor %}
           </ul>
       </div><!-- End tab -->
diff --git a/partners/templates/partners/partners_detail.html b/partners/templates/partners/partners_detail.html
index b8d083511..797f9359a 100644
--- a/partners/templates/partners/partners_detail.html
+++ b/partners/templates/partners/partners_detail.html
@@ -28,7 +28,15 @@
             Main contact: {{ partner.main_contact|default_if_none:'<em>Unknown</em>' }}
         </address>
 
-        <hr>
+        <h3>Membership Agreements</h3>
+        <ul>
+            {% for agreement in partner.agreements.all %}
+                <li><a href="{{agreement.get_absolute_url}}">{{agreement}}</a></li>
+            {% empty %}
+                <li>No agreements found.</li>
+            {% endfor %}
+        </ul>
+
         <h3>Contacts</h3>
         <ul>
             {% for contact in partner.contact_set.all %}
diff --git a/partners/urls.py b/partners/urls.py
index 74df2bf89..5db245e99 100644
--- a/partners/urls.py
+++ b/partners/urls.py
@@ -19,6 +19,11 @@ urlpatterns = [
     url(r'^prospects/(?P<prospartner_id>[0-9]+)/events/add$',
         views.add_prospartner_event, name='add_prospartner_event'),
 
+    # Agreements
+    url(r'agreements/new$', views.add_agreement, name='add_agreement'),
+    url(r'agreements/(?P<agreement_id>[0-9]+)$', views.agreement_details,
+        name='agreement_details'),
+
     # Institutions
     url(r'institutions/(?P<institution_id>[0-9]+)/edit$', views.institution_edit,
         name='institution_edit'),
diff --git a/partners/views.py b/partners/views.py
index a3d7b1d01..3b462697e 100644
--- a/partners/views.py
+++ b/partners/views.py
@@ -16,7 +16,8 @@ from .forms import ProspectivePartnerForm, ProspectiveContactForm,\
                    EmailProspectivePartnerContactForm, PromoteToPartnerForm,\
                    ProspectivePartnerEventForm, MembershipQueryForm, PromoteToContactForm,\
                    PromoteToContactFormset, PartnerForm, ContactForm, ContactFormset,\
-                   NewContactForm, InstitutionForm, ActivationForm, PartnerEventForm
+                   NewContactForm, InstitutionForm, ActivationForm, PartnerEventForm,\
+                   MembershipAgreementForm
 
 from .utils import PartnerUtils
 
@@ -260,6 +261,37 @@ def add_prospartner_event(request, prospartner_id):
     return render(request, 'scipost/error.html', {'errormessage': errormessage})
 
 
+############
+# Agreements
+############
+@permission_required('scipost.can_manage_SPB', return_403=True)
+def add_agreement(request):
+    form = MembershipAgreementForm(request.POST or None, initial=request.GET)
+    if request.POST and form.is_valid():
+        agreement = form.save(request.user)
+        messages.success(request, 'Membership Agreement created.')
+        return redirect(agreement.get_absolute_url())
+    context = {
+        'form': form
+    }
+    return render(request, 'partners/agreements_add.html', context)
+
+
+@permission_required('scipost.can_manage_SPB', return_403=True)
+def agreement_details(request, agreement_id):
+    agreement = get_object_or_404(MembershipAgreement, id=agreement_id)
+    form = MembershipAgreementForm(request.POST or None, instance=agreement)
+    if form.is_valid():
+        agreement = form.save(request.user)
+        messages.success(request, 'Membership Agreement updated.')
+        return redirect(agreement.get_absolute_url())
+    context = {
+        'agreement': agreement,
+        'form': form
+    }
+    return render(request, 'partners/agreements_details.html', context)
+
+
 #########
 # Account
 #########
-- 
GitLab