Skip to content

Commit

Permalink
OpenConceptLab/ocl_issues#1213 | checksum algo to return same checksu…
Browse files Browse the repository at this point in the history
…m for array of one element vs element
  • Loading branch information
snyaggarwal committed Apr 20, 2023
1 parent 858b334 commit 071b496
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 18 deletions.
36 changes: 19 additions & 17 deletions core/common/checksums.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,29 +21,28 @@ class Meta:
ALL_CHECKSUM_KEY = 'all'

def get_checksums(self):
if not Toggle.get('CHECKSUMS_TOGGLE'):
return
if self.checksums:
return self.checksums
if Toggle.get('CHECKSUMS_TOGGLE'):
if self.checksums:
return self.checksums

self.set_checksums()
self.set_checksums()

return self.checksums
return self.checksums

def set_checksums(self):
self.checksums = self._calculate_checksums()
self.save()
if Toggle.get('CHECKSUMS_TOGGLE'):
self.checksums = self._calculate_checksums()
self.save()

@property
def checksum(self):
if not Toggle.get('CHECKSUMS_TOGGLE'):
return
"""Returns the checksum of the model instance or metadata only checksum."""
if get(self, f'checksums.{self.METADATA_CHECKSUM_KEY}'):
return self.checksums[self.METADATA_CHECKSUM_KEY]
self.get_checksums()
if Toggle.get('CHECKSUMS_TOGGLE'):
if get(self, f'checksums.{self.METADATA_CHECKSUM_KEY}'):
return self.checksums[self.METADATA_CHECKSUM_KEY]
self.get_checksums()

return self.checksums.get(self.METADATA_CHECKSUM_KEY)
return self.checksums.get(self.METADATA_CHECKSUM_KEY)

def get_checksum_fields(self):
result = {
Expand All @@ -57,9 +56,8 @@ def get_checksum_fields(self):
return result

def get_basic_checksums(self):
if not Toggle.get('CHECKSUMS_TOGGLE'):
return
return {self.METADATA_CHECKSUM_KEY: self._calculate_meta_checksum()}
if Toggle.get('CHECKSUMS_TOGGLE'):
return {self.METADATA_CHECKSUM_KEY: self._calculate_meta_checksum()}

def get_all_checksums(self):
return self.get_basic_checksums()
Expand All @@ -74,6 +72,8 @@ def generate_queryset_checksum(queryset):
for instance in queryset:
instance.get_checksums()
_checksums.append(instance.checksum)
if len(_checksums) == 1:
return _checksums[0]
return ChecksumModel.generate_checksum(_checksums)

def _calculate_meta_checksum(self):
Expand All @@ -98,6 +98,8 @@ def generate(cls, obj, hash_algorithm='MD5'):

@classmethod
def _serialize(cls, obj):
if isinstance(obj, list) and len(obj) == 1:
obj = obj[0]
if isinstance(obj, list):
return f"[{','.join(map(cls._serialize, generic_sort(obj)))}]"

Expand Down
2 changes: 2 additions & 0 deletions core/common/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ class OCLAPITestCase(APITestCase, BaseTestCase):
def setUpClass(cls):
super().setUpClass()
call_command("loaddata", "core/fixtures/base_entities.yaml")
call_command("loaddata", "core/fixtures/toggles.json")
org = Organization.objects.get(id=1)
org.members.add(1)

Expand All @@ -220,6 +221,7 @@ def setUpClass(cls):
super().setUpClass()
call_command("loaddata", "core/fixtures/base_entities.yaml")
call_command("loaddata", "core/fixtures/auth_groups.yaml")
call_command("loaddata", "core/fixtures/toggles.json")

@staticmethod
def factory_to_params(factory_klass, **kwargs):
Expand Down
2 changes: 1 addition & 1 deletion core/common/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -914,5 +914,5 @@ class ChecksumView(APIView):
)
def post(self, request):
if not request.data:
return Response(status=status.HTTP_400_BAD_REQUEST)
return Response({'error': 'Request body is required'}, status=status.HTTP_400_BAD_REQUEST)
return Response(Checksum.generate(request.data))

0 comments on commit 071b496

Please sign in to comment.