Skip to content
Snippets Groups Projects
Commit d32ca713 authored by jan.bednarik's avatar jan.bednarik
Browse files

Instead of complicated name collision ids for Users just set flag has colliding name.

parent 2c10c1c5
No related branches found
No related tags found
No related merge requests found
# Generated by Django 2.0.2 on 2018-02-20 20:28 # Generated by Django 2.0.2 on 2018-02-21 11:45
from django.db import migrations, models from django.db import migrations, models
...@@ -12,7 +12,7 @@ class Migration(migrations.Migration): ...@@ -12,7 +12,7 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AddField( migrations.AddField(
model_name='user', model_name='user',
name='name_collision_id', name='has_colliding_name',
field=models.IntegerField(default=0), field=models.BooleanField(default=False),
), ),
] ]
...@@ -13,15 +13,16 @@ class User(AbstractUser): ...@@ -13,15 +13,16 @@ class User(AbstractUser):
openid_uid = models.CharField(max_length=255, null=True) openid_uid = models.CharField(max_length=255, null=True)
extra = JSONField(null=True, blank=True) extra = JSONField(null=True, blank=True)
is_author = models.BooleanField(default=False) is_author = models.BooleanField(default=False)
name_collision_id = models.IntegerField(default=0) has_colliding_name = models.BooleanField(default=False)
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
# deal with first name and last name collisions # deal with first name and last name collisions
collisions = User.objects.filter(first_name=self.first_name, last_name=self.last_name)\ if self.is_author:
.order_by('-name_collision_id') collisions = User.objects.filter(first_name=self.first_name, last_name=self.last_name,
if len(collisions) > 0 and self not in collisions: is_author=True).exclude(id=self.id)
self.name_collision_id = collisions[0].name_collision_id + 1 if collisions.count() > 0:
# TODO when we allow name change, it should also reset name_collision_id self.has_colliding_name = True
collisions.update(has_colliding_name=True)
super().save(*args, **kwargs) super().save(*args, **kwargs)
...@@ -66,4 +67,6 @@ class Report(models.Model): ...@@ -66,4 +67,6 @@ class Report(models.Model):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super().save(*args, **kwargs) super().save(*args, **kwargs)
User.objects.filter(id=self.author.id).update(is_author=True) if not self.author.is_author:
self.author.is_author = True
self.author.save()
...@@ -77,27 +77,34 @@ def test_login_attempt__default_expiration(): ...@@ -77,27 +77,34 @@ def test_login_attempt__default_expiration():
def test_user__no_name_collision(): def test_user__no_name_collision():
User.objects.create(username='a', first_name='Ryan', last_name='Gosling') User.objects.create(username='a', is_author=True, first_name='Ryan', last_name='Gosling')
User.objects.create(username='b', first_name='Burt', last_name='Reynolds') User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Reynolds')
user = User.objects.create(username='c', first_name='Ryan', last_name='Reynolds') assert User.objects.get(username='a').has_colliding_name is False
assert user.name_collision_id == 0 assert User.objects.get(username='b').has_colliding_name is False
def test_user__name_collision(): def test_user__name_collision():
u1 = User.objects.create(username='a', first_name='Ryan', last_name='Gosling') User.objects.create(username='a', is_author=True, first_name='Ryan', last_name='Gosling')
u2 = User.objects.create(username='b', first_name='Ryan', last_name='Gosling') User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Gosling')
u3 = User.objects.create(username='c', first_name='Ryan', last_name='Gosling') assert User.objects.get(username='a').has_colliding_name is True
assert u1.name_collision_id == 0 assert User.objects.get(username='b').has_colliding_name is True
assert u2.name_collision_id == 1
assert u3.name_collision_id == 2
def test_user__name_collision_affects_only_authors():
User.objects.create(username='a', is_author=False, first_name='Ryan', last_name='Gosling')
def test_user__name_collision_is_not_updated_for_existing_user(): User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Gosling')
u1 = User.objects.create(username='a', first_name='Ryan', last_name='Reynolds') User.objects.create(username='c', is_author=False, first_name='Ryan', last_name='Gosling')
u2 = User.objects.create(username='b', first_name='Ryan', last_name='Reynolds') assert User.objects.get(username='a').has_colliding_name is False
assert u1.name_collision_id == 0 assert User.objects.get(username='b').has_colliding_name is False
assert u2.name_collision_id == 1 assert User.objects.get(username='c').has_colliding_name is False
u1.save() User.objects.create(username='d', is_author=True, first_name='Ryan', last_name='Gosling')
u2.save() assert User.objects.get(username='a').has_colliding_name is False
assert u1.name_collision_id == 0 assert User.objects.get(username='b').has_colliding_name is True
assert u2.name_collision_id == 1 assert User.objects.get(username='c').has_colliding_name is False
assert User.objects.get(username='d').has_colliding_name is True
def test_user__name_collision_excludes_self_on_update():
u = User.objects.create(username='a', is_author=True, first_name='Ryan', last_name='Gosling')
u.save()
assert User.objects.get(username='a').has_colliding_name is False
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment