diff --git a/mails/forms.py b/mails/forms.py index c277051d2d46c036c918608a1148e787da8a2115..4dfc63413b174f667fa66da16139838db0b23841 100644 --- a/mails/forms.py +++ b/mails/forms.py @@ -1,3 +1,4 @@ +import re import json import inspect from html2text import HTML2Text @@ -62,14 +63,17 @@ class EmailTemplateForm(forms.Form): # Get recipients list. Try to send through BCC to prevent privacy issues! bcc_list = [] if self.mail_data.get('bcc_to') and self.object: - bcc_to = self.object - for attr in self.mail_data.get('bcc_to').split('.'): - bcc_to = getattr(bcc_to, attr) - - if not isinstance(bcc_to, list): - bcc_list = [bcc_to] + if re.match("[^@]+@[^@]+\.[^@]+", self.mail_data.get('bcc_to')): + bcc_list = [self.mail_data.get('bcc_to')] else: - bcc_list = bcc_to + bcc_to = self.object + for attr in self.mail_data.get('bcc_to').split('.'): + bcc_to = getattr(bcc_to, attr) + + if not isinstance(bcc_to, list): + bcc_list = [bcc_to] + else: + bcc_list = bcc_to if self.cleaned_data.get('extra_recipient') and self.recipient: bcc_list.append(self.cleaned_data.get('extra_recipient')) diff --git a/mails/templates/mail_templates/partners_followup_mail.json b/mails/templates/mail_templates/partners_followup_mail.json index efb95bbc8882bb10b321d44ed84cb72bcede49a0..e2a4c15705f549d843406715290456ef0ab61545 100644 --- a/mails/templates/mail_templates/partners_followup_mail.json +++ b/mails/templates/mail_templates/partners_followup_mail.json @@ -1,6 +1,7 @@ { "subject": "SciPost: Supporting Partners Board", "to_address": "email", + "bcc_to": "partners@scipost.org", "from_address_name": "SciPost Supporting Partners", "from_address": "partners@scipost.org", "context_object": "contact" diff --git a/mails/templates/mail_templates/partners_initial_mail.json b/mails/templates/mail_templates/partners_initial_mail.json index efb95bbc8882bb10b321d44ed84cb72bcede49a0..e2a4c15705f549d843406715290456ef0ab61545 100644 --- a/mails/templates/mail_templates/partners_initial_mail.json +++ b/mails/templates/mail_templates/partners_initial_mail.json @@ -1,6 +1,7 @@ { "subject": "SciPost: Supporting Partners Board", "to_address": "email", + "bcc_to": "partners@scipost.org", "from_address_name": "SciPost Supporting Partners", "from_address": "partners@scipost.org", "context_object": "contact" diff --git a/partners/constants.py b/partners/constants.py index a00f453a7dafe9df8dd6283377d5fffd55909b98..6aeb94d3c9aabf5a3af07b190c2838f74c9e7e09 100644 --- a/partners/constants.py +++ b/partners/constants.py @@ -20,6 +20,7 @@ PARTNER_KINDS = ( PROSPECTIVE_PARTNER_REQUESTED = 'requested' PROSPECTIVE_PARTNER_ADDED = 'added' PROSPECTIVE_PARTNER_APPROACHED = 'approached' +PROSPECTIVE_PARTNER_FOLLOWED_UP = 'followuped' PROSPECTIVE_PARTNER_NEGOTIATING = 'negotiating' PROSPECTIVE_PARTNER_UNINTERESTED = 'uninterested' PROSPECTIVE_PARTNER_PROCESSED = 'processed' @@ -27,6 +28,7 @@ PROSPECTIVE_PARTNER_STATUS = ( (PROSPECTIVE_PARTNER_REQUESTED, 'Requested (from online form)'), (PROSPECTIVE_PARTNER_ADDED, 'Added internally'), (PROSPECTIVE_PARTNER_APPROACHED, 'Approached'), + (PROSPECTIVE_PARTNER_FOLLOWED_UP, 'Followed-up'), (PROSPECTIVE_PARTNER_NEGOTIATING, 'Negotiating'), (PROSPECTIVE_PARTNER_UNINTERESTED, 'Uninterested'), (PROSPECTIVE_PARTNER_PROCESSED, 'Processed into Partner'), diff --git a/partners/migrations/0038_auto_20171012_0948.py b/partners/migrations/0038_auto_20171012_0948.py new file mode 100644 index 0000000000000000000000000000000000000000..ca52c993eb6f79d641373ffb129869355338f95a --- /dev/null +++ b/partners/migrations/0038_auto_20171012_0948.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.4 on 2017-10-12 07:48 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('partners', '0037_merge_20171009_2000'), + ] + + operations = [ + migrations.AlterField( + model_name='prospectivepartner', + name='status', + field=models.CharField(choices=[('requested', 'Requested (from online form)'), ('added', 'Added internally'), ('approached', 'Approached'), ('followuped', 'Followed-up'), ('negotiating', 'Negotiating'), ('uninterested', 'Uninterested'), ('processed', 'Processed into Partner')], default='added', max_length=32), + ), + ] diff --git a/partners/views.py b/partners/views.py index 0acab83ef34b1bc6fcc097ad37f0c589cb0e87f9..97b865b06cc142b8ca7934af9a6ff5c2eb132bf4 100644 --- a/partners/views.py +++ b/partners/views.py @@ -4,7 +4,7 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required from django.db import transaction from django.forms import modelformset_factory -from django.http import FileResponse, HttpResponse +from django.http import HttpResponse from django.shortcuts import get_object_or_404, render, reverse, redirect from django.utils import timezone @@ -14,7 +14,8 @@ from mails.views import MailEditingSubView from .constants import PROSPECTIVE_PARTNER_REQUESTED,\ PROSPECTIVE_PARTNER_APPROACHED, PROSPECTIVE_PARTNER_ADDED,\ - PROSPECTIVE_PARTNER_EVENT_REQUESTED, PROSPECTIVE_PARTNER_EVENT_EMAIL_SENT + PROSPECTIVE_PARTNER_EVENT_REQUESTED, PROSPECTIVE_PARTNER_EVENT_EMAIL_SENT,\ + PROSPECTIVE_PARTNER_FOLLOWED_UP from .models import Partner, ProspectivePartner, ProspectiveContact, ContactRequest,\ ProspectivePartnerEvent, MembershipAgreement, Contact, Institution,\ PartnersAttachment @@ -25,7 +26,6 @@ from .forms import ProspectivePartnerForm, ProspectiveContactForm,\ NewContactForm, InstitutionForm, ActivationForm, PartnerEventForm,\ MembershipAgreementForm, RequestContactForm, RequestContactFormSet,\ ProcessRequestContactForm, PartnersAttachmentFormSet, PartnersAttachmentForm -from .utils import PartnerUtils def supporting_partners(request): @@ -265,13 +265,17 @@ def add_prospartner_contact(request, prospartner_id): def email_prospartner_contact(request, contact_id, mail=None): contact = get_object_or_404(ProspectiveContact, pk=contact_id) + suffix = '' if mail == 'followup': code = 'partners_followup_mail' + suffix = ' (followup)' + new_status = PROSPECTIVE_PARTNER_FOLLOWED_UP else: code = 'partners_initial_mail' + new_status = PROSPECTIVE_PARTNER_APPROACHED mail_request = MailEditingSubView(request, mail_code=code, contact=contact) if mail_request.is_valid(): - comments = 'Email sent to %s.' % str(contact) + comments = 'Email{suffix} sent to {name}.'.format(suffix=suffix, name=contact) prospartnerevent = ProspectivePartnerEvent( prospartner=contact.prospartner, event=PROSPECTIVE_PARTNER_EVENT_EMAIL_SENT, @@ -280,8 +284,9 @@ def email_prospartner_contact(request, contact_id, mail=None): noted_by=request.user.contributor) prospartnerevent.save() if contact.prospartner.status in [PROSPECTIVE_PARTNER_REQUESTED, - PROSPECTIVE_PARTNER_ADDED]: - contact.prospartner.status = PROSPECTIVE_PARTNER_APPROACHED + PROSPECTIVE_PARTNER_ADDED, + PROSPECTIVE_PARTNER_APPROACHED]: + contact.prospartner.status = new_status contact.prospartner.save() messages.success(request, 'Email successfully sent.') @@ -296,13 +301,18 @@ def email_prospartner_contact(request, contact_id, mail=None): def email_prospartner_generic(request, prospartner_id, mail=None): prospartner = get_object_or_404(ProspectivePartner, pk=prospartner_id) + suffix = '' if mail == 'followup': code = 'partners_followup_mail' + suffix = ' (followup)' + new_status = PROSPECTIVE_PARTNER_FOLLOWED_UP else: code = 'partners_initial_mail' + new_status = PROSPECTIVE_PARTNER_APPROACHED mail_request = MailEditingSubView(request, mail_code=code) if mail_request.is_valid(): - comments = 'Email sent to %s.' % str(mail_request.recipients_string) + comments = 'Email{suffix} sent to {name}.'.format(suffix=suffix, + name=mail_request.recipients_string) prospartnerevent = ProspectivePartnerEvent( prospartner=prospartner, event=PROSPECTIVE_PARTNER_EVENT_EMAIL_SENT, @@ -311,8 +321,9 @@ def email_prospartner_generic(request, prospartner_id, mail=None): noted_by=request.user.contributor) prospartnerevent.save() if prospartner.status in [PROSPECTIVE_PARTNER_REQUESTED, - PROSPECTIVE_PARTNER_ADDED]: - prospartner.status = PROSPECTIVE_PARTNER_APPROACHED + PROSPECTIVE_PARTNER_ADDED, + PROSPECTIVE_PARTNER_APPROACHED]: + prospartner.status = new_status prospartner.save() messages.success(request, 'Email successfully sent.')