From 3e8e6e6622b3b4f8ad02a1fb0060a93d37d89bb6 Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Sat, 18 Apr 2026 19:16:11 -0300 Subject: [PATCH 1/4] feat(sources): add markdown changelog output * Add enriched changelog flow that fetches concept metadata for human-readable output * Generate structured Markdown changelog with summary, contents, and sections for concepts, names, descriptions, translations, and mappings * Expose markdown format via source version diff endpoint using output=markdown while keeping JSON as default * Normalize version ordering by creation date to ensure older release is treated as version1 --- changelog.md | 2091 ----------------- core/common/checksums.py | 59 +- core/common/tasks.py | 20 +- core/sources/changelog_markdown.py | 906 +++++++ core/sources/models.py | 4 +- core/sources/tests/test_changelog_markdown.py | 370 +++ core/sources/views.py | 18 +- docker-compose.override.yml.bak | 7 + 8 files changed, 1370 insertions(+), 2105 deletions(-) delete mode 100644 changelog.md create mode 100644 core/sources/changelog_markdown.py create mode 100644 core/sources/tests/test_changelog_markdown.py diff --git a/changelog.md b/changelog.md deleted file mode 100644 index 84a9b8be..00000000 --- a/changelog.md +++ /dev/null @@ -1,2091 +0,0 @@ -##### 2.3.141 - Fri Oct 11 06:55:38 2024 +0000 -- Reverting local changes -- Feedback | fixing sorting -##### 2.3.140 - Fri Oct 11 04:36:11 2024 +0000 -- Importers | Test for partial concept (extras) update -##### 2.3.139 - Fri Oct 11 02:40:19 2024 +0000 -- Errbit | fixing clone mapping -##### 2.3.138 - Tue Oct 8 02:42:26 2024 +0000 -- Bug | Repo new version to also update children counts -##### 2.3.137 - Mon Oct 7 01:54:54 2024 +0000 -- [OpenConceptLab/ocl_issues#1936](https://github.com/OpenConceptLab/ocl_issues/issues/1936) | Adding more things to Collection brief serializer -- [OpenConceptLab/ocl_issues#1936](https://github.com/OpenConceptLab/ocl_issues/issues/1936) | Added OCL Joined and Org Joined events | management task to run on bootup to seed missed events -- [OpenConceptLab/ocl_issues#1776](https://github.com/OpenConceptLab/ocl_issues/issues/1776) | fixing tests -- [OpenConceptLab/ocl_issues#1776](https://github.com/OpenConceptLab/ocl_issues/issues/1776) | adding entity's description to events responses -##### 2.3.136 - Mon Sep 30 06:34:22 2024 +0000 -- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | fixing typo -##### 2.3.135 - Mon Sep 30 05:19:30 2024 +0000 -- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | env var for username to get highlighted events from -##### 2.3.134 - Fri Sep 27 07:50:34 2024 +0000 -- [OpenConceptLab/ocl_issues#1921](https://github.com/OpenConceptLab/ocl_issues/issues/1921) | OpenMRS custom validation schema | excluding empty name type -- Revert "OpenConceptLab/ocl_issues#1921 | OpenMRS custom validation schema | excluding Synonyms in uniq check" -- [OpenConceptLab/ocl_issues#1921](https://github.com/OpenConceptLab/ocl_issues/issues/1921) | OpenMRS custom validation schema | excluding Synonyms in uniq check -##### 2.3.133 - Thu Sep 26 07:56:40 2024 +0000 -- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | Guest Events API to redirect to user's events API if requested by authenticated user -- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | Guest events are admin/superuser's non-user following's create/release/follow events -- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | fixing pylint and tests -- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | Anonymouse user events API | Repo version release event -##### 2.3.132 - Thu Sep 19 04:21:01 2024 +0000 -- Fixing typo and removing print -- [OpenConceptLab/ocl_issues#1791](https://github.com/OpenConceptLab/ocl_issues/issues/1791) Fix listing dependencies in progress -- [OpenConceptLab/ocl_issues#1922](https://github.com/OpenConceptLab/ocl_issues/issues/1922) Fix overwriting ConceptMap version, OpenConceptLab/ocl_issues#1917 Add S3 storage support -- [OpenConceptLab/ocl_issues#1917](https://github.com/OpenConceptLab/ocl_issues/issues/1917) Add S3 storage support for new bulk import -- [OpenConceptLab/ocl_issues#1862](https://github.com/OpenConceptLab/ocl_issues/issues/1862) | User events API with different scopes -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing followers in user details view -##### 2.3.131 - Wed Sep 4 02:54:19 2024 +0000 -- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | fixing tests | mocking indexing job -- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | fixing tests | mocking indexing job -- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | new version for collection to mantain tasks -- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | refactoring seed new version task -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing pylint error -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | User events vs org events criteria | org events includes where org is object or referenced object -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | Follow model type -##### 2.3.130 - Fri Aug 30 06:40:57 2024 +0000 -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | can follow any entity -- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | source version different states/tasks -- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | released source version creation indexing refactoring -- [OpenConceptLab/ocl_issues#1791](https://github.com/OpenConceptLab/ocl_issues/issues/1791) Fixing paths for NPM support -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | Event | saving referenced object in case it gets deleted -##### 2.3.129 - Wed Aug 21 03:38:06 2024 +0000 -- Org delete | fixing test for sync delete S3 files -- Org delete from importer to delete repos cached imports in sync -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing test -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | events for different actions -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | events creation on source/org create and user follow/unfollow and obj representation -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing pylint errors -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | events model and API -- bundles.__init__.py | added VERSION -- [OpenConceptLab/ocl_issues#1791](https://github.com/OpenConceptLab/ocl_issues/issues/1791) Adding forgotten file -- [OpenConceptLab/ocl_issues#1791](https://github.com/OpenConceptLab/ocl_issues/issues/1791) Add support for importing NPM packages -##### 2.3.128 - Thu Aug 8 03:50:51 2024 +0000 -- [OpenConceptLab/ocl_issues#1912](https://github.com/OpenConceptLab/ocl_issues/issues/1912) | renamed detailed_summary to message | only json result -- Pointing to specific ocldev release -##### 2.3.127 - Wed Aug 7 05:38:05 2024 +0000 -- [OpenConceptLab/ocl_issues#1912](https://github.com/OpenConceptLab/ocl_issues/issues/1912) | Import result | responding with json/report/summary result | correcting serialization -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing pylint -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing pylint -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | API for user unfollow -- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | APIs for user followers/following -##### 2.3.126 - Mon Aug 5 04:35:21 2024 +0000 -- Test for importing existing mapping to mark it retired -##### 2.3.125 - Thu Aug 1 03:35:23 2024 +0000 -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing tests -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | removed dead test -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing pylint -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing pylint -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | using ocldev checksum to generate checksums -- Update README.md (#733) -- removed unused import -- [OpenConceptLab/ocl_issues#1907](https://github.com/OpenConceptLab/ocl_issues/issues/1907) | importer | reference delete with strict check -- Repo summary view | Reusing mixins | removed unused base class -- [OpenConceptLab/ocl_issues#1907](https://github.com/OpenConceptLab/ocl_issues/issues/1907) | fixing tests -- [OpenConceptLab/ocl_issues#1907](https://github.com/OpenConceptLab/ocl_issues/issues/1907) | importer | reference delete -##### 2.3.124 - Fri Jul 26 03:14:15 2024 +0000 -- [OpenConceptLab/ocl_issues#1617](https://github.com/OpenConceptLab/ocl_issues/issues/1617) | added bio field on user -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | removed redundant python script -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | Checksum | ignoring locale_preferred=false, name_type/description_type empty -##### 2.3.123 - Fri Jul 19 04:18:14 2024 +0000 -- Collection references put | list request -##### 2.3.122 - Wed Jul 17 06:25:10 2024 +0000 -- Search criteria to apply leading wildcard for code fields -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | JS checksum generate | correcting sorting and encoding to match with python -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | checksum to conder locale's external_id -##### 2.3.121 - Mon Jul 15 02:14:16 2024 +0000 -- fix: update ES_ENABLE_SNIFFING environment variable (#732) -- chore: add elastic search sniffing configuration option setting. (#731) -##### 2.3.120 - Wed Jul 10 10:12:20 2024 +0000 -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing test -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | consider external_id from locale for checksum | remove empty object values from checksums | remove empty hierarchy from checksum -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | cleanup fields to treat float and int same if there is no decimal value -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | mapping sort weight to float for checksum generation -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | mapping sort weight to float for checksum generation -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | printing fields used for checksum -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing test -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | script to generate concept/mapping standard/smart checksum -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | script to generate concept/mapping standard/smart checksum -- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing typo -##### 2.3.119 - Mon Jul 8 07:03:40 2024 +0000 -- [OpenConceptLab/ocl_issues#1617](https://github.com/OpenConceptLab/ocl_issues/issues/1617) | API to redirect to SSO reset password url -##### 2.3.118 - Wed Jul 3 06:00:38 2024 +0000 -- [OpenConceptLab/ocl_issues#1829](https://github.com/OpenConceptLab/ocl_issues/issues/1829) | fixing pylint -- [OpenConceptLab/ocl_issues#1829](https://github.com/OpenConceptLab/ocl_issues/issues/1829) | Source update to only update is_active and public_access on children if it changed -- [OpenConceptLab/ocl_issues#1829](https://github.com/OpenConceptLab/ocl_issues/issues/1829) | Source update to only update is_active on children if it changed -- [OpenConceptLab/ocl_issues#1829](https://github.com/OpenConceptLab/ocl_issues/issues/1829) | Source update to only update is_active on children if it changed -##### 2.3.117 - Tue Jul 2 10:09:20 2024 +0000 -- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion concept cascade view -##### 2.3.116 - Tue Jul 2 06:23:48 2024 +0000 -- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion concept cascade view | fixing conflict with uri param -- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion concept cascade view | refactoring and merging views -- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion conflicting concepts -- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion conflicting concepts resolution using uri param -##### 2.3.115 - Thu Jun 27 03:48:12 2024 +0000 -- Can do OR search for exact match -##### 2.3.114 - Mon Jun 24 04:59:56 2024 +0000 -- Source mappings summary | including self as to/from source -##### 2.3.113 - Mon Jun 24 02:56:14 2024 +0000 -- Source mappings summary | fixing tests -- Source mappings summary | not removing self -- [OpenConceptLab/ocl_issues#1845](https://github.com/OpenConceptLab/ocl_issues/issues/1845) | fixing empty exclude references call -##### 2.3.112 - Mon Jun 17 11:43:43 2024 +0000 -- fixing pylint -- Errbit | handling ValueError in mapping create | to/mapping source set as collection -##### 2.3.111 - Fri Jun 14 08:55:03 2024 +0000 -- [OpenConceptLab/ocl_issues#1850](https://github.com/OpenConceptLab/ocl_issues/issues/1850) | fixing pylint -- [OpenConceptLab/ocl_issues#1850](https://github.com/OpenConceptLab/ocl_issues/issues/1850) | accepting expression in new format without system/valueset | reference can accept extras filters -##### 2.3.110 - Wed Jun 12 09:30:06 2024 +0000 -- [OpenConceptLab/ocl_issues#1849](https://github.com/OpenConceptLab/ocl_issues/issues/1849) | handle too long input for search -##### 2.3.109 - Mon Jun 10 09:40:38 2024 +0000 -- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | | expanding verbosity levels -##### 2.3.108 - Mon Jun 10 08:22:30 2024 +0000 -- FHIR Errbit | unsupported query param to return http400 exception -##### 2.3.107 - Mon Jun 10 04:07:23 2024 +0000 -- Errbit | CodeSystem List | text field serialization fix -- Errbit | ConceptMap List | mappings without from/to-source-url fix -##### 2.3.106 - Mon Jun 3 11:24:21 2024 +0000 -- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | / | version1 is older and vesion2 is newer -- Importer | save summary with more details -##### 2.3.105 - Thu May 30 02:35:19 2024 +0000 -- [OpenConceptLab/ocl_issues#1842](https://github.com/OpenConceptLab/ocl_issues/issues/1842) | root view | correcting FHIR URLs -##### 2.3.104 - Tue May 28 12:04:18 2024 +0000 -- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | generate checksums for latest concept/mapping versions of repo -##### 2.3.103 - Tue May 28 10:42:44 2024 +0000 -- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | fixing checksum check and tests -- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | checksums comprison to prevent duplicate version creation fix -- Import json result handling parse exception -##### 2.3.102 - Tue May 21 12:08:05 2024 +0000 -- [OpenConceptLab/ocl_issues#1839](https://github.com/OpenConceptLab/ocl_issues/issues/1839) Add code searchParam for CodeSystem (fix) -- [OpenConceptLab/ocl_issues#1839](https://github.com/OpenConceptLab/ocl_issues/issues/1839) Add code searchParam for CodeSystem -##### 2.3.101 - Tue May 21 08:09:54 2024 +0000 -- Errbit | CodeSystem serializer text field | literal eval try catch -- [OpenConceptLab/ocl_issues#1841](https://github.com/OpenConceptLab/ocl_issues/issues/1841) | not using any pattern for kwargs in url | repo version can accept special characters | uri will be encoded -##### 2.3.100 - Mon May 20 10:38:46 2024 +0000 -- Code System validateCode | fixing errbit -- [OpenConceptLab/ocl_issues#1840](https://github.com/OpenConceptLab/ocl_issues/issues/1840) CodeSystem listing should include total -- [OpenConceptLab/ocl_issues#1833](https://github.com/OpenConceptLab/ocl_issues/issues/1833) Fix import read timeout -##### 2.3.99 - Thu May 16 11:10:58 2024 +0000 -- [OpenConceptLab/ocl_issues#1833](https://github.com/OpenConceptLab/ocl_issues/issues/1833) 502 Bad Gateway for Large CodeSystem resources -- Increase gunicorn request timeout (fix) -- Increase gunicorn request timeout -##### 2.3.98 - Thu May 16 02:57:00 2024 +0000 -Wed Mar 6 07:57:03 2024 +0530 -Mon Dec 11 15:18:33 2023 +0530 -Wed Aug 2 08:28:38 2023 +0530 -- monthly resource report can accept an email -- [OpenConceptLab/ocl_issues#1237](https://github.com/OpenConceptLab/ocl_issues/issues/1237) FHIR Capability Statement -##### 2.3.97 - Wed May 15 14:28:23 2024 +0000 -- [OpenConceptLab/ocl_issues#1237](https://github.com/OpenConceptLab/ocl_issues/issues/1237) FHIR Capability Statement -- [OpenConceptLab/ocl_issues#1833](https://github.com/OpenConceptLab/ocl_issues/issues/1833) | refactoring code system create with concepts to do indexing async -- Removed checksums toggle -- Removed print -- [OpenConceptLab/ocl_issues#1834](https://github.com/OpenConceptLab/ocl_issues/issues/1834) | Collection Reference filter 'property' to accept any value | reference evaluation to ignore random values -- [OpenConceptLab/ocl_issues#1836](https://github.com/OpenConceptLab/ocl_issues/issues/1836) FHIR ConceptMap fails to import due to 'null' map_type -- [OpenConceptLab/ocl_issues#1834](https://github.com/OpenConceptLab/ocl_issues/issues/1834) | Test for Valueset with just system and no filter in include -##### 2.3.96 - Fri May 10 02:30:00 2024 +0000 -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing typo -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing typo -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | task list view cannot return result -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | task result needs to be JSON -##### 2.3.95 - Thu May 9 02:44:18 2024 +0000 -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing pylint -- [OpenConceptLab/ocl_issues#1815](https://github.com/OpenConceptLab/ocl_issues/issues/1815) | added missed migration -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | using operations | refactoring and added tests -##### 2.3.94 - Mon May 6 04:04:01 2024 +0000 -Wed Mar 6 07:57:03 2024 +0530 -Mon Dec 11 15:18:33 2023 +0530 -Wed Aug 2 08:28:38 2023 +0530 -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing typo -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | making it async -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | updated result keys and added diff with verbosity -- Refactoring method names -- [OpenConceptLab/ocl_issues#1815](https://github.com/OpenConceptLab/ocl_issues/issues/1815) FHIR CodeSystem Fixes -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | fixing duplicates -##### 2.3.93 - Fri May 3 10:56:48 2024 +0000 -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | fixing pylint -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | using smart changed before changed -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing task get view -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | checksum save should not trigger indexing -##### 2.3.92 - Thu May 2 11:46:11 2024 +0000 -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing pylint -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing typo -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | added task result serializer -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | moving changelog/diff to async task -- [OpenConceptLab/ocl_issues#1761](https://github.com/OpenConceptLab/ocl_issues/issues/1761) | fixing middleware and pylint -- [OpenConceptLab/ocl_issues#1825](https://github.com/OpenConceptLab/ocl_issues/issues/1825) | fixing tests -- [OpenConceptLab/ocl_issues#1825](https://github.com/OpenConceptLab/ocl_issues/issues/1825) | fixing pylint -- [OpenConceptLab/ocl_issues#1825](https://github.com/OpenConceptLab/ocl_issues/issues/1825) | reference errors are more description with conflicting concept/name/reference -- [OpenConceptLab/ocl_issues#1761](https://github.com/OpenConceptLab/ocl_issues/issues/1761) Add FHIR xml support -- Fixing sort without search -##### 2.3.91 - Tue Apr 30 04:08:33 2024 +0000 -- sort with search should work -##### 2.3.90 - Mon Apr 29 05:39:07 2024 +0000 -Wed Mar 6 07:57:03 2024 +0530 -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing pylint -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | celery tasks cleanup job to remove any task older than 7 days -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | celery tasks to not store args and store result as str and not json -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog to reflect correct mappings in concepts -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog to reflect concepts with only mappings changes -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog of two source versions -##### 2.3.89 - Wed Apr 24 05:37:40 2024 +0000 -Wed Mar 6 07:57:03 2024 +0530 -Mon Dec 11 15:18:33 2023 +0530 -Wed Aug 2 08:28:38 2023 +0530 -- [OpenConceptLab/ocl_issues#1824](https://github.com/OpenConceptLab/ocl_issues/issues/1824) | Reference transform extensional -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing pylint -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | added task post run signal to close db connections -##### 2.3.88 - Tue Apr 23 02:59:09 2024 +0000 -Wed Mar 6 07:57:03 2024 +0530 -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | using SHA-256 to fix the queue for same user and import queue -##### 2.3.87 - Thu Apr 4 05:42:46 2024 +0000 -Wed Mar 6 07:57:03 2024 +0530 -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing queue filtering -- Source/Collection | search by full_name and correcting other attributes -- Upgrading to django 4.2.11 -##### 2.3.86 - Wed Apr 3 06:48:06 2024 +0000 -Wed Mar 6 07:57:03 2024 +0530 -- Merge branch 'dev' -- [OpenConceptLab/ocl_issues#1817](https://github.com/OpenConceptLab/ocl_issues/issues/1817) | fixing pylint -- [OpenConceptLab/ocl_issues#1817](https://github.com/OpenConceptLab/ocl_issues/issues/1817) | fixing test -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | seralizing results of task -- [OpenConceptLab/ocl_issues#1742](https://github.com/OpenConceptLab/ocl_issues/issues/1742) | resolve to return source/collection response for HEAD version -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | removed unused flower task serializer -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | task response should reflect user submitted queue and not actual queue -- Revert "OpenConceptLab/ocl_issues#1777 | queue should be saved as user submitted" -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | queue should be saved as user submitted -- [OpenConceptLab/ocl_issues#1779](https://github.com/OpenConceptLab/ocl_issues/issues/1779) | streamed response should not have content-length header -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | queue should not override -- [OpenConceptLab/ocl_issues#1779](https://github.com/OpenConceptLab/ocl_issues/issues/1779) | export stream response to have content length header -- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | removed print | pylint fix -- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | batch delete to not use paginator/iterator -- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | using paginator in place of iterator (#645) -- dropping coverage to 91 -- No coverage for azure -- [OpenConceptLab/ocl_issues#1779](https://github.com/OpenConceptLab/ocl_issues/issues/1779) | exports download via streaming -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | after_return to handle exception | added try catch in indexing -- [OpenConceptLab/ocl_issues#1753](https://github.com/OpenConceptLab/ocl_issues/issues/1753) | added mappings in repo version diff with verbosity levels | admin API to calculate checksums of repo resources -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | settting task state before start -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing tests -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing tests -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | children tasks to be uniq -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing get task | added task which is same as id -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | setting finished_at on success -- fixing tests | merge conflicts -- duplicate method | merge conflicts -- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | Async Task State Management using Postgres -- fixing test -- fixing test -- Fixing merge conflicts -- Merge branch 'master' into dev -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | mapping serializers | added latest_source_version -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing tests -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | source repo version release/unreleased to reindex resources -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | Mapping search to have latest repo version field -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing tests for default version HEAD when not global search -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | Search to use latest or latest released based on kwargs -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | returning latest_source_version in version detail API -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing facets filters -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing search latest attr -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | Concept search latest repo if search param there | return latest_source_version in list and detail only -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing merge conflicts -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | removed auth group check -- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | search with latest released repo version -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | not using atomic migrations | batching inserts/updates -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | using SQL raw queries in migrations -- Merge branch 'master' into dev -- Merge branch 'master' into dev -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | coverage to 92 -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | fixing pylint -- Merge branch 'master' into dev -- Merge remote-tracking branch 'origin/issue_1399' into dev -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | updated coverage to 93 -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | names/descriptions migrations to split names and descriptions -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | login/logout APIs to redirect to keycloak -- OpenMRS mapping validation schema to ignore old retired versions of mappings -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | added empty client id/secret vars -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removed client login/logout redirect URL env vars -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removed client id/secret as env vars -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | added comments -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | added comments -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | correcting readme -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | updated readme for dev setup with keycloak: -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | separating keycloak docker-compose file -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removed dead code -- Merge branch 'master' into dev -- Fixing test | IntegrityError -> ValidationError -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removed unused code -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | OID To Django Token API -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | fixing imports -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | custom auth/auth-backend to switch between django or OIDP | can use valid django token -- Merge branch 'master' into dev -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | API to migrate user from django to SSO -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removing local client secret -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | logout from OIDP view -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | API to exchange code with OID token -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | settings for login redirect -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | middleware to manage token from session or from headers -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | OIDBackend | update user -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | refactoring and extracting routes -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | pylint fixes -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | Migrate user from django auth to OIDP method -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | user forgot password flow -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | user signup and mark verified views -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | temp enabling oidc endpoints -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | user token view to use auth service -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | auth service to inject django or OID provider auth -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | user instance can figure out OIDC token -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | refactoring views/mixins to have write import order -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | oidc settings and package -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | oidc overriden backend | to create and find user -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | docker-compose | env vars -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | KeyCloak service in docker-compose -##### 2.3.85 - Tue Apr 2 09:24:46 2024 +0000 -- Errbit | handling URI generation for special characters in concept/mapping ID -- Errbit | concept extras list API should raise 404 if concept not found -- Errbit | handling URI generation for special characters in concept/mapping ID -- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | separated retired results -##### 2.3.84 - Tue Apr 2 06:13:27 2024 +0000 -- Source compare allowed for logged in users only -##### 2.3.83 - Mon Apr 1 11:21:40 2024 +0000 -- [OpenConceptLab/ocl_issues#1817](https://github.com/OpenConceptLab/ocl_issues/issues/1817) | fixing pylint -- [OpenConceptLab/ocl_issues#1817](https://github.com/OpenConceptLab/ocl_issues/issues/1817) | fixing test -- [OpenConceptLab/ocl_issues#1742](https://github.com/OpenConceptLab/ocl_issues/issues/1742) | fixing pylint -- [OpenConceptLab/ocl_issues#1742](https://github.com/OpenConceptLab/ocl_issues/issues/1742) | url registry entry lookup to return entry relative URI -##### 2.3.82 - Wed Mar 27 03:32:58 2024 +0000 -- [OpenConceptLab/ocl_issues#1806](https://github.com/OpenConceptLab/ocl_issues/issues/1806) | storing export time in version.extras | excluding extras.__ from checksums -- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | removed print | pylint fix -- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | batch delete to not use paginator/iterator -- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | using paginator in place of iterator (#645) -- Story-OpenConceptLab/ocl_issues#1816 | URL Registry | search and facets -##### 2.3.81 - Tue Mar 26 06:56:18 2024 +0000 -- [OpenConceptLab/ocl_issues#1816](https://github.com/OpenConceptLab/ocl_issues/issues/1816) | resolve to use lookup | lookup to handle version -- [OpenConceptLab/ocl_issues#1816](https://github.com/OpenConceptLab/ocl_issues/issues/1816) | url registry entry to cache resolved repo | repo save to update entries -##### 2.3.80 - Wed Mar 20 06:12:17 2024 +0000 -- [OpenConceptLab/ocl_issues#1753](https://github.com/OpenConceptLab/ocl_issues/issues/1753) | updated response structure -##### 2.3.79 - Mon Mar 18 11:02:43 2024 +0000 -Wed Mar 6 07:57:03 2024 +0530 -Mon Dec 11 15:18:33 2023 +0530 -- [OpenConceptLab/ocl_issues#1753](https://github.com/OpenConceptLab/ocl_issues/issues/1753) | find total of resources cheaper way -- [OpenConceptLab/ocl_issues#1753](https://github.com/OpenConceptLab/ocl_issues/issues/1753) | added mappings in repo version diff with verbosity levels | admin API to calculate checksums of repo resources -##### 2.3.78 - Mon Mar 18 03:20:51 2024 +0000 -- [OpenConceptLab/ocl_issues#1809](https://github.com/OpenConceptLab/ocl_issues/issues/1809) | Mapping | added more fields to standard checksum -- [OpenConceptLab/ocl_issues#1775](https://github.com/OpenConceptLab/ocl_issues/issues/1775) | User detail serializers can include pins -- Enabling match search on users/orgs username/mnemonic attrs -- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | returning 208 when concept/mapping update is unchanged -##### 2.3.77 - Tue Mar 12 07:22:24 2024 +0000 -- [OpenConceptLab/ocl_issues#1794](https://github.com/OpenConceptLab/ocl_issues/issues/1794) | added external id in match search -##### 2.3.76 - Fri Mar 8 04:58:43 2024 +0000 -- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | fixing cascade queryset for report -- [OpenConceptLab/ocl_issues#1789](https://github.com/OpenConceptLab/ocl_issues/issues/1789) | fixing hyphen search -##### 2.3.75 - Thu Mar 7 04:33:13 2024 +0000 -- [OpenConceptLab/ocl_issues#1788](https://github.com/OpenConceptLab/ocl_issues/issues/1788) | resolveReference operation to return resolved url registry entry relative URI as well -- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | ordering summary in report -- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | added more summaries in monthly usage report -##### 2.3.74 - Wed Mar 6 03:31:07 2024 +0000 -- Merge pull request #644 from OpenConceptLab/contributor_start -- Contribution doc with getting started process -- Collection Reference Delete | Job to readd references to take less -- Collection reference remove timing out -- [OpenConceptLab/ocl_issues#1757](https://github.com/OpenConceptLab/ocl_issues/issues/1757) | added logo_url in users list response | removed redundant condition -- [OpenConceptLab/ocl_issues#1764](https://github.com/OpenConceptLab/ocl_issues/issues/1764) | reference expression cascade within valueset context -- Added 3 map types -- Updated db index for concept/mapping repo resources query -- Collection concepts/mappings view to set instance on request for references -- [OpenConceptLab/ocl_issues#1756](https://github.com/OpenConceptLab/ocl_issues/issues/1756) | added logo url in org list response -- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | fixing sorting -- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | fixing monthly report mapping count -- Migrations for indexes -- [OpenConceptLab/ocl_issues#1756](https://github.com/OpenConceptLab/ocl_issues/issues/1756) | user summary to have bookmark count -- Concept/Mapping Indexes for repo version listing -- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | fixing toggles fixtures -- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | concept/mapping new version creation error -- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | concept/mapping new version creation to compare checksum and fail if same -- Errbit | fixing autoexand off collection summary -- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | Concepts/Mappings standard checksums | added external_id, retired and descriptions -- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | refactoring | extracting mapping/concept common method for version creation -- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | refactoring mappings version create method -- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | refactoring concepts version create method -- [OpenConceptLab/ocl_issues#1747](https://github.com/OpenConceptLab/ocl_issues/issues/1747) | Mappings to use resolve operations -- Update README.md -- Update README.md -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | added toggle for canonical resolution -- Trying to address verify_certs=False not working -- Follow up to adding ES_VERIFY_CERTS and proper handling of bool -- Add ES_VERIFY_CERTS to support https traffic without configuring certificates -- Merge pull request #643 from OpenConceptLab/issue-1729 -- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | buffered file reading -- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | removed unused package -- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | Azure Blob Storage Class for exports/uploads -- utils | removed unused methods and added missing tests -- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | checksums repo version diff | return new mnemonics -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | removed redundant check -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | refactoring entry and lookup methods -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | raise 404 if owner is provided in request URL but not found -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | lookup operation is not using resolve reference operation -- Adding missing test coverage -- Removed system/admin API to dedupe concept versions -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | resolve reference operation to resolve canonical using new rules of url registry -- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | extract checksums diff class -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry lookup operation | using owner entries or global not both -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry lookup operation | fixing when repo not found -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry lookup operation -- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | source compare is not swagger ready -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry | updated type -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry | search scopes and owner -- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | fixing pylint -- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | source version compare API using checksums -- [OpenConceptLab/ocl_issues#1735](https://github.com/OpenConceptLab/ocl_issues/issues/1735) | version exports | fixing test -- [OpenConceptLab/ocl_issues#1735](https://github.com/OpenConceptLab/ocl_issues/issues/1735) | version exports | added time taken -- Turning on checksums toggle on staging/prod -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry | fixing namespace and uniq clauses -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry | fixing namespace and uniq clauses -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | fixing pylint -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry CRUD -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | fixing uniq check -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | fixing pylint -- Collections | added search meta results -- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | Global/Org/User URL Registry List/Search/Create APIs -- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | Refactoring services | creating dir structure -- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | refactoring export service to have an interface for other cloud service to implement -- [OpenConceptLab/ocl_issues#1728](https://github.com/OpenConceptLab/ocl_issues/issues/1728) Fixing test -- [OpenConceptLab/ocl_issues#1728](https://github.com/OpenConceptLab/ocl_issues/issues/1728) Support db user, redis and es credentials -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | fixing typo -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | importers | indexing job to take a bigger batch and iterate using iterator -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | importers | indexing current latest and version objects for concept/mapping -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | importers | using pop more -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | ES batch indexes | extract doc -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | DB Indexes for source/collection/mapping/concept for ES indexing -- removed ES strict mapping from concepts/mappings -- [OpenConceptLab/ocl_issues#1720](https://github.com/OpenConceptLab/ocl_issues/issues/1720) | added logs for Openmrs validation schema collection conflicting name -- [OpenConceptLab/ocl_issues#1682](https://github.com/OpenConceptLab/ocl_issues/issues/1682) | Added index -- [OpenConceptLab/ocl_issues#1686](https://github.com/OpenConceptLab/ocl_issues/issues/1686) | Repos facets class -- [OpenConceptLab/ocl_issues#1703](https://github.com/OpenConceptLab/ocl_issues/issues/1703) | removed unused facets -- [OpenConceptLab/ocl_issues#1682](https://github.com/OpenConceptLab/ocl_issues/issues/1682) | Auto assign sort order based on max prev sort order -- [OpenConceptLab/ocl_issues#1713](https://github.com/OpenConceptLab/ocl_issues/issues/1713) Fix reading DB_CURSOR_ON env -- [OpenConceptLab/ocl_issues#1710](https://github.com/OpenConceptLab/ocl_issues/issues/1710) | facets exlusions for global scope -- [OpenConceptLab/ocl_issues#1713](https://github.com/OpenConceptLab/ocl_issues/issues/1713) POST CodeSystem and ValueSet fails due to DB cursor being unsupported -- [OpenConceptLab/ocl_issues#1710](https://github.com/OpenConceptLab/ocl_issues/issues/1710) | facets to not include source versions in global results -- [OpenConceptLab/ocl_issues#1710](https://github.com/OpenConceptLab/ocl_issues/issues/1710) | added swagger header for latest repo search header -- [OpenConceptLab/ocl_issues#1710](https://github.com/OpenConceptLab/ocl_issues/issues/1710) | include latest search by header -- [OpenConceptLab/ocl_issues#937](https://github.com/OpenConceptLab/ocl_issues/issues/937) | updated Readme: -- [OpenConceptLab/ocl_issues#937](https://github.com/OpenConceptLab/ocl_issues/issues/937) | disabling profiler by default in dev env -- [OpenConceptLab/ocl_issues#937](https://github.com/OpenConceptLab/ocl_issues/issues/937) | django-silk profiler -- [OpenConceptLab/ocl_issues#1709](https://github.com/OpenConceptLab/ocl_issues/issues/1709) | fixing pylint -- [OpenConceptLab/ocl_issues#1683](https://github.com/OpenConceptLab/ocl_issues/issues/1683) | Source setting for autoid uuid for locales -- [OpenConceptLab/ocl_issues#1709](https://github.com/OpenConceptLab/ocl_issues/issues/1709) | OpenMRS Validation schema to accept all different forms of index term and short name name types -- Add ability to only clear org -- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Adjusting import script -- [OpenConceptLab/ocl_issues#1702](https://github.com/OpenConceptLab/ocl_issues/issues/1702) | SSO registration url redirect API -- Fixing swagger error -- [OpenConceptLab/ocl_issues#1663](https://github.com/OpenConceptLab/ocl_issues/issues/1663) | fixing test -- [OpenConceptLab/ocl_issues#1663](https://github.com/OpenConceptLab/ocl_issues/issues/1663) | added company and location to user from SSO claims -- API/tasks to remove duplicate versions of concepts | adding logs -- API/tasks to remove duplicate versions of concepts -- Revert "Added default keycloak env var for local" -- Added default keycloak env var for local -- Removed retry policy -- Never retry bulk import tasks -- batch index to have single batch mode for source/collections of an org/user -- fixing tests -- batch index to use iterator in non test mode -- batch index to use iterator on queryset and not limit offset -- [OpenConceptLab/ocl_issues#1701](https://github.com/OpenConceptLab/ocl_issues/issues/1701) | search by canonical url -- [OpenConceptLab/ocl_issues#1686](https://github.com/OpenConceptLab/ocl_issues/issues/1686) | removed unused import -- [OpenConceptLab/ocl_issues#1686](https://github.com/OpenConceptLab/ocl_issues/issues/1686) | user org repo search API -- [OpenConceptLab/ocl_issues#1686](https://github.com/OpenConceptLab/ocl_issues/issues/1686) | Repos search API -- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Fixing tests -- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Implement automated import scripts for FHIR HL7 content -- Root View | URL to have correct HOST scheme -- [OpenConceptLab/ocl_issues#1679](https://github.com/OpenConceptLab/ocl_issues/issues/1679) | removing ref concepts/mappings correctly -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | Adding checksums to bundle response | checksums in all concept/mapping responses -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | added checksums in export -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | reafactoring and adding tests -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | cleaning checksum model methods -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | Adding checksums response headers -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | Adding checksums calculations -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | reverting algo back | added more test -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | standard and smart checksums for orgs and users -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | Checksum Algo | not using sorting in values -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | fixing typo -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | standard and smart checksums should ignore None and retired/is_active when its false -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | standard and smart checksums for source/collections -- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | standard and smart checksums for concepts/mappings -- Concepts/Mapping updated by dynamic string mapping for ES -- Concepts/Mapping updated by dynamic string mapping for ES -- [OpenConceptLab/ocl_issues#1675](https://github.com/OpenConceptLab/ocl_issues/issues/1675) | adding verbosity to exception -- Removed data migration for updated by API/tasks -- Revert "OpenConceptLab/ocl_issues#1664 | added logs for concept next valid ID" -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | casting mnemonic to int -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | added logs for concept next valid ID -- pylint | remove unused import -- Fixing batch index processing when filters are None -- Fixing collection/verison hard delete failure | should delete references and expansions first -- [OpenConceptLab/ocl_issues#1672](https://github.com/OpenConceptLab/ocl_issues/issues/1672) | remove duplicate lookup values -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | mapping/concept create to verify parent autoid seq next valiud id -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Mapping initial version to have the right updated_by: -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | clone process to verify auto id seq after excluding non-number IDs -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | clone process to verify auto id for concept/mapping -- [OpenConceptLab/ocl_issues#1670](https://github.com/OpenConceptLab/ocl_issues/issues/1670) | swagger request body for references delete -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | using outer ref for mapping update by update -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | updated lables/notes -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | not using iterator | connection pool doesn't like it. -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | reduced chunk size -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | removed newline -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Updated/Refactored Resources usage report -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | fixing mappings API for concepts -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | ignoring coverage -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring queryset for better lookup -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | renaming var and not indexing -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | using iterator and chunks for migration -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring tasks -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring tasks to be more efficient -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping updated_by migration via API/task -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping migration to update updated by -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping version create should updated updated by on versioned object -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | fixing pylint -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | added updated by in indexes | Repo summary to have contributors | Facets to have updated by filters -- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Implement automated import scripts for FHIR HL7 content -- Merge pull request #581 from IanMinash/codesystemlookup-fix -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | fixing test -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Resource usage reports | updated swagger | can add custom dates -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Resource usage reports | feedbacks and refactoring -- Switch body to OperationOutcome for empty queryset -##### 2.3.50 - Sat Oct 7 00:24:12 2023 +0000 -- Revert "OpenConceptLab/ocl_issues#1664 | added logs for concept next valid ID" -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | casting mnemonic to int -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | added logs for concept next valid ID -- pylint | remove unused import -- Fixing batch index processing when filters are None -- Fixing collection/verison hard delete failure | should delete references and expansions first -- [OpenConceptLab/ocl_issues#1672](https://github.com/OpenConceptLab/ocl_issues/issues/1672) | remove duplicate lookup values -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | mapping/concept create to verify parent autoid seq next valiud id -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Mapping initial version to have the right updated_by: -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | clone process to verify auto id seq after excluding non-number IDs -- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | clone process to verify auto id for concept/mapping -- [OpenConceptLab/ocl_issues#1670](https://github.com/OpenConceptLab/ocl_issues/issues/1670) | swagger request body for references delete -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | using outer ref for mapping update by update -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | updated lables/notes -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | not using iterator | connection pool doesn't like it. -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | reduced chunk size -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | removed newline -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Updated/Refactored Resources usage report -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | fixing mappings API for concepts -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | ignoring coverage -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring queryset for better lookup -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | renaming var and not indexing -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | using iterator and chunks for migration -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring tasks -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring tasks to be more efficient -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping updated_by migration via API/task -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping migration to update updated by -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping version create should updated updated by on versioned object -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | fixing pylint -- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | added updated by in indexes | Repo summary to have contributors | Facets to have updated by filters -- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Implement automated import scripts for FHIR HL7 content -- Merge pull request #581 from IanMinash/codesystemlookup-fix -- Switch body to OperationOutcome for empty queryset -##### 2.3.49 - Tue Sep 5 07:38:46 2023 +0000 -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | fixing test -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Resource usage reports | updated swagger | can add custom dates -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Resource usage reports | feedbacks and refactoring -##### 2.3.48 - Fri Sep 1 04:01:08 2023 +0000 -- [OpenConceptLab/ocl_issues#1656](https://github.com/OpenConceptLab/ocl_issues/issues/1656) | fixing facets when no search criteria is given -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | correcting name of task -##### 2.3.47 - Wed Aug 30 10:08:57 2023 +0000 -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | correcting concept/mapping retired criteria -##### 2.3.46 - Wed Aug 30 07:25:28 2023 +0000 -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | correcting blank rows | removed duplicates -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | added blank row -##### 2.3.45 - Tue Aug 29 03:42:58 2023 +0000 -- [OpenConceptLab/ocl_issues#1587](https://github.com/OpenConceptLab/ocl_issues/issues/1587) | correcting wildcard -- [OpenConceptLab/ocl_issues#1587](https://github.com/OpenConceptLab/ocl_issues/issues/1587) | fixing pylint -- [OpenConceptLab/ocl_issues#1587](https://github.com/OpenConceptLab/ocl_issues/issues/1587) | must have and must not have with correct operators +/- -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | fixing test -- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Monthly usage report refactoring and using CSV format -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix timeout -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, move retry_policy -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, move socket_timeout_* for result_backend -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, move socket_timeout_ -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, disable broker heartbeat -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix timeouts -- using search queries to get facets -- Removed exact match param from swagger -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix Retry kombu error -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix sentinels list -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, using sentinel_kwargs -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, use merge -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing settings.py -- [OpenConceptLab/ocl_issues#1587](https://github.com/OpenConceptLab/ocl_issues/issues/1587) | must have in search using quotes -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix formatting -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, unify retry policy -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | optimizing/refactoring search queries -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, another attempt at setting timeouts -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept search term/prefix to use keyword name field -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, enable back heartbeat -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing formatting -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing celery_once -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing celery startup -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing celery config -##### 2.3.44 - Wed Aug 23 03:46:34 2023 +0000 -- Fixing celery once config -##### 2.3.43 - Tue Aug 22 12:35:09 2023 +0000 -- [OpenConceptLab/ocl_issues#730](https://github.com/OpenConceptLab/ocl_issues/issues/730) Implement clustering for ES, set retries and sniffing -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, adding cache and celery_once retries -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, adding result backend retries -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, adjusting task publish retries -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, setup timeouts and retries -##### 2.3.42 - Mon Aug 21 06:05:43 2023 +0000 -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept search to use text field name and not keyword field -- Bump gunicorn from 20.1.0 to 21.2.0 (#562) -- Bump factory-boy from 3.2.1 to 3.3.0 (#546) -- Bump pylint from 2.17.4 to 2.17.5 (#560) -- Bump coverage from 7.2.7 to 7.3.0 (#564) -- Bump django-cors-headers from 4.1.0 to 4.2.0 (#547) -- Bump django from 4.2.3 to 4.2.4 (#559) -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, correct location -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, add missing SentinelConnectionFactory -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, attempt to fix RedisService -- Bump markdown from 3.4.3 to 3.4.4 (#556) -- Bump psycopg2 from 2.9.6 to 2.9.7 (#555) -- Bump pydash from 7.0.4 to 7.0.6 (#557) -- Bump mock from 5.0.2 to 5.1.0 (#558) -##### 2.3.41 - Wed Aug 9 03:30:33 2023 +0000 -- [OpenConceptLab/ocl_issues#1646](https://github.com/OpenConceptLab/ocl_issues/issues/1646) | Collection References | ignoring new search parameters -- [OpenConceptLab/ocl_issues#1645](https://github.com/OpenConceptLab/ocl_issues/issues/1645) | Source/Collection | canonical_url is searchable by phrase -- [OpenConceptLab/ocl_issues#1595](https://github.com/OpenConceptLab/ocl_issues/issues/1595) | Removed migrate from old export path to new | remove repo old export path code -- Revert "OpenConceptLab/ocl_issues#1595 | coverage fix" -- Revert "OpenConceptLab/ocl_issues#1595 | collections export migrate" -- Revert "Admin API to dedupe concept/mapping latest-versions" -##### 2.3.40 - Thu Aug 3 02:51:49 2023 +0000 -- ES | returning real exception -- ES | returning real exception -- Added use_ssl and verify certs for https schema for ES connection configuration -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests for fuzzy search on ID -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests for fuzzy search on ID -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests for fuzzy search on ID -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests for fuzzy search on ID -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Fuzzy search is not applied on id and codes -##### 2.3.39 - Sat Jul 29 00:59:32 2023 +0000 -- Admin API to dedupe concept/mapping latest-versions -- Temporarily lower required coverage -- OpenConceptLab/ocl_issues#927 Redis clustering, adding connection pool class -- Increasing test coverage -- [OpenConceptLab/ocl_issues#1410](https://github.com/OpenConceptLab/ocl_issues/issues/1410) Schedule vacuum and analyse DB -- Fixing concept/mapping list queryset -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept Index | synonyms not lowercase -- Merge pull request #545 from Salaton/dynamic_es_scheme -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix tests -- chore: make scheme configurable for elastic search connection -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing build -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing redis healthcheck -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing formatting -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing healthcheck -- Upgrading redis and celery to support sentinel -- Adding gevent for celery -- [OpenConceptLab/ocl_issues#1501](https://github.com/OpenConceptLab/ocl_issues/issues/1501) | fixing pylint errors -- Upgrading pyyaml to fix build -- Revert "Revert "OpenConceptLab/ocl_issues#1588 | Can except OCL Source version export for import into same or different owner and as same or different version"" -- Revert "Revert "OpenConceptLab/ocl_issues#1501 | Accepting zip format in importers"" -- Revert "OpenConceptLab/ocl_issues#1501 | Accepting zip format in importers" -- Revert "OpenConceptLab/ocl_issues#1588 | Can except OCL Source version export for import into same or different owner and as same or different version" -- [OpenConceptLab/ocl_issues#1588](https://github.com/OpenConceptLab/ocl_issues/issues/1588) | Can except OCL Source version export for import into same or different owner and as same or different version -- [OpenConceptLab/ocl_issues#1501](https://github.com/OpenConceptLab/ocl_issues/issues/1501) | Accepting zip format in importers -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing pylint -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | concept word match on name keyword field -- [OpenConceptLab/ocl_issues#1595](https://github.com/OpenConceptLab/ocl_issues/issues/1595) | collections export migrate -- [OpenConceptLab/ocl_issues#1595](https://github.com/OpenConceptLab/ocl_issues/issues/1595) | coverage fix -- [OpenConceptLab/ocl_issues#1595](https://github.com/OpenConceptLab/ocl_issues/issues/1595) | Source/Collection version export path and file name to be more user friendly -- Upgrading ES and adding Kibana -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Expansion text paramter and reference expression to use exact match search only -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Expansion text paramter and reference expression to use exact match search only -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Expansion text paramter and reference expression to use exact match search only -- Adding mapping serializer tests -- Refactoring | extracting truthy values -- Mapping serializers | passing context to nested concept serializers -- Fixing formatting -- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | indexing API | can pass filters -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | external_id match should be exact (term match) only -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search serializer and tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | removed duplicate method -##### 2.3.38 - Sat Jul 8 02:57:50 2023 +0000 -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Search updates -- [OpenConceptLab/ocl_issues#1598](https://github.com/OpenConceptLab/ocl_issues/issues/1598) | fixing pylint -- Revert "Bump drf-yasg from 1.21.5 to 1.21.6 (#513)" -- [OpenConceptLab/ocl_issues#1598](https://github.com/OpenConceptLab/ocl_issues/issues/1598) | concept extras keys for source in summary -- Bump tblib from 1.7.0 to 2.0.0 (#516) -- Bump drf-yasg from 1.21.5 to 1.21.6 (#513) -- Bump django from 4.2.2 to 4.2.3 (#528) -##### 2.3.37 - Thu Jun 29 06:05:22 2023 +0000 -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing test -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing test -- [OpenConceptLab/ocl_issues#1471](https://github.com/OpenConceptLab/ocl_issues/issues/1471) | added toggle -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | updated concepts/mappings exact match fields -##### 2.3.36 - Wed Jun 28 14:00:21 2023 +0000 -- [OpenConceptLab/ocl_issues#730](https://github.com/OpenConceptLab/ocl_issues/issues/730) Fix hosts -##### 2.3.35 - Wed Jun 28 13:20:49 2023 +0000 -- Fixing pylint -- [OpenConceptLab/ocl_issues#730](https://github.com/OpenConceptLab/ocl_issues/issues/730) Implement clustering for ES -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing pylint -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept searchable through target codes -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | User name is sortable and exact match searchable -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing test -- Revert "Bump celery[redis] from 5.2.7 to 5.3.1 (#511)" -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept Search | added highlighting -- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Enhancing search API -- Bump celery[redis] from 5.2.7 to 5.3.1 (#511) -- Bump django-cors-headers from 3.14.0 to 4.1.0 (#514) -- Revert "Bump drf-yasg from 1.21.5 to 1.21.6 (#509)" -- Bump drf-yasg from 1.21.5 to 1.21.6 (#509) -- Bump whitenoise from 6.4.0 to 6.5.0 (#507) -- Bump kombu from 5.3.0 to 5.3.1 (#506) -- Bump coverage from 6.5.0 to 7.2.7 (#486) -- Bump pydash from 7.0.3 to 7.0.4 (#504) -- Bump pylint from 2.17.2 to 2.17.4 (#499) -- Update README.md | added ES indexing commands -- Bump kombu from 5.2.4 to 5.3.0 (#501) -- Bump mock from 5.0.1 to 5.0.2 (#498) -- Bump psycopg2 from 2.9.5 to 2.9.6 (#495) -- Bump django from 4.1.9 to 4.2.2 (#496) -- Bump requests from 2.28.1 to 2.31.0 (#479) -- Bump redis from 4.5.4 to 4.5.5 (#470) -- Bump markdown from 3.4.1 to 3.4.3 (#469) -##### 2.3.34 - Thu Jun 8 08:41:26 2023 +0000 -- [OpenConceptLab/ocl_issues#1591](https://github.com/OpenConceptLab/ocl_issues/issues/1591) | fixing retired + exact match/wildcard search/facets -- [OpenConceptLab/ocl_issues#1593](https://github.com/OpenConceptLab/ocl_issues/issues/1593) | fixing mapping from/to concept code search -##### 2.3.33 - Wed May 24 01:52:16 2023 +0000 -- Refactoring Mapping resolve relations -- [OpenConceptLab/ocl_issues#1561](https://github.com/OpenConceptLab/ocl_issues/issues/1561) | Org delete async by default -- [OpenConceptLab/ocl_issues#1549](https://github.com/OpenConceptLab/ocl_issues/issues/1549) | fixing typo -- [OpenConceptLab/ocl_issues#1584](https://github.com/OpenConceptLab/ocl_issues/issues/1584) | added default/supported-locales in source version verbose summary -- [OpenConceptLab/ocl_issues#1549](https://github.com/OpenConceptLab/ocl_issues/issues/1549) | Source Auto id attributes editable -##### 2.3.32 - Mon May 22 04:14:06 2023 +0000 -- Fixing collections/sources urls for org/users -##### 2.3.31 - Thu May 18 03:13:44 2023 +0000 -- [OpenConceptLab/ocl_issues#1579](https://github.com/OpenConceptLab/ocl_issues/issues/1579) | fixing tests -- [OpenConceptLab/ocl_issues#1579](https://github.com/OpenConceptLab/ocl_issues/issues/1579) | collection/source minimal versions serializers -##### 2.3.30 - Mon May 15 09:03:30 2023 +0000 -- Expansions refactoring | using either expansion system parameter or ref's system, not both -##### 2.3.29 - Sun May 14 15:48:36 2023 +0000 -- Expansions | on new expansion creation re-evaluation references deduping system/valueset versions -##### 2.3.28 - Sun May 14 14:26:04 2023 +0000 -- Expansions | on new expansion creation re-evaluation of all references fixing performance issues -- Expansions | on new expansion creation re-evaluation of all references should cache system version resolves -##### 2.3.27 - Sun May 14 11:52:05 2023 +0000 -- fixing typo -- Adding concepts/mappings to expansion query to load less in memory -- [OpenConceptLab/ocl_issues#1551](https://github.com/OpenConceptLab/ocl_issues/issues/1551) | removed deprecated importers urls from root view -- Logging middleware on top -##### 2.3.26 - Fri May 12 02:17:45 2023 +0000 -- removed unused import -- Errbit | hardcoded user's org uri method -- Bump django-dirtyfields from 1.9.1 to 1.9.2 (#453) -- Bump pydash from 6.0.2 to 7.0.3 (#464) -- Bump django from 4.1.7 to 4.1.9 (#468) -##### 2.3.25 - Tue May 9 13:56:35 2023 +0000 -- Revert "Moving logging middleware on top" -##### 2.3.24 - Tue May 9 13:38:57 2023 +0000 -- Moving logging middleware on top -- Errbit | hardcoded user/org calculate uri method -- [OpenConceptLab/ocl_issues#1561](https://github.com/OpenConceptLab/ocl_issues/issues/1561) | source/collection delete always async and waits for result -##### 2.3.23 - Thu Apr 27 14:00:41 2023 +0000 -- removed overloading of equal and hash -##### 2.3.22 - Thu Apr 27 13:35:39 2023 +0000 -- Source/collection delete | added errbit and more logs -- [OpenConceptLab/ocl_issues#1551](https://github.com/OpenConceptLab/ocl_issues/issues/1551) | Deprecated legacy importers -##### 2.3.21 - Thu Apr 27 03:50:58 2023 +0000 -- Merge branch 'master' of github.com:OpenConceptLab/oclapi2 -- [OpenConceptLab/ocl_issues#1566](https://github.com/OpenConceptLab/ocl_issues/issues/1566) | collection reference cascade to consider more parameters -- Bump django-celery-beat from 2.4.0 to 2.5.0 (#440) -- Bump django-ordered-model from 3.7.1 to 3.7.4 (#441) -- [OpenConceptLab/ocl_issues#1561](https://github.com/OpenConceptLab/ocl_issues/issues/1561) | Collection references add is always async | waiting 15 seconds to finish -##### 2.3.20 - Wed Apr 26 04:01:39 2023 +0000 -- [OpenConceptLab/ocl_issues#1562](https://github.com/OpenConceptLab/ocl_issues/issues/1562) | async references add to not have any cascade limit -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | checksums for source/collection metadata -- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed name from importers -- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed name from concept serializers -- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed name from concept factory -- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed concept unused fields -- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed concept unused fields -##### 2.3.19 - Tue Apr 25 03:33:40 2023 +0000 -- [OpenConceptLab/ocl_issues#1563](https://github.com/OpenConceptLab/ocl_issues/issues/1563) | cascade and transform | dedupe references -##### 2.3.18 - Tue Apr 25 02:40:29 2023 +0000 -- [OpenConceptLab/ocl_issues#1557](https://github.com/OpenConceptLab/ocl_issues/issues/1557) | fixing export url check -##### 2.3.17 - Tue Apr 25 02:09:08 2023 +0000 -- [OpenConceptLab/ocl_issues#1559](https://github.com/OpenConceptLab/ocl_issues/issues/1559) | Source/Concept create to update mappings attributes asynchronously -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | checksums | updated fields -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | added checksum toggle -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | checksum save to not updated updated_at -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | fixing task -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | computing checksums on association changes -- Upgrade to pylint 2.17.2 -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | concept/mapping checksums to recompute on version creation | locales to return checksum | locales to use name/description_type and not type in checksums -- [OpenConceptLab/ocl_issues#1556](https://github.com/OpenConceptLab/ocl_issues/issues/1556) Fix formatting -- [OpenConceptLab/ocl_issues#1556](https://github.com/OpenConceptLab/ocl_issues/issues/1556) CodeSystem/ returns result if code and system missing -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | checksum algo to return same checksum for array of one element vs element -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | API for operation -- resolve reference operation | correcting url for swagger and added swagger schema -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | fixing typo -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | toggle for checksums -- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | Checksums for concept/mapping-versions -- Fixing Source create for supported locales -- Collections Export | fixing export check -##### 2.3.16 - Tue Apr 18 02:45:46 2023 +0000 -- [OpenConceptLab/ocl_issues#1550](https://github.com/OpenConceptLab/ocl_issues/issues/1550) | bulk importer to acknowledge id as optional for Concept | handling auto assign id -##### 2.3.15 - Fri Apr 14 02:35:57 2023 +0000 -- [OpenConceptLab/ocl_issues#1547](https://github.com/OpenConceptLab/ocl_issues/issues/1547) | fixing for non-admin logged in user's concepts/mappings listing showing duplicates -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | putting back mappings/collections uri index -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed concept descriptions indexes -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed datatype indexes -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed concept_class indexes -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed locale indexes -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed public access indexes -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed mnemonic indexes -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed mappings map_type exact match index -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed index from is_latest_version field -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed mapping version field index -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed uri indexes from some places -- Bump django-elasticsearch-dsl from 7.2.2 to 7.3 (#410) -- Bump mozilla-django-oidc from 2.0.0 to 3.0.0 (#299) -- Bump redis from 4.5.1 to 4.5.4 (#428) -##### 2.3.14 - Wed Apr 12 10:21:42 2023 +0000 -- [OpenConceptLab/ocl_issues#1544](https://github.com/OpenConceptLab/ocl_issues/issues/1544) | Source/Collection export for non HEAD should not check last child update except when writing the file -- [OpenConceptLab/ocl_issues#1528](https://github.com/OpenConceptLab/ocl_issues/issues/1528) | Source/Collection include resources behaviors -- Errbit | params integer type casting -- Errbit | params integer type casting -- Errbit | fixing collection export when no expansion exists -- Errbit | fixing collection export when no expansion exists -- Errbit | fixing bad limit param -- [OpenConceptLab/ocl_issues#1540](https://github.com/OpenConceptLab/ocl_issues/issues/1540) | operations panel access based on auth group -##### 2.3.13 - Tue Apr 11 10:45:43 2023 +0000 -- [OpenConceptLab/ocl_issues#1541](https://github.com/OpenConceptLab/ocl_issues/issues/1541) Fix 'dict' object has no attribute 'udpate' in FHIR -##### 2.3.12 - Tue Apr 11 09:25:46 2023 +0000 -- [OpenConceptLab/ocl_issues#1309](https://github.com/OpenConceptLab/ocl_issues/issues/1309) | fixing duplicate mapping issue in import of CIEL mappings on production -##### 2.3.11 - Thu Apr 6 10:56:00 2023 +0000 -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) Clean up duplicated indexes and merge indexes in mappings -##### 2.3.10 - Wed Apr 5 13:10:08 2023 +0000 -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) Adding missing migrations -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) Clean up duplicated indexes and merge indexes in concepts -##### 2.3.9 - Wed Apr 5 09:32:58 2023 +0000 -- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) Review changes to indexes, revert 0dfbe5c -- [OpenConceptLab/ocl_issues#1495](https://github.com/OpenConceptLab/ocl_issues/issues/1495) | collection summary -- [OpenConceptLab/ocl_issues#1527](https://github.com/OpenConceptLab/ocl_issues/issues/1527) | reusing collection serializers -- [OpenConceptLab/ocl_issues#1527](https://github.com/OpenConceptLab/ocl_issues/issues/1527) | reusing summary serializers -##### 2.3.8 - Mon Mar 27 05:14:47 2023 +0000 -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | getting Source mapped sources in separate APIs -##### 2.3.7 - Thu Mar 23 09:03:07 2023 +0000 -Mon May 16 16:11:46 2022 +0530 -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | getting Source mapped sources in separate APIs -##### 2.3.6 - Thu Mar 23 06:05:59 2023 +0000 -- skipping big import tests only on CI -- running facets test on CI -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | attempting test fix on CI -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | attempting test fix on CI -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | attempting test fix on CI -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | attempting test fix on CI -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | inspecting CI failure | added print for facets exception -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | using ES facets for field distribution -- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | added index for retired counts -##### 2.3.5 - Wed Mar 22 04:04:51 2023 +0000 -- [OpenConceptLab/ocl_issues#1458](https://github.com/OpenConceptLab/ocl_issues/issues/1458) | removed feature toggle -- Fixing tests -- [OpenConceptLab/ocl_issues#1521](https://github.com/OpenConceptLab/ocl_issues/issues/1521) | listing public criteria fix -##### 2.3.4 - Fri Mar 17 04:18:25 2023 +0000 -- [OpenConceptLab/ocl_issues#1513](https://github.com/OpenConceptLab/ocl_issues/issues/1513) | concepts search in collection fix -##### 2.3.3 - Fri Mar 17 02:50:49 2023 +0000 -- [OpenConceptLab/ocl_issues#1513](https://github.com/OpenConceptLab/ocl_issues/issues/1513) | concepts search in collection fix -- Bug | collection concepts after search were not removable -##### 2.3.2 - Wed Mar 15 04:24:47 2023 +0000 -- [OpenConceptLab/ocl_issues#1458](https://github.com/OpenConceptLab/ocl_issues/issues/1458) | sort_weight can be null -- Reference filter schema to remove check from operation value -- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Implement automated import scripts for FHIR HL7 content -##### 2.3.0 - Mon Mar 13 10:36:40 2023 +0000 -##### 2.2.79 - Mon Mar 13 10:36:40 2023 +0000 -- Bump whitenoise from 6.2.0 to 6.4.0 (#407) -- handling already queued exception -- Tasks | indexing tasks queue once with same args -##### 2.2.78 - Mon Mar 13 08:49:44 2023 +0000 -- [OpenConceptLab/ocl_issues#1507](https://github.com/OpenConceptLab/ocl_issues/issues/1507) | fixing typo -- Fixing formatting -- [OpenConceptLab/ocl_issues#1511](https://github.com/OpenConceptLab/ocl_issues/issues/1511) ValueSet returns expansions for HEAD and not the latest version -- [OpenConceptLab/ocl_issues#1497](https://github.com/OpenConceptLab/ocl_issues/issues/1497) Fixing validate-code returning false positives -##### 2.2.77 - Fri Mar 10 03:53:23 2023 +0000 -- [OpenConceptLab/ocl_issues#1510](https://github.com/OpenConceptLab/ocl_issues/issues/1510) | added feature toggles -##### 2.2.76 - Fri Mar 10 02:33:11 2023 +0000 -- [OpenConceptLab/ocl_issues#1507](https://github.com/OpenConceptLab/ocl_issues/issues/1507) | import get to check for pending tasks -- Importers | checking workers are alive for alive tasks -- Bump django-ordered-model from 3.6 to 3.7.1 (#404) -- Bump django-cors-headers from 3.13.0 to 3.14.0 (#401) -- Fix formatting -- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConcetpMap operations fix parameters logic -- Include production like docker-compose with web -- [OpenConceptLab/ocl_issues#1503](https://github.com/OpenConceptLab/ocl_issues/issues/1503) Collectstatic in api when building instead of at runtime -- importers tasks tests -- Test for port import update resource count task -- [OpenConceptLab/ocl_issues#1495](https://github.com/OpenConceptLab/ocl_issues/issues/1495) | collections summary tests -- [OpenConceptLab/ocl_issues#1495](https://github.com/OpenConceptLab/ocl_issues/issues/1495) | collections summary tests -- refactoring permission -- auth backend | added test case -- Bump redis from 4.3.4 to 4.5.1 (#391) -- Minor fixes and refactoring -- [OpenConceptLab/ocl_issues#1495](https://github.com/OpenConceptLab/ocl_issues/issues/1495) | collections summary -##### 2.2.75 - Fri Mar 3 03:43:46 2023 +0000 -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | added index on concept_class and datatype -##### 2.2.74 - Fri Mar 3 02:55:31 2023 +0000 -- Concept/Mapping | correcting index -- Removed debug apis -##### 2.2.73 - Thu Mar 2 03:16:53 2023 +0000 -- Removed rendundant code -- Removed expansion/references data backfill APIs/tasks -- Removed expansion/references data backfill APIs/tasks -- Monthly usage report | fixing date formats -- Imports to queue summary calculations and not do inline -##### 2.2.72 - Tue Feb 28 02:44:01 2023 +0000 -- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | fixing test -- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | fixing test -- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | source | hierarchy_meaning indexing empty/null as None -- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | source | hierarchy_meaning converting empty to None | data migration -- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | source/collection | custom_validation_schema is mandatory field | data migration to set None for empty/null -- [OpenConceptLab/ocl_issues#1498](https://github.com/OpenConceptLab/ocl_issues/issues/1498) | batch delete to use transaction -- Bump pydash from 5.1.1 to 6.0.2 (#389) -- Bump mock from 4.0.3 to 5.0.1 (#383) -- Errbit | fixing retire of concept/mapping with no latest version | probable bad data -- [OpenConceptLab/ocl_issues#1458](https://github.com/OpenConceptLab/ocl_issues/issues/1458) | Mapping test to update sort_weight -- Bump drf-yasg from 1.21.4 to 1.21.5 (#377) -- Bump django from 4.1.6 to 4.1.7 (#380) -##### 2.2.71 - Wed Feb 15 10:22:02 2023 +0000 -- Tests for OID views -- Revert - batch index | revert exception handling -- Facets | added fields to facets search -- correcting view hierarchy -- Indexing | ignoring exception -- Indexing | ignoring exception -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | not returning self -##### 2.2.70 - Mon Feb 13 12:16:39 2023 +0000 -- Bump django-dirtyfields from 1.9.0 to 1.9.1 (#374) -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | Source version summary | using active concepts/mappings queryset -- Reports | Fixing months calculation -- Bump psycopg2 from 2.9.3 to 2.9.5 (#297) -##### 2.2.69 - Fri Feb 10 10:04:02 2023 +0000 -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | fixing for mapping with non-existant concept -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | fixing flaky test -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | API response for different field distributions -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | updated api response structure -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | correcting source version concepts queryset -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | fixing serializer -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | fixing serializer -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | fixing pylint -- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | Source version summary verbose API -- Fixing token check -##### 2.2.68 - Tue Feb 7 05:22:41 2023 +0000 -- [OpenConceptLab/ocl_issues#1412](https://github.com/OpenConceptLab/ocl_issues/issues/1412) Enabling version endpoint for FHIR -- [OpenConceptLab/ocl_issues#1412](https://github.com/OpenConceptLab/ocl_issues/issues/1412) Migrate new FHIR endpoint to fhir subdomain -- fixing pylint -- fixing pylint -- API to trigger monthly usage report -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Bundle | serializer can return list format response | can exclude self if no results in flat cascade -- Bump django from 4.1.3 to 4.1.6 (#367) -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | creating equivalent mapping from equivalent map type provided -- OpenConcetpLab/ocl_issues#1411 Fix formatting -- OpenConcetpLab/ocl_issues#1411 Fix POSTing to CodeSystem and ValueSet validate-code -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | fixing for non-existent target concept -##### 2.2.67 - Fri Feb 3 07:42:59 2023 +0000 -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | added to/from-concept-code in mapping while cloning -- Fixing recursion in flat cascade query -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | handling schema validation exceptions -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | cloning concepts first and then mappings -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | not cloning external_id -- [OpenConceptLab/ocl_issues#1422](https://github.com/OpenConceptLab/ocl_issues/issues/1422) Refactor how OCL FHIR Core interacts with OCL expansions -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation to use equivalency map type to check existing concept and concept mnemonic is based on parent and not copied -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | fixing mapping clone for non-existing target concept -##### 2.2.66 - Wed Feb 1 06:45:03 2023 +0000 -- Creating index for concept/mapping count -- fixing pylint -- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | correcting current month range for scheduled report -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | bundle clone fixes -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | fixing clone -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | bundle clone parameters -- Source active concepts/mappings count for HEAD correction -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | fixing pylint -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Source concepts clone API (similar to references) -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | concept clone API (similar to cascade) -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | bundle clone resource -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | clone behavior on source -- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | clone with cascade behaviour for concept -- [OpenConceptLab/ocl_issues#1417](https://github.com/OpenConceptLab/ocl_issues/issues/1417) Fix formatting -- [OpenConceptLab/ocl_issues#1417](https://github.com/OpenConceptLab/ocl_issues/issues/1417) Fix FHIR global space loading time -##### 2.2.65 - Thu Jan 26 04:52:07 2023 +0000 -- Concept/Mapping | indexes optimization -- [OpenConceptLab/ocl_issues#1416](https://github.com/OpenConceptLab/ocl_issues/issues/1416) Properly logging exception -- [OpenConceptLab/ocl_issues#1416](https://github.com/OpenConceptLab/ocl_issues/issues/1416) Do not fail if cannot represent resource as FHIR -##### 2.2.64 - Tue Jan 24 09:59:26 2023 +0000 -- Fixing concept map views serializer for swagger -##### 2.2.63 - Tue Jan 24 09:37:53 2023 +0000 -- [OpenConceptLab/ocl_issues#1463](https://github.com/OpenConceptLab/ocl_issues/issues/1463) | fixing cascade mapping serializer for target concept name -##### 2.2.62 - Wed Jan 18 11:06:49 2023 +0000 -- Errbit client | checking for cause exists or not -##### 2.2.61 - Wed Jan 18 10:50:20 2023 +0000 -- Errbit client | adding exception as cause in message and backtrace -- fixing pylint -- Refactoring concept/mappings listing -- Tests for OCL SSO auth backend -##### 2.2.60 - Wed Jan 18 07:28:02 2023 +0000 -- [OpenConceptLab/ocl_issues#1452](https://github.com/OpenConceptLab/ocl_issues/issues/1452) | Bundle | changing repo_url to repo_version_url -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | fixing locale create -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | removed redundant admin APIs for locales cleanup -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | ConceptName | concept_id is mandatory | fixing tests -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | migrations | removed dormant locales and old M2M relations -##### 2.2.59 - Wed Jan 18 03:38:17 2023 +0000 -- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConceptMap Operations: fixing test -- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConceptMap Operations: use assertRaises -- updated docker-compose version -- bumped coverage to 93 -- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConceptMap Operations: follow up -- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConceptMap Operations: translate -- [OpenConceptLab/ocl_issues#1430](https://github.com/OpenConceptLab/ocl_issues/issues/1430) | separating pre_startup script | includes migrate and other tasks -- Concept Search | fixing wild card search -- coverage to 92 -- coverage to 92 -- AuthService | missing tests -- Importers | fixing mocks -- Importers | missing assertions -- Concept Search | search with multiple words and anything between them in synonyms -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | removed unused API -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | fixing pylints -- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | names/descriptions migrations to split names and descriptions -- [OpenConceptLab/ocl_issues#1457](https://github.com/OpenConceptLab/ocl_issues/issues/1457) | cascade param equivalencyMapType -- [OpenConceptLab/ocl_issues#1451](https://github.com/OpenConceptLab/ocl_issues/issues/1451) | omitIfExistsIn to exclude all resource versions -- Concept Search | search with multiple words and anything between them -- [OpenConceptLab/ocl_issues#1451](https://github.com/OpenConceptLab/ocl_issues/issues/1451) | Concept cascade | Omit if exists in repo version -##### 2.2.58 - Mon Jan 2 10:19:30 2023 +0000 -- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | Errbit | fixing monthly usage report duration -- [OpenConceptLab/ocl_issues#1452](https://github.com/OpenConceptLab/ocl_issues/issues/1452) | added repo_url in cascade response -- [OpenConceptLab/ocl_issues#1450](https://github.com/OpenConceptLab/ocl_issues/issues/1450) | fixing tests -- updated changelog -- [OpenConceptLab/ocl_issues#1450](https://github.com/OpenConceptLab/ocl_issues/issues/1450) | removed uuid from cascade response -##### 2.2.57 - Wed Dec 28 03:22:31 2022 +0000 -- [OpenConceptLab/ocl_issues#1447](https://github.com/OpenConceptLab/ocl_issues/issues/1447) | fixing mapping importer for duplicate mappings -- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | fixing pylint -- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | changing subject -- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | fixing tests -- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | fixing pylint -- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | monthly usage report to show current month results and trend over last 3 months -- [OpenConceptLab/ocl_issues#1446](https://github.com/OpenConceptLab/ocl_issues/issues/1446) | mapping sort_weight field to be populated in versions | tests for importer -- [OpenConceptLab/ocl_issues#1448](https://github.com/OpenConceptLab/ocl_issues/issues/1448) | fixing pylint -- [OpenConceptLab/ocl_issues#1448](https://github.com/OpenConceptLab/ocl_issues/issues/1448) | all owned orgs/sources/collections properties on user | handling user hard delete exception -##### 2.2.56 - Thu Dec 22 05:33:32 2022 +0000 -- Exception handling for import deadlock -- [OpenConceptLab/ocl_issues#1446](https://github.com/OpenConceptLab/ocl_issues/issues/1446) | mapping sort_weight field and ordering -##### 2.2.55 - Wed Dec 21 07:49:47 2022 +0000 -- request full url in header -- Extracting env vars for email and web url -##### 2.2.54 - Wed Dec 14 04:06:51 2022 +0000 -- [OpenConceptLab/ocl_issues#1430](https://github.com/OpenConceptLab/ocl_issues/issues/1430) | skipping other tasks if migrations are skipped -- Correcting job schedule -- [OpenConceptLab/ocl_issues#1430](https://github.com/OpenConceptLab/ocl_issues/issues/1430) Adjusting logging -- [OpenConceptLab/ocl_issues#1430](https://github.com/OpenConceptLab/ocl_issues/issues/1430) Support DB migrations in background -- [OpenConceptLab/ocl_issues#1135](https://github.com/OpenConceptLab/ocl_issues/issues/1135) | Logged in user to be able to view other user details -##### 2.2.53 - Fri Dec 9 05:51:23 2022 +0000 -- [OpenConceptLab/ocl_issues#1408](https://github.com/OpenConceptLab/ocl_issues/issues/1408) | fixing queryset -- [OpenConceptLab/ocl_issues#1408](https://github.com/OpenConceptLab/ocl_issues/issues/1408) | API to get mapped sources for a source -- Contributions doc (#282) -##### 2.2.52 - Tue Nov 29 04:04:11 2022 +0000 -- [OpenConceptLab/ocl_issues#1437](https://github.com/OpenConceptLab/ocl_issues/issues/1437) | fixing OpenMRS cascade system version resolution for cascade -- Code systems operations | fixing tests -- CodeSystem operations URL to support with and without / -- [OpenConceptLab/ocl_issues#1363](https://github.com/OpenConceptLab/ocl_issues/issues/1363) | added missing fields -##### 2.2.51 - Wed Nov 16 10:44:17 2022 +0000 -- Bump coverage from 6.2 to 6.5.0 (#290) -- Bump django-dirtyfields from 1.8.2 to 1.9.0 (#287) -- Bump djangorestframework from 3.13.1 to 3.14.0 (#289) -##### 2.2.50 - Sun Nov 13 06:07:30 2022 +0000 -- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | refactoring -- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | Exclude resource from expansion test and fix -- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | OpenMRS Cascade fixes -- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | For cascade + transform | return the concluded expression in response -- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | added transform in reference serializer -- [OpenConceptLab/ocl_issues#1038](https://github.com/OpenConceptLab/ocl_issues/issues/1038) | fixing test -- [OpenConceptLab/ocl_issues#1038](https://github.com/OpenConceptLab/ocl_issues/issues/1038) | fixing test -- [OpenConceptLab/ocl_issues#1038](https://github.com/OpenConceptLab/ocl_issues/issues/1038) | monthly usage report scheduled to run on 1st of every month to report prev month's usage -- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | fixing tranform reference when nothing returns from queryset -- [OpenConceptLab/ocl_issues#1038](https://github.com/OpenConceptLab/ocl_issues/issues/1038) | monthly usage report task -- fixing flaky test -- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | OpenMRS cascade | accepting cascade expanded structure -- [OpenConceptLab/ocl_issues#1309](https://github.com/OpenConceptLab/ocl_issues/issues/1309) | fixing mappings importers query for existence check for special characters -- Bulk importer update counts async -- Source HEAD last child updated at query optimisation -##### 2.2.49 - Sun Nov 6 01:56:03 2022 +0000 -- Can force queue an export -- [OpenConceptLab/ocl_issues#1233](https://github.com/OpenConceptLab/ocl_issues/issues/1233) ConceptMap CRUD -##### 2.2.48 - Fri Nov 4 02:44:05 2022 +0000 -Tue Sep 14 18:39:45 2021 +0530 -- [OpenConceptLab/ocl_issues#1406](https://github.com/OpenConceptLab/ocl_issues/issues/1406) | expansion parameter | system-version can be multiple comma separated -- Bump requests from 2.27.1 to 2.28.1 (#283) -- Bump pydash from 5.1.0 to 5.1.1 (#284) -- Bump drf-yasg from 1.20.0 to 1.21.4 (#285) -- Bump django from 4.1.1 to 4.1.3 (#286) -##### 2.2.47 - Thu Nov 3 04:19:47 2022 +0000 -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | fixing hierarchy for repo version cascade -- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | Fixed healthchecks for celery and celery_beat -- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | added beat task for healthcheck | added management command to check for beat health -- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | updated celery command line -- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | updated celery command line -- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | Using custom fork of flower | fixes https://github.com/mher/flower/issues/1231 -- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | added django-celery-beat | upgraded celery/redis/kombu/flower -- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | fixing typo -- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | local beat setup -##### 2.2.46 - Wed Nov 2 05:54:56 2022 +0000 -- [OpenConceptLab/ocl_issues#1356](https://github.com/OpenConceptLab/ocl_issues/issues/1356) | migration to populate extras in repo versions from HEAD -- [OpenConceptLab/ocl_issues#1356](https://github.com/OpenConceptLab/ocl_issues/issues/1356) | source/collection version extras -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | fixing pylint -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | to also return requested url -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | not returning uuid -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | removed includeMappings -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | Source version detail serializer | Added hierarchy root url -- Refactoring | Extracting constant for "*" symbol -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | concept cascade with return map types false -- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | fixing accented character -- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | caching default locales API -- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | added source description -- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | OCL default locales API | GET /locales/ -- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | ISO/iso639-1/locales fixtures -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | removed redundant name field -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade return map types to use filter map types criteria -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade returnMapTypes behaviour -- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | SSO with KeyCloak -- OpenMRSMappingValidator | better query -- OpenMRSMappingValidator | do not validate if mapping is retired -- bulk import | better query for indexes update -##### 2.2.45 - Mon Oct 17 10:49:16 2022 +0000 -- Mappings import | Correcting mappings exists check -##### 2.2.44 - Mon Oct 17 09:43:33 2022 +0000 -- Mappings Validation | ignoring retired -##### 2.2.43 - Sun Oct 16 02:01:26 2022 +0000 -- OpenMRS mapping validation schema to ignore old retired versions of mappings -- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | added iso-637-1 locale in lookup data -- [OpenConceptLab/ocl_issues#1382](https://github.com/OpenConceptLab/ocl_issues/issues/1382) | Source/Collection | supported locales to always have default locale first -- Revert "Disabling server side cursors | fixing connection pooling" -- Disabling server side cursors | fixing connection pooling -- [OpenConceptLab/ocl_issues#1245](https://github.com/OpenConceptLab/ocl_issues/issues/1245) | extras search query to replace '-' with '_' -- [OpenConceptLab/ocl_issues#1288](https://github.com/OpenConceptLab/ocl_issues/issues/1288) Upgrade Postgres to 14.4 -- Revert "OpenConceptLab/ocl_issues#1288 Upgrade Postgres to latest stable (13.7)" -- [OpenConceptLab/ocl_issues#1288](https://github.com/OpenConceptLab/ocl_issues/issues/1288) Upgrade Postgres to latest stable (13.7) -- [OpenConceptLab/ocl_issues#1354](https://github.com/OpenConceptLab/ocl_issues/issues/1354) | fixing pylint error -- [OpenConceptLab/ocl_issues#1354](https://github.com/OpenConceptLab/ocl_issues/issues/1354) | retired mapping csv test -- [OpenConceptLab/ocl_issues#1215](https://github.com/OpenConceptLab/ocl_issues/issues/1215) | Imports | handling invalid/bad CSV uploads -##### 2.2.42 - Wed Sep 28 04:42:00 2022 +0000 -Tue Sep 14 18:39:45 2021 +0530 -- [OpenConceptLab/ocl_issues#1354](https://github.com/OpenConceptLab/ocl_issues/issues/1354) | sample csv and test for retired mapping (CSV -> JSON) -- Source/Collection delete | already queued handling -- Reference | fixing translation for encoded codes -- removed unused import -- Fixing test -- [OpenConceptLab/ocl_issues#1354](https://github.com/OpenConceptLab/ocl_issues/issues/1354) | concept/mapping importers | delete action -- [OpenConceptLab/ocl_issues#1348](https://github.com/OpenConceptLab/ocl_issues/issues/1348) | Source/Collection | converting json attributes to json -- Bump whitenoise from 5.3.0 to 6.2.0 (#273) -- Bump markdown from 3.3.7 to 3.4.1 (#272) -- Bump django-cors-headers from 3.12.0 to 3.13.0 (#271) -- Bump django-dirtyfields from 1.8.1 to 1.8.2 (#270) -- [OpenConceptLab/ocl_issues#1353](https://github.com/OpenConceptLab/ocl_issues/issues/1353) | removed collection.repository_type -- [OpenConceptLab/ocl_issues#1352](https://github.com/OpenConceptLab/ocl_issues/issues/1352) | concept facets for encoded characters -- [OpenConceptLab/ocl_issues#1145](https://github.com/OpenConceptLab/ocl_issues/issues/1145) | API to get full result of task by taskID -##### 2.2.41 - Thu Sep 8 03:32:59 2022 +0000 -- [OpenConceptLab/ocl_issues#1351](https://github.com/OpenConceptLab/ocl_issues/issues/1351) | external_id exact searchable -- Bump djangorestframework from 3.12.4 to 3.13.1 (#269) -- Upgraded pylint -- Bump django from 4.0.6 to 4.1.1 (#268) -- Fixing test -- [OpenConceptLab/ocl_issues#1343](https://github.com/OpenConceptLab/ocl_issues/issues/1343) | Reference translation additions -##### 2.2.40 - Fri Sep 2 07:50:20 2022 +0000 -- Fixing ocladmin orgs membership data reset on api deploy -- [OpenConceptLab/ocl_issues#1343](https://github.com/OpenConceptLab/ocl_issues/issues/1343) | added translation in collection references -- [OpenConceptLab/ocl_issues#1348](https://github.com/OpenConceptLab/ocl_issues/issues/1348) | Org Listing API | added type -- [OpenConceptLab/ocl_issues#1347](https://github.com/OpenConceptLab/ocl_issues/issues/1347) | fixing pylints -- [OpenConceptLab/ocl_issues#1347](https://github.com/OpenConceptLab/ocl_issues/issues/1347) | Source/Collection version | members and admin can recompute summary -##### 2.2.39 - Fri Aug 5 08:58:41 2022 +0000 -- [OpenConceptLab/ocl_issues#1309](https://github.com/OpenConceptLab/ocl_issues/issues/1309) | MappingImporter | fixing queryset for exists check -##### 2.2.38 - Thu Aug 4 05:53:21 2022 +0000 -- Errbit | Collection reference filters to query fix | fixing test -- Errbit | Collection reference filters to query fix -- Collection add expressions can be requested as async task -- docker-compose | added volume for postgres db -##### 2.2.37 - Fri Jul 29 02:57:48 2022 +0000 -- concept serializer | fixing test -- concept flat cascade | fixing hierarchical concepts | added retired flag -##### 2.2.36 - Wed Jul 27 05:57:02 2022 +0000 -- Extracting env vars for email setting -##### 2.2.35 - Tue Jul 26 05:04:41 2022 +0000 -- [OpenConceptLab/ocl_issues#1339](https://github.com/OpenConceptLab/ocl_issues/issues/1339) | concept cascade to include/exclude retired results -##### 2.2.34 - Mon Jul 25 09:22:42 2022 +0000 -- Extract export service (S3) | can plugin upload/download service via settings -##### 2.2.33 - Fri Jul 22 02:26:02 2022 +0000 -- Errbit | Bulk create of mapping/concept via POST is not allowed -- Fixing version export with version creation -##### 2.2.32 - Thu Jul 21 03:24:07 2022 +0000 -- Importer | Added Failed in summary -- Importer | delete action needs to be in sync with others in the same group -##### 2.2.31 - Tue Jul 19 02:41:13 2022 +0000 -- Collection last child update query fix -##### 2.2.30 - Mon Jul 18 03:17:34 2022 +0000 -- [OpenConceptLab/ocl_issues#1335](https://github.com/OpenConceptLab/ocl_issues/issues/1335) | User Management | verification and admin toggle -- [OpenConceptLab/ocl_issues#1336](https://github.com/OpenConceptLab/ocl_issues/issues/1336) | Speed up tests by getting rid of delete_all and relying on rollback -- [OpenConceptLab/ocl_issues#1335](https://github.com/OpenConceptLab/ocl_issues/issues/1335) | Admin can force mark verified any user -- Logs | added request method in response headers -- Logs | added request url in response headers -##### 2.2.28 - Wed Jul 13 05:32:06 2022 +0000 -- Bump boto3 from 1.23.0 to 1.24.28 (#261) -- Bump django-ordered-model from 3.4.3 to 3.6 (#260) -- Collection version references | verbose response -- Bump django-cid from 2.2 to 2.3 (#259) -- Bump psycopg2 from 2.9.2 to 2.9.3 (#257) -##### 2.2.26 - Fri Jul 8 08:59:11 2022 +0000 -- [OpenConceptLab/ocl_issues#1332](https://github.com/OpenConceptLab/ocl_issues/issues/1332) | fixing task to load less -- [OpenConceptLab/ocl_issues#1332](https://github.com/OpenConceptLab/ocl_issues/issues/1332) | fixing method signature -- Fixing task view test -- [OpenConceptLab/ocl_issues#1332](https://github.com/OpenConceptLab/ocl_issues/issues/1332) | API/task for backfilling repo versions to expansions -##### 2.2.25 - Fri Jul 8 05:36:11 2022 +0000 -- CollectionReference | API to resolve reference -##### 2.2.24 - Thu Jul 7 07:02:23 2022 +0000 -- Errbit | fixing exception class import -- Errbit | ES search exception | data too large -- Fixing Mapping creation without from/to source -##### 2.2.23 - Wed Jul 6 06:01:54 2022 +0000 -- removed unused import -- Bump django from 4.0.5 to 4.0.6 (#258) -- API/Task to link all references resources -- Task to migrate references -- Task to migrate references | ignoring coverage -- Task to migrate from old to new reference structure | added logs -- APIs to Link reference with resources and to migrate from old to new structure via job -- Reference | migrating old reference to new structure via management command -- Revert "Reference | migrating old reference to new structure" -- Reference | migrating old reference to new structure -- Utils | Test for more scenarios -- Merge pull request #254 from OpenConceptLab/dependabot/pip/django-request-logging-0.7.5 -- [OpenConceptLab/ocl_issues#1145](https://github.com/OpenConceptLab/ocl_issues/issues/1145) | API to get any task info by ID from Flower -- Bump django-request-logging from 0.7.3 to 0.7.5 -##### 2.2.20 - Wed Jun 29 05:10:39 2022 +0000 -- Expansions | corrected user signatures on create -- Skipping csv test | getting hung sometimes -- Errbit | not using cache for openmrs concept validator lookups -- [OpenConceptLab/ocl_issues#1330](https://github.com/OpenConceptLab/ocl_issues/issues/1330) | LocalizedText.name is a Hash Index -- [OpenConceptLab/ocl_issues#1329](https://github.com/OpenConceptLab/ocl_issues/issues/1329) | Source/Collection serializers | canonical_url as char field -- [OpenConceptLab/ocl_issues#1329](https://github.com/OpenConceptLab/ocl_issues/issues/1329) | canonical_url check works for any uri scheme -- [OpenConceptLab/ocl_issues#1329](https://github.com/OpenConceptLab/ocl_issues/issues/1329) | canonical_url can take any URI -##### 2.2.18 - Fri Jun 24 07:36:16 2022 +0000 -- Concept/Mapping | repo version query to not check for public access | added indexes for repo versions -- Revert "OpenConceptLab/ocl_issues#1320 | reference cascade to use unique resources" -##### 2.2.16 - Fri Jun 24 05:36:31 2022 +0000 -- [OpenConceptLab/ocl_issues#1320](https://github.com/OpenConceptLab/ocl_issues/issues/1320) | expansion to add unique resources -##### 2.2.15 - Fri Jun 24 04:50:56 2022 +0000 -- Errbit | fixing mapping collection membership API -- Errbit | fixing concept collection membership API -- [OpenConceptLab/ocl_issues#1320](https://github.com/OpenConceptLab/ocl_issues/issues/1320) | reference cascade to use unique resources -- [OpenConceptLab/ocl_issues#1307](https://github.com/OpenConceptLab/ocl_issues/issues/1307) | expansions to keep resolved repo versions -- Added concept indexes for repo version query -##### 2.2.14 - Mon Jun 20 08:43:13 2022 +0000 -- [OpenConceptLab/ocl_issues#1325](https://github.com/OpenConceptLab/ocl_issues/issues/1325) | Mapping target concept name reverse -- [OpenConceptLab/ocl_issues#1325](https://github.com/OpenConceptLab/ocl_issues/issues/1325) | Mapping target concept name -##### 2.2.13 - Fri Jun 17 04:59:06 2022 +0000 -- importers.models | ignoring logs from coverage -- non-negative validator test -##### 2.2.12 - Wed Jun 15 03:27:20 2022 +0000 -- Mocking Redis service -- Bump django from 4.0.4 to 4.0.5 -- increased coverage to 93 -- Repo version export delete test -- Repo version processing view integration tests -- missing S3 test -- revived s3 test -- upgraded moto to latest -- unit tests for postgresql service for sequence CRUD -- [OpenConceptLab/ocl_issues#1116](https://github.com/OpenConceptLab/ocl_issues/issues/1116) | Added Response time header -- Errbit | bulk import task to throw error when 'type' is missing on any line -- Fixing source mnemonic sequence not present for older sources -- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) Fixing test -- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) Adding tests and fixes -##### 2.2.11 - Fri Jun 10 07:59:57 2022 +0000 -- [OpenConceptLab/ocl_issues#1311](https://github.com/OpenConceptLab/ocl_issues/issues/1311) | resources search attributes | correcting boost and attr meta -- [OpenConceptLab/ocl_issues#1311](https://github.com/OpenConceptLab/ocl_issues/issues/1311) | org search attributes | correcting boost and attr meta -##### 2.2.10 - Fri Jun 10 05:40:43 2022 +0000 -- [OpenConceptLab/ocl_issues#1311](https://github.com/OpenConceptLab/ocl_issues/issues/1311) | wildcard search boost=0 -##### 2.2.9 - Fri Jun 10 03:22:12 2022 +0000 -- CollectionReference | not using expression to compute concepts/mappings -- [OpenConceptLab/ocl_issues#1321](https://github.com/OpenConceptLab/ocl_issues/issues/1321) | ES extras | replacing hyphens with underscores -- [OpenConceptLab/ocl_issues#1215](https://github.com/OpenConceptLab/ocl_issues/issues/1215) | Errbit | Imports | Handling invalid JSON error -- Errbit | throwing error in repo version import when HEAD could not be found -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | pylintrc | disable false positive cyclic-import -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | sources | updated as per pylint2.14 -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | valuesets | updated as per pylint2.14 -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | common | updated as per pylint2.14 -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | importers | updated as per pylint2.14 -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | concepts | updated as per pylint2.14 -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | collections | updated as per pylint2.14 -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | pylint | no-self-use is a separate plugin now -- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | pylint | fixing utils to ignore dunder calls -- [OpenConceptLab/ocl_issues#1295](https://github.com/OpenConceptLab/ocl_issues/issues/1295) | exposing route to cascade concept within expansion context -- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | Exclude Expression | when resource version is not specified, it will exclude all versions -- [OpenConceptLab/ocl_issues#1311](https://github.com/OpenConceptLab/ocl_issues/issues/1311) | Making search attributes for each resource seperate and added boost -- Bump pylint from 2.12.2 to 2.14.0 -- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | correcting seq reset -- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | source autoid | source update can update autoid sequence -- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | source autoid | can set start from -- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | source autoid | not reseting on concept/mapping delete -- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | Concept id optional for autoid set sources -- [OpenConceptLab/ocl_issues#1295](https://github.com/OpenConceptLab/ocl_issues/issues/1295) | concept cascade forward/backward flat/hierarchy for collection version -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | expansion parameters | include system version switches version of code system -- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | Source autoid for concepts/mappings mnemonic/external_id -- Errbit | fixing collection summary compute -- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference add | fixing special characters in code -- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | added references in concept version detail serializer -- Errbit | fixing Collection/Sources json field indexing -- [OpenConceptLab/ocl_issues#1305](https://github.com/OpenConceptLab/ocl_issues/issues/1305) | parallel import | chunking with resource versions in same chunk -- [OpenConceptLab/ocl_issues#1289](https://github.com/OpenConceptLab/ocl_issues/issues/1289) | reference | cascade params to use all parameters -- [OpenConceptLab/ocl_issues#1289](https://github.com/OpenConceptLab/ocl_issues/issues/1289) | reference | fixing cascade params -- [OpenConceptLab/ocl_issues#1289](https://github.com/OpenConceptLab/ocl_issues/issues/1289) | reference parser | fixing include/exclude parsing -- [OpenConceptLab/ocl_issues#1301](https://github.com/OpenConceptLab/ocl_issues/issues/1301) | collection concept/mapping GET | using correct serializers -- [OpenConceptLab/ocl_issues#1299](https://github.com/OpenConceptLab/ocl_issues/issues/1299) | encoding concept id for cascade -- [OpenConceptLab/ocl_issues#1289](https://github.com/OpenConceptLab/ocl_issues/issues/1289) | updated parsers to handle few more scenarios -- APIs to get reference's concepts/mappings -- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference delete to exclude resource or resource-version based on resource result -- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference add with filter to use versioned_object_id -- [OpenConceptLab/ocl_issues#1234](https://github.com/OpenConceptLab/ocl_issues/issues/1234) Fixes to CodeSystem -- Not logging Load balancer requests -- Fixing paginator assignment -- CodeSystem/ValueSet | considering _count param for page size -- CodeSystem/ValueSet | added pagination links in serializer -- FHIRBundleSerializer | added links for pagination -- Bump django-cors-headers from 3.10.1 to 3.12.0 -- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | fixing delete -- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference delete to queue indexing for removed resourecs -- API to index expansion concepts/mappings -- [OpenConceptLab/ocl_issues#1234](https://github.com/OpenConceptLab/ocl_issues/issues/1234) Fixing identifier parsing -- [OpenConceptLab/ocl_issues#1234](https://github.com/OpenConceptLab/ocl_issues/issues/1234) Adding more debug info -- [OpenConceptLab/ocl_issues#1234](https://github.com/OpenConceptLab/ocl_issues/issues/1234) Fixing datetime issue -- using HEAD constant -- CodeSystem/ValueSet | using constants -- Cleaning CodeSystem views -- [OpenConceptLab/ocl_issues#123](https://github.com/OpenConceptLab/ocl_issues/issues/123) | ValueSet expand to be sync -- [OpenConceptLab/ocl_issues#123](https://github.com/OpenConceptLab/ocl_issues/issues/123) | Fixing Valueset expand test -- Bump markdown from 3.3.4 to 3.3.7 -- Bump boto3 from 1.21.27 to 1.23.0 -- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) ValueSet Operations (validate-code and expand) -- [OpenConceptLab/ocl_issues#1224](https://github.com/OpenConceptLab/ocl_issues/issues/1224) | restricting concept cascade to source version -- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | reference bulk delete -- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | reference delete to reevaluate other references -- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | new ref in expansion evaluates all exclusion refs also -- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | added include/exclude in old style list parser -- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | added include/exclude in reference clone -- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference summary as part of verbose reference response -- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | exclude reference -- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) | Valueset | cleaning/formatting serializer/tests -- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) | Valueset | using collection reference parser -- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) ValueSet Operations, filter -- bumping coverage to 92: -- Added test for collection version expansions APIs -- Added test for collection version expansion delete -- Added test for collection version expansion concept view -- Added test for collection version expansion concept's mappings list view -- Added test for collection version expansion mapping retrieve -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | fixing ES pagination -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | fixing ES max_clause_limit error when applying filters -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | logging async add references errors -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | fixing filter expression results -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | refactored expansion references add -- [OpenConceptLab/ocl_issues#1231](https://github.com/OpenConceptLab/ocl_issues/issues/1231) ValueSet CRUD -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) Addressing issues after initial testing -- added missing test for collection version summary get -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | refactoring parsers | adding more tests -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Valuset expression | resolving queryset correctly -- Errbit | fixing search result slicing when page is not defined -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | fixing collection references PUT response -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Added more tests around new style syntax parser -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | reference filter can take exact_match as well -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | removed unused import -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Setting expression for expanded structure -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Collection Reference Delete API -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Collection Reference response to have more info -- CodeSystem formatting tests -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Expanded Reference Structure and refactorings -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | generic collection reference parser for old and new style -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | generic old style to new expanded reference structure parser -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | another assertion for a test -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | parser for old style all source resources reference expression to new expanded structure -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | parser for old style reference expression to new expanded syntax -##### 2.2.8 - Mon May 2 04:00:50 2022 +0000 -- [OpenConceptLab/ocl_issues#1285](https://github.com/OpenConceptLab/ocl_issues/issues/1285) | Repo export behind permission -##### 2.2.7 - Sat Apr 30 03:52:38 2022 +0000 -- [OpenConceptLab/ocl_issues#1285](https://github.com/OpenConceptLab/ocl_issues/issues/1285) | Repo export behind permission -- [OpenConceptLab/ocl_issues#1283](https://github.com/OpenConceptLab/ocl_issues/issues/1283) | Concept synonyms indexing | using lowecase normalizer -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | reference filter field schema validation -- [OpenConceptLab/ocl_issues#1277](https://github.com/OpenConceptLab/ocl_issues/issues/1277) | not using redis cache backend on CI -- [OpenConceptLab/ocl_issues#1277](https://github.com/OpenConceptLab/ocl_issues/issues/1277) | Using cached lookup API for all lookups -- [OpenConceptLab/ocl_issues#1277](https://github.com/OpenConceptLab/ocl_issues/issues/1277) | added django cache backend as redis -- [OpenConceptLab/ocl_issues#1283](https://github.com/OpenConceptLab/ocl_issues/issues/1283) | concept search criteria | added synonyms search criteria with wildcards -- Postgres-Dev | upgraded to 14.2-alpine -- Bump django from 4.0.3 to 4.0.4 -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | Expansion Parameters | fixed order of parameters evaluation -- [OpenConceptLab/ocl_issues#1280](https://github.com/OpenConceptLab/ocl_issues/issues/1280) | added verbose references in collection's concept/mapping responses via query param -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | Source/Collection | making revision_date datetime field and setting on version release -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | expansion parameter | include/exclude system version considers valuesets as well -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | expansion parameter | applying include system before exclude -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | refactored resolve reference operation -- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | CollectionReference | added attributes for structured reference -- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | API for source head resources dedup deleted -##### 2.2.4 - Sat Apr 16 05:39:57 2022 +0000 -- [OpenConceptLab/ocl_issues#1280](https://github.com/OpenConceptLab/ocl_issues/issues/1280) | added references in collection/expansion mapping version detail -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | expansion parameter to include/exclude system version -- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | Making sure limit offset is applied in list queries -- Importers Errbit | fixing mapping failed index attempt issue -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | using API_BASE_URL in place of internal url -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | fixing empty queryset search -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | added expansion in facets filters -- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | Expansions | added 'filter' parameter -- Concept Importer | handling integer ids -- Upgraded to 2.2.0 -- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | concept/mappings list | correcting global queryset -- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | concept/mappings list | fixing parent resource set -- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | concept/mappings list | removing joins for HEAD parent calls | added indexes -- Errbit | collection expansion concepts/mappings CSV list fix -- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | concept list | not prefetching names -- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | reusing count query -- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | Concept/Mapping list view | added is_active clause -- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | Concept/Mapping list view | removing a join from query -- [OpenConceptLab/ocl_issues#1272](https://github.com/OpenConceptLab/ocl_issues/issues/1272) | test for concept retired TRUE/FALSE CSV converter -> import -##### 2.1.3 - Thu Apr 7 09:24:30 2022 +0000 -- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | (attempting) fixing whitenoise static files issue -- [OpenConceptLab/ocl_issues#1206](https://github.com/OpenConceptLab/ocl_issues/issues/1206) | removed old collection concepts/mappings relations -- [OpenConceptLab/ocl_issues#1206](https://github.com/OpenConceptLab/ocl_issues/issues/1206) | removed code to migrate old style to new style collection -- [OpenConceptLab/ocl_issues#1155](https://github.com/OpenConceptLab/ocl_issues/issues/1155) | Merge pull request #209 from OpenConceptLab/django4 -- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | add response serializer -- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | API route for head resources dedup -- Org data migration | adding creator and updator in members list -- [OpenConceptLab/ocl_issues#1247](https://github.com/OpenConceptLab/ocl_issues/issues/1247) | collection/source apis | brief response -- Refactoing | extracted common code -- Expansion test for getting mappings from a concept -- user search view test -- user org search view test -- user org collections/sources list test -- Concept Search | multi words wild card test -- Upgraded to Django4 -##### 2.1.0 - Mon Apr 4 08:57:29 2022 +0530 -- Upgraded to 2.1.0 -- Expansion | do not re-evaluate references for auto expansion -- coverage at 91 -- Collection get mapping expressions from concept in expansion test -- Collection Reference fetch concepts/mappings test -- Expansion delete expression tests -- Expansion clean test -- Expansion parameters test -- Mapping validation test -- Revert "reviving facets tests for CI" -- coverage at 90 -- reviving facets tests for CI -- Source mappings/concepts indexes view test -- Source Hierarchy view test -- Source version summary API test -- Collection version expansion mappings/concepts API list view test -- test for collection version (default expansion) concept mappings api -- test for expansion concept mappings api -- test for source update validation schema task -- test for source concepts/mappings batch index tasks -- added retry on failure for source mappings index task -- tests for source/collection resources count tasks -- tasks | test for delete s3 objects -- mapping hard delete test -- concept summary test -- Mapping collection membership test -- Concept collection membership test -- Concept hard delete request test -- Concept parents/children test -- Mapping reactivate test -- Concept locale edit and reactivate tests -- [OpenConceptLab/ocl_issues#1267](https://github.com/OpenConceptLab/ocl_issues/issues/1267) | repo HEAD export should delete old cached exports from S3 -- imports | update_comment in new concept/mapping -- imports | update_comment in new concept -- Reference Importer | one batch index index task each for concepts and mappings for all references -- batch_index_resources fixes -- indexing tasks | ignoring results and added retry -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | fixing get_serializer methods for swagger -- Repo Version export | logged upload status code -- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | API to dedup source head resource versions associations -- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | management task to have repo head only with resource latest versions -- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | repo HEAD will not keep all resource versions but latest only -- Merge pull request #207 from OpenConceptLab/dependabot/pip/boto3-1.21.27 -- Bump boto3 from 1.20.24 to 1.21.27 -- Perform search when is present -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Add validate-code and lookup for CodeSystem -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) Using 1 instead of 2 parallel workers for tests -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) Using 2 instead of 4 parallel workers for tests -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | Wait for ES when running tests -- Cascade | added target source/owner name in mappings response -- Fixing search criteria for hyphens -- coverage at 88 -- Bundle serializer | remove concepts/mappings count -- Fixing pylint -- Bundle serializer to close to Fhir Bundle response -- Coverage | minor refacotrings -- Coverage | Source index children test -- Coverage | utils | added missing test -- Coverage | import get task status | tests for flower service failed -- Coverage | tests for task delete -- Coverage | refactored client config serializers remove redundancy -- coverage to 87 -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | skipping facets test on CI -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | attemping index fix for CI -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | fixing test for CI -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | fixing pylint -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | fail build if coverage is below 88 -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | more search behaviours in integration tests -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | concept search integration test -- Revert "Revert "OpenConceptLab/ocl_issues#1244 | concept search integration test"" -- Correcting celery signal processor -- Revert "OpenConceptLab/ocl_issues#1244 | concept search integration test" -- Concept/Mapping | added indexes for versioned_object_id -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | concept search integration test -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | Disable redis -- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | Enable ES tests on Bamboo -- Parallel Imports | allowing update_comment field in concept/mapping imports -- Errbit | increased ES timeout to 60 seconds -- [OpenConceptLab/ocl_issues#1230](https://github.com/OpenConceptLab/ocl_issues/issues/1230) | references add | transform resource versions is acknowledged -- Imports | chunking indexing to multiple tasks -- User reactivate should reset the status of user -- [OpenConceptLab/ocl_issues#1246](https://github.com/OpenConceptLab/ocl_issues/issues/1246) | upgraded ES image to 7.17.1 | now supports mac m1 -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Bullet-proof identifier and extra logging -- [OpenConceptLab/ocl_issues#1241](https://github.com/OpenConceptLab/ocl_issues/issues/1241) | concept/mapping retrieve should work for source version request -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | integration test expansion concept -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | integration test expansion mappings -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | integration test for resolve operation -- APIs to get concept/mapping details from collection expansion -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | resolveReference | added requested info, resolution_url in response | can consider string expressions as well -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | resolveReference | considering namespace only in case of canonical (FQDN) -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Making fields non-required -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | versionless resolve reference to resolve to latest or HEAD -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Adding support for create and update for CodeSystems -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Addressing review -- [OpenConceptLab/ocl_issues#1203](https://github.com/OpenConceptLab/ocl_issues/issues/1203) | Source/Collection Home | styling breadcrumbs to have fixed button widths | styling selected controls -- Errbit | fixing search results slicing when page is 0 -- Exapnsions revaluate references always -- [OpenConceptLab/ocl_issues#1225](https://github.com/OpenConceptLab/ocl_issues/issues/1225) | Reference Import | fixing indexing -- [OpenConceptLab/ocl_issues#1225](https://github.com/OpenConceptLab/ocl_issues/issues/1225) | Collection Expansion processing to happen in sync in bulk import -- [OpenConceptLab/ocl_issues#1225](https://github.com/OpenConceptLab/ocl_issues/issues/1225) | Parallel Importer | making sure repo versions are processed in right order -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | resolve reference to consider Collections | using version list serializer response when resolved -- updated Readme -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | accepting relative url for source version -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | fixing pylint errors -- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | reference expression resolve API -- [OpenConceptLab/ocl_issues#1219](https://github.com/OpenConceptLab/ocl_issues/issues/1219) | removed dead code -- [OpenConceptLab/ocl_issues#1219](https://github.com/OpenConceptLab/ocl_issues/issues/1219) | Concept index | added synonyms -- [OpenConceptLab/ocl_issues#1220](https://github.com/OpenConceptLab/ocl_issues/issues/1220) | facets size 20 (from default 10) -- [OpenConceptLab/ocl_issues#1206](https://github.com/OpenConceptLab/ocl_issues/issues/1206) | removed dead code -- Unused import removed -- Expansions | API to get concept mappings from collection version context -- Expansions | fixing concept mappings from collection/expansion context -- [OpenConceptLab/ocl_issues#1203](https://github.com/OpenConceptLab/ocl_issues/issues/1203) | added uuid in references serializers -- concept/mapping version membership | removing duplicates -- Expansions | simplifying concept/mapping collection index -- Expansions | correcting concept/mapping collection_version membership api -- Expansions | correcting concept/mapping collection_version list property -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | fixing tests -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Fixing formatting -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Fixing formatting -- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Adding FHIR CodeSystem resource (read only) -- Making sure expansion mnemonic is used when provided -- [OpenConceptLab/ocl_issues#826](https://github.com/OpenConceptLab/ocl_issues/issues/826) | fixing tests -- [OpenConceptLab/ocl_issues#1209](https://github.com/OpenConceptLab/ocl_issues/issues/1209) | ordering children by mnemonic -- [OpenConceptLab/ocl_issues#826](https://github.com/OpenConceptLab/ocl_issues/issues/826) | parallel importer | batch index concepts/mappings -- [OpenConceptLab/ocl_issues#1209](https://github.com/OpenConceptLab/ocl_issues/issues/1209) | source parent less concepts API support -- [OpenConceptLab/ocl_issues#1209](https://github.com/OpenConceptLab/ocl_issues/issues/1209) | API to get source's parent less concepts -- [OpenConceptLab/ocl_issues#1209](https://github.com/OpenConceptLab/ocl_issues/issues/1209) | concept has children property -- [OpenConceptLab/ocl_issues#1205](https://github.com/OpenConceptLab/ocl_issues/issues/1205) | collection version export to wait until auto expansion is processing -- Migrations | fixing deleting dormant collection references -- Migrations | deleting dormant collection references -- Migrations | deleting dormant collection references -- fixing migration | creating postgres btree gin extension -- fixing migration | creating postgres btree gin extension -- fixing migration | creating psql extension -- Collection Reference -> Concept/Mapping association -- concept/version details/listing serializer | added versioned_object_id for term browser -- concept/mapping lists | added indexes and refactored queryset -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | concept cascade recursion | keeping it DRY -- [OpenConceptLab/ocl_issues#1196](https://github.com/OpenConceptLab/ocl_issues/issues/1196) | monthly usage report visualization -- [OpenConceptLab/ocl_issues#1197](https://github.com/OpenConceptLab/ocl_issues/issues/1197) | openmrs schema locales type from term browser fix -- [OpenConceptLab/ocl_issues#1191](https://github.com/OpenConceptLab/ocl_issues/issues/1191) | collection add reference | dynamic reference fix -- [OpenConceptLab/ocl_issues#1191](https://github.com/OpenConceptLab/ocl_issues/issues/1191) | Collection References | delete to use existing queryset -- [OpenConceptLab/ocl_issues#1191](https://github.com/OpenConceptLab/ocl_issues/issues/1191) | Collection References | not hard deleting, just disassociating -- [OpenConceptLab/ocl_issues#1191](https://github.com/OpenConceptLab/ocl_issues/issues/1191) | Collection References | fixing reference delete -- Collection/Version/Expansion | concepts/mappings facets class -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | correcting entries conditions -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | as hierarchy terminal indicator -- deleted dead code -- Coverage at 85 -- client-configs | using utils more -- Collection/Expansion | missing test | dead code -- Coverage increased to 86 -- [OpenConceptLab/ocl_issues#1128](https://github.com/OpenConceptLab/ocl_issues/issues/1128) | source/collection async delete is default -- Fixing flaky test -- [OpenConceptLab/ocl_issues#997](https://github.com/OpenConceptLab/ocl_issues/issues/997) | fixing reference expression resolve -- [OpenConceptLab/ocl_issues#1136](https://github.com/OpenConceptLab/ocl_issues/issues/1136) | startup | migration from old style collection to new style -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | levels to refelect cascade levels and not recursion levels -- [OpenConceptLab/ocl_issues#1136](https://github.com/OpenConceptLab/ocl_issues/issues/1136) | management command for collection migration from oldstyle to newstyle -- coverage back to 85 -- Mapping/Concept version tests -- Mapping/Concept version hard delete -- Fixing Concept Version Hard Delete | fixing concept/mapping listing and active concepts/mappings count queries -- Concept Version Hard delete to not delete locales -- [OpenConceptLab/ocl_issues#1180](https://github.com/OpenConceptLab/ocl_issues/issues/1180) | moving away from celery autoscale -- Expansions | indexing async -- Mapping Collection Membership API -- Merge branch 'master' into collection_expansions -- [OpenConceptLab/ocl_issues#712](https://github.com/OpenConceptLab/ocl_issues/issues/712) | fixing pylint warnings -- [OpenConceptLab/ocl_issues#712](https://github.com/OpenConceptLab/ocl_issues/issues/712) | utils | method to get values from nested dict -- Merge branch 'master' into collection_expansions -- updated requests package -- Errbit fix | concepts mappings | return 404 if concept not found -- celery healthcheck | increased timeout -- celery healthcheck | increased timeout -- [OpenConceptLab/ocl_issues#1179](https://github.com/OpenConceptLab/ocl_issues/issues/1179) | fixing test -- [OpenConceptLab/ocl_issues#1176](https://github.com/OpenConceptLab/ocl_issues/issues/1176) | fixing test -- [OpenConceptLab/ocl_issues#1176](https://github.com/OpenConceptLab/ocl_issues/issues/1176) | collection/version concept/mapping/version GET request -- [OpenConceptLab/ocl_issues#1163](https://github.com/OpenConceptLab/ocl_issues/issues/1163) | importers | handling when no 'type' is provided -- [OpenConceptLab/ocl_issues#1163](https://github.com/OpenConceptLab/ocl_issues/issues/1163) | collection expansion mnemonic to have autoexpanded only if its autoexpanded -- Org overview column migration -- fixing migrations | migration merge -- coverage to 84 | wip -- Collection | autoexpand nullable boolean -- [OpenConceptLab/ocl_issues#1144](https://github.com/OpenConceptLab/ocl_issues/issues/1144) | Collection details | added expansion_url -- [OpenConceptLab/ocl_issues#1144](https://github.com/OpenConceptLab/ocl_issues/issues/1144) | auto expansions mnemonic updated -- [OpenConceptLab/ocl_issues#979](https://github.com/OpenConceptLab/ocl_issues/issues/979) | collection summary has expansions count also | fixing test -- [OpenConceptLab/ocl_issues#979](https://github.com/OpenConceptLab/ocl_issues/issues/979) | cannot delete default expansion | expansions count in version summary -- [OpenConceptLab/ocl_issues#923](https://github.com/OpenConceptLab/ocl_issues/issues/923) | errbit client setup -- [OpenConceptLab/ocl_issues#979](https://github.com/OpenConceptLab/ocl_issues/issues/979) | Expansion detail serializer -- Removed internal_reference_id from expansions -- [OpenConceptLab/ocl_issues#970](https://github.com/OpenConceptLab/ocl_issues/issues/970) | removed duplicate import -- [OpenConceptLab/ocl_issues#970](https://github.com/OpenConceptLab/ocl_issues/issues/970) | removed unused imports -- [OpenConceptLab/ocl_issues#970](https://github.com/OpenConceptLab/ocl_issues/issues/970) | reference expression can be collection based -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | Supporting dynamic references -- removed internal_reference_id | was used for v1 to v2 data migration -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version serializer to have expansions_url -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection child last updated at on expansion -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | head autoexpand false behaviours -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version to use expansion_uri to get concepts/mappings -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version expansion_uri is an explicit field -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | expansions doesnt have references copy -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version with expansions and parameters -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version default expansion with default parameters on autoexpanded version creation -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version autoexpand false to seed only references -- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collections | autoexpand head/version attrs | not resolving expressions for autoexpand_head false -##### 2.0.111 - Wed Jan 12 05:40:32 2022 +0000 -- [OpenConceptLab/ocl_issues#1183](https://github.com/OpenConceptLab/ocl_issues/issues/1183) | added parameters in swagger -- [OpenConceptLab/ocl_issues#1183](https://github.com/OpenConceptLab/ocl_issues/issues/1183) | concept reverse -- [OpenConceptLab/ocl_issues#1183](https://github.com/OpenConceptLab/ocl_issues/issues/1183) | reverse mapping serializer -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | hierarchy concepts before mapping concepts -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | ordering by map type -- [OpenConceptLab/ocl_issues#1179](https://github.com/OpenConceptLab/ocl_issues/issues/1179) | source/collection | active concepts/mappings counts to be None when not set rather than 0 -- [OpenConceptLab/ocl_issues#1175](https://github.com/OpenConceptLab/ocl_issues/issues/1175) | Source/Collection DELETE | fixing test -- [OpenConceptLab/ocl_issues#1175](https://github.com/OpenConceptLab/ocl_issues/issues/1175) | Source/Collection DELETE | fixing test -- [OpenConceptLab/ocl_issues#1175](https://github.com/OpenConceptLab/ocl_issues/issues/1175) | Source/Collection DELETE | making s3 exports delete async task -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | mapping serializer | added to_concept_code/to_concept_url -- Fixing flaky test for openmrs concept schema -- Fixing test -- Added missing tests -- [OpenConceptLab/ocl_issues#1163](https://github.com/OpenConceptLab/ocl_issues/issues/1163) | importers | handling when no 'type' is provided -- coverage.sh | fail if tests fail -##### 2.0.107 - Wed Dec 29 07:07:52 2021 +0000 -- [OpenConceptLab/ocl_issues#712](https://github.com/OpenConceptLab/ocl_issues/issues/712) | Admin can hard delete users (except self) -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | added display_name in hierarchy response -- [OpenConceptLab/ocl_issues#1168](https://github.com/OpenConceptLab/ocl_issues/issues/1168) | bundle hierarchy and flat responses -- [OpenConceptLab/ocl_issues#1168](https://github.com/OpenConceptLab/ocl_issues/issues/1168) | concept as hierarchy method -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | concept summary to have child/parent concepts count | summary an be added in concept obj response -- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | concept properties for child parent counts -- [OpenConceptLab/ocl_issues#1167](https://github.com/OpenConceptLab/ocl_issues/issues/1167) | inactive->verify->activate user feature -- [OpenConceptLab/ocl_issues#1163](https://github.com/OpenConceptLab/ocl_issues/issues/1163) | errbit | fixing concept clone -- Errbit fix | API with page number empty 500 fix -- [OpenConceptLab/ocl_issues#1167](https://github.com/OpenConceptLab/ocl_issues/issues/1167) | inactive user login | inactive user search and list -- [OpenConceptLab/ocl_issues#45](https://github.com/OpenConceptLab/ocl_issues/issues/45) | OpenMRS collection concepts validation to consider same name types -- Bump pylint from 2.11.1 to 2.12.2 -- Bump coverage from 6.1.1 to 6.2 -- Bump psycopg2 from 2.9.1 to 2.9.2 -- Bump moto from 2.2.13 to 2.2.19 -- Bump django-cors-headers from 3.10.0 to 3.10.1 -- Source/Collection | removed last (missed) calculation of concepts -- Source/Collection Versions | saving unwanted summary calculation -- Errbit | concept children/parent APIs fix -- Errbit fix | user org collections/sources API fix when there are no user orgs -- Making sure that search doesn't compute DB query also -- [OpenConceptLab/ocl_issues#1133](https://github.com/OpenConceptLab/ocl_issues/issues/1133) | org importer | org creator is the member -- [OpenConceptLab/ocl_issues#1161](https://github.com/OpenConceptLab/ocl_issues/issues/1161) | mapping importer | retired is allowed field -- Errbit fix | importers | concepts/mappings returns failed if parent doesnt exist -- [OpenConceptLab/ocl_issues#1161](https://github.com/OpenConceptLab/ocl_issues/issues/1161) | mapping importer | encoding to/from_concept_code correctly -- [OpenConceptLab/ocl_issues#1156](https://github.com/OpenConceptLab/ocl_issues/issues/1156) | org overview settings -- [OpenConceptLab/ocl_issues#1157](https://github.com/OpenConceptLab/ocl_issues/issues/1157) | making sure new collection/source version copies all attributes from HEAD -- Bump django from 3.2.8 to 4.0 -- [OpenConceptLab/ocl_issues#1151](https://github.com/OpenConceptLab/ocl_issues/issues/1151) | mapping importer | fixing exist check criteria -- Bump boto3 from 1.19.12 to 1.20.24 -- API for user summary -- [OpenConceptLab/ocl_issues#1154](https://github.com/OpenConceptLab/ocl_issues/issues/1154) | Admin user can make another user admin or remove it (except self) -- Admin API to toggle user's staff permission -- Exposing DB for development -- Concept Debug API | no need for response -- [OpenConceptLab/ocl_issues#1151](https://github.com/OpenConceptLab/ocl_issues/issues/1151) | fixing self mapping importer -##### 2.0.93 - Wed Dec 8 04:42:29 2021 +0000 -- Concept debug api to connect parent as source version -- Concept parent concept urls errbit fix | refactoring -- Concept debug api to log if versioned object exists -- fixing pylint warning | typo -- fixing pylint warning -- Admin API to mark latest version as versioned object -- Bundle resource_type -> type -- POST pins to have correct created by id -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | added concepts/mappings count -- [OpenConceptLab/ocl_issues#1132](https://github.com/OpenConceptLab/ocl_issues/issues/1132) | concept/mapping | added collection url in ES for facets -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | reducing iterations -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | reducing max results to 500 -- [OpenConceptLab/ocl_issues#1127](https://github.com/OpenConceptLab/ocl_issues/issues/1127) | sorting coverage by cover percentage (asc) -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | integration test for all cascade levels -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | concept cascade performance | not loading concept parent -- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | concept cascade performance | simplifying concept mappings queryset -- concept mappings removed distinct and order by clauses -- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | refactoring and cleaning up -- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | recrusion for nth level | limiting results and swagger parameters -- [OpenConceptLab/ocl_issues#1126](https://github.com/OpenConceptLab/ocl_issues/issues/1126) | fixing source/collection summary save tasks -- [OpenConceptLab/ocl_issues#1127](https://github.com/OpenConceptLab/ocl_issues/issues/1127) | coverage | fail under 85 -- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | can cascade hierarchy (default true) and cascade mappings option (default true) -##### 2.0.88 - Tue Nov 23 06:08:40 2021 +0000 -- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | swagger query parameters -- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | excludeMapTypes filter -- [OpenConceptLab/ocl_issues#1126](https://github.com/OpenConceptLab/ocl_issues/issues/1126) | children concept urls queryset fix -- [OpenConceptLab/ocl_issues#1126](https://github.com/OpenConceptLab/ocl_issues/issues/1126) | fixing authored report when payload is none -- [OpenConceptLab/ocl_issues#1126](https://github.com/OpenConceptLab/ocl_issues/issues/1126) | parenless children queryset fix -- [OpenConceptLab/ocl_issues#1127](https://github.com/OpenConceptLab/ocl_issues/issues/1127) | coverage | setting coverage directory -- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | bundle | added timestamp and concept/mapping type in response -- Adding API_IMAGE variable to docker-compose.ci -- Fixing Dockerfile to use cache -- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | bundle | removed bundle type -- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | bundle | not returning id and timestamp -##### 2.0.85 - Fri Nov 19 10:17:43 2021 +0000 -- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | bundle | default response is brief -- exact match facets to encode special characters in search string -- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | concept operation with bundle and ocl response -- Source/Collection counts update | making sure save is called when counts change -##### 2.0.82 - Sun Nov 14 13:30:38 2021 +0000 -- ES | search request timeout -- Errbit Client | xml escaping url string -- [OpenConceptLab/ocl_issues#661](https://github.com/OpenConceptLab/ocl_issues/issues/661) | Reverting OpenConceptLab/ocl_issues#103 -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | Collection ref add/delete will update child count -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | Source/Collection/Version retrieve will only update concepts or mappings count when required -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | concept/mapping on retire/delete updating parent counts -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | concept/mapping parent active counts are bulk updated after content import -- Response headers to have requesting user -- Not logging in dev mode -- Errbit errors to have request URL -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | concept/mapping counts async tasks -- [OpenConceptLab/ocl_issues#1082](https://github.com/OpenConceptLab/ocl_issues/issues/1082) Add GIN, GIST, TRGM extensions and concepts uri index -- [OpenConceptLab/ocl_issues#1082](https://github.com/OpenConceptLab/ocl_issues/issues/1082) | comments explaining hierarchy async tasks -- ES | increased timeout for facets query to 20s (default 10s) | Errbit -##### 2.0.80 - Mon Nov 8 11:36:04 2021 +0000 -- Reverting to flower 0.9.5 -- Merge pull request #28 from OpenConceptLab/dependabot/pip/flower-1.0.0 -- Merge pull request #102 from OpenConceptLab/dependabot/pip/factory-boy-3.2.1 -- Merge pull request #103 from OpenConceptLab/dependabot/pip/coverage-6.1.1 -- Bump factory-boy from 3.2.0 to 3.2.1 -- Bump coverage from 6.0.2 to 6.1.1 -- Merge pull request #99 from OpenConceptLab/dependabot/pip/boto3-1.19.12 -- Bump boto3 from 1.19.0 to 1.19.12 -- Merge pull request #101 from OpenConceptLab/dependabot/pip/moto-2.2.13 -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | hierarchy asyn processing on concurrent queue -- Bump moto from 2.2.9 to 2.2.13 -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | not eager loading concepts/mappings owners -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | fixing pylints | unused arguments -- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | saving concepts/mappings count on Source/Collection -- Not logging verbose on CI -- [OpenConceptLab/ocl_issues#1082](https://github.com/OpenConceptLab/ocl_issues/issues/1082) | fixing hierarchy query not use LIKE -- Concept List View | fixing queryset -- [OpenConceptLab/ocl_issues#941](https://github.com/OpenConceptLab/ocl_issues/issues/941) | not logging in dev/test -- [OpenConceptLab/ocl_issues#941](https://github.com/OpenConceptLab/ocl_issues/issues/941) | Added request/response headers and correlation id in logs -- [OpenConceptLab/ocl_issues#941](https://github.com/OpenConceptLab/ocl_issues/issues/941) | removed custom Logger middleware -- Collection version references | raise 404 if version not found -- Concept/Mapping | eager loading relations -- Concept/Mapping | added index with public_access for count queries (without order by) -- [OpenConceptLab/ocl_issues#1059](https://github.com/OpenConceptLab/ocl_issues/issues/1059) | including user as creator pins only if other user is not defined -- [OpenConceptLab/ocl_issues#1059](https://github.com/OpenConceptLab/ocl_issues/issues/1059) | Pin to have created by | user's pins can include user's created by pins -- [OpenConceptLab/ocl_issues#993](https://github.com/OpenConceptLab/ocl_issues/issues/993) | bulk import | collection/source delete and version creation only allowed for members -- [OpenConceptLab/ocl_issues#1070](https://github.com/OpenConceptLab/ocl_issues/issues/1070) | OpenMRS concept validator | preferred name uniquness clause to only consider existing preferred names -- pylint fixes -- Source concepts/mappings indexes views | added dummy serializer -- [OpenConceptLab/ocl_issues#1057](https://github.com/OpenConceptLab/ocl_issues/issues/1057) | Collection References | cascade source to concepts option -- Bump flower from 0.9.5 to 1.0.0 -##### 2.0.75 - Wed Oct 27 08:40:29 2021 +0000 -- [OpenConceptLab/ocl_issues#993](https://github.com/OpenConceptLab/ocl_issues/issues/993) | Parallel Bulk Import | user permission checks on resources -- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | facets names are camel cased -- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | fixing pylint -- Merge pull request #50 from PatrickCmd/filter_concepts_by_name_and_desctription_types -- Merge pull request #82 from OpenConceptLab/dependabot/pip/pyyaml-6.0 -- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | filter concepts by name type and description type -- Bump pyyaml from 5.4.1 to 6.0 -##### 2.0.75 - Wed Oct 27 08:40:29 2021 +0000 -- [OpenConceptLab/ocl_issues#993](https://github.com/OpenConceptLab/ocl_issues/issues/993) | Parallel Bulk Import | user permission checks on resources -- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | facets names are camel cased -- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | fixing pylint -- Merge pull request #50 from PatrickCmd/filter_concepts_by_name_and_desctription_types -- Merge pull request #82 from OpenConceptLab/dependabot/pip/pyyaml-6.0 -- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | filter concepts by name type and description type -- Bump pyyaml from 5.4.1 to 6.0 -##### 2.0.74 - Fri Oct 22 02:13:56 2021 +0000 -- Merge pull request #81 from OpenConceptLab/dependabot/pip/django-elasticsearch-dsl-7.2.1 -- Bump django-elasticsearch-dsl from 7.2.0 to 7.2.1 -- Merge pull request #80 from OpenConceptLab/dependabot/pip/coverage-6.0.2 -- Merge pull request #79 from OpenConceptLab/dependabot/pip/django-cors-headers-3.10.0 -- Bump coverage from 6.0 to 6.0.2 -- Merge pull request #78 from OpenConceptLab/dependabot/pip/boto3-1.19.0 -- Bump django-cors-headers from 3.9.0 to 3.10.0 -- Merge pull request #70 from OpenConceptLab/dependabot/pip/django-3.2.8 -- Bump boto3 from 1.18.49 to 1.19.0 -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | POST Admin API to resolve duplicate latest versions using ids rather than created_at -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | keeping code DRY -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | POST Admin API to resolve duplicate latest versions for specific concepts -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | resolve duplicate latest version order by mnemonic -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | resolve duplicate latest version order by parent id desc -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | resolve duplicate latest version | added logs -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | resolve duplicate latest version with better query -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | after latest version resolve indexing -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | PUT Admin API to resolve duplicate latest versions -- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | Admin API to get duplicate latest concept versions -- [OpenConceptLab/ocl_issues#923](https://github.com/OpenConceptLab/ocl_issues/issues/923) | errbit client setup -- Adding User-Agent to import file url request for parallel imports -- Adding User-Agent to import file url request -- [OpenConceptLab/ocl_issues#1035](https://github.com/OpenConceptLab/ocl_issues/issues/1035) Slow concepts and mappings select (partial index) -- Revert "OpenConceptLab/ocl_issues#1035 Slow concepts and mappings select (partial index)" -- [OpenConceptLab/ocl_issues#1035](https://github.com/OpenConceptLab/ocl_issues/issues/1035) Slow concepts and mappings select (partial index) -- [OpenConceptLab/ocl_issues#1035](https://github.com/OpenConceptLab/ocl_issues/issues/1035) Slow concepts and mappings select -- [OpenConceptLab/ocl_issues#1035](https://github.com/OpenConceptLab/ocl_issues/issues/1035) Slow concepts select -- Removing tmp after export file is uploaded -- Bump django from 3.2.7 to 3.2.8 -- Merge pull request #69 from OpenConceptLab/dependabot/pip/moto-2.2.9 -- Bump moto from 2.2.8 to 2.2.9 -- Merge pull request #63 from OpenConceptLab/dependabot/pip/pydash-5.1.0 -- pylint | removed unused import -- Concept children/parents | pagination and headers -- Bump pydash from 5.0.2 to 5.1.0 -##### 2.0.66 - Thu Oct 7 05:38:06 2021 +0000 -- [OpenConceptLab/ocl_issues#1018](https://github.com/OpenConceptLab/ocl_issues/issues/1018) | user org collections/sources search result scope fix -- [OpenConceptLab/ocl_issues#991](https://github.com/OpenConceptLab/ocl_issues/issues/991) | concept children/parents nested children/parents can be asked separately -- Merge pull request #61 from OpenConceptLab/dependabot/pip/coverage-6.0 -- Bump coverage from 5.5 to 6.0 -- [OpenConceptLab/ocl_issues#991](https://github.com/OpenConceptLab/ocl_issues/issues/991) | API get parents of a concept -- concept detail | not including empty hierarchy path by default -##### 2.0.63 - Mon Oct 4 04:57:25 2021 +0000 -- [OpenConceptLab/ocl_issues#1018](https://github.com/OpenConceptLab/ocl_issues/issues/1018) | bulk references add from a source/version to not go through API -- Merge pull request #57 from OpenConceptLab/dependabot/pip/django-cors-headers-3.9.0 -- Bump django-cors-headers from 3.8.0 to 3.9.0 -##### 2.0.61 - Wed Sep 29 11:40:41 2021 +0000 -- [OpenConceptLab/ocl_issues#992](https://github.com/OpenConceptLab/ocl_issues/issues/992) | concept collection membership restricted to user/org scope -- [OpenConceptLab/ocl_issues#1000](https://github.com/OpenConceptLab/ocl_issues/issues/1000) | deleted v1 to v2 data migration code -- Merge pull request #56 from OpenConceptLab/dependabot/pip/boto3-1.18.49 -- Bump boto3 from 1.18.42 to 1.18.49 -- Merge pull request #54 from OpenConceptLab/dependabot/pip/moto-2.2.8 -- List APIs to use ES for non empty search str only -- [OpenConceptLab/ocl_issues#992](https://github.com/OpenConceptLab/ocl_issues/issues/992) | API to get collection memberships for a concept -- [OpenConceptLab/ocl_issues#963](https://github.com/OpenConceptLab/ocl_issues/issues/963) | OpenMRS validator external_id for concept/locales/mapping validations -- Bump moto from 2.2.7 to 2.2.8 -##### 2.0.58 - Sat Sep 25 12:16:24 2021 +0000 -- populate hierarchy task to log more -- [OpenConceptLab/ocl_issues#988](https://github.com/OpenConceptLab/ocl_issues/issues/988) | source/collection/concept/mapping list api to apply user permissions -##### 2.0.56 - Thu Sep 23 02:20:53 2021 +0000 -- Fixing or criteria for searching mnemonic exact -- API to batch index source's concepts and mappings -- POST Concept/Mapping | 404 if parent not found -##### 2.0.54 - Mon Sep 20 07:22:22 2021 +0000 -- [OpenConceptLab/ocl_issues#966](https://github.com/OpenConceptLab/ocl_issues/issues/966) | django logging for non-dev env (gunicorn based) -- fixing pylint -- Collection | add all references (*) bug fix -- Pylint | implemented consider-using-f-string fixes -- Pylint | implemented consider-using-f-string -- Merge pull request #47 from OpenConceptLab/dependabot/pip/moto-2.2.7 -- Merge pull request #48 from OpenConceptLab/dependabot/pip/pylint-2.11.1 -- Bump pylint from 2.10.2 to 2.11.1 -- Bump moto from 2.2.6 to 2.2.7 -- Merge pull request #46 from OpenConceptLab/dependabot/pip/boto3-1.18.42 -- Bump boto3 from 1.18.40 to 1.18.42 -- Revert "Revert "OpenConceptLab/ocl_issues#971 | making sure the non REST URLs are not supported"" -- Mapping version creation | fixing queries to get and mark prev latest version not latest -- removed internal_reference_id | was used for v1 to v2 data migration -- Adding keep-alive to match ALB -- Adjust gunicorn timeout to 60s -- [OpenConceptLab/ocl_issues#972](https://github.com/OpenConceptLab/ocl_issues/issues/972) | data migration | not adding ocladmin as member to orgs with no members -- Revert "OpenConceptLab/ocl_issues#971 | making sure the non REST URLs are not supported" -- reverting file read encoding -- Increase number of gunicorn workers -- S3 | fixing upload of export file -- Batch delete | chunk size 1000 -- [OpenConceptLab/ocl_issues#971](https://github.com/OpenConceptLab/ocl_issues/issues/971) | making sure the non REST URLs are not supported -- [OpenConceptLab/ocl_issues#972](https://github.com/OpenConceptLab/ocl_issues/issues/972) | data migration | making sure related_name is not used -- [OpenConceptLab/ocl_issues#972](https://github.com/OpenConceptLab/ocl_issues/issues/972) | data migration | making sure related_name is not used as string -- [OpenConceptLab/ocl_issues#972](https://github.com/OpenConceptLab/ocl_issues/issues/972) | data migration to add creator and updater as org member in orgs without any members -- Delete source can be an async call -##### 2.0.52 - Mon Sep 13 11:57:24 2021 +0000 -- Adding capture output for gunicorn -- Merge pull request #44 from OpenConceptLab/dependabot/pip/boto3-1.18.40 -- Bump boto3 from 1.18.39 to 1.18.40 -- data/file upload max memory size can be upto 200mb -- [OpenConceptLab/ocl_issues#965](https://github.com/OpenConceptLab/ocl_issues/issues/965) Using Gunicorn for Swagger and disabling DEBUG mode -- Merge pull request #42 from OpenConceptLab/dependabot/pip/boto3-1.18.39 -- Bump boto3 from 1.18.37 to 1.18.39 -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | parallel importers | using deque to manage parts list -- CSV sample with special characters -- [OpenConceptLab/ocl_issues#960](https://github.com/OpenConceptLab/ocl_issues/issues/960) | using Python 3 style super() without arguments -- [OpenConceptLab/ocl_issues#960](https://github.com/OpenConceptLab/ocl_issues/issues/960) | fixed pylint warnings -- Merge pull request #32 from OpenConceptLab/dependabot/pip/pylint-2.10.2 -- Merge pull request #40 from OpenConceptLab/dependabot/pip/boto3-1.18.37 -- Bump boto3 from 1.18.36 to 1.18.37 -- Bump pylint from 2.5.3 to 2.10.2 -##### 2.0.50 - Wed Sep 8 03:27:52 2021 +0000 -- updated pydash to 5.0.2 -- Merge pull request #36 from OpenConceptLab/dependabot/pip/django-ordered-model-3.4.3 -- Merge pull request #37 from OpenConceptLab/dependabot/pip/boto3-1.18.36 -- Bump boto3 from 1.14.37 to 1.18.36 -- Bump django-ordered-model from 3.4.1 to 3.4.3 -- Merge pull request #33 from OpenConceptLab/dependabot/pip/django-cors-headers-3.8.0 -- removed six from requirements -- Explicitly adding mock (python core) deps -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | parallel importers | memory optimiztion | getting rid of content once queued -- Bump django-cors-headers from 3.4.0 to 3.8.0 -- Merge pull request #34 from OpenConceptLab/dependabot/pip/django-elasticsearch-dsl-7.2.0 -- Bump django-elasticsearch-dsl from 7.1.4 to 7.2.0 -- Merge pull request #31 from OpenConceptLab/dependabot/pip/moto-2.2.6 -- Merge pull request #26 from OpenConceptLab/dependabot/pip/factory-boy-3.2.0 -- Bump moto from 1.3.14 to 2.2.6 -- Merge pull request #27 from OpenConceptLab/dependabot/pip/pyyaml-5.4.1 -- Merge pull request #29 from OpenConceptLab/dependabot/pip/psycopg2-2.9.1 -- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | parallel importers | memory optimiztion | getting rid of content once queued -- Bump psycopg2 from 2.8.5 to 2.9.1 -- Bump pyyaml from 5.4 to 5.4.1 -- Bump factory-boy from 2.12.0 to 3.2.0 -- Fixing celery permissions issue when running locally in dev mode -- updated drf-yasg -- Merge pull request #24 from OpenConceptLab/dependabot/pip/requests-2.26.0 -- Bump requests from 2.24.0 to 2.26.0 -- Merge pull request #25 from OpenConceptLab/dependabot/pip/django-3.2.7 -- Merge pull request #23 from OpenConceptLab/dependabot/pip/djangorestframework-3.12.4 -- Merge pull request #22 from OpenConceptLab/dependabot/pip/coverage-5.5 -- Merge pull request #21 from OpenConceptLab/dependabot/pip/python-dateutil-2.8.2 -- Create codeql-analysis.yml -- Create SECURITY.md -- Bump django from 3.1.12 to 3.2.7 -- Bump djangorestframework from 3.11.2 to 3.12.4 -- Bump coverage from 5.3.1 to 5.5 -- Bump python-dateutil from 2.8.1 to 2.8.2 -- Create dependabot.yml -- Source/Collection last latest version force delete on org delete -- [OpenConceptLab/ocl_issues#955](https://github.com/OpenConceptLab/ocl_issues/issues/955) | CSV importer test for OpenMRS schema -- [OpenConceptLab/ocl_issues#897](https://github.com/OpenConceptLab/ocl_issues/issues/897) Adding envs and args to runtime docker image -- [OpenConceptLab/ocl_issues#897](https://github.com/OpenConceptLab/ocl_issues/issues/897) Adding missing curl -- [OpenConceptLab/ocl_issues#897](https://github.com/OpenConceptLab/ocl_issues/issues/897) Adding missing permissions -- [OpenConceptLab/ocl_issues#897](https://github.com/OpenConceptLab/ocl_issues/issues/897) Fixing tests -- Revert "Revert "OpenConceptLab/ocl_issues#897 Run OCL API using gunicorn"" -##### 2.0.47 - Tue Aug 31 07:27:09 2021 +0000 -- Org delete to delete children first -##### 2.0.46 - Fri Aug 27 09:14:25 2021 +0000 -- Org delete to use bulk_delete -- [OpenConceptLab/ocl_issues#947](https://github.com/OpenConceptLab/ocl_issues/issues/947) | Handling ES error of max pagination -##### 2.0.45 - Fri Aug 27 03:37:30 2021 +0000 -- [OpenConceptLab/ocl_issues#949](https://github.com/OpenConceptLab/ocl_issues/issues/949) | Source/collection last child updated at | using max query -- [OpenConceptLab/ocl_issues#949](https://github.com/OpenConceptLab/ocl_issues/issues/949) | Concept hierarchy | avoiding join -- [OpenConceptLab/ocl_issues#949](https://github.com/OpenConceptLab/ocl_issues/issues/949) | Mapping import | removed like query | reduced parent/owner joins -- [OpenConceptLab/ocl_issues#911](https://github.com/OpenConceptLab/ocl_issues/issues/911) | +@akhilkala | Orgs List with no members using query parameter -- [OpenConceptLab/ocl_issues#936](https://github.com/OpenConceptLab/ocl_issues/issues/936) | can request facets only from search routes -- Importers | Added deleted count and details in results -- [OpenConceptLab/ocl_issues#935](https://github.com/OpenConceptLab/ocl_issues/issues/935) | Parallel Importer | Mapping Importer to consider id (mnemonic) attribute for exists check -- [OpenConceptLab/ocl_issues#935](https://github.com/OpenConceptLab/ocl_issues/issues/935) | Parallel Importer | Fixing tests -- [OpenConceptLab/ocl_issues#935](https://github.com/OpenConceptLab/ocl_issues/issues/935) | Parallel Importer | Source/Collection version create to append results in created and not updated -##### 2.0.41 - Mon Aug 16 04:19:11 2021 +0000 -- Including source/collection summaries in user/org pins listing -- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | export mappings | not loading relations eagerly -- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | ordering concepts/mappings | fixing batch size typo -- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | Export queries | limit/offset on lookup table only -- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | Fixing collection export concepts/mappings queryset -- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | Slow Query | concept/mapping exports to use less joins -- Authoring Report | Added summary and description in swagger -##### 2.0.38 - Thu Aug 12 01:45:01 2021 +0000 -- concept/mappings | Removed uri LIKE criteria -- Update README.md -- Amend hierarchy api to take input as parent->child uri map -- pylint | Fixing indentation -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding missing composite index -##### 2.0.37 - Wed Aug 11 08:47:34 2021 +0000 -- using raw query for dormant locales count -- Source exports | concepts to have child and parent concept urls -- Admin API amend the concept hierarchy -- Fixing unsued import -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Reverting IN unnest custom lookups -##### 2.0.35 - Tue Aug 10 03:33:12 2021 +0000 -- [OpenConceptLab/ocl_issues#895](https://github.com/OpenConceptLab/ocl_issues/issues/895) | concept/mapping | Admin API to delete (hard) a version -##### 2.0.34 - Mon Aug 9 11:28:23 2021 +0000 -- user(s) authoring report | counts of resources created/updated -- Indexing | making sure re-run of delete job doesn't fail if the instance is already deleted -##### 2.0.33 - Fri Aug 6 08:19:53 2021 +0000 -- delete duplicate locales task | Updated log statement -- Indexes API | can index resources by uri filter -- Limiting locales for each concept to max 500 -- integration test for different concept response modes (verbose/standard/brief) -- Concept brief response '?brief=true' | returns uuid and id only -- [OpenConceptLab/ocl_issues#45](https://github.com/OpenConceptLab/ocl_issues/issues/45) | not validating retired concept locales -- Fixing concept new/version leaving dormant locales -- [OpenConceptLab/ocl_issues#860](https://github.com/OpenConceptLab/ocl_issues/issues/860) | self mappings | mappings can be created with same from/to concept -- [OpenConceptLab/ocl_issues#857](https://github.com/OpenConceptLab/ocl_issues/issues/857) Frequent 504 gateway timeout when requesting export on staging -- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | Monthly usage report | added collection references in serializer -- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | added date range in monthly usage report -- locales dormant/duplicate routes under admin namespace -- Concept/Mapping | simplifying version get criteria -- Concept summary API to return concept and not latest version when no version is specified -- Concept hard delete to not leave any dormant locales behind -- Concept POST/PUT | fixing parent concept urls not accepted -- api to delete dormant locales in batches -- Added version info in swagger UI -- api to get count of dormant locales -- logging count of dormant locales deleted -- api/task to get concept/version summary, clean dormant locales -- api/task for sys admin to delete dormant locales -- async concept hard delete sys admin api -- Task to cleanup duplicate locales | processing in batches -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding missing indexes -- [OpenConceptLab/ocl_issues#857](https://github.com/OpenConceptLab/ocl_issues/issues/857) | Source/collection child max updated at to select only updated_at field -- Source concept/mapping export to eager load source's parent correctly -##### 2.0.21 - Wed Jul 28 05:30:54 2021 +0000 -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) | exports | reducing batch size to 100 -- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | monthly usage report under admin/report/ namespace -- [OpenConceptLab/ocl_issues#838](https://github.com/OpenConceptLab/ocl_issues/issues/838) | User List can be filtered by dateJoinedBefore and dateJoinedSince -##### 2.0.20 - Mon Jul 26 10:28:11 2021 +0000 -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) | performance | merging excludes -##### 2.0.19 - Fri Jul 23 03:09:59 2021 +0000 -- [OpenConceptLab/ocl_issues#853](https://github.com/OpenConceptLab/ocl_issues/issues/853) | search results to also consider org and user scope permissions -##### 2.0.18 - Thu Jul 22 09:55:18 2021 +0000 -- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | user monthly report | added collection/source versions and collection references in verbose mode -- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | users monthly report API -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding indexes for public_access fields -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding indexes for LocalizedText -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding upper index for sources_mnemonic -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) | Concept List API performance | fixing n+1 query | versions url to be guessed rather than computed -- [OpenConceptLab/ocl_issues#828](https://github.com/OpenConceptLab/ocl_issues/issues/828) | changelog to be autoupdated with release version update -##### 2.0.13 - Mon Jul 19 08:54:47 2021 +0000 -- [OpenConceptLab/ocl_issues#846](https://github.com/OpenConceptLab/ocl_issues/issues/846) | Concept/Mapping queryset (without search) | refactoring and combining filters in criterion | removes duplicate results -- [OpenConceptLab/ocl_issues#830](https://github.com/OpenConceptLab/ocl_issues/issues/830) | /changelog API to read changelog file directly from github -- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Timeout fetching Locales, adding migration files -##### 2.0.12 - Fri Jul 9 13:26:39 2021 +0000 -- Caching result of export path till the duration of self -- Created indexes on concept/mapping updated_at -- [OpenConceptLab/ocl_issues#830](https://github.com/OpenConceptLab/ocl_issues/issues/830) | /changelog API to listdown changelog (HTML) -- [OpenConceptLab/ocl_issues#830](https://github.com/OpenConceptLab/ocl_issues/issues/830) | change logs to have issue numbers as links -- [OpenConceptLab/ocl_issues#830](https://github.com/OpenConceptLab/ocl_issues/issues/830) | python script to generate changelog/release-notes -##### 2.0.11 - Fri Jul 9 03:49:04 2021 +0000 -- [OpenConceptLab/ocl_issues#823](https://github.com/OpenConceptLab/ocl_issues/issues/823) | includeMappings/includeInverseMappings for a collection's concept will now use the collection's scope -- [OpenConceptLab/ocl_issues#829](https://github.com/OpenConceptLab/ocl_issues/issues/829) | users lists can be filtered by last login before/since -- on org save adding creator/updater as member -- collection concept reference add to decode concept uri -- Fixing concept get for encoded strings diff --git a/core/common/checksums.py b/core/common/checksums.py index 59a4596f..f64e1f39 100644 --- a/core/common/checksums.py +++ b/core/common/checksums.py @@ -330,10 +330,11 @@ def get_db_id_for(self, diff_key, identity): class ChecksumChangelog: - def __init__(self, concepts_diff, mappings_diff, identity='mnemonic'): # pylint: disable=too-many-arguments + def __init__(self, concepts_diff, mappings_diff, identity='mnemonic', enrich=False): # pylint: disable=too-many-arguments self.concepts_diff = concepts_diff self.mappings_diff = mappings_diff self.identity = identity + self.enrich = enrich self.result = {} def get_mapping_summary(self, mapping, mapping_id=None): @@ -346,6 +347,40 @@ def get_mapping_summary(self, mapping, mapping_id=None): 'map_type': mapping.map_type, } + def _build_concepts_cache(self, diff_keys): # pylint: disable=too-many-branches + """Batch-fetch concepts with names/descriptions for enrich mode (avoids N+1 queries).""" + from core.concepts.models import Concept + all_ids = set() + for key in diff_keys: + diff = self.concepts_diff.result.get(key, False) + if isinstance(diff, dict): + for concept_id in diff[self.identity]: + db_id = self.concepts_diff.get_db_id_for(key, concept_id) + if db_id: + all_ids.add(db_id) + if key in ('changed_major', 'changed_minor'): + v1_id = get(self.concepts_diff.resources1_map, f'{concept_id}.id') + if v1_id and v1_id != db_id: + all_ids.add(v1_id) + return { + c.id: c + for c in Concept.objects.filter(id__in=all_ids).prefetch_related('names', 'descriptions') + } + + @staticmethod + def _names_list(concept): + return [ + {'name': n.name, 'type': n.type, 'locale': n.locale, 'locale_preferred': n.locale_preferred} + for n in concept.names.all() + ] + + @staticmethod + def _descriptions_list(concept): + return [ + {'description': d.name, 'type': d.type, 'locale': d.locale} + for d in concept.descriptions.all() + ] + def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many-statements from core.mappings.models import Mapping from core.concepts.models import Concept @@ -354,6 +389,9 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many traversed_mappings = set() traversed_concepts = set() diff_keys = ['new', 'removed', 'changed_retired', 'changed_major', 'changed_minor'] + + concepts_cache = self._build_concepts_cache(diff_keys) if self.enrich else {} + for key in diff_keys: # pylint: disable=too-many-nested-blocks diff = self.concepts_diff.result.get(key, False) if isinstance(diff, dict): @@ -363,7 +401,10 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many continue traversed_concepts.add(concept_id) concept_db_id = self.concepts_diff.get_db_id_for(key, concept_id) - concept = Concept.objects.filter(id=concept_db_id).first() + if self.enrich: + concept = concepts_cache.get(concept_db_id) + else: + concept = Concept.objects.filter(id=concept_db_id).first() concept_display_name = get(concept, 'display_name') if concept_display_name: concept_display_name = concept_display_name.replace('"', "'") @@ -371,6 +412,20 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many 'id': concept_id, 'display_name': concept_display_name } + if self.enrich and concept: + summary['concept_class'] = getattr(concept, 'concept_class', None) + summary['datatype'] = getattr(concept, 'datatype', None) + summary['names'] = self._names_list(concept) + summary['descriptions'] = self._descriptions_list(concept) + if key in ('changed_major', 'changed_minor'): + v1_id = get(self.concepts_diff.resources1_map, f'{concept_id}.id') + if v1_id and v1_id != concept_db_id: + v1_concept = concepts_cache.get(v1_id) + if v1_concept: + summary['prev_names'] = self._names_list(v1_concept) + summary['prev_descriptions'] = self._descriptions_list(v1_concept) + summary['prev_concept_class'] = getattr(v1_concept, 'concept_class', None) + summary['prev_datatype'] = getattr(v1_concept, 'datatype', None) mappings_diff_summary = {} for mapping_diff_key in diff_keys: mapping_ids = get(self.mappings_diff.result, f'{mapping_diff_key}.{self.identity}') diff --git a/core/common/tasks.py b/core/common/tasks.py index 2f033c08..1203b897 100644 --- a/core/common/tasks.py +++ b/core/common/tasks.py @@ -880,11 +880,14 @@ def generate_key(*args, **kwargs): return "|".join(key_parts) @app.task(base=QueueOnceCustomTask) -def source_version_compare(version1_uri, version2_uri, is_changelog, verbosity, ignore_cache=False): +def source_version_compare(version1_uri, version2_uri, is_changelog, verbosity, ignore_cache=False, format_type='json'): ignore_cache = ignore_cache or get(settings, 'TEST_MODE', False) + # Include format_type in the cache key only when it differs from the default + # to avoid invalidating existing cached JSON results. + cache_key_suffix = f'|format={format_type}' if format_type != 'json' else '' if not ignore_cache: cache_key = generate_key( - 'source_version_compare', version1_uri, version2_uri, is_changelog, verbosity) + 'source_version_compare', version1_uri, version2_uri, is_changelog, verbosity) + cache_key_suffix result = cache.get(cache_key) if result: return result @@ -892,8 +895,17 @@ def source_version_compare(version1_uri, version2_uri, is_changelog, verbosity, from core.sources.models import Source version1 = Source.objects.get(uri=version1_uri) version2 = Source.objects.get(uri=version2_uri) - fn = Source.changelog if is_changelog else Source.compare - result = fn(version1, version2, verbosity) + + if is_changelog and format_type == 'markdown': + result = Source.changelog(version1, version2, verbosity, enrich=True) + from core.sources.changelog_markdown import ChangelogMarkdownGenerator + generator = ChangelogMarkdownGenerator(result) + result['markdown'] = generator.generate() + elif is_changelog: + result = Source.changelog(version1, version2, verbosity) + else: + result = Source.compare(version1, version2, verbosity) + if not ignore_cache: cache.set(cache_key, result, timeout=60*60*24*4) return result diff --git a/core/sources/changelog_markdown.py b/core/sources/changelog_markdown.py new file mode 100644 index 00000000..2ee9caf1 --- /dev/null +++ b/core/sources/changelog_markdown.py @@ -0,0 +1,906 @@ +""" +Markdown changelog generator for source version diffs. + +Transforms enriched $changelog JSON (produced with enrich=True) into a +human-readable markdown document structured after LOINC/SNOMED release notes. + +LLM-based "Release Note Highlights" and per-section narrative summaries are +intentionally NOT implemented here. +# TODO: Integrate litellm (anthropic/claude-haiku-4.5) once ANTHROPIC_API_KEY +# is available in this deployment. Replace _static_highlight() calls with +# LLM completions (max_tokens=1000 for the top-level highlight, +# max_tokens=500 per section highlight, temperature=0.3, English output). +""" + +from datetime import date + +from django.conf import settings + + +class ChangelogMarkdownGenerator: + """ + Generates a markdown changelog from enriched $changelog JSON data. + + Usage:: + + generator = ChangelogMarkdownGenerator(changelog_data) + markdown_string = generator.generate() + + The ``changelog_data`` dict is the value returned by ``Source.changelog()`` + when called with ``enrich=True``. It has the shape:: + + { + "meta": { + "version1": {"uri": "...", "concepts": N, "mappings": M}, + "version2": {"uri": "...", "concepts": N, "mappings": M}, + }, + "concepts": { + "new": {"id": {"id": "...", "display_name": "...", "names": [...], ...}}, + "removed": {...}, + "changed_retired": {...}, + "changed_major": {...}, + "changed_minor": {...}, + "changed_mappings_only": {...}, + }, + "mappings": { + "new": {"id": {"id": "...", "from_concept": "...", ...}}, + ... + }, + } + """ + + def __init__(self, changelog_data, default_locale='en'): + self.data = changelog_data + self.meta = changelog_data.get('meta', {}) + self.concepts = changelog_data.get('concepts', {}) + self.mappings = changelog_data.get('mappings', {}) + self.default_locale = default_locale + self._v1_meta = self.meta.get('version1', {}) + self._v2_meta = self.meta.get('version2', {}) + self._source_prefix = self._extract_source_prefix(self._v2_meta.get('uri', '')) + + # ------------------------------------------------------------------ + # Public API + # ------------------------------------------------------------------ + + def generate(self): + sections = [ + self._header(), + self._summary_table(), + self._toc(), + self._concepts_section(), + self._names_section(), + self._descriptions_section(), + self._translations_section(), + self._mappings_section(), + ] + return '\n\n'.join(s for s in sections if s) + + # ------------------------------------------------------------------ + # Header / meta + # ------------------------------------------------------------------ + + def _header(self): + v1_uri = self._v1_meta.get('uri', '') + v2_uri = self._v2_meta.get('uri', '') + v1_version = self._version_label(v1_uri) + v2_version = self._version_label(v2_uri) + today = date.today().isoformat() + return ( + f'# {v2_version} Changelog\n\n' + f'*Compared to {v1_version} — Generated on {today}*' + ) + + def _summary_table(self): + v1_concepts = self._v1_meta.get('concepts', 0) + v2_concepts = self._v2_meta.get('concepts', 0) + v1_mappings = self._v1_meta.get('mappings', 0) + v2_mappings = self._v2_meta.get('mappings', 0) + + concepts_new = len(self.concepts.get('new') or {}) + concepts_removed = len(self.concepts.get('removed') or {}) + concepts_retired = len(self.concepts.get('changed_retired') or {}) + concepts_major = len(self.concepts.get('changed_major') or {}) + concepts_minor = len(self.concepts.get('changed_minor') or {}) + concepts_mappings_only = len(self.concepts.get('changed_mappings_only') or {}) + + mappings_added = len(self.mappings.get('new') or {}) + mappings_removed = len(self.mappings.get('removed') or {}) + + net_concepts = concepts_new - concepts_removed - concepts_retired + net_mappings = mappings_added - mappings_removed + + def _net(n): + return f'+{n:,}' if n > 0 else (f'{n:,}' if n < 0 else '0') + + v1_label = self._version_label(self._v1_meta.get('uri', '')) + v2_label = self._version_label(self._v2_meta.get('uri', '')) + + v1_uri = self._v1_meta.get('uri', '') + v2_uri = self._v2_meta.get('uri', '') + base = getattr(settings, 'API_BASE_URL', '') + diff_url = f'{base}/sources/$changelog/?version1={v1_uri}&version2={v2_uri}' + + lines = [ + '## Summary', + '', + f'**{v1_label} → {v2_label}**', + '', + '| Category | Count |', + '|----------|------:|', + f'| New concepts | {concepts_new:,} |', + f'| Major changes | {concepts_major:,} |', + f'| Minor changes | {concepts_minor:,} |', + f'| Mapping-only changes | {concepts_mappings_only:,} |', + f'| Retired concepts | {concepts_retired:,} |', + f'| Mappings added | {mappings_added:,} |', + f'| Mappings removed | {mappings_removed:,} |', + f'| **Net change** | **{_net(net_concepts)} concepts' + + (f', {_net(net_mappings)} mappings' if net_mappings != 0 else '') + '** |', + '', + '| | ' + v1_label + ' | ' + v2_label + ' |', + '|--|--:|--:|', + f'| Concepts | {v1_concepts:,} | {v2_concepts:,} |', + f'| Mappings | {v1_mappings:,} | {v2_mappings:,} |', + '', + f'[Download full JSON diff]({diff_url})', + '', + '---', + ] + return '\n'.join(lines) + + def _toc(self): + entries = ['## Contents', ''] + section_checks = [ + ('Concepts', self._has_concepts()), + ('Names', self._has_names()), + ('Descriptions', self._has_descriptions()), + ('Translations', self._has_translations()), + ('Mappings', self._has_mappings()), + ] + for label, present in section_checks: + if present: + anchor = label.lower() + entries.append(f'- [{label}](#{anchor})') + entries.append('') + entries.append('---') + return '\n'.join(entries) + + # ------------------------------------------------------------------ + # Concepts section + # ------------------------------------------------------------------ + + def _concepts_section(self): + if not self._has_concepts(): + return '' + + added = self.concepts.get('new') or {} + removed = self.concepts.get('removed') or {} + retired = self.concepts.get('changed_retired') or {} + changed_major = self.concepts.get('changed_major') or {} + changed_minor = self.concepts.get('changed_minor') or {} + + total_added = len(added) + total_removed = len(removed) + total_retired = len(retired) + # Only count concepts where at least one data axis changed (names, descriptions, + # metadata, or mappings). Pure checksum-only changes carry no visible content change. + total_changed = ( + sum(1 for info in changed_major.values() if self._changed_axes(info)) + + sum(1 for info in changed_minor.values() if self._changed_axes(info)) + ) + + highlight = self._static_highlight( + 'Concepts', + added=total_added, + removed=total_removed, + retired=total_retired, + changed=total_changed, + ) + + parts = ['## Concepts', '', f'*{highlight}*'] + + if added: + parts += ['', '### Added', ''] + parts += self._concept_table(added) + if removed: + parts += ['', '### Removed', ''] + parts += self._concept_table(removed) + if retired: + parts += ['', '### Retired', ''] + parts += self._concept_table(retired) + if changed_major: + visible_major = {cid: info for cid, info in changed_major.items() if self._changed_axes(info)} + if visible_major: + parts += ['', '### Updated (Major)', ''] + parts += self._concept_table(visible_major, show_changes=True, axes_as_links=True) + if changed_minor: + visible_minor = {cid: info for cid, info in changed_minor.items() if self._changed_axes(info)} + if visible_minor: + parts += ['', '### Updated (Minor)', ''] + parts += self._concept_table(visible_minor, show_changes=True, axes_as_links=True) + + parts += ['', '---'] + return '\n'.join(parts) + + def _concept_table(self, concepts_dict, show_changes=False, axes_as_links=False): + if show_changes: + rows = [ + '| Concept ID | Display Name | Concept Class | Changed |', + '|-----------:|-------------|---------------|---------|', + ] + else: + rows = [ + '| Concept ID | Display Name | Concept Class |', + '|-----------:|-------------|---------------|', + ] + for concept_id, info in concepts_dict.items(): + display = info.get('display_name') or '' + concept_class = info.get('concept_class') or '' + link = self._concept_link(concept_id) + if show_changes: + axes = self._changed_axes(info, as_links=axes_as_links, concept_id=concept_id if axes_as_links else None) + changed_str = ', '.join(axes) if axes else '—' + rows.append( + f'| {link} | {self._escape(display)} | {self._escape(concept_class)} | {changed_str} |' + ) + else: + rows.append(f'| {link} | {self._escape(display)} | {self._escape(concept_class)} |') + return rows + + def _changed_axes(self, info, as_links=False, concept_id=None): + """ + Compute which axes changed for a concept in changed_major/changed_minor. + + When ``as_links=True`` and ``concept_id`` is provided, each axis label + becomes a markdown anchor link pointing directly to the first row for + that concept in the relevant section table + (e.g. ``[Names](#names-139061)``). + + Default-locale names and non-default-locale names (Translations) are + checked separately so the link targets the correct section. + Metadata has no dedicated section and is kept as plain text. + """ + axes = [] + + def _link(label, section): + if as_links and concept_id: + return f'[{label}](#{section}-{concept_id})' + if as_links: + return f'[{label}](#{section})' + return label + + # Default-locale names → Names section + prev_names_default = frozenset( + (n.get('type'), n.get('locale'), n.get('name')) + for n in (info.get('prev_names') or []) + if n.get('locale') == self.default_locale + ) + curr_names_default = frozenset( + (n.get('type'), n.get('locale'), n.get('name')) + for n in (info.get('names') or []) + if n.get('locale') == self.default_locale + ) + if prev_names_default != curr_names_default: + axes.append(_link('Names', 'names')) + + # Non-default-locale names → Translations section + prev_names_tr = frozenset( + (n.get('type'), n.get('locale'), n.get('name')) + for n in (info.get('prev_names') or []) + if n.get('locale') != self.default_locale + ) + curr_names_tr = frozenset( + (n.get('type'), n.get('locale'), n.get('name')) + for n in (info.get('names') or []) + if n.get('locale') != self.default_locale + ) + if prev_names_tr != curr_names_tr: + axes.append(_link('Translations', 'translations')) + + # Descriptions + prev_descs = frozenset( + (d.get('type'), d.get('locale'), d.get('description')) + for d in info.get('prev_descriptions') or [] + ) + curr_descs = frozenset( + (d.get('type'), d.get('locale'), d.get('description')) + for d in info.get('descriptions') or [] + ) + if prev_descs != curr_descs: + axes.append(_link('Descriptions', 'descriptions')) + + # Metadata (class or datatype changed) — no dedicated section + if ( + info.get('prev_concept_class') is not None + and info.get('concept_class') != info.get('prev_concept_class') + ) or ( + info.get('prev_datatype') is not None + and info.get('datatype') != info.get('prev_datatype') + ): + axes.append('Metadata') + + # Mappings + if info.get('mappings'): + axes.append(_link('Mappings', 'mappings')) + + return axes + + # ------------------------------------------------------------------ + # Names section + # ------------------------------------------------------------------ + + def _names_section(self): + if not self._has_names(): + return '' + + added_rows, updated_rows, removed_rows = self._collect_name_rows(self.default_locale, section='names') + + highlight = self._static_highlight( + 'Names', + added=len(added_rows), + updated=len(updated_rows), + removed=len(removed_rows), + ) + + parts = ['## Names', '', f'*{highlight}*'] + if added_rows: + parts += ['', '### Added', ''] + parts += self._names_added_table(added_rows) + if updated_rows: + parts += ['', '### Updated', ''] + parts += self._names_updated_table(updated_rows) + if removed_rows: + parts += ['', '### Removed', ''] + parts += self._names_added_table(removed_rows) + + parts += ['', '---'] + return '\n'.join(parts) + + def _collect_name_rows(self, locale_filter, section='names'): + """ + Return (added_rows, updated_rows, removed_rows) for the given locale filter. + + The concept-ID cell of the *first* row for each concept carries an HTML + anchor (````) so that the "Changed" column in the + Concepts table can link directly to that row. + """ + added_rows = [] + updated_rows = [] + removed_rows = [] + anchored = set() + + def anchored_link(concept_id): + base = self._concept_link(concept_id) + if concept_id not in anchored: + anchored.add(concept_id) + return f'{base}' + return base + + # Added: from new concepts + for concept_id, info in (self.concepts.get('new') or {}).items(): + link = anchored_link(concept_id) + first = True + for name in info.get('names') or []: + if name.get('locale') == locale_filter: + added_rows.append((link if first else self._concept_link(concept_id), + name.get('name', ''), name.get('type', ''), name.get('locale', ''))) + first = False + + # Removed: from removed concepts (these are v1 names) + for concept_id, info in (self.concepts.get('removed') or {}).items(): + link = anchored_link(concept_id) + first = True + for name in info.get('names') or []: + if name.get('locale') == locale_filter: + removed_rows.append((link if first else self._concept_link(concept_id), + name.get('name', ''), name.get('type', ''), name.get('locale', ''))) + first = False + + # Added/Updated/Removed: compare prev_names vs names on changed concepts. + # + # We group names by (type, locale) and compare the SET of texts within + # each group. This avoids false positives when multiple names share the + # same (type, locale) pair — the old single-dict approach would silently + # overwrite all but the last name in such a group, producing spurious + # "updated" rows. + # + # Update detection: if a (type, locale) group had exactly 1 text in v1 + # and exactly 1 different text in v2, we treat it as a text correction + # ("Updated"). Any other add/remove within a group is reported literally. + from collections import defaultdict + for key in ('changed_major', 'changed_minor'): + for concept_id, info in (self.concepts.get(key) or {}).items(): + prev_names = info.get('prev_names') or [] + curr_names = info.get('names') or [] + + # Group texts by (type, locale) as sets (handles duplicates correctly) + prev_by_key = defaultdict(set) + for n in prev_names: + if n.get('locale') == locale_filter: + prev_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) + + curr_by_key = defaultdict(set) + for n in curr_names: + if n.get('locale') == locale_filter: + curr_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) + + all_keys = set(prev_by_key) | set(curr_by_key) + for (ntype, nloc) in all_keys: + prev_texts = prev_by_key.get((ntype, nloc), set()) + curr_texts = curr_by_key.get((ntype, nloc), set()) + if prev_texts == curr_texts: + continue + + added_texts = curr_texts - prev_texts + removed_texts = prev_texts - curr_texts + + # Exactly 1 removal + 1 addition in the same (type, locale) slot → + # treat as a text correction (Updated) rather than separate rows. + if len(added_texts) == 1 and len(removed_texts) == 1: + link = anchored_link(concept_id) + updated_rows.append(( + link, + next(iter(removed_texts)), + next(iter(added_texts)), + ntype or '', + nloc or '', + )) + else: + for text in added_texts: + link = anchored_link(concept_id) + added_rows.append((link, text, ntype or '', nloc or '')) + for text in removed_texts: + link = anchored_link(concept_id) + removed_rows.append((link, text, ntype or '', nloc or '')) + + return added_rows, updated_rows, removed_rows + + @staticmethod + def _names_added_table(rows): + lines = [ + '| Concept ID | Name | Name Type | Locale |', + '|-----------:|------|-----------|--------|', + ] + for link, name, name_type, locale in rows: + lines.append(f'| {link} | {ChangelogMarkdownGenerator._escape(name)} | {ChangelogMarkdownGenerator._escape(name_type)} | {locale} |') + return lines + + @staticmethod + def _names_updated_table(rows): + lines = [ + '| Concept ID | Previous Name | Updated Name | Name Type | Locale |', + '|-----------:|--------------|-------------|-----------|--------|', + ] + for link, prev, curr, name_type, locale in rows: + lines.append( + f'| {link} | {ChangelogMarkdownGenerator._escape(prev)} ' + f'| {ChangelogMarkdownGenerator._escape(curr)} ' + f'| {ChangelogMarkdownGenerator._escape(name_type)} | {locale} |' + ) + return lines + + # ------------------------------------------------------------------ + # Descriptions section + # ------------------------------------------------------------------ + + def _descriptions_section(self): + if not self._has_descriptions(): + return '' + + added_rows, updated_rows, removed_rows = self._collect_description_rows() + + highlight = self._static_highlight( + 'Descriptions', + added=len(added_rows), + updated=len(updated_rows), + removed=len(removed_rows), + ) + + parts = ['## Descriptions', '', f'*{highlight}*'] + if added_rows: + parts += ['', '### Added', ''] + parts += self._descriptions_added_table(added_rows) + if updated_rows: + parts += ['', '### Updated', ''] + parts += self._descriptions_updated_table(updated_rows) + if removed_rows: + parts += ['', '### Removed', ''] + parts += self._descriptions_added_table(removed_rows) + + parts += ['', '---'] + return '\n'.join(parts) + + def _collect_description_rows(self): + added_rows = [] + updated_rows = [] + removed_rows = [] + anchored = set() + + def anchored_link(concept_id): + base = self._concept_link(concept_id) + if concept_id not in anchored: + anchored.add(concept_id) + return f'{base}' + return base + + for concept_id, info in (self.concepts.get('new') or {}).items(): + first = True + for desc in info.get('descriptions') or []: + link = anchored_link(concept_id) if first else self._concept_link(concept_id) + first = False + added_rows.append((link, desc.get('description', ''), desc.get('type', ''), desc.get('locale', ''))) + + for concept_id, info in (self.concepts.get('removed') or {}).items(): + first = True + for desc in info.get('descriptions') or []: + link = anchored_link(concept_id) if first else self._concept_link(concept_id) + first = False + removed_rows.append((link, desc.get('description', ''), desc.get('type', ''), desc.get('locale', ''))) + + for key in ('changed_major', 'changed_minor'): + for concept_id, info in (self.concepts.get(key) or {}).items(): + prev_descs = info.get('prev_descriptions') or [] + curr_descs = info.get('descriptions') or [] + prev_map = {(d.get('type'), d.get('locale')): d.get('description', '') for d in prev_descs} + curr_map = {(d.get('type'), d.get('locale')): d.get('description', '') for d in curr_descs} + for key_tuple, curr_text in curr_map.items(): + prev_text = prev_map.get(key_tuple) + dtype = key_tuple[0] or '' + dloc = key_tuple[1] or '' + link = anchored_link(concept_id) + if prev_text is None: + added_rows.append((link, curr_text, dtype, dloc)) + elif prev_text != curr_text: + updated_rows.append((link, prev_text, curr_text, dtype, dloc)) + for key_tuple, prev_text in prev_map.items(): + if key_tuple not in curr_map: + link = anchored_link(concept_id) + removed_rows.append((link, prev_text, key_tuple[0] or '', key_tuple[1] or '')) + + return added_rows, updated_rows, removed_rows + + @staticmethod + def _descriptions_added_table(rows): + lines = [ + '| Concept ID | Description | Description Type | Locale |', + '|-----------:|------------|-----------------|--------|', + ] + for link, desc, dtype, locale in rows: + lines.append(f'| {link} | {ChangelogMarkdownGenerator._escape(desc)} | {ChangelogMarkdownGenerator._escape(dtype)} | {locale} |') + return lines + + @staticmethod + def _descriptions_updated_table(rows): + lines = [ + '| Concept ID | Previous Description | Updated Description | Locale |', + '|-----------:|---------------------|-------------------|--------|', + ] + for link, prev, curr, dtype, locale in rows: # pylint: disable=unused-variable + lines.append( + f'| {link} | {ChangelogMarkdownGenerator._escape(prev)} ' + f'| {ChangelogMarkdownGenerator._escape(curr)} | {locale} |' + ) + return lines + + # ------------------------------------------------------------------ + # Translations section + # ------------------------------------------------------------------ + + def _translations_section(self): + if not self._has_translations(): + return '' + + added_rows, updated_rows, removed_rows = self._collect_translation_rows() + if not any([added_rows, updated_rows, removed_rows]): + return '' + + # Group by locale for the highlight. + # added/removed rows have 4 elements (locale at index 3); + # updated rows have 5 elements (locale at index 4 == last). + # Using row[-1] (last element) works for both, and filtering None/empty. + all_locales = sorted({row[-1] for row in added_rows + updated_rows + removed_rows if row[-1]}) + locales_str = ', '.join(all_locales) if all_locales else '' + highlight = self._static_highlight( + 'Translations', + added=len(added_rows), + updated=len(updated_rows), + removed=len(removed_rows), + extra=f'Locales: {locales_str}' if locales_str else None, + ) + + parts = ['## Translations', '', f'*{highlight}*'] + if added_rows: + parts += ['', '### Added', ''] + parts += self._translations_table(added_rows) + if updated_rows: + parts += ['', '### Updated', ''] + parts += self._translations_updated_table(updated_rows) + if removed_rows: + parts += ['', '### Removed', ''] + parts += self._translations_table(removed_rows) + + parts += ['', '---'] + return '\n'.join(parts) + + def _collect_translation_rows(self): + """ + Same logic as _collect_name_rows but for non-default locales. + Anchors use the ``translations-{concept_id}`` prefix. + """ + added_rows = [] + updated_rows = [] + removed_rows = [] + anchored = set() + + def anchored_link(concept_id): + base = self._concept_link(concept_id) + if concept_id not in anchored: + anchored.add(concept_id) + return f'{base}' + return base + + for concept_id, info in (self.concepts.get('new') or {}).items(): + for name in info.get('names') or []: + if name.get('locale') != self.default_locale: + added_rows.append((anchored_link(concept_id), name.get('name', ''), name.get('type', ''), name.get('locale', ''))) + + for concept_id, info in (self.concepts.get('removed') or {}).items(): + for name in info.get('names') or []: + if name.get('locale') != self.default_locale: + removed_rows.append((anchored_link(concept_id), name.get('name', ''), name.get('type', ''), name.get('locale', ''))) + + for key in ('changed_major', 'changed_minor'): + for concept_id, info in (self.concepts.get(key) or {}).items(): + prev_names = info.get('prev_names') or [] + curr_names = info.get('names') or [] + + from collections import defaultdict + prev_by_key = defaultdict(set) + for n in prev_names: + if n.get('locale') != self.default_locale: + prev_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) + + curr_by_key = defaultdict(set) + for n in curr_names: + if n.get('locale') != self.default_locale: + curr_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) + + all_keys = set(prev_by_key) | set(curr_by_key) + for (ntype, nloc) in all_keys: + prev_texts = prev_by_key.get((ntype, nloc), set()) + curr_texts = curr_by_key.get((ntype, nloc), set()) + if prev_texts == curr_texts: + continue + added_texts = curr_texts - prev_texts + removed_texts = prev_texts - curr_texts + if len(added_texts) == 1 and len(removed_texts) == 1: + link = anchored_link(concept_id) + updated_rows.append(( + link, next(iter(removed_texts)), next(iter(added_texts)), + ntype or '', nloc or '', + )) + else: + for text in added_texts: + link = anchored_link(concept_id) + added_rows.append((link, text, ntype or '', nloc or '')) + for text in removed_texts: + link = anchored_link(concept_id) + removed_rows.append((link, text, ntype or '', nloc or '')) + + return added_rows, updated_rows, removed_rows + + @staticmethod + def _translations_table(rows): + lines = [ + '| Concept ID | Name | Locale | Name Type |', + '|-----------:|------|--------|-----------|', + ] + for link, name, name_type, locale in rows: + lines.append(f'| {link} | {ChangelogMarkdownGenerator._escape(name)} | {locale} | {ChangelogMarkdownGenerator._escape(name_type)} |') + return lines + + @staticmethod + def _translations_updated_table(rows): + lines = [ + '| Concept ID | Previous Name | Updated Name | Locale | Name Type |', + '|-----------:|--------------|-------------|--------|-----------|', + ] + for link, prev, curr, name_type, locale in rows: + lines.append( + f'| {link} | {ChangelogMarkdownGenerator._escape(prev)} ' + f'| {ChangelogMarkdownGenerator._escape(curr)} ' + f'| {locale} | {ChangelogMarkdownGenerator._escape(name_type)} |' + ) + return lines + + # ------------------------------------------------------------------ + # Mappings section + # ------------------------------------------------------------------ + + def _mappings_section(self): + if not self._has_mappings(): + return '' + + added = self.mappings.get('new') or {} + removed = self.mappings.get('removed') or {} + changed_major = self.mappings.get('changed_major') or {} + changed_minor = self.mappings.get('changed_minor') or {} + changed_retired = self.mappings.get('changed_retired') or {} + + # Also collect mappings from changed_mappings_only concepts + inline_added = {} + inline_changed = {} + for concept_id, info in (self.concepts.get('changed_mappings_only') or {}).items(): + for change_key, mapping_list in (info.get('mappings') or {}).items(): + for m in mapping_list: + if change_key == 'new': + inline_added[m['id']] = m + else: + inline_changed[m['id']] = m + + all_added = {**added, **inline_added} + all_changed = {**changed_major, **changed_minor, **changed_retired, **inline_changed} + + total_added = len(all_added) + total_removed = len(removed) + total_changed = len(all_changed) + + highlight = self._static_highlight( + 'Mappings', + added=total_added, + removed=total_removed, + changed=total_changed, + ) + + parts = ['## Mappings', '', f'*{highlight}*'] + if all_added: + parts += ['', '### Added', ''] + parts += self._mappings_table(all_added) + if removed: + parts += ['', '### Removed', ''] + parts += self._mappings_table(removed) + if all_changed: + parts += ['', '### Updated', ''] + parts += self._mappings_table(all_changed) + + return '\n'.join(parts) + + def _mappings_table(self, mappings_dict): + rows = [ + '| From Concept | To Concept | To Source | Map Type |', + '|-------------|-----------|----------|---------|', + ] + anchored = set() + for _, m in mappings_dict.items(): + from_concept = m.get('from_concept') or '' + to_concept = m.get('to_concept') or '' + to_source = m.get('to_source') or '' + map_type = m.get('map_type') or '' + if from_concept: + base_link = self._concept_link(from_concept) + if from_concept not in anchored: + anchored.add(from_concept) + from_link = f'{base_link}' + else: + from_link = base_link + else: + from_link = '' + rows.append( + f'| {from_link} | {self._escape(to_concept)} ' + f'| {self._escape(to_source)} | {self._escape(map_type)} |' + ) + return rows + + # ------------------------------------------------------------------ + # Presence checks (used for TOC and section skipping) + # ------------------------------------------------------------------ + + def _has_concepts(self): + for key in ('new', 'removed', 'changed_retired', 'changed_major', 'changed_minor'): + if self.concepts.get(key): + return True + return False + + def _has_names(self): + for key in ('new', 'removed', 'changed_major', 'changed_minor'): + for info in (self.concepts.get(key) or {}).values(): + if info.get('names') or info.get('prev_names'): + return True + return False + + def _has_descriptions(self): + for key in ('new', 'removed', 'changed_major', 'changed_minor'): + for info in (self.concepts.get(key) or {}).values(): + if info.get('descriptions') or info.get('prev_descriptions'): + return True + return False + + def _has_translations(self): + for key in ('new', 'removed', 'changed_major', 'changed_minor'): + for info in (self.concepts.get(key) or {}).values(): + for name in info.get('names') or []: + if name.get('locale') != self.default_locale: + return True + for name in info.get('prev_names') or []: + if name.get('locale') != self.default_locale: + return True + return False + + def _has_mappings(self): + if any(self.mappings.get(k) for k in ('new', 'removed', 'changed_retired', 'changed_major', 'changed_minor')): + return True + for info in (self.concepts.get('changed_mappings_only') or {}).values(): + if info.get('mappings'): + return True + return False + + # ------------------------------------------------------------------ + # Deterministic highlight (placeholder for future LLM integration) + # ------------------------------------------------------------------ + + @staticmethod + def _static_highlight(section, added=0, removed=0, changed=0, updated=0, retired=0, extra=None): + """ + Returns a short descriptive string for a changelog section. + + # TODO: Replace with LLM-generated summary (anthropic/claude-haiku-4.5, + # max_tokens=500, temperature=0.3) once ANTHROPIC_API_KEY is available. + """ + parts = [] + if added: + parts.append(f'{added:,} addition{"s" if added != 1 else ""}') + if updated or changed: + count = updated or changed + parts.append(f'{count:,} update{"s" if count != 1 else ""}') + if removed: + parts.append(f'{removed:,} removal{"s" if removed != 1 else ""}') + if retired: + parts.append(f'{retired:,} retirement{"s" if retired != 1 else ""}') + summary = ', '.join(parts) if parts else 'No changes' + if extra: + summary += f'. {extra}.' + return f'{section}: {summary}.' + + # ------------------------------------------------------------------ + # Helpers + # ------------------------------------------------------------------ + + @staticmethod + def _extract_source_prefix(version_uri): + """ + Extract the base source path from a version URI. + E.g. '/orgs/CIEL/sources/CIEL/v20260101/' → '/orgs/CIEL/sources/CIEL/' + """ + if not version_uri: + return '' + parts = version_uri.strip('/').split('/') + try: + src_idx = parts.index('sources') + return '/' + '/'.join(parts[:src_idx + 2]) + '/' + except (ValueError, IndexError): + return '' + + def _concept_link(self, concept_id): + if not concept_id: + return '' + base = getattr(settings, 'API_BASE_URL', '') + if self._source_prefix: + url = f'{base}{self._source_prefix}concepts/{concept_id}/' + return f'[#{concept_id}]({url})' + return f'#{concept_id}' + + @staticmethod + def _version_label(uri): + """Extract the version identifier from a version URI.""" + if not uri: + return 'Unknown' + parts = uri.strip('/').split('/') + return parts[-1] if parts else uri + + @staticmethod + def _escape(text): + """Escape pipe characters so they don't break markdown tables.""" + if not text: + return '' + return str(text).replace('|', '\\|') diff --git a/core/sources/models.py b/core/sources/models.py index c8061263..6b6a771f 100644 --- a/core/sources/models.py +++ b/core/sources/models.py @@ -981,7 +981,7 @@ def compare(version1, version2, verbosity=0): } @staticmethod - def changelog(version1, version2, verbosity=0): + def changelog(version1, version2, verbosity=0, enrich=False): """ version1 is the older version version2 is the newer version @@ -999,7 +999,7 @@ def changelog(version1, version2, verbosity=0): ) concepts_diff.process() mappings_diff.process() - log = ChecksumChangelog(concepts_diff, mappings_diff) + log = ChecksumChangelog(concepts_diff, mappings_diff, enrich=enrich) log.process() result = { 'meta': { diff --git a/core/sources/tests/test_changelog_markdown.py b/core/sources/tests/test_changelog_markdown.py new file mode 100644 index 00000000..6df93187 --- /dev/null +++ b/core/sources/tests/test_changelog_markdown.py @@ -0,0 +1,370 @@ +from django.test import SimpleTestCase + +from core.sources.changelog_markdown import ChangelogMarkdownGenerator + + +def _make_data( + v1_uri='/orgs/CIEL/sources/CIEL/v20250101/', + v2_uri='/orgs/CIEL/sources/CIEL/v20260101/', + v1_concepts=100, + v2_concepts=102, + v1_mappings=50, + v2_mappings=52, + concepts=None, + mappings=None, +): + return { + 'meta': { + 'version1': {'uri': v1_uri, 'concepts': v1_concepts, 'mappings': v1_mappings}, + 'version2': {'uri': v2_uri, 'concepts': v2_concepts, 'mappings': v2_mappings}, + }, + 'concepts': concepts or {}, + 'mappings': mappings or {}, + } + + +class TestChangelogMarkdownGeneratorHeader(SimpleTestCase): + def test_header_contains_version_labels(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('v20260101', md) + self.assertIn('v20250101', md) + + def test_header_h1(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('# v20260101 Changelog', md) + + +class TestChangelogMarkdownGeneratorSummaryTable(SimpleTestCase): + def test_summary_table_present(self): + data = _make_data(v1_concepts=100, v2_concepts=102, v1_mappings=50, v2_mappings=52) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('## Summary', md) + self.assertIn('| Concepts |', md) + self.assertIn('| Mappings |', md) + + def test_summary_counts(self): + data = _make_data( + v1_concepts=100, + v2_concepts=103, + concepts={ + 'new': {'c1': {'id': 'c1', 'display_name': 'Foo'}}, + 'removed': {'c2': {'id': 'c2', 'display_name': 'Bar'}, 'c3': {'id': 'c3', 'display_name': 'Baz'}}, + } + ) + md = ChangelogMarkdownGenerator(data).generate() + # New breakdown format: per-category rows + totals table + self.assertIn('| New concepts | 1 |', md) + self.assertIn('| Concepts | 100 | 103 |', md) + + def test_summary_breakdown_rows(self): + data = _make_data( + concepts={ + 'changed_major': {'c1': {'id': 'c1', 'display_name': 'Major'}}, + 'changed_minor': {'c2': {'id': 'c2', 'display_name': 'Minor'}}, + 'changed_retired': {'c3': {'id': 'c3', 'display_name': 'Retired'}}, + 'changed_mappings_only': {'c4': {'id': 'c4', 'display_name': 'Map only'}}, + }, + mappings={ + 'new': {'m1': {'id': 'm1', 'from_concept': 'c1', 'to_concept': 'x', 'to_source': None, 'map_type': 'SAME-AS'}}, + 'removed': {'m2': {'id': 'm2', 'from_concept': 'c2', 'to_concept': 'y', 'to_source': None, 'map_type': 'SAME-AS'}}, + }, + ) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('| Major changes | 1 |', md) + self.assertIn('| Minor changes | 1 |', md) + self.assertIn('| Retired concepts | 1 |', md) + self.assertIn('| Mapping-only changes | 1 |', md) + self.assertIn('| Mappings added | 1 |', md) + self.assertIn('| Mappings removed | 1 |', md) + + def test_summary_net_change(self): + data = _make_data( + concepts={ + 'new': {'c1': {'id': 'c1', 'display_name': 'A'}, 'c2': {'id': 'c2', 'display_name': 'B'}}, + 'removed': {'c3': {'id': 'c3', 'display_name': 'C'}}, + } + ) + md = ChangelogMarkdownGenerator(data).generate() + # net = +2 - 1 = +1 + self.assertIn('+1 concepts', md) + + def test_json_diff_download_link(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('Download full JSON diff', md) + self.assertIn('/sources/$changelog/', md) + + +class TestChangelogMarkdownGeneratorTOC(SimpleTestCase): + def test_toc_shows_only_present_sections(self): + data = _make_data( + concepts={ + 'new': {'c1': {'id': 'c1', 'display_name': 'New concept'}}, + }, + mappings={ + 'new': {'m1': {'id': 'm1', 'from_concept': 'c1', 'to_concept': 'x', 'to_source': None, 'map_type': 'SAME-AS'}}, + } + ) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('[Concepts]', md) + self.assertIn('[Mappings]', md) + # No names/descriptions/translations data → should not appear in TOC + self.assertNotIn('[Names]', md) + self.assertNotIn('[Descriptions]', md) + self.assertNotIn('[Translations]', md) + + +class TestChangelogMarkdownGeneratorConceptsSection(SimpleTestCase): + def test_concepts_added_table(self): + data = _make_data(concepts={ + 'new': { + 'c1': {'id': 'c1', 'display_name': 'Malaria Test', 'concept_class': 'Test'}, + } + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('## Concepts', md) + self.assertIn('### Added', md) + self.assertIn('#c1', md) + self.assertIn('Malaria Test', md) + self.assertIn('Test', md) + + def test_concept_link_format(self): + data = _make_data(concepts={ + 'new': {'42': {'id': '42', 'display_name': 'Something'}} + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('[#42]', md) + self.assertIn('/orgs/CIEL/sources/CIEL/concepts/42/', md) + + def test_concepts_removed_section(self): + data = _make_data(concepts={ + 'removed': {'c5': {'id': 'c5', 'display_name': 'Old concept'}} + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('### Removed', md) + self.assertIn('#c5', md) + + def test_concepts_retired_section(self): + data = _make_data(concepts={ + 'changed_retired': {'c3': {'id': 'c3', 'display_name': 'Retired concept'}} + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('### Retired', md) + + def test_empty_concepts_section_omitted(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertNotIn('## Concepts', md) + + def test_pipe_in_display_name_escaped(self): + data = _make_data(concepts={ + 'new': {'c1': {'id': 'c1', 'display_name': 'A|B name'}} + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('A\\|B name', md) + + +class TestChangelogMarkdownGeneratorNamesSection(SimpleTestCase): + def _data_with_names(self): + return _make_data(concepts={ + 'new': { + 'c1': { + 'id': 'c1', + 'display_name': 'New concept', + 'names': [ + {'name': 'Lorem ipsum', 'type': 'FULLY_SPECIFIED', 'locale': 'en', 'locale_preferred': True}, + {'name': 'Ipsum lorem', 'type': 'SHORT', 'locale': 'en', 'locale_preferred': False}, + ], + 'descriptions': [], + } + }, + 'removed': { + 'c2': { + 'id': 'c2', + 'display_name': 'Removed concept', + 'names': [ + {'name': 'Old name', 'type': 'FULLY_SPECIFIED', 'locale': 'en', 'locale_preferred': True}, + ], + 'descriptions': [], + } + }, + }) + + def test_names_section_present(self): + md = ChangelogMarkdownGenerator(self._data_with_names()).generate() + self.assertIn('## Names', md) + + def test_names_added_table(self): + md = ChangelogMarkdownGenerator(self._data_with_names()).generate() + self.assertIn('### Added', md) + self.assertIn('Lorem ipsum', md) + + def test_names_removed_table(self): + md = ChangelogMarkdownGenerator(self._data_with_names()).generate() + self.assertIn('### Removed', md) + self.assertIn('Old name', md) + + def test_names_updated_table(self): + data = _make_data(concepts={ + 'changed_minor': { + 'c1': { + 'id': 'c1', + 'display_name': 'Fixed', + 'names': [ + {'name': 'Lorem ipsum', 'type': 'FULLY_SPECIFIED', 'locale': 'en', 'locale_preferred': True}, + ], + 'prev_names': [ + {'name': 'Lorem IPsum', 'type': 'FULLY_SPECIFIED', 'locale': 'en', 'locale_preferred': True}, + ], + 'descriptions': [], + } + } + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('## Names', md) + self.assertIn('### Updated', md) + self.assertIn('Lorem IPsum', md) + self.assertIn('Lorem ipsum', md) + + def test_names_section_omitted_if_no_names(self): + data = _make_data(concepts={ + 'new': {'c1': {'id': 'c1', 'display_name': 'No names'}} + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertNotIn('## Names', md) + + +class TestChangelogMarkdownGeneratorTranslationsSection(SimpleTestCase): + def test_translations_section_present(self): + data = _make_data(concepts={ + 'new': { + 'c1': { + 'id': 'c1', + 'display_name': 'New', + 'names': [ + {'name': 'English name', 'type': 'FULLY_SPECIFIED', 'locale': 'en', 'locale_preferred': True}, + {'name': 'Nome em português', 'type': 'FULLY_SPECIFIED', 'locale': 'pt', 'locale_preferred': False}, + ], + 'descriptions': [], + } + } + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('## Translations', md) + self.assertIn('Nome em português', md) + self.assertNotIn('English name', md.split('## Translations')[1]) + + def test_translations_omitted_if_only_default_locale(self): + data = _make_data(concepts={ + 'new': { + 'c1': { + 'id': 'c1', + 'display_name': 'English only', + 'names': [ + {'name': 'English name', 'type': 'FULLY_SPECIFIED', 'locale': 'en', 'locale_preferred': True}, + ], + 'descriptions': [], + } + } + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertNotIn('## Translations', md) + + +class TestChangelogMarkdownGeneratorMappingsSection(SimpleTestCase): + def test_mappings_added_table(self): + data = _make_data(mappings={ + 'new': { + 'm1': { + 'id': 'm1', + 'from_concept': 'c1', + 'from_source': None, + 'to_concept': '12345', + 'to_source': 'http://snomed.info/sct', + 'map_type': 'SAME-AS', + } + } + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('## Mappings', md) + self.assertIn('### Added', md) + self.assertIn('SAME-AS', md) + self.assertIn('12345', md) + + def test_mappings_section_omitted_if_empty(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertNotIn('## Mappings', md) + + def test_changed_mappings_only_included(self): + data = _make_data(concepts={ + 'changed_mappings_only': { + 'c7': { + 'id': 'c7', + 'display_name': 'Concept 7', + 'mappings': { + 'changed_minor': [ + { + 'id': 'mapping7', + 'from_concept': 'c7', + 'from_source': None, + 'to_concept': 'xyz', + 'to_source': None, + 'map_type': 'SAME-AS', + } + ] + } + } + } + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('## Mappings', md) + + +class TestChangelogMarkdownGeneratorStaticHighlight(SimpleTestCase): + def test_additions_only(self): + result = ChangelogMarkdownGenerator._static_highlight('Concepts', added=5) + self.assertIn('5 additions', result) + + def test_all_counts(self): + result = ChangelogMarkdownGenerator._static_highlight('Names', added=30, updated=60, removed=2) + self.assertIn('30 additions', result) + self.assertIn('60 updates', result) + self.assertIn('2 removals', result) + + def test_no_changes(self): + result = ChangelogMarkdownGenerator._static_highlight('Names') + self.assertIn('No changes', result) + + def test_singular_forms(self): + result = ChangelogMarkdownGenerator._static_highlight('Concepts', added=1, removed=1) + self.assertIn('1 addition', result) + self.assertIn('1 removal', result) + self.assertNotIn('additions', result) + self.assertNotIn('removals', result) + + +class TestChangelogMarkdownGeneratorHelpers(SimpleTestCase): + def test_extract_source_prefix(self): + gen = ChangelogMarkdownGenerator.__new__(ChangelogMarkdownGenerator) + self.assertEqual( + gen._extract_source_prefix('/orgs/CIEL/sources/CIEL/v20260101/'), + '/orgs/CIEL/sources/CIEL/' + ) + + def test_extract_source_prefix_empty(self): + gen = ChangelogMarkdownGenerator.__new__(ChangelogMarkdownGenerator) + self.assertEqual(gen._extract_source_prefix(''), '') + + def test_escape_pipe(self): + self.assertEqual(ChangelogMarkdownGenerator._escape('A|B'), 'A\\|B') + self.assertEqual(ChangelogMarkdownGenerator._escape('Normal'), 'Normal') + self.assertEqual(ChangelogMarkdownGenerator._escape(None), '') + self.assertEqual(ChangelogMarkdownGenerator._escape(''), '') + + def test_version_label(self): + gen = ChangelogMarkdownGenerator.__new__(ChangelogMarkdownGenerator) + self.assertEqual(gen._version_label('/orgs/CIEL/sources/CIEL/v20260101/'), 'v20260101') + self.assertEqual(gen._version_label(''), 'Unknown') diff --git a/core/sources/views.py b/core/sources/views.py index 53c6c084..04d2d902 100644 --- a/core/sources/views.py +++ b/core/sources/views.py @@ -658,12 +658,13 @@ class AbstractSourceVersionsDiffView(BaseAPIView, TaskMixin): changelog = False def get_objects(self): - version1_uri = self.request.data.get('version1') # older version - version2_uri = self.request.data.get('version2') # newer version + version1_uri = self.request.data.get('version1') # caller-supplied older version + version2_uri = self.request.data.get('version2') # caller-supplied newer version version1 = get_object_or_404(Source.objects.filter(uri=version1_uri)) version2 = get_object_or_404(Source.objects.filter(uri=version2_uri)) - if version1.created_at > version2.created_at: - raise Http400('version1 must be older than version2') + # Auto-swap to ensure version1 is always the older release using created_at. + if version1.created_at and version2.created_at and version1.created_at > version2.created_at: + version1, version2 = version2, version1 self.check_object_permissions(self.request, version1) self.check_object_permissions(self.request, version2) return version1, version2 @@ -674,12 +675,17 @@ def get_verbosity(self): except: # pylint: disable=bare-except return 0 - def post(self, _): + def get_format_type(self): + # NOTE: DRF reserves '?format=' for content negotiation, so we use '?output=' instead. + return self.request.query_params.get('output', 'json') + + def post(self, _, **kwargs): # pylint: disable=unused-argument version1, version2 = self.get_objects() ignore_cache = bool(version1.is_head or version2.is_head) + format_type = self.get_format_type() if self.changelog else 'json' result = self.perform_task( source_version_compare, - (version1.uri, version2.uri, self.changelog, self.get_verbosity(), ignore_cache) + (version1.uri, version2.uri, self.changelog, self.get_verbosity(), ignore_cache, format_type) ) if isinstance(result, Response): diff --git a/docker-compose.override.yml.bak b/docker-compose.override.yml.bak index f66f356f..108410e2 100644 --- a/docker-compose.override.yml.bak +++ b/docker-compose.override.yml.bak @@ -59,6 +59,13 @@ services: - celery_bulk_import_root environment: - DEBUG=${DEBUG-TRUE} + - EXPORT_SERVICE=core.services.storages.cloud.minio.MinIO + - MINIO_ENDPOINT=rustfs:9000 + - MINIO_EXTERNAL_ENDPOINT=${MINIO_EXTERNAL_ENDPOINT-localhost:${MINIO_PORT:-9000}} + - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY-rustfsadmin} + - MINIO_SECRET_KEY=${MINIO_SECRET_KEY-rustfsadmin} + - MINIO_BUCKET_NAME=${MINIO_BUCKET_NAME-oclapi2-dev} + - MINIO_SECURE=${MINIO_SECURE-false} celery_beat: build: . volumes: From 02a22ccba36f09023e6d9886e52b426bf10a6f07 Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Thu, 23 Apr 2026 10:59:19 -0300 Subject: [PATCH 2/4] feat(sources): improve changelog markdown output * Add overview section with version totals and add, remove, and change counts * Adapt rendering to handle enriched and non-enriched inputs with before and after mapping details when verbosity >= 4 * Expand markdown tables and TOC anchors for concepts, names, descriptions, translations, and mappings * Update tests to cover enhanced markdown output behavior --- core/common/checksums.py | 133 ++- core/common/tasks.py | 10 +- core/sources/changelog_markdown.py | 877 +++++++++++------- core/sources/models.py | 10 +- core/sources/tests/test_changelog_markdown.py | 469 +++++++++- 5 files changed, 1082 insertions(+), 417 deletions(-) diff --git a/core/common/checksums.py b/core/common/checksums.py index f64e1f39..d7947de4 100644 --- a/core/common/checksums.py +++ b/core/common/checksums.py @@ -330,15 +330,16 @@ def get_db_id_for(self, diff_key, identity): class ChecksumChangelog: - def __init__(self, concepts_diff, mappings_diff, identity='mnemonic', enrich=False): # pylint: disable=too-many-arguments + def __init__(self, concepts_diff, mappings_diff, identity='mnemonic', verbosity=0): # pylint: disable=too-many-arguments self.concepts_diff = concepts_diff self.mappings_diff = mappings_diff self.identity = identity - self.enrich = enrich + self.verbosity = verbosity + self.enrich = verbosity >= 4 self.result = {} - def get_mapping_summary(self, mapping, mapping_id=None): - return { + def get_mapping_summary(self, mapping, mapping_id=None, v1_mapping=None): + summary = { 'id': mapping_id or get(mapping, self.identity), 'from_concept': mapping.from_concept_code or get(mapping.from_concept, 'mnemonic'), 'from_source': mapping.from_source_url, @@ -346,41 +347,81 @@ def get_mapping_summary(self, mapping, mapping_id=None): 'to_source': mapping.to_source_url, 'map_type': mapping.map_type, } - - def _build_concepts_cache(self, diff_keys): # pylint: disable=too-many-branches + if self.enrich: + summary['external_id'] = getattr(mapping, 'external_id', None) + if v1_mapping is not None: + summary['prev_to_concept'] = ( + v1_mapping.to_concept_code or get(v1_mapping.to_concept, 'mnemonic') + ) + summary['prev_to_source'] = v1_mapping.to_source_url + summary['prev_map_type'] = v1_mapping.map_type + return summary + + def _collect_v1_v2_ids(self, diff, diff_obj): + """For each mnemonic in each category, collect the v2 and v1 DB ids needed for enrichment.""" + ids = set() + for key in diff: + entry = diff[key] + if not isinstance(entry, dict): + continue + for mnemonic in entry[self.identity]: + db_id = diff_obj.get_db_id_for(key, mnemonic) + if db_id: + ids.add(db_id) + if key in ('changed_major', 'changed_minor'): + v1_id = get(diff_obj.resources1_map, f'{mnemonic}.id') + if v1_id and v1_id != db_id: + ids.add(v1_id) + return ids + + def _build_concepts_cache(self, diff_keys): """Batch-fetch concepts with names/descriptions for enrich mode (avoids N+1 queries).""" from core.concepts.models import Concept - all_ids = set() - for key in diff_keys: - diff = self.concepts_diff.result.get(key, False) - if isinstance(diff, dict): - for concept_id in diff[self.identity]: - db_id = self.concepts_diff.get_db_id_for(key, concept_id) - if db_id: - all_ids.add(db_id) - if key in ('changed_major', 'changed_minor'): - v1_id = get(self.concepts_diff.resources1_map, f'{concept_id}.id') - if v1_id and v1_id != db_id: - all_ids.add(v1_id) + ids = self._collect_v1_v2_ids( + {k: self.concepts_diff.result.get(k, False) for k in diff_keys}, + self.concepts_diff, + ) return { c.id: c - for c in Concept.objects.filter(id__in=all_ids).prefetch_related('names', 'descriptions') + for c in Concept.objects.filter(id__in=ids).prefetch_related('names', 'descriptions') } + def _build_mappings_cache(self, diff_keys): + """Batch-fetch mappings for enrich mode (to resolve v1 state of changed mappings).""" + from core.mappings.models import Mapping + ids = self._collect_v1_v2_ids( + {k: self.mappings_diff.result.get(k, False) for k in diff_keys}, + self.mappings_diff, + ) + return {m.id: m for m in Mapping.objects.filter(id__in=ids)} + @staticmethod def _names_list(concept): return [ - {'name': n.name, 'type': n.type, 'locale': n.locale, 'locale_preferred': n.locale_preferred} + { + 'external_id': n.external_id, + 'name': n.name, + 'type': n.type, + 'locale': n.locale, + 'locale_preferred': n.locale_preferred, + } for n in concept.names.all() ] @staticmethod def _descriptions_list(concept): return [ - {'description': d.name, 'type': d.type, 'locale': d.locale} + {'external_id': d.external_id, 'description': d.name, 'type': d.type, 'locale': d.locale} for d in concept.descriptions.all() ] + def _v1_mapping_for(self, mnemonic, mapping_db_id, mappings_cache): + """Look up the v1 mapping instance for a changed mapping (for prev_* fields).""" + v1_id = get(self.mappings_diff.resources1_map, f'{mnemonic}.id') + if v1_id and v1_id != mapping_db_id: + return mappings_cache.get(v1_id) + return None + def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many-statements from core.mappings.models import Mapping from core.concepts.models import Concept @@ -391,6 +432,7 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many diff_keys = ['new', 'removed', 'changed_retired', 'changed_major', 'changed_minor'] concepts_cache = self._build_concepts_cache(diff_keys) if self.enrich else {} + mappings_cache = self._build_mappings_cache(diff_keys) if self.enrich else {} for key in diff_keys: # pylint: disable=too-many-nested-blocks diff = self.concepts_diff.result.get(key, False) @@ -437,7 +479,14 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many for mapping in mappings: if mapping_diff_key not in mappings_diff_summary: mappings_diff_summary[mapping_diff_key] = [] - mappings_diff_summary[mapping_diff_key].append(self.get_mapping_summary(mapping)) + v1_mapping = None + if self.enrich and mapping_diff_key in ('changed_major', 'changed_minor'): + v1_mapping = self._v1_mapping_for( + get(mapping, self.identity), mapping.id, mappings_cache + ) + mappings_diff_summary[mapping_diff_key].append( + self.get_mapping_summary(mapping, v1_mapping=v1_mapping) + ) traversed_mappings.add(get(mapping, self.identity)) if mappings_diff_summary: summary['mappings'] = mappings_diff_summary @@ -458,29 +507,27 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many traversed_mappings.add(mapping_id) mapping_db_id = self.mappings_diff.get_db_id_for(key, mapping_id) mapping = Mapping.objects.filter(id=mapping_db_id).first() + v1_mapping = None + if self.enrich and key in ('changed_major', 'changed_minor'): + v1_mapping = self._v1_mapping_for(mapping_id, mapping_db_id, mappings_cache) + mapping_summary = self.get_mapping_summary(mapping, mapping_id, v1_mapping=v1_mapping) from_concept_code = get(mapping, 'from_concept_code') or get(mapping.from_concept, 'mnemonic') - if from_concept_code: - concept_id = from_concept_code - if concept_id in same_concept_ids: - if 'changed_mappings_only' not in concepts_result: - concepts_result['changed_mappings_only'] = {} - if concept_id not in concepts_result['changed_mappings_only']: - concept_display_name = get(mapping.from_concept, 'display_name') - if concept_display_name: - concept_display_name = concept_display_name.replace('"', "'") - concepts_result['changed_mappings_only'][concept_id] = { - 'id': concept_id, - 'display_name': concept_display_name, - 'mappings': {} - } - if key not in concepts_result['changed_mappings_only'][concept_id]['mappings']: - concepts_result['changed_mappings_only'][concept_id]['mappings'][key] = [] - concepts_result['changed_mappings_only'][concept_id]['mappings'][key].append( - self.get_mapping_summary(mapping, mapping_id)) - else: - section_summary[mapping_id] = self.get_mapping_summary(mapping, mapping_id) + if from_concept_code and from_concept_code in same_concept_ids: + if 'changed_mappings_only' not in concepts_result: + concepts_result['changed_mappings_only'] = {} + if from_concept_code not in concepts_result['changed_mappings_only']: + concept_display_name = get(mapping.from_concept, 'display_name') + if concept_display_name: + concept_display_name = concept_display_name.replace('"', "'") + concepts_result['changed_mappings_only'][from_concept_code] = { + 'id': from_concept_code, + 'display_name': concept_display_name, + 'mappings': {} + } + mappings_dict = concepts_result['changed_mappings_only'][from_concept_code]['mappings'] + mappings_dict.setdefault(key, []).append(mapping_summary) else: - section_summary[mapping_id] = self.get_mapping_summary(mapping, mapping_id) + section_summary[mapping_id] = mapping_summary if section_summary: mappings_result[key] = section_summary self.result = { diff --git a/core/common/tasks.py b/core/common/tasks.py index 1203b897..e01769b4 100644 --- a/core/common/tasks.py +++ b/core/common/tasks.py @@ -896,13 +896,11 @@ def source_version_compare(version1_uri, version2_uri, is_changelog, verbosity, version1 = Source.objects.get(uri=version1_uri) version2 = Source.objects.get(uri=version2_uri) - if is_changelog and format_type == 'markdown': - result = Source.changelog(version1, version2, verbosity, enrich=True) - from core.sources.changelog_markdown import ChangelogMarkdownGenerator - generator = ChangelogMarkdownGenerator(result) - result['markdown'] = generator.generate() - elif is_changelog: + if is_changelog: result = Source.changelog(version1, version2, verbosity) + if format_type == 'markdown': + from core.sources.changelog_markdown import ChangelogMarkdownGenerator + result['markdown'] = ChangelogMarkdownGenerator(result).generate() else: result = Source.compare(version1, version2, verbosity) diff --git a/core/sources/changelog_markdown.py b/core/sources/changelog_markdown.py index 2ee9caf1..005fb98d 100644 --- a/core/sources/changelog_markdown.py +++ b/core/sources/changelog_markdown.py @@ -1,8 +1,9 @@ """ Markdown changelog generator for source version diffs. -Transforms enriched $changelog JSON (produced with enrich=True) into a -human-readable markdown document structured after LOINC/SNOMED release notes. +Transforms $changelog JSON into a human-readable markdown document structured +after LOINC/SNOMED release notes. Requests with ``verbosity>=4`` include +enriched before/after details for names, descriptions, and mappings. LLM-based "Release Note Highlights" and per-section narrative summaries are intentionally NOT implemented here. @@ -13,6 +14,7 @@ """ from datetime import date +from urllib.parse import unquote from django.conf import settings @@ -26,8 +28,9 @@ class ChangelogMarkdownGenerator: generator = ChangelogMarkdownGenerator(changelog_data) markdown_string = generator.generate() - The ``changelog_data`` dict is the value returned by ``Source.changelog()`` - when called with ``enrich=True``. It has the shape:: + The ``changelog_data`` dict is the value returned by ``Source.changelog()``. + With ``verbosity>=4`` it carries extra fields used for detail tables. It has + the shape:: { "meta": { @@ -58,14 +61,60 @@ def __init__(self, changelog_data, default_locale='en'): self._v1_meta = self.meta.get('version1', {}) self._v2_meta = self.meta.get('version2', {}) self._source_prefix = self._extract_source_prefix(self._v2_meta.get('uri', '')) + self._mapping_collections_cache = None + self.is_enriched = self._detect_enrichment() + + def _detect_enrichment(self): + """ + Detect whether the input JSON carries verbosity>=4 enrichment data + (names[], descriptions[], prev_*). Drives section-by-section adaptive + rendering so a low-verbosity input still yields a useful document + (Summary + Added/Removed/Retired/Updated lists) rather than an empty one. + """ + for key in ('new', 'changed_major', 'changed_minor', 'removed', 'changed_retired'): + for info in (self.concepts.get(key) or {}).values(): + if info.get('names') is not None or info.get('prev_names') is not None: + return True + for key in ('changed_major', 'changed_minor', 'new'): + for m in (self.mappings.get(key) or {}).values(): + if self._mapping_is_enriched(m): + return True + for concepts in self.concepts.values(): + if not isinstance(concepts, dict): + continue + for info in concepts.values(): + for mappings in (info.get('mappings') or {}).values(): + for _, mapping in self._mapping_items(mappings): + if self._mapping_is_enriched(mapping): + return True + return False + + @staticmethod + def _mapping_is_enriched(mapping): + """Return whether a mapping summary includes verbosity>=4 details.""" + return ( + mapping.get('external_id') is not None + or mapping.get('prev_to_concept') is not None + or mapping.get('prev_to_source') is not None + or mapping.get('prev_map_type') is not None + ) # ------------------------------------------------------------------ # Public API # ------------------------------------------------------------------ def generate(self): + # Precompute row collections once — used by both TOC (to decide which + # subsections to list) and the section renderers (to emit tables). + empty_rows = ([], [], []) + self._name_rows = self._collect_name_rows(self.default_locale, 'names') if self.is_enriched else empty_rows + self._description_rows = self._collect_description_rows() if self.is_enriched else empty_rows + self._translation_rows = self._collect_translation_rows() if self.is_enriched else empty_rows + sections = [ self._header(), + self._notice(), + self._overview(), self._summary_table(), self._toc(), self._concepts_section(), @@ -76,6 +125,28 @@ def generate(self): ] return '\n\n'.join(s for s in sections if s) + def _visible_changed(self, items): + """Filter out checksum-only changes when enriched data lets us detect them.""" + return ( + {cid: info for cid, info in items.items() if self._changed_axes(info)} + if self.is_enriched else items + ) + + @staticmethod + def _anchor(anchor_id): + return f'' + + def _notice(self): + """Warn the reader when enrichment data is missing — only when it matters.""" + if self.is_enriched: + return '' + return ( + '> **Note:** this changelog was generated without enrichment data ' + '(`verbosity<4`). Name, description, translation, and before/after ' + 'mapping details are not included. Re-run with `?verbosity=4` for ' + 'full detail.' + ) + # ------------------------------------------------------------------ # Header / meta # ------------------------------------------------------------------ @@ -91,30 +162,64 @@ def _header(self): f'*Compared to {v1_version} — Generated on {today}*' ) - def _summary_table(self): + def _overview(self): + """ + High-level version comparison table placed immediately after the header. + + Shows total concept and mapping counts for each version side-by-side with + add/remove/change deltas so readers can instantly gauge the release scope. + """ + v1_label = self._version_label(self._v1_meta.get('uri', '')) + v2_label = self._version_label(self._v2_meta.get('uri', '')) + v1_concepts = self._v1_meta.get('concepts', 0) v2_concepts = self._v2_meta.get('concepts', 0) v1_mappings = self._v1_meta.get('mappings', 0) v2_mappings = self._v2_meta.get('mappings', 0) - concepts_new = len(self.concepts.get('new') or {}) - concepts_removed = len(self.concepts.get('removed') or {}) - concepts_retired = len(self.concepts.get('changed_retired') or {}) - concepts_major = len(self.concepts.get('changed_major') or {}) - concepts_minor = len(self.concepts.get('changed_minor') or {}) - concepts_mappings_only = len(self.concepts.get('changed_mappings_only') or {}) + concepts_added = len(self.concepts.get('new') or {}) + # "Removed" in the overview encompasses both hard-removes and retirements. + concepts_removed = ( + len(self.concepts.get('removed') or {}) + + len(self.concepts.get('changed_retired') or {}) + ) + concepts_changed = ( + len(self.concepts.get('changed_major') or {}) + + len(self.concepts.get('changed_minor') or {}) + + len(self.concepts.get('changed_mappings_only') or {}) + ) - mappings_added = len(self.mappings.get('new') or {}) - mappings_removed = len(self.mappings.get('removed') or {}) + mappings_added, mappings_removed, mappings_changed = self._mapping_collections() - net_concepts = concepts_new - concepts_removed - concepts_retired - net_mappings = mappings_added - mappings_removed + lines = [ + '## Overview', + '', + f'**{v1_label} → {v2_label}**', + '', + f'| Category | {v1_label} | {v2_label} | Added | Removed | Changed |', + '|----------|----------:|----------:|------:|--------:|--------:|', + ( + f'| Concepts | {v1_concepts:,} | {v2_concepts:,} | {concepts_added:,} ' + f'| {concepts_removed:,} | {concepts_changed:,} |' + ), + ( + f'| Mappings | {v1_mappings:,} | {v2_mappings:,} | {len(mappings_added):,} ' + f'| {len(mappings_removed):,} | {len(mappings_changed):,} |' + ), + '', + '---', + ] + return '\n'.join(lines) - def _net(n): - return f'+{n:,}' if n > 0 else (f'{n:,}' if n < 0 else '0') + def _summary_table(self): + concepts_new = len(self.concepts.get('new') or {}) + concepts_removed = len(self.concepts.get('removed') or {}) + concepts_retired = len(self.concepts.get('changed_retired') or {}) + concepts_major = len(self.concepts.get('changed_major') or {}) + concepts_minor = len(self.concepts.get('changed_minor') or {}) + concepts_mappings_only = len(self.concepts.get('changed_mappings_only') or {}) - v1_label = self._version_label(self._v1_meta.get('uri', '')) - v2_label = self._version_label(self._v2_meta.get('uri', '')) + mappings_added, mappings_removed, _ = self._mapping_collections() v1_uri = self._v1_meta.get('uri', '') v2_uri = self._v2_meta.get('uri', '') @@ -124,24 +229,16 @@ def _net(n): lines = [ '## Summary', '', - f'**{v1_label} → {v2_label}**', - '', '| Category | Count |', '|----------|------:|', f'| New concepts | {concepts_new:,} |', + f'| Removed concepts | {concepts_removed:,} |', + f'| Retired concepts | {concepts_retired:,} |', f'| Major changes | {concepts_major:,} |', f'| Minor changes | {concepts_minor:,} |', f'| Mapping-only changes | {concepts_mappings_only:,} |', - f'| Retired concepts | {concepts_retired:,} |', - f'| Mappings added | {mappings_added:,} |', - f'| Mappings removed | {mappings_removed:,} |', - f'| **Net change** | **{_net(net_concepts)} concepts' - + (f', {_net(net_mappings)} mappings' if net_mappings != 0 else '') + '** |', - '', - '| | ' + v1_label + ' | ' + v2_label + ' |', - '|--|--:|--:|', - f'| Concepts | {v1_concepts:,} | {v2_concepts:,} |', - f'| Mappings | {v1_mappings:,} | {v2_mappings:,} |', + f'| Mappings added | {len(mappings_added):,} |', + f'| Mappings removed | {len(mappings_removed):,} |', '', f'[Download full JSON diff]({diff_url})', '', @@ -150,21 +247,84 @@ def _net(n): return '\n'.join(lines) def _toc(self): - entries = ['## Contents', ''] - section_checks = [ - ('Concepts', self._has_concepts()), - ('Names', self._has_names()), - ('Descriptions', self._has_descriptions()), - ('Translations', self._has_translations()), - ('Mappings', self._has_mappings()), + entries = [] + for label, anchor, subs in self._toc_sections(): + if not subs: + continue + entries.append(f'- [{label}](#{anchor})') + for sub_label, sub_anchor in subs: + entries.append(f' - [{sub_label}](#{sub_anchor})') + if not entries: + return '' + return '\n'.join(['## Contents', '', *entries, '', '---']) + + def _toc_sections(self): + """Return only post-Contents sections, each with visible subsections.""" + return [ + ('Concepts', 'concepts', self._concept_subsections()), + ('Names', 'names', self._name_subsections()), + ('Descriptions', 'descriptions', self._description_subsections()), + ('Translations', 'translations', self._translation_subsections()), + ('Mappings', 'mappings', self._mapping_subsections()), ] - for label, present in section_checks: - if present: - anchor = label.lower() - entries.append(f'- [{label}](#{anchor})') - entries.append('') - entries.append('---') - return '\n'.join(entries) + + def _concept_subsections(self): + subs = [] + if self.concepts.get('new'): + subs.append(('Added', 'concepts-added')) + if self.concepts.get('removed'): + subs.append(('Removed', 'concepts-removed')) + if self.concepts.get('changed_retired'): + subs.append(('Retired', 'concepts-retired')) + if self._visible_changed(self.concepts.get('changed_major') or {}): + subs.append(('Updated (Major)', 'concepts-updated-major')) + if self._visible_changed(self.concepts.get('changed_minor') or {}): + subs.append(('Updated (Minor)', 'concepts-updated-minor')) + return subs + + def _name_subsections(self): + added, updated, removed = self._name_rows + subs = [] + if added: + subs.append(('Added', 'names-added')) + if updated: + subs.append(('Updated', 'names-updated')) + if removed: + subs.append(('Removed', 'names-removed')) + return subs + + def _description_subsections(self): + added, updated, removed = self._description_rows + subs = [] + if added: + subs.append(('Added', 'descriptions-added')) + if updated: + subs.append(('Updated', 'descriptions-updated')) + if removed: + subs.append(('Removed', 'descriptions-removed')) + return subs + + def _translation_subsections(self): + added, updated, removed = self._translation_rows + subs = [] + if added: + subs.append(('Added', 'translations-added')) + if updated: + subs.append(('Updated', 'translations-updated')) + if removed: + subs.append(('Removed', 'translations-removed')) + return subs + + def _mapping_subsections(self): + added, removed, changed = self._mapping_collections() + subs = [] + if added: + subs.append(('Added', 'mappings-added')) + if removed: + subs.append(('Removed', 'mappings-removed')) + if changed: + subs.append(('Updated', 'mappings-updated')) + return subs # ------------------------------------------------------------------ # Concepts section @@ -180,45 +340,38 @@ def _concepts_section(self): changed_major = self.concepts.get('changed_major') or {} changed_minor = self.concepts.get('changed_minor') or {} - total_added = len(added) - total_removed = len(removed) - total_retired = len(retired) - # Only count concepts where at least one data axis changed (names, descriptions, - # metadata, or mappings). Pure checksum-only changes carry no visible content change. - total_changed = ( - sum(1 for info in changed_major.values() if self._changed_axes(info)) - + sum(1 for info in changed_minor.values() if self._changed_axes(info)) - ) + visible_major = self._visible_changed(changed_major) + visible_minor = self._visible_changed(changed_minor) highlight = self._static_highlight( 'Concepts', - added=total_added, - removed=total_removed, - retired=total_retired, - changed=total_changed, + added=len(added), + removed=len(removed), + retired=len(retired), + changed=len(visible_major) + len(visible_minor), ) parts = ['## Concepts', '', f'*{highlight}*'] if added: - parts += ['', '### Added', ''] + parts += ['', self._anchor('concepts-added'), '### Added', ''] parts += self._concept_table(added) if removed: - parts += ['', '### Removed', ''] + parts += ['', self._anchor('concepts-removed'), '### Removed', ''] parts += self._concept_table(removed) if retired: - parts += ['', '### Retired', ''] + parts += ['', self._anchor('concepts-retired'), '### Retired', ''] parts += self._concept_table(retired) - if changed_major: - visible_major = {cid: info for cid, info in changed_major.items() if self._changed_axes(info)} - if visible_major: - parts += ['', '### Updated (Major)', ''] - parts += self._concept_table(visible_major, show_changes=True, axes_as_links=True) - if changed_minor: - visible_minor = {cid: info for cid, info in changed_minor.items() if self._changed_axes(info)} - if visible_minor: - parts += ['', '### Updated (Minor)', ''] - parts += self._concept_table(visible_minor, show_changes=True, axes_as_links=True) + if visible_major: + parts += ['', self._anchor('concepts-updated-major'), '### Updated (Major)', ''] + parts += self._concept_table( + visible_major, show_changes=self.is_enriched, axes_as_links=self.is_enriched + ) + if visible_minor: + parts += ['', self._anchor('concepts-updated-minor'), '### Updated (Minor)', ''] + parts += self._concept_table( + visible_minor, show_changes=self.is_enriched, axes_as_links=self.is_enriched + ) parts += ['', '---'] return '\n'.join(parts) @@ -239,7 +392,11 @@ def _concept_table(self, concepts_dict, show_changes=False, axes_as_links=False) concept_class = info.get('concept_class') or '' link = self._concept_link(concept_id) if show_changes: - axes = self._changed_axes(info, as_links=axes_as_links, concept_id=concept_id if axes_as_links else None) + axes = self._changed_axes( + info, + as_links=axes_as_links, + concept_id=concept_id if axes_as_links else None + ) changed_str = ', '.join(axes) if axes else '—' rows.append( f'| {link} | {self._escape(display)} | {self._escape(concept_class)} | {changed_str} |' @@ -248,6 +405,42 @@ def _concept_table(self, concepts_dict, show_changes=False, axes_as_links=False) rows.append(f'| {link} | {self._escape(display)} | {self._escape(concept_class)} |') return rows + @staticmethod + def _names_changed(prev_names, curr_names, locale, invert=False): + """ + Return True if there is any real name change between prev and curr for + the given locale (or all non-locale names when invert=True). + + Uses external_id as stable key when available; falls back to comparing + the full set of (type, locale, text) tuples otherwise. + """ + def _matches(n): + return n.get('locale') != locale if invert else n.get('locale') == locale + + prev = [n for n in prev_names if _matches(n)] + curr = [n for n in curr_names if _matches(n)] + + prev_eid = {n['external_id']: n.get('name') for n in prev if n.get('external_id')} + curr_eid = {n['external_id']: n.get('name') for n in curr if n.get('external_id')} + + # Any addition/removal/change in external_id space? + if set(prev_eid) != set(curr_eid): + return True + for eid in prev_eid: + if prev_eid[eid] != curr_eid.get(eid): + return True + + # Fallback for names without external_id + prev_fallback = frozenset( + (n.get('type'), n.get('locale'), n.get('name')) + for n in prev if not n.get('external_id') + ) + curr_fallback = frozenset( + (n.get('type'), n.get('locale'), n.get('name')) + for n in curr if not n.get('external_id') + ) + return prev_fallback != curr_fallback + def _changed_axes(self, info, as_links=False, concept_id=None): """ Compute which axes changed for a concept in changed_major/changed_minor. @@ -271,31 +464,11 @@ def _link(label, section): return label # Default-locale names → Names section - prev_names_default = frozenset( - (n.get('type'), n.get('locale'), n.get('name')) - for n in (info.get('prev_names') or []) - if n.get('locale') == self.default_locale - ) - curr_names_default = frozenset( - (n.get('type'), n.get('locale'), n.get('name')) - for n in (info.get('names') or []) - if n.get('locale') == self.default_locale - ) - if prev_names_default != curr_names_default: + if self._names_changed(info.get('prev_names') or [], info.get('names') or [], self.default_locale): axes.append(_link('Names', 'names')) # Non-default-locale names → Translations section - prev_names_tr = frozenset( - (n.get('type'), n.get('locale'), n.get('name')) - for n in (info.get('prev_names') or []) - if n.get('locale') != self.default_locale - ) - curr_names_tr = frozenset( - (n.get('type'), n.get('locale'), n.get('name')) - for n in (info.get('names') or []) - if n.get('locale') != self.default_locale - ) - if prev_names_tr != curr_names_tr: + if self._names_changed(info.get('prev_names') or [], info.get('names') or [], self.default_locale, invert=True): axes.append(_link('Translations', 'translations')) # Descriptions @@ -331,128 +504,132 @@ def _link(label, section): # ------------------------------------------------------------------ def _names_section(self): - if not self._has_names(): + added_rows, updated_rows, removed_rows = self._name_rows + if not (added_rows or updated_rows or removed_rows): return '' - added_rows, updated_rows, removed_rows = self._collect_name_rows(self.default_locale, section='names') - highlight = self._static_highlight( 'Names', - added=len(added_rows), - updated=len(updated_rows), - removed=len(removed_rows), + added=len(added_rows), updated=len(updated_rows), removed=len(removed_rows), ) - parts = ['## Names', '', f'*{highlight}*'] if added_rows: - parts += ['', '### Added', ''] + parts += ['', self._anchor('names-added'), '### Added', ''] parts += self._names_added_table(added_rows) if updated_rows: - parts += ['', '### Updated', ''] + parts += ['', self._anchor('names-updated'), '### Updated', ''] parts += self._names_updated_table(updated_rows) if removed_rows: - parts += ['', '### Removed', ''] + parts += ['', self._anchor('names-removed'), '### Removed', ''] parts += self._names_added_table(removed_rows) - parts += ['', '---'] return '\n'.join(parts) def _collect_name_rows(self, locale_filter, section='names'): - """ - Return (added_rows, updated_rows, removed_rows) for the given locale filter. + """Return (added, updated, removed) rows for names at the given locale.""" + return self._collect_name_like_rows( + lambda n: n.get('locale') == locale_filter, section + ) - The concept-ID cell of the *first* row for each concept carries an HTML - anchor (````) so that the "Changed" column in the - Concepts table can link directly to that row. + def _collect_translation_name_rows(self): + """Return (added, updated, removed) rows for names in non-default locales.""" + return self._collect_name_like_rows( + lambda n: n.get('locale') != self.default_locale, 'translations' + ) + + def _collect_name_like_rows(self, matches_locale, section): # pylint: disable=too-many-locals,too-many-branches """ - added_rows = [] - updated_rows = [] - removed_rows = [] + Collect name add/update/remove rows grouped by change type. + + Comparison strategy for changed concepts: + 1. Primary: ``external_id`` is the stable key across versions. Same + external_id with different text → Updated; only-in-v1 → Removed; + only-in-v2 → Added. + 2. Fallback (for names lacking ``external_id``): group by + ``(type, locale)`` and compare text sets. A single replacement + within a slot (1 removed + 1 added) is treated as Updated. + + The first row per concept carries an HTML anchor so the Concepts "Changed" + column can deep-link to it. + """ + from collections import defaultdict + + added_rows, updated_rows, removed_rows = [], [], [] anchored = set() def anchored_link(concept_id): base = self._concept_link(concept_id) - if concept_id not in anchored: - anchored.add(concept_id) - return f'{base}' - return base + if concept_id in anchored: + return base + anchored.add(concept_id) + return f'{base}' - # Added: from new concepts - for concept_id, info in (self.concepts.get('new') or {}).items(): - link = anchored_link(concept_id) - first = True - for name in info.get('names') or []: - if name.get('locale') == locale_filter: - added_rows.append((link if first else self._concept_link(concept_id), - name.get('name', ''), name.get('type', ''), name.get('locale', ''))) - first = False + def row_tuple(cid, name, ntype, locale): + return (anchored_link(cid), name or '', ntype or '', locale or '') - # Removed: from removed concepts (these are v1 names) + # Added/Removed from new/removed concepts (all their names at this locale) + for concept_id, info in (self.concepts.get('new') or {}).items(): + for n in info.get('names') or []: + if matches_locale(n): + added_rows.append(row_tuple(concept_id, n.get('name'), n.get('type'), n.get('locale'))) for concept_id, info in (self.concepts.get('removed') or {}).items(): - link = anchored_link(concept_id) - first = True - for name in info.get('names') or []: - if name.get('locale') == locale_filter: - removed_rows.append((link if first else self._concept_link(concept_id), - name.get('name', ''), name.get('type', ''), name.get('locale', ''))) - first = False - - # Added/Updated/Removed: compare prev_names vs names on changed concepts. - # - # We group names by (type, locale) and compare the SET of texts within - # each group. This avoids false positives when multiple names share the - # same (type, locale) pair — the old single-dict approach would silently - # overwrite all but the last name in such a group, producing spurious - # "updated" rows. - # - # Update detection: if a (type, locale) group had exactly 1 text in v1 - # and exactly 1 different text in v2, we treat it as a text correction - # ("Updated"). Any other add/remove within a group is reported literally. - from collections import defaultdict + for n in info.get('names') or []: + if matches_locale(n): + removed_rows.append(row_tuple(concept_id, n.get('name'), n.get('type'), n.get('locale'))) + + # Compare prev vs current names for changed concepts for key in ('changed_major', 'changed_minor'): for concept_id, info in (self.concepts.get(key) or {}).items(): - prev_names = info.get('prev_names') or [] - curr_names = info.get('names') or [] + prev_names = [n for n in (info.get('prev_names') or []) if matches_locale(n)] + curr_names = [n for n in (info.get('names') or []) if matches_locale(n)] + + prev_eid = {n['external_id']: n for n in prev_names if n.get('external_id')} + curr_eid = {n['external_id']: n for n in curr_names if n.get('external_id')} + + for eid in set(prev_eid) | set(curr_eid): + p, c = prev_eid.get(eid), curr_eid.get(eid) + if p and c: + if p.get('name') != c.get('name'): + updated_rows.append(( + anchored_link(concept_id), + p.get('name', ''), c.get('name', ''), + c.get('type') or '', c.get('locale') or '', + )) + elif c: + added_rows.append(row_tuple(concept_id, c.get('name'), c.get('type'), c.get('locale'))) + else: + removed_rows.append(row_tuple(concept_id, p.get('name'), p.get('type'), p.get('locale'))) - # Group texts by (type, locale) as sets (handles duplicates correctly) - prev_by_key = defaultdict(set) - for n in prev_names: - if n.get('locale') == locale_filter: - prev_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) + # Fallback for names without external_id + prev_no_eid = [n for n in prev_names if not n.get('external_id')] + curr_no_eid = [n for n in curr_names if not n.get('external_id')] + if not (prev_no_eid or curr_no_eid): + continue + prev_by_key = defaultdict(set) + for n in prev_no_eid: + prev_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) curr_by_key = defaultdict(set) - for n in curr_names: - if n.get('locale') == locale_filter: - curr_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) - - all_keys = set(prev_by_key) | set(curr_by_key) - for (ntype, nloc) in all_keys: + for n in curr_no_eid: + curr_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) + for (ntype, nloc) in set(prev_by_key) | set(curr_by_key): prev_texts = prev_by_key.get((ntype, nloc), set()) curr_texts = curr_by_key.get((ntype, nloc), set()) if prev_texts == curr_texts: continue - added_texts = curr_texts - prev_texts removed_texts = prev_texts - curr_texts - - # Exactly 1 removal + 1 addition in the same (type, locale) slot → - # treat as a text correction (Updated) rather than separate rows. if len(added_texts) == 1 and len(removed_texts) == 1: - link = anchored_link(concept_id) updated_rows.append(( - link, - next(iter(removed_texts)), - next(iter(added_texts)), - ntype or '', - nloc or '', + anchored_link(concept_id), + next(iter(removed_texts)), next(iter(added_texts)), + ntype or '', nloc or '', )) else: for text in added_texts: - link = anchored_link(concept_id) - added_rows.append((link, text, ntype or '', nloc or '')) + added_rows.append(row_tuple(concept_id, text, ntype, nloc)) for text in removed_texts: - link = anchored_link(concept_id) - removed_rows.append((link, text, ntype or '', nloc or '')) + removed_rows.append(row_tuple(concept_id, text, ntype, nloc)) return added_rows, updated_rows, removed_rows @@ -463,7 +640,10 @@ def _names_added_table(rows): '|-----------:|------|-----------|--------|', ] for link, name, name_type, locale in rows: - lines.append(f'| {link} | {ChangelogMarkdownGenerator._escape(name)} | {ChangelogMarkdownGenerator._escape(name_type)} | {locale} |') + lines.append( + f'| {link} | {ChangelogMarkdownGenerator._escape(name)} ' + f'| {ChangelogMarkdownGenerator._escape(name_type)} | {locale} |' + ) return lines @staticmethod @@ -485,33 +665,28 @@ def _names_updated_table(rows): # ------------------------------------------------------------------ def _descriptions_section(self): - if not self._has_descriptions(): + added_rows, updated_rows, removed_rows = self._description_rows + if not (added_rows or updated_rows or removed_rows): return '' - added_rows, updated_rows, removed_rows = self._collect_description_rows() - highlight = self._static_highlight( 'Descriptions', - added=len(added_rows), - updated=len(updated_rows), - removed=len(removed_rows), + added=len(added_rows), updated=len(updated_rows), removed=len(removed_rows), ) - parts = ['## Descriptions', '', f'*{highlight}*'] if added_rows: - parts += ['', '### Added', ''] + parts += ['', self._anchor('descriptions-added'), '### Added', ''] parts += self._descriptions_added_table(added_rows) if updated_rows: - parts += ['', '### Updated', ''] + parts += ['', self._anchor('descriptions-updated'), '### Updated', ''] parts += self._descriptions_updated_table(updated_rows) if removed_rows: - parts += ['', '### Removed', ''] + parts += ['', self._anchor('descriptions-removed'), '### Removed', ''] parts += self._descriptions_added_table(removed_rows) - parts += ['', '---'] return '\n'.join(parts) - def _collect_description_rows(self): + def _collect_description_rows(self): # pylint: disable=too-many-locals added_rows = [] updated_rows = [] removed_rows = [] @@ -567,7 +742,10 @@ def _descriptions_added_table(rows): '|-----------:|------------|-----------------|--------|', ] for link, desc, dtype, locale in rows: - lines.append(f'| {link} | {ChangelogMarkdownGenerator._escape(desc)} | {ChangelogMarkdownGenerator._escape(dtype)} | {locale} |') + lines.append( + f'| {link} | {ChangelogMarkdownGenerator._escape(desc)} ' + f'| {ChangelogMarkdownGenerator._escape(dtype)} | {locale} |' + ) return lines @staticmethod @@ -588,11 +766,8 @@ def _descriptions_updated_table(rows): # ------------------------------------------------------------------ def _translations_section(self): - if not self._has_translations(): - return '' - - added_rows, updated_rows, removed_rows = self._collect_translation_rows() - if not any([added_rows, updated_rows, removed_rows]): + added_rows, updated_rows, removed_rows = self._translation_rows + if not (added_rows or updated_rows or removed_rows): return '' # Group by locale for the highlight. @@ -603,92 +778,25 @@ def _translations_section(self): locales_str = ', '.join(all_locales) if all_locales else '' highlight = self._static_highlight( 'Translations', - added=len(added_rows), - updated=len(updated_rows), - removed=len(removed_rows), + added=len(added_rows), updated=len(updated_rows), removed=len(removed_rows), extra=f'Locales: {locales_str}' if locales_str else None, ) - parts = ['## Translations', '', f'*{highlight}*'] if added_rows: - parts += ['', '### Added', ''] + parts += ['', self._anchor('translations-added'), '### Added', ''] parts += self._translations_table(added_rows) if updated_rows: - parts += ['', '### Updated', ''] + parts += ['', self._anchor('translations-updated'), '### Updated', ''] parts += self._translations_updated_table(updated_rows) if removed_rows: - parts += ['', '### Removed', ''] + parts += ['', self._anchor('translations-removed'), '### Removed', ''] parts += self._translations_table(removed_rows) - parts += ['', '---'] return '\n'.join(parts) def _collect_translation_rows(self): - """ - Same logic as _collect_name_rows but for non-default locales. - Anchors use the ``translations-{concept_id}`` prefix. - """ - added_rows = [] - updated_rows = [] - removed_rows = [] - anchored = set() - - def anchored_link(concept_id): - base = self._concept_link(concept_id) - if concept_id not in anchored: - anchored.add(concept_id) - return f'{base}' - return base - - for concept_id, info in (self.concepts.get('new') or {}).items(): - for name in info.get('names') or []: - if name.get('locale') != self.default_locale: - added_rows.append((anchored_link(concept_id), name.get('name', ''), name.get('type', ''), name.get('locale', ''))) - - for concept_id, info in (self.concepts.get('removed') or {}).items(): - for name in info.get('names') or []: - if name.get('locale') != self.default_locale: - removed_rows.append((anchored_link(concept_id), name.get('name', ''), name.get('type', ''), name.get('locale', ''))) - - for key in ('changed_major', 'changed_minor'): - for concept_id, info in (self.concepts.get(key) or {}).items(): - prev_names = info.get('prev_names') or [] - curr_names = info.get('names') or [] - - from collections import defaultdict - prev_by_key = defaultdict(set) - for n in prev_names: - if n.get('locale') != self.default_locale: - prev_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) - - curr_by_key = defaultdict(set) - for n in curr_names: - if n.get('locale') != self.default_locale: - curr_by_key[(n.get('type'), n.get('locale'))].add(n.get('name', '')) - - all_keys = set(prev_by_key) | set(curr_by_key) - for (ntype, nloc) in all_keys: - prev_texts = prev_by_key.get((ntype, nloc), set()) - curr_texts = curr_by_key.get((ntype, nloc), set()) - if prev_texts == curr_texts: - continue - added_texts = curr_texts - prev_texts - removed_texts = prev_texts - curr_texts - if len(added_texts) == 1 and len(removed_texts) == 1: - link = anchored_link(concept_id) - updated_rows.append(( - link, next(iter(removed_texts)), next(iter(added_texts)), - ntype or '', nloc or '', - )) - else: - for text in added_texts: - link = anchored_link(concept_id) - added_rows.append((link, text, ntype or '', nloc or '')) - for text in removed_texts: - link = anchored_link(concept_id) - removed_rows.append((link, text, ntype or '', nloc or '')) - - return added_rows, updated_rows, removed_rows + """Alias for backward-compat / clarity — delegates to the unified helper.""" + return self._collect_translation_name_rows() @staticmethod def _translations_table(rows): @@ -697,7 +805,10 @@ def _translations_table(rows): '|-----------:|------|--------|-----------|', ] for link, name, name_type, locale in rows: - lines.append(f'| {link} | {ChangelogMarkdownGenerator._escape(name)} | {locale} | {ChangelogMarkdownGenerator._escape(name_type)} |') + lines.append( + f'| {link} | {ChangelogMarkdownGenerator._escape(name)} | {locale} ' + f'| {ChangelogMarkdownGenerator._escape(name_type)} |' + ) return lines @staticmethod @@ -718,82 +829,166 @@ def _translations_updated_table(rows): # Mappings section # ------------------------------------------------------------------ + @staticmethod + def _mapping_bucket_for(change_key): + if change_key == 'new': + return 'added' + if change_key == 'removed': + return 'removed' + return 'changed' + + @staticmethod + def _mapping_items(mapping_list_or_dict): + """Yield ``(id, mapping)`` pairs without inventing ids for list items.""" + if isinstance(mapping_list_or_dict, dict): + return mapping_list_or_dict.items() + return ((m.get('id'), m) for m in (mapping_list_or_dict or [])) + + def _normalize_mapping(self, mapping, mapping_id=None, from_concept=None): + normalized = dict(mapping or {}) + if mapping_id and not normalized.get('id'): + normalized['id'] = mapping_id + if from_concept and not normalized.get('from_concept'): + normalized['from_concept'] = from_concept + return normalized + + def _add_mapping_to_collection(self, collection, mapping, mapping_id=None, from_concept=None): + normalized = self._normalize_mapping(mapping, mapping_id=mapping_id, from_concept=from_concept) + key = normalized.get('id') or ( + f'{from_concept or ""}:{normalized.get("to_source") or ""}:' + f'{normalized.get("to_concept") or ""}:{normalized.get("map_type") or ""}' + ) + if key in collection: + # Prefer the richer normalized record when the same mapping appears both + # top-level and embedded under a concept. + collection[key] = {**collection[key], **normalized} + else: + collection[key] = normalized + + def _mapping_collections(self): + """ + Return added/removed/changed mappings across both top-level mapping diffs + and mappings embedded inside concept sections. + + Enriched changelogs intentionally attach mapping diffs to their owning + concepts so concept rows can deep-link to the relevant mapping rows. The + overview, summary, TOC, and Mappings section must therefore count/render + embedded mappings as first-class mapping changes too. + """ + if self._mapping_collections_cache is not None: + return self._mapping_collections_cache + + added, removed, changed = {}, {}, {} + collections = {'added': added, 'removed': removed, 'changed': changed} + + for change_key, bucket in ( + ('new', added), + ('removed', removed), + ('changed_major', changed), + ('changed_minor', changed), + ('changed_retired', changed), + ): + for mapping_id, mapping in (self.mappings.get(change_key) or {}).items(): + self._add_mapping_to_collection(bucket, mapping, mapping_id=mapping_id) + + for concepts in self.concepts.values(): + if not isinstance(concepts, dict): + continue + for concept_id, info in concepts.items(): + for change_key, mapping_list in (info.get('mappings') or {}).items(): + bucket = collections[self._mapping_bucket_for(change_key)] + for mapping_id, mapping in self._mapping_items(mapping_list): + self._add_mapping_to_collection( + bucket, mapping, mapping_id=mapping_id, from_concept=concept_id + ) + + self._mapping_collections_cache = added, removed, changed + return self._mapping_collections_cache + def _mappings_section(self): if not self._has_mappings(): return '' - added = self.mappings.get('new') or {} - removed = self.mappings.get('removed') or {} - changed_major = self.mappings.get('changed_major') or {} - changed_minor = self.mappings.get('changed_minor') or {} - changed_retired = self.mappings.get('changed_retired') or {} - - # Also collect mappings from changed_mappings_only concepts - inline_added = {} - inline_changed = {} - for concept_id, info in (self.concepts.get('changed_mappings_only') or {}).items(): - for change_key, mapping_list in (info.get('mappings') or {}).items(): - for m in mapping_list: - if change_key == 'new': - inline_added[m['id']] = m - else: - inline_changed[m['id']] = m - - all_added = {**added, **inline_added} - all_changed = {**changed_major, **changed_minor, **changed_retired, **inline_changed} - - total_added = len(all_added) - total_removed = len(removed) - total_changed = len(all_changed) + added, removed, changed = self._mapping_collections() highlight = self._static_highlight( 'Mappings', - added=total_added, - removed=total_removed, - changed=total_changed, + added=len(added), + removed=len(removed), + changed=len(changed), ) parts = ['## Mappings', '', f'*{highlight}*'] - if all_added: - parts += ['', '### Added', ''] - parts += self._mappings_table(all_added) + if added: + parts += ['', self._anchor('mappings-added'), '### Added', ''] + parts += self._mappings_table(added) if removed: - parts += ['', '### Removed', ''] + parts += ['', self._anchor('mappings-removed'), '### Removed', ''] parts += self._mappings_table(removed) - if all_changed: - parts += ['', '### Updated', ''] - parts += self._mappings_table(all_changed) + if changed: + parts += ['', self._anchor('mappings-updated'), '### Updated', ''] + parts += self._mappings_updated_table(changed) return '\n'.join(parts) + def _from_link_builder(self): + """Build a function that emits anchored from_concept links once per concept.""" + anchored = set() + + def builder(from_concept): + if not from_concept: + return '' + base = self._concept_link(from_concept) + if from_concept in anchored: + return base + anchored.add(from_concept) + return f'{base}' + return builder + def _mappings_table(self, mappings_dict): rows = [ '| From Concept | To Concept | To Source | Map Type |', '|-------------|-----------|----------|---------|', ] - anchored = set() - for _, m in mappings_dict.items(): - from_concept = m.get('from_concept') or '' + make_link = self._from_link_builder() + for m in mappings_dict.values(): + rows.append( + f'| {make_link(m.get("from_concept"))} ' + f'| {self._display_code(m.get("to_concept"))} ' + f'| {self._escape(m.get("to_source") or "")} ' + f'| {self._escape(m.get("map_type") or "")} |' + ) + return rows + + def _mappings_updated_table(self, mappings_dict): + """Before/after table for changed mappings, highlighting fields that changed.""" + rows = [ + '| From Concept | Previous To Concept | Updated To Concept | ' + 'Previous Map Type | Updated Map Type | To Source |', + '|-------------|--------------------|--------------------|' + '------------------|------------------|----------|', + ] + make_link = self._from_link_builder() + for m in mappings_dict.values(): to_concept = m.get('to_concept') or '' - to_source = m.get('to_source') or '' map_type = m.get('map_type') or '' - if from_concept: - base_link = self._concept_link(from_concept) - if from_concept not in anchored: - anchored.add(from_concept) - from_link = f'{base_link}' - else: - from_link = base_link - else: - from_link = '' + prev_to = m.get('prev_to_concept') + prev_mt = m.get('prev_map_type') + # Fall back to current value when prev is missing (e.g. verbosity<4 consumer). + prev_to_display = prev_to if prev_to is not None else to_concept + prev_mt_display = prev_mt if prev_mt is not None else map_type rows.append( - f'| {from_link} | {self._escape(to_concept)} ' - f'| {self._escape(to_source)} | {self._escape(map_type)} |' + f'| {make_link(m.get("from_concept"))} ' + f'| {self._display_code(prev_to_display)} ' + f'| {self._display_code(to_concept)} ' + f'| {self._escape(prev_mt_display)} ' + f'| {self._escape(map_type)} ' + f'| {self._escape(m.get("to_source") or "")} |' ) return rows # ------------------------------------------------------------------ - # Presence checks (used for TOC and section skipping) + # Presence checks # ------------------------------------------------------------------ def _has_concepts(self): @@ -802,45 +997,18 @@ def _has_concepts(self): return True return False - def _has_names(self): - for key in ('new', 'removed', 'changed_major', 'changed_minor'): - for info in (self.concepts.get(key) or {}).values(): - if info.get('names') or info.get('prev_names'): - return True - return False - - def _has_descriptions(self): - for key in ('new', 'removed', 'changed_major', 'changed_minor'): - for info in (self.concepts.get(key) or {}).values(): - if info.get('descriptions') or info.get('prev_descriptions'): - return True - return False - - def _has_translations(self): - for key in ('new', 'removed', 'changed_major', 'changed_minor'): - for info in (self.concepts.get(key) or {}).values(): - for name in info.get('names') or []: - if name.get('locale') != self.default_locale: - return True - for name in info.get('prev_names') or []: - if name.get('locale') != self.default_locale: - return True - return False - def _has_mappings(self): - if any(self.mappings.get(k) for k in ('new', 'removed', 'changed_retired', 'changed_major', 'changed_minor')): - return True - for info in (self.concepts.get('changed_mappings_only') or {}).values(): - if info.get('mappings'): - return True - return False + added, removed, changed = self._mapping_collections() + return bool(added or removed or changed) # ------------------------------------------------------------------ # Deterministic highlight (placeholder for future LLM integration) # ------------------------------------------------------------------ @staticmethod - def _static_highlight(section, added=0, removed=0, changed=0, updated=0, retired=0, extra=None): + def _static_highlight( # pylint: disable=too-many-arguments + section, added=0, removed=0, changed=0, updated=0, retired=0, extra=None + ): """ Returns a short descriptive string for a changelog section. @@ -904,3 +1072,16 @@ def _escape(text): if not text: return '' return str(text).replace('|', '\\|') + + @staticmethod + def _display_code(code): + """ + URL-decode a concept/mapping code for human-readable display. + + ICD-11 extension codes use ``&`` as a separator (e.g. ``2B31.2Z&XH75E6``), + but they are stored in the database URL-encoded (``2B31.2Z%26XH75E6``). + Decoding here ensures the markdown shows the canonical human-readable form. + """ + if not code: + return '' + return ChangelogMarkdownGenerator._escape(unquote(str(code))) diff --git a/core/sources/models.py b/core/sources/models.py index 6b6a771f..ee657d38 100644 --- a/core/sources/models.py +++ b/core/sources/models.py @@ -981,12 +981,18 @@ def compare(version1, version2, verbosity=0): } @staticmethod - def changelog(version1, version2, verbosity=0, enrich=False): + def changelog(version1, version2, verbosity=0): """ version1 is the older version version2 is the newer version + + verbosity >= 4 enables full enrichment: concept_class, datatype, names[] + (with external_id), descriptions[], and prev_* fields for changed concepts + and mappings. """ from core.common.checksums import ChecksumDiff + # Internal diff always runs at verbosity=3 to collect IDs of every category; + # per-resource enrichment is a concern of ChecksumChangelog (verbosity>=4). concepts_diff = ChecksumDiff( resources1=version1.get_concepts_queryset().only('mnemonic', 'checksums', 'retired'), resources2=version2.get_concepts_queryset().only('mnemonic', 'checksums', 'retired'), @@ -999,7 +1005,7 @@ def changelog(version1, version2, verbosity=0, enrich=False): ) concepts_diff.process() mappings_diff.process() - log = ChecksumChangelog(concepts_diff, mappings_diff, enrich=enrich) + log = ChecksumChangelog(concepts_diff, mappings_diff, verbosity=verbosity) log.process() result = { 'meta': { diff --git a/core/sources/tests/test_changelog_markdown.py b/core/sources/tests/test_changelog_markdown.py index 6df93187..fb08b8ed 100644 --- a/core/sources/tests/test_changelog_markdown.py +++ b/core/sources/tests/test_changelog_markdown.py @@ -1,3 +1,5 @@ +# pylint: disable=protected-access,too-many-arguments + from django.test import SimpleTestCase from core.sources.changelog_markdown import ChangelogMarkdownGenerator @@ -23,6 +25,16 @@ def _make_data( } +def _make_mapping(mapping_id='m1', from_concept='c1', to_concept='x', map_type='SAME-AS', to_source=None): + return { + 'id': mapping_id, + 'from_concept': from_concept, + 'to_concept': to_concept, + 'to_source': to_source, + 'map_type': map_type, + } + + class TestChangelogMarkdownGeneratorHeader(SimpleTestCase): def test_header_contains_version_labels(self): data = _make_data() @@ -38,25 +50,20 @@ def test_header_h1(self): class TestChangelogMarkdownGeneratorSummaryTable(SimpleTestCase): def test_summary_table_present(self): - data = _make_data(v1_concepts=100, v2_concepts=102, v1_mappings=50, v2_mappings=52) + data = _make_data() md = ChangelogMarkdownGenerator(data).generate() self.assertIn('## Summary', md) - self.assertIn('| Concepts |', md) - self.assertIn('| Mappings |', md) def test_summary_counts(self): data = _make_data( - v1_concepts=100, - v2_concepts=103, concepts={ 'new': {'c1': {'id': 'c1', 'display_name': 'Foo'}}, 'removed': {'c2': {'id': 'c2', 'display_name': 'Bar'}, 'c3': {'id': 'c3', 'display_name': 'Baz'}}, } ) md = ChangelogMarkdownGenerator(data).generate() - # New breakdown format: per-category rows + totals table self.assertIn('| New concepts | 1 |', md) - self.assertIn('| Concepts | 100 | 103 |', md) + self.assertIn('| Removed concepts | 2 |', md) def test_summary_breakdown_rows(self): data = _make_data( @@ -67,8 +74,8 @@ def test_summary_breakdown_rows(self): 'changed_mappings_only': {'c4': {'id': 'c4', 'display_name': 'Map only'}}, }, mappings={ - 'new': {'m1': {'id': 'm1', 'from_concept': 'c1', 'to_concept': 'x', 'to_source': None, 'map_type': 'SAME-AS'}}, - 'removed': {'m2': {'id': 'm2', 'from_concept': 'c2', 'to_concept': 'y', 'to_source': None, 'map_type': 'SAME-AS'}}, + 'new': {'m1': _make_mapping('m1', 'c1', 'x')}, + 'removed': {'m2': _make_mapping('m2', 'c2', 'y')}, }, ) md = ChangelogMarkdownGenerator(data).generate() @@ -79,16 +86,53 @@ def test_summary_breakdown_rows(self): self.assertIn('| Mappings added | 1 |', md) self.assertIn('| Mappings removed | 1 |', md) - def test_summary_net_change(self): + def test_summary_counts_embedded_mappings(self): data = _make_data( concepts={ - 'new': {'c1': {'id': 'c1', 'display_name': 'A'}, 'c2': {'id': 'c2', 'display_name': 'B'}}, - 'removed': {'c3': {'id': 'c3', 'display_name': 'C'}}, - } + 'changed_major': { + 'c1': { + 'id': 'c1', + 'display_name': 'Major', + 'mappings': { + 'new': [ + {'id': 'm1', 'to_concept': 'x', 'to_source': None, 'map_type': 'SAME-AS'}, + {'id': 'm2', 'to_concept': 'y', 'to_source': None, 'map_type': 'NARROWER-THAN'}, + ], + }, + }, + }, + 'changed_mappings_only': { + 'c2': { + 'id': 'c2', + 'display_name': 'Mapping only', + 'mappings': { + 'new': [ + {'id': 'm3', 'to_concept': 'z', 'to_source': None, 'map_type': 'SAME-AS'}, + ], + }, + }, + }, + }, ) md = ChangelogMarkdownGenerator(data).generate() - # net = +2 - 1 = +1 - self.assertIn('+1 concepts', md) + self.assertIn('| Mappings added | 3 |', md) + + def test_summary_no_version_range_header(self): + # Version range belongs to Overview only; it must not repeat in Summary. + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + summary_start = md.index('## Summary') + summary_block = md[summary_start:] + self.assertNotIn('→', summary_block) + + def test_summary_no_totals_table(self): + # The v1/v2 totals table belongs to Overview only; it must not repeat in Summary. + data = _make_data(v1_concepts=100, v2_concepts=102, v1_mappings=50, v2_mappings=52) + md = ChangelogMarkdownGenerator(data).generate() + summary_start = md.index('## Summary') + summary_block = md[summary_start:] + self.assertNotIn('| Concepts |', summary_block) + self.assertNotIn('| Mappings |', summary_block) def test_json_diff_download_link(self): data = _make_data() @@ -97,14 +141,107 @@ def test_json_diff_download_link(self): self.assertIn('/sources/$changelog/', md) +class TestChangelogMarkdownGeneratorOverview(SimpleTestCase): + def test_overview_section_present(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('## Overview', md) + + def test_overview_before_summary(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertLess(md.index('## Overview'), md.index('## Summary')) + + def test_overview_version_range_header(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('**v20250101 → v20260101**', md) + + def test_overview_table_columns(self): + data = _make_data(v1_concepts=80_000, v2_concepts=80_200, v1_mappings=120_000, v2_mappings=120_450) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('80,000', md) + self.assertIn('80,200', md) + self.assertIn('120,000', md) + self.assertIn('120,450', md) + + def test_overview_concepts_counts(self): + data = _make_data( + concepts={ + 'new': {'c1': {'id': 'c1', 'display_name': 'A'}, 'c2': {'id': 'c2', 'display_name': 'B'}}, + 'removed': {'c3': {'id': 'c3', 'display_name': 'C'}}, + 'changed_retired': {'c4': {'id': 'c4', 'display_name': 'D'}}, + 'changed_major': {'c5': {'id': 'c5', 'display_name': 'E'}}, + 'changed_minor': {'c6': {'id': 'c6', 'display_name': 'F'}}, + 'changed_mappings_only': {'c7': {'id': 'c7', 'display_name': 'G'}}, + } + ) + md = ChangelogMarkdownGenerator(data).generate() + # Added=2, Removed=1+1=2 (removed+retired), Changed=1+1+1=3 + self.assertIn('| Concepts |', md) + overview_line = [l for l in md.splitlines() if l.startswith('| Concepts |')][0] + self.assertIn('| 2 |', overview_line) # Added + self.assertIn('| 2 |', overview_line) # Removed (removed + retired) + self.assertIn('| 3 |', overview_line) # Changed + + def test_overview_mappings_counts(self): + data = _make_data( + mappings={ + 'new': {'m1': _make_mapping('m1', 'c1', 'x')}, + 'removed': {'m2': _make_mapping('m2', 'c2', 'y')}, + 'changed_minor': {'m3': _make_mapping('m3', 'c3', 'z')}, + } + ) + md = ChangelogMarkdownGenerator(data).generate() + mappings_line = [l for l in md.splitlines() if l.startswith('| Mappings |')][0] + # Added=1, Removed=1, Changed=1 + self.assertIn('| 1 |', mappings_line) + + def test_overview_counts_embedded_mappings(self): + data = _make_data( + concepts={ + 'new': { + 'c1': { + 'id': 'c1', + 'display_name': 'New', + 'mappings': { + 'new': [ + {'id': 'm1', 'to_concept': 'x', 'to_source': None, 'map_type': 'SAME-AS'}, + ], + }, + }, + }, + 'changed_major': { + 'c2': { + 'id': 'c2', + 'display_name': 'Major', + 'mappings': { + 'new': [ + {'id': 'm2', 'to_concept': 'y', 'to_source': None, 'map_type': 'SAME-AS'}, + ], + }, + }, + }, + }, + ) + md = ChangelogMarkdownGenerator(data).generate() + mappings_line = [l for l in md.splitlines() if l.startswith('| Mappings |')][0] + self.assertIn('| 2 | 0 | 0 |', mappings_line) + + class TestChangelogMarkdownGeneratorTOC(SimpleTestCase): + def test_toc_omitted_without_following_sections(self): + data = _make_data() + md = ChangelogMarkdownGenerator(data).generate() + self.assertNotIn('## Contents', md) + def test_toc_shows_only_present_sections(self): data = _make_data( concepts={ 'new': {'c1': {'id': 'c1', 'display_name': 'New concept'}}, }, mappings={ - 'new': {'m1': {'id': 'm1', 'from_concept': 'c1', 'to_concept': 'x', 'to_source': None, 'map_type': 'SAME-AS'}}, + 'new': {'m1': _make_mapping('m1', 'c1', 'x')}, } ) md = ChangelogMarkdownGenerator(data).generate() @@ -115,6 +252,108 @@ def test_toc_shows_only_present_sections(self): self.assertNotIn('[Descriptions]', md) self.assertNotIn('[Translations]', md) + def test_toc_excludes_sections_before_contents(self): + data = _make_data( + concepts={'new': {'c1': {'id': 'c1', 'display_name': 'A'}}}, + mappings={ + 'new': { + 'm1': { + 'id': 'm1', + 'from_concept': 'c1', + 'to_concept': 'x', + 'to_source': None, + 'map_type': 'SAME-AS', + } + } + }, + ) + md = ChangelogMarkdownGenerator(data).generate() + toc_block = md[md.index('## Contents'):md.index('## Concepts')] + self.assertNotIn('Changelog](#', toc_block) + self.assertNotIn('[Overview]', toc_block) + self.assertNotIn('[Summary]', toc_block) + self.assertNotIn('[Contents]', toc_block) + self.assertIn('- [Concepts](#concepts)', toc_block) + self.assertIn('- [Mappings](#mappings)', toc_block) + + def test_toc_lists_concept_subsections(self): + data = _make_data( + concepts={ + 'new': {'c1': {'id': 'c1', 'display_name': 'A'}}, + 'changed_retired': {'c2': {'id': 'c2', 'display_name': 'B'}}, + 'changed_major': {'c3': {'id': 'c3', 'display_name': 'C'}}, + } + ) + md = ChangelogMarkdownGenerator(data).generate() + # Top-level entry points to #concepts; subitems use section-prefixed anchors + self.assertIn('- [Concepts](#concepts)', md) + self.assertIn(' - [Added](#concepts-added)', md) + self.assertIn(' - [Retired](#concepts-retired)', md) + self.assertIn(' - [Updated (Major)](#concepts-updated-major)', md) + # 'Removed' and 'Updated (Minor)' are absent in the data → absent from TOC + self.assertNotIn('[Removed](#concepts-removed)', md) + self.assertNotIn('[Updated (Minor)]', md) + + def test_toc_lists_mapping_subsections(self): + data = _make_data(mappings={ + 'new': {'m1': _make_mapping('m1', 'c1', 'x')}, + 'changed_minor': {'m2': _make_mapping('m2', 'c2', 'y')}, + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('- [Mappings](#mappings)', md) + self.assertIn(' - [Added](#mappings-added)', md) + self.assertIn(' - [Updated](#mappings-updated)', md) + self.assertNotIn('[Removed](#mappings-removed)', md) + + def test_toc_lists_embedded_mapping_subsections(self): + data = _make_data(concepts={ + 'changed_major': { + 'c1': { + 'id': 'c1', + 'display_name': 'Major', + 'mappings': { + 'new': [ + {'id': 'm1', 'to_concept': 'x', 'to_source': None, 'map_type': 'SAME-AS'}, + ], + }, + }, + }, + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('- [Mappings](#mappings)', md) + self.assertIn(' - [Added](#mappings-added)', md) + + def test_subsection_anchors_emitted_in_body(self): + data = _make_data( + concepts={'new': {'c1': {'id': 'c1', 'display_name': 'A'}}}, + mappings={'new': {'m1': _make_mapping('m1', 'c1', 'x')}}, + ) + md = ChangelogMarkdownGenerator(data).generate() + # Each subsection TOC link must resolve to an anchor in the body + self.assertIn('', md) + self.assertIn('', md) + + def test_toc_lists_name_subsections_when_enriched(self): + data = _make_data(concepts={ + 'new': {'c1': { + 'id': 'c1', 'display_name': 'New', + 'names': [{'name': 'Foo', 'type': 'FULLY_SPECIFIED', 'locale': 'en'}], + 'descriptions': [], + }}, + 'changed_minor': {'c2': { + 'id': 'c2', 'display_name': 'Changed', + 'names': [{'external_id': 'e1', 'name': 'Bar v2', 'type': 'FULLY_SPECIFIED', 'locale': 'en'}], + 'prev_names': [{'external_id': 'e1', 'name': 'Bar v1', 'type': 'FULLY_SPECIFIED', 'locale': 'en'}], + 'descriptions': [], + }}, + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('- [Names](#names)', md) + self.assertIn(' - [Added](#names-added)', md) + self.assertIn(' - [Updated](#names-updated)', md) + self.assertIn('', md) + self.assertIn('', md) + class TestChangelogMarkdownGeneratorConceptsSection(SimpleTestCase): def test_concepts_added_table(self): @@ -244,8 +483,18 @@ def test_translations_section_present(self): 'id': 'c1', 'display_name': 'New', 'names': [ - {'name': 'English name', 'type': 'FULLY_SPECIFIED', 'locale': 'en', 'locale_preferred': True}, - {'name': 'Nome em português', 'type': 'FULLY_SPECIFIED', 'locale': 'pt', 'locale_preferred': False}, + { + 'name': 'English name', + 'type': 'FULLY_SPECIFIED', + 'locale': 'en', + 'locale_preferred': True, + }, + { + 'name': 'Nome em português', + 'type': 'FULLY_SPECIFIED', + 'locale': 'pt', + 'locale_preferred': False, + }, ], 'descriptions': [], } @@ -298,6 +547,54 @@ def test_mappings_section_omitted_if_empty(self): md = ChangelogMarkdownGenerator(data).generate() self.assertNotIn('## Mappings', md) + def test_mappings_updated_table_shows_prev_fields(self): + data = _make_data(mappings={ + 'changed_major': { + 'm99': { + 'id': 'm99', + 'external_id': '250260ABBBBBBBBBBBBBBBBBBBBBBBBBBBBB', + 'from_concept': 'c10', + 'from_source': None, + 'to_concept': '719709', + 'to_source': 'IMO', + 'map_type': 'SAME-AS', + 'prev_to_concept': '719700', + 'prev_to_source': 'IMO', + 'prev_map_type': 'NARROWER-THAN', + } + } + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('### Updated', md) + # Previous and current values both appear + self.assertIn('719700', md) + self.assertIn('719709', md) + self.assertIn('NARROWER-THAN', md) + self.assertIn('SAME-AS', md) + # Column headers indicate before/after + self.assertIn('Previous To Concept', md) + self.assertIn('Updated To Concept', md) + self.assertIn('Previous Map Type', md) + self.assertIn('Updated Map Type', md) + + def test_mappings_updated_without_prev_falls_back_to_current(self): + # Legacy data without prev_* fields (verbosity<4) still renders gracefully + data = _make_data(mappings={ + 'changed_minor': { + 'm1': { + 'id': 'm1', + 'from_concept': 'c1', + 'to_concept': 'xyz', + 'to_source': None, + 'map_type': 'SAME-AS', + } + } + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('### Updated', md) + self.assertIn('xyz', md) + self.assertIn('SAME-AS', md) + def test_changed_mappings_only_included(self): data = _make_data(concepts={ 'changed_mappings_only': { @@ -322,6 +619,53 @@ def test_changed_mappings_only_included(self): md = ChangelogMarkdownGenerator(data).generate() self.assertIn('## Mappings', md) + def test_embedded_mappings_from_changed_major_are_rendered(self): + data = _make_data(concepts={ + 'changed_major': { + '170670': { + 'id': '170670', + 'display_name': 'Dolutegravir / emtricitabine / tenofovir alafenamide', + 'names': [], + 'prev_names': [], + 'descriptions': [], + 'prev_descriptions': [], + 'mappings': { + 'new': [ + { + 'id': '17333738', + 'to_concept': '714767001', + 'to_source': '/orgs/IHTSDO/sources/SNOMED-CT/', + 'map_type': 'NARROWER-THAN', + }, + ], + }, + }, + }, + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('## Mappings', md) + self.assertIn('[#170670]', md) + self.assertIn('714767001', md) + self.assertIn('NARROWER-THAN', md) + + def test_embedded_mapping_lists_do_not_invent_numeric_ids(self): + data = _make_data(concepts={ + 'changed_mappings_only': { + 'c1': { + 'id': 'c1', + 'display_name': 'Concept 1', + 'mappings': { + 'new': [ + {'to_concept': 'x', 'to_source': None, 'map_type': 'SAME-AS'}, + {'to_concept': 'y', 'to_source': None, 'map_type': 'SAME-AS'}, + ], + }, + }, + }, + }) + added, _, _ = ChangelogMarkdownGenerator(data)._mapping_collections() + self.assertNotIn(1, added) + class TestChangelogMarkdownGeneratorStaticHighlight(SimpleTestCase): def test_additions_only(self): @@ -346,6 +690,95 @@ def test_singular_forms(self): self.assertNotIn('removals', result) +class TestChangelogMarkdownGeneratorEnrichmentDetection(SimpleTestCase): + def test_not_enriched_when_no_names_or_prev(self): + data = _make_data(concepts={ + 'changed_major': {'c1': {'id': 'c1', 'display_name': 'A'}}, + 'changed_minor': {'c2': {'id': 'c2', 'display_name': 'B'}}, + }) + gen = ChangelogMarkdownGenerator(data) + self.assertFalse(gen.is_enriched) + + def test_enriched_when_names_present(self): + data = _make_data(concepts={ + 'changed_major': { + 'c1': { + 'id': 'c1', 'display_name': 'A', + 'names': [{'name': 'Foo', 'type': 'FULLY_SPECIFIED', 'locale': 'en'}], + 'prev_names': [], + }, + }, + }) + self.assertTrue(ChangelogMarkdownGenerator(data).is_enriched) + + def test_enriched_when_mapping_has_external_id(self): + data = _make_data(mappings={ + 'new': {'m1': { + 'id': 'm1', 'from_concept': 'c1', 'to_concept': 'x', 'to_source': None, + 'map_type': 'SAME-AS', 'external_id': 'abc-123', + }}, + }) + self.assertTrue(ChangelogMarkdownGenerator(data).is_enriched) + + def test_enriched_when_embedded_mapping_has_prev_fields(self): + data = _make_data(concepts={ + 'changed_mappings_only': { + 'c1': { + 'id': 'c1', + 'display_name': 'Concept 1', + 'mappings': { + 'changed_minor': [ + { + 'id': 'm1', + 'to_concept': 'new', + 'prev_to_concept': 'old', + 'map_type': 'SAME-AS', + }, + ], + }, + }, + }, + }) + self.assertTrue(ChangelogMarkdownGenerator(data).is_enriched) + + def test_notice_banner_present_only_when_not_enriched(self): + non_enriched = _make_data(concepts={ + 'changed_major': {'c1': {'id': 'c1', 'display_name': 'A'}}, + }) + self.assertIn('without enrichment', ChangelogMarkdownGenerator(non_enriched).generate()) + + enriched = _make_data(concepts={ + 'changed_major': {'c1': { + 'id': 'c1', 'display_name': 'A', + 'names': [{'name': 'Foo', 'type': 'FULLY_SPECIFIED', 'locale': 'en'}], + 'prev_names': [], + }}, + }) + self.assertNotIn('without enrichment', ChangelogMarkdownGenerator(enriched).generate()) + + def test_changed_concepts_still_rendered_without_enrichment(self): + # Key guarantee: non-enriched input must not produce an empty "Updated" section. + data = _make_data(concepts={ + 'changed_major': { + 'c1': {'id': 'c1', 'display_name': 'Concept 1'}, + 'c2': {'id': 'c2', 'display_name': 'Concept 2'}, + }, + 'changed_minor': { + 'c3': {'id': 'c3', 'display_name': 'Concept 3'}, + }, + }) + md = ChangelogMarkdownGenerator(data).generate() + self.assertIn('### Updated (Major)', md) + self.assertIn('### Updated (Minor)', md) + self.assertIn('#c1', md) + self.assertIn('#c2', md) + self.assertIn('#c3', md) + # Without enrichment, the concepts table must not have a "Changed" column. + # The Overview table does have a "Changed" header, so we check specifically + # for the concept-table header pattern (which includes "Concept ID"). + self.assertNotIn('| Concept ID | Display Name | Concept Class | Changed |', md) + + class TestChangelogMarkdownGeneratorHelpers(SimpleTestCase): def test_extract_source_prefix(self): gen = ChangelogMarkdownGenerator.__new__(ChangelogMarkdownGenerator) From 4f9cc41f53c36f85ef25e896e61eb6527202854c Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Thu, 23 Apr 2026 12:07:34 -0300 Subject: [PATCH 3/4] fix(core): gate changelog enrichment by verbosity * Gate enriched concept and mapping details to verbosity >= 4 in checksum changelog generation * Add integration tests covering JSON and markdown output across verbosity levels --- changelog.md | 2091 +++++++++++++++++++++++ core/common/checksums.py | 16 +- core/integration_tests/tests_sources.py | 173 +- docker-compose.override.yml.bak | 7 - 4 files changed, 2271 insertions(+), 16 deletions(-) create mode 100644 changelog.md diff --git a/changelog.md b/changelog.md new file mode 100644 index 00000000..84a9b8be --- /dev/null +++ b/changelog.md @@ -0,0 +1,2091 @@ +##### 2.3.141 - Fri Oct 11 06:55:38 2024 +0000 +- Reverting local changes +- Feedback | fixing sorting +##### 2.3.140 - Fri Oct 11 04:36:11 2024 +0000 +- Importers | Test for partial concept (extras) update +##### 2.3.139 - Fri Oct 11 02:40:19 2024 +0000 +- Errbit | fixing clone mapping +##### 2.3.138 - Tue Oct 8 02:42:26 2024 +0000 +- Bug | Repo new version to also update children counts +##### 2.3.137 - Mon Oct 7 01:54:54 2024 +0000 +- [OpenConceptLab/ocl_issues#1936](https://github.com/OpenConceptLab/ocl_issues/issues/1936) | Adding more things to Collection brief serializer +- [OpenConceptLab/ocl_issues#1936](https://github.com/OpenConceptLab/ocl_issues/issues/1936) | Added OCL Joined and Org Joined events | management task to run on bootup to seed missed events +- [OpenConceptLab/ocl_issues#1776](https://github.com/OpenConceptLab/ocl_issues/issues/1776) | fixing tests +- [OpenConceptLab/ocl_issues#1776](https://github.com/OpenConceptLab/ocl_issues/issues/1776) | adding entity's description to events responses +##### 2.3.136 - Mon Sep 30 06:34:22 2024 +0000 +- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | fixing typo +##### 2.3.135 - Mon Sep 30 05:19:30 2024 +0000 +- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | env var for username to get highlighted events from +##### 2.3.134 - Fri Sep 27 07:50:34 2024 +0000 +- [OpenConceptLab/ocl_issues#1921](https://github.com/OpenConceptLab/ocl_issues/issues/1921) | OpenMRS custom validation schema | excluding empty name type +- Revert "OpenConceptLab/ocl_issues#1921 | OpenMRS custom validation schema | excluding Synonyms in uniq check" +- [OpenConceptLab/ocl_issues#1921](https://github.com/OpenConceptLab/ocl_issues/issues/1921) | OpenMRS custom validation schema | excluding Synonyms in uniq check +##### 2.3.133 - Thu Sep 26 07:56:40 2024 +0000 +- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | Guest Events API to redirect to user's events API if requested by authenticated user +- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | Guest events are admin/superuser's non-user following's create/release/follow events +- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | fixing pylint and tests +- [OpenConceptLab/ocl_issues#1861](https://github.com/OpenConceptLab/ocl_issues/issues/1861) | Anonymouse user events API | Repo version release event +##### 2.3.132 - Thu Sep 19 04:21:01 2024 +0000 +- Fixing typo and removing print +- [OpenConceptLab/ocl_issues#1791](https://github.com/OpenConceptLab/ocl_issues/issues/1791) Fix listing dependencies in progress +- [OpenConceptLab/ocl_issues#1922](https://github.com/OpenConceptLab/ocl_issues/issues/1922) Fix overwriting ConceptMap version, OpenConceptLab/ocl_issues#1917 Add S3 storage support +- [OpenConceptLab/ocl_issues#1917](https://github.com/OpenConceptLab/ocl_issues/issues/1917) Add S3 storage support for new bulk import +- [OpenConceptLab/ocl_issues#1862](https://github.com/OpenConceptLab/ocl_issues/issues/1862) | User events API with different scopes +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing followers in user details view +##### 2.3.131 - Wed Sep 4 02:54:19 2024 +0000 +- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | fixing tests | mocking indexing job +- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | fixing tests | mocking indexing job +- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | new version for collection to mantain tasks +- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | refactoring seed new version task +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing pylint error +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | User events vs org events criteria | org events includes where org is object or referenced object +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | Follow model type +##### 2.3.130 - Fri Aug 30 06:40:57 2024 +0000 +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | can follow any entity +- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | source version different states/tasks +- [OpenConceptLab/ocl_issues#1884](https://github.com/OpenConceptLab/ocl_issues/issues/1884) | released source version creation indexing refactoring +- [OpenConceptLab/ocl_issues#1791](https://github.com/OpenConceptLab/ocl_issues/issues/1791) Fixing paths for NPM support +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | Event | saving referenced object in case it gets deleted +##### 2.3.129 - Wed Aug 21 03:38:06 2024 +0000 +- Org delete | fixing test for sync delete S3 files +- Org delete from importer to delete repos cached imports in sync +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing test +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | events for different actions +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | events creation on source/org create and user follow/unfollow and obj representation +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing pylint errors +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | events model and API +- bundles.__init__.py | added VERSION +- [OpenConceptLab/ocl_issues#1791](https://github.com/OpenConceptLab/ocl_issues/issues/1791) Adding forgotten file +- [OpenConceptLab/ocl_issues#1791](https://github.com/OpenConceptLab/ocl_issues/issues/1791) Add support for importing NPM packages +##### 2.3.128 - Thu Aug 8 03:50:51 2024 +0000 +- [OpenConceptLab/ocl_issues#1912](https://github.com/OpenConceptLab/ocl_issues/issues/1912) | renamed detailed_summary to message | only json result +- Pointing to specific ocldev release +##### 2.3.127 - Wed Aug 7 05:38:05 2024 +0000 +- [OpenConceptLab/ocl_issues#1912](https://github.com/OpenConceptLab/ocl_issues/issues/1912) | Import result | responding with json/report/summary result | correcting serialization +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing pylint +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | fixing pylint +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | API for user unfollow +- [OpenConceptLab/ocl_issues#1780](https://github.com/OpenConceptLab/ocl_issues/issues/1780) | APIs for user followers/following +##### 2.3.126 - Mon Aug 5 04:35:21 2024 +0000 +- Test for importing existing mapping to mark it retired +##### 2.3.125 - Thu Aug 1 03:35:23 2024 +0000 +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing tests +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | removed dead test +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing pylint +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing pylint +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | using ocldev checksum to generate checksums +- Update README.md (#733) +- removed unused import +- [OpenConceptLab/ocl_issues#1907](https://github.com/OpenConceptLab/ocl_issues/issues/1907) | importer | reference delete with strict check +- Repo summary view | Reusing mixins | removed unused base class +- [OpenConceptLab/ocl_issues#1907](https://github.com/OpenConceptLab/ocl_issues/issues/1907) | fixing tests +- [OpenConceptLab/ocl_issues#1907](https://github.com/OpenConceptLab/ocl_issues/issues/1907) | importer | reference delete +##### 2.3.124 - Fri Jul 26 03:14:15 2024 +0000 +- [OpenConceptLab/ocl_issues#1617](https://github.com/OpenConceptLab/ocl_issues/issues/1617) | added bio field on user +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | removed redundant python script +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | Checksum | ignoring locale_preferred=false, name_type/description_type empty +##### 2.3.123 - Fri Jul 19 04:18:14 2024 +0000 +- Collection references put | list request +##### 2.3.122 - Wed Jul 17 06:25:10 2024 +0000 +- Search criteria to apply leading wildcard for code fields +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | JS checksum generate | correcting sorting and encoding to match with python +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | checksum to conder locale's external_id +##### 2.3.121 - Mon Jul 15 02:14:16 2024 +0000 +- fix: update ES_ENABLE_SNIFFING environment variable (#732) +- chore: add elastic search sniffing configuration option setting. (#731) +##### 2.3.120 - Wed Jul 10 10:12:20 2024 +0000 +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing test +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | consider external_id from locale for checksum | remove empty object values from checksums | remove empty hierarchy from checksum +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | cleanup fields to treat float and int same if there is no decimal value +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | mapping sort weight to float for checksum generation +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | mapping sort weight to float for checksum generation +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | printing fields used for checksum +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing test +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | script to generate concept/mapping standard/smart checksum +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | script to generate concept/mapping standard/smart checksum +- [OpenConceptLab/ocl_issues#1867](https://github.com/OpenConceptLab/ocl_issues/issues/1867) | fixing typo +##### 2.3.119 - Mon Jul 8 07:03:40 2024 +0000 +- [OpenConceptLab/ocl_issues#1617](https://github.com/OpenConceptLab/ocl_issues/issues/1617) | API to redirect to SSO reset password url +##### 2.3.118 - Wed Jul 3 06:00:38 2024 +0000 +- [OpenConceptLab/ocl_issues#1829](https://github.com/OpenConceptLab/ocl_issues/issues/1829) | fixing pylint +- [OpenConceptLab/ocl_issues#1829](https://github.com/OpenConceptLab/ocl_issues/issues/1829) | Source update to only update is_active and public_access on children if it changed +- [OpenConceptLab/ocl_issues#1829](https://github.com/OpenConceptLab/ocl_issues/issues/1829) | Source update to only update is_active on children if it changed +- [OpenConceptLab/ocl_issues#1829](https://github.com/OpenConceptLab/ocl_issues/issues/1829) | Source update to only update is_active on children if it changed +##### 2.3.117 - Tue Jul 2 10:09:20 2024 +0000 +- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion concept cascade view +##### 2.3.116 - Tue Jul 2 06:23:48 2024 +0000 +- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion concept cascade view | fixing conflict with uri param +- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion concept cascade view | refactoring and merging views +- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion conflicting concepts +- [OpenConceptLab/ocl_issues#1860](https://github.com/OpenConceptLab/ocl_issues/issues/1860) | expansion conflicting concepts resolution using uri param +##### 2.3.115 - Thu Jun 27 03:48:12 2024 +0000 +- Can do OR search for exact match +##### 2.3.114 - Mon Jun 24 04:59:56 2024 +0000 +- Source mappings summary | including self as to/from source +##### 2.3.113 - Mon Jun 24 02:56:14 2024 +0000 +- Source mappings summary | fixing tests +- Source mappings summary | not removing self +- [OpenConceptLab/ocl_issues#1845](https://github.com/OpenConceptLab/ocl_issues/issues/1845) | fixing empty exclude references call +##### 2.3.112 - Mon Jun 17 11:43:43 2024 +0000 +- fixing pylint +- Errbit | handling ValueError in mapping create | to/mapping source set as collection +##### 2.3.111 - Fri Jun 14 08:55:03 2024 +0000 +- [OpenConceptLab/ocl_issues#1850](https://github.com/OpenConceptLab/ocl_issues/issues/1850) | fixing pylint +- [OpenConceptLab/ocl_issues#1850](https://github.com/OpenConceptLab/ocl_issues/issues/1850) | accepting expression in new format without system/valueset | reference can accept extras filters +##### 2.3.110 - Wed Jun 12 09:30:06 2024 +0000 +- [OpenConceptLab/ocl_issues#1849](https://github.com/OpenConceptLab/ocl_issues/issues/1849) | handle too long input for search +##### 2.3.109 - Mon Jun 10 09:40:38 2024 +0000 +- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | | expanding verbosity levels +##### 2.3.108 - Mon Jun 10 08:22:30 2024 +0000 +- FHIR Errbit | unsupported query param to return http400 exception +##### 2.3.107 - Mon Jun 10 04:07:23 2024 +0000 +- Errbit | CodeSystem List | text field serialization fix +- Errbit | ConceptMap List | mappings without from/to-source-url fix +##### 2.3.106 - Mon Jun 3 11:24:21 2024 +0000 +- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | / | version1 is older and vesion2 is newer +- Importer | save summary with more details +##### 2.3.105 - Thu May 30 02:35:19 2024 +0000 +- [OpenConceptLab/ocl_issues#1842](https://github.com/OpenConceptLab/ocl_issues/issues/1842) | root view | correcting FHIR URLs +##### 2.3.104 - Tue May 28 12:04:18 2024 +0000 +- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | generate checksums for latest concept/mapping versions of repo +##### 2.3.103 - Tue May 28 10:42:44 2024 +0000 +- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | fixing checksum check and tests +- [OpenConceptLab/ocl_issues#1844](https://github.com/OpenConceptLab/ocl_issues/issues/1844) | checksums comprison to prevent duplicate version creation fix +- Import json result handling parse exception +##### 2.3.102 - Tue May 21 12:08:05 2024 +0000 +- [OpenConceptLab/ocl_issues#1839](https://github.com/OpenConceptLab/ocl_issues/issues/1839) Add code searchParam for CodeSystem (fix) +- [OpenConceptLab/ocl_issues#1839](https://github.com/OpenConceptLab/ocl_issues/issues/1839) Add code searchParam for CodeSystem +##### 2.3.101 - Tue May 21 08:09:54 2024 +0000 +- Errbit | CodeSystem serializer text field | literal eval try catch +- [OpenConceptLab/ocl_issues#1841](https://github.com/OpenConceptLab/ocl_issues/issues/1841) | not using any pattern for kwargs in url | repo version can accept special characters | uri will be encoded +##### 2.3.100 - Mon May 20 10:38:46 2024 +0000 +- Code System validateCode | fixing errbit +- [OpenConceptLab/ocl_issues#1840](https://github.com/OpenConceptLab/ocl_issues/issues/1840) CodeSystem listing should include total +- [OpenConceptLab/ocl_issues#1833](https://github.com/OpenConceptLab/ocl_issues/issues/1833) Fix import read timeout +##### 2.3.99 - Thu May 16 11:10:58 2024 +0000 +- [OpenConceptLab/ocl_issues#1833](https://github.com/OpenConceptLab/ocl_issues/issues/1833) 502 Bad Gateway for Large CodeSystem resources +- Increase gunicorn request timeout (fix) +- Increase gunicorn request timeout +##### 2.3.98 - Thu May 16 02:57:00 2024 +0000 +Wed Mar 6 07:57:03 2024 +0530 +Mon Dec 11 15:18:33 2023 +0530 +Wed Aug 2 08:28:38 2023 +0530 +- monthly resource report can accept an email +- [OpenConceptLab/ocl_issues#1237](https://github.com/OpenConceptLab/ocl_issues/issues/1237) FHIR Capability Statement +##### 2.3.97 - Wed May 15 14:28:23 2024 +0000 +- [OpenConceptLab/ocl_issues#1237](https://github.com/OpenConceptLab/ocl_issues/issues/1237) FHIR Capability Statement +- [OpenConceptLab/ocl_issues#1833](https://github.com/OpenConceptLab/ocl_issues/issues/1833) | refactoring code system create with concepts to do indexing async +- Removed checksums toggle +- Removed print +- [OpenConceptLab/ocl_issues#1834](https://github.com/OpenConceptLab/ocl_issues/issues/1834) | Collection Reference filter 'property' to accept any value | reference evaluation to ignore random values +- [OpenConceptLab/ocl_issues#1836](https://github.com/OpenConceptLab/ocl_issues/issues/1836) FHIR ConceptMap fails to import due to 'null' map_type +- [OpenConceptLab/ocl_issues#1834](https://github.com/OpenConceptLab/ocl_issues/issues/1834) | Test for Valueset with just system and no filter in include +##### 2.3.96 - Fri May 10 02:30:00 2024 +0000 +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing typo +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing typo +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | task list view cannot return result +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | task result needs to be JSON +##### 2.3.95 - Thu May 9 02:44:18 2024 +0000 +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing pylint +- [OpenConceptLab/ocl_issues#1815](https://github.com/OpenConceptLab/ocl_issues/issues/1815) | added missed migration +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | using operations | refactoring and added tests +##### 2.3.94 - Mon May 6 04:04:01 2024 +0000 +Wed Mar 6 07:57:03 2024 +0530 +Mon Dec 11 15:18:33 2023 +0530 +Wed Aug 2 08:28:38 2023 +0530 +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing typo +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | making it async +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | updated result keys and added diff with verbosity +- Refactoring method names +- [OpenConceptLab/ocl_issues#1815](https://github.com/OpenConceptLab/ocl_issues/issues/1815) FHIR CodeSystem Fixes +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | fixing duplicates +##### 2.3.93 - Fri May 3 10:56:48 2024 +0000 +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | fixing pylint +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog | using smart changed before changed +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing task get view +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | checksum save should not trigger indexing +##### 2.3.92 - Thu May 2 11:46:11 2024 +0000 +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing pylint +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | fixing typo +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | added task result serializer +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | moving changelog/diff to async task +- [OpenConceptLab/ocl_issues#1761](https://github.com/OpenConceptLab/ocl_issues/issues/1761) | fixing middleware and pylint +- [OpenConceptLab/ocl_issues#1825](https://github.com/OpenConceptLab/ocl_issues/issues/1825) | fixing tests +- [OpenConceptLab/ocl_issues#1825](https://github.com/OpenConceptLab/ocl_issues/issues/1825) | fixing pylint +- [OpenConceptLab/ocl_issues#1825](https://github.com/OpenConceptLab/ocl_issues/issues/1825) | reference errors are more description with conflicting concept/name/reference +- [OpenConceptLab/ocl_issues#1761](https://github.com/OpenConceptLab/ocl_issues/issues/1761) Add FHIR xml support +- Fixing sort without search +##### 2.3.91 - Tue Apr 30 04:08:33 2024 +0000 +- sort with search should work +##### 2.3.90 - Mon Apr 29 05:39:07 2024 +0000 +Wed Mar 6 07:57:03 2024 +0530 +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing pylint +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | celery tasks cleanup job to remove any task older than 7 days +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | celery tasks to not store args and store result as str and not json +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog to reflect correct mappings in concepts +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog to reflect concepts with only mappings changes +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | changelog of two source versions +##### 2.3.89 - Wed Apr 24 05:37:40 2024 +0000 +Wed Mar 6 07:57:03 2024 +0530 +Mon Dec 11 15:18:33 2023 +0530 +Wed Aug 2 08:28:38 2023 +0530 +- [OpenConceptLab/ocl_issues#1824](https://github.com/OpenConceptLab/ocl_issues/issues/1824) | Reference transform extensional +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing pylint +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | added task post run signal to close db connections +##### 2.3.88 - Tue Apr 23 02:59:09 2024 +0000 +Wed Mar 6 07:57:03 2024 +0530 +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | using SHA-256 to fix the queue for same user and import queue +##### 2.3.87 - Thu Apr 4 05:42:46 2024 +0000 +Wed Mar 6 07:57:03 2024 +0530 +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing queue filtering +- Source/Collection | search by full_name and correcting other attributes +- Upgrading to django 4.2.11 +##### 2.3.86 - Wed Apr 3 06:48:06 2024 +0000 +Wed Mar 6 07:57:03 2024 +0530 +- Merge branch 'dev' +- [OpenConceptLab/ocl_issues#1817](https://github.com/OpenConceptLab/ocl_issues/issues/1817) | fixing pylint +- [OpenConceptLab/ocl_issues#1817](https://github.com/OpenConceptLab/ocl_issues/issues/1817) | fixing test +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | seralizing results of task +- [OpenConceptLab/ocl_issues#1742](https://github.com/OpenConceptLab/ocl_issues/issues/1742) | resolve to return source/collection response for HEAD version +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | removed unused flower task serializer +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | task response should reflect user submitted queue and not actual queue +- Revert "OpenConceptLab/ocl_issues#1777 | queue should be saved as user submitted" +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | queue should be saved as user submitted +- [OpenConceptLab/ocl_issues#1779](https://github.com/OpenConceptLab/ocl_issues/issues/1779) | streamed response should not have content-length header +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | queue should not override +- [OpenConceptLab/ocl_issues#1779](https://github.com/OpenConceptLab/ocl_issues/issues/1779) | export stream response to have content length header +- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | removed print | pylint fix +- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | batch delete to not use paginator/iterator +- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | using paginator in place of iterator (#645) +- dropping coverage to 91 +- No coverage for azure +- [OpenConceptLab/ocl_issues#1779](https://github.com/OpenConceptLab/ocl_issues/issues/1779) | exports download via streaming +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | after_return to handle exception | added try catch in indexing +- [OpenConceptLab/ocl_issues#1753](https://github.com/OpenConceptLab/ocl_issues/issues/1753) | added mappings in repo version diff with verbosity levels | admin API to calculate checksums of repo resources +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | settting task state before start +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing tests +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing tests +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | children tasks to be uniq +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | fixing get task | added task which is same as id +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | setting finished_at on success +- fixing tests | merge conflicts +- duplicate method | merge conflicts +- [OpenConceptLab/ocl_issues#1777](https://github.com/OpenConceptLab/ocl_issues/issues/1777) | Async Task State Management using Postgres +- fixing test +- fixing test +- Fixing merge conflicts +- Merge branch 'master' into dev +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | mapping serializers | added latest_source_version +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing tests +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | source repo version release/unreleased to reindex resources +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | Mapping search to have latest repo version field +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing tests for default version HEAD when not global search +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | Search to use latest or latest released based on kwargs +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | returning latest_source_version in version detail API +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing facets filters +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing search latest attr +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | Concept search latest repo if search param there | return latest_source_version in list and detail only +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | fixing merge conflicts +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | removed auth group check +- [OpenConceptLab/ocl_issues#1635](https://github.com/OpenConceptLab/ocl_issues/issues/1635) | search with latest released repo version +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | not using atomic migrations | batching inserts/updates +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | using SQL raw queries in migrations +- Merge branch 'master' into dev +- Merge branch 'master' into dev +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | coverage to 92 +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | fixing pylint +- Merge branch 'master' into dev +- Merge remote-tracking branch 'origin/issue_1399' into dev +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | updated coverage to 93 +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | names/descriptions migrations to split names and descriptions +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | login/logout APIs to redirect to keycloak +- OpenMRS mapping validation schema to ignore old retired versions of mappings +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | added empty client id/secret vars +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removed client login/logout redirect URL env vars +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removed client id/secret as env vars +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | added comments +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | added comments +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | correcting readme +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | updated readme for dev setup with keycloak: +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | separating keycloak docker-compose file +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removed dead code +- Merge branch 'master' into dev +- Fixing test | IntegrityError -> ValidationError +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removed unused code +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | OID To Django Token API +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | fixing imports +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | custom auth/auth-backend to switch between django or OIDP | can use valid django token +- Merge branch 'master' into dev +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | API to migrate user from django to SSO +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | removing local client secret +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | logout from OIDP view +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | API to exchange code with OID token +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | settings for login redirect +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | middleware to manage token from session or from headers +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | OIDBackend | update user +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | refactoring and extracting routes +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | pylint fixes +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | Migrate user from django auth to OIDP method +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | user forgot password flow +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | user signup and mark verified views +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | temp enabling oidc endpoints +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | user token view to use auth service +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | auth service to inject django or OID provider auth +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | user instance can figure out OIDC token +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | refactoring views/mixins to have write import order +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | oidc settings and package +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | oidc overriden backend | to create and find user +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | docker-compose | env vars +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | KeyCloak service in docker-compose +##### 2.3.85 - Tue Apr 2 09:24:46 2024 +0000 +- Errbit | handling URI generation for special characters in concept/mapping ID +- Errbit | concept extras list API should raise 404 if concept not found +- Errbit | handling URI generation for special characters in concept/mapping ID +- [OpenConceptLab/ocl_issues#1814](https://github.com/OpenConceptLab/ocl_issues/issues/1814) | separated retired results +##### 2.3.84 - Tue Apr 2 06:13:27 2024 +0000 +- Source compare allowed for logged in users only +##### 2.3.83 - Mon Apr 1 11:21:40 2024 +0000 +- [OpenConceptLab/ocl_issues#1817](https://github.com/OpenConceptLab/ocl_issues/issues/1817) | fixing pylint +- [OpenConceptLab/ocl_issues#1817](https://github.com/OpenConceptLab/ocl_issues/issues/1817) | fixing test +- [OpenConceptLab/ocl_issues#1742](https://github.com/OpenConceptLab/ocl_issues/issues/1742) | fixing pylint +- [OpenConceptLab/ocl_issues#1742](https://github.com/OpenConceptLab/ocl_issues/issues/1742) | url registry entry lookup to return entry relative URI +##### 2.3.82 - Wed Mar 27 03:32:58 2024 +0000 +- [OpenConceptLab/ocl_issues#1806](https://github.com/OpenConceptLab/ocl_issues/issues/1806) | storing export time in version.extras | excluding extras.__ from checksums +- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | removed print | pylint fix +- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | batch delete to not use paginator/iterator +- [OpenConceptLab/ocl_issues#1819](https://github.com/OpenConceptLab/ocl_issues/issues/1819) | using paginator in place of iterator (#645) +- Story-OpenConceptLab/ocl_issues#1816 | URL Registry | search and facets +##### 2.3.81 - Tue Mar 26 06:56:18 2024 +0000 +- [OpenConceptLab/ocl_issues#1816](https://github.com/OpenConceptLab/ocl_issues/issues/1816) | resolve to use lookup | lookup to handle version +- [OpenConceptLab/ocl_issues#1816](https://github.com/OpenConceptLab/ocl_issues/issues/1816) | url registry entry to cache resolved repo | repo save to update entries +##### 2.3.80 - Wed Mar 20 06:12:17 2024 +0000 +- [OpenConceptLab/ocl_issues#1753](https://github.com/OpenConceptLab/ocl_issues/issues/1753) | updated response structure +##### 2.3.79 - Mon Mar 18 11:02:43 2024 +0000 +Wed Mar 6 07:57:03 2024 +0530 +Mon Dec 11 15:18:33 2023 +0530 +- [OpenConceptLab/ocl_issues#1753](https://github.com/OpenConceptLab/ocl_issues/issues/1753) | find total of resources cheaper way +- [OpenConceptLab/ocl_issues#1753](https://github.com/OpenConceptLab/ocl_issues/issues/1753) | added mappings in repo version diff with verbosity levels | admin API to calculate checksums of repo resources +##### 2.3.78 - Mon Mar 18 03:20:51 2024 +0000 +- [OpenConceptLab/ocl_issues#1809](https://github.com/OpenConceptLab/ocl_issues/issues/1809) | Mapping | added more fields to standard checksum +- [OpenConceptLab/ocl_issues#1775](https://github.com/OpenConceptLab/ocl_issues/issues/1775) | User detail serializers can include pins +- Enabling match search on users/orgs username/mnemonic attrs +- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | returning 208 when concept/mapping update is unchanged +##### 2.3.77 - Tue Mar 12 07:22:24 2024 +0000 +- [OpenConceptLab/ocl_issues#1794](https://github.com/OpenConceptLab/ocl_issues/issues/1794) | added external id in match search +##### 2.3.76 - Fri Mar 8 04:58:43 2024 +0000 +- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | fixing cascade queryset for report +- [OpenConceptLab/ocl_issues#1789](https://github.com/OpenConceptLab/ocl_issues/issues/1789) | fixing hyphen search +##### 2.3.75 - Thu Mar 7 04:33:13 2024 +0000 +- [OpenConceptLab/ocl_issues#1788](https://github.com/OpenConceptLab/ocl_issues/issues/1788) | resolveReference operation to return resolved url registry entry relative URI as well +- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | ordering summary in report +- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | added more summaries in monthly usage report +##### 2.3.74 - Wed Mar 6 03:31:07 2024 +0000 +- Merge pull request #644 from OpenConceptLab/contributor_start +- Contribution doc with getting started process +- Collection Reference Delete | Job to readd references to take less +- Collection reference remove timing out +- [OpenConceptLab/ocl_issues#1757](https://github.com/OpenConceptLab/ocl_issues/issues/1757) | added logo_url in users list response | removed redundant condition +- [OpenConceptLab/ocl_issues#1764](https://github.com/OpenConceptLab/ocl_issues/issues/1764) | reference expression cascade within valueset context +- Added 3 map types +- Updated db index for concept/mapping repo resources query +- Collection concepts/mappings view to set instance on request for references +- [OpenConceptLab/ocl_issues#1756](https://github.com/OpenConceptLab/ocl_issues/issues/1756) | added logo url in org list response +- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | fixing sorting +- [OpenConceptLab/ocl_issues#1760](https://github.com/OpenConceptLab/ocl_issues/issues/1760) | fixing monthly report mapping count +- Migrations for indexes +- [OpenConceptLab/ocl_issues#1756](https://github.com/OpenConceptLab/ocl_issues/issues/1756) | user summary to have bookmark count +- Concept/Mapping Indexes for repo version listing +- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | fixing toggles fixtures +- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | concept/mapping new version creation error +- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | concept/mapping new version creation to compare checksum and fail if same +- Errbit | fixing autoexand off collection summary +- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | Concepts/Mappings standard checksums | added external_id, retired and descriptions +- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | refactoring | extracting mapping/concept common method for version creation +- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | refactoring mappings version create method +- [OpenConceptLab/ocl_issues#1746](https://github.com/OpenConceptLab/ocl_issues/issues/1746) | refactoring concepts version create method +- [OpenConceptLab/ocl_issues#1747](https://github.com/OpenConceptLab/ocl_issues/issues/1747) | Mappings to use resolve operations +- Update README.md +- Update README.md +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | added toggle for canonical resolution +- Trying to address verify_certs=False not working +- Follow up to adding ES_VERIFY_CERTS and proper handling of bool +- Add ES_VERIFY_CERTS to support https traffic without configuring certificates +- Merge pull request #643 from OpenConceptLab/issue-1729 +- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | buffered file reading +- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | removed unused package +- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | Azure Blob Storage Class for exports/uploads +- utils | removed unused methods and added missing tests +- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | checksums repo version diff | return new mnemonics +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | removed redundant check +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | refactoring entry and lookup methods +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | raise 404 if owner is provided in request URL but not found +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | lookup operation is not using resolve reference operation +- Adding missing test coverage +- Removed system/admin API to dedupe concept versions +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | resolve reference operation to resolve canonical using new rules of url registry +- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | extract checksums diff class +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry lookup operation | using owner entries or global not both +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry lookup operation | fixing when repo not found +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry lookup operation +- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | source compare is not swagger ready +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry | updated type +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry | search scopes and owner +- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | fixing pylint +- [OpenConceptLab/ocl_issues#1691](https://github.com/OpenConceptLab/ocl_issues/issues/1691) | source version compare API using checksums +- [OpenConceptLab/ocl_issues#1735](https://github.com/OpenConceptLab/ocl_issues/issues/1735) | version exports | fixing test +- [OpenConceptLab/ocl_issues#1735](https://github.com/OpenConceptLab/ocl_issues/issues/1735) | version exports | added time taken +- Turning on checksums toggle on staging/prod +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry | fixing namespace and uniq clauses +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry | fixing namespace and uniq clauses +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | fixing pylint +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | URL registry CRUD +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | fixing uniq check +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | fixing pylint +- Collections | added search meta results +- [OpenConceptLab/ocl_issues#1732](https://github.com/OpenConceptLab/ocl_issues/issues/1732) | Global/Org/User URL Registry List/Search/Create APIs +- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | Refactoring services | creating dir structure +- [OpenConceptLab/ocl_issues#1729](https://github.com/OpenConceptLab/ocl_issues/issues/1729) | refactoring export service to have an interface for other cloud service to implement +- [OpenConceptLab/ocl_issues#1728](https://github.com/OpenConceptLab/ocl_issues/issues/1728) Fixing test +- [OpenConceptLab/ocl_issues#1728](https://github.com/OpenConceptLab/ocl_issues/issues/1728) Support db user, redis and es credentials +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | fixing typo +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | importers | indexing job to take a bigger batch and iterate using iterator +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | importers | indexing current latest and version objects for concept/mapping +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | importers | using pop more +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | ES batch indexes | extract doc +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | DB Indexes for source/collection/mapping/concept for ES indexing +- removed ES strict mapping from concepts/mappings +- [OpenConceptLab/ocl_issues#1720](https://github.com/OpenConceptLab/ocl_issues/issues/1720) | added logs for Openmrs validation schema collection conflicting name +- [OpenConceptLab/ocl_issues#1682](https://github.com/OpenConceptLab/ocl_issues/issues/1682) | Added index +- [OpenConceptLab/ocl_issues#1686](https://github.com/OpenConceptLab/ocl_issues/issues/1686) | Repos facets class +- [OpenConceptLab/ocl_issues#1703](https://github.com/OpenConceptLab/ocl_issues/issues/1703) | removed unused facets +- [OpenConceptLab/ocl_issues#1682](https://github.com/OpenConceptLab/ocl_issues/issues/1682) | Auto assign sort order based on max prev sort order +- [OpenConceptLab/ocl_issues#1713](https://github.com/OpenConceptLab/ocl_issues/issues/1713) Fix reading DB_CURSOR_ON env +- [OpenConceptLab/ocl_issues#1710](https://github.com/OpenConceptLab/ocl_issues/issues/1710) | facets exlusions for global scope +- [OpenConceptLab/ocl_issues#1713](https://github.com/OpenConceptLab/ocl_issues/issues/1713) POST CodeSystem and ValueSet fails due to DB cursor being unsupported +- [OpenConceptLab/ocl_issues#1710](https://github.com/OpenConceptLab/ocl_issues/issues/1710) | facets to not include source versions in global results +- [OpenConceptLab/ocl_issues#1710](https://github.com/OpenConceptLab/ocl_issues/issues/1710) | added swagger header for latest repo search header +- [OpenConceptLab/ocl_issues#1710](https://github.com/OpenConceptLab/ocl_issues/issues/1710) | include latest search by header +- [OpenConceptLab/ocl_issues#937](https://github.com/OpenConceptLab/ocl_issues/issues/937) | updated Readme: +- [OpenConceptLab/ocl_issues#937](https://github.com/OpenConceptLab/ocl_issues/issues/937) | disabling profiler by default in dev env +- [OpenConceptLab/ocl_issues#937](https://github.com/OpenConceptLab/ocl_issues/issues/937) | django-silk profiler +- [OpenConceptLab/ocl_issues#1709](https://github.com/OpenConceptLab/ocl_issues/issues/1709) | fixing pylint +- [OpenConceptLab/ocl_issues#1683](https://github.com/OpenConceptLab/ocl_issues/issues/1683) | Source setting for autoid uuid for locales +- [OpenConceptLab/ocl_issues#1709](https://github.com/OpenConceptLab/ocl_issues/issues/1709) | OpenMRS Validation schema to accept all different forms of index term and short name name types +- Add ability to only clear org +- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Adjusting import script +- [OpenConceptLab/ocl_issues#1702](https://github.com/OpenConceptLab/ocl_issues/issues/1702) | SSO registration url redirect API +- Fixing swagger error +- [OpenConceptLab/ocl_issues#1663](https://github.com/OpenConceptLab/ocl_issues/issues/1663) | fixing test +- [OpenConceptLab/ocl_issues#1663](https://github.com/OpenConceptLab/ocl_issues/issues/1663) | added company and location to user from SSO claims +- API/tasks to remove duplicate versions of concepts | adding logs +- API/tasks to remove duplicate versions of concepts +- Revert "Added default keycloak env var for local" +- Added default keycloak env var for local +- Removed retry policy +- Never retry bulk import tasks +- batch index to have single batch mode for source/collections of an org/user +- fixing tests +- batch index to use iterator in non test mode +- batch index to use iterator on queryset and not limit offset +- [OpenConceptLab/ocl_issues#1701](https://github.com/OpenConceptLab/ocl_issues/issues/1701) | search by canonical url +- [OpenConceptLab/ocl_issues#1686](https://github.com/OpenConceptLab/ocl_issues/issues/1686) | removed unused import +- [OpenConceptLab/ocl_issues#1686](https://github.com/OpenConceptLab/ocl_issues/issues/1686) | user org repo search API +- [OpenConceptLab/ocl_issues#1686](https://github.com/OpenConceptLab/ocl_issues/issues/1686) | Repos search API +- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Fixing tests +- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Implement automated import scripts for FHIR HL7 content +- Root View | URL to have correct HOST scheme +- [OpenConceptLab/ocl_issues#1679](https://github.com/OpenConceptLab/ocl_issues/issues/1679) | removing ref concepts/mappings correctly +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | Adding checksums to bundle response | checksums in all concept/mapping responses +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | added checksums in export +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | reafactoring and adding tests +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | cleaning checksum model methods +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | Adding checksums response headers +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | Adding checksums calculations +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | reverting algo back | added more test +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | standard and smart checksums for orgs and users +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | Checksum Algo | not using sorting in values +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | fixing typo +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | standard and smart checksums should ignore None and retired/is_active when its false +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | standard and smart checksums for source/collections +- [OpenConceptLab/ocl_issues#1674](https://github.com/OpenConceptLab/ocl_issues/issues/1674) | standard and smart checksums for concepts/mappings +- Concepts/Mapping updated by dynamic string mapping for ES +- Concepts/Mapping updated by dynamic string mapping for ES +- [OpenConceptLab/ocl_issues#1675](https://github.com/OpenConceptLab/ocl_issues/issues/1675) | adding verbosity to exception +- Removed data migration for updated by API/tasks +- Revert "OpenConceptLab/ocl_issues#1664 | added logs for concept next valid ID" +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | casting mnemonic to int +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | added logs for concept next valid ID +- pylint | remove unused import +- Fixing batch index processing when filters are None +- Fixing collection/verison hard delete failure | should delete references and expansions first +- [OpenConceptLab/ocl_issues#1672](https://github.com/OpenConceptLab/ocl_issues/issues/1672) | remove duplicate lookup values +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | mapping/concept create to verify parent autoid seq next valiud id +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Mapping initial version to have the right updated_by: +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | clone process to verify auto id seq after excluding non-number IDs +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | clone process to verify auto id for concept/mapping +- [OpenConceptLab/ocl_issues#1670](https://github.com/OpenConceptLab/ocl_issues/issues/1670) | swagger request body for references delete +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | using outer ref for mapping update by update +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | updated lables/notes +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | not using iterator | connection pool doesn't like it. +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | reduced chunk size +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | removed newline +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Updated/Refactored Resources usage report +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | fixing mappings API for concepts +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | ignoring coverage +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring queryset for better lookup +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | renaming var and not indexing +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | using iterator and chunks for migration +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring tasks +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring tasks to be more efficient +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping updated_by migration via API/task +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping migration to update updated by +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping version create should updated updated by on versioned object +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | fixing pylint +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | added updated by in indexes | Repo summary to have contributors | Facets to have updated by filters +- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Implement automated import scripts for FHIR HL7 content +- Merge pull request #581 from IanMinash/codesystemlookup-fix +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | fixing test +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Resource usage reports | updated swagger | can add custom dates +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Resource usage reports | feedbacks and refactoring +- Switch body to OperationOutcome for empty queryset +##### 2.3.50 - Sat Oct 7 00:24:12 2023 +0000 +- Revert "OpenConceptLab/ocl_issues#1664 | added logs for concept next valid ID" +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | casting mnemonic to int +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | added logs for concept next valid ID +- pylint | remove unused import +- Fixing batch index processing when filters are None +- Fixing collection/verison hard delete failure | should delete references and expansions first +- [OpenConceptLab/ocl_issues#1672](https://github.com/OpenConceptLab/ocl_issues/issues/1672) | remove duplicate lookup values +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | mapping/concept create to verify parent autoid seq next valiud id +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Mapping initial version to have the right updated_by: +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | clone process to verify auto id seq after excluding non-number IDs +- [OpenConceptLab/ocl_issues#1664](https://github.com/OpenConceptLab/ocl_issues/issues/1664) | clone process to verify auto id for concept/mapping +- [OpenConceptLab/ocl_issues#1670](https://github.com/OpenConceptLab/ocl_issues/issues/1670) | swagger request body for references delete +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | using outer ref for mapping update by update +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | updated lables/notes +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | not using iterator | connection pool doesn't like it. +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | reduced chunk size +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | removed newline +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Updated/Refactored Resources usage report +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | fixing mappings API for concepts +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | ignoring coverage +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring queryset for better lookup +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | renaming var and not indexing +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | using iterator and chunks for migration +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring tasks +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | refactoring tasks to be more efficient +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping updated_by migration via API/task +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping migration to update updated by +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | Concept/Mapping version create should updated updated by on versioned object +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | fixing pylint +- [OpenConceptLab/ocl_issues#1659](https://github.com/OpenConceptLab/ocl_issues/issues/1659) | added updated by in indexes | Repo summary to have contributors | Facets to have updated by filters +- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Implement automated import scripts for FHIR HL7 content +- Merge pull request #581 from IanMinash/codesystemlookup-fix +- Switch body to OperationOutcome for empty queryset +##### 2.3.49 - Tue Sep 5 07:38:46 2023 +0000 +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | fixing test +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Resource usage reports | updated swagger | can add custom dates +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Resource usage reports | feedbacks and refactoring +##### 2.3.48 - Fri Sep 1 04:01:08 2023 +0000 +- [OpenConceptLab/ocl_issues#1656](https://github.com/OpenConceptLab/ocl_issues/issues/1656) | fixing facets when no search criteria is given +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | correcting name of task +##### 2.3.47 - Wed Aug 30 10:08:57 2023 +0000 +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | correcting concept/mapping retired criteria +##### 2.3.46 - Wed Aug 30 07:25:28 2023 +0000 +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | correcting blank rows | removed duplicates +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | added blank row +##### 2.3.45 - Tue Aug 29 03:42:58 2023 +0000 +- [OpenConceptLab/ocl_issues#1587](https://github.com/OpenConceptLab/ocl_issues/issues/1587) | correcting wildcard +- [OpenConceptLab/ocl_issues#1587](https://github.com/OpenConceptLab/ocl_issues/issues/1587) | fixing pylint +- [OpenConceptLab/ocl_issues#1587](https://github.com/OpenConceptLab/ocl_issues/issues/1587) | must have and must not have with correct operators +/- +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | fixing test +- [OpenConceptLab/ocl_issues#1633](https://github.com/OpenConceptLab/ocl_issues/issues/1633) | Monthly usage report refactoring and using CSV format +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix timeout +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, move retry_policy +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, move socket_timeout_* for result_backend +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, move socket_timeout_ +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, disable broker heartbeat +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix timeouts +- using search queries to get facets +- Removed exact match param from swagger +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix Retry kombu error +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix sentinels list +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, using sentinel_kwargs +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, use merge +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing settings.py +- [OpenConceptLab/ocl_issues#1587](https://github.com/OpenConceptLab/ocl_issues/issues/1587) | must have in search using quotes +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix formatting +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, unify retry policy +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | optimizing/refactoring search queries +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, another attempt at setting timeouts +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept search term/prefix to use keyword name field +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, enable back heartbeat +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing formatting +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing celery_once +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing celery startup +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing celery config +##### 2.3.44 - Wed Aug 23 03:46:34 2023 +0000 +- Fixing celery once config +##### 2.3.43 - Tue Aug 22 12:35:09 2023 +0000 +- [OpenConceptLab/ocl_issues#730](https://github.com/OpenConceptLab/ocl_issues/issues/730) Implement clustering for ES, set retries and sniffing +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, adding cache and celery_once retries +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, adding result backend retries +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, adjusting task publish retries +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, setup timeouts and retries +##### 2.3.42 - Mon Aug 21 06:05:43 2023 +0000 +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept search to use text field name and not keyword field +- Bump gunicorn from 20.1.0 to 21.2.0 (#562) +- Bump factory-boy from 3.2.1 to 3.3.0 (#546) +- Bump pylint from 2.17.4 to 2.17.5 (#560) +- Bump coverage from 7.2.7 to 7.3.0 (#564) +- Bump django-cors-headers from 4.1.0 to 4.2.0 (#547) +- Bump django from 4.2.3 to 4.2.4 (#559) +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, correct location +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, add missing SentinelConnectionFactory +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, attempt to fix RedisService +- Bump markdown from 3.4.3 to 3.4.4 (#556) +- Bump psycopg2 from 2.9.6 to 2.9.7 (#555) +- Bump pydash from 7.0.4 to 7.0.6 (#557) +- Bump mock from 5.0.2 to 5.1.0 (#558) +##### 2.3.41 - Wed Aug 9 03:30:33 2023 +0000 +- [OpenConceptLab/ocl_issues#1646](https://github.com/OpenConceptLab/ocl_issues/issues/1646) | Collection References | ignoring new search parameters +- [OpenConceptLab/ocl_issues#1645](https://github.com/OpenConceptLab/ocl_issues/issues/1645) | Source/Collection | canonical_url is searchable by phrase +- [OpenConceptLab/ocl_issues#1595](https://github.com/OpenConceptLab/ocl_issues/issues/1595) | Removed migrate from old export path to new | remove repo old export path code +- Revert "OpenConceptLab/ocl_issues#1595 | coverage fix" +- Revert "OpenConceptLab/ocl_issues#1595 | collections export migrate" +- Revert "Admin API to dedupe concept/mapping latest-versions" +##### 2.3.40 - Thu Aug 3 02:51:49 2023 +0000 +- ES | returning real exception +- ES | returning real exception +- Added use_ssl and verify certs for https schema for ES connection configuration +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests for fuzzy search on ID +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests for fuzzy search on ID +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests for fuzzy search on ID +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests for fuzzy search on ID +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Fuzzy search is not applied on id and codes +##### 2.3.39 - Sat Jul 29 00:59:32 2023 +0000 +- Admin API to dedupe concept/mapping latest-versions +- Temporarily lower required coverage +- OpenConceptLab/ocl_issues#927 Redis clustering, adding connection pool class +- Increasing test coverage +- [OpenConceptLab/ocl_issues#1410](https://github.com/OpenConceptLab/ocl_issues/issues/1410) Schedule vacuum and analyse DB +- Fixing concept/mapping list queryset +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept Index | synonyms not lowercase +- Merge pull request #545 from Salaton/dynamic_es_scheme +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fix tests +- chore: make scheme configurable for elastic search connection +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing build +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing redis healthcheck +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing formatting +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering, fixing healthcheck +- Upgrading redis and celery to support sentinel +- Adding gevent for celery +- [OpenConceptLab/ocl_issues#1501](https://github.com/OpenConceptLab/ocl_issues/issues/1501) | fixing pylint errors +- Upgrading pyyaml to fix build +- Revert "Revert "OpenConceptLab/ocl_issues#1588 | Can except OCL Source version export for import into same or different owner and as same or different version"" +- Revert "Revert "OpenConceptLab/ocl_issues#1501 | Accepting zip format in importers"" +- Revert "OpenConceptLab/ocl_issues#1501 | Accepting zip format in importers" +- Revert "OpenConceptLab/ocl_issues#1588 | Can except OCL Source version export for import into same or different owner and as same or different version" +- [OpenConceptLab/ocl_issues#1588](https://github.com/OpenConceptLab/ocl_issues/issues/1588) | Can except OCL Source version export for import into same or different owner and as same or different version +- [OpenConceptLab/ocl_issues#1501](https://github.com/OpenConceptLab/ocl_issues/issues/1501) | Accepting zip format in importers +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing pylint +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | concept word match on name keyword field +- [OpenConceptLab/ocl_issues#1595](https://github.com/OpenConceptLab/ocl_issues/issues/1595) | collections export migrate +- [OpenConceptLab/ocl_issues#1595](https://github.com/OpenConceptLab/ocl_issues/issues/1595) | coverage fix +- [OpenConceptLab/ocl_issues#1595](https://github.com/OpenConceptLab/ocl_issues/issues/1595) | Source/Collection version export path and file name to be more user friendly +- Upgrading ES and adding Kibana +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Expansion text paramter and reference expression to use exact match search only +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Expansion text paramter and reference expression to use exact match search only +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Expansion text paramter and reference expression to use exact match search only +- Adding mapping serializer tests +- Refactoring | extracting truthy values +- Mapping serializers | passing context to nested concept serializers +- Fixing formatting +- [OpenConceptLab/ocl_issues#927](https://github.com/OpenConceptLab/ocl_issues/issues/927) Redis clustering +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | indexing API | can pass filters +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | external_id match should be exact (term match) only +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing search serializer and tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | removed duplicate method +##### 2.3.38 - Sat Jul 8 02:57:50 2023 +0000 +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Search updates +- [OpenConceptLab/ocl_issues#1598](https://github.com/OpenConceptLab/ocl_issues/issues/1598) | fixing pylint +- Revert "Bump drf-yasg from 1.21.5 to 1.21.6 (#513)" +- [OpenConceptLab/ocl_issues#1598](https://github.com/OpenConceptLab/ocl_issues/issues/1598) | concept extras keys for source in summary +- Bump tblib from 1.7.0 to 2.0.0 (#516) +- Bump drf-yasg from 1.21.5 to 1.21.6 (#513) +- Bump django from 4.2.2 to 4.2.3 (#528) +##### 2.3.37 - Thu Jun 29 06:05:22 2023 +0000 +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing test +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing test +- [OpenConceptLab/ocl_issues#1471](https://github.com/OpenConceptLab/ocl_issues/issues/1471) | added toggle +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | updated concepts/mappings exact match fields +##### 2.3.36 - Wed Jun 28 14:00:21 2023 +0000 +- [OpenConceptLab/ocl_issues#730](https://github.com/OpenConceptLab/ocl_issues/issues/730) Fix hosts +##### 2.3.35 - Wed Jun 28 13:20:49 2023 +0000 +- Fixing pylint +- [OpenConceptLab/ocl_issues#730](https://github.com/OpenConceptLab/ocl_issues/issues/730) Implement clustering for ES +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing pylint +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing tests +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept searchable through target codes +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | User name is sortable and exact match searchable +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | fixing test +- Revert "Bump celery[redis] from 5.2.7 to 5.3.1 (#511)" +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Concept Search | added highlighting +- [OpenConceptLab/ocl_issues#1583](https://github.com/OpenConceptLab/ocl_issues/issues/1583) | Enhancing search API +- Bump celery[redis] from 5.2.7 to 5.3.1 (#511) +- Bump django-cors-headers from 3.14.0 to 4.1.0 (#514) +- Revert "Bump drf-yasg from 1.21.5 to 1.21.6 (#509)" +- Bump drf-yasg from 1.21.5 to 1.21.6 (#509) +- Bump whitenoise from 6.4.0 to 6.5.0 (#507) +- Bump kombu from 5.3.0 to 5.3.1 (#506) +- Bump coverage from 6.5.0 to 7.2.7 (#486) +- Bump pydash from 7.0.3 to 7.0.4 (#504) +- Bump pylint from 2.17.2 to 2.17.4 (#499) +- Update README.md | added ES indexing commands +- Bump kombu from 5.2.4 to 5.3.0 (#501) +- Bump mock from 5.0.1 to 5.0.2 (#498) +- Bump psycopg2 from 2.9.5 to 2.9.6 (#495) +- Bump django from 4.1.9 to 4.2.2 (#496) +- Bump requests from 2.28.1 to 2.31.0 (#479) +- Bump redis from 4.5.4 to 4.5.5 (#470) +- Bump markdown from 3.4.1 to 3.4.3 (#469) +##### 2.3.34 - Thu Jun 8 08:41:26 2023 +0000 +- [OpenConceptLab/ocl_issues#1591](https://github.com/OpenConceptLab/ocl_issues/issues/1591) | fixing retired + exact match/wildcard search/facets +- [OpenConceptLab/ocl_issues#1593](https://github.com/OpenConceptLab/ocl_issues/issues/1593) | fixing mapping from/to concept code search +##### 2.3.33 - Wed May 24 01:52:16 2023 +0000 +- Refactoring Mapping resolve relations +- [OpenConceptLab/ocl_issues#1561](https://github.com/OpenConceptLab/ocl_issues/issues/1561) | Org delete async by default +- [OpenConceptLab/ocl_issues#1549](https://github.com/OpenConceptLab/ocl_issues/issues/1549) | fixing typo +- [OpenConceptLab/ocl_issues#1584](https://github.com/OpenConceptLab/ocl_issues/issues/1584) | added default/supported-locales in source version verbose summary +- [OpenConceptLab/ocl_issues#1549](https://github.com/OpenConceptLab/ocl_issues/issues/1549) | Source Auto id attributes editable +##### 2.3.32 - Mon May 22 04:14:06 2023 +0000 +- Fixing collections/sources urls for org/users +##### 2.3.31 - Thu May 18 03:13:44 2023 +0000 +- [OpenConceptLab/ocl_issues#1579](https://github.com/OpenConceptLab/ocl_issues/issues/1579) | fixing tests +- [OpenConceptLab/ocl_issues#1579](https://github.com/OpenConceptLab/ocl_issues/issues/1579) | collection/source minimal versions serializers +##### 2.3.30 - Mon May 15 09:03:30 2023 +0000 +- Expansions refactoring | using either expansion system parameter or ref's system, not both +##### 2.3.29 - Sun May 14 15:48:36 2023 +0000 +- Expansions | on new expansion creation re-evaluation references deduping system/valueset versions +##### 2.3.28 - Sun May 14 14:26:04 2023 +0000 +- Expansions | on new expansion creation re-evaluation of all references fixing performance issues +- Expansions | on new expansion creation re-evaluation of all references should cache system version resolves +##### 2.3.27 - Sun May 14 11:52:05 2023 +0000 +- fixing typo +- Adding concepts/mappings to expansion query to load less in memory +- [OpenConceptLab/ocl_issues#1551](https://github.com/OpenConceptLab/ocl_issues/issues/1551) | removed deprecated importers urls from root view +- Logging middleware on top +##### 2.3.26 - Fri May 12 02:17:45 2023 +0000 +- removed unused import +- Errbit | hardcoded user's org uri method +- Bump django-dirtyfields from 1.9.1 to 1.9.2 (#453) +- Bump pydash from 6.0.2 to 7.0.3 (#464) +- Bump django from 4.1.7 to 4.1.9 (#468) +##### 2.3.25 - Tue May 9 13:56:35 2023 +0000 +- Revert "Moving logging middleware on top" +##### 2.3.24 - Tue May 9 13:38:57 2023 +0000 +- Moving logging middleware on top +- Errbit | hardcoded user/org calculate uri method +- [OpenConceptLab/ocl_issues#1561](https://github.com/OpenConceptLab/ocl_issues/issues/1561) | source/collection delete always async and waits for result +##### 2.3.23 - Thu Apr 27 14:00:41 2023 +0000 +- removed overloading of equal and hash +##### 2.3.22 - Thu Apr 27 13:35:39 2023 +0000 +- Source/collection delete | added errbit and more logs +- [OpenConceptLab/ocl_issues#1551](https://github.com/OpenConceptLab/ocl_issues/issues/1551) | Deprecated legacy importers +##### 2.3.21 - Thu Apr 27 03:50:58 2023 +0000 +- Merge branch 'master' of github.com:OpenConceptLab/oclapi2 +- [OpenConceptLab/ocl_issues#1566](https://github.com/OpenConceptLab/ocl_issues/issues/1566) | collection reference cascade to consider more parameters +- Bump django-celery-beat from 2.4.0 to 2.5.0 (#440) +- Bump django-ordered-model from 3.7.1 to 3.7.4 (#441) +- [OpenConceptLab/ocl_issues#1561](https://github.com/OpenConceptLab/ocl_issues/issues/1561) | Collection references add is always async | waiting 15 seconds to finish +##### 2.3.20 - Wed Apr 26 04:01:39 2023 +0000 +- [OpenConceptLab/ocl_issues#1562](https://github.com/OpenConceptLab/ocl_issues/issues/1562) | async references add to not have any cascade limit +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | checksums for source/collection metadata +- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed name from importers +- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed name from concept serializers +- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed name from concept factory +- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed concept unused fields +- [OpenConceptLab/ocl_issues#1564](https://github.com/OpenConceptLab/ocl_issues/issues/1564) | removed concept unused fields +##### 2.3.19 - Tue Apr 25 03:33:40 2023 +0000 +- [OpenConceptLab/ocl_issues#1563](https://github.com/OpenConceptLab/ocl_issues/issues/1563) | cascade and transform | dedupe references +##### 2.3.18 - Tue Apr 25 02:40:29 2023 +0000 +- [OpenConceptLab/ocl_issues#1557](https://github.com/OpenConceptLab/ocl_issues/issues/1557) | fixing export url check +##### 2.3.17 - Tue Apr 25 02:09:08 2023 +0000 +- [OpenConceptLab/ocl_issues#1559](https://github.com/OpenConceptLab/ocl_issues/issues/1559) | Source/Concept create to update mappings attributes asynchronously +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | checksums | updated fields +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | added checksum toggle +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | checksum save to not updated updated_at +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | fixing task +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | computing checksums on association changes +- Upgrade to pylint 2.17.2 +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | concept/mapping checksums to recompute on version creation | locales to return checksum | locales to use name/description_type and not type in checksums +- [OpenConceptLab/ocl_issues#1556](https://github.com/OpenConceptLab/ocl_issues/issues/1556) Fix formatting +- [OpenConceptLab/ocl_issues#1556](https://github.com/OpenConceptLab/ocl_issues/issues/1556) CodeSystem/ returns result if code and system missing +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | checksum algo to return same checksum for array of one element vs element +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | API for operation +- resolve reference operation | correcting url for swagger and added swagger schema +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | fixing typo +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | toggle for checksums +- [OpenConceptLab/ocl_issues#1213](https://github.com/OpenConceptLab/ocl_issues/issues/1213) | Checksums for concept/mapping-versions +- Fixing Source create for supported locales +- Collections Export | fixing export check +##### 2.3.16 - Tue Apr 18 02:45:46 2023 +0000 +- [OpenConceptLab/ocl_issues#1550](https://github.com/OpenConceptLab/ocl_issues/issues/1550) | bulk importer to acknowledge id as optional for Concept | handling auto assign id +##### 2.3.15 - Fri Apr 14 02:35:57 2023 +0000 +- [OpenConceptLab/ocl_issues#1547](https://github.com/OpenConceptLab/ocl_issues/issues/1547) | fixing for non-admin logged in user's concepts/mappings listing showing duplicates +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | putting back mappings/collections uri index +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed concept descriptions indexes +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed datatype indexes +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed concept_class indexes +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed locale indexes +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed public access indexes +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed mnemonic indexes +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed mappings map_type exact match index +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed index from is_latest_version field +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed mapping version field index +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) | removed uri indexes from some places +- Bump django-elasticsearch-dsl from 7.2.2 to 7.3 (#410) +- Bump mozilla-django-oidc from 2.0.0 to 3.0.0 (#299) +- Bump redis from 4.5.1 to 4.5.4 (#428) +##### 2.3.14 - Wed Apr 12 10:21:42 2023 +0000 +- [OpenConceptLab/ocl_issues#1544](https://github.com/OpenConceptLab/ocl_issues/issues/1544) | Source/Collection export for non HEAD should not check last child update except when writing the file +- [OpenConceptLab/ocl_issues#1528](https://github.com/OpenConceptLab/ocl_issues/issues/1528) | Source/Collection include resources behaviors +- Errbit | params integer type casting +- Errbit | params integer type casting +- Errbit | fixing collection export when no expansion exists +- Errbit | fixing collection export when no expansion exists +- Errbit | fixing bad limit param +- [OpenConceptLab/ocl_issues#1540](https://github.com/OpenConceptLab/ocl_issues/issues/1540) | operations panel access based on auth group +##### 2.3.13 - Tue Apr 11 10:45:43 2023 +0000 +- [OpenConceptLab/ocl_issues#1541](https://github.com/OpenConceptLab/ocl_issues/issues/1541) Fix 'dict' object has no attribute 'udpate' in FHIR +##### 2.3.12 - Tue Apr 11 09:25:46 2023 +0000 +- [OpenConceptLab/ocl_issues#1309](https://github.com/OpenConceptLab/ocl_issues/issues/1309) | fixing duplicate mapping issue in import of CIEL mappings on production +##### 2.3.11 - Thu Apr 6 10:56:00 2023 +0000 +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) Clean up duplicated indexes and merge indexes in mappings +##### 2.3.10 - Wed Apr 5 13:10:08 2023 +0000 +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) Adding missing migrations +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) Clean up duplicated indexes and merge indexes in concepts +##### 2.3.9 - Wed Apr 5 09:32:58 2023 +0000 +- [OpenConceptLab/ocl_issues#1533](https://github.com/OpenConceptLab/ocl_issues/issues/1533) Review changes to indexes, revert 0dfbe5c +- [OpenConceptLab/ocl_issues#1495](https://github.com/OpenConceptLab/ocl_issues/issues/1495) | collection summary +- [OpenConceptLab/ocl_issues#1527](https://github.com/OpenConceptLab/ocl_issues/issues/1527) | reusing collection serializers +- [OpenConceptLab/ocl_issues#1527](https://github.com/OpenConceptLab/ocl_issues/issues/1527) | reusing summary serializers +##### 2.3.8 - Mon Mar 27 05:14:47 2023 +0000 +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | getting Source mapped sources in separate APIs +##### 2.3.7 - Thu Mar 23 09:03:07 2023 +0000 +Mon May 16 16:11:46 2022 +0530 +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | getting Source mapped sources in separate APIs +##### 2.3.6 - Thu Mar 23 06:05:59 2023 +0000 +- skipping big import tests only on CI +- running facets test on CI +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | attempting test fix on CI +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | attempting test fix on CI +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | attempting test fix on CI +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | attempting test fix on CI +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | inspecting CI failure | added print for facets exception +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | using ES facets for field distribution +- [OpenConceptLab/ocl_issues#1524](https://github.com/OpenConceptLab/ocl_issues/issues/1524) | added index for retired counts +##### 2.3.5 - Wed Mar 22 04:04:51 2023 +0000 +- [OpenConceptLab/ocl_issues#1458](https://github.com/OpenConceptLab/ocl_issues/issues/1458) | removed feature toggle +- Fixing tests +- [OpenConceptLab/ocl_issues#1521](https://github.com/OpenConceptLab/ocl_issues/issues/1521) | listing public criteria fix +##### 2.3.4 - Fri Mar 17 04:18:25 2023 +0000 +- [OpenConceptLab/ocl_issues#1513](https://github.com/OpenConceptLab/ocl_issues/issues/1513) | concepts search in collection fix +##### 2.3.3 - Fri Mar 17 02:50:49 2023 +0000 +- [OpenConceptLab/ocl_issues#1513](https://github.com/OpenConceptLab/ocl_issues/issues/1513) | concepts search in collection fix +- Bug | collection concepts after search were not removable +##### 2.3.2 - Wed Mar 15 04:24:47 2023 +0000 +- [OpenConceptLab/ocl_issues#1458](https://github.com/OpenConceptLab/ocl_issues/issues/1458) | sort_weight can be null +- Reference filter schema to remove check from operation value +- [OpenConceptLab/ocl_issues#1415](https://github.com/OpenConceptLab/ocl_issues/issues/1415) Implement automated import scripts for FHIR HL7 content +##### 2.3.0 - Mon Mar 13 10:36:40 2023 +0000 +##### 2.2.79 - Mon Mar 13 10:36:40 2023 +0000 +- Bump whitenoise from 6.2.0 to 6.4.0 (#407) +- handling already queued exception +- Tasks | indexing tasks queue once with same args +##### 2.2.78 - Mon Mar 13 08:49:44 2023 +0000 +- [OpenConceptLab/ocl_issues#1507](https://github.com/OpenConceptLab/ocl_issues/issues/1507) | fixing typo +- Fixing formatting +- [OpenConceptLab/ocl_issues#1511](https://github.com/OpenConceptLab/ocl_issues/issues/1511) ValueSet returns expansions for HEAD and not the latest version +- [OpenConceptLab/ocl_issues#1497](https://github.com/OpenConceptLab/ocl_issues/issues/1497) Fixing validate-code returning false positives +##### 2.2.77 - Fri Mar 10 03:53:23 2023 +0000 +- [OpenConceptLab/ocl_issues#1510](https://github.com/OpenConceptLab/ocl_issues/issues/1510) | added feature toggles +##### 2.2.76 - Fri Mar 10 02:33:11 2023 +0000 +- [OpenConceptLab/ocl_issues#1507](https://github.com/OpenConceptLab/ocl_issues/issues/1507) | import get to check for pending tasks +- Importers | checking workers are alive for alive tasks +- Bump django-ordered-model from 3.6 to 3.7.1 (#404) +- Bump django-cors-headers from 3.13.0 to 3.14.0 (#401) +- Fix formatting +- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConcetpMap operations fix parameters logic +- Include production like docker-compose with web +- [OpenConceptLab/ocl_issues#1503](https://github.com/OpenConceptLab/ocl_issues/issues/1503) Collectstatic in api when building instead of at runtime +- importers tasks tests +- Test for port import update resource count task +- [OpenConceptLab/ocl_issues#1495](https://github.com/OpenConceptLab/ocl_issues/issues/1495) | collections summary tests +- [OpenConceptLab/ocl_issues#1495](https://github.com/OpenConceptLab/ocl_issues/issues/1495) | collections summary tests +- refactoring permission +- auth backend | added test case +- Bump redis from 4.3.4 to 4.5.1 (#391) +- Minor fixes and refactoring +- [OpenConceptLab/ocl_issues#1495](https://github.com/OpenConceptLab/ocl_issues/issues/1495) | collections summary +##### 2.2.75 - Fri Mar 3 03:43:46 2023 +0000 +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | added index on concept_class and datatype +##### 2.2.74 - Fri Mar 3 02:55:31 2023 +0000 +- Concept/Mapping | correcting index +- Removed debug apis +##### 2.2.73 - Thu Mar 2 03:16:53 2023 +0000 +- Removed rendundant code +- Removed expansion/references data backfill APIs/tasks +- Removed expansion/references data backfill APIs/tasks +- Monthly usage report | fixing date formats +- Imports to queue summary calculations and not do inline +##### 2.2.72 - Tue Feb 28 02:44:01 2023 +0000 +- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | fixing test +- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | fixing test +- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | source | hierarchy_meaning indexing empty/null as None +- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | source | hierarchy_meaning converting empty to None | data migration +- [OpenConceptLab/ocl_issues#1499](https://github.com/OpenConceptLab/ocl_issues/issues/1499) | source/collection | custom_validation_schema is mandatory field | data migration to set None for empty/null +- [OpenConceptLab/ocl_issues#1498](https://github.com/OpenConceptLab/ocl_issues/issues/1498) | batch delete to use transaction +- Bump pydash from 5.1.1 to 6.0.2 (#389) +- Bump mock from 4.0.3 to 5.0.1 (#383) +- Errbit | fixing retire of concept/mapping with no latest version | probable bad data +- [OpenConceptLab/ocl_issues#1458](https://github.com/OpenConceptLab/ocl_issues/issues/1458) | Mapping test to update sort_weight +- Bump drf-yasg from 1.21.4 to 1.21.5 (#377) +- Bump django from 4.1.6 to 4.1.7 (#380) +##### 2.2.71 - Wed Feb 15 10:22:02 2023 +0000 +- Tests for OID views +- Revert - batch index | revert exception handling +- Facets | added fields to facets search +- correcting view hierarchy +- Indexing | ignoring exception +- Indexing | ignoring exception +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | not returning self +##### 2.2.70 - Mon Feb 13 12:16:39 2023 +0000 +- Bump django-dirtyfields from 1.9.0 to 1.9.1 (#374) +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | Source version summary | using active concepts/mappings queryset +- Reports | Fixing months calculation +- Bump psycopg2 from 2.9.3 to 2.9.5 (#297) +##### 2.2.69 - Fri Feb 10 10:04:02 2023 +0000 +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | fixing for mapping with non-existant concept +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | fixing flaky test +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | API response for different field distributions +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | updated api response structure +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | correcting source version concepts queryset +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | fixing serializer +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | fixing serializer +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | fixing pylint +- [OpenConceptLab/ocl_issues#1467](https://github.com/OpenConceptLab/ocl_issues/issues/1467) | Source version summary verbose API +- Fixing token check +##### 2.2.68 - Tue Feb 7 05:22:41 2023 +0000 +- [OpenConceptLab/ocl_issues#1412](https://github.com/OpenConceptLab/ocl_issues/issues/1412) Enabling version endpoint for FHIR +- [OpenConceptLab/ocl_issues#1412](https://github.com/OpenConceptLab/ocl_issues/issues/1412) Migrate new FHIR endpoint to fhir subdomain +- fixing pylint +- fixing pylint +- API to trigger monthly usage report +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Bundle | serializer can return list format response | can exclude self if no results in flat cascade +- Bump django from 4.1.3 to 4.1.6 (#367) +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | creating equivalent mapping from equivalent map type provided +- OpenConcetpLab/ocl_issues#1411 Fix formatting +- OpenConcetpLab/ocl_issues#1411 Fix POSTing to CodeSystem and ValueSet validate-code +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | fixing for non-existent target concept +##### 2.2.67 - Fri Feb 3 07:42:59 2023 +0000 +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | added to/from-concept-code in mapping while cloning +- Fixing recursion in flat cascade query +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | handling schema validation exceptions +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | cloning concepts first and then mappings +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation | not cloning external_id +- [OpenConceptLab/ocl_issues#1422](https://github.com/OpenConceptLab/ocl_issues/issues/1422) Refactor how OCL FHIR Core interacts with OCL expansions +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Clone operation to use equivalency map type to check existing concept and concept mnemonic is based on parent and not copied +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | fixing mapping clone for non-existing target concept +##### 2.2.66 - Wed Feb 1 06:45:03 2023 +0000 +- Creating index for concept/mapping count +- fixing pylint +- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | correcting current month range for scheduled report +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | bundle clone fixes +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | fixing clone +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | bundle clone parameters +- Source active concepts/mappings count for HEAD correction +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | fixing pylint +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | Source concepts clone API (similar to references) +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | concept clone API (similar to cascade) +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | bundle clone resource +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | clone behavior on source +- [OpenConceptLab/ocl_issues#1453](https://github.com/OpenConceptLab/ocl_issues/issues/1453) | clone with cascade behaviour for concept +- [OpenConceptLab/ocl_issues#1417](https://github.com/OpenConceptLab/ocl_issues/issues/1417) Fix formatting +- [OpenConceptLab/ocl_issues#1417](https://github.com/OpenConceptLab/ocl_issues/issues/1417) Fix FHIR global space loading time +##### 2.2.65 - Thu Jan 26 04:52:07 2023 +0000 +- Concept/Mapping | indexes optimization +- [OpenConceptLab/ocl_issues#1416](https://github.com/OpenConceptLab/ocl_issues/issues/1416) Properly logging exception +- [OpenConceptLab/ocl_issues#1416](https://github.com/OpenConceptLab/ocl_issues/issues/1416) Do not fail if cannot represent resource as FHIR +##### 2.2.64 - Tue Jan 24 09:59:26 2023 +0000 +- Fixing concept map views serializer for swagger +##### 2.2.63 - Tue Jan 24 09:37:53 2023 +0000 +- [OpenConceptLab/ocl_issues#1463](https://github.com/OpenConceptLab/ocl_issues/issues/1463) | fixing cascade mapping serializer for target concept name +##### 2.2.62 - Wed Jan 18 11:06:49 2023 +0000 +- Errbit client | checking for cause exists or not +##### 2.2.61 - Wed Jan 18 10:50:20 2023 +0000 +- Errbit client | adding exception as cause in message and backtrace +- fixing pylint +- Refactoring concept/mappings listing +- Tests for OCL SSO auth backend +##### 2.2.60 - Wed Jan 18 07:28:02 2023 +0000 +- [OpenConceptLab/ocl_issues#1452](https://github.com/OpenConceptLab/ocl_issues/issues/1452) | Bundle | changing repo_url to repo_version_url +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | fixing locale create +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | removed redundant admin APIs for locales cleanup +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | ConceptName | concept_id is mandatory | fixing tests +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | migrations | removed dormant locales and old M2M relations +##### 2.2.59 - Wed Jan 18 03:38:17 2023 +0000 +- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConceptMap Operations: fixing test +- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConceptMap Operations: use assertRaises +- updated docker-compose version +- bumped coverage to 93 +- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConceptMap Operations: follow up +- [OpenConceptLab/ocl_issues#1235](https://github.com/OpenConceptLab/ocl_issues/issues/1235) ConceptMap Operations: translate +- [OpenConceptLab/ocl_issues#1430](https://github.com/OpenConceptLab/ocl_issues/issues/1430) | separating pre_startup script | includes migrate and other tasks +- Concept Search | fixing wild card search +- coverage to 92 +- coverage to 92 +- AuthService | missing tests +- Importers | fixing mocks +- Importers | missing assertions +- Concept Search | search with multiple words and anything between them in synonyms +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | removed unused API +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | fixing pylints +- [OpenConceptLab/ocl_issues#1399](https://github.com/OpenConceptLab/ocl_issues/issues/1399) | names/descriptions migrations to split names and descriptions +- [OpenConceptLab/ocl_issues#1457](https://github.com/OpenConceptLab/ocl_issues/issues/1457) | cascade param equivalencyMapType +- [OpenConceptLab/ocl_issues#1451](https://github.com/OpenConceptLab/ocl_issues/issues/1451) | omitIfExistsIn to exclude all resource versions +- Concept Search | search with multiple words and anything between them +- [OpenConceptLab/ocl_issues#1451](https://github.com/OpenConceptLab/ocl_issues/issues/1451) | Concept cascade | Omit if exists in repo version +##### 2.2.58 - Mon Jan 2 10:19:30 2023 +0000 +- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | Errbit | fixing monthly usage report duration +- [OpenConceptLab/ocl_issues#1452](https://github.com/OpenConceptLab/ocl_issues/issues/1452) | added repo_url in cascade response +- [OpenConceptLab/ocl_issues#1450](https://github.com/OpenConceptLab/ocl_issues/issues/1450) | fixing tests +- updated changelog +- [OpenConceptLab/ocl_issues#1450](https://github.com/OpenConceptLab/ocl_issues/issues/1450) | removed uuid from cascade response +##### 2.2.57 - Wed Dec 28 03:22:31 2022 +0000 +- [OpenConceptLab/ocl_issues#1447](https://github.com/OpenConceptLab/ocl_issues/issues/1447) | fixing mapping importer for duplicate mappings +- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | fixing pylint +- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | changing subject +- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | fixing tests +- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | fixing pylint +- [OpenConceptLab/ocl_issues#1449](https://github.com/OpenConceptLab/ocl_issues/issues/1449) | monthly usage report to show current month results and trend over last 3 months +- [OpenConceptLab/ocl_issues#1446](https://github.com/OpenConceptLab/ocl_issues/issues/1446) | mapping sort_weight field to be populated in versions | tests for importer +- [OpenConceptLab/ocl_issues#1448](https://github.com/OpenConceptLab/ocl_issues/issues/1448) | fixing pylint +- [OpenConceptLab/ocl_issues#1448](https://github.com/OpenConceptLab/ocl_issues/issues/1448) | all owned orgs/sources/collections properties on user | handling user hard delete exception +##### 2.2.56 - Thu Dec 22 05:33:32 2022 +0000 +- Exception handling for import deadlock +- [OpenConceptLab/ocl_issues#1446](https://github.com/OpenConceptLab/ocl_issues/issues/1446) | mapping sort_weight field and ordering +##### 2.2.55 - Wed Dec 21 07:49:47 2022 +0000 +- request full url in header +- Extracting env vars for email and web url +##### 2.2.54 - Wed Dec 14 04:06:51 2022 +0000 +- [OpenConceptLab/ocl_issues#1430](https://github.com/OpenConceptLab/ocl_issues/issues/1430) | skipping other tasks if migrations are skipped +- Correcting job schedule +- [OpenConceptLab/ocl_issues#1430](https://github.com/OpenConceptLab/ocl_issues/issues/1430) Adjusting logging +- [OpenConceptLab/ocl_issues#1430](https://github.com/OpenConceptLab/ocl_issues/issues/1430) Support DB migrations in background +- [OpenConceptLab/ocl_issues#1135](https://github.com/OpenConceptLab/ocl_issues/issues/1135) | Logged in user to be able to view other user details +##### 2.2.53 - Fri Dec 9 05:51:23 2022 +0000 +- [OpenConceptLab/ocl_issues#1408](https://github.com/OpenConceptLab/ocl_issues/issues/1408) | fixing queryset +- [OpenConceptLab/ocl_issues#1408](https://github.com/OpenConceptLab/ocl_issues/issues/1408) | API to get mapped sources for a source +- Contributions doc (#282) +##### 2.2.52 - Tue Nov 29 04:04:11 2022 +0000 +- [OpenConceptLab/ocl_issues#1437](https://github.com/OpenConceptLab/ocl_issues/issues/1437) | fixing OpenMRS cascade system version resolution for cascade +- Code systems operations | fixing tests +- CodeSystem operations URL to support with and without / +- [OpenConceptLab/ocl_issues#1363](https://github.com/OpenConceptLab/ocl_issues/issues/1363) | added missing fields +##### 2.2.51 - Wed Nov 16 10:44:17 2022 +0000 +- Bump coverage from 6.2 to 6.5.0 (#290) +- Bump django-dirtyfields from 1.8.2 to 1.9.0 (#287) +- Bump djangorestframework from 3.13.1 to 3.14.0 (#289) +##### 2.2.50 - Sun Nov 13 06:07:30 2022 +0000 +- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | refactoring +- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | Exclude resource from expansion test and fix +- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | OpenMRS Cascade fixes +- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | For cascade + transform | return the concluded expression in response +- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | added transform in reference serializer +- [OpenConceptLab/ocl_issues#1038](https://github.com/OpenConceptLab/ocl_issues/issues/1038) | fixing test +- [OpenConceptLab/ocl_issues#1038](https://github.com/OpenConceptLab/ocl_issues/issues/1038) | fixing test +- [OpenConceptLab/ocl_issues#1038](https://github.com/OpenConceptLab/ocl_issues/issues/1038) | monthly usage report scheduled to run on 1st of every month to report prev month's usage +- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | fixing tranform reference when nothing returns from queryset +- [OpenConceptLab/ocl_issues#1038](https://github.com/OpenConceptLab/ocl_issues/issues/1038) | monthly usage report task +- fixing flaky test +- [OpenConceptLab/ocl_issues#1424](https://github.com/OpenConceptLab/ocl_issues/issues/1424) | OpenMRS cascade | accepting cascade expanded structure +- [OpenConceptLab/ocl_issues#1309](https://github.com/OpenConceptLab/ocl_issues/issues/1309) | fixing mappings importers query for existence check for special characters +- Bulk importer update counts async +- Source HEAD last child updated at query optimisation +##### 2.2.49 - Sun Nov 6 01:56:03 2022 +0000 +- Can force queue an export +- [OpenConceptLab/ocl_issues#1233](https://github.com/OpenConceptLab/ocl_issues/issues/1233) ConceptMap CRUD +##### 2.2.48 - Fri Nov 4 02:44:05 2022 +0000 +Tue Sep 14 18:39:45 2021 +0530 +- [OpenConceptLab/ocl_issues#1406](https://github.com/OpenConceptLab/ocl_issues/issues/1406) | expansion parameter | system-version can be multiple comma separated +- Bump requests from 2.27.1 to 2.28.1 (#283) +- Bump pydash from 5.1.0 to 5.1.1 (#284) +- Bump drf-yasg from 1.20.0 to 1.21.4 (#285) +- Bump django from 4.1.1 to 4.1.3 (#286) +##### 2.2.47 - Thu Nov 3 04:19:47 2022 +0000 +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | fixing hierarchy for repo version cascade +- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | Fixed healthchecks for celery and celery_beat +- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | added beat task for healthcheck | added management command to check for beat health +- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | updated celery command line +- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | updated celery command line +- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | Using custom fork of flower | fixes https://github.com/mher/flower/issues/1231 +- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | added django-celery-beat | upgraded celery/redis/kombu/flower +- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | fixing typo +- [OpenConceptLab/ocl_issues#1387](https://github.com/OpenConceptLab/ocl_issues/issues/1387) | local beat setup +##### 2.2.46 - Wed Nov 2 05:54:56 2022 +0000 +- [OpenConceptLab/ocl_issues#1356](https://github.com/OpenConceptLab/ocl_issues/issues/1356) | migration to populate extras in repo versions from HEAD +- [OpenConceptLab/ocl_issues#1356](https://github.com/OpenConceptLab/ocl_issues/issues/1356) | source/collection version extras +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | fixing pylint +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | to also return requested url +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | not returning uuid +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade | removed includeMappings +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | Source version detail serializer | Added hierarchy root url +- Refactoring | Extracting constant for "*" symbol +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | concept cascade with return map types false +- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | fixing accented character +- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | caching default locales API +- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | added source description +- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | OCL default locales API | GET /locales/ +- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | ISO/iso639-1/locales fixtures +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | removed redundant name field +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade return map types to use filter map types criteria +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | cascade returnMapTypes behaviour +- [OpenConceptLab/ocl_issues#1338](https://github.com/OpenConceptLab/ocl_issues/issues/1338) | SSO with KeyCloak +- OpenMRSMappingValidator | better query +- OpenMRSMappingValidator | do not validate if mapping is retired +- bulk import | better query for indexes update +##### 2.2.45 - Mon Oct 17 10:49:16 2022 +0000 +- Mappings import | Correcting mappings exists check +##### 2.2.44 - Mon Oct 17 09:43:33 2022 +0000 +- Mappings Validation | ignoring retired +##### 2.2.43 - Sun Oct 16 02:01:26 2022 +0000 +- OpenMRS mapping validation schema to ignore old retired versions of mappings +- [OpenConceptLab/ocl_issues#1364](https://github.com/OpenConceptLab/ocl_issues/issues/1364) | added iso-637-1 locale in lookup data +- [OpenConceptLab/ocl_issues#1382](https://github.com/OpenConceptLab/ocl_issues/issues/1382) | Source/Collection | supported locales to always have default locale first +- Revert "Disabling server side cursors | fixing connection pooling" +- Disabling server side cursors | fixing connection pooling +- [OpenConceptLab/ocl_issues#1245](https://github.com/OpenConceptLab/ocl_issues/issues/1245) | extras search query to replace '-' with '_' +- [OpenConceptLab/ocl_issues#1288](https://github.com/OpenConceptLab/ocl_issues/issues/1288) Upgrade Postgres to 14.4 +- Revert "OpenConceptLab/ocl_issues#1288 Upgrade Postgres to latest stable (13.7)" +- [OpenConceptLab/ocl_issues#1288](https://github.com/OpenConceptLab/ocl_issues/issues/1288) Upgrade Postgres to latest stable (13.7) +- [OpenConceptLab/ocl_issues#1354](https://github.com/OpenConceptLab/ocl_issues/issues/1354) | fixing pylint error +- [OpenConceptLab/ocl_issues#1354](https://github.com/OpenConceptLab/ocl_issues/issues/1354) | retired mapping csv test +- [OpenConceptLab/ocl_issues#1215](https://github.com/OpenConceptLab/ocl_issues/issues/1215) | Imports | handling invalid/bad CSV uploads +##### 2.2.42 - Wed Sep 28 04:42:00 2022 +0000 +Tue Sep 14 18:39:45 2021 +0530 +- [OpenConceptLab/ocl_issues#1354](https://github.com/OpenConceptLab/ocl_issues/issues/1354) | sample csv and test for retired mapping (CSV -> JSON) +- Source/Collection delete | already queued handling +- Reference | fixing translation for encoded codes +- removed unused import +- Fixing test +- [OpenConceptLab/ocl_issues#1354](https://github.com/OpenConceptLab/ocl_issues/issues/1354) | concept/mapping importers | delete action +- [OpenConceptLab/ocl_issues#1348](https://github.com/OpenConceptLab/ocl_issues/issues/1348) | Source/Collection | converting json attributes to json +- Bump whitenoise from 5.3.0 to 6.2.0 (#273) +- Bump markdown from 3.3.7 to 3.4.1 (#272) +- Bump django-cors-headers from 3.12.0 to 3.13.0 (#271) +- Bump django-dirtyfields from 1.8.1 to 1.8.2 (#270) +- [OpenConceptLab/ocl_issues#1353](https://github.com/OpenConceptLab/ocl_issues/issues/1353) | removed collection.repository_type +- [OpenConceptLab/ocl_issues#1352](https://github.com/OpenConceptLab/ocl_issues/issues/1352) | concept facets for encoded characters +- [OpenConceptLab/ocl_issues#1145](https://github.com/OpenConceptLab/ocl_issues/issues/1145) | API to get full result of task by taskID +##### 2.2.41 - Thu Sep 8 03:32:59 2022 +0000 +- [OpenConceptLab/ocl_issues#1351](https://github.com/OpenConceptLab/ocl_issues/issues/1351) | external_id exact searchable +- Bump djangorestframework from 3.12.4 to 3.13.1 (#269) +- Upgraded pylint +- Bump django from 4.0.6 to 4.1.1 (#268) +- Fixing test +- [OpenConceptLab/ocl_issues#1343](https://github.com/OpenConceptLab/ocl_issues/issues/1343) | Reference translation additions +##### 2.2.40 - Fri Sep 2 07:50:20 2022 +0000 +- Fixing ocladmin orgs membership data reset on api deploy +- [OpenConceptLab/ocl_issues#1343](https://github.com/OpenConceptLab/ocl_issues/issues/1343) | added translation in collection references +- [OpenConceptLab/ocl_issues#1348](https://github.com/OpenConceptLab/ocl_issues/issues/1348) | Org Listing API | added type +- [OpenConceptLab/ocl_issues#1347](https://github.com/OpenConceptLab/ocl_issues/issues/1347) | fixing pylints +- [OpenConceptLab/ocl_issues#1347](https://github.com/OpenConceptLab/ocl_issues/issues/1347) | Source/Collection version | members and admin can recompute summary +##### 2.2.39 - Fri Aug 5 08:58:41 2022 +0000 +- [OpenConceptLab/ocl_issues#1309](https://github.com/OpenConceptLab/ocl_issues/issues/1309) | MappingImporter | fixing queryset for exists check +##### 2.2.38 - Thu Aug 4 05:53:21 2022 +0000 +- Errbit | Collection reference filters to query fix | fixing test +- Errbit | Collection reference filters to query fix +- Collection add expressions can be requested as async task +- docker-compose | added volume for postgres db +##### 2.2.37 - Fri Jul 29 02:57:48 2022 +0000 +- concept serializer | fixing test +- concept flat cascade | fixing hierarchical concepts | added retired flag +##### 2.2.36 - Wed Jul 27 05:57:02 2022 +0000 +- Extracting env vars for email setting +##### 2.2.35 - Tue Jul 26 05:04:41 2022 +0000 +- [OpenConceptLab/ocl_issues#1339](https://github.com/OpenConceptLab/ocl_issues/issues/1339) | concept cascade to include/exclude retired results +##### 2.2.34 - Mon Jul 25 09:22:42 2022 +0000 +- Extract export service (S3) | can plugin upload/download service via settings +##### 2.2.33 - Fri Jul 22 02:26:02 2022 +0000 +- Errbit | Bulk create of mapping/concept via POST is not allowed +- Fixing version export with version creation +##### 2.2.32 - Thu Jul 21 03:24:07 2022 +0000 +- Importer | Added Failed in summary +- Importer | delete action needs to be in sync with others in the same group +##### 2.2.31 - Tue Jul 19 02:41:13 2022 +0000 +- Collection last child update query fix +##### 2.2.30 - Mon Jul 18 03:17:34 2022 +0000 +- [OpenConceptLab/ocl_issues#1335](https://github.com/OpenConceptLab/ocl_issues/issues/1335) | User Management | verification and admin toggle +- [OpenConceptLab/ocl_issues#1336](https://github.com/OpenConceptLab/ocl_issues/issues/1336) | Speed up tests by getting rid of delete_all and relying on rollback +- [OpenConceptLab/ocl_issues#1335](https://github.com/OpenConceptLab/ocl_issues/issues/1335) | Admin can force mark verified any user +- Logs | added request method in response headers +- Logs | added request url in response headers +##### 2.2.28 - Wed Jul 13 05:32:06 2022 +0000 +- Bump boto3 from 1.23.0 to 1.24.28 (#261) +- Bump django-ordered-model from 3.4.3 to 3.6 (#260) +- Collection version references | verbose response +- Bump django-cid from 2.2 to 2.3 (#259) +- Bump psycopg2 from 2.9.2 to 2.9.3 (#257) +##### 2.2.26 - Fri Jul 8 08:59:11 2022 +0000 +- [OpenConceptLab/ocl_issues#1332](https://github.com/OpenConceptLab/ocl_issues/issues/1332) | fixing task to load less +- [OpenConceptLab/ocl_issues#1332](https://github.com/OpenConceptLab/ocl_issues/issues/1332) | fixing method signature +- Fixing task view test +- [OpenConceptLab/ocl_issues#1332](https://github.com/OpenConceptLab/ocl_issues/issues/1332) | API/task for backfilling repo versions to expansions +##### 2.2.25 - Fri Jul 8 05:36:11 2022 +0000 +- CollectionReference | API to resolve reference +##### 2.2.24 - Thu Jul 7 07:02:23 2022 +0000 +- Errbit | fixing exception class import +- Errbit | ES search exception | data too large +- Fixing Mapping creation without from/to source +##### 2.2.23 - Wed Jul 6 06:01:54 2022 +0000 +- removed unused import +- Bump django from 4.0.5 to 4.0.6 (#258) +- API/Task to link all references resources +- Task to migrate references +- Task to migrate references | ignoring coverage +- Task to migrate from old to new reference structure | added logs +- APIs to Link reference with resources and to migrate from old to new structure via job +- Reference | migrating old reference to new structure via management command +- Revert "Reference | migrating old reference to new structure" +- Reference | migrating old reference to new structure +- Utils | Test for more scenarios +- Merge pull request #254 from OpenConceptLab/dependabot/pip/django-request-logging-0.7.5 +- [OpenConceptLab/ocl_issues#1145](https://github.com/OpenConceptLab/ocl_issues/issues/1145) | API to get any task info by ID from Flower +- Bump django-request-logging from 0.7.3 to 0.7.5 +##### 2.2.20 - Wed Jun 29 05:10:39 2022 +0000 +- Expansions | corrected user signatures on create +- Skipping csv test | getting hung sometimes +- Errbit | not using cache for openmrs concept validator lookups +- [OpenConceptLab/ocl_issues#1330](https://github.com/OpenConceptLab/ocl_issues/issues/1330) | LocalizedText.name is a Hash Index +- [OpenConceptLab/ocl_issues#1329](https://github.com/OpenConceptLab/ocl_issues/issues/1329) | Source/Collection serializers | canonical_url as char field +- [OpenConceptLab/ocl_issues#1329](https://github.com/OpenConceptLab/ocl_issues/issues/1329) | canonical_url check works for any uri scheme +- [OpenConceptLab/ocl_issues#1329](https://github.com/OpenConceptLab/ocl_issues/issues/1329) | canonical_url can take any URI +##### 2.2.18 - Fri Jun 24 07:36:16 2022 +0000 +- Concept/Mapping | repo version query to not check for public access | added indexes for repo versions +- Revert "OpenConceptLab/ocl_issues#1320 | reference cascade to use unique resources" +##### 2.2.16 - Fri Jun 24 05:36:31 2022 +0000 +- [OpenConceptLab/ocl_issues#1320](https://github.com/OpenConceptLab/ocl_issues/issues/1320) | expansion to add unique resources +##### 2.2.15 - Fri Jun 24 04:50:56 2022 +0000 +- Errbit | fixing mapping collection membership API +- Errbit | fixing concept collection membership API +- [OpenConceptLab/ocl_issues#1320](https://github.com/OpenConceptLab/ocl_issues/issues/1320) | reference cascade to use unique resources +- [OpenConceptLab/ocl_issues#1307](https://github.com/OpenConceptLab/ocl_issues/issues/1307) | expansions to keep resolved repo versions +- Added concept indexes for repo version query +##### 2.2.14 - Mon Jun 20 08:43:13 2022 +0000 +- [OpenConceptLab/ocl_issues#1325](https://github.com/OpenConceptLab/ocl_issues/issues/1325) | Mapping target concept name reverse +- [OpenConceptLab/ocl_issues#1325](https://github.com/OpenConceptLab/ocl_issues/issues/1325) | Mapping target concept name +##### 2.2.13 - Fri Jun 17 04:59:06 2022 +0000 +- importers.models | ignoring logs from coverage +- non-negative validator test +##### 2.2.12 - Wed Jun 15 03:27:20 2022 +0000 +- Mocking Redis service +- Bump django from 4.0.4 to 4.0.5 +- increased coverage to 93 +- Repo version export delete test +- Repo version processing view integration tests +- missing S3 test +- revived s3 test +- upgraded moto to latest +- unit tests for postgresql service for sequence CRUD +- [OpenConceptLab/ocl_issues#1116](https://github.com/OpenConceptLab/ocl_issues/issues/1116) | Added Response time header +- Errbit | bulk import task to throw error when 'type' is missing on any line +- Fixing source mnemonic sequence not present for older sources +- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) Fixing test +- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) Adding tests and fixes +##### 2.2.11 - Fri Jun 10 07:59:57 2022 +0000 +- [OpenConceptLab/ocl_issues#1311](https://github.com/OpenConceptLab/ocl_issues/issues/1311) | resources search attributes | correcting boost and attr meta +- [OpenConceptLab/ocl_issues#1311](https://github.com/OpenConceptLab/ocl_issues/issues/1311) | org search attributes | correcting boost and attr meta +##### 2.2.10 - Fri Jun 10 05:40:43 2022 +0000 +- [OpenConceptLab/ocl_issues#1311](https://github.com/OpenConceptLab/ocl_issues/issues/1311) | wildcard search boost=0 +##### 2.2.9 - Fri Jun 10 03:22:12 2022 +0000 +- CollectionReference | not using expression to compute concepts/mappings +- [OpenConceptLab/ocl_issues#1321](https://github.com/OpenConceptLab/ocl_issues/issues/1321) | ES extras | replacing hyphens with underscores +- [OpenConceptLab/ocl_issues#1215](https://github.com/OpenConceptLab/ocl_issues/issues/1215) | Errbit | Imports | Handling invalid JSON error +- Errbit | throwing error in repo version import when HEAD could not be found +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | pylintrc | disable false positive cyclic-import +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | sources | updated as per pylint2.14 +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | valuesets | updated as per pylint2.14 +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | common | updated as per pylint2.14 +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | importers | updated as per pylint2.14 +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | concepts | updated as per pylint2.14 +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | collections | updated as per pylint2.14 +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | pylint | no-self-use is a separate plugin now +- [OpenConceptLab/ocl_issues#1319](https://github.com/OpenConceptLab/ocl_issues/issues/1319) | pylint | fixing utils to ignore dunder calls +- [OpenConceptLab/ocl_issues#1295](https://github.com/OpenConceptLab/ocl_issues/issues/1295) | exposing route to cascade concept within expansion context +- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | Exclude Expression | when resource version is not specified, it will exclude all versions +- [OpenConceptLab/ocl_issues#1311](https://github.com/OpenConceptLab/ocl_issues/issues/1311) | Making search attributes for each resource seperate and added boost +- Bump pylint from 2.12.2 to 2.14.0 +- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | correcting seq reset +- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | source autoid | source update can update autoid sequence +- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | source autoid | can set start from +- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | source autoid | not reseting on concept/mapping delete +- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | Concept id optional for autoid set sources +- [OpenConceptLab/ocl_issues#1295](https://github.com/OpenConceptLab/ocl_issues/issues/1295) | concept cascade forward/backward flat/hierarchy for collection version +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | expansion parameters | include system version switches version of code system +- [OpenConceptLab/ocl_issues#1210](https://github.com/OpenConceptLab/ocl_issues/issues/1210) | Source autoid for concepts/mappings mnemonic/external_id +- Errbit | fixing collection summary compute +- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference add | fixing special characters in code +- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | added references in concept version detail serializer +- Errbit | fixing Collection/Sources json field indexing +- [OpenConceptLab/ocl_issues#1305](https://github.com/OpenConceptLab/ocl_issues/issues/1305) | parallel import | chunking with resource versions in same chunk +- [OpenConceptLab/ocl_issues#1289](https://github.com/OpenConceptLab/ocl_issues/issues/1289) | reference | cascade params to use all parameters +- [OpenConceptLab/ocl_issues#1289](https://github.com/OpenConceptLab/ocl_issues/issues/1289) | reference | fixing cascade params +- [OpenConceptLab/ocl_issues#1289](https://github.com/OpenConceptLab/ocl_issues/issues/1289) | reference parser | fixing include/exclude parsing +- [OpenConceptLab/ocl_issues#1301](https://github.com/OpenConceptLab/ocl_issues/issues/1301) | collection concept/mapping GET | using correct serializers +- [OpenConceptLab/ocl_issues#1299](https://github.com/OpenConceptLab/ocl_issues/issues/1299) | encoding concept id for cascade +- [OpenConceptLab/ocl_issues#1289](https://github.com/OpenConceptLab/ocl_issues/issues/1289) | updated parsers to handle few more scenarios +- APIs to get reference's concepts/mappings +- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference delete to exclude resource or resource-version based on resource result +- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference add with filter to use versioned_object_id +- [OpenConceptLab/ocl_issues#1234](https://github.com/OpenConceptLab/ocl_issues/issues/1234) Fixes to CodeSystem +- Not logging Load balancer requests +- Fixing paginator assignment +- CodeSystem/ValueSet | considering _count param for page size +- CodeSystem/ValueSet | added pagination links in serializer +- FHIRBundleSerializer | added links for pagination +- Bump django-cors-headers from 3.10.1 to 3.12.0 +- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | fixing delete +- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference delete to queue indexing for removed resourecs +- API to index expansion concepts/mappings +- [OpenConceptLab/ocl_issues#1234](https://github.com/OpenConceptLab/ocl_issues/issues/1234) Fixing identifier parsing +- [OpenConceptLab/ocl_issues#1234](https://github.com/OpenConceptLab/ocl_issues/issues/1234) Adding more debug info +- [OpenConceptLab/ocl_issues#1234](https://github.com/OpenConceptLab/ocl_issues/issues/1234) Fixing datetime issue +- using HEAD constant +- CodeSystem/ValueSet | using constants +- Cleaning CodeSystem views +- [OpenConceptLab/ocl_issues#123](https://github.com/OpenConceptLab/ocl_issues/issues/123) | ValueSet expand to be sync +- [OpenConceptLab/ocl_issues#123](https://github.com/OpenConceptLab/ocl_issues/issues/123) | Fixing Valueset expand test +- Bump markdown from 3.3.4 to 3.3.7 +- Bump boto3 from 1.21.27 to 1.23.0 +- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) ValueSet Operations (validate-code and expand) +- [OpenConceptLab/ocl_issues#1224](https://github.com/OpenConceptLab/ocl_issues/issues/1224) | restricting concept cascade to source version +- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | reference bulk delete +- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | reference delete to reevaluate other references +- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | new ref in expansion evaluates all exclusion refs also +- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | added include/exclude in old style list parser +- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | added include/exclude in reference clone +- [OpenConceptLab/ocl_issues#1278](https://github.com/OpenConceptLab/ocl_issues/issues/1278) | reference summary as part of verbose reference response +- [OpenConceptLab/ocl_issues#1292](https://github.com/OpenConceptLab/ocl_issues/issues/1292) | exclude reference +- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) | Valueset | cleaning/formatting serializer/tests +- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) | Valueset | using collection reference parser +- [OpenConceptLab/ocl_issues#1232](https://github.com/OpenConceptLab/ocl_issues/issues/1232) ValueSet Operations, filter +- bumping coverage to 92: +- Added test for collection version expansions APIs +- Added test for collection version expansion delete +- Added test for collection version expansion concept view +- Added test for collection version expansion concept's mappings list view +- Added test for collection version expansion mapping retrieve +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | fixing ES pagination +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | fixing ES max_clause_limit error when applying filters +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | logging async add references errors +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | fixing filter expression results +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | refactored expansion references add +- [OpenConceptLab/ocl_issues#1231](https://github.com/OpenConceptLab/ocl_issues/issues/1231) ValueSet CRUD +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) Addressing issues after initial testing +- added missing test for collection version summary get +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | refactoring parsers | adding more tests +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Valuset expression | resolving queryset correctly +- Errbit | fixing search result slicing when page is not defined +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | fixing collection references PUT response +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Added more tests around new style syntax parser +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | reference filter can take exact_match as well +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | removed unused import +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Setting expression for expanded structure +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Collection Reference Delete API +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Collection Reference response to have more info +- CodeSystem formatting tests +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | Expanded Reference Structure and refactorings +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | generic collection reference parser for old and new style +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | generic old style to new expanded reference structure parser +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | another assertion for a test +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | parser for old style all source resources reference expression to new expanded structure +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | parser for old style reference expression to new expanded syntax +##### 2.2.8 - Mon May 2 04:00:50 2022 +0000 +- [OpenConceptLab/ocl_issues#1285](https://github.com/OpenConceptLab/ocl_issues/issues/1285) | Repo export behind permission +##### 2.2.7 - Sat Apr 30 03:52:38 2022 +0000 +- [OpenConceptLab/ocl_issues#1285](https://github.com/OpenConceptLab/ocl_issues/issues/1285) | Repo export behind permission +- [OpenConceptLab/ocl_issues#1283](https://github.com/OpenConceptLab/ocl_issues/issues/1283) | Concept synonyms indexing | using lowecase normalizer +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | reference filter field schema validation +- [OpenConceptLab/ocl_issues#1277](https://github.com/OpenConceptLab/ocl_issues/issues/1277) | not using redis cache backend on CI +- [OpenConceptLab/ocl_issues#1277](https://github.com/OpenConceptLab/ocl_issues/issues/1277) | Using cached lookup API for all lookups +- [OpenConceptLab/ocl_issues#1277](https://github.com/OpenConceptLab/ocl_issues/issues/1277) | added django cache backend as redis +- [OpenConceptLab/ocl_issues#1283](https://github.com/OpenConceptLab/ocl_issues/issues/1283) | concept search criteria | added synonyms search criteria with wildcards +- Postgres-Dev | upgraded to 14.2-alpine +- Bump django from 4.0.3 to 4.0.4 +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | Expansion Parameters | fixed order of parameters evaluation +- [OpenConceptLab/ocl_issues#1280](https://github.com/OpenConceptLab/ocl_issues/issues/1280) | added verbose references in collection's concept/mapping responses via query param +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | Source/Collection | making revision_date datetime field and setting on version release +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | expansion parameter | include/exclude system version considers valuesets as well +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | expansion parameter | applying include system before exclude +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | refactored resolve reference operation +- [OpenConceptLab/ocl_issues#1275](https://github.com/OpenConceptLab/ocl_issues/issues/1275) | CollectionReference | added attributes for structured reference +- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | API for source head resources dedup deleted +##### 2.2.4 - Sat Apr 16 05:39:57 2022 +0000 +- [OpenConceptLab/ocl_issues#1280](https://github.com/OpenConceptLab/ocl_issues/issues/1280) | added references in collection/expansion mapping version detail +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | expansion parameter to include/exclude system version +- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | Making sure limit offset is applied in list queries +- Importers Errbit | fixing mapping failed index attempt issue +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | using API_BASE_URL in place of internal url +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | fixing empty queryset search +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | added expansion in facets filters +- [OpenConceptLab/ocl_issues#1265](https://github.com/OpenConceptLab/ocl_issues/issues/1265) | Expansions | added 'filter' parameter +- Concept Importer | handling integer ids +- Upgraded to 2.2.0 +- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | concept/mappings list | correcting global queryset +- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | concept/mappings list | fixing parent resource set +- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | concept/mappings list | removing joins for HEAD parent calls | added indexes +- Errbit | collection expansion concepts/mappings CSV list fix +- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | concept list | not prefetching names +- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | reusing count query +- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | Concept/Mapping list view | added is_active clause +- [OpenConceptLab/ocl_issues#1274](https://github.com/OpenConceptLab/ocl_issues/issues/1274) | Concept/Mapping list view | removing a join from query +- [OpenConceptLab/ocl_issues#1272](https://github.com/OpenConceptLab/ocl_issues/issues/1272) | test for concept retired TRUE/FALSE CSV converter -> import +##### 2.1.3 - Thu Apr 7 09:24:30 2022 +0000 +- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | (attempting) fixing whitenoise static files issue +- [OpenConceptLab/ocl_issues#1206](https://github.com/OpenConceptLab/ocl_issues/issues/1206) | removed old collection concepts/mappings relations +- [OpenConceptLab/ocl_issues#1206](https://github.com/OpenConceptLab/ocl_issues/issues/1206) | removed code to migrate old style to new style collection +- [OpenConceptLab/ocl_issues#1155](https://github.com/OpenConceptLab/ocl_issues/issues/1155) | Merge pull request #209 from OpenConceptLab/django4 +- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | add response serializer +- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | API route for head resources dedup +- Org data migration | adding creator and updator in members list +- [OpenConceptLab/ocl_issues#1247](https://github.com/OpenConceptLab/ocl_issues/issues/1247) | collection/source apis | brief response +- Refactoing | extracted common code +- Expansion test for getting mappings from a concept +- user search view test +- user org search view test +- user org collections/sources list test +- Concept Search | multi words wild card test +- Upgraded to Django4 +##### 2.1.0 - Mon Apr 4 08:57:29 2022 +0530 +- Upgraded to 2.1.0 +- Expansion | do not re-evaluate references for auto expansion +- coverage at 91 +- Collection get mapping expressions from concept in expansion test +- Collection Reference fetch concepts/mappings test +- Expansion delete expression tests +- Expansion clean test +- Expansion parameters test +- Mapping validation test +- Revert "reviving facets tests for CI" +- coverage at 90 +- reviving facets tests for CI +- Source mappings/concepts indexes view test +- Source Hierarchy view test +- Source version summary API test +- Collection version expansion mappings/concepts API list view test +- test for collection version (default expansion) concept mappings api +- test for expansion concept mappings api +- test for source update validation schema task +- test for source concepts/mappings batch index tasks +- added retry on failure for source mappings index task +- tests for source/collection resources count tasks +- tasks | test for delete s3 objects +- mapping hard delete test +- concept summary test +- Mapping collection membership test +- Concept collection membership test +- Concept hard delete request test +- Concept parents/children test +- Mapping reactivate test +- Concept locale edit and reactivate tests +- [OpenConceptLab/ocl_issues#1267](https://github.com/OpenConceptLab/ocl_issues/issues/1267) | repo HEAD export should delete old cached exports from S3 +- imports | update_comment in new concept/mapping +- imports | update_comment in new concept +- Reference Importer | one batch index index task each for concepts and mappings for all references +- batch_index_resources fixes +- indexing tasks | ignoring results and added retry +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | fixing get_serializer methods for swagger +- Repo Version export | logged upload status code +- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | API to dedup source head resource versions associations +- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | management task to have repo head only with resource latest versions +- [OpenConceptLab/ocl_issues#1262](https://github.com/OpenConceptLab/ocl_issues/issues/1262) | repo HEAD will not keep all resource versions but latest only +- Merge pull request #207 from OpenConceptLab/dependabot/pip/boto3-1.21.27 +- Bump boto3 from 1.20.24 to 1.21.27 +- Perform search when is present +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Add validate-code and lookup for CodeSystem +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) Using 1 instead of 2 parallel workers for tests +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) Using 2 instead of 4 parallel workers for tests +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | Wait for ES when running tests +- Cascade | added target source/owner name in mappings response +- Fixing search criteria for hyphens +- coverage at 88 +- Bundle serializer | remove concepts/mappings count +- Fixing pylint +- Bundle serializer to close to Fhir Bundle response +- Coverage | minor refacotrings +- Coverage | Source index children test +- Coverage | utils | added missing test +- Coverage | import get task status | tests for flower service failed +- Coverage | tests for task delete +- Coverage | refactored client config serializers remove redundancy +- coverage to 87 +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | skipping facets test on CI +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | attemping index fix for CI +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | fixing test for CI +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | fixing pylint +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | fail build if coverage is below 88 +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | more search behaviours in integration tests +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | concept search integration test +- Revert "Revert "OpenConceptLab/ocl_issues#1244 | concept search integration test"" +- Correcting celery signal processor +- Revert "OpenConceptLab/ocl_issues#1244 | concept search integration test" +- Concept/Mapping | added indexes for versioned_object_id +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | concept search integration test +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | Disable redis +- [OpenConceptLab/ocl_issues#1244](https://github.com/OpenConceptLab/ocl_issues/issues/1244) | Enable ES tests on Bamboo +- Parallel Imports | allowing update_comment field in concept/mapping imports +- Errbit | increased ES timeout to 60 seconds +- [OpenConceptLab/ocl_issues#1230](https://github.com/OpenConceptLab/ocl_issues/issues/1230) | references add | transform resource versions is acknowledged +- Imports | chunking indexing to multiple tasks +- User reactivate should reset the status of user +- [OpenConceptLab/ocl_issues#1246](https://github.com/OpenConceptLab/ocl_issues/issues/1246) | upgraded ES image to 7.17.1 | now supports mac m1 +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Bullet-proof identifier and extra logging +- [OpenConceptLab/ocl_issues#1241](https://github.com/OpenConceptLab/ocl_issues/issues/1241) | concept/mapping retrieve should work for source version request +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | integration test expansion concept +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | integration test expansion mappings +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | integration test for resolve operation +- APIs to get concept/mapping details from collection expansion +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | resolveReference | added requested info, resolution_url in response | can consider string expressions as well +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | resolveReference | considering namespace only in case of canonical (FQDN) +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Making fields non-required +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | versionless resolve reference to resolve to latest or HEAD +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Adding support for create and update for CodeSystems +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Addressing review +- [OpenConceptLab/ocl_issues#1203](https://github.com/OpenConceptLab/ocl_issues/issues/1203) | Source/Collection Home | styling breadcrumbs to have fixed button widths | styling selected controls +- Errbit | fixing search results slicing when page is 0 +- Exapnsions revaluate references always +- [OpenConceptLab/ocl_issues#1225](https://github.com/OpenConceptLab/ocl_issues/issues/1225) | Reference Import | fixing indexing +- [OpenConceptLab/ocl_issues#1225](https://github.com/OpenConceptLab/ocl_issues/issues/1225) | Collection Expansion processing to happen in sync in bulk import +- [OpenConceptLab/ocl_issues#1225](https://github.com/OpenConceptLab/ocl_issues/issues/1225) | Parallel Importer | making sure repo versions are processed in right order +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | resolve reference to consider Collections | using version list serializer response when resolved +- updated Readme +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | accepting relative url for source version +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | fixing pylint errors +- [OpenConceptLab/ocl_issues#1221](https://github.com/OpenConceptLab/ocl_issues/issues/1221) | reference expression resolve API +- [OpenConceptLab/ocl_issues#1219](https://github.com/OpenConceptLab/ocl_issues/issues/1219) | removed dead code +- [OpenConceptLab/ocl_issues#1219](https://github.com/OpenConceptLab/ocl_issues/issues/1219) | Concept index | added synonyms +- [OpenConceptLab/ocl_issues#1220](https://github.com/OpenConceptLab/ocl_issues/issues/1220) | facets size 20 (from default 10) +- [OpenConceptLab/ocl_issues#1206](https://github.com/OpenConceptLab/ocl_issues/issues/1206) | removed dead code +- Unused import removed +- Expansions | API to get concept mappings from collection version context +- Expansions | fixing concept mappings from collection/expansion context +- [OpenConceptLab/ocl_issues#1203](https://github.com/OpenConceptLab/ocl_issues/issues/1203) | added uuid in references serializers +- concept/mapping version membership | removing duplicates +- Expansions | simplifying concept/mapping collection index +- Expansions | correcting concept/mapping collection_version membership api +- Expansions | correcting concept/mapping collection_version list property +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | fixing tests +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Fixing formatting +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Fixing formatting +- [OpenConceptLab/ocl_issues#1166](https://github.com/OpenConceptLab/ocl_issues/issues/1166) | Adding FHIR CodeSystem resource (read only) +- Making sure expansion mnemonic is used when provided +- [OpenConceptLab/ocl_issues#826](https://github.com/OpenConceptLab/ocl_issues/issues/826) | fixing tests +- [OpenConceptLab/ocl_issues#1209](https://github.com/OpenConceptLab/ocl_issues/issues/1209) | ordering children by mnemonic +- [OpenConceptLab/ocl_issues#826](https://github.com/OpenConceptLab/ocl_issues/issues/826) | parallel importer | batch index concepts/mappings +- [OpenConceptLab/ocl_issues#1209](https://github.com/OpenConceptLab/ocl_issues/issues/1209) | source parent less concepts API support +- [OpenConceptLab/ocl_issues#1209](https://github.com/OpenConceptLab/ocl_issues/issues/1209) | API to get source's parent less concepts +- [OpenConceptLab/ocl_issues#1209](https://github.com/OpenConceptLab/ocl_issues/issues/1209) | concept has children property +- [OpenConceptLab/ocl_issues#1205](https://github.com/OpenConceptLab/ocl_issues/issues/1205) | collection version export to wait until auto expansion is processing +- Migrations | fixing deleting dormant collection references +- Migrations | deleting dormant collection references +- Migrations | deleting dormant collection references +- fixing migration | creating postgres btree gin extension +- fixing migration | creating postgres btree gin extension +- fixing migration | creating psql extension +- Collection Reference -> Concept/Mapping association +- concept/version details/listing serializer | added versioned_object_id for term browser +- concept/mapping lists | added indexes and refactored queryset +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | concept cascade recursion | keeping it DRY +- [OpenConceptLab/ocl_issues#1196](https://github.com/OpenConceptLab/ocl_issues/issues/1196) | monthly usage report visualization +- [OpenConceptLab/ocl_issues#1197](https://github.com/OpenConceptLab/ocl_issues/issues/1197) | openmrs schema locales type from term browser fix +- [OpenConceptLab/ocl_issues#1191](https://github.com/OpenConceptLab/ocl_issues/issues/1191) | collection add reference | dynamic reference fix +- [OpenConceptLab/ocl_issues#1191](https://github.com/OpenConceptLab/ocl_issues/issues/1191) | Collection References | delete to use existing queryset +- [OpenConceptLab/ocl_issues#1191](https://github.com/OpenConceptLab/ocl_issues/issues/1191) | Collection References | not hard deleting, just disassociating +- [OpenConceptLab/ocl_issues#1191](https://github.com/OpenConceptLab/ocl_issues/issues/1191) | Collection References | fixing reference delete +- Collection/Version/Expansion | concepts/mappings facets class +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | correcting entries conditions +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | as hierarchy terminal indicator +- deleted dead code +- Coverage at 85 +- client-configs | using utils more +- Collection/Expansion | missing test | dead code +- Coverage increased to 86 +- [OpenConceptLab/ocl_issues#1128](https://github.com/OpenConceptLab/ocl_issues/issues/1128) | source/collection async delete is default +- Fixing flaky test +- [OpenConceptLab/ocl_issues#997](https://github.com/OpenConceptLab/ocl_issues/issues/997) | fixing reference expression resolve +- [OpenConceptLab/ocl_issues#1136](https://github.com/OpenConceptLab/ocl_issues/issues/1136) | startup | migration from old style collection to new style +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | levels to refelect cascade levels and not recursion levels +- [OpenConceptLab/ocl_issues#1136](https://github.com/OpenConceptLab/ocl_issues/issues/1136) | management command for collection migration from oldstyle to newstyle +- coverage back to 85 +- Mapping/Concept version tests +- Mapping/Concept version hard delete +- Fixing Concept Version Hard Delete | fixing concept/mapping listing and active concepts/mappings count queries +- Concept Version Hard delete to not delete locales +- [OpenConceptLab/ocl_issues#1180](https://github.com/OpenConceptLab/ocl_issues/issues/1180) | moving away from celery autoscale +- Expansions | indexing async +- Mapping Collection Membership API +- Merge branch 'master' into collection_expansions +- [OpenConceptLab/ocl_issues#712](https://github.com/OpenConceptLab/ocl_issues/issues/712) | fixing pylint warnings +- [OpenConceptLab/ocl_issues#712](https://github.com/OpenConceptLab/ocl_issues/issues/712) | utils | method to get values from nested dict +- Merge branch 'master' into collection_expansions +- updated requests package +- Errbit fix | concepts mappings | return 404 if concept not found +- celery healthcheck | increased timeout +- celery healthcheck | increased timeout +- [OpenConceptLab/ocl_issues#1179](https://github.com/OpenConceptLab/ocl_issues/issues/1179) | fixing test +- [OpenConceptLab/ocl_issues#1176](https://github.com/OpenConceptLab/ocl_issues/issues/1176) | fixing test +- [OpenConceptLab/ocl_issues#1176](https://github.com/OpenConceptLab/ocl_issues/issues/1176) | collection/version concept/mapping/version GET request +- [OpenConceptLab/ocl_issues#1163](https://github.com/OpenConceptLab/ocl_issues/issues/1163) | importers | handling when no 'type' is provided +- [OpenConceptLab/ocl_issues#1163](https://github.com/OpenConceptLab/ocl_issues/issues/1163) | collection expansion mnemonic to have autoexpanded only if its autoexpanded +- Org overview column migration +- fixing migrations | migration merge +- coverage to 84 | wip +- Collection | autoexpand nullable boolean +- [OpenConceptLab/ocl_issues#1144](https://github.com/OpenConceptLab/ocl_issues/issues/1144) | Collection details | added expansion_url +- [OpenConceptLab/ocl_issues#1144](https://github.com/OpenConceptLab/ocl_issues/issues/1144) | auto expansions mnemonic updated +- [OpenConceptLab/ocl_issues#979](https://github.com/OpenConceptLab/ocl_issues/issues/979) | collection summary has expansions count also | fixing test +- [OpenConceptLab/ocl_issues#979](https://github.com/OpenConceptLab/ocl_issues/issues/979) | cannot delete default expansion | expansions count in version summary +- [OpenConceptLab/ocl_issues#923](https://github.com/OpenConceptLab/ocl_issues/issues/923) | errbit client setup +- [OpenConceptLab/ocl_issues#979](https://github.com/OpenConceptLab/ocl_issues/issues/979) | Expansion detail serializer +- Removed internal_reference_id from expansions +- [OpenConceptLab/ocl_issues#970](https://github.com/OpenConceptLab/ocl_issues/issues/970) | removed duplicate import +- [OpenConceptLab/ocl_issues#970](https://github.com/OpenConceptLab/ocl_issues/issues/970) | removed unused imports +- [OpenConceptLab/ocl_issues#970](https://github.com/OpenConceptLab/ocl_issues/issues/970) | reference expression can be collection based +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | Supporting dynamic references +- removed internal_reference_id | was used for v1 to v2 data migration +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version serializer to have expansions_url +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection child last updated at on expansion +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | head autoexpand false behaviours +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version to use expansion_uri to get concepts/mappings +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version expansion_uri is an explicit field +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | expansions doesnt have references copy +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version with expansions and parameters +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version default expansion with default parameters on autoexpanded version creation +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collection version autoexpand false to seed only references +- [OpenConceptLab/ocl_issues#818](https://github.com/OpenConceptLab/ocl_issues/issues/818) | collections | autoexpand head/version attrs | not resolving expressions for autoexpand_head false +##### 2.0.111 - Wed Jan 12 05:40:32 2022 +0000 +- [OpenConceptLab/ocl_issues#1183](https://github.com/OpenConceptLab/ocl_issues/issues/1183) | added parameters in swagger +- [OpenConceptLab/ocl_issues#1183](https://github.com/OpenConceptLab/ocl_issues/issues/1183) | concept reverse +- [OpenConceptLab/ocl_issues#1183](https://github.com/OpenConceptLab/ocl_issues/issues/1183) | reverse mapping serializer +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | hierarchy concepts before mapping concepts +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | ordering by map type +- [OpenConceptLab/ocl_issues#1179](https://github.com/OpenConceptLab/ocl_issues/issues/1179) | source/collection | active concepts/mappings counts to be None when not set rather than 0 +- [OpenConceptLab/ocl_issues#1175](https://github.com/OpenConceptLab/ocl_issues/issues/1175) | Source/Collection DELETE | fixing test +- [OpenConceptLab/ocl_issues#1175](https://github.com/OpenConceptLab/ocl_issues/issues/1175) | Source/Collection DELETE | fixing test +- [OpenConceptLab/ocl_issues#1175](https://github.com/OpenConceptLab/ocl_issues/issues/1175) | Source/Collection DELETE | making s3 exports delete async task +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | mapping serializer | added to_concept_code/to_concept_url +- Fixing flaky test for openmrs concept schema +- Fixing test +- Added missing tests +- [OpenConceptLab/ocl_issues#1163](https://github.com/OpenConceptLab/ocl_issues/issues/1163) | importers | handling when no 'type' is provided +- coverage.sh | fail if tests fail +##### 2.0.107 - Wed Dec 29 07:07:52 2021 +0000 +- [OpenConceptLab/ocl_issues#712](https://github.com/OpenConceptLab/ocl_issues/issues/712) | Admin can hard delete users (except self) +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | added display_name in hierarchy response +- [OpenConceptLab/ocl_issues#1168](https://github.com/OpenConceptLab/ocl_issues/issues/1168) | bundle hierarchy and flat responses +- [OpenConceptLab/ocl_issues#1168](https://github.com/OpenConceptLab/ocl_issues/issues/1168) | concept as hierarchy method +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | concept summary to have child/parent concepts count | summary an be added in concept obj response +- [OpenConceptLab/ocl_issues#1169](https://github.com/OpenConceptLab/ocl_issues/issues/1169) | concept properties for child parent counts +- [OpenConceptLab/ocl_issues#1167](https://github.com/OpenConceptLab/ocl_issues/issues/1167) | inactive->verify->activate user feature +- [OpenConceptLab/ocl_issues#1163](https://github.com/OpenConceptLab/ocl_issues/issues/1163) | errbit | fixing concept clone +- Errbit fix | API with page number empty 500 fix +- [OpenConceptLab/ocl_issues#1167](https://github.com/OpenConceptLab/ocl_issues/issues/1167) | inactive user login | inactive user search and list +- [OpenConceptLab/ocl_issues#45](https://github.com/OpenConceptLab/ocl_issues/issues/45) | OpenMRS collection concepts validation to consider same name types +- Bump pylint from 2.11.1 to 2.12.2 +- Bump coverage from 6.1.1 to 6.2 +- Bump psycopg2 from 2.9.1 to 2.9.2 +- Bump moto from 2.2.13 to 2.2.19 +- Bump django-cors-headers from 3.10.0 to 3.10.1 +- Source/Collection | removed last (missed) calculation of concepts +- Source/Collection Versions | saving unwanted summary calculation +- Errbit | concept children/parent APIs fix +- Errbit fix | user org collections/sources API fix when there are no user orgs +- Making sure that search doesn't compute DB query also +- [OpenConceptLab/ocl_issues#1133](https://github.com/OpenConceptLab/ocl_issues/issues/1133) | org importer | org creator is the member +- [OpenConceptLab/ocl_issues#1161](https://github.com/OpenConceptLab/ocl_issues/issues/1161) | mapping importer | retired is allowed field +- Errbit fix | importers | concepts/mappings returns failed if parent doesnt exist +- [OpenConceptLab/ocl_issues#1161](https://github.com/OpenConceptLab/ocl_issues/issues/1161) | mapping importer | encoding to/from_concept_code correctly +- [OpenConceptLab/ocl_issues#1156](https://github.com/OpenConceptLab/ocl_issues/issues/1156) | org overview settings +- [OpenConceptLab/ocl_issues#1157](https://github.com/OpenConceptLab/ocl_issues/issues/1157) | making sure new collection/source version copies all attributes from HEAD +- Bump django from 3.2.8 to 4.0 +- [OpenConceptLab/ocl_issues#1151](https://github.com/OpenConceptLab/ocl_issues/issues/1151) | mapping importer | fixing exist check criteria +- Bump boto3 from 1.19.12 to 1.20.24 +- API for user summary +- [OpenConceptLab/ocl_issues#1154](https://github.com/OpenConceptLab/ocl_issues/issues/1154) | Admin user can make another user admin or remove it (except self) +- Admin API to toggle user's staff permission +- Exposing DB for development +- Concept Debug API | no need for response +- [OpenConceptLab/ocl_issues#1151](https://github.com/OpenConceptLab/ocl_issues/issues/1151) | fixing self mapping importer +##### 2.0.93 - Wed Dec 8 04:42:29 2021 +0000 +- Concept debug api to connect parent as source version +- Concept parent concept urls errbit fix | refactoring +- Concept debug api to log if versioned object exists +- fixing pylint warning | typo +- fixing pylint warning +- Admin API to mark latest version as versioned object +- Bundle resource_type -> type +- POST pins to have correct created by id +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | added concepts/mappings count +- [OpenConceptLab/ocl_issues#1132](https://github.com/OpenConceptLab/ocl_issues/issues/1132) | concept/mapping | added collection url in ES for facets +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | reducing iterations +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | reducing max results to 500 +- [OpenConceptLab/ocl_issues#1127](https://github.com/OpenConceptLab/ocl_issues/issues/1127) | sorting coverage by cover percentage (asc) +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | integration test for all cascade levels +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | concept cascade performance | not loading concept parent +- [OpenConceptLab/ocl_issues#1131](https://github.com/OpenConceptLab/ocl_issues/issues/1131) | concept cascade performance | simplifying concept mappings queryset +- concept mappings removed distinct and order by clauses +- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | refactoring and cleaning up +- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | recrusion for nth level | limiting results and swagger parameters +- [OpenConceptLab/ocl_issues#1126](https://github.com/OpenConceptLab/ocl_issues/issues/1126) | fixing source/collection summary save tasks +- [OpenConceptLab/ocl_issues#1127](https://github.com/OpenConceptLab/ocl_issues/issues/1127) | coverage | fail under 85 +- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | can cascade hierarchy (default true) and cascade mappings option (default true) +##### 2.0.88 - Tue Nov 23 06:08:40 2021 +0000 +- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | swagger query parameters +- [OpenConceptLab/ocl_issues#1122](https://github.com/OpenConceptLab/ocl_issues/issues/1122) | concept cascade | excludeMapTypes filter +- [OpenConceptLab/ocl_issues#1126](https://github.com/OpenConceptLab/ocl_issues/issues/1126) | children concept urls queryset fix +- [OpenConceptLab/ocl_issues#1126](https://github.com/OpenConceptLab/ocl_issues/issues/1126) | fixing authored report when payload is none +- [OpenConceptLab/ocl_issues#1126](https://github.com/OpenConceptLab/ocl_issues/issues/1126) | parenless children queryset fix +- [OpenConceptLab/ocl_issues#1127](https://github.com/OpenConceptLab/ocl_issues/issues/1127) | coverage | setting coverage directory +- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | bundle | added timestamp and concept/mapping type in response +- Adding API_IMAGE variable to docker-compose.ci +- Fixing Dockerfile to use cache +- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | bundle | removed bundle type +- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | bundle | not returning id and timestamp +##### 2.0.85 - Fri Nov 19 10:17:43 2021 +0000 +- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | bundle | default response is brief +- exact match facets to encode special characters in search string +- [OpenConceptLab/ocl_issues#1088](https://github.com/OpenConceptLab/ocl_issues/issues/1088) | concept operation with bundle and ocl response +- Source/Collection counts update | making sure save is called when counts change +##### 2.0.82 - Sun Nov 14 13:30:38 2021 +0000 +- ES | search request timeout +- Errbit Client | xml escaping url string +- [OpenConceptLab/ocl_issues#661](https://github.com/OpenConceptLab/ocl_issues/issues/661) | Reverting OpenConceptLab/ocl_issues#103 +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | Collection ref add/delete will update child count +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | Source/Collection/Version retrieve will only update concepts or mappings count when required +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | concept/mapping on retire/delete updating parent counts +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | concept/mapping parent active counts are bulk updated after content import +- Response headers to have requesting user +- Not logging in dev mode +- Errbit errors to have request URL +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | concept/mapping counts async tasks +- [OpenConceptLab/ocl_issues#1082](https://github.com/OpenConceptLab/ocl_issues/issues/1082) Add GIN, GIST, TRGM extensions and concepts uri index +- [OpenConceptLab/ocl_issues#1082](https://github.com/OpenConceptLab/ocl_issues/issues/1082) | comments explaining hierarchy async tasks +- ES | increased timeout for facets query to 20s (default 10s) | Errbit +##### 2.0.80 - Mon Nov 8 11:36:04 2021 +0000 +- Reverting to flower 0.9.5 +- Merge pull request #28 from OpenConceptLab/dependabot/pip/flower-1.0.0 +- Merge pull request #102 from OpenConceptLab/dependabot/pip/factory-boy-3.2.1 +- Merge pull request #103 from OpenConceptLab/dependabot/pip/coverage-6.1.1 +- Bump factory-boy from 3.2.0 to 3.2.1 +- Bump coverage from 6.0.2 to 6.1.1 +- Merge pull request #99 from OpenConceptLab/dependabot/pip/boto3-1.19.12 +- Bump boto3 from 1.19.0 to 1.19.12 +- Merge pull request #101 from OpenConceptLab/dependabot/pip/moto-2.2.13 +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | hierarchy asyn processing on concurrent queue +- Bump moto from 2.2.9 to 2.2.13 +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | not eager loading concepts/mappings owners +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | fixing pylints | unused arguments +- [OpenConceptLab/ocl_issues#1008](https://github.com/OpenConceptLab/ocl_issues/issues/1008) | saving concepts/mappings count on Source/Collection +- Not logging verbose on CI +- [OpenConceptLab/ocl_issues#1082](https://github.com/OpenConceptLab/ocl_issues/issues/1082) | fixing hierarchy query not use LIKE +- Concept List View | fixing queryset +- [OpenConceptLab/ocl_issues#941](https://github.com/OpenConceptLab/ocl_issues/issues/941) | not logging in dev/test +- [OpenConceptLab/ocl_issues#941](https://github.com/OpenConceptLab/ocl_issues/issues/941) | Added request/response headers and correlation id in logs +- [OpenConceptLab/ocl_issues#941](https://github.com/OpenConceptLab/ocl_issues/issues/941) | removed custom Logger middleware +- Collection version references | raise 404 if version not found +- Concept/Mapping | eager loading relations +- Concept/Mapping | added index with public_access for count queries (without order by) +- [OpenConceptLab/ocl_issues#1059](https://github.com/OpenConceptLab/ocl_issues/issues/1059) | including user as creator pins only if other user is not defined +- [OpenConceptLab/ocl_issues#1059](https://github.com/OpenConceptLab/ocl_issues/issues/1059) | Pin to have created by | user's pins can include user's created by pins +- [OpenConceptLab/ocl_issues#993](https://github.com/OpenConceptLab/ocl_issues/issues/993) | bulk import | collection/source delete and version creation only allowed for members +- [OpenConceptLab/ocl_issues#1070](https://github.com/OpenConceptLab/ocl_issues/issues/1070) | OpenMRS concept validator | preferred name uniquness clause to only consider existing preferred names +- pylint fixes +- Source concepts/mappings indexes views | added dummy serializer +- [OpenConceptLab/ocl_issues#1057](https://github.com/OpenConceptLab/ocl_issues/issues/1057) | Collection References | cascade source to concepts option +- Bump flower from 0.9.5 to 1.0.0 +##### 2.0.75 - Wed Oct 27 08:40:29 2021 +0000 +- [OpenConceptLab/ocl_issues#993](https://github.com/OpenConceptLab/ocl_issues/issues/993) | Parallel Bulk Import | user permission checks on resources +- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | facets names are camel cased +- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | fixing pylint +- Merge pull request #50 from PatrickCmd/filter_concepts_by_name_and_desctription_types +- Merge pull request #82 from OpenConceptLab/dependabot/pip/pyyaml-6.0 +- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | filter concepts by name type and description type +- Bump pyyaml from 5.4.1 to 6.0 +##### 2.0.75 - Wed Oct 27 08:40:29 2021 +0000 +- [OpenConceptLab/ocl_issues#993](https://github.com/OpenConceptLab/ocl_issues/issues/993) | Parallel Bulk Import | user permission checks on resources +- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | facets names are camel cased +- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | fixing pylint +- Merge pull request #50 from PatrickCmd/filter_concepts_by_name_and_desctription_types +- Merge pull request #82 from OpenConceptLab/dependabot/pip/pyyaml-6.0 +- [OpenConceptLab/ocl_issues#37](https://github.com/OpenConceptLab/ocl_issues/issues/37) | filter concepts by name type and description type +- Bump pyyaml from 5.4.1 to 6.0 +##### 2.0.74 - Fri Oct 22 02:13:56 2021 +0000 +- Merge pull request #81 from OpenConceptLab/dependabot/pip/django-elasticsearch-dsl-7.2.1 +- Bump django-elasticsearch-dsl from 7.2.0 to 7.2.1 +- Merge pull request #80 from OpenConceptLab/dependabot/pip/coverage-6.0.2 +- Merge pull request #79 from OpenConceptLab/dependabot/pip/django-cors-headers-3.10.0 +- Bump coverage from 6.0 to 6.0.2 +- Merge pull request #78 from OpenConceptLab/dependabot/pip/boto3-1.19.0 +- Bump django-cors-headers from 3.9.0 to 3.10.0 +- Merge pull request #70 from OpenConceptLab/dependabot/pip/django-3.2.8 +- Bump boto3 from 1.18.49 to 1.19.0 +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | POST Admin API to resolve duplicate latest versions using ids rather than created_at +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | keeping code DRY +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | POST Admin API to resolve duplicate latest versions for specific concepts +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | resolve duplicate latest version order by mnemonic +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | resolve duplicate latest version order by parent id desc +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | resolve duplicate latest version | added logs +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | resolve duplicate latest version with better query +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | after latest version resolve indexing +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | PUT Admin API to resolve duplicate latest versions +- [OpenConceptLab/ocl_issues#1036](https://github.com/OpenConceptLab/ocl_issues/issues/1036) | Admin API to get duplicate latest concept versions +- [OpenConceptLab/ocl_issues#923](https://github.com/OpenConceptLab/ocl_issues/issues/923) | errbit client setup +- Adding User-Agent to import file url request for parallel imports +- Adding User-Agent to import file url request +- [OpenConceptLab/ocl_issues#1035](https://github.com/OpenConceptLab/ocl_issues/issues/1035) Slow concepts and mappings select (partial index) +- Revert "OpenConceptLab/ocl_issues#1035 Slow concepts and mappings select (partial index)" +- [OpenConceptLab/ocl_issues#1035](https://github.com/OpenConceptLab/ocl_issues/issues/1035) Slow concepts and mappings select (partial index) +- [OpenConceptLab/ocl_issues#1035](https://github.com/OpenConceptLab/ocl_issues/issues/1035) Slow concepts and mappings select +- [OpenConceptLab/ocl_issues#1035](https://github.com/OpenConceptLab/ocl_issues/issues/1035) Slow concepts select +- Removing tmp after export file is uploaded +- Bump django from 3.2.7 to 3.2.8 +- Merge pull request #69 from OpenConceptLab/dependabot/pip/moto-2.2.9 +- Bump moto from 2.2.8 to 2.2.9 +- Merge pull request #63 from OpenConceptLab/dependabot/pip/pydash-5.1.0 +- pylint | removed unused import +- Concept children/parents | pagination and headers +- Bump pydash from 5.0.2 to 5.1.0 +##### 2.0.66 - Thu Oct 7 05:38:06 2021 +0000 +- [OpenConceptLab/ocl_issues#1018](https://github.com/OpenConceptLab/ocl_issues/issues/1018) | user org collections/sources search result scope fix +- [OpenConceptLab/ocl_issues#991](https://github.com/OpenConceptLab/ocl_issues/issues/991) | concept children/parents nested children/parents can be asked separately +- Merge pull request #61 from OpenConceptLab/dependabot/pip/coverage-6.0 +- Bump coverage from 5.5 to 6.0 +- [OpenConceptLab/ocl_issues#991](https://github.com/OpenConceptLab/ocl_issues/issues/991) | API get parents of a concept +- concept detail | not including empty hierarchy path by default +##### 2.0.63 - Mon Oct 4 04:57:25 2021 +0000 +- [OpenConceptLab/ocl_issues#1018](https://github.com/OpenConceptLab/ocl_issues/issues/1018) | bulk references add from a source/version to not go through API +- Merge pull request #57 from OpenConceptLab/dependabot/pip/django-cors-headers-3.9.0 +- Bump django-cors-headers from 3.8.0 to 3.9.0 +##### 2.0.61 - Wed Sep 29 11:40:41 2021 +0000 +- [OpenConceptLab/ocl_issues#992](https://github.com/OpenConceptLab/ocl_issues/issues/992) | concept collection membership restricted to user/org scope +- [OpenConceptLab/ocl_issues#1000](https://github.com/OpenConceptLab/ocl_issues/issues/1000) | deleted v1 to v2 data migration code +- Merge pull request #56 from OpenConceptLab/dependabot/pip/boto3-1.18.49 +- Bump boto3 from 1.18.42 to 1.18.49 +- Merge pull request #54 from OpenConceptLab/dependabot/pip/moto-2.2.8 +- List APIs to use ES for non empty search str only +- [OpenConceptLab/ocl_issues#992](https://github.com/OpenConceptLab/ocl_issues/issues/992) | API to get collection memberships for a concept +- [OpenConceptLab/ocl_issues#963](https://github.com/OpenConceptLab/ocl_issues/issues/963) | OpenMRS validator external_id for concept/locales/mapping validations +- Bump moto from 2.2.7 to 2.2.8 +##### 2.0.58 - Sat Sep 25 12:16:24 2021 +0000 +- populate hierarchy task to log more +- [OpenConceptLab/ocl_issues#988](https://github.com/OpenConceptLab/ocl_issues/issues/988) | source/collection/concept/mapping list api to apply user permissions +##### 2.0.56 - Thu Sep 23 02:20:53 2021 +0000 +- Fixing or criteria for searching mnemonic exact +- API to batch index source's concepts and mappings +- POST Concept/Mapping | 404 if parent not found +##### 2.0.54 - Mon Sep 20 07:22:22 2021 +0000 +- [OpenConceptLab/ocl_issues#966](https://github.com/OpenConceptLab/ocl_issues/issues/966) | django logging for non-dev env (gunicorn based) +- fixing pylint +- Collection | add all references (*) bug fix +- Pylint | implemented consider-using-f-string fixes +- Pylint | implemented consider-using-f-string +- Merge pull request #47 from OpenConceptLab/dependabot/pip/moto-2.2.7 +- Merge pull request #48 from OpenConceptLab/dependabot/pip/pylint-2.11.1 +- Bump pylint from 2.10.2 to 2.11.1 +- Bump moto from 2.2.6 to 2.2.7 +- Merge pull request #46 from OpenConceptLab/dependabot/pip/boto3-1.18.42 +- Bump boto3 from 1.18.40 to 1.18.42 +- Revert "Revert "OpenConceptLab/ocl_issues#971 | making sure the non REST URLs are not supported"" +- Mapping version creation | fixing queries to get and mark prev latest version not latest +- removed internal_reference_id | was used for v1 to v2 data migration +- Adding keep-alive to match ALB +- Adjust gunicorn timeout to 60s +- [OpenConceptLab/ocl_issues#972](https://github.com/OpenConceptLab/ocl_issues/issues/972) | data migration | not adding ocladmin as member to orgs with no members +- Revert "OpenConceptLab/ocl_issues#971 | making sure the non REST URLs are not supported" +- reverting file read encoding +- Increase number of gunicorn workers +- S3 | fixing upload of export file +- Batch delete | chunk size 1000 +- [OpenConceptLab/ocl_issues#971](https://github.com/OpenConceptLab/ocl_issues/issues/971) | making sure the non REST URLs are not supported +- [OpenConceptLab/ocl_issues#972](https://github.com/OpenConceptLab/ocl_issues/issues/972) | data migration | making sure related_name is not used +- [OpenConceptLab/ocl_issues#972](https://github.com/OpenConceptLab/ocl_issues/issues/972) | data migration | making sure related_name is not used as string +- [OpenConceptLab/ocl_issues#972](https://github.com/OpenConceptLab/ocl_issues/issues/972) | data migration to add creator and updater as org member in orgs without any members +- Delete source can be an async call +##### 2.0.52 - Mon Sep 13 11:57:24 2021 +0000 +- Adding capture output for gunicorn +- Merge pull request #44 from OpenConceptLab/dependabot/pip/boto3-1.18.40 +- Bump boto3 from 1.18.39 to 1.18.40 +- data/file upload max memory size can be upto 200mb +- [OpenConceptLab/ocl_issues#965](https://github.com/OpenConceptLab/ocl_issues/issues/965) Using Gunicorn for Swagger and disabling DEBUG mode +- Merge pull request #42 from OpenConceptLab/dependabot/pip/boto3-1.18.39 +- Bump boto3 from 1.18.37 to 1.18.39 +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | parallel importers | using deque to manage parts list +- CSV sample with special characters +- [OpenConceptLab/ocl_issues#960](https://github.com/OpenConceptLab/ocl_issues/issues/960) | using Python 3 style super() without arguments +- [OpenConceptLab/ocl_issues#960](https://github.com/OpenConceptLab/ocl_issues/issues/960) | fixed pylint warnings +- Merge pull request #32 from OpenConceptLab/dependabot/pip/pylint-2.10.2 +- Merge pull request #40 from OpenConceptLab/dependabot/pip/boto3-1.18.37 +- Bump boto3 from 1.18.36 to 1.18.37 +- Bump pylint from 2.5.3 to 2.10.2 +##### 2.0.50 - Wed Sep 8 03:27:52 2021 +0000 +- updated pydash to 5.0.2 +- Merge pull request #36 from OpenConceptLab/dependabot/pip/django-ordered-model-3.4.3 +- Merge pull request #37 from OpenConceptLab/dependabot/pip/boto3-1.18.36 +- Bump boto3 from 1.14.37 to 1.18.36 +- Bump django-ordered-model from 3.4.1 to 3.4.3 +- Merge pull request #33 from OpenConceptLab/dependabot/pip/django-cors-headers-3.8.0 +- removed six from requirements +- Explicitly adding mock (python core) deps +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | parallel importers | memory optimiztion | getting rid of content once queued +- Bump django-cors-headers from 3.4.0 to 3.8.0 +- Merge pull request #34 from OpenConceptLab/dependabot/pip/django-elasticsearch-dsl-7.2.0 +- Bump django-elasticsearch-dsl from 7.1.4 to 7.2.0 +- Merge pull request #31 from OpenConceptLab/dependabot/pip/moto-2.2.6 +- Merge pull request #26 from OpenConceptLab/dependabot/pip/factory-boy-3.2.0 +- Bump moto from 1.3.14 to 2.2.6 +- Merge pull request #27 from OpenConceptLab/dependabot/pip/pyyaml-5.4.1 +- Merge pull request #29 from OpenConceptLab/dependabot/pip/psycopg2-2.9.1 +- [OpenConceptLab/ocl_issues#957](https://github.com/OpenConceptLab/ocl_issues/issues/957) | parallel importers | memory optimiztion | getting rid of content once queued +- Bump psycopg2 from 2.8.5 to 2.9.1 +- Bump pyyaml from 5.4 to 5.4.1 +- Bump factory-boy from 2.12.0 to 3.2.0 +- Fixing celery permissions issue when running locally in dev mode +- updated drf-yasg +- Merge pull request #24 from OpenConceptLab/dependabot/pip/requests-2.26.0 +- Bump requests from 2.24.0 to 2.26.0 +- Merge pull request #25 from OpenConceptLab/dependabot/pip/django-3.2.7 +- Merge pull request #23 from OpenConceptLab/dependabot/pip/djangorestframework-3.12.4 +- Merge pull request #22 from OpenConceptLab/dependabot/pip/coverage-5.5 +- Merge pull request #21 from OpenConceptLab/dependabot/pip/python-dateutil-2.8.2 +- Create codeql-analysis.yml +- Create SECURITY.md +- Bump django from 3.1.12 to 3.2.7 +- Bump djangorestframework from 3.11.2 to 3.12.4 +- Bump coverage from 5.3.1 to 5.5 +- Bump python-dateutil from 2.8.1 to 2.8.2 +- Create dependabot.yml +- Source/Collection last latest version force delete on org delete +- [OpenConceptLab/ocl_issues#955](https://github.com/OpenConceptLab/ocl_issues/issues/955) | CSV importer test for OpenMRS schema +- [OpenConceptLab/ocl_issues#897](https://github.com/OpenConceptLab/ocl_issues/issues/897) Adding envs and args to runtime docker image +- [OpenConceptLab/ocl_issues#897](https://github.com/OpenConceptLab/ocl_issues/issues/897) Adding missing curl +- [OpenConceptLab/ocl_issues#897](https://github.com/OpenConceptLab/ocl_issues/issues/897) Adding missing permissions +- [OpenConceptLab/ocl_issues#897](https://github.com/OpenConceptLab/ocl_issues/issues/897) Fixing tests +- Revert "Revert "OpenConceptLab/ocl_issues#897 Run OCL API using gunicorn"" +##### 2.0.47 - Tue Aug 31 07:27:09 2021 +0000 +- Org delete to delete children first +##### 2.0.46 - Fri Aug 27 09:14:25 2021 +0000 +- Org delete to use bulk_delete +- [OpenConceptLab/ocl_issues#947](https://github.com/OpenConceptLab/ocl_issues/issues/947) | Handling ES error of max pagination +##### 2.0.45 - Fri Aug 27 03:37:30 2021 +0000 +- [OpenConceptLab/ocl_issues#949](https://github.com/OpenConceptLab/ocl_issues/issues/949) | Source/collection last child updated at | using max query +- [OpenConceptLab/ocl_issues#949](https://github.com/OpenConceptLab/ocl_issues/issues/949) | Concept hierarchy | avoiding join +- [OpenConceptLab/ocl_issues#949](https://github.com/OpenConceptLab/ocl_issues/issues/949) | Mapping import | removed like query | reduced parent/owner joins +- [OpenConceptLab/ocl_issues#911](https://github.com/OpenConceptLab/ocl_issues/issues/911) | +@akhilkala | Orgs List with no members using query parameter +- [OpenConceptLab/ocl_issues#936](https://github.com/OpenConceptLab/ocl_issues/issues/936) | can request facets only from search routes +- Importers | Added deleted count and details in results +- [OpenConceptLab/ocl_issues#935](https://github.com/OpenConceptLab/ocl_issues/issues/935) | Parallel Importer | Mapping Importer to consider id (mnemonic) attribute for exists check +- [OpenConceptLab/ocl_issues#935](https://github.com/OpenConceptLab/ocl_issues/issues/935) | Parallel Importer | Fixing tests +- [OpenConceptLab/ocl_issues#935](https://github.com/OpenConceptLab/ocl_issues/issues/935) | Parallel Importer | Source/Collection version create to append results in created and not updated +##### 2.0.41 - Mon Aug 16 04:19:11 2021 +0000 +- Including source/collection summaries in user/org pins listing +- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | export mappings | not loading relations eagerly +- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | ordering concepts/mappings | fixing batch size typo +- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | Export queries | limit/offset on lookup table only +- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | Fixing collection export concepts/mappings queryset +- [OpenConceptLab/ocl_issues#910](https://github.com/OpenConceptLab/ocl_issues/issues/910) | Slow Query | concept/mapping exports to use less joins +- Authoring Report | Added summary and description in swagger +##### 2.0.38 - Thu Aug 12 01:45:01 2021 +0000 +- concept/mappings | Removed uri LIKE criteria +- Update README.md +- Amend hierarchy api to take input as parent->child uri map +- pylint | Fixing indentation +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding missing composite index +##### 2.0.37 - Wed Aug 11 08:47:34 2021 +0000 +- using raw query for dormant locales count +- Source exports | concepts to have child and parent concept urls +- Admin API amend the concept hierarchy +- Fixing unsued import +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Reverting IN unnest custom lookups +##### 2.0.35 - Tue Aug 10 03:33:12 2021 +0000 +- [OpenConceptLab/ocl_issues#895](https://github.com/OpenConceptLab/ocl_issues/issues/895) | concept/mapping | Admin API to delete (hard) a version +##### 2.0.34 - Mon Aug 9 11:28:23 2021 +0000 +- user(s) authoring report | counts of resources created/updated +- Indexing | making sure re-run of delete job doesn't fail if the instance is already deleted +##### 2.0.33 - Fri Aug 6 08:19:53 2021 +0000 +- delete duplicate locales task | Updated log statement +- Indexes API | can index resources by uri filter +- Limiting locales for each concept to max 500 +- integration test for different concept response modes (verbose/standard/brief) +- Concept brief response '?brief=true' | returns uuid and id only +- [OpenConceptLab/ocl_issues#45](https://github.com/OpenConceptLab/ocl_issues/issues/45) | not validating retired concept locales +- Fixing concept new/version leaving dormant locales +- [OpenConceptLab/ocl_issues#860](https://github.com/OpenConceptLab/ocl_issues/issues/860) | self mappings | mappings can be created with same from/to concept +- [OpenConceptLab/ocl_issues#857](https://github.com/OpenConceptLab/ocl_issues/issues/857) Frequent 504 gateway timeout when requesting export on staging +- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | Monthly usage report | added collection references in serializer +- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | added date range in monthly usage report +- locales dormant/duplicate routes under admin namespace +- Concept/Mapping | simplifying version get criteria +- Concept summary API to return concept and not latest version when no version is specified +- Concept hard delete to not leave any dormant locales behind +- Concept POST/PUT | fixing parent concept urls not accepted +- api to delete dormant locales in batches +- Added version info in swagger UI +- api to get count of dormant locales +- logging count of dormant locales deleted +- api/task to get concept/version summary, clean dormant locales +- api/task for sys admin to delete dormant locales +- async concept hard delete sys admin api +- Task to cleanup duplicate locales | processing in batches +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding missing indexes +- [OpenConceptLab/ocl_issues#857](https://github.com/OpenConceptLab/ocl_issues/issues/857) | Source/collection child max updated at to select only updated_at field +- Source concept/mapping export to eager load source's parent correctly +##### 2.0.21 - Wed Jul 28 05:30:54 2021 +0000 +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) | exports | reducing batch size to 100 +- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | monthly usage report under admin/report/ namespace +- [OpenConceptLab/ocl_issues#838](https://github.com/OpenConceptLab/ocl_issues/issues/838) | User List can be filtered by dateJoinedBefore and dateJoinedSince +##### 2.0.20 - Mon Jul 26 10:28:11 2021 +0000 +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) | performance | merging excludes +##### 2.0.19 - Fri Jul 23 03:09:59 2021 +0000 +- [OpenConceptLab/ocl_issues#853](https://github.com/OpenConceptLab/ocl_issues/issues/853) | search results to also consider org and user scope permissions +##### 2.0.18 - Thu Jul 22 09:55:18 2021 +0000 +- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | user monthly report | added collection/source versions and collection references in verbose mode +- [OpenConceptLab/ocl_issues#852](https://github.com/OpenConceptLab/ocl_issues/issues/852) | users monthly report API +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding indexes for public_access fields +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding indexes for LocalizedText +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Adding upper index for sources_mnemonic +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) | Concept List API performance | fixing n+1 query | versions url to be guessed rather than computed +- [OpenConceptLab/ocl_issues#828](https://github.com/OpenConceptLab/ocl_issues/issues/828) | changelog to be autoupdated with release version update +##### 2.0.13 - Mon Jul 19 08:54:47 2021 +0000 +- [OpenConceptLab/ocl_issues#846](https://github.com/OpenConceptLab/ocl_issues/issues/846) | Concept/Mapping queryset (without search) | refactoring and combining filters in criterion | removes duplicate results +- [OpenConceptLab/ocl_issues#830](https://github.com/OpenConceptLab/ocl_issues/issues/830) | /changelog API to read changelog file directly from github +- [OpenConceptLab/ocl_issues#845](https://github.com/OpenConceptLab/ocl_issues/issues/845) Timeout fetching Locales, adding migration files +##### 2.0.12 - Fri Jul 9 13:26:39 2021 +0000 +- Caching result of export path till the duration of self +- Created indexes on concept/mapping updated_at +- [OpenConceptLab/ocl_issues#830](https://github.com/OpenConceptLab/ocl_issues/issues/830) | /changelog API to listdown changelog (HTML) +- [OpenConceptLab/ocl_issues#830](https://github.com/OpenConceptLab/ocl_issues/issues/830) | change logs to have issue numbers as links +- [OpenConceptLab/ocl_issues#830](https://github.com/OpenConceptLab/ocl_issues/issues/830) | python script to generate changelog/release-notes +##### 2.0.11 - Fri Jul 9 03:49:04 2021 +0000 +- [OpenConceptLab/ocl_issues#823](https://github.com/OpenConceptLab/ocl_issues/issues/823) | includeMappings/includeInverseMappings for a collection's concept will now use the collection's scope +- [OpenConceptLab/ocl_issues#829](https://github.com/OpenConceptLab/ocl_issues/issues/829) | users lists can be filtered by last login before/since +- on org save adding creator/updater as member +- collection concept reference add to decode concept uri +- Fixing concept get for encoded strings diff --git a/core/common/checksums.py b/core/common/checksums.py index d7947de4..6b16c237 100644 --- a/core/common/checksums.py +++ b/core/common/checksums.py @@ -335,7 +335,6 @@ def __init__(self, concepts_diff, mappings_diff, identity='mnemonic', verbosity= self.mappings_diff = mappings_diff self.identity = identity self.verbosity = verbosity - self.enrich = verbosity >= 4 self.result = {} def get_mapping_summary(self, mapping, mapping_id=None, v1_mapping=None): @@ -347,7 +346,7 @@ def get_mapping_summary(self, mapping, mapping_id=None, v1_mapping=None): 'to_source': mapping.to_source_url, 'map_type': mapping.map_type, } - if self.enrich: + if self.verbosity >= 4: summary['external_id'] = getattr(mapping, 'external_id', None) if v1_mapping is not None: summary['prev_to_concept'] = ( @@ -430,9 +429,10 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many traversed_mappings = set() traversed_concepts = set() diff_keys = ['new', 'removed', 'changed_retired', 'changed_major', 'changed_minor'] + is_enriched = self.verbosity >= 4 - concepts_cache = self._build_concepts_cache(diff_keys) if self.enrich else {} - mappings_cache = self._build_mappings_cache(diff_keys) if self.enrich else {} + concepts_cache = self._build_concepts_cache(diff_keys) if is_enriched else {} + mappings_cache = self._build_mappings_cache(diff_keys) if is_enriched else {} for key in diff_keys: # pylint: disable=too-many-nested-blocks diff = self.concepts_diff.result.get(key, False) @@ -443,7 +443,7 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many continue traversed_concepts.add(concept_id) concept_db_id = self.concepts_diff.get_db_id_for(key, concept_id) - if self.enrich: + if is_enriched: concept = concepts_cache.get(concept_db_id) else: concept = Concept.objects.filter(id=concept_db_id).first() @@ -454,7 +454,7 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many 'id': concept_id, 'display_name': concept_display_name } - if self.enrich and concept: + if is_enriched and concept: summary['concept_class'] = getattr(concept, 'concept_class', None) summary['datatype'] = getattr(concept, 'datatype', None) summary['names'] = self._names_list(concept) @@ -480,7 +480,7 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many if mapping_diff_key not in mappings_diff_summary: mappings_diff_summary[mapping_diff_key] = [] v1_mapping = None - if self.enrich and mapping_diff_key in ('changed_major', 'changed_minor'): + if is_enriched and mapping_diff_key in ('changed_major', 'changed_minor'): v1_mapping = self._v1_mapping_for( get(mapping, self.identity), mapping.id, mappings_cache ) @@ -508,7 +508,7 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many mapping_db_id = self.mappings_diff.get_db_id_for(key, mapping_id) mapping = Mapping.objects.filter(id=mapping_db_id).first() v1_mapping = None - if self.enrich and key in ('changed_major', 'changed_minor'): + if is_enriched and key in ('changed_major', 'changed_minor'): v1_mapping = self._v1_mapping_for(mapping_id, mapping_db_id, mappings_cache) mapping_summary = self.get_mapping_summary(mapping, mapping_id, v1_mapping=v1_mapping) from_concept_code = get(mapping, 'from_concept_code') or get(mapping.from_concept, 'mnemonic') diff --git a/core/integration_tests/tests_sources.py b/core/integration_tests/tests_sources.py index 50b9f7aa..ada6a500 100644 --- a/core/integration_tests/tests_sources.py +++ b/core/integration_tests/tests_sources.py @@ -18,7 +18,7 @@ from core.concepts.documents import ConceptDocument from core.concepts.models import Concept from core.concepts.serializers import ConceptVersionExportSerializer -from core.concepts.tests.factories import ConceptFactory, ConceptNameFactory +from core.concepts.tests.factories import ConceptDescriptionFactory, ConceptFactory, ConceptNameFactory from core.mappings.documents import MappingDocument from core.mappings.models import Mapping from core.mappings.serializers import MappingDetailSerializer @@ -2017,6 +2017,177 @@ def test_post_success(self, bundle_clone_mock): **parameters ) +class SourceVersionsChangelogOutputViewTest(OCLAPITestCase): + def _build_changelog_output_fixture(self): + source = OrganizationSourceFactory() + source_v1 = OrganizationSourceFactory(mnemonic=source.mnemonic, organization=source.organization, version='v1') + source_v2 = OrganizationSourceFactory(mnemonic=source.mnemonic, organization=source.organization, version='v2') + concept_v1 = ConceptFactory( + parent=source, + mnemonic='concept-detailed', + concept_class='Diagnosis', + datatype='None', + names=[ + ConceptNameFactory.build(name='Detailed name v1', locale='en', locale_preferred=True), + ], + descriptions=[ + ConceptDescriptionFactory.build(name='Detailed description v1', locale='en'), + ], + ) + concept_v2 = ConceptFactory( + parent=source, + mnemonic=concept_v1.mnemonic, + version='v2', + concept_class='Drug', + datatype='Text', + names=[ + ConceptNameFactory.build(name='Detailed name v2', locale='en', locale_preferred=True), + ConceptNameFactory.build(name='Nome detalhado', locale='pt', locale_preferred=False), + ], + descriptions=[ + ConceptDescriptionFactory.build(name='Detailed description v2', locale='en'), + ], + ) + mapping_from_concept = ConceptFactory(parent=source, mnemonic='mapping-from-concept') + mapping_target_v1 = ConceptFactory(parent=source, mnemonic='mapping-target-v1') + mapping_target_v2 = ConceptFactory(parent=source, mnemonic='mapping-target-v2') + mapping_v1 = MappingFactory( + parent=source, + mnemonic='mapping-detailed', + from_concept=mapping_from_concept, + to_concept=mapping_target_v1, + external_id='mapping-v1', + ) + mapping_v2 = MappingFactory( + parent=source, + mnemonic=mapping_v1.mnemonic, + version='v2', + from_concept=mapping_from_concept, + to_concept=mapping_target_v2, + map_type='NARROWER-THAN', + external_id='mapping-v2', + ) + + source_v1.concepts.add(concept_v1) + source_v2.concepts.add(concept_v2) + source_v1.mappings.add(mapping_v1) + source_v2.mappings.add(mapping_v2) + + for concept in Concept.objects.filter(parent=source): + concept.set_checksums() + + for mapping in Mapping.objects.filter(parent=source): + mapping.set_checksums() + + return { + 'concept_v1': concept_v1, + 'concept_v2': concept_v2, + 'mapping_v1': mapping_v1, + 'mapping_v2': mapping_v2, + 'source': source, + 'source_v1': source_v1, + 'source_v2': source_v2, + } + + def _post_changelog(self, source_v1, source_v2, token, verbosity, output): # pylint: disable=too-many-arguments + return self.client.post( + f'/sources/$changelog/?inline=true&output={output}', + { + 'version1': source_v1.uri, + 'version2': source_v2.uri, + 'verbosity': verbosity, + }, + HTTP_AUTHORIZATION=f'Token {token}', + format='json' + ) + + def test_json_output_for_all_verbosity_levels(self): + data = self._build_changelog_output_fixture() + token = data['source'].created_by.get_token() + + for verbosity in range(1, 5): + with self.subTest(output='json', verbosity=verbosity): + response = self._post_changelog( + data['source_v1'], data['source_v2'], token, verbosity, output='json' + ) + + self.assertEqual(response.status_code, 200) + self.assertNotIn('markdown', response.data) + self.assertEqual(response.data['meta']['diff']['concepts']['changed_major'], 1) + self.assertEqual(response.data['meta']['diff']['mappings']['changed_major'], 1) + + changed_concept = response.data['concepts']['changed_major']['concept-detailed'] + changed_mapping = response.data['mappings']['changed_major']['mapping-detailed'] + + if verbosity >= 4: + self.assertEqual(changed_concept['concept_class'], data['concept_v2'].concept_class) + self.assertEqual(changed_concept['prev_concept_class'], data['concept_v1'].concept_class) + self.assertEqual(changed_concept['datatype'], data['concept_v2'].datatype) + self.assertEqual(changed_concept['prev_datatype'], data['concept_v1'].datatype) + self.assertIn('Detailed name v2', [name['name'] for name in changed_concept['names']]) + self.assertIn('Nome detalhado', [name['name'] for name in changed_concept['names']]) + self.assertIn('Detailed name v1', [name['name'] for name in changed_concept['prev_names']]) + self.assertIn( + 'Detailed description v2', + [description['description'] for description in changed_concept['descriptions']] + ) + self.assertIn( + 'Detailed description v1', + [description['description'] for description in changed_concept['prev_descriptions']] + ) + self.assertEqual(changed_mapping['external_id'], data['mapping_v2'].external_id) + self.assertEqual(changed_mapping['prev_to_concept'], data['mapping_v1'].to_concept.mnemonic) + self.assertEqual(changed_mapping['to_concept'], data['mapping_v2'].to_concept.mnemonic) + self.assertEqual(changed_mapping['prev_map_type'], data['mapping_v1'].map_type) + self.assertEqual(changed_mapping['map_type'], data['mapping_v2'].map_type) + else: + self.assertNotIn('concept_class', changed_concept) + self.assertNotIn('prev_concept_class', changed_concept) + self.assertNotIn('datatype', changed_concept) + self.assertNotIn('prev_datatype', changed_concept) + self.assertNotIn('names', changed_concept) + self.assertNotIn('prev_names', changed_concept) + self.assertNotIn('descriptions', changed_concept) + self.assertNotIn('prev_descriptions', changed_concept) + self.assertNotIn('external_id', changed_mapping) + self.assertNotIn('prev_to_concept', changed_mapping) + self.assertNotIn('prev_map_type', changed_mapping) + + def test_markdown_output_for_all_verbosity_levels(self): + data = self._build_changelog_output_fixture() + token = data['source'].created_by.get_token() + + for verbosity in range(1, 5): + with self.subTest(output='markdown', verbosity=verbosity): + response = self._post_changelog( + data['source_v1'], data['source_v2'], token, verbosity, output='markdown' + ) + + self.assertEqual(response.status_code, 200) + self.assertIn('markdown', response.data) + self.assertEqual(response.data['meta']['diff']['concepts']['changed_major'], 1) + self.assertEqual(response.data['meta']['diff']['mappings']['changed_major'], 1) + + markdown_output = response.data['markdown'] + self.assertIn('# v2 Changelog', markdown_output) + self.assertIn('## Concepts', markdown_output) + self.assertIn('## Mappings', markdown_output) + + if verbosity >= 4: + self.assertNotIn('without enrichment', markdown_output) + self.assertIn('## Names', markdown_output) + self.assertIn('## Translations', markdown_output) + self.assertIn('Detailed name v1', markdown_output) + self.assertIn('Detailed name v2', markdown_output) + self.assertIn('Nome detalhado', markdown_output) + self.assertIn('Previous To Concept', markdown_output) + self.assertIn('mapping-target-v1', markdown_output) + self.assertIn('mapping-target-v2', markdown_output) + else: + self.assertIn('without enrichment', markdown_output) + self.assertNotIn('## Names', markdown_output) + self.assertNotIn('## Translations', markdown_output) + class SourceVersionsComparisonViewTest(OCLAPITestCase): def test_post_200(self): # pylint: disable=too-many-locals,too-many-statements diff --git a/docker-compose.override.yml.bak b/docker-compose.override.yml.bak index 108410e2..f66f356f 100644 --- a/docker-compose.override.yml.bak +++ b/docker-compose.override.yml.bak @@ -59,13 +59,6 @@ services: - celery_bulk_import_root environment: - DEBUG=${DEBUG-TRUE} - - EXPORT_SERVICE=core.services.storages.cloud.minio.MinIO - - MINIO_ENDPOINT=rustfs:9000 - - MINIO_EXTERNAL_ENDPOINT=${MINIO_EXTERNAL_ENDPOINT-localhost:${MINIO_PORT:-9000}} - - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY-rustfsadmin} - - MINIO_SECRET_KEY=${MINIO_SECRET_KEY-rustfsadmin} - - MINIO_BUCKET_NAME=${MINIO_BUCKET_NAME-oclapi2-dev} - - MINIO_SECURE=${MINIO_SECURE-false} celery_beat: build: . volumes: From 124bdca6a221216d963ed3ac2ea41f5647a1bcad Mon Sep 17 00:00:00 2001 From: Filipe Lopes Date: Thu, 23 Apr 2026 22:48:03 -0300 Subject: [PATCH 4/4] refactor(common): name checksum verbosity levels * Introduce named constants for checksum diff and changelog verbosity thresholds * Replace raw numeric verbosity checks with constants in diff and changelog generation * Add docstring explaining how diff group structures vary across verbosity levels --- core/common/checksums.py | 48 +++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/core/common/checksums.py b/core/common/checksums.py index 6b16c237..2c146a52 100644 --- a/core/common/checksums.py +++ b/core/common/checksums.py @@ -4,6 +4,22 @@ from pydash import get +# Return only aggregate counts for changed resource groups. +SUMMARY_VERBOSITY = 0 + +# Include aggregate counts for resources that stayed the same. +SAME_STATS_VERBOSITY = 1 + +# Include resource IDs for new, removed, retired, and changed resources. +DIFF_RESOURCE_IDS_VERBOSITY = 2 + +# Include resource IDs for resources that stayed the same. +SAME_RESOURCE_IDS_VERBOSITY = 3 + +# Include expanded changelog fields such as names, descriptions, and previous values. +CHANGELOG_ENRICHMENT_VERBOSITY = 4 + + class ChecksumModel(models.Model): class Meta: abstract = True @@ -224,17 +240,17 @@ def common(self): @property def is_verbose(self): # include same stats, count only - return self.verbosity >= 1 + return self.verbosity >= SAME_STATS_VERBOSITY @property def is_very_verbose(self): # include IDS of new/changed/removed/retired - return self.verbosity >= 2 + return self.verbosity >= DIFF_RESOURCE_IDS_VERBOSITY @property def is_very_very_verbose(self): # include IDS of same - return self.verbosity >= 3 + return self.verbosity >= SAME_RESOURCE_IDS_VERBOSITY @property def include_same_stats(self): @@ -262,6 +278,13 @@ def populate_diff_from_common(self): self.same_standard[key] = info def get_struct(self, values, is_same=False): + """ + Return either a simple count or a detailed structure for a diff group. + + Changed groups include resource IDs at verbosity>=2, while unchanged + groups only include resource IDs at verbosity>=3 to keep lower + verbosity responses compact. + """ total = len(values or []) include_ids = self.is_very_very_verbose if is_same else self.is_very_verbose if include_ids: @@ -346,7 +369,7 @@ def get_mapping_summary(self, mapping, mapping_id=None, v1_mapping=None): 'to_source': mapping.to_source_url, 'map_type': mapping.map_type, } - if self.verbosity >= 4: + if self.verbosity >= CHANGELOG_ENRICHMENT_VERBOSITY: summary['external_id'] = getattr(mapping, 'external_id', None) if v1_mapping is not None: summary['prev_to_concept'] = ( @@ -429,10 +452,10 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many traversed_mappings = set() traversed_concepts = set() diff_keys = ['new', 'removed', 'changed_retired', 'changed_major', 'changed_minor'] - is_enriched = self.verbosity >= 4 + include_changelog_enrichment = self.verbosity >= CHANGELOG_ENRICHMENT_VERBOSITY - concepts_cache = self._build_concepts_cache(diff_keys) if is_enriched else {} - mappings_cache = self._build_mappings_cache(diff_keys) if is_enriched else {} + concepts_cache = self._build_concepts_cache(diff_keys) if include_changelog_enrichment else {} + mappings_cache = self._build_mappings_cache(diff_keys) if include_changelog_enrichment else {} for key in diff_keys: # pylint: disable=too-many-nested-blocks diff = self.concepts_diff.result.get(key, False) @@ -443,7 +466,7 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many continue traversed_concepts.add(concept_id) concept_db_id = self.concepts_diff.get_db_id_for(key, concept_id) - if is_enriched: + if include_changelog_enrichment: concept = concepts_cache.get(concept_db_id) else: concept = Concept.objects.filter(id=concept_db_id).first() @@ -454,7 +477,7 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many 'id': concept_id, 'display_name': concept_display_name } - if is_enriched and concept: + if include_changelog_enrichment and concept: summary['concept_class'] = getattr(concept, 'concept_class', None) summary['datatype'] = getattr(concept, 'datatype', None) summary['names'] = self._names_list(concept) @@ -480,7 +503,10 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many if mapping_diff_key not in mappings_diff_summary: mappings_diff_summary[mapping_diff_key] = [] v1_mapping = None - if is_enriched and mapping_diff_key in ('changed_major', 'changed_minor'): + if ( + include_changelog_enrichment and + mapping_diff_key in ('changed_major', 'changed_minor') + ): v1_mapping = self._v1_mapping_for( get(mapping, self.identity), mapping.id, mappings_cache ) @@ -508,7 +534,7 @@ def process(self): # pylint: disable=too-many-locals,too-many-branches,too-many mapping_db_id = self.mappings_diff.get_db_id_for(key, mapping_id) mapping = Mapping.objects.filter(id=mapping_db_id).first() v1_mapping = None - if is_enriched and key in ('changed_major', 'changed_minor'): + if include_changelog_enrichment and key in ('changed_major', 'changed_minor'): v1_mapping = self._v1_mapping_for(mapping_id, mapping_db_id, mappings_cache) mapping_summary = self.get_mapping_summary(mapping, mapping_id, v1_mapping=v1_mapping) from_concept_code = get(mapping, 'from_concept_code') or get(mapping.from_concept, 'mnemonic')