From 5e348440b8c69bd23230d474d0c9bd9f201526e4 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Sat, 23 Feb 2019 07:29:49 +0100
Subject: [PATCH] Add ContactRole emailing facilities

---
 organizations/models.py                       |  9 +++++
 .../organizations/_organization_card.html     |  4 +++
 organizations/urls.py                         | 22 +++++++++----
 organizations/views.py                        | 33 ++++++++++++++++++-
 .../contactrole_generic_mail.html             |  6 ++++
 .../contactrole_generic_mail.json             |  8 +++++
 .../contactrole_subsidy_renewal_mail.html     | 12 +++++++
 .../contactrole_subsidy_renewal_mail.json     |  8 +++++
 8 files changed, 95 insertions(+), 7 deletions(-)
 create mode 100644 templates/email/org_contacts/contactrole_generic_mail.html
 create mode 100644 templates/email/org_contacts/contactrole_generic_mail.json
 create mode 100644 templates/email/org_contacts/contactrole_subsidy_renewal_mail.html
 create mode 100644 templates/email/org_contacts/contactrole_subsidy_renewal_mail.json

diff --git a/organizations/models.py b/organizations/models.py
index 96f4ea39f..039e35b8b 100644
--- a/organizations/models.py
+++ b/organizations/models.py
@@ -168,6 +168,15 @@ class Organization(models.Model):
         """
         return self.subsidy_set.filter(date_until__gte=datetime.date.today()).exists()
 
+    @property
+    def latest_subsidy_date_until(self):
+        """
+        Returns the end date of validity of the latest subsidy.
+        """
+        if self.subsidy_set:
+            return self.subsidy_set.order_by('-date_until').first().date_until
+        return '-'
+
     def get_total_subsidies_obtained(self, n_years_past=None):
         """
         Computes the total amount received by SciPost, in the form
diff --git a/organizations/templates/organizations/_organization_card.html b/organizations/templates/organizations/_organization_card.html
index 6194f1545..40655b1aa 100644
--- a/organizations/templates/organizations/_organization_card.html
+++ b/organizations/templates/organizations/_organization_card.html
@@ -191,6 +191,10 @@ $(document).ready(function($) {
 	      <td>{% if contactrole.contact.user.is_active %}<i class="fa fa-check-circle text-success"></i>{% else %}<i class="fa fa-times-circle text-danger"></i>{% endif %}</td>
 	      <td>
 		<ul>
+		  {% if perms.scipost.can_manage_organizations %}
+		  <li><a href="{% url 'organizations:email_contactrole' contactrole_id=contactrole.id %}">Email (generic)</a></li>
+		  <li><a href="{% url 'organizations:email_contactrole' contactrole_id=contactrole.id mail='renewal' %}">Email (subsidy renewal)</a></li>
+		  {% endif %}
 		  {% if perms.scipost.can_manage_organizations or "can_view_org_contacts" in user_org_perms %}
 		  <li><a href="{% url 'organizations:contactrole_update' pk=contactrole.id %}"><span class="text-warning">Update</span></a></li>
 		  {% endif %}
diff --git a/organizations/urls.py b/organizations/urls.py
index 9e8bdae78..726f68514 100644
--- a/organizations/urls.py
+++ b/organizations/urls.py
@@ -73,6 +73,16 @@ urlpatterns = [
         views.organization_add_contact,
         name='add_contact'
     ),
+    url(
+        r'^activate/(?P<activation_key>.+)$',
+        views.activate_account,
+        name='activate_account'
+    ),
+    url(
+        r'^dashboard/$',
+        views.dashboard,
+        name='dashboard'
+    ),
     url(
         r'^contactrole/(?P<pk>[0-9]+)/update/$',
         views.ContactRoleUpdateView.as_view(),
@@ -84,13 +94,13 @@ urlpatterns = [
         name='contactrole_delete'
     ),
     url(
-        r'^activate/(?P<activation_key>.+)$',
-        views.activate_account,
-        name='activate_account'
+        r'^contactrole/(?P<contactrole_id>[0-9]+)/email/(?P<mail>renewal)$',
+        views.email_contactrole,
+        name='email_contactrole'
     ),
     url(
-        r'^dashboard/$',
-        views.dashboard,
-        name='dashboard'
+        r'^contactrole/(?P<contactrole_id>[0-9]+)/email/$',
+        views.email_contactrole,
+        name='email_contactrole'
     ),
 ]
diff --git a/organizations/views.py b/organizations/views.py
index 88a13d7b5..4f06204d1 100644
--- a/organizations/views.py
+++ b/organizations/views.py
@@ -187,7 +187,8 @@ def email_contactperson(request, contactperson_id, mail=None):
         suffix = ' (initial)'
     mail_request = MailEditingSubView(request, mail_code=code, contactperson=contactperson)
     if mail_request.is_valid():
-        comments = 'Email{suffix} sent to {name}.'.format(suffix=suffix, name=contactperson)
+        comments = 'Email{suffix} sent to ContactPerson {name}.'.format(
+            suffix=suffix, name=contactperson)
         event = OrganizationEvent(
             organization=contactperson.organization,
             event=ORGANIZATION_EVENT_EMAIL_SENT,
@@ -306,3 +307,33 @@ class ContactRoleDeleteView(PermissionsMixin, DeleteView):
     def get_success_url(self):
         return reverse_lazy('organizations:organization_details',
                             kwargs={'pk': self.object.organization.id})
+
+
+@permission_required('scipost.can_manage_organizations', return_403=True)
+@transaction.atomic
+def email_contactrole(request, contactrole_id, mail=None):
+    contactrole = get_object_or_404(ContactRole, pk=contactrole_id)
+
+    suffix = ''
+    if mail == 'renewal':
+        code = 'org_contacts/contactrole_subsidy_renewal_mail'
+        suffix = ' (subsidy renewal query)'
+    else:
+        code = 'org_contacts/contactrole_generic_mail'
+        suffix = ' (generic)'
+    mail_request = MailEditingSubView(request, mail_code=code, contactrole=contactrole)
+    if mail_request.is_valid():
+        comments = 'Email{suffix} sent to Contact {name}.'.format(
+            suffix=suffix, name=contactrole.contact)
+        event = OrganizationEvent(
+            organization=contactrole.organization,
+            event=ORGANIZATION_EVENT_EMAIL_SENT,
+            comments=comments,
+            noted_on=timezone.now(),
+            noted_by=request.user)
+        event.save()
+        messages.success(request, 'Email successfully sent.')
+        mail_request.send()
+        return redirect(contactrole.organization.get_absolute_url())
+    else:
+        return mail_request.return_render()
diff --git a/templates/email/org_contacts/contactrole_generic_mail.html b/templates/email/org_contacts/contactrole_generic_mail.html
new file mode 100644
index 000000000..c226178ad
--- /dev/null
+++ b/templates/email/org_contacts/contactrole_generic_mail.html
@@ -0,0 +1,6 @@
+<p>
+  Dear {{ contactrole.contact.get_title_display }} {{ contactrole.contact.user.last_name }},
+</p>
+<p>
+  On behalf of the SciPost Foundation,<br><br>
+</p>
diff --git a/templates/email/org_contacts/contactrole_generic_mail.json b/templates/email/org_contacts/contactrole_generic_mail.json
new file mode 100644
index 000000000..c5b4b1ec6
--- /dev/null
+++ b/templates/email/org_contacts/contactrole_generic_mail.json
@@ -0,0 +1,8 @@
+{
+    "subject": "SciPost: Sponsors",
+    "to_address": "contact.user.email",
+    "bcc_to": "sponsors@scipost.org",
+    "from_address_name": "SciPost Sponsors",
+    "from_address": "sponsors@scipost.org",
+    "context_object": "contactrole"
+}
diff --git a/templates/email/org_contacts/contactrole_subsidy_renewal_mail.html b/templates/email/org_contacts/contactrole_subsidy_renewal_mail.html
new file mode 100644
index 000000000..6dbbf6bf8
--- /dev/null
+++ b/templates/email/org_contacts/contactrole_subsidy_renewal_mail.html
@@ -0,0 +1,12 @@
+<p>
+  Dear {{ contactrole.contact.get_title_display }} {{ contactrole.contact.user.last_name }},
+</p>
+<p>
+  Your organization ({{ contactrole.organization }}) has been sponsoring SciPost (see details at <a href="https://scipost.org{{ contactrole.organization.get_absolute_url }}">this link</a>), for which we are extremely grateful.
+</p>
+<p>
+  Your latest sponsorship period ends on {{ contactrole.organization.latest_subsidy_date_until }}. We would be extremely grateful for your continued support, and would hereby like to enquire whether we can start the renewal procedure.
+</p>
+<p>
+  On behalf of the SciPost Foundation,<br><br>
+</p>
diff --git a/templates/email/org_contacts/contactrole_subsidy_renewal_mail.json b/templates/email/org_contacts/contactrole_subsidy_renewal_mail.json
new file mode 100644
index 000000000..544f6dbc4
--- /dev/null
+++ b/templates/email/org_contacts/contactrole_subsidy_renewal_mail.json
@@ -0,0 +1,8 @@
+{
+    "subject": "SciPost: Sponsorship renewal",
+    "to_address": "contact.user.email",
+    "bcc_to": "sponsors@scipost.org",
+    "from_address_name": "SciPost Sponsors",
+    "from_address": "sponsors@scipost.org",
+    "context_object": "contactrole"
+}
-- 
GitLab