Browse Source

Rename fullname to real_name, expose it to JS UI, reduce profile fields logging

Rafał Pitoń 7 years ago
parent
commit
94368a7066

+ 1 - 1
misago/project_template/project_name/settings.py

@@ -387,7 +387,7 @@ MISAGO_PROFILE_FIELDS = [
     {
     {
         'name': _("Personal"),
         'name': _("Personal"),
         'fields': [
         'fields': [
-            'misago.users.profilefields.default.FullNameField',
+            'misago.users.profilefields.default.RealNameField',
             'misago.users.profilefields.default.GenderField',
             'misago.users.profilefields.default.GenderField',
             'misago.users.profilefields.default.BioField',
             'misago.users.profilefields.default.BioField',
             'misago.users.profilefields.default.LocationField',
             'misago.users.profilefields.default.LocationField',

+ 1 - 0
misago/threads/serializers/post.py

@@ -12,6 +12,7 @@ __all__ = ['PostSerializer']
 UserSerializer = BaseUserSerializer.subset_fields(
 UserSerializer = BaseUserSerializer.subset_fields(
     'id',
     'id',
     'username',
     'username',
+    'real_name',
     'rank',
     'rank',
     'avatars',
     'avatars',
     'signature',
     'signature',

+ 4 - 0
misago/threads/serializers/thread.py

@@ -180,6 +180,8 @@ class ThreadsListSerializer(ThreadSerializer):
         if obj.starter_id:
         if obj.starter_id:
             return {
             return {
                 'id': obj.starter_id,
                 'id': obj.starter_id,
+                'username': obj.starter.username,
+                'real_name': obj.starter.get_real_name(),
                 'avatars': obj.starter.avatars,
                 'avatars': obj.starter.avatars,
             }
             }
         return None
         return None
@@ -188,6 +190,8 @@ class ThreadsListSerializer(ThreadSerializer):
         if obj.last_poster_id:
         if obj.last_poster_id:
             return {
             return {
                 'id': obj.last_poster_id,
                 'id': obj.last_poster_id,
+                'username': obj.last_poster.username,
+                'real_name': obj.last_poster.get_real_name(),
                 'avatars': obj.last_poster.avatars,
                 'avatars': obj.last_poster.avatars,
             }
             }
         return None
         return None

+ 1 - 0
misago/users/api/users.py

@@ -325,6 +325,7 @@ UserProfileSerializer = UserSerializer.subset_fields(
     'acl',
     'acl',
     'is_followed',
     'is_followed',
     'is_blocked',
     'is_blocked',
+    'real_name',
     'status',
     'status',
     'api',
     'api',
     'url',
     'url',

+ 3 - 0
misago/users/models/user.py

@@ -391,6 +391,9 @@ class User(AbstractBaseUser, PermissionsMixin):
     def get_short_name(self):
     def get_short_name(self):
         return self.username
         return self.username
 
 
+    def get_real_name(self):
+        return self.profile_fields.get('real_name')
+
     def set_username(self, new_username, changed_by=None):
     def set_username(self, new_username, changed_by=None):
         new_username = self.normalize_username(new_username)
         new_username = self.normalize_username(new_username)
         if new_username != self.username:
         if new_username != self.username:

+ 26 - 25
misago/users/profilefields/__init__.py

@@ -140,31 +140,32 @@ class ProfileFields(object):
                 new_fields[fieldname] = form.cleaned_data[fieldname]
                 new_fields[fieldname] = form.cleaned_data[fieldname]
         user.profile_fields = new_fields
         user.profile_fields = new_fields
 
 
-        if old_fields != new_fields:
-            if request.user == user:
-                log_message = "{} edited own profile fields".format(user.username)
-            else:
-                log_message = "{} edited {}'s (#{}) profile fields".format(request.user, user.username, user.pk)
-
-            logger.info(
-                log_message,
-                extra={
-                    'old_fields': old_fields,
-                    'new_fields': new_fields,
-
-                    'tags': {
-                        'absolute_url': request.build_absolute_uri(
-                            reverse(
-                                'misago:user-details',
-                                kwargs={
-                                    'slug': user.slug,
-                                    'pk': user.pk,
-                                },
-                            )
-                        ),
-                    },
-                }
-            )
+        old_fields_reduced = {k: v for k, v in old_fields.items() if v}
+        new_fields_reduced = {k: v for k, v in new_fields.items() if v}
+
+        if old_fields_reduced != new_fields_reduced:
+            self.log_profile_fields_update(request, user)
+
+    def log_profile_fields_update(self, request, user):
+        if request.user == user:
+            log_message = "{} edited own profile fields".format(user.username)
+        else:
+            log_message = "{} edited {}'s (#{}) profile fields".format(request.user, user.username, user.pk)
+
+        logger.info(
+            log_message,
+            extra={
+                'absolute_url': request.build_absolute_uri(
+                    reverse(
+                        'misago:user-details',
+                        kwargs={
+                            'slug': user.slug,
+                            'pk': user.pk,
+                        },
+                    )
+                ),
+            }
+        )
 
 
     def search_users(self, criteria, queryset):
     def search_users(self, criteria, queryset):
         if not self.is_loaded:
         if not self.is_loaded:

+ 3 - 3
misago/users/profilefields/default.py

@@ -13,9 +13,9 @@ class BioField(basefields.UrlifiedTextareaProfileField):
     label = _("Bio")
     label = _("Bio")
 
 
 
 
-class FullNameField(basefields.TextProfileField):
-    fieldname = 'fullname'
-    label = _("Full name")
+class RealNameField(basefields.TextProfileField):
+    fieldname = 'real_name'
+    label = _("Real name")
 
 
 
 
 class LocationField(basefields.TextProfileField):
 class LocationField(basefields.TextProfileField):

+ 6 - 0
misago/users/serializers/user.py

@@ -34,6 +34,7 @@ class UserSerializer(serializers.ModelSerializer, MutableFields):
     is_followed = serializers.SerializerMethodField()
     is_followed = serializers.SerializerMethodField()
     is_blocked = serializers.SerializerMethodField()
     is_blocked = serializers.SerializerMethodField()
     meta = serializers.SerializerMethodField()
     meta = serializers.SerializerMethodField()
+    real_name = serializers.SerializerMethodField()
     status = serializers.SerializerMethodField()
     status = serializers.SerializerMethodField()
 
 
     api = serializers.SerializerMethodField()
     api = serializers.SerializerMethodField()
@@ -62,6 +63,7 @@ class UserSerializer(serializers.ModelSerializer, MutableFields):
             'is_blocked',
             'is_blocked',
 
 
             'meta',
             'meta',
+            'real_name',
             'status',
             'status',
 
 
             'api',
             'api',
@@ -92,6 +94,9 @@ class UserSerializer(serializers.ModelSerializer, MutableFields):
     def get_meta(self, obj):
     def get_meta(self, obj):
         return {'score': obj.score}
         return {'score': obj.score}
 
 
+    def get_real_name(self, obj):
+        return obj.get_real_name()
+
     def get_signature(self, obj):
     def get_signature(self, obj):
         if obj.has_valid_signature:
         if obj.has_valid_signature:
             return obj.signature_parsed
             return obj.signature_parsed
@@ -194,6 +199,7 @@ UserCardSerializer = UserSerializer.subset_fields(
     'followers',
     'followers',
     'threads',
     'threads',
     'posts',
     'posts',
+    'real_name',
     'status',
     'status',
     'url',
     'url',
 )
 )

+ 1 - 1
misago/users/tests/test_profilefields.py

@@ -110,7 +110,7 @@ class ProfileFieldsLoadTests(TestCase):
 
 
     def test_field_correct_field(self):
     def test_field_correct_field(self):
         """util loads correct field"""
         """util loads correct field"""
-        field_path = 'misago.users.profilefields.default.FullNameField'
+        field_path = 'misago.users.profilefields.default.RealNameField'
 
 
         profilefields = ProfileFields([
         profilefields = ProfileFields([
             {
             {

+ 8 - 0
misago/users/tests/test_user_model.py

@@ -136,3 +136,11 @@ class UserModelTests(TestCase):
         user_from_db = User.objects.get(pk=user.pk)
         user_from_db = User.objects.get(pk=user.pk)
         self.assertFalse(user_from_db.is_active)
         self.assertFalse(user_from_db.is_active)
         self.assertTrue(user_from_db.is_deleting_account)
         self.assertTrue(user_from_db.is_deleting_account)
+
+    def test_get_real_name(self):
+        """get_real_name returns user-set real name or none"""
+        user = User.objects.create_user('Bob', 'bob@example.com', 'Pass.123')
+        self.assertIsNone(user.get_real_name())
+
+        user.profile_fields['real_name'] = 'Bob Boberson'
+        self.assertEqual(user.get_real_name(), 'Bob Boberson')

+ 1 - 1
misago/users/views/profile.py

@@ -197,5 +197,5 @@ class UserBanView(ProfileView):
 UserProfileSerializer = UserSerializer.subset_fields(
 UserProfileSerializer = UserSerializer.subset_fields(
     'id', 'username', 'slug', 'email', 'joined_on', 'rank', 'title', 'avatars', 'is_avatar_locked',
     'id', 'username', 'slug', 'email', 'joined_on', 'rank', 'title', 'avatars', 'is_avatar_locked',
     'signature', 'is_signature_locked', 'followers', 'following', 'threads', 'posts', 'acl',
     'signature', 'is_signature_locked', 'followers', 'following', 'threads', 'posts', 'acl',
-    'is_followed', 'is_blocked', 'status', 'api', 'url'
+    'is_followed', 'is_blocked', 'real_name', 'status', 'api', 'url'
 )
 )