lamindb 1.6.1__py3-none-any.whl → 1.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- lamindb/__init__.py +1 -3
- lamindb/_finish.py +32 -16
- lamindb/base/types.py +6 -4
- lamindb/core/_context.py +127 -57
- lamindb/core/_mapped_collection.py +1 -1
- lamindb/core/_settings.py +44 -4
- lamindb/core/_track_environment.py +5 -2
- lamindb/core/loaders.py +1 -1
- lamindb/core/storage/_anndata_accessor.py +1 -1
- lamindb/core/storage/_tiledbsoma.py +14 -8
- lamindb/core/storage/_valid_suffixes.py +0 -1
- lamindb/core/storage/_zarr.py +1 -1
- lamindb/core/storage/objects.py +13 -8
- lamindb/core/storage/paths.py +9 -6
- lamindb/core/types.py +1 -1
- lamindb/curators/_legacy.py +2 -1
- lamindb/curators/core.py +106 -105
- lamindb/errors.py +9 -0
- lamindb/examples/fixtures/__init__.py +0 -0
- lamindb/examples/fixtures/sheets.py +224 -0
- lamindb/migrations/0103_remove_writelog_migration_state_and_more.py +1 -1
- lamindb/migrations/0105_record_unique_name.py +20 -0
- lamindb/migrations/0106_transfer_data_migration.py +25 -0
- lamindb/migrations/0107_add_schema_to_record.py +68 -0
- lamindb/migrations/0108_remove_record_sheet_remove_sheetproject_sheet_and_more.py +30 -0
- lamindb/migrations/0109_record_input_of_runs_alter_record_run_and_more.py +123 -0
- lamindb/migrations/0110_rename_values_artifacts_record_linked_artifacts.py +17 -0
- lamindb/migrations/0111_remove_record__sort_order.py +148 -0
- lamindb/migrations/0112_alter_recordartifact_feature_and_more.py +105 -0
- lamindb/migrations/0113_lower_case_branch_and_space_names.py +62 -0
- lamindb/migrations/0114_alter_run__status_code.py +24 -0
- lamindb/migrations/0115_alter_space_uid.py +52 -0
- lamindb/migrations/{0104_squashed.py → 0115_squashed.py} +261 -257
- lamindb/models/__init__.py +4 -3
- lamindb/models/_describe.py +88 -31
- lamindb/models/_feature_manager.py +627 -658
- lamindb/models/_label_manager.py +1 -3
- lamindb/models/artifact.py +214 -99
- lamindb/models/collection.py +7 -1
- lamindb/models/feature.py +288 -60
- lamindb/models/has_parents.py +3 -3
- lamindb/models/project.py +32 -15
- lamindb/models/query_manager.py +7 -1
- lamindb/models/query_set.py +118 -41
- lamindb/models/record.py +140 -94
- lamindb/models/run.py +42 -42
- lamindb/models/save.py +102 -16
- lamindb/models/schema.py +41 -8
- lamindb/models/sqlrecord.py +105 -40
- lamindb/models/storage.py +278 -0
- lamindb/models/transform.py +10 -2
- lamindb/models/ulabel.py +9 -1
- lamindb/py.typed +0 -0
- lamindb/setup/__init__.py +2 -1
- lamindb/setup/_switch.py +16 -0
- lamindb/setup/errors/__init__.py +4 -0
- lamindb/setup/types/__init__.py +4 -0
- {lamindb-1.6.1.dist-info → lamindb-1.7.0.dist-info}/METADATA +5 -5
- {lamindb-1.6.1.dist-info → lamindb-1.7.0.dist-info}/RECORD +61 -44
- lamindb/models/core.py +0 -135
- {lamindb-1.6.1.dist-info → lamindb-1.7.0.dist-info}/LICENSE +0 -0
- {lamindb-1.6.1.dist-info → lamindb-1.7.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,224 @@
|
|
1
|
+
import bionty as bt
|
2
|
+
import pandas as pd
|
3
|
+
import pytest
|
4
|
+
|
5
|
+
import lamindb as ln
|
6
|
+
|
7
|
+
|
8
|
+
@pytest.fixture(scope="module")
|
9
|
+
def populate_sheets_compound_treatment():
|
10
|
+
# Compounds ---------------------------
|
11
|
+
|
12
|
+
compound_type = ln.Record(name="Compound", is_type=True).save()
|
13
|
+
|
14
|
+
# features for compounds
|
15
|
+
structure = ln.Feature(name="structure", dtype="str").save()
|
16
|
+
|
17
|
+
# drug1
|
18
|
+
drug1 = ln.Record(name="drug1", type=compound_type).save()
|
19
|
+
ln.models.RecordJson(record=drug1, feature=structure, value="12345").save()
|
20
|
+
# drug2
|
21
|
+
drug2 = ln.Record(name="drug2", type=compound_type).save()
|
22
|
+
ln.models.RecordJson(record=drug2, feature=structure, value="45678").save()
|
23
|
+
|
24
|
+
# Treatments ---------------------------
|
25
|
+
|
26
|
+
treatment_type = ln.Record(name="Treatment", is_type=True).save()
|
27
|
+
|
28
|
+
# features for treatments
|
29
|
+
compound = ln.Feature(name="compound", dtype=compound_type).save()
|
30
|
+
concentration = ln.Feature(name="concentration", dtype="num").save()
|
31
|
+
# a sheet for treatments
|
32
|
+
treatments_sheet = ln.Record(
|
33
|
+
name="My treatments 2025-05", type=treatment_type
|
34
|
+
).save() # sheet without validating schema
|
35
|
+
|
36
|
+
# populate treatment1
|
37
|
+
treatment1 = ln.Record(name="treatment1", type=treatments_sheet).save()
|
38
|
+
ln.models.RecordRecord(record=treatment1, feature=compound, value=drug1).save()
|
39
|
+
assert drug1 in treatment1.components.all() # noqa: S101
|
40
|
+
assert treatment1 in drug1.composites.all() # noqa: S101
|
41
|
+
ln.models.RecordJson(record=treatment1, feature=concentration, value="2nM").save()
|
42
|
+
# populate treatment2
|
43
|
+
treatment2 = ln.Record(name="treatment2", type=treatments_sheet).save()
|
44
|
+
ln.models.RecordRecord(record=treatment2, feature=compound, value=drug2).save()
|
45
|
+
ln.models.RecordJson(record=treatment2, feature=concentration, value="4nM").save()
|
46
|
+
|
47
|
+
# Samples ---------------------------
|
48
|
+
|
49
|
+
sample_type = ln.Record(name="BioSample", is_type=True).save()
|
50
|
+
treatment = ln.Feature(name="treatment", dtype=treatment_type).save()
|
51
|
+
cell_line = ln.Feature(name="cell_line", dtype=bt.CellLine).save()
|
52
|
+
preparation_date = ln.Feature(name="preparation_date", dtype="datetime").save()
|
53
|
+
cell_line.dtype = "cat[bionty.CellLine]" # might have previously been set to "cat"
|
54
|
+
cell_line.save()
|
55
|
+
schema1 = ln.Schema(
|
56
|
+
name="My samples schema 2025-06",
|
57
|
+
features=[treatment, cell_line, preparation_date],
|
58
|
+
).save()
|
59
|
+
sample_sheet1 = ln.Record(
|
60
|
+
name="My samples 2025-06", schema=schema1, type=sample_type
|
61
|
+
).save()
|
62
|
+
# values for cell lines
|
63
|
+
hek293t = bt.CellLine.from_source(name="HEK293T").save()
|
64
|
+
|
65
|
+
# populate sample1
|
66
|
+
sample1 = ln.Record(name="sample1", type=sample_sheet1).save()
|
67
|
+
ln.models.RecordRecord(record=sample1, feature=treatment, value=treatment1).save()
|
68
|
+
bt.models.RecordCellLine(record=sample1, feature=cell_line, value=hek293t).save()
|
69
|
+
ln.models.RecordJson(
|
70
|
+
record=sample1, feature=preparation_date, value="2025-06-01T05:00:00"
|
71
|
+
).save()
|
72
|
+
# populate sample2
|
73
|
+
sample2 = ln.Record(name="sample2", type=sample_sheet1).save()
|
74
|
+
ln.models.RecordRecord(record=sample2, feature=treatment, value=treatment2).save()
|
75
|
+
bt.models.RecordCellLine(record=sample2, feature=cell_line, value=hek293t).save()
|
76
|
+
ln.models.RecordJson(
|
77
|
+
record=sample2, feature=preparation_date, value="2025-06-01T06:00:00"
|
78
|
+
).save()
|
79
|
+
|
80
|
+
# another sheet for samples
|
81
|
+
sample_note = ln.Feature(name="sample_note", dtype="str").save()
|
82
|
+
schema2 = ln.Schema(
|
83
|
+
name="My samples schema 2025-07",
|
84
|
+
features=[treatment, cell_line, sample_note],
|
85
|
+
).save()
|
86
|
+
# the sheet
|
87
|
+
sample_sheet2 = ln.Record(
|
88
|
+
name="My samples 2025-07", schema=schema2, type=sample_type
|
89
|
+
).save()
|
90
|
+
# populate sample3
|
91
|
+
sample3 = ln.Record(type=sample_sheet2).save() # no name
|
92
|
+
ln.models.RecordRecord(record=sample3, feature=treatment, value=treatment1).save()
|
93
|
+
bt.models.RecordCellLine(record=sample3, feature=cell_line, value=hek293t).save()
|
94
|
+
ln.models.RecordJson(
|
95
|
+
record=sample3, feature=preparation_date, value="2025-06-02T05:00:00Z"
|
96
|
+
).save()
|
97
|
+
# populate sample4
|
98
|
+
sample4 = ln.Record(type=sample_sheet2).save()
|
99
|
+
ln.models.RecordRecord(record=sample4, feature=treatment, value=treatment2).save()
|
100
|
+
bt.models.RecordCellLine(record=sample4, feature=cell_line, value=hek293t).save()
|
101
|
+
ln.models.RecordJson(
|
102
|
+
record=sample4, feature=preparation_date, value="2025-06-02T06:00:00Z"
|
103
|
+
).save()
|
104
|
+
|
105
|
+
yield treatments_sheet, sample_sheet1
|
106
|
+
|
107
|
+
sample4.delete()
|
108
|
+
sample3.delete()
|
109
|
+
sample_sheet2.delete()
|
110
|
+
schema2.delete()
|
111
|
+
sample_note.delete()
|
112
|
+
sample2.delete()
|
113
|
+
sample1.delete()
|
114
|
+
# hek293t.delete() # not for now
|
115
|
+
sample_sheet1.delete()
|
116
|
+
schema1.delete()
|
117
|
+
preparation_date.delete()
|
118
|
+
cell_line.delete()
|
119
|
+
# sample_type.delete() # not for now
|
120
|
+
treatment2.delete()
|
121
|
+
treatment1.delete()
|
122
|
+
treatments_sheet.delete()
|
123
|
+
treatment_type.delete()
|
124
|
+
concentration.delete()
|
125
|
+
drug2.delete()
|
126
|
+
drug1.delete()
|
127
|
+
structure.delete()
|
128
|
+
compound.delete()
|
129
|
+
compound_type.delete()
|
130
|
+
|
131
|
+
|
132
|
+
@pytest.fixture(scope="module")
|
133
|
+
def populate_nextflow_sheet_with_samples():
|
134
|
+
# Biosample schema and type
|
135
|
+
samples_schema = ln.Schema(
|
136
|
+
name="Biosample test schema",
|
137
|
+
features=[
|
138
|
+
ln.Feature(name="species", dtype="cat[bionty.Organism]").save(),
|
139
|
+
ln.Feature(name="cell_type", dtype="cat[bionty.CellType]").save(),
|
140
|
+
ln.Feature(name="tissue", dtype="cat[bionty.Tissue]").save(),
|
141
|
+
],
|
142
|
+
).save()
|
143
|
+
|
144
|
+
biosample_type = ln.Record(name="BioSample", is_type=True).save()
|
145
|
+
|
146
|
+
# Biosamples sheet
|
147
|
+
samples_sheet = ln.Record(
|
148
|
+
name="My samples 2025-04", schema=samples_schema, type=biosample_type
|
149
|
+
).save()
|
150
|
+
sample_x = ln.Record(name="Sample_X", type=samples_sheet).save()
|
151
|
+
sample_y = ln.Record(name="Sample_Y", type=samples_sheet).save()
|
152
|
+
|
153
|
+
organism_human = bt.Organism.from_source(name="human").save()
|
154
|
+
celltype_tcell = bt.CellType.from_source(name="T cell").save()
|
155
|
+
tissue_blood = bt.Tissue.from_source(name="blood").save()
|
156
|
+
|
157
|
+
features = ln.Feature.lookup()
|
158
|
+
for sample in [sample_x, sample_y]:
|
159
|
+
bt.models.RecordOrganism(
|
160
|
+
record=sample, feature=features.species, value=organism_human
|
161
|
+
).save()
|
162
|
+
bt.models.RecordCellType(
|
163
|
+
record=sample, feature=features.cell_type, value=celltype_tcell
|
164
|
+
).save()
|
165
|
+
bt.models.RecordTissue(
|
166
|
+
record=sample, feature=features.tissue, value=tissue_blood
|
167
|
+
).save()
|
168
|
+
|
169
|
+
# Nextflow samplesheet schema
|
170
|
+
nextflow_schema = ln.Schema(
|
171
|
+
name="RNA-seq standard",
|
172
|
+
features=[
|
173
|
+
ln.Feature(name="sample", dtype="cat[Record[BioSample]]").save(),
|
174
|
+
ln.Feature(name="fastq_1", dtype=str).save(),
|
175
|
+
ln.Feature(name="fastq_2", dtype=str).save(),
|
176
|
+
ln.Feature(name="expected_cells", dtype=int).save(),
|
177
|
+
ln.Feature(name="seq_center", dtype=str).save().with_config(optional=True),
|
178
|
+
],
|
179
|
+
ordered_set=True,
|
180
|
+
).save()
|
181
|
+
|
182
|
+
nextflowsample_type = ln.Record(name="NextflowSample", is_type=True).save()
|
183
|
+
nextflow_sheet = ln.Record(
|
184
|
+
schema=nextflow_schema,
|
185
|
+
name="RNA-seq nextflow samplesheet 001",
|
186
|
+
type=nextflowsample_type,
|
187
|
+
is_type=True,
|
188
|
+
).save()
|
189
|
+
|
190
|
+
sample_data = {
|
191
|
+
"sample": ["Sample_X", "Sample_Y", "Sample_Y"],
|
192
|
+
"fastq_1": [
|
193
|
+
"https://raw.githubusercontent.com/nf-core/test-datasets/scrnaseq/testdata/cellranger/Sample_X_S1_L001_R1_001.fastq.gz",
|
194
|
+
"https://raw.githubusercontent.com/nf-core/test-datasets/scrnaseq/testdata/cellranger/Sample_Y_S1_L001_R1_001.fastq.gz",
|
195
|
+
"https://raw.githubusercontent.com/nf-core/test-datasets/scrnaseq/testdata/cellranger/Sample_Y_S1_L002_R1_001.fastq.gz",
|
196
|
+
],
|
197
|
+
"fastq_2": [
|
198
|
+
"https://raw.githubusercontent.com/nf-core/test-datasets/scrnaseq/testdata/cellranger/Sample_X_S1_L001_R2_001.fastq.gz",
|
199
|
+
"https://raw.githubusercontent.com/nf-core/test-datasets/scrnaseq/testdata/cellranger/Sample_Y_S1_L001_R2_001.fastq.gz",
|
200
|
+
"https://raw.githubusercontent.com/nf-core/test-datasets/scrnaseq/testdata/cellranger/Sample_Y_S1_L002_R2_001.fastq.gz",
|
201
|
+
],
|
202
|
+
"expected_cells": [5000, 5000, 5000],
|
203
|
+
}
|
204
|
+
df = pd.DataFrame(sample_data)
|
205
|
+
|
206
|
+
features = ln.Feature.lookup()
|
207
|
+
for _, row in df.iterrows():
|
208
|
+
sample = ln.Record(type=nextflow_sheet).save()
|
209
|
+
ln.models.RecordRecord(
|
210
|
+
record=sample,
|
211
|
+
feature=features.sample,
|
212
|
+
value=ln.Record.get(name=row["sample"]),
|
213
|
+
).save()
|
214
|
+
ln.models.RecordJson(
|
215
|
+
record=sample, feature=features.fastq_1, value=row["fastq_1"]
|
216
|
+
).save()
|
217
|
+
ln.models.RecordJson(
|
218
|
+
record=sample, feature=features.fastq_2, value=row["fastq_2"]
|
219
|
+
).save()
|
220
|
+
ln.models.RecordJson(
|
221
|
+
record=sample, feature=features.expected_cells, value=row["expected_cells"]
|
222
|
+
).save()
|
223
|
+
|
224
|
+
yield nextflow_sheet
|
@@ -5,7 +5,7 @@ from django.db import migrations
|
|
5
5
|
|
6
6
|
def fix_artifact_kind(apps, schema_editor):
|
7
7
|
Artifact = apps.get_model("lamindb", "Artifact")
|
8
|
-
Artifact.objects.filter(kind="__lamindb__").update(kind="
|
8
|
+
Artifact.objects.filter(kind="__lamindb__").update(kind="__lamindb_run__")
|
9
9
|
|
10
10
|
|
11
11
|
class Migration(migrations.Migration):
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# Generated by Django 5.2 on 2025-06-03 19:37
|
2
|
+
|
3
|
+
from django.db import migrations, models
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
dependencies = [
|
8
|
+
("lamindb", "0104_alter_branch_uid"),
|
9
|
+
]
|
10
|
+
|
11
|
+
operations = [
|
12
|
+
migrations.AddConstraint(
|
13
|
+
model_name="record",
|
14
|
+
constraint=models.UniqueConstraint(
|
15
|
+
condition=models.Q(("is_type", True)),
|
16
|
+
fields=("name",),
|
17
|
+
name="unique_name",
|
18
|
+
),
|
19
|
+
),
|
20
|
+
]
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Generated by Django 5.2 on 2025-06-03 19:37
|
2
|
+
|
3
|
+
from django.db import connection, migrations
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
dependencies = [
|
8
|
+
("lamindb", "0105_record_unique_name"),
|
9
|
+
]
|
10
|
+
|
11
|
+
operations = [
|
12
|
+
migrations.RunSQL(
|
13
|
+
sql="""
|
14
|
+
UPDATE lamindb_transform
|
15
|
+
SET key = '__lamindb_transfer__/' || SUBSTR(key, 11)
|
16
|
+
WHERE key LIKE 'transfers/%';
|
17
|
+
"""
|
18
|
+
if connection.vendor == "sqlite"
|
19
|
+
else """
|
20
|
+
UPDATE lamindb_transform
|
21
|
+
SET key = CONCAT('__lamindb_transfer__/', SUBSTRING(key FROM 11))
|
22
|
+
WHERE key LIKE 'transfers/%';
|
23
|
+
"""
|
24
|
+
),
|
25
|
+
]
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Generated by Django 5.2 on 2025-06-30 12:42
|
2
|
+
|
3
|
+
import django.db.models.deletion
|
4
|
+
from django.db import migrations
|
5
|
+
|
6
|
+
import lamindb.base.fields
|
7
|
+
|
8
|
+
|
9
|
+
def migrate_sheets_to_records(apps, schema_editor):
|
10
|
+
"""Migrate Sheet records to Record table as type records."""
|
11
|
+
with schema_editor.connection.cursor() as cursor:
|
12
|
+
# Insert sheets as records with is_type=True
|
13
|
+
cursor.execute("""
|
14
|
+
INSERT INTO lamindb_record (uid, name, description, schema_id, is_type, created_by_id, created_at, updated_at, run_id)
|
15
|
+
SELECT uid, name, description, schema_id, TRUE, created_by_id, created_at, updated_at, run_id
|
16
|
+
FROM lamindb_sheet;
|
17
|
+
""")
|
18
|
+
|
19
|
+
# Update records that were linked to sheets to link to the new record types
|
20
|
+
cursor.execute("""
|
21
|
+
UPDATE lamindb_record
|
22
|
+
SET type_id = (
|
23
|
+
SELECT r.id
|
24
|
+
FROM lamindb_record r
|
25
|
+
JOIN lamindb_sheet s ON r.uid = s.uid
|
26
|
+
WHERE s.id = lamindb_record.sheet_id
|
27
|
+
)
|
28
|
+
WHERE sheet_id IS NOT NULL;
|
29
|
+
""")
|
30
|
+
|
31
|
+
|
32
|
+
class Migration(migrations.Migration):
|
33
|
+
dependencies = [
|
34
|
+
("lamindb", "0106_transfer_data_migration"),
|
35
|
+
]
|
36
|
+
|
37
|
+
operations = [
|
38
|
+
migrations.RemoveConstraint(
|
39
|
+
model_name="record",
|
40
|
+
name="unique_name",
|
41
|
+
),
|
42
|
+
migrations.AddField(
|
43
|
+
model_name="record",
|
44
|
+
name="schema",
|
45
|
+
field=lamindb.base.fields.ForeignKey(
|
46
|
+
blank=True,
|
47
|
+
null=True,
|
48
|
+
on_delete=django.db.models.deletion.CASCADE,
|
49
|
+
related_name="records",
|
50
|
+
to="lamindb.schema",
|
51
|
+
),
|
52
|
+
),
|
53
|
+
migrations.AlterField(
|
54
|
+
model_name="record",
|
55
|
+
name="is_type",
|
56
|
+
field=lamindb.base.fields.BooleanField(
|
57
|
+
blank=True, db_index=True, default=False
|
58
|
+
),
|
59
|
+
),
|
60
|
+
migrations.RunPython(
|
61
|
+
migrate_sheets_to_records,
|
62
|
+
),
|
63
|
+
migrations.AddField(
|
64
|
+
model_name="record",
|
65
|
+
name="_sort_order",
|
66
|
+
field=django.db.models.FloatField(null=True, default=None),
|
67
|
+
),
|
68
|
+
]
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Generated by Django 5.2 on 2025-06-30 12:54
|
2
|
+
|
3
|
+
from django.db import migrations
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
dependencies = [
|
8
|
+
("lamindb", "0107_add_schema_to_record"),
|
9
|
+
]
|
10
|
+
|
11
|
+
operations = [
|
12
|
+
migrations.RemoveField(
|
13
|
+
model_name="record",
|
14
|
+
name="sheet",
|
15
|
+
),
|
16
|
+
migrations.RemoveField(
|
17
|
+
model_name="project",
|
18
|
+
name="sheets",
|
19
|
+
),
|
20
|
+
migrations.AlterUniqueTogether(
|
21
|
+
name="sheetproject",
|
22
|
+
unique_together=None,
|
23
|
+
),
|
24
|
+
migrations.DeleteModel(
|
25
|
+
name="Sheet",
|
26
|
+
),
|
27
|
+
migrations.DeleteModel(
|
28
|
+
name="SheetProject",
|
29
|
+
),
|
30
|
+
]
|
@@ -0,0 +1,123 @@
|
|
1
|
+
# Generated by Django 5.2 on 2025-07-04 17:07
|
2
|
+
|
3
|
+
import django.db.models.deletion
|
4
|
+
from django.db import migrations, models
|
5
|
+
|
6
|
+
import lamindb.base.fields
|
7
|
+
|
8
|
+
|
9
|
+
class Migration(migrations.Migration):
|
10
|
+
dependencies = [
|
11
|
+
("lamindb", "0108_remove_record_sheet_remove_sheetproject_sheet_and_more"),
|
12
|
+
]
|
13
|
+
|
14
|
+
operations = [
|
15
|
+
migrations.AddField(
|
16
|
+
model_name="record",
|
17
|
+
name="input_of_runs",
|
18
|
+
field=models.ManyToManyField(
|
19
|
+
related_name="input_records", to="lamindb.run"
|
20
|
+
),
|
21
|
+
),
|
22
|
+
migrations.AlterField(
|
23
|
+
model_name="record",
|
24
|
+
name="run",
|
25
|
+
field=lamindb.base.fields.ForeignKey(
|
26
|
+
blank=True,
|
27
|
+
default=None,
|
28
|
+
editable=False,
|
29
|
+
null=True,
|
30
|
+
on_delete=django.db.models.deletion.PROTECT,
|
31
|
+
related_name="output_records",
|
32
|
+
to="lamindb.run",
|
33
|
+
),
|
34
|
+
),
|
35
|
+
migrations.AlterUniqueTogether(
|
36
|
+
name="recordrecord",
|
37
|
+
unique_together={("record", "feature", "value")},
|
38
|
+
),
|
39
|
+
migrations.AlterUniqueTogether(
|
40
|
+
name="recordrun",
|
41
|
+
unique_together={("record", "feature", "value")},
|
42
|
+
),
|
43
|
+
migrations.AlterUniqueTogether(
|
44
|
+
name="recordulabel",
|
45
|
+
unique_together={("record", "feature", "value")},
|
46
|
+
),
|
47
|
+
migrations.AddField(
|
48
|
+
model_name="record",
|
49
|
+
name="values_artifacts",
|
50
|
+
field=models.ManyToManyField(
|
51
|
+
related_name="linked_in_records",
|
52
|
+
through="lamindb.RecordArtifact",
|
53
|
+
to="lamindb.artifact",
|
54
|
+
),
|
55
|
+
),
|
56
|
+
migrations.AlterField(
|
57
|
+
model_name="recordartifact",
|
58
|
+
name="value",
|
59
|
+
field=lamindb.base.fields.ForeignKey(
|
60
|
+
blank=True,
|
61
|
+
on_delete=django.db.models.deletion.PROTECT,
|
62
|
+
related_name="links_linked_in_record",
|
63
|
+
to="lamindb.artifact",
|
64
|
+
),
|
65
|
+
),
|
66
|
+
migrations.CreateModel(
|
67
|
+
name="ArtifactRecord",
|
68
|
+
fields=[
|
69
|
+
("id", models.BigAutoField(primary_key=True, serialize=False)),
|
70
|
+
(
|
71
|
+
"artifact",
|
72
|
+
lamindb.base.fields.ForeignKey(
|
73
|
+
blank=True,
|
74
|
+
on_delete=django.db.models.deletion.CASCADE,
|
75
|
+
related_name="links_record",
|
76
|
+
to="lamindb.artifact",
|
77
|
+
),
|
78
|
+
),
|
79
|
+
(
|
80
|
+
"feature",
|
81
|
+
lamindb.base.fields.ForeignKey(
|
82
|
+
blank=True,
|
83
|
+
null=True,
|
84
|
+
on_delete=django.db.models.deletion.PROTECT,
|
85
|
+
related_name="links_artifactrecord",
|
86
|
+
to="lamindb.feature",
|
87
|
+
),
|
88
|
+
),
|
89
|
+
(
|
90
|
+
"record",
|
91
|
+
lamindb.base.fields.ForeignKey(
|
92
|
+
blank=True,
|
93
|
+
on_delete=django.db.models.deletion.PROTECT,
|
94
|
+
related_name="links_artifact",
|
95
|
+
to="lamindb.record",
|
96
|
+
),
|
97
|
+
),
|
98
|
+
],
|
99
|
+
options={
|
100
|
+
"unique_together": {("artifact", "record", "feature")},
|
101
|
+
},
|
102
|
+
bases=(models.Model, lamindb.models.sqlrecord.IsLink),
|
103
|
+
),
|
104
|
+
migrations.AlterField(
|
105
|
+
model_name="record",
|
106
|
+
name="artifacts",
|
107
|
+
field=models.ManyToManyField(
|
108
|
+
related_name="records",
|
109
|
+
through="lamindb.ArtifactRecord",
|
110
|
+
to="lamindb.artifact",
|
111
|
+
),
|
112
|
+
),
|
113
|
+
migrations.AddField(
|
114
|
+
model_name="artifactrecord",
|
115
|
+
name="feature_ref_is_name",
|
116
|
+
field=lamindb.base.fields.BooleanField(blank=True, default=None, null=True),
|
117
|
+
),
|
118
|
+
migrations.AddField(
|
119
|
+
model_name="artifactrecord",
|
120
|
+
name="label_ref_is_name",
|
121
|
+
field=lamindb.base.fields.BooleanField(blank=True, default=None, null=True),
|
122
|
+
),
|
123
|
+
]
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Generated by Django 5.2 on 2025-07-04 18:10
|
2
|
+
|
3
|
+
from django.db import migrations
|
4
|
+
|
5
|
+
|
6
|
+
class Migration(migrations.Migration):
|
7
|
+
dependencies = [
|
8
|
+
("lamindb", "0109_record_input_of_runs_alter_record_run_and_more"),
|
9
|
+
]
|
10
|
+
|
11
|
+
operations = [
|
12
|
+
migrations.RenameField(
|
13
|
+
model_name="record",
|
14
|
+
old_name="values_artifacts",
|
15
|
+
new_name="linked_artifacts",
|
16
|
+
),
|
17
|
+
]
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# Generated by Django 5.2 on 2025-07-04 18:56
|
2
|
+
|
3
|
+
import django.db.models.deletion
|
4
|
+
from django.db import migrations, models
|
5
|
+
|
6
|
+
import lamindb.base.fields
|
7
|
+
import lamindb.models.sqlrecord
|
8
|
+
|
9
|
+
|
10
|
+
class Migration(migrations.Migration):
|
11
|
+
dependencies = [
|
12
|
+
("lamindb", "0110_rename_values_artifacts_record_linked_artifacts"),
|
13
|
+
]
|
14
|
+
|
15
|
+
operations = [
|
16
|
+
migrations.RemoveField(
|
17
|
+
model_name="record",
|
18
|
+
name="_sort_order",
|
19
|
+
),
|
20
|
+
migrations.RenameField(
|
21
|
+
model_name="record",
|
22
|
+
old_name="runs",
|
23
|
+
new_name="linked_runs",
|
24
|
+
),
|
25
|
+
migrations.AlterUniqueTogether(
|
26
|
+
name="recordproject",
|
27
|
+
unique_together={("record", "feature", "value")},
|
28
|
+
),
|
29
|
+
migrations.CreateModel(
|
30
|
+
name="RecordPerson",
|
31
|
+
fields=[
|
32
|
+
("id", models.BigAutoField(primary_key=True, serialize=False)),
|
33
|
+
(
|
34
|
+
"feature",
|
35
|
+
lamindb.base.fields.ForeignKey(
|
36
|
+
blank=True,
|
37
|
+
on_delete=django.db.models.deletion.CASCADE,
|
38
|
+
related_name="links_recordperson",
|
39
|
+
to="lamindb.feature",
|
40
|
+
),
|
41
|
+
),
|
42
|
+
(
|
43
|
+
"record",
|
44
|
+
lamindb.base.fields.ForeignKey(
|
45
|
+
blank=True,
|
46
|
+
on_delete=django.db.models.deletion.CASCADE,
|
47
|
+
related_name="values_person",
|
48
|
+
to="lamindb.record",
|
49
|
+
),
|
50
|
+
),
|
51
|
+
(
|
52
|
+
"value",
|
53
|
+
lamindb.base.fields.ForeignKey(
|
54
|
+
blank=True,
|
55
|
+
on_delete=django.db.models.deletion.PROTECT,
|
56
|
+
related_name="links_record",
|
57
|
+
to="lamindb.person",
|
58
|
+
),
|
59
|
+
),
|
60
|
+
],
|
61
|
+
options={
|
62
|
+
"unique_together": {("record", "feature", "value")},
|
63
|
+
},
|
64
|
+
bases=(models.Model, lamindb.models.sqlrecord.IsLink),
|
65
|
+
),
|
66
|
+
migrations.AddField(
|
67
|
+
model_name="person",
|
68
|
+
name="records",
|
69
|
+
field=models.ManyToManyField(
|
70
|
+
related_name="people",
|
71
|
+
through="lamindb.RecordPerson",
|
72
|
+
to="lamindb.record",
|
73
|
+
),
|
74
|
+
),
|
75
|
+
migrations.CreateModel(
|
76
|
+
name="RecordReference",
|
77
|
+
fields=[
|
78
|
+
("id", models.BigAutoField(primary_key=True, serialize=False)),
|
79
|
+
(
|
80
|
+
"feature",
|
81
|
+
lamindb.base.fields.ForeignKey(
|
82
|
+
blank=True,
|
83
|
+
on_delete=django.db.models.deletion.CASCADE,
|
84
|
+
related_name="links_recordreference",
|
85
|
+
to="lamindb.feature",
|
86
|
+
),
|
87
|
+
),
|
88
|
+
(
|
89
|
+
"record",
|
90
|
+
lamindb.base.fields.ForeignKey(
|
91
|
+
blank=True,
|
92
|
+
on_delete=django.db.models.deletion.CASCADE,
|
93
|
+
related_name="values_reference",
|
94
|
+
to="lamindb.record",
|
95
|
+
),
|
96
|
+
),
|
97
|
+
(
|
98
|
+
"value",
|
99
|
+
lamindb.base.fields.ForeignKey(
|
100
|
+
blank=True,
|
101
|
+
on_delete=django.db.models.deletion.PROTECT,
|
102
|
+
related_name="links_record",
|
103
|
+
to="lamindb.reference",
|
104
|
+
),
|
105
|
+
),
|
106
|
+
],
|
107
|
+
options={
|
108
|
+
"unique_together": {("record", "feature", "value")},
|
109
|
+
},
|
110
|
+
bases=(models.Model, lamindb.models.sqlrecord.IsLink),
|
111
|
+
),
|
112
|
+
migrations.AddField(
|
113
|
+
model_name="reference",
|
114
|
+
name="records",
|
115
|
+
field=models.ManyToManyField(
|
116
|
+
related_name="references",
|
117
|
+
through="lamindb.RecordReference",
|
118
|
+
to="lamindb.record",
|
119
|
+
),
|
120
|
+
),
|
121
|
+
migrations.AlterField(
|
122
|
+
model_name="person",
|
123
|
+
name="records",
|
124
|
+
field=models.ManyToManyField(
|
125
|
+
related_name="linked_people",
|
126
|
+
through="lamindb.RecordPerson",
|
127
|
+
to="lamindb.record",
|
128
|
+
),
|
129
|
+
),
|
130
|
+
migrations.AlterField(
|
131
|
+
model_name="project",
|
132
|
+
name="records",
|
133
|
+
field=models.ManyToManyField(
|
134
|
+
related_name="linked_projects",
|
135
|
+
through="lamindb.RecordProject",
|
136
|
+
to="lamindb.record",
|
137
|
+
),
|
138
|
+
),
|
139
|
+
migrations.AlterField(
|
140
|
+
model_name="reference",
|
141
|
+
name="records",
|
142
|
+
field=models.ManyToManyField(
|
143
|
+
related_name="linked_references",
|
144
|
+
through="lamindb.RecordReference",
|
145
|
+
to="lamindb.record",
|
146
|
+
),
|
147
|
+
),
|
148
|
+
]
|