diff --git a/openlobby/core/migrations/0010_user_name_collision_id.py b/openlobby/core/migrations/0010_user_has_colliding_name.py similarity index 64% rename from openlobby/core/migrations/0010_user_name_collision_id.py rename to openlobby/core/migrations/0010_user_has_colliding_name.py index 3295b6434b56aca0834b96f16b928735379fb4cc..5eae315ff2b9d87c1231b044675ca91c7611794d 100644 --- a/openlobby/core/migrations/0010_user_name_collision_id.py +++ b/openlobby/core/migrations/0010_user_has_colliding_name.py @@ -1,4 +1,4 @@ -# 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), ), ] diff --git a/openlobby/core/models.py b/openlobby/core/models.py index 74d21119c62a8c66b1dac89f4707c6bd9b01d9c8..0860348fe2cff13be8430b3c0f71eef7ead27c8d 100644 --- a/openlobby/core/models.py +++ b/openlobby/core/models.py @@ -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() diff --git a/tests/test_models.py b/tests/test_models.py index 3048752736590939a8b95c4210d424544768e18b..8988d6e97eecc723e106613874458dcc3462e650 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -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