Skip to content

Commit

Permalink
articles: addition of compliance check
Browse files Browse the repository at this point in the history
  • Loading branch information
drjova committed Dec 12, 2023
1 parent 9643d2f commit 7252cd7
Show file tree
Hide file tree
Showing 21 changed files with 2,362 additions and 7 deletions.
6 changes: 6 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,9 @@ shell:

flush:
poetry run python manage.py flush

make-migrations:
poetry run python manage.py makemigrations

migrate:
poetry run python manage.py migrate
367 changes: 365 additions & 2 deletions poetry.lock

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ boto3 = "^1.26.161"
backoff = "^2.2.1"
django-prometheus = "^2.3.1"
djangorestframework-csv = "^2.1.1"
habanero = "^1.2.3"
django-lifecycle = "^1.1.2"

[tool.poetry.dev-dependencies]
Werkzeug = {extras = ["watchdog"], version = "^2.3.4"}
Expand All @@ -67,6 +69,10 @@ django-extensions = "^3.2.3"
django-coverage-plugin = "^3.0.0"
pytest-django = "^4.5.2"

[tool.poetry.group.dev.dependencies]
pytest-vcr = "^1.0.2"
freezegun = "^1.3.1"

[tool.isort]
profile = "black"
multi_line_output = 3
Expand Down
216 changes: 212 additions & 4 deletions scoap3/articles/admin.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,218 @@
from django.contrib import admin
from django.contrib import admin, messages

from scoap3.articles.models import Article, ArticleFile, ArticleIdentifier
from scoap3.articles.models import (
Article,
ArticleFile,
ArticleIdentifier,
ComplianceReport,
)
from scoap3.articles.tasks import compliance_checks


class ComplianceReportAdmin(admin.ModelAdmin):
list_display = [
"article_id",
"article_publisher",
"article_journal",
"article_doi",
"check_license",
"check_file_formats",
"check_arxiv_category",
"check_article_type",
"check_doi_registration_time",
"get_is_compliant",
"report_date",
]
search_fields = [
"id",
"article__id",
"article__title",
"article__publication_info__journal_title",
]
fields = [
"article",
"report_date",
"get_is_compliant",
"check_license",
"check_license_description",
"check_file_formats",
"check_file_formats_description",
"check_arxiv_category",
"check_arxiv_category_description",
"check_article_type",
"check_article_type_description",
"check_doi_registration_time",
"check_doi_registration_time_description",
]
readonly_fields = [
"article",
"report_date",
"get_is_compliant",
"check_license",
"check_license_description",
"check_file_formats",
"check_file_formats_description",
"check_arxiv_category",
"check_arxiv_category_description",
"check_article_type",
"check_article_type_description",
"check_doi_registration_time",
"check_doi_registration_time_description",
]

@admin.display(description="ID")
def article_id(self, obj):
return obj.article.id

@admin.display(boolean=True, description="Compliant")
def get_is_compliant(self, obj):
return obj.is_compliant()

@admin.display(description="DOI")
def article_doi(self, obj):
doi_identifier = obj.article.article_identifiers.filter(
identifier_type="DOI"
).first()
return [doi_identifier.identifier_value if doi_identifier else "None"]

@admin.display(description="Publisher")
def article_publisher(self, obj):
return [info.publisher for info in obj.article.publication_info.all()]

@admin.display(description="Journal")
def article_journal(self, obj):
return [info.journal_title for info in obj.article.publication_info.all()]


class ArticleComplianceReportInline(admin.StackedInline):
model = ComplianceReport
readonly_fields = [
"check_license",
"check_license_description",
"check_file_formats",
"check_file_formats_description",
"check_arxiv_category",
"check_arxiv_category_description",
"check_article_type",
"check_article_type_description",
"check_doi_registration_time",
"check_doi_registration_time_description",
]
can_delete = False
can_create = False
extra = 0
max_num = 1
fieldsets = (
(
None,
{
"fields": [
("check_license", "check_license_description"),
("check_file_formats", "check_file_formats_description"),
("check_arxiv_category", "check_arxiv_category_description"),
("check_article_type", "check_article_type_description"),
(
"check_doi_registration_time",
"check_doi_registration_time_description",
),
]
},
),
)


class ArticleAdmin(admin.ModelAdmin):
list_display = ["id", "title", "subtitle", "_updated_at", "_created_at"]
search_fields = ["title"]
list_display = [
"id",
"title",
"journal_title",
"doi",
"check_license",
"check_file_formats",
"check_arxiv_category",
"check_article_type",
"check_doi_registration_time",
"_updated_at",
"_created_at",
]
search_fields = [
"title",
"id",
"publication_info__journal_title",
"article_identifiers__identifier_value",
]
actions = ["make_compliance_check"]
list_filter = [
"_updated_at",
"_created_at",
"publication_info__journal_title",
"report__check_license",
"report__check_file_formats",
"report__check_arxiv_category",
"report__check_article_type",
"report__check_doi_registration_time",
]
inlines = [ArticleComplianceReportInline]

@admin.display(description="Journal")
def journal_title(self, obj):
return [info.journal_title for info in obj.publication_info.all()]

@admin.display(description="DOI")
def doi(self, obj):
return [
identifier.identifier_value
for identifier in obj.article_identifiers.filter(identifier_type="DOI")
]

@admin.action(description="Run compliance checks")
def make_compliance_check(self, request, queryset):
ids = []
for obj in queryset:
compliance_checks.delay(obj.id)
ids.append(str(obj.id))
messages.success(
request,
f"""
Selected articles are being processed, it might take some time before seeing
the results in the reports. {', '.join(ids)}.
""",
)

@admin.display(boolean=True, description="License")
def check_license(self, obj):
report = obj.report.first()
if report:
return report.check_license
return False

@admin.display(description="File formats", boolean=True)
def check_file_formats(self, obj):
report = obj.report.first()
if report:
return report.check_file_formats
return False

@admin.display(description="ArXiv category", boolean=True)
def check_arxiv_category(self, obj):
report = obj.report.first()
if report:
return report.check_arxiv_category
return False

@admin.display(description="Article type", boolean=True)
def check_article_type(self, obj):
report = obj.report.first()
if report:
return report.check_article_type
return False

@admin.display(description="DOI registration time", boolean=True)
def check_doi_registration_time(self, obj):
report = obj.report.first()
if report:
return report.check_doi_registration_time
return False


class ArticleIdentifierAdmin(admin.ModelAdmin):
Expand All @@ -30,3 +237,4 @@ def file_size(self, obj):
admin.site.register(Article, ArticleAdmin)
admin.site.register(ArticleIdentifier, ArticleIdentifierAdmin)
admin.site.register(ArticleFile, ArticleFileAdmin)
admin.site.register(ComplianceReport, ComplianceReportAdmin)
41 changes: 41 additions & 0 deletions scoap3/articles/migrations/0012_compliancereport.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# Generated by Django 4.2.5 on 2023-12-11 07:54

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


class Migration(migrations.Migration):
dependencies = [
("articles", "0011_alter_articleidentifier_article_id"),
]

operations = [
migrations.CreateModel(
name="ComplianceReport",
fields=[
(
"id",
models.BigAutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("report_date", models.DateTimeField(auto_now_add=True)),
("check_license", models.BooleanField(default=False)),
("check_file_formats", models.BooleanField(default=False)),
("check_arxiv_category", models.BooleanField(default=False)),
("check_article_type", models.BooleanField(default=False)),
("check_doi_registration_time", models.BooleanField(default=False)),
(
"article",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="report",
to="articles.article",
),
),
],
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# Generated by Django 4.2.5 on 2023-12-11 08:00

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("articles", "0012_compliancereport"),
]

operations = [
migrations.AddField(
model_name="compliancereport",
name="check_article_type_description",
field=models.TextField(blank=True, default=""),
),
migrations.AddField(
model_name="compliancereport",
name="check_arxiv_category_description",
field=models.TextField(blank=True, default=""),
),
migrations.AddField(
model_name="compliancereport",
name="check_doi_registration_time_description",
field=models.TextField(blank=True, default=""),
),
migrations.AddField(
model_name="compliancereport",
name="check_file_formats_description",
field=models.TextField(blank=True, default=""),
),
migrations.AddField(
model_name="compliancereport",
name="check_license_description",
field=models.TextField(blank=True, default=""),
),
]
Loading

0 comments on commit 7252cd7

Please sign in to comment.