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