Esempio n. 1
0
 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>"
     )
Esempio n. 2
0
 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>')
Esempio n. 3
0
 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>')
Esempio n. 4
0
 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>")
Esempio n. 5
0
    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'
            })
Esempio n. 6
0
    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)
Esempio n. 7
0
    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