Source code for preprints.helpers

__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
__license__ = "AGPL v3"


from django.db.models import Max
from django.utils import timezone

from submissions.models import Submission

from .models import Preprint


[docs]def get_new_scipost_identifier(thread_hash=None): """ Return an identifier for a new SciPost preprint (consistent with thread history). A SciPost identifier is of the form [YYYY][MM]_[#####]v[vn_nr]. For an existing thread, different cases must be treated: * All preprints in thread are SciPost preprints: the vn_nr is incremented. * Previous preprints are all on an external preprint server: a brand new SciPost identifier is generated; the vn_nr is put to 1. * Previous preprints mix SciPost and external identifiers: the SciPost identifier is reused, putting the vn_nr to [nr of previous SciPost subs in thread] + 1. """ now = timezone.now() scipost_submissions_in_thread = Submission.objects.filter( thread_hash=thread_hash, preprint__identifier_w_vn_nr__startswith="scipost" ) # At least one previous submission on SciPost's preprint server if len(scipost_submissions_in_thread) > 0: identifier = "{}v{}".format( scipost_submissions_in_thread.first().preprint.identifier_w_vn_nr.rpartition( "v" )[ 0 ], str(len(scipost_submissions_in_thread) + 1), ) return identifier # No previous Submission, or no previous SciPost preprint in thread; new identifier current_identifier_prefix = "scipost_%s%s" % ( now.year, str(now.month).rjust(2, "0"), ) try: next_identifier_nr = ( int( Preprint.objects.filter( identifier_w_vn_nr__startswith=current_identifier_prefix ) .first() .identifier_w_vn_nr.rpartition("v")[0] .rpartition("_")[2] ) + 1 ) except AttributeError: next_identifier_nr = 1 identifier = "scipost_{year}{month}_{identifier}v1".format( year=now.year, month=str(now.month).rjust(2, "0"), identifier=str(next_identifier_nr).rjust(5, "0"), ) return identifier