def testGuessFriendlyIdentifierField(self): """ Test guessing a user friendly identifier field """ fields = QgsFields() self.assertFalse( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields)) fields.append(QgsField('id', QVariant.Int)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'id') self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierFieldV2(fields), ('id', False)) fields.append(QgsField('name', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'name') self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierFieldV2(fields), ('name', True)) fields.append(QgsField('title', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'name') self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierFieldV2(fields), ('name', True)) # regardless of actual field order, we prefer "name" over "title" fields = QgsFields() fields.append(QgsField('title', QVariant.String)) fields.append(QgsField('name', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'name') # test with an "anti candidate", which is a substring which makes a field containing "name" less preferred... fields = QgsFields() fields.append(QgsField('id', QVariant.Int)) fields.append(QgsField('typename', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'typename') fields.append(QgsField('title', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'title') fields = QgsFields() fields.append(QgsField('id', QVariant.Int)) fields.append(QgsField('classname', QVariant.String)) fields.append(QgsField('x', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'classname') fields.append(QgsField('desc', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'desc') fields = QgsFields() fields.append(QgsField('id', QVariant.Int)) fields.append(QgsField('areatypename', QVariant.String)) fields.append(QgsField('areaadminname', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'areaadminname') # if no good matches by name found, the first string field should be used fields = QgsFields() fields.append(QgsField('id', QVariant.Int)) fields.append(QgsField('date', QVariant.Date)) fields.append(QgsField('station', QVariant.String)) fields.append(QgsField('org', QVariant.String)) self.assertEqual( QgsVectorLayerUtils.guessFriendlyIdentifierField(fields), 'station')