Skip to content

Commit 207fcab

Browse files
committed
add _self_ref_order field
1 parent d2015f4 commit 207fcab

3 files changed

Lines changed: 90 additions & 1 deletion

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Generated by Django 3.2.25 on 2026-04-22 10:53
2+
3+
import django.core.validators
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('morango', '0002_store_idx_morango_deserialize'),
11+
]
12+
13+
operations = [
14+
migrations.AddField(
15+
model_name='buffer',
16+
name='_self_ref_order',
17+
field=models.IntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(0)]),
18+
),
19+
migrations.AddField(
20+
model_name='store',
21+
name='_self_ref_order',
22+
field=models.IntegerField(blank=True, null=True, validators=[django.core.validators.MinValueValidator(0)]),
23+
),
24+
]

morango/models/core.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from functools import reduce
77

88
from django.core import exceptions
9+
from django.core.validators import MinValueValidator
910
from django.db import connection, models, router, transaction
1011
from django.db.models import F, Func, Max, Q, TextField, Value, signals
1112
from django.db.models.deletion import Collector
@@ -391,6 +392,9 @@ class AbstractStore(models.Model):
391392
conflicting_serialized_data = models.TextField(blank=True)
392393

393394
_self_ref_fk = models.CharField(max_length=32, blank=True)
395+
_self_ref_order = models.IntegerField(
396+
blank=True, null=True, validators=[MinValueValidator(0)]
397+
)
394398

395399
class Meta:
396400
abstract = True

tests/testapp/tests/models/test_core.py

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
import factory
44
import mock
5+
from django.core.exceptions import ValidationError
56
from django.test import TestCase, override_settings
67
from django.utils import timezone
78
from facility_profile.models import Facility, MyUser
89

910
from morango.constants import transfer_stages, transfer_statuses
1011
from morango.models.certificates import Filter
11-
from morango.models.core import DatabaseMaxCounter, Store, SyncSession, TransferSession
12+
from morango.models.core import Buffer, DatabaseMaxCounter, Store, SyncSession, TransferSession
1213
from morango.sync.controller import MorangoProfileController
1314

1415
from ..helpers import RecordMaxCounterFactory, StoreFactory
@@ -370,3 +371,63 @@ def test_deferred_clean_fields(self, mock_clean_fields):
370371
sync_filter = Filter("test")
371372
f.deferred_clean_fields(exclude=["test1"], sync_filter=sync_filter)
372373
mock_clean_fields.assert_called_once_with(exclude=["test1"], sync_filter=sync_filter)
374+
375+
376+
class AbstractStoreSelfRefOrderValidationTestCase(TestCase):
377+
def _store(self, self_ref_order):
378+
return Store(
379+
id=uuid.uuid4().hex,
380+
profile="facilitydata",
381+
serialized="{}",
382+
deleted=False,
383+
hard_deleted=False,
384+
last_saved_instance=uuid.uuid4().hex,
385+
last_saved_counter=1,
386+
partition="partition",
387+
source_id="source",
388+
model_name="model",
389+
_self_ref_order=self_ref_order,
390+
)
391+
392+
def _buffer(self, self_ref_order):
393+
sync_session = SyncSession.objects.create(
394+
id=uuid.uuid4().hex,
395+
profile="facilitydata",
396+
last_activity_timestamp=timezone.now(),
397+
)
398+
transfer_session = TransferSession.objects.create(
399+
id=uuid.uuid4().hex,
400+
sync_session=sync_session,
401+
push=True,
402+
last_activity_timestamp=timezone.now(),
403+
)
404+
return Buffer(
405+
transfer_session=transfer_session,
406+
model_uuid=uuid.uuid4().hex,
407+
profile="facilitydata",
408+
serialized="{}",
409+
deleted=False,
410+
hard_deleted=False,
411+
last_saved_instance=uuid.uuid4().hex,
412+
last_saved_counter=1,
413+
partition="partition",
414+
source_id="source",
415+
model_name="model",
416+
_self_ref_order=self_ref_order,
417+
)
418+
419+
def test_store_self_ref_order_allows_null(self):
420+
self._store(None).full_clean()
421+
422+
def test_store_self_ref_order_rejects_negative(self):
423+
store = self._store(-1)
424+
with self.assertRaises(ValidationError):
425+
store.full_clean()
426+
427+
def test_buffer_self_ref_order_allows_null(self):
428+
self._buffer(None).full_clean()
429+
430+
def test_buffer_self_ref_order_rejects_negative(self):
431+
buffer = self._buffer(-1)
432+
with self.assertRaises(ValidationError):
433+
buffer.full_clean()

0 commit comments

Comments
 (0)