SciPost Code Repository

Skip to content
Snippets Groups Projects
forms.py 5.23 KiB
Newer Older
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


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

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['contributor'].queryset = Contributor.objects.fellows()
        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 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 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