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])
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())
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)
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)
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)