From 228cef3eeec10980701078f6723effc78f7919c1 Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Mon, 19 Sep 2016 20:23:05 +0200
Subject: [PATCH] Mark invitation as responded if user registers directly
 (without using invitation key/link)

---
 scipost/forms.py |  5 +++++
 scipost/utils.py | 37 ++-----------------------------------
 scipost/views.py | 19 ++++++++++++++++---
 3 files changed, 23 insertions(+), 38 deletions(-)

diff --git a/scipost/forms.py b/scipost/forms.py
index 8631c56f8..0eb7cdc73 100644
--- a/scipost/forms.py
+++ b/scipost/forms.py
@@ -12,6 +12,8 @@ from crispy_forms.layout import Layout, Div, Field, Fieldset, HTML, Submit
 
 from .models import *
 
+from submissions.models import SUBMISSION_STATUS_PUBLICLY_UNLISTED
+from submissions.models import Submission
 
 
 REGISTRATION_REFUSAL_CHOICES = (
@@ -60,6 +62,9 @@ class RegistrationInvitationForm(forms.ModelForm):
         super(RegistrationInvitationForm, self).__init__(*args, **kwargs)
         self.fields['personal_message'].widget.attrs.update(
             {'placeholder': 'NOTE: a personal phrase or two. The bulk of the text will be auto-generated.'})
+        self.fields['cited_in_submission'] = forms.ModelChoiceField(
+            queryset=Submission.objects.all().exclude(
+                status__in=SUBMISSION_STATUS_PUBLICLY_UNLISTED).order_by('-submission_date'))
         self.helper = FormHelper()
         self.helper.layout = Layout(
             Div(
diff --git a/scipost/utils.py b/scipost/utils.py
index 06f1ddf1a..80c880591 100644
--- a/scipost/utils.py
+++ b/scipost/utils.py
@@ -12,39 +12,6 @@ from .models import *
 
 EMAIL_FOOTER = (
     '{% load staticfiles %}'
-    # '<ul style="background-color: #f0f0f0; color: #002B49; list-style-type: none; padding: 5px 5px;">'
-    # '<li style="display: inline; margin: 0px; padding: 0px;">'
-    # '<a href="https://scipost.org">'
-    # '<img src="{% static \'scipost/images/logo_scipost_with_bgd_small.png\' %}" width="64px" '
-    # 'style="margin: 0px; padding: 0px;"></a></li>'
-    # '<li style="display: inline; margin: 3px; padding: 3px;">'
-    # '<a href="https://scipost.org/journals/" style="padding: 3px;">Journals</a></li>'
-    # '<li style="display: inline; margin: 3px; padding: 3px;">'
-    # '<a href="https://scipost.org/submissions/" style="padding: 3px;">Submissions</a></li>'
-    # '<li style="display: inline; margin: 3px; padding: 3px;">'
-    # '<a href="https://scipost.org/commentaries/" style="padding: 3px;">Commentaries</a></li>'
-    # '<li style="display: inline; margin: 3px; padding: 3px;">'
-    # '<a href="https://scipost.org/theses/" style="padding: 3px;">Theses</a></li>'
-    # '<li style="display: inline; margin: 3px; padding: 3px;">'
-    # '<a href="https://scipost.org/login/" style="padding: 3px;">Login</a></li>'
-    # '</ul>'
-    # '<ul style="background-color: #f0f0f0; color: #002B49; list-style-type: none; '
-    # 'display: flex; align-items: center;">'
-    # '<li style="display: inline-block; margin: 0px; padding: 0px;">'
-    # '<a href="https://scipost.org">'
-    # '<img src="{% static \'scipost/images/logo_scipost_with_bgd_small.png\' %}" width="64px" '
-    # 'style="margin: 0px; padding: 0px;"></a></li>'
-    # '<li style="display: inline-block; padding: 8px;">'
-    # '<a href="https://scipost.org/journals/">Journals</a></li>'
-    # '<li style="display: inline-block; padding: 8px;">'
-    # '<a href="https://scipost.org/submissions/">Submissions</a></li>'
-    # '<li style="display: inline-block; padding: 8px;">'
-    # '<a href="https://scipost.org/commentaries/">Commentaries</a></li>'
-    # '<li style="display: inline-block; padding: 8px;">'
-    # '<a href="https://scipost.org/theses/">Theses</a></li>'
-    # '<li style="display: inline-block; padding: 8px;">'
-    # '<a href="https://scipost.org/login/">Login</a></li>'
-    # '</ul>'
     '<a href="https://scipost.org"><img src="{% static '
     '\'scipost/images/logo_scipost_with_bgd_small.png\' %}" width="64px"></a><br/>'
     '<div style="background-color: #f0f0f0; color: #002B49; align-items: center;">'
@@ -186,7 +153,7 @@ class Utils(object):
         invitationsalt = invitationsalt.encode('utf8')
         cls.invitation.invitation_key = hashlib.sha1(salt+invitationsalt).hexdigest()
         cls.invitation.key_expires = datetime.datetime.strftime(
-            datetime.datetime.now() + datetime.timedelta(days=14), "%Y-%m-%d %H:%M:%S")
+            datetime.datetime.now() + datetime.timedelta(days=365), "%Y-%m-%d %H:%M:%S")
         cls.invitation.save()
         email_text = ''
         if cls.invitation.invitation_type == 'F':
@@ -215,7 +182,7 @@ class Utils(object):
                         'contents, for example by offering submissions, reports and comments.'
                         '\n\nFor your convenience, I have prepared a partly pre-filled registration '
                         'form at https://scipost.org/invitation/' + cls.invitation.invitation_key 
-                        + ' (valid for two weeks; you can thereafter still register at '
+                        + ' (valid for up to a year; you can thereafter still register at '
                         'https://scipost.org/register).\n\n'
                         'If you do develop sympathy for the initiative, besides participating in the '
                         'online platform, I would be very grateful if you considered submitting a '
diff --git a/scipost/views.py b/scipost/views.py
index d3584954f..e07fd36a5 100644
--- a/scipost/views.py
+++ b/scipost/views.py
@@ -11,7 +11,7 @@ from django.contrib.auth.decorators import login_required
 #from django.contrib.auth.decorators import permission_required   # Superseded by guardian
 from django.contrib.auth.models import User, Group, Permission
 from django.contrib.auth.views import password_reset, password_reset_confirm
-from django.core.exceptions import PermissionDenied
+from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist, PermissionDenied
 from django.core import mail
 from django.core.mail import EmailMessage, EmailMultiAlternatives
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
@@ -222,7 +222,19 @@ def register(request):
                               {'form': form, 'errormessage': 'This email address is already in use'})
             Utils.create_and_save_contributor('')
             Utils.send_registration_email()
-            #return HttpResponseRedirect(reverse('scipost:thanks_for_registering'))
+            # If this email was associated to an invitation, mark it as responded to
+            try:
+                invitation = RegistrationInvitation.objects.get(
+                    email=form.cleaned_data['email'])
+                invitation.responded = True
+                invitation.save()
+            except ObjectDoesNotExist:
+                pass
+            except MultipleObjectsReturned:
+                # Delete the first invitation
+                invitation_to_delete = RegistrationInvitation.objects.filter(
+                    email=form.cleaned_data['email']).first()
+                invitation_to_delete.delete()
             context = {'ack_header': 'Thanks for registering to SciPost.',
                        'ack_message': ('You will receive an email with a link to verify '
                                        'your email address. Please visit this link within 48 hours. '
@@ -242,7 +254,8 @@ def invitation(request, key):
     """ Register, by invitation """
     invitation = get_object_or_404(RegistrationInvitation, invitation_key=key)
     if invitation.responded:
-        errormessage = 'This invitation token has already been used.'
+        errormessage = ('This invitation token has already been used, '
+                        'or this email address is already associated to a registration.')
     elif timezone.now() > invitation.key_expires:
         errormessage = 'The invitation key has expired.'
     elif request.method == 'POST':
-- 
GitLab