diff --git a/partners/forms.py b/partners/forms.py index b9d472fe0719f1ec839ff4b260db96151718185f..fd433f3def4a98afb0c216157585938353b16c85 100644 --- a/partners/forms.py +++ b/partners/forms.py @@ -481,6 +481,10 @@ class EmailProspectivePartnerContactForm(forms.Form): {'placeholder': 'Write your message in this box (optional).'}) +class EmailProspectivePartnerGenericForm(EmailProspectivePartnerContactForm): + email = forms.EmailField(label='Generic address for emailing') + + class ProspectivePartnerEventForm(forms.ModelForm): class Meta: model = ProspectivePartnerEvent diff --git a/partners/templates/partners/_prospective_partner_card.html b/partners/templates/partners/_prospective_partner_card.html index b2f74e7a4f43ebf482d38708729935ed36e987b7..5b9ad8805860fc5384f17034504efdc6cc0a44dd 100644 --- a/partners/templates/partners/_prospective_partner_card.html +++ b/partners/templates/partners/_prospective_partner_card.html @@ -15,6 +15,7 @@ <p>{{ pp.get_status_display }}</p> </div> <div class="col-md-7"> + <a href="{% url 'partners:email_prospartner_generic' prospartner_id=pp.id %}">Compose email to a generic address</a> <h3>Contacts:</h3> <a class="d-inline-block mb-2" href="{% url 'partners:add_prospartner_contact' prospartner_id=pp.id %}">Add a contact</a> <table class="table"> diff --git a/partners/templates/partners/email_prospartner_generic.html b/partners/templates/partners/email_prospartner_generic.html new file mode 100644 index 0000000000000000000000000000000000000000..6732aa816ef9eb0ffc243267a11102538add437f --- /dev/null +++ b/partners/templates/partners/email_prospartner_generic.html @@ -0,0 +1,29 @@ +{% extends 'scipost/base.html' %} + +{% block pagetitle %}: Supporting Partners: email contact{% endblock pagetitle %} + +{% load bootstrap %} + +{% block content %} + +<div class="row"> + <div class="col-12"> + <h1 class="highlight">Email a Prospective Partner Generic Address</h1> + </div> +</div> + +<div class="row"> + <div class="col-12"> + <form action="{% url 'partners:email_prospartner_generic' prospartner_id=prospartner.id %}" method="post"> + {% csrf_token %} + {{ form|bootstrap }} + <input class="btn btn-primary" type="submit" value="Submit"/> + </form> + + {% if errormessage %} + <p class="text-danger">{{ errormessage }}</p> + {% endif %} + </div> +</div> + +{% endblock content %} diff --git a/partners/urls.py b/partners/urls.py index 19075e492e19628b38c95557a93ffa2fa8501cef..f7149593c311fb36930813d9764d0a3a38986cab 100644 --- a/partners/urls.py +++ b/partners/urls.py @@ -8,16 +8,20 @@ urlpatterns = [ url(r'^membership_request$', views.membership_request, name='membership_request'), url(r'^process_contact_requests$', views.process_contact_requests, name='process_contact_requests'), - # Prospects url(r'^prospects/add$', views.add_prospective_partner, name='add_prospective_partner'), url(r'^prospects/contacts/(?P<contact_id>[0-9]+)/email$', views.email_prospartner_contact, name='email_prospartner_contact'), + url(r'^prospects/(?P<prospartner_id>[0-9]+)/contacts/add$', views.add_prospartner_contact, name='add_prospartner_contact'), url(r'^prospects/(?P<prospartner_id>[0-9]+)/promote$', views.promote_prospartner, name='promote_prospartner'), + url(r'^prospects/(?P<prospartner_id>[0-9]+)/events/add$', + views.add_prospartner_contact, name='add_prospartner_contact'), + url(r'^prospects/(?P<prospartner_id>[0-9]+)/email_generic', + views.email_prospartner_generic, name='email_prospartner_generic'), url(r'^prospects/(?P<prospartner_id>[0-9]+)/events/add$', views.add_prospartner_event, name='add_prospartner_event'), diff --git a/partners/utils.py b/partners/utils.py index fc40882c002bf695b7e219a08a302faf44e966f0..aade17e1d2c1dbfdd0aff7514143520f55946954 100644 --- a/partners/utils.py +++ b/partners/utils.py @@ -16,3 +16,13 @@ class PartnerUtils(BaseMailUtil): cls._send_mail(cls, 'email_prospartner_contact', [cls._context['contact'].email,], cls._context['email_subject']) + + @classmethod + def email_prospartner_generic(cls): + """ + Email a generic address for a ProspectivePartner + for which no Contact could be defined. + """ + cls._send_mail(cls, 'email_prospartner_contact', + [cls._context['email'],], + cls._context['email_subject']) diff --git a/partners/views.py b/partners/views.py index ed28b1c2e267af93a3170121db730b642cf77fef..3635512bf2df5cba59105fb6e961a6d64fb6da9e 100644 --- a/partners/views.py +++ b/partners/views.py @@ -20,8 +20,8 @@ from .forms import ProspectivePartnerForm, ProspectiveContactForm,\ PromoteToContactFormset, PartnerForm, ContactForm, ContactFormset,\ NewContactForm, InstitutionForm, ActivationForm, PartnerEventForm,\ MembershipAgreementForm, RequestContactForm, RequestContactFormSet,\ - ProcessRequestContactForm, PartnersAttachmentFormSet, PartnersAttachmentForm - + ProcessRequestContactForm, PartnersAttachmentFormSet, PartnersAttachmentForm,\ + EmailProspectivePartnerGenericForm from .utils import PartnerUtils @@ -287,6 +287,37 @@ def email_prospartner_contact(request, contact_id): return render(request, 'partners/email_prospartner_contact.html', context) +@permission_required('scipost.can_email_prospartner_contact', return_403=True) +@transaction.atomic +def email_prospartner_generic(request, prospartner_id): + prospartner = get_object_or_404(ProspectivePartner, pk=prospartner_id) + form = EmailProspectivePartnerGenericForm(request.POST or None) + if form.is_valid(): + comments = 'Email sent to %s.' % form.cleaned_data['email'] + prospartnerevent = ProspectivePartnerEvent( + prospartner=prospartner, + event=PROSPECTIVE_PARTNER_EVENT_EMAIL_SENT, + comments=comments, + noted_on=timezone.now(), + noted_by=request.user.contributor) + prospartnerevent.save() + if prospartner.status in [PROSPECTIVE_PARTNER_REQUESTED, + PROSPECTIVE_PARTNER_ADDED]: + prospartner.status = PROSPECTIVE_PARTNER_APPROACHED + prospartner.save() + PartnerUtils.load({'institution_name': prospartner.institution_name, + 'email': form.cleaned_data['email'], + 'email_subject': form.cleaned_data['email_subject'], + 'message': form.cleaned_data['message'], + 'include_SPB_summary': form.cleaned_data['include_SPB_summary']}) + + PartnerUtils.email_prospartner_generic() + messages.success(request, 'Email successfully sent') + return redirect(reverse('partners:manage')) + context = {'prospartner': prospartner, 'form': form} + return render(request, 'partners/email_prospartner_generic.html', context) + + @permission_required('scipost.can_manage_SPB', return_403=True) @transaction.atomic def add_prospartner_event(request, prospartner_id): diff --git a/submissions/migrations/0047_submission_acceptance_date.py b/submissions/migrations/0047_submission_acceptance_date.py new file mode 100644 index 0000000000000000000000000000000000000000..ec64c3acddce25595b8b1ea7b84440e9849447a3 --- /dev/null +++ b/submissions/migrations/0047_submission_acceptance_date.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10.3 on 2017-06-26 19:38 +from __future__ import unicode_literals + +from django.db import migrations, models + + +def do_nothing(apps, schema_editor): + pass + + +def auto_fill_acceptance_dates(apps, schema_editor): + Publication = apps.get_model('journals', 'Publication') + for pub in Publication.objects.all(): + submission = pub.accepted_submission + submission.acceptance_date = pub.acceptance_date + submission.save() + print("Auto-filled Acceptance dates for accepted Submissions") + + +class Migration(migrations.Migration): + + dependencies = [ + ('submissions', '0046_auto_20170623_0806'), + ] + + operations = [ + migrations.AddField( + model_name='submission', + name='acceptance_date', + field=models.DateField(blank=True, null=True, verbose_name='acceptance date'), + ), + migrations.RunPython(auto_fill_acceptance_dates, do_nothing), + ] diff --git a/submissions/models.py b/submissions/models.py index 17a3643441ffd49857f4e637262444881de02fb2..6aa62b53228b673f215516a6866c70a54952983f 100644 --- a/submissions/models.py +++ b/submissions/models.py @@ -78,6 +78,7 @@ class Submission(ArxivCallable, models.Model): # Metadata metadata = JSONField(default={}, blank=True, null=True) submission_date = models.DateField(verbose_name='submission date', default=datetime.date.today) + acceptance_date = models.DateField(verbose_name='acceptance date', null=True, blank=True) latest_activity = models.DateTimeField(auto_now=True) objects = SubmissionManager() diff --git a/submissions/templates/submissions/_submission_summary_short.html b/submissions/templates/submissions/_submission_summary_short.html index ca045cbf8b37536f29828c769d0d9fec1d764a9e..bf6915e89f54fe758948d39f7ae3d7c438025498 100644 --- a/submissions/templates/submissions/_submission_summary_short.html +++ b/submissions/templates/submissions/_submission_summary_short.html @@ -24,6 +24,12 @@ <a href="{{submission.arxiv_link}}" target="_blank">{{submission.arxiv_link}}</a> </td> </tr> + {% if submission.acceptance_date %} + <tr> + <td>Date accepted:</td> + <td>{{submission.acceptance_date}}</td> + </tr> + {% endif %} <tr> <td>Date submitted:</td> <td>{{submission.submission_date}}</td> diff --git a/submissions/views.py b/submissions/views.py index 6d5cdc5d5b1675735229e201af66d49e6aafce2b..071e117d82edd6af8e77a5be41630169f6ffc9ef 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -1232,6 +1232,7 @@ def fix_College_decision(request, rec_id): if recommendation.recommendation in [1, 2, 3]: # Publish as Tier I, II or III recommendation.submission.status = 'accepted' + recommendation.submission.acceptance_date = datetime.date.today() # Create a ProductionStream object prodstream = ProductionStream(submission=recommendation.submission) prodstream.save() diff --git a/templates/email/email_prospartner_contact.html b/templates/email/email_prospartner_contact.html index 036f917131aab4855663b0c96378f2d31960d201..5f0455f8b1f0420e757364b23bc35ca5ac90a31c 100644 --- a/templates/email/email_prospartner_contact.html +++ b/templates/email/email_prospartner_contact.html @@ -1,7 +1,9 @@ +{% if contact %} Dear {{ contact.get_title_display }} {{ contact.last_name }}, \n\n - +{% else %} +Dear colleagues, \n\n +{% endif %} {% if message %}{{ message }}{% endif %} - {% if include_SPB_summary %} You might by now have heard of SciPost, a recently-launched initiative aiming to bring disruptive change to current academic publishing practices. \n\nIn summary, SciPost is a publication portal managed by professional scientists, offering (among others) high-quality Open Access journals with innovative forms of refereeing, and a means of commenting on all existing literature. SciPost is established as a not-for-profit foundation devoted to serving the interests of the international scientific community. @@ -19,9 +21,10 @@ You might by now have heard of SciPost, a recently-launched initiative aiming to \n\nOn behalf of the SciPost Foundation, \nProf. dr Jean-Sébastien Caux +\n\nJ.S.Caux@uva.nl \nhttp://jscaux.org \n--------------------------------------------- -\nInstitute for Theoretial Physics\nUniversity of Amsterdam +\nInstitute for Theoretical Physics\nUniversity of Amsterdam \nScience Park 904\n1098 XH Amsterdam\nThe Netherlands \n--------------------------------------------- \ntel.: +31 (0)20 5255775\nfax: +31 (0)20 5255778 diff --git a/templates/email/email_prospartner_contact_html.html b/templates/email/email_prospartner_contact_html.html index 728f959d58f70cd0e85801ad12c8d9a58ec84489..9a66c2f9d81a02102af05d04af138a7612df739d 100644 --- a/templates/email/email_prospartner_contact_html.html +++ b/templates/email/email_prospartner_contact_html.html @@ -1,12 +1,14 @@ {% load staticfiles %} +{% if contact %} <p>Dear {{ contact.get_title_display }} {{ contact.last_name }},</p> - +{% else %} +<p>Dear colleagues,</p> +{% endif %} {% if message %} <p> {{ message|linebreaks }} </p> {% endif %} - {% if include_SPB_summary %} <p> You might by now have heard of SciPost, a recently-launched initiative aiming to bring disruptive change to current academic publishing practices. @@ -34,9 +36,11 @@ I will be happy to provide any required further details. If you are interested, </p> <p>On behalf of the SciPost Foundation,</p> Prof. dr Jean-Sébastien Caux +<br/> +<br/><a href="mailto:J.S.Caux@uva.nl">J.S.Caux@uva.nl</a> <br/><a href="http://jscaux.org">jscaux.org</a> <br/>--------------------------------------------- -<br/>Institute for Theoretial Physics +<br/>Institute for Theoretical Physics <br/>University of Amsterdam <br/>Science Park 904 <br/>1098 XH Amsterdam