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
......@@ -12,7 +12,7 @@ class Migration(migrations.Migration):
operations = [
migrations.AddField(
model_name='user',
name='name_collision_id',
field=models.IntegerField(default=0),
name='has_colliding_name',
field=models.BooleanField(default=False),
),
]
......@@ -13,15 +13,16 @@ class User(AbstractUser):
openid_uid = models.CharField(max_length=255, null=True)
extra = JSONField(null=True, blank=True)
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):
# deal with first name and last name collisions
collisions = User.objects.filter(first_name=self.first_name, last_name=self.last_name)\
.order_by('-name_collision_id')
if len(collisions) > 0 and self not in collisions:
self.name_collision_id = collisions[0].name_collision_id + 1
# TODO when we allow name change, it should also reset name_collision_id
if self.is_author:
collisions = User.objects.filter(first_name=self.first_name, last_name=self.last_name,
is_author=True).exclude(id=self.id)
if collisions.count() > 0:
self.has_colliding_name = True
collisions.update(has_colliding_name=True)
super().save(*args, **kwargs)
......@@ -66,4 +67,6 @@ class Report(models.Model):
def save(self, *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():
def test_user__no_name_collision():
User.objects.create(username='a', first_name='Ryan', last_name='Gosling')
User.objects.create(username='b', first_name='Burt', last_name='Reynolds')
user = User.objects.create(username='c', first_name='Ryan', last_name='Reynolds')
assert user.name_collision_id == 0
User.objects.create(username='a', is_author=True, first_name='Ryan', last_name='Gosling')
User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Reynolds')
assert User.objects.get(username='a').has_colliding_name is False
assert User.objects.get(username='b').has_colliding_name is False
def test_user__name_collision():
u1 = User.objects.create(username='a', first_name='Ryan', last_name='Gosling')
u2 = User.objects.create(username='b', first_name='Ryan', last_name='Gosling')
u3 = User.objects.create(username='c', first_name='Ryan', last_name='Gosling')
assert u1.name_collision_id == 0
assert u2.name_collision_id == 1
assert u3.name_collision_id == 2
def test_user__name_collision_is_not_updated_for_existing_user():
u1 = User.objects.create(username='a', first_name='Ryan', last_name='Reynolds')
u2 = User.objects.create(username='b', first_name='Ryan', last_name='Reynolds')
assert u1.name_collision_id == 0
assert u2.name_collision_id == 1
u1.save()
u2.save()
assert u1.name_collision_id == 0
assert u2.name_collision_id == 1
User.objects.create(username='a', is_author=True, first_name='Ryan', last_name='Gosling')
User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Gosling')
assert User.objects.get(username='a').has_colliding_name is True
assert User.objects.get(username='b').has_colliding_name is True
def test_user__name_collision_affects_only_authors():
User.objects.create(username='a', is_author=False, first_name='Ryan', last_name='Gosling')
User.objects.create(username='b', is_author=True, first_name='Ryan', last_name='Gosling')
User.objects.create(username='c', is_author=False, first_name='Ryan', last_name='Gosling')
assert User.objects.get(username='a').has_colliding_name is False
assert User.objects.get(username='b').has_colliding_name is False
assert User.objects.get(username='c').has_colliding_name is False
User.objects.create(username='d', is_author=True, first_name='Ryan', last_name='Gosling')
assert User.objects.get(username='a').has_colliding_name is False
assert User.objects.get(username='b').has_colliding_name is True
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