SciPost Code Repository

Skip to content
Snippets Groups Projects
tasks.py 2.52 KiB
Newer Older
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
Jorran de Wit's avatar
Jorran de Wit committed
__license__ = "AGPL v3"

Jorran de Wit's avatar
Jorran de Wit committed
from datetime import timedelta
from django.utils import timezone

Jorran de Wit's avatar
Jorran de Wit committed
from SciPost_v1.celery import app
Jorran de Wit's avatar
Jorran de Wit committed
from .models import Submission, EditorialAssignment, RefereeInvitation, Report
from .signals import (
    notify_invitation_approaching_deadline, notify_invitation_overdue, notify_unfinished_report)
Jorran de Wit's avatar
Jorran de Wit committed


@app.task(bind=True)
def send_editorial_assignment_invitations(self):
Jean-Sébastien Caux's avatar
Jean-Sébastien Caux committed
    """Send invitation email to 'next EditorialAssignment' in queue."""
    qs = Submission.objects.unassigned().has_editor_invitations_to_be_sent().distinct()
    submission_ids = qs.values_list('id', flat=True)
    submissions_count = len(submission_ids)

    count = 0
    for submission_id in submission_ids:
        self.update_state(
            state="PROGRESS", meta={
                'progress': round(100 * count / submissions_count),
                'total_count': submissions_count,
            })

        # Get EditorialAssignment to send or nothing.
        ed_assignment = EditorialAssignment.objects.next_invitation_to_be_sent(submission_id)
        if ed_assignment:
            if ed_assignment.send_invitation():
                count += 1
    return {'new_invites': count}
Jorran de Wit's avatar
Jorran de Wit committed


@app.task(bind=True)
def remind_referees_to_fulfill_to_invitation(self):
    """Remind Referees with unfilfilled RefereeInvitations to submit a Report."""
    for invitation in RefereeInvitation.objects.approaching_deadline():
        notify_invitation_approaching_deadline(RefereeInvitation, invitation, False)
    for invitation in RefereeInvitation.objects.overdue():
        notify_invitation_overdue(RefereeInvitation, invitation, False)


@app.task(bind=True)
def remind_referees_to_submit_report(self):
    """Remind Referees with unfinished Report finish their Report."""
    compare_dt = timezone.now() - timedelta(days=2)

    for report in Report.objects.in_draft().filter(modified__lt=compare_dt):
        notify_unfinished_report(Report, report, False)


@app.task(bind=True)
def submit_submission_document_for_plagiarism(self):
    """Upload a new Submission document to iThenticate."""
    submissions_to_upload = Submission.objects.plagiarism_report_to_be_uploaded()
    submission_to_update = Submission.objects.plagiarism_report_to_be_updated()

    for submission in submissions_to_upload:
        report, __ = iThenticate.objects.get_or_create(to_submission=submission)
        # do it...

    for submission in submission_to_update:
        report = submission.plagiarism_report
        # do it...