Skip to content

Commit

Permalink
Merge pull request #41 from MetaCell/feature/38
Browse files Browse the repository at this point in the history
#38 feat: provenance add pmcid and remove uri and add pm(c)id uri pro…
  • Loading branch information
afonsobspinto authored Jan 5, 2023
2 parents 2fd9ac7 + 3d739aa commit 59084cd
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 11 deletions.
29 changes: 21 additions & 8 deletions backend/composer/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.models import User
from django.utils.html import format_html

from adminsortable2.admin import SortableAdminBase, SortableStackedInline
from fsm_admin.mixins import FSMTransitionMixin
Expand Down Expand Up @@ -48,11 +49,19 @@ class UserAdmin(BaseUserAdmin):
class ProvenanceAdmin(FSMTransitionMixin, admin.ModelAdmin):
# The name of one or more FSMFields on the model to transition
fsm_field = ("state",)
readonly_fields = ("state",)
list_display = ("title", "pmid", "uri")
list_display_links = ("title", "pmid", "uri")
search_fields = ("title", "description", "pmid",)

readonly_fields = ("pmid_uri", "pmcid_uri", "state")
list_display = ("title", "pmid", "pmcid")
list_display_links = ("title", "pmid", "pmcid")
search_fields = ("title", "description", "pmid", "pmcid")

@admin.display(description='PMID')
def pmid_uri(self, obj):
return format_html("<a href='{url}' target='blank'>{url}</a>", url=obj.pmid_uri) if obj.pmid_uri else ""

@admin.display(description='PMCID')
def pmcid_uri(self, obj):
return format_html("<a href='{url}' target='blank'>{url}</a>", url=obj.pmcid_uri) if obj.pmcid_uri else ""

inlines = (ConnectivityStatementInline, NoteProvenanceInline,)


Expand All @@ -67,10 +76,10 @@ class ConnectivityStatementAdmin(SortableAdminBase, FSMTransitionMixin, admin.Mo
fsm_field = ("state",)
readonly_fields = ("state",)
autocomplete_fields = ("provenance", "origin", "destination")
list_display = ("provenance", "pmid", "short_ks", "origin", "destination", "state", "curator")
list_display_links = ("provenance", "short_ks", "state")
list_display = ("provenance", "pmid", "pmcid", "short_ks", "origin", "destination", "state", "curator")
list_display_links = ("provenance", "pmid", "pmcid", "short_ks", "state")
list_select_related = ("provenance", "origin", "destination")
search_fields = ("provenance__title", "provenance__description", "provenance__pmid", "knowledge_statement", "origin__name", "destination__name")
search_fields = ("provenance__title", "provenance__description", "provenance__pmid", "provenance__pmcid", "knowledge_statement", "origin__name", "destination__name")

fieldsets = ()

Expand All @@ -84,6 +93,10 @@ def short_ks(self, obj):
def pmid(self, obj):
return obj.provenance.pmid

@admin.display(description='PMCID')
def pmcid(self, obj):
return obj.provenance.pmcid

def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "curator":
kwargs["queryset"] = User.objects.filter(profile__is_curator=True)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 4.1.4 on 2023-01-05 14:15

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('composer', '0025_remove_connectivitystatement_state_valid_and_more'),
]

operations = [
migrations.RemoveField(
model_name='provenance',
name='uri',
),
migrations.AddField(
model_name='provenance',
name='pmcid',
field=models.CharField(blank=True, db_index=True, max_length=10, null=True, unique=True),
),
migrations.AlterField(
model_name='provenance',
name='pmid',
field=models.BigIntegerField(blank=True, db_index=True, null=True, unique=True),
),
migrations.AddConstraint(
model_name='provenance',
constraint=models.CheckConstraint(check=models.Q(('pmid__isnull', False), ('pmcid__isnull', False), _connector='OR'), name='provenance_pmid_pmcd_valid'),
),
]
13 changes: 11 additions & 2 deletions backend/composer/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,9 @@ class Provenance(models.Model):
"""Provenance"""
title = models.CharField(max_length=200, db_index=True)
description = models.TextField(db_index=True)
pmid = models.BigIntegerField(db_index=True)
uri = models.URLField()
state = FSMField(default=ProvenanceState.OPEN, protected=True)
pmid = models.BigIntegerField(db_index=True, unique=True, null=True, blank=True)
pmcid = models.CharField(max_length=10, db_index=True, unique=True, null=True, blank=True)

def __str__(self):
return self.title
Expand All @@ -139,12 +139,21 @@ def excluded(self):
@transition(field=state, source=ProvenanceState.OPEN, target=ProvenanceState.DUPLICATE)
def duplicate(self):
...

@property
def pmid_uri(self):
return f"https://pubmed.ncbi.nlm.nih.gov/{self.pmid}/" if self.pmid else None

@property
def pmcid_uri(self):
return f"https://www.ncbi.nlm.nih.gov/pmc/articles/{self.pmcid}/" if self.pmcid else None

class Meta:
ordering = ["title"]
verbose_name_plural = "Provenances"
constraints = [
models.CheckConstraint(check=models.Q(state__in=[l[0] for l in ProvenanceState.choices]), name="provenance_state_valid"),
models.CheckConstraint(check=models.Q(pmid__isnull=False) | models.Q(pmcid__isnull=False), name="provenance_pmid_pmcd_valid"),
]


Expand Down
10 changes: 9 additions & 1 deletion backend/composer/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,14 +61,22 @@ class ProvenanceSerializer(serializers.ModelSerializer):
"""Provenance"""
notes = NoteSerializer(many=True, read_only=True)
available_transitions = serializers.SerializerMethodField()
pmid_uri = serializers.SerializerMethodField()
pmcid_uri = serializers.SerializerMethodField()

def get_available_transitions(self, instance):
return [t.name for t in instance.get_available_state_transitions()]

def get_pmid_uri(self, instance):
return instance.pmid_uri

def get_pmcid_uri(self, instance):
return instance.pmcid_uri

class Meta:
model = Provenance
fields = '__all__'
read_only_fields = ('state', 'available_transitions')
read_only_fields = ('state', 'available_transitions', 'pmid_uri', 'pmcid_uri',)


class ViaFromConnectivityStatementSerializer(serializers.ModelSerializer):
Expand Down

0 comments on commit 59084cd

Please sign in to comment.