Skip to content

Commit 2c85ee9

Browse files
committed
feat(model): res position unique index;
- Create a unique index for active resource positions.
1 parent 5bd2ef0 commit 2c85ee9

File tree

5 files changed

+41
-34
lines changed

5 files changed

+41
-34
lines changed

changes/9251.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Resource positions are now unique based on a `package_id,position` deferring unique constraint `con_package_resource_unique_position` on the resource table.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
"""Create con_package_resource_unique_position constraint
2+
to make resource positions unique per package.
3+
4+
Revision ID: e12e991f586b
5+
Revises: f7b64c701a10
6+
Create Date: 2026-02-10 18:26:31.122945
7+
8+
"""
9+
from alembic import op
10+
import sqlalchemy as sa
11+
12+
13+
# revision identifiers, used by Alembic.
14+
revision = 'e12e991f586b'
15+
down_revision = 'f7b64c701a10'
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade():
21+
op.create_unique_constraint(
22+
constraint_name='con_package_resource_unique_position',
23+
table_name='resource', columns=['package_id', 'position'],
24+
deferrable=True, initially="DEFERRED")
25+
print('Created "con_package_resource_unique_position"' \
26+
' constraint on resource table')
27+
28+
29+
def downgrade():
30+
op.drop_constraint(
31+
constraint_name='con_package_resource_unique_position',
32+
table_name='resource',
33+
type_='unique')
34+
print('Dropped "con_package_resource_unique_position"' \
35+
' constraint from resource table')

ckan/migration/versions/109_e12e991f586b_create_res_position_index.py

Lines changed: 0 additions & 29 deletions
This file was deleted.

ckan/model/resource.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from sqlalchemy.ext.orderinglist import ordering_list
1010
from sqlalchemy import orm
1111
from ckan.common import config
12-
from sqlalchemy import types, Column, Table, ForeignKey, Index
12+
from sqlalchemy import types, Column, Table, ForeignKey, Index, UniqueConstraint
1313
from typing_extensions import Self
1414

1515
import ckan.model.meta as meta
@@ -59,9 +59,9 @@
5959
Index('idx_package_resource_id', 'id'),
6060
Index('idx_package_resource_package_id', 'package_id'),
6161
Index('idx_package_resource_url', 'url'),
62-
Index('idx_package_resource_unique_position',
63-
Column('package_id'), Column('position'),
64-
unique=True, postgresql_where="(state = 'active'::text)")
62+
UniqueConstraint(Column('package_id'), Column('position'),
63+
name='con_package_resource_unique_position',
64+
deferrable=True, initially='deferred')
6565
)
6666

6767

ckan/tests/model/test_resource.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,4 @@ def test_resource_unique_positions(self):
7777
model.Session.commit()
7878

7979
err = e.value
80-
assert 'duplicate key value violates unique constraint "idx_package_resource_unique_position"' in str(err)
80+
assert 'duplicate key value violates unique constraint "con_package_resource_unique_position"' in str(err)

0 commit comments

Comments
 (0)