def setUp(self):
     super().init_data()
     self.group = G(Group)
     self.klass = G(Klass, schema=[{'name': 'a', 'type': 'string'}],
                    name='test',
                    description='test',
                    objects_acl={'*': Klass.get_endpoint_acl_permission_values()},
                    acl={'*': Klass.get_acl_permission_values()})
     G(Membership, user=self.user, group=self.group)
     self.group_2 = G(Group)
     self.channel = G(Channel,
                      name='channel',
                      acl={'groups': {str(self.group_2.id): 'publish'}})
     self.url = reverse('v2:dataobject-list', args=(self.instance.name, self.klass.name))
Example #2
0
    def test_adding_with_profile(self):
        klass = Klass.get_user_profile()
        klass.schema = [{'type': 'reference', 'target': 'self', 'name': 'ref'}]
        klass.save()

        data = {
            'username': '******',
            'password': '******',
            'profile': {
                'group_permissions': 'write'
            }
        }
        response = self.client.post(self.url, data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)

        user = User.objects.last()
        self.assertEqual(user.username, data['username'])
        self.assertTrue(user.check_password(data['password']))
        profile = self._get_user_profile(user)
        self.assertEqual(profile.group_permissions, Role.ROLE_CHOICES.WRITE)

        data = {
            'username': '******',
            'password': '******',
            'profile': {
                'ref': profile.id
            }
        }
        response = self.client.post(self.url, data)
        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertEqual(response.data['profile']['ref'], {
            'type': 'reference',
            'target': 'self',
            'value': profile.id
        })
Example #3
0
    def prepare_profile(self, object_list):
        """
        Add User Profile Object to each User.
        Django ORM is kinda stupid and we cannot do select_related on filtered reverse relation.
        So this is a workaround to at have instead of a lookup per User, one batch lookup.
        """
        user_profile_klass = Klass.get_user_profile()
        profile_map = {}
        obj_list = []
        for obj in object_list:
            if hasattr(obj,
                       '_profile_cache') and obj._profile_cache is not None:
                profile_map[obj.id] = obj._profile_cache
            else:
                obj_list.append(obj)

        if obj_list:
            profiles = DataObject.objects.filter(_klass=user_profile_klass,
                                                 owner__in=obj_list)

            for profile in profiles:
                profile._klass = user_profile_klass
                profile_map[profile.owner_id] = profile

        return profile_map
Example #4
0
 def __init__(self, *args, **kwargs):
     # Skip loading cache during schema generation
     if 'context' in kwargs and kwargs['context'].get(
             'include_dynamic_fields', True):
         user_profile_klass = Klass.get_user_profile()
         DataObject.load_klass(user_profile_klass)
     super().__init__(*args, **kwargs)
Example #5
0
    def setUp(self):
        super().init_data('admin')
        self.url = reverse(self.url_name,
                           args=(
                               self.instance.name,
                               self.user.id,
                           ))

        with override_settings(POST_TRANSACTION_SUCCESS_EAGER=True):
            klass = Klass.get_user_profile()
            klass.schema = [{'type': 'datetime', 'name': 'datetime'}]
            klass.save()
Example #6
0
    def setUp(self):
        super().setUp()
        self.url = reverse(self.url_name, args=(self.instance.name, ))

        set_current_instance(self.instance)
        user_profile = Klass.get_user_profile()
        user_profile.schema = [{
            'name': 'int',
            'type': 'integer',
            'filter_index': True
        }]
        user_profile.save()

        # Add one random dataobject to make ids not in line with users
        G(DataObject)

        DataObject.load_klass(user_profile)
        self.user1 = User.objects.create(username='******',
                                         password='******',
                                         profile_data={'int': 100})
        self.user2 = User.objects.create(username='******',
                                         password='******',
                                         profile_data={'int': 150})
Example #7
0
 def initial(self, request, *args, **kwargs):
     initial = super().initial(request, *args, **kwargs)
     self.klass = Klass.get_user_profile()
     DataObject.load_klass(self.klass)
     return initial
Example #8
0
 def initialize_request(self, request, *args, **kwargs):
     request = super().initialize_request(request, *args, **kwargs)
     if request.instance:
         self.klass = Klass.get_user_profile()
     return request
 def create_trigger(self):
     return Trigger.objects.create(signal='post_create',
                                   codebox=self.codebox,
                                   klass=Klass.get_user_profile())
Example #10
0
 def get_lookup(self, value):
     return DataObject.objects.get(_klass=Klass.get_user_profile(),
                                   owner=value)
Example #11
0
 def _get_user_profile(self, user):
     user_profile_klass = Klass.get_user_profile()
     return DataObject.objects.filter(_klass=user_profile_klass,
                                      owner=user).get()
Example #12
0
 def _get_profile(cls, instance):
     user_profile_klass = Klass.get_user_profile()
     return DataObject.objects.filter(
         _klass=user_profile_klass,
         owner=instance).select_for_update().get()