Skip to content

Commit 1973829

Browse files
authored
Merge branch 'fix-duplicated-recs' of 'https://github.com/jjmerchante/grimoirelab-sortinghat'
Merges #1003 Closes #1003
2 parents 7ce9800 + 0192771 commit 1973829

File tree

3 files changed

+48
-0
lines changed

3 files changed

+48
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
title: Enforce merge recommendation integrity
3+
category: fixed
4+
author: null
5+
issue: 993
6+
notes: >
7+
Ensure merge recommendations are unique between
8+
individuals and prevent creating recommmendations
9+
with the same individual.
10+

sortinghat/core/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import datetime
2424

2525
import dateutil
26+
from django.db import IntegrityError
2627

2728
from django.db.models import (CASCADE,
2829
SET_NULL,
@@ -350,6 +351,15 @@ class Meta:
350351
db_table = 'merge_recommendations'
351352
unique_together = ('individual1', 'individual2')
352353

354+
def save(self, *args, **kwargs):
355+
# Ensure individual1.mk is always less than individual2.mk
356+
if self.individual1.mk > self.individual2.mk:
357+
self.individual1, self.individual2 = self.individual2, self.individual1
358+
elif self.individual1.mk == self.individual2.mk:
359+
raise IntegrityError("Cannot create a MergeRecommendation with the same individual.")
360+
361+
super().save(*args, **kwargs)
362+
353363
def __str__(self):
354364
return '%s - %s' % (self.individual1.mk, self.individual2.mk)
355365

tests/test_model.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,34 @@ def test_last_modified(self):
953953
self.assertGreaterEqual(merge_recom.last_modified, before_modified_dt)
954954
self.assertLessEqual(merge_recom.last_modified, after_modified_dt)
955955

956+
def test_individual_order_on_save(self):
957+
"""Check that individual1.mk is always less than individual2.mk"""
958+
959+
indiv1 = Individual.objects.create(mk='AAAA')
960+
indiv2 = Individual.objects.create(mk='BBBB')
961+
962+
# Create with individual1 > individual2
963+
rec = MergeRecommendation(individual1=indiv2, individual2=indiv1)
964+
rec.save()
965+
self.assertLessEqual(rec.individual1.mk, rec.individual2.mk)
966+
967+
rec.delete()
968+
969+
# Create with individual1 < individual2
970+
rec2 = MergeRecommendation(individual1=indiv1, individual2=indiv2)
971+
rec2.save()
972+
self.assertLessEqual(rec2.individual1.mk, rec2.individual2.mk)
973+
974+
def test_individual_different_on_save(self):
975+
"""Check that individual1 and individual2 are different"""
976+
977+
indiv1 = Individual.objects.create(mk='AAAA')
978+
979+
# Create with individual1 == individual2
980+
rec = MergeRecommendation(individual1=indiv1, individual2=indiv1)
981+
with self.assertRaises(IntegrityError):
982+
rec.save()
983+
956984

957985
class TestGenderRecommendation(TransactionTestCase):
958986
"""Unit tests for GenderRecommendation class"""

0 commit comments

Comments
 (0)