Example #1
0
    def test_group_constraint(self):
        """Test model with group constraint"""

        self.assertTrue(self._check_subset_string())

        admin01 = self.test_user1
        group1 = admin01.groups.all()[0]
        world = self.world
        constraint = SingleLayerConstraint(layer=world, active=True)
        constraint.save()

        rule = ConstraintSubsetStringRule(constraint=constraint,
                                          group=group1,
                                          rule="NAME != 'ITALY'")
        rule.save()

        self.assertEqual(rule.user_or_group, group1)
        self.assertEqual(
            ConstraintSubsetStringRule.get_constraints_for_user(
                admin01, world)[0], rule)
        constraint.active = False
        constraint.save()
        self.assertEqual(
            ConstraintSubsetStringRule.get_active_constraints_for_user(
                admin01, world), [])
        constraint.active = True
        constraint.save()
        self.assertEqual(
            ConstraintSubsetStringRule.get_active_constraints_for_user(
                admin01, world)[0], rule)
        self.assertEqual(
            ConstraintSubsetStringRule.get_rule_definition_for_user(
                admin01, world.pk), "(NAME != 'ITALY')")

        self.assertFalse(self._check_subset_string())
Example #2
0
    def layerFilterSubsetString(self, layer):
        """Retrieve and sets user layer constraints"""

        try:
            qdjango_layer = Layer.objects.get(project=QGS_SERVER.project, qgs_layer_id=layer.id())
        except Layer.DoesNotExist:
            return ""

        rule = ConstraintSubsetStringRule.get_rule_definition_for_user(QGS_SERVER.user, qdjango_layer.pk)
        QgsMessageLog.logMessage("SingleLayerSubsetStringAccessControlFilter rule for user %s and layer id %s: %s" % (QGS_SERVER.user, layer.id(), rule), "", Qgis.Info)
        return rule
Example #3
0
    def apply_filter(self, request, qgis_layer, qgis_feature_request, view):
        """Apply the filter to the QGIS feature request or the layer's subset string
        Warning: if the filter alters the layer instance (for example by settings a subset
        string) make sure to restore the original state or to work on a clone.
        """

        # get context from view, default 'v (view)'
        subset_string = ConstraintSubsetStringRule.get_rule_definition_for_user(
            request.user, view.layer.pk, context=getattr(view, 'context', 'v'))
        if not subset_string:
            return

        original_subset_string = qgis_layer.subsetString()
        if original_subset_string:
            qgis_layer.setSubsetString(
                "({original_subset_string}) AND ({extra_subset_string})".
                format(original_subset_string=original_subset_string,
                       extra_subset_string=subset_string))
        else:
            qgis_layer.setSubsetString(subset_string)
Example #4
0
    def test_user_constraint(self):
        """Test model with user constraint"""

        self.assertTrue(self._check_subset_string())

        admin01 = self.test_user1
        constraint = SingleLayerConstraint(layer=self.world, active=True)
        constraint.save()

        rule = ConstraintSubsetStringRule(constraint=constraint,
                                          user=admin01,
                                          rule="NAME != 'ITALY'")
        rule.save()

        self.assertEqual(rule.user_or_group, admin01)
        self.assertEqual(
            ConstraintSubsetStringRule.get_constraints_for_user(
                admin01, self.world)[0], rule)
        constraint.active = False
        constraint.save()
        self.assertEqual(
            ConstraintSubsetStringRule.get_active_constraints_for_user(
                admin01, self.world), [])
        constraint.active = True
        constraint.save()
        self.assertEqual(
            ConstraintSubsetStringRule.get_active_constraints_for_user(
                admin01, self.world)[0], rule)
        self.assertEqual(
            ConstraintSubsetStringRule.get_rule_definition_for_user(
                admin01, self.world.pk), "(NAME != 'ITALY')")

        self.assertFalse(self._check_subset_string())

        self.assertEqual(constraint.layer_name, 'world')
        self.assertEqual(constraint.qgs_layer_id, 'world20181008111156525')
        self.assertEqual(constraint.rule_count, 1)
Example #5
0
    def test_shp_api(self):
        """Test that the filter applies to shp api"""

        world = self.world
        world.download = True
        world.save()
        response = self._testApiCallAdmin01(
            'core-vector-api',
            args={
                'mode_call': 'shp',
                'project_type': 'qdjango',
                'project_id': self.qdjango_project.id,
                # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                # WARNING: it's the qgs_layer_id, not the name!
                # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                'layer_name': world.qgs_layer_id,
            }.values())
        self.assertEqual(response.status_code, 200)
        z = zipfile.ZipFile(BytesIO(response.content))
        temp = QTemporaryDir()
        z.extractall(temp.path())
        vl = QgsVectorLayer(temp.path())
        self.assertTrue(vl.isValid())
        vl.getFeatures(QgsFeatureRequest(QgsExpression('NAME = \'ITALY\'')))
        self.assertEqual(
            len([
                f for f in vl.getFeatures(
                    QgsFeatureRequest(QgsExpression('NAME = \'ITALY\'')))
            ]), 1)

        # Add a rule
        admin01 = self.test_user1
        group1 = admin01.groups.all()[0]
        world = self.world
        constraint = SingleLayerConstraint(layer=world, active=True)
        constraint.save()

        rule = ConstraintSubsetStringRule(constraint=constraint,
                                          group=group1,
                                          rule="NAME != 'ITALY'")
        rule.save()

        response = self._testApiCallAdmin01(
            'core-vector-api',
            args={
                'mode_call': 'shp',
                'project_type': 'qdjango',
                'project_id': self.qdjango_project.id,
                # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                # WARNING: it's the qgs_layer_id, not the name!
                # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                'layer_name': world.qgs_layer_id,
            }.values())
        self.assertEqual(response.status_code, 200)
        z = zipfile.ZipFile(BytesIO(response.content))
        temp = QTemporaryDir()
        z.extractall(temp.path())
        vl = QgsVectorLayer(temp.path())
        self.assertTrue(vl.isValid())
        self.assertEqual(
            len([
                f for f in vl.getFeatures(
                    QgsFeatureRequest(QgsExpression('NAME = \'ITALY\'')))
            ]), 0)

        self.assertEqual(
            len([
                f for f in vl.getFeatures(
                    QgsFeatureRequest(QgsExpression('NAME = \'GERMANY\'')))
            ]), 1)
Example #6
0
    def test_validate_sql(self):
        """Test rule validation"""

        admin01 = self.test_user1
        group1 = admin01.groups.all()[0]
        world = self.world
        constraint = SingleLayerConstraint(layer=world, active=True)
        constraint.save()

        rule = ConstraintSubsetStringRule(constraint=constraint,
                                          group=group1,
                                          rule="NAME != 'ITALY'")
        rule.save()

        self.assertTrue(rule.validate_sql()[0])

        rule.rule = "not a valid rule!"
        rule.save()

        self.assertFalse(rule.validate_sql()[0])

        # Valid syntax rule but wrong column name
        rule.rule = "NOT_IN_MY_NAME != 'ITALY'"
        rule.save()

        self.assertFalse(rule.validate_sql()[0])
Example #7
0
    def test_editing_api_with_constraint_by_group(self):
        """Test editing mode with contraint to single user gorup"""

        cities_layer_id = 'cities_54d40b01_2af8_4b17_8495_c5833485536e'
        cities_layer = self.editing_project.instance.layer_set.filter(
            qgs_layer_id=cities_layer_id)[0]

        # add test_suser_admin1 to scls.group
        self.test_user_admin1.groups.add(self.group)

        # CONSTRAINTS TEST
        # ----------------------------------------------
        # SUBSETSTRING RULE
        # ----------------------------------------------

        # Context 'v' (view)
        # ------------------
        constraint = SingleLayerConstraint(layer=cities_layer, active=True)
        constraint.save()

        rule = ConstraintSubsetStringRule(
            constraint=constraint,
            group=self.group,
            rule="name = 'Genova' OR name = 'Grosseto'")
        rule.save()

        response = self._testApiCall('editing-commit-vector-api', [
            'editing', 'qdjango', self.editing_project.instance.pk,
            cities_layer_id
        ])

        jres = json.loads(response.content)

        # check features
        self.assertEqual(len(jres['vector']['data']['features']), 481)

        # Context 've' (view +  editing)
        # ------------------------------
        constraint.for_editing = True
        constraint.save()

        response = self._testApiCall('editing-commit-vector-api', [
            'editing', 'qdjango', self.editing_project.instance.pk,
            cities_layer_id
        ])

        jres = json.loads(response.content)

        # check features
        self.assertEqual(len(jres['vector']['data']['features']), 2)

        # Context 'e' (editing)
        # ------------------------------
        constraint.for_view = False
        constraint.for_editing = True
        constraint.save()

        response = self._testApiCall('editing-commit-vector-api', [
            'editing', 'qdjango', self.editing_project.instance.pk,
            cities_layer_id
        ])

        jres = json.loads(response.content)

        # check features
        self.assertEqual(len(jres['vector']['data']['features']), 2)

        # EXPRESSION RULE
        # ----------------------------------------------

        constraint.for_view = True
        constraint.for_editing = False
        constraint.save()
        rule.delete()

        rule = ConstraintExpressionRule(
            constraint=constraint,
            group=self.group,
            rule=
            "\"name\" = 'Genova' OR \"name\" = 'Grosseto' OR \"name\" = 'Agliana'"
        )
        rule.save()

        # context 'v' (view)
        # ==================
        response = self._testApiCall('editing-commit-vector-api', [
            'editing', 'qdjango', self.editing_project.instance.pk,
            cities_layer_id
        ])

        jres = json.loads(response.content)

        # check features
        self.assertEqual(len(jres['vector']['data']['features']), 481)

        # context 've' (view + editing)
        # ==================
        constraint.for_editing = True
        constraint.save()

        response = self._testApiCall('editing-commit-vector-api', [
            'editing', 'qdjango', self.editing_project.instance.pk,
            cities_layer_id
        ])

        jres = json.loads(response.content)

        # check features
        self.assertEqual(len(jres['vector']['data']['features']), 3)

        # context 'e' (editing)
        # ==================
        constraint.for_editing = False
        constraint.for_editing = True
        constraint.save()

        response = self._testApiCall('editing-commit-vector-api', [
            'editing', 'qdjango', self.editing_project.instance.pk,
            cities_layer_id
        ])

        jres = json.loads(response.content)

        # check features
        self.assertEqual(len(jres['vector']['data']['features']), 3)

        # remove admin01 from group
        self.test_user_admin1.groups.remove(self.group)

        response = self._testApiCall('editing-commit-vector-api', [
            'editing', 'qdjango', self.editing_project.instance.pk,
            cities_layer_id
        ])

        jres = json.loads(response.content)

        # check features
        self.assertEqual(len(jres['vector']['data']['features']), 481)