SciPost Code Repository

Skip to content
Snippets Groups Projects
Commit 7544cb2b authored by Jorran de Wit's avatar Jorran de Wit
Browse files

Merge branch 'master' into development

parents da2787bb 9e8e90fc
No related branches found
No related tags found
No related merge requests found
......@@ -17,14 +17,6 @@ class AcceptRequestMixin:
super().__init__(*args, **kwargs)
class RegistrationInvitationFilterForm(forms.Form):
last_name = forms.CharField()
def search(self, qs):
last_name = self.cleaned_data.get('last_name')
return qs.filter(last_name__icontains=last_name)
class SuggestionSearchForm(forms.Form):
last_name = forms.CharField()
......
# -*- coding: utf-8 -*-
# Generated by Django 1.11.4 on 2018-02-20 10:39
from __future__ import unicode_literals
import datetime
import hashlib
import random
import string
from django.utils import timezone
from django.db import migrations
# Hack
......@@ -9,7 +14,7 @@ from django.contrib.auth import get_user_model
def transfer_old_invitations_to_new_tables(apps, schema_editor):
OldDraftInvitation = apps.get_model('scipost', 'RegistrationInvitation')
OldDraftInvitation = apps.get_model('scipost', 'DraftInvitation')
OldRegistrationInvitation = apps.get_model('scipost', 'RegistrationInvitation')
OldCitationNotification = apps.get_model('scipost', 'CitationNotification')
NewRegistrationInvitation = apps.get_model('invitations', 'RegistrationInvitation')
......@@ -59,7 +64,7 @@ def transfer_old_invitations_to_new_tables(apps, schema_editor):
created=new_inv.created,
modified=new_inv.modified,
submission_id=invitation.cited_in_submission.id,
date_sent=invitation.date_sent_first,
date_sent=invitation.date_last_reminded,
processed=(new_inv.status in ['declined', 'register', 'sent']),
)
if invitation.cited_in_publication:
......@@ -69,12 +74,12 @@ def transfer_old_invitations_to_new_tables(apps, schema_editor):
created=new_inv.created,
modified=new_inv.modified,
publication_id=invitation.cited_in_publication.id,
date_sent=invitation.date_sent_first,
date_sent=invitation.date_last_reminded,
processed=(new_inv.status in ['declined', 'register', 'sent']),
)
# Draft Invitations
for invitation in OldDraftInvitation.objects.processed(processed=False):
for invitation in OldDraftInvitation.objects.filter(processed=False):
new_inv = NewRegistrationInvitation(
title=invitation.title,
first_name=invitation.first_name,
......@@ -92,6 +97,15 @@ def transfer_old_invitations_to_new_tables(apps, schema_editor):
)
if new_inv.invitation_type in ['ci', 'cp']:
new_inv.invitation_type = 'C'
# Generate keys, custom methods are not loaded here
salt = ''
for i in range(5):
salt += random.choice(string.ascii_letters)
salt = salt.encode('utf8')
invitationsalt = new_inv.last_name.encode('utf8')
new_inv.invitation_key = hashlib.sha1(salt + invitationsalt).hexdigest()
new_inv.key_expires = timezone.now() + datetime.timedelta(days=365)
new_inv.save()
if invitation.cited_in_submission:
......
......@@ -24,6 +24,11 @@
<li><a href="{% url 'invitations:cleanup' %}">Perform a cleanup</a></li>
<li><a href="{% url 'invitations:citation_notification_list' %}">List unprocessed Citation Notifications</a></li>
{% endif %}
{% if perms.scipost.can_invite_fellows %}
<li><a href="{% url 'invitations:list_fellows' %}">List Fellow Invitations</a></li>
{% endif %}
<li><a href="{% url 'invitations:list_sent' %}">Show all Invitations pending response</a></li>
</ul>
</div>
<div class="col-md-6 text-md-right">
......@@ -42,13 +47,11 @@
<div class="col-12">
<h2 class="highlight">Registration Invitations</h2>
</div>
<div class="col-md-6">
<form method="get">
{{ search_form|bootstrap }}
<input class="btn btn-primary" type="submit" value="Filter">
<a href="{% url 'invitations:list' %}" class="btn btn-link">Reset filter</a>
</form>
</div>
{% if is_paginated %}
<div class="col-12">
{% include 'partials/pagination.html' with page_obj=page_obj %}
</div>
{% endif %}
<div class="col-12">
<br>
{% include 'partials/invitations/registrationinvitation_table.html' with invitations=object_list %}
......@@ -56,6 +59,11 @@
<a href="{% url 'invitations:list' %}" class="btn btn-link">Reset filter</a>
{% endif %}
</div>
{% if is_paginated %}
<div class="col-12">
{% include 'partials/pagination.html' with page_obj=page_obj %}
</div>
{% endif %}
</div>
{% endblock %}
{% extends 'scipost/_personal_page_base.html' %}
{% load bootstrap %}
{% block pagetitle %}: Registration Invitations{% endblock pagetitle %}
{% block breadcrumb_items %}
{{block.super}}
<a href="{% url 'invitations:list' %}" class="breadcrumb-item">Registration Invitations</a>
<span class="breadcrumb-item">Fellows</span>
{% endblock %}
{% block content %}
<h1 class="highlight">Registration Invitations Fellows</h1>
<div class="row">
{% if is_paginated %}
<div class="col-12">
{% include 'partials/pagination.html' with page_obj=page_obj %}
</div>
{% endif %}
<div class="col-12">
<br>
{% include 'partials/invitations/registrationinvitation_table.html' with invitations=object_list %}
{% if search_form.is_bound %}
<a href="{% url 'invitations:list_sent' %}" class="btn btn-link">Reset filter</a>
{% endif %}
</div>
{% if is_paginated %}
<div class="col-12">
{% include 'partials/pagination.html' with page_obj=page_obj %}
</div>
{% endif %}
</div>
{% endblock %}
{% extends 'scipost/_personal_page_base.html' %}
{% load bootstrap %}
{% block pagetitle %}: Registration Invitations{% endblock pagetitle %}
{% block breadcrumb_items %}
{{block.super}}
<a href="{% url 'invitations:list' %}" class="breadcrumb-item">Registration Invitations</a>
<span class="breadcrumb-item">Sent</span>
{% endblock %}
{% block content %}
<h1 class="highlight">Sent Registration Invitations</h1>
<div class="row">
{% if is_paginated %}
<div class="col-12">
{% include 'partials/pagination.html' with page_obj=page_obj %}
</div>
{% endif %}
<div class="col-12">
<br>
{% include 'partials/invitations/registrationinvitation_table.html' with invitations=object_list %}
{% if search_form.is_bound %}
<a href="{% url 'invitations:list_sent' %}" class="btn btn-link">Reset filter</a>
{% endif %}
</div>
{% if is_paginated %}
<div class="col-12">
{% include 'partials/pagination.html' with page_obj=page_obj %}
</div>
{% endif %}
</div>
{% endblock %}
......@@ -4,6 +4,8 @@ from . import views
urlpatterns = [
url(r'^$', views.RegistrationInvitationsView.as_view(), name='list'),
url(r'^sent$', views.RegistrationInvitationsSentView.as_view(), name='list_sent'),
url(r'^fellows$', views.RegistrationInvitationsFellowView.as_view(), name='list_fellows'),
url(r'^new$', views.create_registration_invitation_or_citation, name='new'),
url(r'^(?P<pk>[0-9]+)$', views.RegistrationInvitationsUpdateView.as_view(), name='update'),
url(r'^(?P<pk>[0-9]+)/add_citation$', views.RegistrationInvitationsAddCitationView.as_view(),
......
......@@ -8,36 +8,38 @@ from django.views.generic.edit import UpdateView, DeleteView
from .forms import RegistrationInvitationForm, RegistrationInvitationReminderForm,\
RegistrationInvitationMarkForm, RegistrationInvitationMapToContributorForm,\
CitationNotificationForm, SuggestionSearchForm, RegistrationInvitationFilterForm,\
CitationNotificationForm, SuggestionSearchForm,\
CitationNotificationProcessForm, RegistrationInvitationAddCitationForm
from .mixins import RequestArgumentMixin, PermissionsMixin, SaveAndSendFormMixin, SendMailFormMixin
from .models import RegistrationInvitation, CitationNotification
from scipost.models import Contributor
from scipost.mixins import PaginationMixin
from mails.mixins import MailEditorMixin
class RegistrationInvitationsView(PermissionsMixin, ListView):
class RegistrationInvitationsView(PaginationMixin, PermissionsMixin, ListView):
permission_required = 'scipost.can_create_registration_invitations'
queryset = RegistrationInvitation.objects.no_response()
queryset = RegistrationInvitation.objects.drafts().not_for_fellows()
paginate_by = 10
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['count_in_draft'] = RegistrationInvitation.objects.drafts().count()
context['count_pending'] = RegistrationInvitation.objects.sent().count()
search_form = RegistrationInvitationFilterForm(self.request.GET or None)
if search_form.is_valid():
context['object_list'] = search_form.search(context['object_list'])
context['object_list'] = context['object_list'].order_by(
'status', 'date_sent_last', 'last_name')
context['search_form'] = search_form
return context
def get_queryset(self, *args, **kwargs):
qs = super().get_queryset(*args, **kwargs)
if not self.request.user.has_perm('scipost.can_invite_fellows'):
qs = qs.not_for_fellows()
return qs
class RegistrationInvitationsSentView(RegistrationInvitationsView):
permission_required = 'scipost.can_create_registration_invitations'
queryset = RegistrationInvitation.objects.sent().not_for_fellows()
template_name = 'invitations/registrationinvitation_list_sent.html'
class RegistrationInvitationsFellowView(RegistrationInvitationsView):
permission_required = 'scipost.can_invite_fellows'
queryset = RegistrationInvitation.objects.for_fellows()
template_name = 'invitations/registrationinvitation_list_fellows.html'
class CitationNotificationsView(PermissionsMixin, ListView):
......
from .paginator import SciPostPaginator
class PaginationMixin(object):
class PaginationMixin:
"""
Mixin for generic class-based views (e.g. django.views.generic.ListView)
"""
......
......@@ -38,7 +38,8 @@ def is_in_group(user, group_name):
@register.filter(name='associated_contributors')
def associated_contributors(draft):
return Contributor.objects.filter(user__last_name__icontains=draft.last_name)
return Contributor.objects.filter(
user__last_name__icontains=draft.last_name).order_by('user__last_name')
def is_modulo(counter, total, modulo):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment