Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1683 | Source setting for autoid uuid for l…
Browse files Browse the repository at this point in the history
…ocales
  • Loading branch information
snyaggarwal committed Dec 9, 2023
1 parent 422e18d commit fe93d74
Show file tree
Hide file tree
Showing 6 changed files with 101 additions and 1 deletion.
4 changes: 4 additions & 0 deletions core/concepts/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -620,9 +620,13 @@ def create_new_versions_for_removed_parents(self, uris):
def set_locales(self, locales, locale_klass):
if not self.id:
return # pragma: no cover
is_name = locale_klass == ConceptName
for locale in locales:
new_locale = locale.clone() if isinstance(locale, locale_klass) else locale_klass.build(locale)
new_locale.concept_id = self.id
if not new_locale.external_id:
new_locale.external_id = self.parent.concept_name_external_id_next if is_name \
else self.parent.concept_description_external_id_next
new_locale.save()
new_locale.set_checksums()

Expand Down
57 changes: 57 additions & 0 deletions core/concepts/tests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,10 +280,67 @@ def test_persist_new_with_autoid_uuid(self):
self.assertIsNotNone(concept2.id)
self.assertTrue(len(concept2.mnemonic), 36)
self.assertTrue(len(concept2.external_id), 36)
self.assertIsNone(concept2.names.first().external_id)

self.assertNotEqual(concept1.mnemonic, concept2.mnemonic)
self.assertNotEqual(concept1.external_id, concept2.external_id)

def test_persist_new_with_locale_autoid_uuid(self):
source = OrganizationSourceFactory(
version=HEAD, autoid_concept_mnemonic='uuid', autoid_concept_external_id='uuid',
autoid_concept_name_external_id='uuid', autoid_concept_description_external_id='uuid'
)
concept1 = Concept.persist_new({
**factory.build(dict, FACTORY_CLASS=ConceptFactory), 'parent': source, 'mnemonic': None,
'names': [ConceptNameFactory.build(locale='en', name='English', locale_preferred=True)],
'descriptions': [ConceptDescriptionFactory.build(locale='en', name='English', locale_preferred=True)]
})

self.assertEqual(concept1.errors, {})
self.assertIsNotNone(concept1.id)
self.assertTrue(len(concept1.mnemonic), 36)
self.assertTrue(len(concept1.external_id), 36)
self.assertTrue(len(concept1.names.first().external_id), 36)
self.assertTrue(len(concept1.descriptions.first().external_id), 36)

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

self.assertEqual(concept2.errors, {})
self.assertIsNotNone(concept2.id)
self.assertTrue(len(concept2.mnemonic), 36)
self.assertTrue(len(concept2.external_id), 36)
self.assertTrue(len(concept2.names.first().external_id), 36)
self.assertTrue(len(concept2.descriptions.first().external_id), 36)

self.assertNotEqual(concept1.mnemonic, concept2.mnemonic)
self.assertNotEqual(concept1.external_id, concept2.external_id)
self.assertNotEqual(concept1.names.first().external_id, concept2.names.first().external_id)
self.assertNotEqual(concept1.descriptions.first().external_id, concept2.descriptions.first().external_id)

concept3 = Concept.persist_new({
**factory.build(dict, FACTORY_CLASS=ConceptFactory), 'parent': source, 'mnemonic': None,
'names': [
ConceptNameFactory.build(
locale='en', name='English', locale_preferred=True, external_id='name-ext-id')
],
'descriptions': [
ConceptDescriptionFactory.build(
locale='en', name='English', locale_preferred=True, external_id='desc-ext-id')
]
})

self.assertEqual(concept3.errors, {})
self.assertTrue(concept3.names.first().external_id, 'name-ext-id')
self.assertTrue(concept3.descriptions.first().external_id, 'desc-ext-id')

def test_hierarchy_one_parent_child(self):
parent_concept = ConceptFactory(
names=[ConceptNameFactory.build(locale='en', name='English', locale_preferred=True)])
Expand Down
3 changes: 3 additions & 0 deletions core/sources/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,6 @@
(AUTO_ID_SEQUENTIAL, 'Sequential'),
(AUTO_ID_UUID, 'UUID')
)
LOCALE_EXTERNAL_AUTO_ID_CHOICES = (
(AUTO_ID_UUID, 'UUID'),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.2.4 on 2023-12-09 03:39

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('sources', '0039_source_checksums'),
]

operations = [
migrations.AddField(
model_name='source',
name='autoid_concept_description_external_id',
field=models.CharField(blank=True, choices=[('uuid', 'UUID')], max_length=10, null=True),
),
migrations.AddField(
model_name='source',
name='autoid_concept_name_external_id',
field=models.CharField(blank=True, choices=[('uuid', 'UUID')], max_length=10, null=True),
),
]
14 changes: 13 additions & 1 deletion core/sources/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
from core.common.validators import validate_non_negative
from core.concepts.models import ConceptName, Concept
from core.sources.constants import SOURCE_TYPE, SOURCE_VERSION_TYPE, HIERARCHY_ROOT_MUST_BELONG_TO_SAME_SOURCE, \
HIERARCHY_MEANINGS, AUTO_ID_CHOICES, AUTO_ID_SEQUENTIAL, AUTO_ID_UUID
HIERARCHY_MEANINGS, AUTO_ID_CHOICES, AUTO_ID_SEQUENTIAL, AUTO_ID_UUID, LOCALE_EXTERNAL_AUTO_ID_CHOICES


class Source(DirtyFieldsMixin, ConceptContainerModel):
Expand Down Expand Up @@ -85,6 +85,10 @@ class Meta:
default=DEFAULT_AUTO_ID_START_FROM, validators=[validate_non_negative])
autoid_mapping_external_id_start_from = models.IntegerField(
default=DEFAULT_AUTO_ID_START_FROM, validators=[validate_non_negative])
autoid_concept_name_external_id = models.CharField(
null=True, blank=True, choices=LOCALE_EXTERNAL_AUTO_ID_CHOICES, max_length=10)
autoid_concept_description_external_id = models.CharField(
null=True, blank=True, choices=LOCALE_EXTERNAL_AUTO_ID_CHOICES, max_length=10)

OBJECT_TYPE = SOURCE_TYPE
OBJECT_VERSION_TYPE = SOURCE_VERSION_TYPE
Expand Down Expand Up @@ -143,6 +147,14 @@ def concept_mnemonic_next(self):
def concept_external_id_next(self):
return self.get_resource_next_attr_id(self.autoid_concept_external_id, self.concepts_external_id_seq_name)

@property
def concept_name_external_id_next(self):
return self.get_resource_next_attr_id(self.autoid_concept_name_external_id, None)

@property
def concept_description_external_id_next(self):
return self.get_resource_next_attr_id(self.autoid_concept_description_external_id, None)

@property
def mapping_mnemonic_next(self):
try:
Expand Down
1 change: 1 addition & 0 deletions core/sources/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,7 @@ def prepare_object(self, validated_data, instance=None):
'autoid_mapping_mnemonic', 'autoid_mapping_external_id',
'autoid_concept_mnemonic_start_from', 'autoid_concept_external_id_start_from',
'autoid_mapping_mnemonic_start_from', 'autoid_mapping_external_id_start_from',
'autoid_concept_name_external_id', 'autoid_concept_description_external_id'
]:
setattr(source, attr, validated_data.get(attr, get(source, attr)))
for attr in ['jurisdiction', 'identifier', 'contact', 'meta']:
Expand Down

0 comments on commit fe93d74

Please sign in to comment.