def testVectorLayerUtilsUniqueWithProviderDefault(self): vl = QgsVectorLayer('%s table="qgis_test"."someData" sql=' % (self.dbconn), "someData", "postgres") default_clause = 'nextval(\'qgis_test."someData_pk_seq"\'::regclass)' vl.dataProvider().setProviderProperty(QgsDataProvider.EvaluateDefaultValues, False) self.assertEqual(vl.dataProvider().defaultValueClause(0), default_clause) self.assertTrue(QgsVectorLayerUtils.valueExists(vl, 0, 4)) vl.startEditing() f = QgsFeature(vl.fields()) f.setAttribute(0, default_clause) self.assertFalse(QgsVectorLayerUtils.valueExists(vl, 0, default_clause)) self.assertTrue(vl.addFeatures([f])) # the default value clause should exist... self.assertTrue(QgsVectorLayerUtils.valueExists(vl, 0, default_clause)) # but it should not prevent the attribute being validated self.assertTrue(QgsVectorLayerUtils.validateAttribute(vl, f, 0)) vl.rollBack()
def test_validate_attribute(self): """ test validating attributes against constraints """ layer = createLayerWithOnePoint() # field expression check layer.setConstraintExpression(1, 'fldint>5') f = QgsFeature(2) f.setAttributes(["test123", 6]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertTrue(res) self.assertEqual(len(errors), 0) f.setAttributes(["test123", 2]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 1) print(errors) # checking only for provider constraints res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1, origin=QgsFieldConstraints.ConstraintOriginProvider) self.assertTrue(res) self.assertEqual(len(errors), 0) # bad field expression check layer.setConstraintExpression(1, 'fldint>') res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 1) print(errors) layer.setConstraintExpression(1, None) # not null constraint f.setAttributes(["test123", NULL]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertTrue(res) self.assertEqual(len(errors), 0) layer.setFieldConstraint(1, QgsFieldConstraints.ConstraintNotNull) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 1) print(errors) # checking only for provider constraints res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1, origin=QgsFieldConstraints.ConstraintOriginProvider) self.assertTrue(res) self.assertEqual(len(errors), 0) # unique constraint f.setAttributes(["test123", 123]) layer.removeFieldConstraint(1, QgsFieldConstraints.ConstraintNotNull) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertTrue(res) self.assertEqual(len(errors), 0) layer.setFieldConstraint(1, QgsFieldConstraints.ConstraintUnique) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 1) print(errors) # checking only for provider constraints res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1, origin=QgsFieldConstraints.ConstraintOriginProvider) self.assertTrue(res) self.assertEqual(len(errors), 0) # checking only for soft constraints layer.setFieldConstraint(1, QgsFieldConstraints.ConstraintUnique, QgsFieldConstraints.ConstraintStrengthHard) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1, strength=QgsFieldConstraints.ConstraintStrengthSoft) self.assertTrue(res) self.assertEqual(len(errors), 0) # checking for hard constraints res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1, strength=QgsFieldConstraints.ConstraintStrengthHard) self.assertFalse(res) self.assertEqual(len(errors), 1) # check - same id should be ignored when testing for uniqueness f1 = QgsFeature(1) f1.setAttributes(["test123", 123]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f1, 1) self.assertTrue(res) self.assertEqual(len(errors), 0) # test double constraint failure layer.setConstraintExpression(1, 'fldint>5') layer.removeFieldConstraint(1, QgsFieldConstraints.ConstraintUnique) layer.setFieldConstraint(1, QgsFieldConstraints.ConstraintNotNull) f.setAttributes(["test123", NULL]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 2) print(errors)
def test_validate_attribute(self): """ test validating attributes against constraints """ layer = createLayerWithOnePoint() # field expression check layer.setConstraintExpression(1, 'fldint>5') f = QgsFeature(2) f.setAttributes(["test123", 6]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertTrue(res) self.assertEqual(len(errors), 0) f.setAttributes(["test123", 2]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 1) print(errors) # checking only for provider constraints res, errors = QgsVectorLayerUtils.validateAttribute( layer, f, 1, origin=QgsFieldConstraints.ConstraintOriginProvider) self.assertTrue(res) self.assertEqual(len(errors), 0) # bad field expression check layer.setConstraintExpression(1, 'fldint>') res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 1) print(errors) layer.setConstraintExpression(1, None) # not null constraint f.setAttributes(["test123", NULL]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertTrue(res) self.assertEqual(len(errors), 0) layer.setFieldConstraint(1, QgsFieldConstraints.ConstraintNotNull) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 1) print(errors) # checking only for provider constraints res, errors = QgsVectorLayerUtils.validateAttribute( layer, f, 1, origin=QgsFieldConstraints.ConstraintOriginProvider) self.assertTrue(res) self.assertEqual(len(errors), 0) # unique constraint f.setAttributes(["test123", 123]) layer.removeFieldConstraint(1, QgsFieldConstraints.ConstraintNotNull) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertTrue(res) self.assertEqual(len(errors), 0) layer.setFieldConstraint(1, QgsFieldConstraints.ConstraintUnique) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 1) print(errors) # checking only for provider constraints res, errors = QgsVectorLayerUtils.validateAttribute( layer, f, 1, origin=QgsFieldConstraints.ConstraintOriginProvider) self.assertTrue(res) self.assertEqual(len(errors), 0) # checking only for soft constraints layer.setFieldConstraint(1, QgsFieldConstraints.ConstraintUnique, QgsFieldConstraints.ConstraintStrengthHard) res, errors = QgsVectorLayerUtils.validateAttribute( layer, f, 1, strength=QgsFieldConstraints.ConstraintStrengthSoft) self.assertTrue(res) self.assertEqual(len(errors), 0) # checking for hard constraints res, errors = QgsVectorLayerUtils.validateAttribute( layer, f, 1, strength=QgsFieldConstraints.ConstraintStrengthHard) self.assertFalse(res) self.assertEqual(len(errors), 1) # check - same id should be ignored when testing for uniqueness f1 = QgsFeature(1) f1.setAttributes(["test123", 123]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f1, 1) self.assertTrue(res) self.assertEqual(len(errors), 0) # test double constraint failure layer.setConstraintExpression(1, 'fldint>5') layer.removeFieldConstraint(1, QgsFieldConstraints.ConstraintUnique) layer.setFieldConstraint(1, QgsFieldConstraints.ConstraintNotNull) f.setAttributes(["test123", NULL]) res, errors = QgsVectorLayerUtils.validateAttribute(layer, f, 1) self.assertFalse(res) self.assertEqual(len(errors), 2) print(errors)