Skip to content
This repository has been archived by the owner on Jan 7, 2025. It is now read-only.

Commit

Permalink
🎨 Use Field defaults (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
sunnyosun authored Nov 17, 2024
1 parent c2f70c8 commit cdba08b
Show file tree
Hide file tree
Showing 5 changed files with 229 additions and 22 deletions.
2 changes: 2 additions & 0 deletions findrefs/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,7 @@ def __getattr__(name):


if _check_instance_setup():
import lamindb

del __getattr__ # delete so that imports work out
from .models import Reference
2 changes: 1 addition & 1 deletion findrefs/migrations/0001_initial.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ class Migration(migrations.Migration):
options={
"abstract": False,
},
bases=(lnschema_core.models.CanValidate, models.Model),
bases=(lnschema_core.models.CanCurate, models.Model),
),
migrations.AddField(
model_name="artifactreference",
Expand Down
190 changes: 190 additions & 0 deletions findrefs/migrations/0002_alter_artifactreference_artifact_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,190 @@
# Generated by Django 5.2 on 2024-11-15 12:53

import django.core.validators
import django.db.models.deletion
import lnschema_core.fields
import lnschema_core.ids
import lnschema_core.models
import lnschema_core.users
from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("findrefs", "0001_initial"),
(
"lnschema_core",
"0069_alter_artifact__accessor_alter_artifact__hash_type_and_more",
),
]

operations = [
migrations.AlterField(
model_name="artifactreference",
name="artifact",
field=lnschema_core.fields.ForeignKey(
blank=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="links_reference",
to="lnschema_core.artifact",
),
),
migrations.AlterField(
model_name="artifactreference",
name="created_at",
field=lnschema_core.fields.DateTimeField(auto_now_add=True, db_index=True),
),
migrations.AlterField(
model_name="artifactreference",
name="created_by",
field=lnschema_core.fields.ForeignKey(
blank=True,
default=lnschema_core.users.current_user_id,
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="lnschema_core.user",
),
),
migrations.AlterField(
model_name="artifactreference",
name="feature",
field=lnschema_core.fields.ForeignKey(
blank=True,
default=None,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="links_artifactreference",
to="lnschema_core.feature",
),
),
migrations.AlterField(
model_name="artifactreference",
name="feature_ref_is_name",
field=lnschema_core.fields.BooleanField(
blank=True, default=None, null=True
),
),
migrations.AlterField(
model_name="artifactreference",
name="label_ref_is_name",
field=lnschema_core.fields.BooleanField(
blank=True, default=None, null=True
),
),
migrations.AlterField(
model_name="artifactreference",
name="reference",
field=lnschema_core.fields.ForeignKey(
blank=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="links_artifact",
to="findrefs.reference",
),
),
migrations.AlterField(
model_name="artifactreference",
name="run",
field=lnschema_core.fields.ForeignKey(
blank=True,
default=lnschema_core.models.current_run,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="lnschema_core.run",
),
),
migrations.AlterField(
model_name="reference",
name="abbr",
field=lnschema_core.fields.CharField(
blank=True,
db_index=True,
default=None,
max_length=32,
null=True,
unique=True,
),
),
migrations.AlterField(
model_name="reference",
name="created_at",
field=lnschema_core.fields.DateTimeField(auto_now_add=True, db_index=True),
),
migrations.AlterField(
model_name="reference",
name="created_by",
field=lnschema_core.fields.ForeignKey(
blank=True,
default=lnschema_core.users.current_user_id,
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="lnschema_core.user",
),
),
migrations.AlterField(
model_name="reference",
name="doi",
field=lnschema_core.fields.CharField(
blank=True,
db_index=True,
default=None,
max_length=255,
null=True,
validators=[
django.core.validators.RegexValidator(
message="Must be a DOI (e.g., 10.1000/xyz123 or https://doi.org/10.1000/xyz123)",
regex="^(?:https?://(?:dx\\.)?doi\\.org/|doi:|DOI:)?10\\.\\d+/.*$",
)
],
),
),
migrations.AlterField(
model_name="reference",
name="name",
field=lnschema_core.fields.CharField(
blank=True, db_index=True, default=None, max_length=255
),
),
migrations.AlterField(
model_name="reference",
name="pubmed_id",
field=lnschema_core.fields.BigIntegerField(blank=True, null=True),
),
migrations.AlterField(
model_name="reference",
name="run",
field=lnschema_core.fields.ForeignKey(
blank=True,
default=lnschema_core.models.current_run,
null=True,
on_delete=django.db.models.deletion.PROTECT,
related_name="+",
to="lnschema_core.run",
),
),
migrations.AlterField(
model_name="reference",
name="text",
field=lnschema_core.fields.TextField(blank=True, default=None, null=True),
),
migrations.AlterField(
model_name="reference",
name="uid",
field=lnschema_core.fields.CharField(
blank=True,
default=lnschema_core.ids.base62_12,
max_length=12,
unique=True,
),
),
migrations.AlterField(
model_name="reference",
name="updated_at",
field=lnschema_core.fields.DateTimeField(auto_now=True, db_index=True),
),
migrations.AlterField(
model_name="reference",
name="url",
field=models.URLField(blank=True, null=True),
),
]
55 changes: 35 additions & 20 deletions findrefs/models.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
from __future__ import annotations

from django.core.validators import RegexValidator
from django.db import models
from django.db.models import CASCADE, PROTECT
from lnschema_core import ids
from lnschema_core.fields import (
BigIntegerField,
BooleanField,
CharField,
ForeignKey,
TextField,
)
from lnschema_core.models import (
Artifact,
CanValidate,
CanCurate,
Feature,
LinkORM,
Record,
TracksRun,
TracksUpdates,
ValidateFields,
)


class Reference(Record, CanValidate, TracksRun, TracksUpdates):
class Reference(Record, CanCurate, TracksRun, TracksUpdates, ValidateFields):
"""References such as a publication or document, with unique identifiers and metadata.
Example:
Expand All @@ -29,23 +38,33 @@ class Meta(Record.Meta, TracksRun.Meta, TracksUpdates.Meta):

id: int = models.AutoField(primary_key=True)
"""Internal id, valid only in one DB instance."""
uid: str = models.CharField(unique=True, max_length=12, default=ids.base62_12)
uid: str = CharField(max_length=12, unique=True, default=ids.base62_12)
"""Universal id, valid across DB instances."""
name: str = models.CharField(max_length=255, default=None, db_index=True)
name: str = CharField(db_index=True)
"""Title or name of the reference document."""
abbr: str | None = models.CharField(
max_length=32, db_index=True, unique=True, null=True, default=None
abbr: str | None = CharField(
max_length=32,
db_index=True,
unique=True,
null=True,
)
"""A unique abbreviation for the reference."""
url: str | None = models.URLField(max_length=255, null=True, default=None)
url: str | None = models.URLField(null=True, blank=True)
"""URL linking to the reference."""
pubmed_id: int | None = models.BigIntegerField(null=True, default=None)
pubmed_id: int | None = BigIntegerField(null=True)
"""A PudMmed ID."""
doi: int | None = models.CharField(
max_length=255, null=True, default=None, db_index=True
doi: int | None = CharField(
null=True,
db_index=True,
validators=[
RegexValidator(
regex=r"^(?:https?://(?:dx\.)?doi\.org/|doi:|DOI:)?10\.\d+/.*$",
message="Must be a DOI (e.g., 10.1000/xyz123 or https://doi.org/10.1000/xyz123)",
)
],
)
"""Digital Object Identifier (DOI) for the reference."""
text: str | None = models.TextField(null=True, default=None)
text: str | None = TextField(null=True)
"""Text of the reference such as the abstract or the full-text to enable search."""
artifacts: Artifact = models.ManyToManyField(
Artifact, through="ArtifactReference", related_name="references"
Expand All @@ -55,18 +74,14 @@ class Meta(Record.Meta, TracksRun.Meta, TracksUpdates.Meta):

class ArtifactReference(Record, LinkORM, TracksRun):
id: int = models.BigAutoField(primary_key=True)
artifact: Artifact = models.ForeignKey(
Artifact, CASCADE, related_name="links_reference"
)
reference: Reference = models.ForeignKey(
Reference, PROTECT, related_name="links_artifact"
)
feature: Feature = models.ForeignKey(
artifact: Artifact = ForeignKey(Artifact, CASCADE, related_name="links_reference")
reference: Reference = ForeignKey(Reference, PROTECT, related_name="links_artifact")
feature: Feature = ForeignKey(
Feature,
PROTECT,
null=True,
default=None,
related_name="links_artifactreference",
)
label_ref_is_name: bool | None = models.BooleanField(null=True, default=None)
feature_ref_is_name: bool | None = models.BooleanField(null=True, default=None)
label_ref_is_name: bool | None = BooleanField(null=True, default=None)
feature_ref_is_name: bool | None = BooleanField(null=True, default=None)
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ authors = [{name = "Lamin Labs", email = "[email protected]"}]
readme = "README.md"
dynamic = ["version", "description"]
dependencies = [
"lamindb"
"lamindb>=0.76.16"
]

[project.urls]
Expand Down

0 comments on commit cdba08b

Please sign in to comment.