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.
Files changed (62) hide show
  1. lamindb/__init__.py +1 -3
  2. lamindb/_finish.py +32 -16
  3. lamindb/base/types.py +6 -4
  4. lamindb/core/_context.py +127 -57
  5. lamindb/core/_mapped_collection.py +1 -1
  6. lamindb/core/_settings.py +44 -4
  7. lamindb/core/_track_environment.py +5 -2
  8. lamindb/core/loaders.py +1 -1
  9. lamindb/core/storage/_anndata_accessor.py +1 -1
  10. lamindb/core/storage/_tiledbsoma.py +14 -8
  11. lamindb/core/storage/_valid_suffixes.py +0 -1
  12. lamindb/core/storage/_zarr.py +1 -1
  13. lamindb/core/storage/objects.py +13 -8
  14. lamindb/core/storage/paths.py +9 -6
  15. lamindb/core/types.py +1 -1
  16. lamindb/curators/_legacy.py +2 -1
  17. lamindb/curators/core.py +106 -105
  18. lamindb/errors.py +9 -0
  19. lamindb/examples/fixtures/__init__.py +0 -0
  20. lamindb/examples/fixtures/sheets.py +224 -0
  21. lamindb/migrations/0103_remove_writelog_migration_state_and_more.py +1 -1
  22. lamindb/migrations/0105_record_unique_name.py +20 -0
  23. lamindb/migrations/0106_transfer_data_migration.py +25 -0
  24. lamindb/migrations/0107_add_schema_to_record.py +68 -0
  25. lamindb/migrations/0108_remove_record_sheet_remove_sheetproject_sheet_and_more.py +30 -0
  26. lamindb/migrations/0109_record_input_of_runs_alter_record_run_and_more.py +123 -0
  27. lamindb/migrations/0110_rename_values_artifacts_record_linked_artifacts.py +17 -0
  28. lamindb/migrations/0111_remove_record__sort_order.py +148 -0
  29. lamindb/migrations/0112_alter_recordartifact_feature_and_more.py +105 -0
  30. lamindb/migrations/0113_lower_case_branch_and_space_names.py +62 -0
  31. lamindb/migrations/0114_alter_run__status_code.py +24 -0
  32. lamindb/migrations/0115_alter_space_uid.py +52 -0
  33. lamindb/migrations/{0104_squashed.py → 0115_squashed.py} +261 -257
  34. lamindb/models/__init__.py +4 -3
  35. lamindb/models/_describe.py +88 -31
  36. lamindb/models/_feature_manager.py +627 -658
  37. lamindb/models/_label_manager.py +1 -3
  38. lamindb/models/artifact.py +214 -99
  39. lamindb/models/collection.py +7 -1
  40. lamindb/models/feature.py +288 -60
  41. lamindb/models/has_parents.py +3 -3
  42. lamindb/models/project.py +32 -15
  43. lamindb/models/query_manager.py +7 -1
  44. lamindb/models/query_set.py +118 -41
  45. lamindb/models/record.py +140 -94
  46. lamindb/models/run.py +42 -42
  47. lamindb/models/save.py +102 -16
  48. lamindb/models/schema.py +41 -8
  49. lamindb/models/sqlrecord.py +105 -40
  50. lamindb/models/storage.py +278 -0
  51. lamindb/models/transform.py +10 -2
  52. lamindb/models/ulabel.py +9 -1
  53. lamindb/py.typed +0 -0
  54. lamindb/setup/__init__.py +2 -1
  55. lamindb/setup/_switch.py +16 -0
  56. lamindb/setup/errors/__init__.py +4 -0
  57. lamindb/setup/types/__init__.py +4 -0
  58. {lamindb-1.6.1.dist-info → lamindb-1.7.0.dist-info}/METADATA +5 -5
  59. {lamindb-1.6.1.dist-info → lamindb-1.7.0.dist-info}/RECORD +61 -44
  60. lamindb/models/core.py +0 -135
  61. {lamindb-1.6.1.dist-info → lamindb-1.7.0.dist-info}/LICENSE +0 -0
  62. {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="__lamindb__run__")
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
+ ]