Browse Source

wip #865: read only fields

Rafał Pitoń 8 years ago
parent
commit
21c9b8d44a

+ 3 - 0
misago/users/profilefields/basefields.py

@@ -82,6 +82,9 @@ class ProfileField(object):
         }
         }
 
 
     def search_users(self, criteria, queryset):
     def search_users(self, criteria, queryset):
+        if self.readonly:
+            return None
+
         return Q(**{
         return Q(**{
             'profile_fields__{}__contains'.format(self.fieldname): criteria
             'profile_fields__{}__contains'.format(self.fieldname): criteria
         })
         })

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

@@ -87,5 +87,5 @@ class LastIpField(basefields.TextProfileField):
             return None
             return None
 
 
         return {
         return {
-            'text': user.last_ip
+            'text': user.last_ip or user.joined_from_ip
         }
         }

+ 35 - 1
misago/users/tests/test_bio_profilefield.py

@@ -120,7 +120,26 @@ class BioProfileFieldTests(AdminTestCase):
         test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
         test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
 
 
         response = self.client.get(test_link)
         response = self.client.get(test_link)
-        self.assertEqual(response.json()['groups'], [])
+        self.assertEqual(
+            response.json()['groups'],
+            [
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
+            ]
+        )
 
 
         self.user.profile_fields['bio'] = 'I am Bob!\n\nThis is <b>my</b> bio!'
         self.user.profile_fields['bio'] = 'I am Bob!\n\nThis is <b>my</b> bio!'
         self.user.save()
         self.user.save()
@@ -139,6 +158,21 @@ class BioProfileFieldTests(AdminTestCase):
                         }
                         }
                     ],
                     ],
                 },
                 },
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
             ]
             ]
         )
         )
 
 

+ 75 - 3
misago/users/tests/test_gender_profilefield.py

@@ -170,7 +170,26 @@ class GenderProfileFieldTests(AdminTestCase):
         test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
         test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
 
 
         response = self.client.get(test_link)
         response = self.client.get(test_link)
-        self.assertEqual(response.json()['groups'], [])
+        self.assertEqual(
+            response.json()['groups'],
+            [
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
+            ]
+        )
 
 
         self.user.profile_fields['gender'] = 'male'
         self.user.profile_fields['gender'] = 'male'
         self.user.save()
         self.user.save()
@@ -189,6 +208,21 @@ class GenderProfileFieldTests(AdminTestCase):
                         }
                         }
                     ],
                     ],
                 },
                 },
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
             ]
             ]
         )
         )
 
 
@@ -197,13 +231,51 @@ class GenderProfileFieldTests(AdminTestCase):
         test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
         test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
 
 
         response = self.client.get(test_link)
         response = self.client.get(test_link)
-        self.assertEqual(response.json()['groups'], [])
+        self.assertEqual(
+            response.json()['groups'],
+            [
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
+            ]
+        )
 
 
         self.user.profile_fields['gender'] = 'invalid'
         self.user.profile_fields['gender'] = 'invalid'
         self.user.save()
         self.user.save()
 
 
         response = self.client.get(test_link)
         response = self.client.get(test_link)
-        self.assertEqual(response.json()['groups'], [])
+        self.assertEqual(
+            response.json()['groups'],
+            [
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
+            ]
+        )
 
 
     def test_api_returns_field_json(self):
     def test_api_returns_field_json(self):
         """field json is returned from API"""
         """field json is returned from API"""

+ 144 - 0
misago/users/tests/test_lastip_profilefield.py

@@ -0,0 +1,144 @@
+from django.contrib.auth import get_user_model
+from django.urls import reverse
+from django.utils import six
+
+from misago.admin.testutils import AdminTestCase
+from misago.acl.testutils import override_acl
+
+
+UserModel = get_user_model()
+
+
+class LastIpProfileFieldTests(AdminTestCase):
+    def setUp(self):
+        super(LastIpProfileFieldTests, self).setUp()
+
+        self.test_link = reverse(
+            'misago:admin:users:accounts:edit',
+            kwargs={
+                'pk': self.user.pk,
+            },
+        )
+
+    def test_field_hidden_in_admin(self):
+        """readonly field doesn't display in the admin"""
+        response = self.client.get(self.test_link)
+        self.assertNotContains(response, 'name="last_ip"')
+        self.assertNotContains(response, "IP address")
+        self.assertNotContains(response, "Last IP")
+
+    def test_admin_edits_field(self):
+        """admin form allows admins to edit field"""
+        response = self.client.post(
+            self.test_link,
+            data={
+                'username': 'Edited',
+                'rank': six.text_type(self.user.rank_id),
+                'roles': six.text_type(self.user.roles.all()[0].pk),
+                'email': 'reg@stered.com',
+                'last_ip': '127.0.0.1',
+                'new_password': '',
+                'signature': '',
+                'is_signature_locked': '0',
+                'is_hiding_presence': '0',
+                'limits_private_thread_invites_to': '0',
+                'signature_lock_staff_message': '',
+                'signature_lock_user_message': '',
+                'subscribe_to_started_threads': '2',
+                'subscribe_to_replied_threads': '2',
+            }
+        )
+        self.assertEqual(response.status_code, 302)
+
+        self.reload_user()
+        self.assertNotIn('last_ip', self.user.profile_fields)
+
+    def test_admin_search_field(self):
+        """admin users search searches this field"""
+        test_link = reverse('misago:admin:users:accounts:index')
+
+        response = self.client.get('{}?redirected=1&profilefields=127.0.0.1'.format(test_link))
+        self.assertContains(response, "No users matching search criteria have been found.")
+
+    def test_field_display(self):
+        """field displays on user profile"""
+        test_link = reverse(
+            'misago:user-details',
+            kwargs={
+                'pk': self.user.pk,
+                'slug': self.user.slug,
+            },
+        )
+
+        response = self.client.get(test_link)
+        self.assertContains(response, "IP address")
+        self.assertContains(response, "Last IP")
+        self.assertContains(response, "127.0.0.1")
+
+        # IP fields tests ACL before displaying
+        override_acl(self.user, {
+            'can_see_users_ips': 0
+        })
+
+        response = self.client.get(test_link)
+        self.assertNotContains(response, "IP address")
+        self.assertNotContains(response, "Last IP")
+        self.assertNotContains(response, "127.0.0.1")
+
+    def test_field_display_json(self):
+        """field is included in display json"""
+        test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
+
+        response = self.client.get(test_link)
+        self.assertEqual(
+            response.json()['groups'],
+            [
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
+            ]
+        )
+
+        # IP fields tests ACL before displaying
+        override_acl(self.user, {
+            'can_see_users_ips': 0
+        })
+
+        response = self.client.get(test_link)
+        self.assertEqual(response.json()['groups'], [])
+
+    def test_field_not_in_edit_json(self):
+        """readonly field json is not returned from API"""
+        test_link = reverse('misago:api:user-edit-details', kwargs={'pk': self.user.pk})
+
+        response = self.client.get(test_link)
+
+        found_field = None
+        for group in response.json():
+            for field in group['fields']:
+                if field['fieldname'] == 'last_ip':
+                    found_field = field
+
+        self.assertIsNone(found_field)
+
+    def test_field_is_not_editable_in_api(self):
+        """readonly field can't be edited via api"""
+        test_link = reverse('misago:api:user-edit-details', kwargs={'pk': self.user.pk})
+
+        response = self.client.post(test_link, data={'last_ip': '88.12.13.14'})
+        self.assertEqual(response.status_code, 200)
+
+        self.reload_user()
+        self.assertNotIn('last_ip', self.user.profile_fields)

+ 35 - 1
misago/users/tests/test_twitter_profilefield.py

@@ -144,7 +144,26 @@ class TwitterProfileFieldTests(AdminTestCase):
         test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
         test_link = reverse('misago:api:user-details', kwargs={'pk': self.user.pk})
 
 
         response = self.client.get(test_link)
         response = self.client.get(test_link)
-        self.assertEqual(response.json()['groups'], [])
+        self.assertEqual(
+            response.json()['groups'],
+            [
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
+            ]
+        )
 
 
         self.user.profile_fields['twitter'] = 'lorem_ipsum'
         self.user.profile_fields['twitter'] = 'lorem_ipsum'
         self.user.save()
         self.user.save()
@@ -164,6 +183,21 @@ class TwitterProfileFieldTests(AdminTestCase):
                         }
                         }
                     ],
                     ],
                 },
                 },
+                {
+                    'name': 'IP address',
+                    'fields': [
+                        {
+                            'fieldname': 'join_ip',
+                            'name': 'Join IP',
+                            'text': '127.0.0.1',
+                        },
+                        {
+                            'fieldname': 'last_ip',
+                            'name': 'Last IP',
+                            'text': '127.0.0.1',
+                        },
+                    ],
+                },
             ]
             ]
         )
         )