SciPost Code Repository

Skip to content
Snippets Groups Projects
forms.py 7.41 KiB
Newer Older
__copyright__ = "Copyright 2016-2018, Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


Jorran de Wit's avatar
Jorran de Wit committed
import datetime

from django import forms

Jorran de Wit's avatar
Jorran de Wit committed
from proceedings.models import Proceedings
Jorran de Wit's avatar
Jorran de Wit committed
from submissions.models import Submission
from scipost.models import Contributor

from .models import Fellowship, ProspectiveFellow, ProspectiveFellowEvent
Jorran de Wit's avatar
Jorran de Wit committed


class AddFellowshipForm(forms.ModelForm):
    class Meta:
        model = Fellowship
        fields = (
            'guest',
            'contributor',
            'start_date',
            'until_date',
        )

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
Jorran de Wit's avatar
Jorran de Wit committed
        self.fields['contributor'].queryset = Contributor.objects.active()
Jorran de Wit's avatar
Jorran de Wit committed
        self.fields['contributor'].label = "Fellow"

    def clean(self):
        start = self.cleaned_data.get('start_date')
        until = self.cleaned_data.get('until_date')
        if start and until:
            if until <= start:
                self.add_error('until_date', 'The given dates are not in chronological order.')


class FellowshipForm(forms.ModelForm):
    class Meta:
        model = Fellowship
        fields = (
            'guest',
            'start_date',
            'until_date',
        )

    def clean(self):
        start = self.cleaned_data.get('start_date')
        until = self.cleaned_data.get('until_date')
        if start and until:
            if until <= start:
                self.add_error('until_date', 'The given dates are not in chronological order.')


class FellowshipTerminateForm(forms.ModelForm):
    class Meta:
        model = Fellowship
        fields = []

    def save(self):
        today = datetime.date.today()
        fellowship = self.instance
        if fellowship.until_date > today:
            fellowship.until_date = today
        return fellowship.save()


class FellowshipRemoveSubmissionForm(forms.ModelForm):
    """
    Use this form in admin-accessible views only! It could possibly reveal the
    identity of the Editor-in-charge!
    """
    class Meta:
        model = Fellowship
        fields = []

    def __init__(self, *args, **kwargs):
        self.submission = kwargs.pop('submission')
        super().__init__(*args, **kwargs)

    def clean(self):
        if self.submission.editor_in_charge == self.instance.contributor:
            self.add_error(None, ('Submission cannot be removed as the Fellow is'
                                  ' Editor-in-charge of this Submission.'))

    def save(self):
        fellowship = self.instance
        fellowship.pool.remove(self.submission)
        return fellowship


class FellowVotingRemoveSubmissionForm(forms.ModelForm):
    """
    Use this form in admin-accessible views only! It could possibly reveal the
    identity of the Editor-in-charge!
    """
    class Meta:
        model = Fellowship
        fields = []

    def __init__(self, *args, **kwargs):
        self.submission = kwargs.pop('submission')
        super().__init__(*args, **kwargs)

    def clean(self):
        if self.submission.editor_in_charge == self.instance.contributor:
            self.add_error(None, ('Submission cannot be removed as the Fellow is'
                                  ' Editor-in-charge of this Submission.'))

    def save(self):
        fellowship = self.instance
        fellowship.voting_pool.remove(self.submission)
        return fellowship


Jorran de Wit's avatar
Jorran de Wit committed
class FellowshipAddSubmissionForm(forms.ModelForm):
    submission = forms.ModelChoiceField(queryset=None, to_field_name='arxiv_identifier_w_vn_nr',
Jorran de Wit's avatar
Jorran de Wit committed
                                        empty_label="Please choose the Submission to add to the pool")
Jorran de Wit's avatar
Jorran de Wit committed

    class Meta:
        model = Fellowship
        fields = []

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        pool = self.instance.pool.values_list('id', flat=True)
        self.fields['submission'].queryset = Submission.objects.exclude(id__in=pool)

    def save(self):
        submission = self.cleaned_data['submission']
        fellowship = self.instance
        fellowship.pool.add(submission)
        return fellowship
Jorran de Wit's avatar
Jorran de Wit committed


class SubmissionAddFellowshipForm(forms.ModelForm):
    fellowship = forms.ModelChoiceField(queryset=None, to_field_name='id',
                                        empty_label="Please choose the Fellow to add to the Pool")

    class Meta:
        model = Submission
        fields = []

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        pool = self.instance.fellows.values_list('id', flat=True)
        self.fields['fellowship'].queryset = Fellowship.objects.active().exclude(id__in=pool)

    def save(self):
        fellowship = self.cleaned_data['fellowship']
        submission = self.instance
        submission.fellows.add(fellowship)
        return submission
Jorran de Wit's avatar
Jorran de Wit committed


class SubmissionAddVotingFellowForm(forms.ModelForm):
    fellowship = forms.ModelChoiceField(
        queryset=None, to_field_name='id',
        empty_label="Please choose the Fellow to add to the Submission's Voting Fellows")

    class Meta:
        model = Submission
        fields = []

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        pool = self.instance.voting_fellows.values_list('id', flat=True)
        self.fields['fellowship'].queryset = Fellowship.objects.active().exclude(id__in=pool)

    def save(self):
        fellowship = self.cleaned_data['fellowship']
        submission = self.instance
        submission.fellows.add(fellowship)
        submission.voting_fellows.add(fellowship)
        return submission


Jorran de Wit's avatar
Jorran de Wit committed
class FellowshipRemoveProceedingsForm(forms.ModelForm):
    """
    Use this form in admin-accessible views only! It could possibly reveal the
    identity of the Editor-in-charge!
    """
    class Meta:
        model = Fellowship
        fields = []

    def __init__(self, *args, **kwargs):
        self.proceedings = kwargs.pop('proceedings')
        super().__init__(*args, **kwargs)

    def clean(self):
        if self.proceedings.lead_fellow == self.instance:
            self.add_error(None, 'Fellowship cannot be removed as it is assigned as lead fellow.')

    def save(self):
        fellowship = self.instance
        self.proceedings.fellowships.remove(fellowship)
        return fellowship


class FellowshipAddProceedingsForm(forms.ModelForm):
    proceedings = forms.ModelChoiceField(queryset=None, to_field_name='id',
                                         empty_label="Please choose the Proceedings to add to the Pool")

    class Meta:
        model = Fellowship
        fields = []

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        proceedings = self.instance.proceedings.values_list('id', flat=True)
        self.fields['proceedings'].queryset = Proceedings.objects.exclude(id__in=proceedings)

    def save(self):
        proceedings = self.cleaned_data['proceedings']
        fellowship = self.instance
        proceedings.fellowships.add(fellowship)
        return fellowship
class ProspectiveFellowForm(forms.ModelForm):

    class Meta:
        model = ProspectiveFellow
        fields = ['title', 'first_name', 'last_name', 'email',
                  'discipline', 'expertises', 'webpage', 'status', 'contributor']
class ProspectiveFellowStatusForm(forms.ModelForm):

    class Meta:
        model = ProspectiveFellow
        fields = ['status']


class ProspectiveFellowEventForm(forms.ModelForm):

    class Meta:
        model = ProspectiveFellowEvent
        fields = ['event', 'comments']