Skip to content

Commit

Permalink
Merge pull request #1933 from ResearchHub/add-versions-paper-model-se…
Browse files Browse the repository at this point in the history
…rializer

Add versions paper model serializer
  • Loading branch information
koutst authored Oct 24, 2024
2 parents 6b07be6 + 941c2e2 commit 155c11f
Show file tree
Hide file tree
Showing 7 changed files with 158 additions and 5 deletions.
54 changes: 54 additions & 0 deletions src/paper/migrations/0141_paperversion.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Generated by Django 4.2.15 on 2024-10-23 18:54

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
("paper", "0140_delete_asyncpaperupdator"),
]

operations = [
migrations.CreateModel(
name="PaperVersion",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("version", models.IntegerField(default=1)),
(
"base_doi",
models.CharField(
blank=True, default=None, max_length=255, null=True
),
),
("message", models.TextField(blank=True, default=None, null=True)),
("created_date", models.DateTimeField(auto_now_add=True)),
("updated_date", models.DateTimeField(auto_now=True)),
(
"paper",
models.OneToOneField(
on_delete=django.db.models.deletion.CASCADE,
related_name="versions",
to="paper.paper",
),
),
],
options={
"indexes": [
models.Index(
models.Func("base_doi", function="UPPER"),
name="paper_version_doi_upper_idx",
)
],
},
),
]
1 change: 1 addition & 0 deletions src/paper/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,6 @@
Figure,
Paper,
PaperFetchLog,
PaperVersion,
)
from paper.related_models.paper_submission_model import PaperSubmission
19 changes: 19 additions & 0 deletions src/paper/related_models/paper_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -957,6 +957,25 @@ def paper_rewards(self):
return HubCitationValue.calculate_base_claim_rsc_reward(self)


class PaperVersion(models.Model):
paper = models.OneToOneField(
Paper, on_delete=models.CASCADE, related_name="versions"
)
version = models.IntegerField(default=1)
base_doi = models.CharField(max_length=255, default=None, null=True, blank=True)
message = models.TextField(default=None, null=True, blank=True)
created_date = models.DateTimeField(auto_now_add=True)
updated_date = models.DateTimeField(auto_now=True)

class Meta:
indexes = (
Index(
Func("base_doi", function="UPPER"),
name="paper_version_doi_upper_idx",
),
)


class PaperFetchLog(models.Model):
"""
Stores the logs for e.g. daily paper fetches from openalex
Expand Down
51 changes: 51 additions & 0 deletions src/paper/serializers/paper_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
Figure,
Paper,
PaperSubmission,
PaperVersion,
)
from paper.related_models.authorship_model import Authorship
from paper.tasks import celery_extract_pdf_sections, download_pdf
Expand Down Expand Up @@ -79,6 +80,8 @@ class BasePaperSerializer(serializers.ModelSerializer, GenericReactionSerializer
unified_document_id = serializers.SerializerMethodField()
uploaded_by = UserSerializer(read_only=True)
user_flag = serializers.SerializerMethodField()
version = serializers.SerializerMethodField()
version_list = serializers.SerializerMethodField()

class Meta:
abstract = True
Expand Down Expand Up @@ -331,6 +334,28 @@ def get_pdf_url(self, paper):
return paper.pdf_url
return None

def get_version(self, paper):
try:
paper_version = PaperVersion.objects.get(paper=paper)
return paper_version.version
except PaperVersion.DoesNotExist:
return None

def get_version_list(self, paper) -> list:
try:
paper_version = PaperVersion.objects.get(paper=paper)
except PaperVersion.DoesNotExist:
return []

paper_versions = PaperVersion.objects.filter(
base_doi=paper_version.base_doi
).order_by("version")
# Return a list of version pointing to the paper_id
return [
{"version": version.version, "paper_id": version.paper.id}
for version in paper_versions
]


class ContributionPaperSerializer(BasePaperSerializer):
uploaded_by = None
Expand Down Expand Up @@ -377,6 +402,8 @@ class Meta:
"user_vote",
"users_who_bookmarked",
"views",
"version",
"version_list",
]
moderator_only_update_fields = [
"pdf_license",
Expand Down Expand Up @@ -816,6 +843,8 @@ class DynamicPaperSerializer(
file = serializers.SerializerMethodField()
pdf_url = serializers.SerializerMethodField()
pdf_copyright_allows_display = serializers.SerializerMethodField()
version = serializers.SerializerMethodField()
version_list = serializers.SerializerMethodField()

class Meta:
model = Paper
Expand Down Expand Up @@ -1037,6 +1066,28 @@ def get_pdf_url(self, paper):
return paper.pdf_url
return None

def get_version(self, paper):
try:
paper_version = PaperVersion.objects.get(paper=paper)
return paper_version.version
except PaperVersion.DoesNotExist:
return None

def get_version_list(self, paper) -> list:
try:
paper_version = PaperVersion.objects.get(paper=paper)
except PaperVersion.DoesNotExist:
return []

paper_versions = PaperVersion.objects.filter(
base_doi=paper_version.base_doi
).order_by("version")
# Return a list of version pointing to the paper_id
return [
{"version": version.version, "paper_id": version.paper.id}
for version in paper_versions
]


class BookmarkSerializer(serializers.Serializer):
user = serializers.IntegerField()
Expand Down
1 change: 1 addition & 0 deletions src/paper/tests/helpers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.core.files.uploadedfile import SimpleUploadedFile

from paper.models import Paper
from paper.related_models.paper_model import PaperVersion
from researchhub_document.related_models.constants.document_type import (
PAPER as PAPER_DOC_TYPE,
)
Expand Down
35 changes: 30 additions & 5 deletions src/paper/tests/test_serializers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from django.test import TestCase
from django.forms.models import model_to_dict
from django.test import TestCase

from hub.tests.helpers import create_hub
from paper.models import Paper, PaperVersion
from paper.serializers import PaperSerializer
from paper.tests import helpers

Expand All @@ -12,17 +13,41 @@ def setUp(self):
pass

def test_authors_field_is_optional(self):
hub_1 = create_hub(name='Hub 1')
hub_2 = create_hub(name='Hub 2')
paper = helpers.create_paper(title='Serialized Paper Title')
hub_1 = create_hub(name="Hub 1")
hub_2 = create_hub(name="Hub 2")
paper = helpers.create_paper(title="Serialized Paper Title")
paper.hubs.add(hub_1)
paper.hubs.add(hub_2)
paper_dict = model_to_dict(paper)
serialized = PaperSerializer(data=paper_dict)
self.assertTrue(serialized.is_valid())

def test_hubs_field_is_optional(self):
paper = helpers.create_paper(title='Hubs Required')
paper = helpers.create_paper(title="Hubs Required")
paper_dict = model_to_dict(paper)
serialized = PaperSerializer(data=paper_dict)
self.assertTrue(serialized.is_valid())

def test_paper_serializer_paper_versions(self):
paper = helpers.create_paper(title="Serialized Paper Title")
PaperVersion.objects.create(paper=paper, version=1, base_doi="10.1234/test")

serialized = PaperSerializer(paper)
self.assertEqual(serialized.data["version"], 1)
self.assertEqual(
serialized.data["version_list"], [{"version": 1, "paper_id": paper.id}]
)

# Create another version
paper2 = helpers.create_paper(title="Serialized Paper Title V2")
PaperVersion.objects.create(paper=paper2, version=2, base_doi="10.1234/test")

serialized2 = PaperSerializer(paper2)
self.assertEqual(serialized2.data["version"], 2)
self.assertEqual(
serialized2.data["version_list"],
[
{"version": 1, "paper_id": paper.id},
{"version": 2, "paper_id": paper2.id},
],
)
2 changes: 2 additions & 0 deletions src/paper/views/paper_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,8 @@ def retrieve(self, request, *args, **kwargs):
"uploaded_date",
"uploaded_date",
"url",
"version",
"version_list",
],
)
serializer_data = serializer.data
Expand Down

0 comments on commit 155c11f

Please sign in to comment.