def testFieldTooltip(self): f = QgsField('my_string', QVariant.String, 'string') self.assertEqual( QgsFieldModel.fieldToolTip(f), "<b>my_string</b><br><font style='font-family:monospace; white-space: nowrap;'>string NULL</font>" ) f.setAlias('my alias') self.assertEqual( QgsFieldModel.fieldToolTip(f), "<b>my alias</b> (my_string)<br><font style='font-family:monospace; white-space: nowrap;'>string NULL</font>" ) f.setLength(20) self.assertEqual( QgsFieldModel.fieldToolTip(f), "<b>my alias</b> (my_string)<br><font style='font-family:monospace; white-space: nowrap;'>string(20) NULL</font>" ) f = QgsField('my_real', QVariant.Double, 'real', 8, 3) self.assertEqual( QgsFieldModel.fieldToolTip(f), "<b>my_real</b><br><font style='font-family:monospace; white-space: nowrap;'>real(8, 3) NULL</font>" ) f.setComment('Comment text') self.assertEqual( QgsFieldModel.fieldToolTip(f), "<b>my_real</b><br><font style='font-family:monospace; white-space: nowrap;'>real(8, 3) NULL</font><br><em>Comment text</em>" )
def testFieldTooltip(self): f = QgsField('my_string', QVariant.String, 'string') self.assertEqual(QgsFieldModel.fieldToolTip(f), '<b>my_string</b><p>string</p>') f.setAlias('my alias') self.assertEqual(QgsFieldModel.fieldToolTip(f), '<b>my alias</b> (my_string)<p>string</p>') f.setLength(20) self.assertEqual(QgsFieldModel.fieldToolTip(f), '<b>my alias</b> (my_string)<p>string (20)</p>') f = QgsField('my_real', QVariant.Double, 'real', 8, 3) self.assertEqual(QgsFieldModel.fieldToolTip(f), '<b>my_real</b><p>real (8, 3)</p>')
def testFieldTooltipExtended(self): layer = QgsVectorLayer("Point?", "tooltip", "memory") f = QgsField('my_real', QVariant.Double, 'real', 8, 3, 'Comment text') layer.addExpressionField('1+1', f) layer.updateFields() self.assertEqual(QgsFieldModel.fieldToolTipExtended(QgsField('my_string', QVariant.String, 'string'), layer), '') self.assertEqual(QgsFieldModel.fieldToolTipExtended(f, layer), "<b>my_real</b><br><font style='font-family:monospace; white-space: nowrap;'>real(8, 3) NULL</font><br><em>Comment text</em><br><font style='font-family:monospace;'>1+1</font>") f.setAlias('my alias') constraints = f.constraints() constraints.setConstraint(QgsFieldConstraints.ConstraintUnique) f.setConstraints(constraints) self.assertEqual(QgsFieldModel.fieldToolTipExtended(f, layer), "<b>my alias</b> (my_real)<br><font style='font-family:monospace; white-space: nowrap;'>real(8, 3) NULL UNIQUE</font><br><em>Comment text</em><br><font style='font-family:monospace;'>1+1</font>")
def test_field_to_json(self): field = QgsField('my name', QVariant.LongLong) field.setAlias('my alias') self.assertEqual( QgsArcGisRestUtils.fieldDefinitionToJson(field), { 'alias': 'my alias', 'editable': True, 'name': 'my name', 'nullable': True, 'type': 'esriFieldTypeInteger' }) field = QgsField('my name', QVariant.Int) self.assertEqual( QgsArcGisRestUtils.fieldDefinitionToJson(field), { 'editable': True, 'name': 'my name', 'nullable': True, 'type': 'esriFieldTypeSmallInteger' }) field = QgsField('my name', QVariant.Double) self.assertEqual( QgsArcGisRestUtils.fieldDefinitionToJson(field), { 'editable': True, 'name': 'my name', 'nullable': True, 'type': 'esriFieldTypeDouble' }) field = QgsField('my name', QVariant.String) self.assertEqual( QgsArcGisRestUtils.fieldDefinitionToJson(field), { 'editable': True, 'name': 'my name', 'nullable': True, 'type': 'esriFieldTypeString' }) field = QgsField('my name', QVariant.DateTime) self.assertEqual( QgsArcGisRestUtils.fieldDefinitionToJson(field), { 'editable': True, 'name': 'my name', 'nullable': True, 'type': 'esriFieldTypeDate' }) field = QgsField('my name', QVariant.ByteArray) self.assertEqual( QgsArcGisRestUtils.fieldDefinitionToJson(field), { 'editable': True, 'name': 'my name', 'nullable': True, 'type': 'esriFieldTypeBlob' }) # unsupported type field = QgsField('my name', QVariant.Time) self.assertEqual( QgsArcGisRestUtils.fieldDefinitionToJson(field), { 'editable': True, 'name': 'my name', 'nullable': True, 'type': 'esriFieldTypeString' }) # not nullable field = QgsField('my name', QVariant.Int) field_constraints = field.constraints() field_constraints.setConstraint( QgsFieldConstraints.Constraint.ConstraintNotNull) field.setConstraints(field_constraints) self.assertEqual( QgsArcGisRestUtils.fieldDefinitionToJson(field), { 'editable': True, 'name': 'my name', 'nullable': False, 'type': 'esriFieldTypeSmallInteger' })
def json2features(self, url, data_layer=None): try: (response, content) = self.nam.request(url, method="GET") except RequestsException as e: self.info('ERROR: {}'.format(e)) return jsons = content.decode('utf-8') jsono = json.loads(jsons) #print(json.dumps(jsono, sort_keys=True, indent=4)) #print(jsono['height']) # creating memory layer with uri: # https://qgis.org/api/qgsmemoryproviderutils_8cpp_source.html if data_layer is None: data_layer = QgsVectorLayer('none', 'DHIS2 data', 'memory') fields = QgsFields() fields.append(QgsField('id', QVariant.String)) fields.append(QgsField('name', QVariant.String)) metadata_items = jsono['metaData']['items'] # create as much fields as there are pe_dx combinations # eg: 2017_birth, 2016_birth, 2017_measels, 2016_measels for pe in jsono['metaData']['dimensions']['pe']: for dx in jsono['metaData']['dimensions']['dx']: #field_alias = '{} {} ({})'.format(pe, metadata_items[dx]['name'], dx) field_alias = '{} {}'.format(pe, metadata_items[dx]['name']) field = QgsField('{}_{}'.format(pe, dx), QVariant.Double, comment=field_alias) field.setAlias(field_alias) fields.append(field) #self.info('Fields: {}'.format(fields)) # clean up first data_layer.dataProvider().deleteAttributes(data_layer.dataProvider().attributeIndexes()) data_layer.updateFields() # set new attributes data_layer.dataProvider().addAttributes(fields) data_layer.updateFields() # array with all features features = [] # map which maps the every feature to its OrganisationalUnit feature_map = {} # create a feature for every ou/OrganisationUnit # AND make sure it has the pe_dx combination fields for ou in jsono['metaData']['dimensions']['ou']: #print(ou) f = QgsFeature() # set fields f.setFields(fields) # set id and name of the feature f.setAttribute('id', ou) f.setAttribute('name', jsono['metaData']['items'][ou]['name']) # append feature to features array and feature map features.append(f) feature_map[ou] = f # dynamic? # currently the order in which they are in the url is below dx_idx = 0 pe_idx = 1 ou_idx = 2 value_idx = 3 # now every cell in the table has a 'row in the json data', with dx, pe, ou and value for row in jsono['rows']: # pick feature based on OrganisationalUnit-key from the feature_map f = feature_map[row[ou_idx]] # attribute key is created from pe_dx string attr = '{}_{}'.format(row[pe_idx], row[dx_idx]) # Births attended by skilled health personnel (estimated pregancies) f.setAttribute(attr, row[value_idx]) data_layer.dataProvider().addFeatures(features) # add it to the project QgsProject.instance().addMapLayer(data_layer) # 'save' the data url of the layer into the project properties # https://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/settings.html data_layer.setCustomProperty("dhis2_url", url)
def create_geopackage(project_type: ProjectType, file_path, crs, transform_context) -> None: """ Create the geopackage for the given path. """ encoding = 'UTF-8' driver_name = QgsVectorFileWriter.driverForExtension('gpkg') for table in project_type.layers: layer_path = str(tables[table]) if layer_path != 'None': layer_path += "?crs={}".format(crs.authid()) vector_layer = QgsVectorLayer(layer_path, table, "memory") data_provider = vector_layer.dataProvider() fields = QgsFields() path = resources_path('data_models', '{}.csv'.format(table)) csv = load_csv(table, path) for csv_feature in csv.getFeatures(): field = QgsField(name=csv_feature['name'], type=int(csv_feature['type'])) field.setComment(csv_feature['comment']) field.setAlias(csv_feature['alias']) fields.append(field) del csv # add fields data_provider.addAttributes(fields) vector_layer.updateFields() # set create file layer options options = QgsVectorFileWriter.SaveVectorOptions() options.driverName = driver_name options.fileEncoding = encoding options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteFile if os.path.exists(file_path): options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteLayer options.layerName = vector_layer.name() options.layerOptions = ['FID=id'] # write file if Qgis.QGIS_VERSION_INT >= 31900: write_result, error_message, _, _ = QgsVectorFileWriter.writeAsVectorFormatV3( vector_layer, file_path, transform_context, options) else: # 3.10 <= QGIS <3.18 write_result, error_message = QgsVectorFileWriter.writeAsVectorFormatV2( vector_layer, file_path, transform_context, options) # result if write_result != QgsVectorFileWriter.NoError: raise QgsProcessingException( '* ERROR: {}'.format(error_message)) del fields del data_provider del vector_layer