Browse Source

#644 added subset exclude utility

Rafał Pitoń 8 years ago
parent
commit
ad1c8122d1
2 changed files with 41 additions and 1 deletions
  1. 19 0
      misago/core/serializers.py
  2. 22 1
      misago/core/tests/test_serializers.py

+ 19 - 0
misago/core/serializers.py

@@ -12,3 +12,22 @@ class Subsettable(object):
         return type(name, (cls,), {
         return type(name, (cls,), {
             'Meta': Meta
             'Meta': Meta
         })
         })
+
+    @classmethod
+    def subset_exclude(cls, *fields):
+        clean_fields = []
+        for field in cls.Meta.fields:
+            if field not in fields:
+                clean_fields.append(field)
+
+        fields_in_name = [f.title().replace('_', '') for f in clean_fields]
+        name = '{}{}Subset'.format(cls.__name__, ''.join(fields_in_name)[:100])
+
+        class Meta(cls.Meta):
+            pass
+
+        Meta.fields = tuple(clean_fields)
+
+        return type(name, (cls,), {
+            'Meta': Meta
+        })

+ 22 - 1
misago/core/tests/test_serializers.py

@@ -31,7 +31,28 @@ class SubsettableSerializerTests(TestCase):
             'last_poster_name': thread.last_poster_name,
             'last_poster_name': thread.last_poster_name,
         })
         })
 
 
-        self.assertFalse(TestSerializer.Meta.fields == fields)
+        self.assertFalse(TestSerializer.Meta.fields == serializer.Meta.fields)
+
+    def test_create_subset_serializer_exclude(self):
+        """classmethod exclude creates new serializer"""
+        category = Category.objects.get(slug='first-category')
+        thread = testutils.post_thread(category=category)
+
+        kept_fields = ('id', 'title', 'weight')
+        removed_fields = tuple(set(TestSerializer.Meta.fields) - set(kept_fields))
+
+        serializer = TestSerializer.subset_exclude(*removed_fields)
+        self.assertEqual(serializer.__name__, 'TestSerializerIdTitleWeightSubset')
+        self.assertEqual(serializer.Meta.fields, kept_fields)
+
+        serialized_thread = serializer(thread).data
+        self.assertEqual(serialized_thread, {
+            'id': thread.id,
+            'title': thread.title,
+            'weight': thread.weight,
+        })
+
+        self.assertFalse(TestSerializer.Meta.fields == serializer.Meta.fields)
 
 
 
 
 class TestSerializer(serializers.ModelSerializer, Subsettable):
 class TestSerializer(serializers.ModelSerializer, Subsettable):