Skip to content

Commit

Permalink
Refonte de l'affichage du badge staff (#4240)
Browse files Browse the repository at this point in the history
* Refonte de l'affichage du badge staff

* Petite optimisation de la migration

* Nom et dépendance du fichier de migration

* Erreur lors du rebase

* Migration revue

* Corrige le problème lors de la migration initiale
  • Loading branch information
GCodeur authored and pierre-24 committed Apr 3, 2017
1 parent 24028ff commit d526faa
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 8 deletions.
38 changes: 38 additions & 0 deletions zds/member/migrations/0009_profile_show_staff_badge.py
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import migrations, models

from django.contrib.auth.models import User, Permission
from zds.member.models import Profile
from django.db.models import Q


def forwards_func(apps, schema_editor):
# Check for each user if the staff badge should be displayed
try:
staff_perm = Permission.objects.get(codename='change_post')
staffs = User.objects.filter(
Q(groups__permissions=staff_perm) |
Q(user_permissions=staff_perm) |
Q(is_superuser=True)
).distinct()
Profile.objects.filter(user__in=staffs).update(show_staff_badge=True)
except Permission.DoesNotExist:
pass


class Migration(migrations.Migration):

dependencies = [
('member', '0008_remove_profile_sdz_tutorial'),
]

operations = [
migrations.AddField(
model_name='profile',
name='show_staff_badge',
field=models.BooleanField(default=False, verbose_name='Afficher le badge staff'),
),
migrations.RunPython(forwards_func),
]
18 changes: 18 additions & 0 deletions zds/member/models.py
Expand Up @@ -62,6 +62,7 @@ class Meta:
is_hover_enabled = models.BooleanField('Déroulement au survol ?', default=True)
allow_temp_visual_changes = models.BooleanField('Activer les changements visuels temporaires', default=True)
email_for_answer = models.BooleanField('Envoyer pour les réponse MP', default=False)
show_staff_badge = models.BooleanField('Afficher le badge staff', default=False)
can_read = models.BooleanField('Possibilité de lire', default=True)
end_ban_read = models.DateTimeField("Fin d'interdiction de lecture", null=True, blank=True)
can_write = models.BooleanField("Possibilité d'écrire", default=True)
Expand Down Expand Up @@ -389,6 +390,23 @@ def remove_token_github_on_removing_from_dev_group(sender, instance, **kwargs):
pass


@receiver(models.signals.post_save, sender=User)
def update_staff_badge(sender, instance, **kwargs):
"""
This signal is used to update the field show_staff_badge of the user profile, which is used
to know if the staff badge should be displayed for this user.
The badge is displayed when the user has the perm forum.change_post.
"""
try:
user_profile = instance.profile
old_staff_badge = instance.profile.show_staff_badge
user_profile.show_staff_badge = instance.has_perm('forum.change_post')
if user_profile.show_staff_badge != old_staff_badge:
user_profile.save()
except Profile.DoesNotExist:
pass


@python_2_unicode_compatible
class TokenForgotPassword(models.Model):
"""
Expand Down
9 changes: 1 addition & 8 deletions zds/utils/templatetags/profile.py
Expand Up @@ -9,8 +9,6 @@

register = template.Library()

perms = {'forum.change_post': {}}


@register.filter('profile')
def profile(current_user):
Expand Down Expand Up @@ -69,13 +67,8 @@ def state(current_user):
user_state = 'BAN'
elif not user_profile.can_write_now():
user_state = 'LS'
elif current_user.pk in perms['forum.change_post'] and perms['forum.change_post'][current_user.pk]:
elif user_profile.show_staff_badge:
user_state = 'STAFF'
elif current_user.pk not in perms['forum.change_post']:
perms['forum.change_post'][current_user.pk] = current_user.has_perm('forum.change_post')
user_state = None
if perms['forum.change_post'][current_user.pk]:
user_state = 'STAFF'
else:
user_state = None
except Profile.DoesNotExist:
Expand Down
31 changes: 31 additions & 0 deletions zds/utils/templatetags/tests/test_profile.py
@@ -0,0 +1,31 @@
from django.test import TestCase

from zds.utils.templatetags.profile import state
from zds.member.factories import ProfileFactory


class ProfileTest(TestCase):
def test_staff_badge(self):
user = ProfileFactory()

self.assertEqual(None, state(user.user))

result = self.client.get(
user.get_absolute_url(),
follow=False
)
self.assertEqual(200, result.status_code)
self.assertNotContains(result, 'Staff')

# Make the user superuser to give him the staff perms
user.user.is_superuser = True
user.user.save()

self.assertEqual('STAFF', state(user.user))

result = self.client.get(
user.get_absolute_url(),
follow=False
)
self.assertEqual(200, result.status_code)
self.assertContains(result, 'Staff')

0 comments on commit d526faa

Please sign in to comment.