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