Skip to content

Commit

Permalink
Restore primary key field defaults and support for create() #10958
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobtylerwalls committed Feb 18, 2025
1 parent 7362455 commit bc800e3
Show file tree
Hide file tree
Showing 10 changed files with 817 additions and 393 deletions.
7 changes: 7 additions & 0 deletions arches/app/models/functions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from django.db import models


class UUID4(models.Func):
function = "uuid_generate_v4"
arity = 0
output_field = models.UUIDField()
95 changes: 54 additions & 41 deletions arches/app/models/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
# -*- coding: utf-8 -*-


import codecs
import os
import uuid
import codecs
import django.contrib.gis.db.models.fields
from django.core import management

from django.contrib.postgres.fields import JSONField
from django.db import migrations, models
from arches.db.migration_operations.extras import (
CreateExtension,
CreateAutoPopulateUUIDField,
CreateFunction,
)

from arches.app.models.system_settings import settings
from arches.db.migration_operations.extras import CreateExtension, CreateFunction


def get_sql_string_from_file(pathtofile):
Expand Down Expand Up @@ -108,6 +101,14 @@ def make_permissions(apps, schema_editor, with_create_permissions=True):
admin_user.groups.add(guest_group)


# For historical purposes only.
# UUID4 exists in arches.app.models.functions for general use.
class UUID1(models.Func):
function = "uuid_generate_v1"
arity = 0
output_field = models.UUIDField()


class Migration(migrations.Migration):

dependencies = [
Expand Down Expand Up @@ -201,7 +202,9 @@ class Migration(migrations.Migration):
(
"graphid",
models.UUIDField(
default=uuid.uuid1, serialize=False, primary_key=True
db_default=UUID1(),
serialize=False,
primary_key=True,
),
),
("name", models.TextField(null=True, blank=True)),
Expand Down Expand Up @@ -237,7 +240,9 @@ class Migration(migrations.Migration):
(
"cardid",
models.UUIDField(
default=uuid.uuid1, serialize=False, primary_key=True
db_default=UUID1(),
serialize=False,
primary_key=True,
),
),
("name", models.TextField(null=True, blank=True)),
Expand Down Expand Up @@ -295,7 +300,9 @@ class Migration(migrations.Migration):
(
"conceptid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("legacyoid", models.TextField(unique=True)),
Expand Down Expand Up @@ -380,7 +387,9 @@ class Migration(migrations.Migration):
(
"edgeid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("name", models.TextField(blank=True, null=True)),
Expand Down Expand Up @@ -408,7 +417,9 @@ class Migration(migrations.Migration):
(
"editlogid",
models.UUIDField(
default=uuid.uuid1, serialize=False, primary_key=True
db_default=UUID1(),
serialize=False,
primary_key=True,
),
),
("resourceclassid", models.TextField(null=True, blank=True)),
Expand Down Expand Up @@ -452,7 +463,9 @@ class Migration(migrations.Migration):
(
"formid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("title", models.TextField(blank=True, null=True)),
Expand Down Expand Up @@ -571,7 +584,9 @@ class Migration(migrations.Migration):
(
"nodeid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("name", models.TextField()),
Expand Down Expand Up @@ -602,7 +617,9 @@ class Migration(migrations.Migration):
(
"nodegroupid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("legacygroupid", models.TextField(blank=True, null=True)),
Expand Down Expand Up @@ -684,7 +701,9 @@ class Migration(migrations.Migration):
(
"relationid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
(
Expand Down Expand Up @@ -786,7 +805,9 @@ class Migration(migrations.Migration):
(
"resource2resourceid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
(
Expand Down Expand Up @@ -823,7 +844,9 @@ class Migration(migrations.Migration):
(
"resourceinstanceid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("legacyid", models.TextField(blank=True, unique=True, null=True)),
Expand Down Expand Up @@ -866,7 +889,9 @@ class Migration(migrations.Migration):
(
"tileid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("data", JSONField(blank=True, db_column="tiledata", null=True)),
Expand Down Expand Up @@ -909,7 +934,9 @@ class Migration(migrations.Migration):
(
"valueid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("value", models.TextField()),
Expand Down Expand Up @@ -951,7 +978,9 @@ class Migration(migrations.Migration):
(
"widgetid",
models.UUIDField(
default=uuid.uuid1, primary_key=True, serialize=False
db_default=UUID1(),
primary_key=True,
serialize=False,
),
),
("name", models.TextField()),
Expand Down Expand Up @@ -1224,22 +1253,6 @@ class Migration(migrations.Migration):
name="functionxgraph",
unique_together={("function", "graph")},
),
CreateAutoPopulateUUIDField("graphs", ["graphid"]),
CreateAutoPopulateUUIDField("cards", ["cardid"]),
CreateAutoPopulateUUIDField("concepts", ["conceptid"]),
CreateAutoPopulateUUIDField("edges", ["edgeid"]),
CreateAutoPopulateUUIDField("edit_log", ["editlogid"]),
CreateAutoPopulateUUIDField("forms", ["formid"]),
CreateAutoPopulateUUIDField("node_groups", ["nodegroupid"]),
CreateAutoPopulateUUIDField("nodes", ["nodeid"]),
CreateAutoPopulateUUIDField("relations", ["relationid"]),
CreateAutoPopulateUUIDField(
"resource_2_resource_constraints", ["resource2resourceid"]
),
CreateAutoPopulateUUIDField("resource_instances", ["resourceinstanceid"]),
CreateAutoPopulateUUIDField("tiles", ["tileid"]),
CreateAutoPopulateUUIDField("values", ["valueid"]),
CreateAutoPopulateUUIDField("widgets", ["widgetid"]),
migrations.RunSQL(
"""
ALTER TABLE nodes ADD CONSTRAINT nodes_ddatatypes_fk FOREIGN KEY (datatype)
Expand Down
110 changes: 110 additions & 0 deletions arches/app/models/migrations/10957_refactor_relations_rule.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# Generated by Django 5.2a1 on 2025-02-12 10:28

import django.db.models.functions.text
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("models", "11725_make_tiledata_not_nullable"),
]

operations = [
migrations.RunSQL(
"""
DROP RULE relations_check_insert ON relations;
DROP RULE relations_check_update ON relations;
DROP FUNCTION public.__arches_check_dup_relations(
p_conceptid1 uuid,
p_conceptid2 uuid,
p_relationtype text);
""",
"""
CREATE OR REPLACE FUNCTION public.__arches_check_dup_relations(
p_conceptid1 uuid,
p_conceptid2 uuid,
p_relationtype text)
RETURNS text
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
declare
v_return text;
BEGIN
IF
( SELECT count(*) from relations
WHERE 1=1
AND conceptidfrom = p_conceptid1
AND conceptidto = p_conceptid2
AND relationtype = p_relationtype ) > 0
THEN v_return = 'duplicate';
ELSIF
( SELECT count(*) from relations
WHERE 1=1
AND conceptidfrom = p_conceptid2
AND conceptidto = p_conceptid1
AND relationtype = p_relationtype ) > 0
THEN v_return = 'duplicate';
ELSE v_return = 'unique';
END IF;
RETURN v_return;
END;
$BODY$;
CREATE OR REPLACE RULE relations_check_insert AS ON INSERT TO relations
WHERE (select * from __arches_check_dup_relations(new.conceptidfrom,new.conceptidto,new.relationtype)) = 'duplicate'
DO INSTEAD NOTHING;
CREATE OR REPLACE RULE relations_check_update AS ON UPDATE TO relations
WHERE (select * from __arches_check_dup_relations(new.conceptidfrom,new.conceptidto,new.relationtype)) = 'duplicate'
DO INSTEAD NOTHING;
""",
),
migrations.AlterUniqueTogether(
name="relation",
unique_together=set(),
),
migrations.AddConstraint(
model_name="relation",
constraint=models.UniqueConstraint(
models.Case(
models.When(
django.db.models.expressions.CombinedExpression(
models.F("conceptfrom"),
"<",
models.F("conceptto"),
output_field=models.BooleanField(),
),
then=django.db.models.functions.text.Concat(
models.F("conceptfrom"),
models.Value(","),
models.F("conceptto"),
output_field=models.TextField(),
),
),
default=django.db.models.functions.text.Concat(
models.F("conceptto"),
models.Value(","),
models.F("conceptfrom"),
output_field=models.TextField(),
),
),
models.F("relationtype"),
name="unique_relation_bidirectional",
),
),
]
Loading

0 comments on commit bc800e3

Please sign in to comment.