Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1210 | source autoid | source update can up…
Browse files Browse the repository at this point in the history
…date autoid sequence
  • Loading branch information
snyaggarwal committed Jun 1, 2022
1 parent 2fa05bc commit f37ae2e
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 25 deletions.
12 changes: 12 additions & 0 deletions core/concepts/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,18 @@ def test_persist_new_with_autoid_sequential(self):
self.assertEqual(concept.mnemonic, '101')
self.assertEqual(concept.external_id, '5')

concept = Concept.persist_new({
**factory.build(dict, FACTORY_CLASS=ConceptFactory),
'mnemonic': None,
'parent': source,
'names': [LocalizedTextFactory.build(locale='en', name='English', locale_preferred=True)]
})

self.assertEqual(concept.errors, {})
self.assertIsNotNone(concept.id)
self.assertEqual(concept.mnemonic, '102')
self.assertEqual(concept.external_id, '6')

def test_persist_new_with_autoid_uuid(self):
source = OrganizationSourceFactory(
version=HEAD, autoid_concept_mnemonic='uuid', autoid_concept_external_id='uuid')
Expand Down
13 changes: 13 additions & 0 deletions core/mappings/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,19 @@ def test_persist_new_autoid_sequential(self):
self.assertEqual(mapping.mnemonic, '101')
self.assertEqual(mapping.external_id, '5')

mapping = Mapping.persist_new({
**factory.build(dict, FACTORY_CLASS=MappingFactory),
'from_concept': concept1,
'to_concept': concept2,
'map_type': 'same-as4',
'parent_id': source.id
}, source.created_by)

self.assertEqual(mapping.errors, {})
self.assertIsNotNone(mapping.id)
self.assertEqual(mapping.mnemonic, '102')
self.assertEqual(mapping.external_id, '6')

def test_persist_new_autoid_uuid(self):
source = OrganizationSourceFactory(
version=HEAD, autoid_mapping_mnemonic='uuid', autoid_mapping_external_id='uuid')
Expand Down
59 changes: 34 additions & 25 deletions core/sources/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django.db import models
from django.db.models import UniqueConstraint, F
from pydash import compact
from dirtyfields import DirtyFieldsMixin

from core.common.models import ConceptContainerModel
from core.common.services import PostgresQL
Expand All @@ -13,7 +14,7 @@
HIERARCHY_MEANINGS, AUTO_ID_CHOICES, AUTO_ID_SEQUENTIAL, AUTO_ID_UUID


class Source(ConceptContainerModel):
class Source(DirtyFieldsMixin, ConceptContainerModel):
DEFAULT_AUTO_ID_START_FROM = 1

es_fields = {
Expand Down Expand Up @@ -272,34 +273,42 @@ def save(
self, force_insert=False, force_update=False, using=None, update_fields=None
):
is_new = not self.id
dirty_fields = self.get_dirty_fields()

super().save(force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)

if self.id and self.is_head:
self.create_sequences() if is_new else self.update_sequences() # pylint: disable=expression-not-assigned

def update_sequences(self):
def should_update(is_seq, start_from):
return is_seq and start_from and start_from != 1

if should_update(self.is_sequential_mapping_mnemonic, self.autoid_mapping_mnemonic_start_from):
PostgresQL.update_seq(
self.mappings_mnemonic_seq_name, self.autoid_mapping_mnemonic_start_from
)
if should_update(self.is_sequential_mapping_external_id, self.autoid_mapping_external_id_start_from):
PostgresQL.update_seq(
self.mappings_external_id_seq_name, self.autoid_mapping_external_id_start_from
)
if should_update(self.is_sequential_concept_mnemonic, self.autoid_concept_mnemonic_start_from):
PostgresQL.update_seq(
self.concepts_mnemonic_seq_name, self.autoid_concept_mnemonic_start_from
)
if should_update(self.is_sequential_concept_external_id, self.autoid_concept_external_id_start_from):
PostgresQL.update_seq(
self.concepts_external_id_seq_name, self.autoid_concept_external_id_start_from
)

def create_sequences(self):
if is_new:
self.__create_sequences()
else:
self.__update_sequences(dirty_fields)

def __update_sequences(self, dirty_fields=[]):
def should_update(is_seq, field, start_from):
return is_seq and start_from and field in dirty_fields

if should_update(
self.is_sequential_mapping_mnemonic, 'autoid_mapping_mnemonic_start_from',
self.autoid_mapping_mnemonic_start_from
):
PostgresQL.update_seq(self.mappings_mnemonic_seq_name, self.autoid_mapping_mnemonic_start_from)
if should_update(
self.is_sequential_mapping_external_id, 'autoid_mapping_external_id_start_from',
self.autoid_mapping_external_id_start_from
):
PostgresQL.update_seq(self.mappings_external_id_seq_name, self.autoid_mapping_external_id_start_from)
if should_update(
self.is_sequential_concept_mnemonic, 'autoid_concept_mnemonic_start_from',
self.autoid_concept_mnemonic_start_from
):
PostgresQL.update_seq(self.concepts_mnemonic_seq_name, self.autoid_concept_mnemonic_start_from)
if should_update(
self.is_sequential_concept_external_id, 'autoid_concept_external_id_start_from',
self.autoid_concept_external_id_start_from
):
PostgresQL.update_seq(self.concepts_external_id_seq_name, self.autoid_concept_external_id_start_from)

def __create_sequences(self):
if self.is_sequential_concept_mnemonic:
PostgresQL.create_seq(
self.concepts_mnemonic_seq_name, 'sources.uri', 0, self.autoid_concept_mnemonic_start_from
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,4 @@ markdown==3.3.7
mock==4.0.3
django-request-logging==0.7.3
django-cid==2.2
django-dirtyfields==1.8.1

0 comments on commit f37ae2e

Please sign in to comment.