Source code for submissions.models.plagiarism

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


from django.db import models
from django.urls import reverse

from ..constants import PLAGIARISM_STATUSES, STATUS_WAITING

from scipost.behaviors import TimeStampedModel


[docs]class iThenticateReport(TimeStampedModel): """iThenticate plagiarism report for a Submission.""" uploaded_time = models.DateTimeField(null=True, blank=True) processed_time = models.DateTimeField(null=True, blank=True) doc_id = models.IntegerField(primary_key=True) part_id = models.IntegerField(null=True, blank=True) percent_match = models.IntegerField(null=True, blank=True) status = models.CharField( max_length=16, choices=PLAGIARISM_STATUSES, default=STATUS_WAITING ) class Meta: verbose_name = "iThenticate Report" verbose_name_plural = "iThenticate Reports" def __str__(self): """Summary of the iThenticateReport's meta information.""" _str = "Report {doc_id}".format(doc_id=self.doc_id) if hasattr(self, "to_submission"): _str += " on Submission {arxiv}".format( arxiv=self.to_submission.preprint.identifier_w_vn_nr ) return _str
[docs] def save(self, *args, **kwargs): """On save, touch the Submission's latest update timestamp.""" obj = super().save(*args, **kwargs) if hasattr(self, "to_submission") and kwargs.get("commit", True): self.to_submission.touch() return obj
[docs] def get_absolute_url(self): """Return the url of the Submission's plagiarism report detail page.""" if hasattr(self, "to_submission"): return reverse( "submissions:plagiarism", kwargs={ "identifier_w_vn_nr": self.to_submission.preprint.identifier_w_vn_nr }, ) return ""
[docs] def get_report_url(self): """Request and return new read-only url from the iThenticate API. Note: The read-only link is valid for only 15 minutes, saving may be worthless. """ if not self.part_id: return "" from ..plagiarism import iThenticate plagiarism = iThenticate() return plagiarism.get_url(self.part_id)
@property def score(self): """Return the iThenticate score returned by their API as saved in the database.""" return self.percent_match