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
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
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
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)
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)
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)
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
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)
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)
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
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
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
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