Exemplo n.º 1
0
def create_data_html(fields, attributes, **kwargs) -> str:
    """
    Generate the html data for the info panel.
    :param fields: The fields to use in the data table.
    :param attributes: The attributes to use in the table.
    :param kwargs:
    :return: The generated html data that can be used in the info dock.
    """
    data = OrderedDict()
    items = []
    count = 0
    for field, value in zip(fields, attributes):
        if field == 'mapkey':
            continue
        name = "field_" + str(count)
        if value == NULL:
            value = ""
        data[name] = value
        if isinstance(value, str) and (value.lower().endswith('.jpg') or value.lower().endswith('.jpeg') or value.lower().endswith('.png')):
            item = u"<tr><td><a href=""${{{0}}}""><img width=""100%"" src=""${{{0}}}"" /></a></td></tr>".format(name)
        else:
            item = u"<tr><th>{0}</th> <td>${{{1}}}</td></tr>".format(field, name)
        items.append(item)
        count += 1
    rowtemple = Template(''.join(items))
    rowshtml = updateTemplate(data, rowtemple, **kwargs)
    return rowshtml
Exemplo n.º 2
0
    def generate_info(self, infoblock, project, layer, mapkey, feature, countlabel=None, lastresults=None):
        infoblockdef = project.info_query(infoblock, layer.name())
        isinfo1 = infoblock == "info1"

        if not infoblockdef:
            if isinfo1:
                infoblockdef = {}
                infoblockdef['type'] = 'feature'
            else:
                return None, []

        if isinfo1:
            caption = infoblockdef.get('caption', "Record")
        else:
            caption = infoblockdef.get('caption', "Related Record")

        results = []
        error = None
        if infoblockdef['type'] == 'sql':
            try:
                queryresults = self.results_from_query(infoblockdef, layer, feature, mapkey, lastresults=lastresults)
                if isinfo1 and not queryresults:
                    # If there is no results from the query and we are a info 1 block we grab from the feature.
                    results.append(self.results_from_feature(feature))
                else:
                    results = queryresults
            except database.DatabaseException as ex:
                if not isinfo1:
                    error = "<b> Error: {} <b>".format(ex.msg)
                else:
                    results.append(self.results_from_feature(feature))

        elif infoblockdef['type'] == 'feature':
            results.append(self.results_from_feature(feature))
        else:
            return None, []

        blocks = []
        for count, result in enumerate(results, start=1):
            if isinfo1 and count == 1:
                countblock = countblocktemplate.substitute(count=countlabel)
            else:
                countblock = ''

            fields = result.keys()
            attributes = result.values()
            rows = generate_rows(fields, attributes, imagepath=self.project.image_folder)
            blocks.append(updateTemplate(dict(ROWS=rows,
                                              HEADER=caption,
                                              CONTROLS=countblock),
                                         infoblocktemplate))
        if error:
            return error, []

        return '<br>'.join(blocks), results
Exemplo n.º 3
0
def generate_rows(fields, attributes):
    data = OrderedDict()
    items = []
    for field, value in zip(fields, attributes):
        if field == 'mapkey':
            continue
        data[field.replace(" ", "_")] = value
        item = u"<tr><th>{0}</th> <td>${{{1}}}</td></tr>".format(field, field.replace(" ", "_"))
        items.append(item)
    rowtemple = Template(''.join(items))
    rowshtml = updateTemplate(data, rowtemple)
    return rowshtml
Exemplo n.º 4
0
    def update(self, cursor):
        if cursor is None:
            return

        try:
            feature = cursor.feature
        except NoFeature as ex:
            utils.exception(ex)
            return

        form = cursor.form
        layer = cursor.layer

        clear_image_cache()

        self.countLabel.setText(str(cursor))

        info1, results = self.generate_info("info1",
                                            self.project,
                                            layer,
                                            feature.id(),
                                            feature,
                                            countlabel=str(cursor))
        info2, _ = self.generate_info("info2",
                                      self.project,
                                      layer,
                                      feature.id(),
                                      feature,
                                      lastresults=results[0])

        if form:
            name = "{}".format(layer.name(), form.label)
        else:
            name = layer.name()

        info = dict(TITLE=name, INFO1=info1, INFO2=info2)

        html = updateTemplate(info, infotemplate)

        self.attributesView.setHtml(html, templates.baseurl)
        tools = self.project.layer_tools(layer)
        hasform = not form is None
        print tools
        editattributes = 'edit_attributes' in tools or 'inspection' in tools or hasform
        print editattributes
        editgeom = 'edit_geom' in tools and hasform
        deletefeature = 'delete' in tools and hasform
        self.deleteFeatureButton.setVisible(deletefeature)
        self.quickInspectButton.setVisible('inspection' in tools)
        self.editButton.setVisible(editattributes)
        self.editGeomButton.setVisible(editgeom)
        self.featureupdated.emit(layer, feature, cursor.features)
Exemplo n.º 5
0
    def update(self, cursor):
        global image
        images = {}
        feature = cursor.feature
        fields = [field.name() for field in feature.fields()]
        data = OrderedDict()

        items = []
        for field, value in zip(fields, feature.attributes()):
            data[field] = value
            item = "<tr><th>{0}</th> <td>${{{0}}}</td></tr>".format(field)
            items.append(item)
        rowtemple = Template("".join(items))
        rowshtml = updateTemplate(data, rowtemple)

        form = cursor.form
        layer = cursor.layer
        if form:
            name = "{}".format(layer.name(), form.label)
        else:
            name = layer.name()

        info = dict(TITLE=name, ROWS=rowshtml)

        html = updateTemplate(info, template)
        base = os.path.dirname(os.path.abspath(__file__))
        baseurl = QUrl.fromLocalFile(base + "\\")

        if form:
            displaytext = form.settings.get("display", None)
            display = QgsExpression.replaceExpressionText(displaytext, cursor.feature, layer)
        else:
            display = str(feature[0])

        self.countlabel.setText(str(cursor))
        self.displaylabel.setText(display)
        self.attributesView.setHtml(html, baseurl)
        self.editButton.setVisible(not form is None)
        self.featureupdated.emit(layer, cursor.feature, cursor.features)
Exemplo n.º 6
0
    def update(self, cursor):
        if cursor is None:
            return

        try:
            feature = cursor.feature
        except NoFeature as ex:
            utils.warning(ex)
            return

        fields = [field.name() for field in feature.fields()]
        data = OrderedDict()

        items = []
        for field, value in zip(fields, feature.attributes()):
            data[field] = value
            item = u"<tr><th>{0}</th> <td>${{{0}}}</td></tr>".format(field)
            items.append(item)
        rowtemple = Template(''.join(items))
        rowshtml = updateTemplate(data, rowtemple)

        form = cursor.form
        layer = cursor.layer
        if form:
            name = "{}".format(layer.name(), form.label)
        else:
            name = layer.name()

        info = dict(TITLE=name,
                    ROWS=rowshtml)

        html = updateTemplate(info, template)

        self.countlabel.setText(str(cursor))
        self.attributesView.setHtml(html, templates.baseurl)
        self.editButton.setVisible(not form is None)
        self.editGeomButton.setVisible(not form is None)
        self.featureupdated.emit(layer, feature, cursor.features)
Exemplo n.º 7
0
    def update(self, cursor):
        if cursor is None:
            return

        try:
            feature = cursor.feature
        except NoFeature as ex:
            utils.warning(ex)
            return

        fields = [field.name() for field in feature.fields()]
        data = OrderedDict()

        items = []
        for field, value in zip(fields, feature.attributes()):
            data[field] = value
            item = u"<tr><th>{0}</th> <td>${{{0}}}</td></tr>".format(field)
            items.append(item)
        rowtemple = Template(''.join(items))
        rowshtml = updateTemplate(data, rowtemple)

        form = cursor.form
        layer = cursor.layer
        if form:
            name = "{}".format(layer.name(), form.label)
        else:
            name = layer.name()

        info = dict(TITLE=name, ROWS=rowshtml)

        html = updateTemplate(info, template)

        self.countlabel.setText(str(cursor))
        self.attributesView.setHtml(html, templates.baseurl)
        self.editButton.setVisible(not form is None)
        self.editGeomButton.setVisible(not form is None)
        self.featureupdated.emit(layer, feature, cursor.features)
Exemplo n.º 8
0
def generate_rows(fields, attributes, **kwargs):
    data = OrderedDict()
    items = []
    count = 0
    for field, value in zip(fields, attributes):
        if field == 'mapkey':
            continue
        name = "field_" + str(count)
        data[name] = value
        item = u"<tr><th>{0}</th> <td>${{{1}}}</td></tr>".format(field, name)
        items.append(item)
        count += 1
    rowtemple = Template(''.join(items))
    rowshtml = updateTemplate(data, rowtemple, **kwargs)
    return rowshtml
Exemplo n.º 9
0
    def update(self, cursor) -> None:
        """
        Update the data in the dock with the given cursor data.
        :param cursor: The cursor holding a pointer to the data and feature for the active feature.
        """
        if cursor is None:
            return

        try:
            feature = cursor.feature
        except NoFeature as ex:
            utils.exception(ex)
            return

        form = cursor.form
        layer = cursor.layer

        clear_image_cache()

        self.countLabel.setText(str(cursor))

        info1, results = self.generate_info("info1", self.project, layer, feature.id(), feature, countlabel=str(cursor))
        info2, _ = self.generate_info("info2", self.project, layer, feature.id(), feature, lastresults=results[0])

        if form:
            name = "{}".format(layer.name(), form.label)
        else:
            name = layer.name()

        info = dict(TITLE=name,
                    INFO1=info1,
                    INFO2=info2)

        html = updateTemplate(info, infotemplate)

        self.attributesView.setHtml(html, templates.baseurl)
        tools = self.project.layer_tools(layer)
        hasform = form is not None
        editattributes = ('edit_attributes' in tools or 'inspection' in tools) and hasform
        editgeom = 'edit_geom' in tools and hasform
        deletefeature = 'delete' in tools and hasform
        self.deleteFeatureButton.setVisible(deletefeature)
        self.quickInspectButton.setVisible('inspection' in tools)
        self.editButton.setVisible(editattributes)
        feature = cursor.feature
        self.editGeomButton.setVisible(editgeom)
        self.editGeomButton.setEnabled(True)
        self.featureupdated.emit(layer, feature, cursor.features)
Exemplo n.º 10
0
    def update(self, cursor):
        if cursor is None:
            return

        try:
            feature = cursor.feature
        except NoFeature as ex:
            utils.exception(ex)
            return


        form = cursor.form
        layer = cursor.layer

        clear_image_cache()

        self.countLabel.setText(str(cursor))

        info1, results = self.generate_info("info1", self.project, layer, feature.id(), feature, countlabel=str(cursor))
        info2, _= self.generate_info("info2", self.project, layer, feature.id(), feature, lastresults=results[0])

        if form:
            name = "{}".format(layer.name(), form.label)
        else:
            name = layer.name()

        info = dict(TITLE=name,
                    INFO1=info1,
                    INFO2=info2)

        html = updateTemplate(info, infotemplate)

        self.attributesView.setHtml(html, templates.baseurl)
        tools = self.project.layer_tools(layer)
        hasform = not form is None
        editattributes = 'edit_attributes' in tools or 'inspection' in tools and hasform
        editgeom = 'edit_geom' in tools and hasform
        deletefeature = 'delete' in tools and hasform
        self.deleteFeatureButton.setVisible(deletefeature)
        self.editButton.setVisible(editattributes)
        self.editGeomButton.setVisible(editgeom)
        self.featureupdated.emit(layer, feature, cursor.features)
Exemplo n.º 11
0
def create_data_html(fields, attributes, **kwargs) -> str:
    """
    Generate the html data for the info panel.
    :param fields: The fields to use in the data table.
    :param attributes: The attributes to use in the table.
    :param kwargs:
    :return: The generated html data that can be used in the info dock.
    """
    data = OrderedDict()
    items = []
    count = 0
    for field, value in zip(fields, attributes):
        if field == 'mapkey':
            continue
        name = "field_" + str(count)
        if value == NULL:
            value = ""
        data[name] = value
        item = u"<tr><th>{0}</th> <td>${{{1}}}</td></tr>".format(field, name)
        items.append(item)
        count += 1
    rowtemple = Template(''.join(items))
    rowshtml = updateTemplate(data, rowtemple, **kwargs)
    return rowshtml
Exemplo n.º 12
0
    def generate_info(self, infoblock, project, layer, mapkey, feature, countlabel=None, lastresults=None):
        """
        Generate a info block for the display.
        :param infoblock: The info block name to generate.
        :param project: The active Roam project.
        :param layer: The active layer.
        :param mapkey: The current map key of the selected feature.  Normally just the primary key column from QGIS.
        :param feature: The selected feature.
        :param countlabel: The label to use as the count header.
        :param lastresults: The results from another info block. Normally info1 passed to info2.
        :returns:
        """
        infoblockdef = project.info_query(infoblock, layer.name())
        isinfo1 = infoblock == "info1"

        if not infoblockdef:
            if isinfo1:
                infoblockdef = {}
                infoblockdef['type'] = 'feature'
            else:
                return None, []

        if isinfo1:
            caption = infoblockdef.get('caption', "Record")
        else:
            caption = infoblockdef.get('caption', "Related Record")

        results = []
        error = None
        infotype = infoblockdef.get('type', 'feature')
        if infotype == 'sql':
            try:
                queryresults = self.results_from_query(infoblockdef, layer, feature, mapkey, lastresults=lastresults)
                if isinfo1 and not queryresults:
                    # If there is no results from the query and we are a info 1 block we grab from the feature.
                    results.append(results_from_feature(feature))
                else:
                    results = queryresults
            except database.DatabaseException as ex:
                RoamEvents.raisemessage("Query Error", ex.message, 3)
                utils.error(ex.message)
                if not isinfo1:
                    error = "<b> Error: {} <b>".format(ex.msg)
                else:
                    results.append(results_from_feature(feature))

        elif infotype == 'feature':
            featuredata = results_from_feature(feature)
            excludedfields = infoblockdef.get('hidden', [])
            for field in excludedfields:
                try:
                    del featuredata[field]
                except KeyError:
                    pass
            results.append(featuredata)
        else:
            return None, []

        blocks = []
        for count, result in enumerate(results, start=1):
            if isinfo1 and count == 1:
                countblock = countblocktemplate.substitute(count=countlabel)
            else:
                countblock = ''

            fields = result.keys()
            attributes = result.values()
            rows = create_data_html(fields, attributes, imagepath=self.project.image_folder)
            try:
                caption = caption.format(**dict(zip(fields, attributes)))
            except KeyError:
                pass

            blocks.append(updateTemplate(dict(ROWS=rows,
                                              HEADER=caption,
                                              CONTROLS=countblock),
                                         infoblocktemplate))
        if error:
            return error, []

        return '<br>'.join(blocks), results
Exemplo n.º 13
0
    def generate_info(self, infoblock, project, layer, mapkey, feature, lastresults=None):

        info_template = Template("""
        <div class="panel panel-default">
          <div class="panel-heading text-left">
            <h2 class="panel-title" style="font-size:24px">${HEADER}</h2>
          </div>
          <div class="panel-body" style="padding:0px">
            <table class="table table-condensed">
                <col style="width: 35%;"/>
                <col style="width: 65%;"/>
            ${ROWS}
            </table>
            </div>
        </div>
        """)

        infoblockdef = project.info_query(infoblock, layer.name())
        isinfo1 = infoblock == "info1"
        if isinfo1:
            header = infoblockdef.get('caption', "Record")
        else:
            header = infoblockdef.get('caption', "Related Record")

        if not infoblockdef:
            if isinfo1:
                infoblockdef = {}
                infoblockdef['type'] = 'feature'
            else:
                return None, []

        results = []
        error = None
        if infoblockdef['type'] == 'sql':
            try:
                queryresults = self.results_from_query(infoblockdef, layer, feature, mapkey, lastresults=lastresults)
                if isinfo1 and not queryresults:
                    # If there is no results from the query and we are a info 1 block we grab from the feature.
                    results.append(self.results_from_feature(feature))
                else:
                    results = queryresults
            except database.DatabaseException as ex:
                if not isinfo1:
                    error = "<b> Error: {} <b>".format(ex.msg)
                else:
                    results.append(self.results_from_feature(feature))

        elif infoblockdef['type'] == 'feature':
            results.append(self.results_from_feature(feature))
        else:
            return None, []

        blocks = []
        for count, result in enumerate(results, start=1):
            if not isinfo1:
                newheader = "{} {} of {}".format(header,count, len(results))
            else:
                newheader = header
            fields = result.keys()
            attributes = result.values()
            rows = generate_rows(fields, attributes)
            blocks.append(updateTemplate(dict(ROWS=rows,
                                              HEADER=newheader), info_template))
        if error:
            return error, []

        return '<br>'.join(blocks), results
Exemplo n.º 14
0
    def generate_info(self,
                      infoblock,
                      project,
                      layer,
                      mapkey,
                      feature,
                      countlabel=None,
                      lastresults=None):
        infoblockdef = project.info_query(infoblock, layer.name())
        isinfo1 = infoblock == "info1"

        if not infoblockdef:
            if isinfo1:
                infoblockdef = {}
                infoblockdef['type'] = 'feature'
            else:
                return None, []

        if isinfo1:
            caption = infoblockdef.get('caption', "Record")
        else:
            caption = infoblockdef.get('caption', "Related Record")

        results = []
        error = None
        infotype = infoblockdef.get('type', 'feature')
        if infotype == 'sql':
            try:
                queryresults = self.results_from_query(infoblockdef,
                                                       layer,
                                                       feature,
                                                       mapkey,
                                                       lastresults=lastresults)
                if isinfo1 and not queryresults:
                    # If there is no results from the query and we are a info 1 block we grab from the feature.
                    results.append(self.results_from_feature(feature))
                else:
                    results = queryresults
            except database.DatabaseException as ex:
                if not isinfo1:
                    error = "<b> Error: {} <b>".format(ex.msg)
                else:
                    results.append(self.results_from_feature(feature))

        elif infotype == 'feature':
            featuredata = self.results_from_feature(feature)
            excludedfields = infoblockdef.get('hidden', [])
            for field in excludedfields:
                try:
                    del featuredata[field]
                except KeyError:
                    pass
            results.append(featuredata)
        else:
            return None, []

        blocks = []
        for count, result in enumerate(results, start=1):
            if isinfo1 and count == 1:
                countblock = countblocktemplate.substitute(count=countlabel)
            else:
                countblock = ''

            fields = result.keys()
            attributes = result.values()
            rows = generate_rows(fields,
                                 attributes,
                                 imagepath=self.project.image_folder)
            blocks.append(
                updateTemplate(
                    dict(ROWS=rows, HEADER=caption, CONTROLS=countblock),
                    infoblocktemplate))
        if error:
            return error, []

        return '<br>'.join(blocks), results