def build_post_processor_form(self, parameters): """Build Post Processor Tab. :param parameters: A Dictionary containing element of form :type parameters: dict """ # create postprocessors tab tab = QWidget() form_layout = QFormLayout(tab) form_layout.setLabelAlignment(Qt.AlignLeft) self.tabWidget.addTab(tab, self.tr('Postprocessors')) self.tabWidget.tabBar().setVisible(True) # create element for the tab values = OrderedDict() for label, options in parameters.items(): input_values = OrderedDict() # NOTE (gigih) : 'params' is assumed as dictionary if 'params' in options: group_box = QGroupBox() group_box.setCheckable(True) group_box.setTitle(get_postprocessor_human_name(label)) # NOTE (gigih): is 'on' always exist?? # (MB) should always be there group_box.setChecked(options.get('on')) input_values['on'] = self.bind(group_box, 'checked', bool) layout = QFormLayout(group_box) group_box.setLayout(layout) # create widget element from 'params' input_values['params'] = OrderedDict() for key, value in options['params'].items(): input_values['params'][key] = self.build_widget( layout, key, value) form_layout.addRow(group_box, None) elif 'on' in options: checkbox = QCheckBox() checkbox.setText(get_postprocessor_human_name(label)) checkbox.setChecked(options['on']) input_values['on'] = self.bind(checkbox, 'checked', bool) form_layout.addRow(checkbox, None) else: raise NotImplementedError('This case is not handled for now') values[label] = input_values self.values['postprocessors'] = values
def buildPostProcessorForm(self, theParams): """Build Post Processor Tab :param theParams: A Dictionary containing element of form """ # create postprocessors tab myTab = QWidget() myFormLayout = QFormLayout(myTab) myFormLayout.setLabelAlignment(Qt.AlignLeft) self.tabWidget.addTab(myTab, self.tr('Postprocessors')) self.tabWidget.tabBar().setVisible(True) # create element for the tab myValues = OrderedDict() for myLabel, myOptions in theParams.items(): myInputValues = OrderedDict() # NOTE (gigih) : 'params' is assumed as dictionary if 'params' in myOptions: myGroupBox = QGroupBox() myGroupBox.setCheckable(True) myGroupBox.setTitle(get_postprocessor_human_name(myLabel)) # NOTE (gigih): is 'on' always exist?? myGroupBox.setChecked(myOptions.get('on')) myInputValues['on'] = self.bind(myGroupBox, 'checked', bool) myLayout = QFormLayout(myGroupBox) myGroupBox.setLayout(myLayout) # create widget element from 'params' myInputValues['params'] = OrderedDict() for myKey, myValue in myOptions['params'].items(): myInputValues['params'][myKey] = self.buildWidget( myLayout, myKey, myValue) myFormLayout.addRow(myGroupBox, None) elif 'on' in myOptions: myCheckBox = QCheckBox() myCheckBox.setText(get_postprocessor_human_name(myLabel)) myCheckBox.setChecked(myOptions['on']) myInputValues['on'] = self.bind(myCheckBox, 'checked', bool) myFormLayout.addRow(myCheckBox, None) else: raise NotImplementedError('This case is not handled for now') myValues[myLabel] = myInputValues self.values['postprocessors'] = myValues
def _generateTables(self): """Parses the postprocessing output as one table per postprocessor. Args: None Returns: str - a string containing the html """ myMessage = m.Message() for proc, resList in self.postProcessingOutput.iteritems(): # resList is for example: # [ # (PyQt4.QtCore.QString(u'Entire area'), OrderedDict([ # (u'Total', {'value': 977536, 'metadata': {}}), # (u'Female population', {'value': 508319, 'metadata': {}}), # (u'Weekly hygiene packs', {'value': 403453, 'metadata': { # 'description': 'Females hygiene packs for weekly use'}}) # ])) #] try: #sorting using the first indicator of a postprocessor sortedResList = sorted(resList, key=self._sortNoData, reverse=True) except KeyError: LOGGER.debug('Skipping sorting as the postprocessor did not ' 'have a "Total" field') #init table hasNoDataValues = False myTable = m.Table( style_class='table table-condensed table-striped') myTable.caption = self.tr('Detailed %1 report').arg( safeTr(get_postprocessor_human_name(proc)).lower()) myHeaderRow = m.Row() myHeaderRow.add(str(self.attributeTitle).capitalize()) for calculationName in sortedResList[0][1]: myHeaderRow.add(self.tr(calculationName)) myTable.add(myHeaderRow) for zoneName, calc in sortedResList: myRow = m.Row(zoneName) for _, calculationData in calc.iteritems(): myValue = calculationData['value'] if myValue == self.aggregator.defaults['NO_DATA']: hasNoDataValues = True myValue += ' *' myRow.add(myValue) myTable.add(myRow) #add table to message myMessage.add(myTable) if hasNoDataValues: myMessage.add( m.EmphasizedText( self. tr('* "%1" values mean that there where some problems while ' 'calculating them. This did not affect the other ' 'values.').arg( self.aggregator.defaults['NO_DATA']))) try: if (self.keywordIO.read_keywords(self.aggregator.layer, 'HAD_MULTIPART_POLY')): myMessage.add( m.EmphasizedText( self. tr('The aggregation layer had multipart polygons, these have ' 'been exploded and are now marked with a #. This has no ' 'influence on the calculation, just keep in mind that the ' 'attributes shown may represent the original multipart ' 'polygon and not the individual exploded polygon parts.' ))) except Exception: # pylint: disable=W0703 pass return myMessage
def _generateTables(self): """Parses the postprocessing output as one table per postprocessor. Args: None Returns: str - a string containing the html """ myMessage = m.Message() for proc, resList in self.postProcessingOutput.iteritems(): # resList is for example: # [ # (PyQt4.QtCore.QString(u'Entire area'), OrderedDict([ # (u'Total', {'value': 977536, 'metadata': {}}), # (u'Female population', {'value': 508319, 'metadata': {}}), # (u'Weekly hygiene packs', {'value': 403453, 'metadata': { # 'description': 'Females hygiene packs for weekly use'}}) # ])) #] try: #sorting using the first indicator of a postprocessor sortedResList = sorted( resList, key=self._sortNoData, reverse=True) except KeyError: LOGGER.debug('Skipping sorting as the postprocessor did not ' 'have a "Total" field') #init table hasNoDataValues = False myTable = m.Table( style_class='table table-condensed table-striped') myTable.caption = self.tr('Detailed %1 report').arg(safeTr( get_postprocessor_human_name(proc)).lower()) myHeaderRow = m.Row() myHeaderRow.add(str(self.attributeTitle).capitalize()) for calculationName in sortedResList[0][1]: myHeaderRow.add(self.tr(calculationName)) myTable.add(myHeaderRow) for zoneName, calc in sortedResList: myRow = m.Row(zoneName) for _, calculationData in calc.iteritems(): myValue = calculationData['value'] if myValue == self.aggregator.defaults['NO_DATA']: hasNoDataValues = True myValue += ' *' myRow.add(myValue) myTable.add(myRow) #add table to message myMessage.add(myTable) if hasNoDataValues: myMessage.add(m.EmphasizedText(self.tr( '* "%1" values mean that there where some problems while ' 'calculating them. This did not affect the other ' 'values.').arg(self.aggregator.defaults['NO_DATA']))) try: if (self.keywordIO.read_keywords( self.aggregator.layer, 'HAD_MULTIPART_POLY')): myMessage.add(m.EmphasizedText(self.tr( 'The aggregation layer had multipart polygons, these have ' 'been exploded and are now marked with a #. This has no ' 'influence on the calculation, just keep in mind that the ' 'attributes shown may represent the original multipart ' 'polygon and not the individual exploded polygon parts.'))) except Exception: # pylint: disable=W0703 pass return myMessage
def _generate_tables(self): """Parses the postprocessing output as one table per postprocessor. TODO: This should rather return json and then have a helper method to make html from the JSON. :returns: The html. :rtype: str """ message = m.Message() for processor, results_list in self.output.iteritems(): self.current_output_postprocessor = processor # results_list is for example: # [ # (PyQt4.QtCore.QString(u'Entire area'), OrderedDict([ # (u'Total', {'value': 977536, 'metadata': {}}), # (u'Female population', {'value': 508319, 'metadata': {}}), # (u'Weekly hygiene packs', {'value': 403453, 'metadata': { # 'description': 'Females hygiene packs for weekly use'}}) # ])) #] #sorting using the first indicator of a postprocessor sorted_results = sorted( results_list, key=self._sort_no_data, reverse=True) #init table has_no_data = False table = m.Table( style_class='table table-condensed table-striped') table.caption = self.tr('Detailed %s report') % (safeTr( get_postprocessor_human_name(processor)).lower()) header = m.Row() header.add(str(self.attribute_title).capitalize()) for calculation_name in sorted_results[0][1]: header.add(self.tr(calculation_name)) table.add(header) # used to calculate the totals row as per issue #690 postprocessor_totals = OrderedDict() for zone_name, calc in sorted_results: row = m.Row(zone_name) for indicator, calculation_data in calc.iteritems(): value = calculation_data['value'] if value == self.aggregator.defaults['NO_DATA']: has_no_data = True value += ' *' try: postprocessor_totals[indicator] += 0 except KeyError: postprocessor_totals[indicator] = 0 else: try: postprocessor_totals[indicator] += int(value) except KeyError: postprocessor_totals[indicator] = int(value) row.add(value) table.add(row) # add the totals row row = m.Row(self.tr('Total in aggregation areas')) for _, total in postprocessor_totals.iteritems(): row.add(str(total)) table.add(row) # add table to message message.add(table) if has_no_data: message.add(m.EmphasizedText(self.tr( '* "%s" values mean that there where some problems while ' 'calculating them. This did not affect the other ' 'values.') % (self.aggregator.defaults['NO_DATA']))) return message
def _generateTables(self): """Parses the postprocessing output as one table per postprocessor. Args: None Returns: str - a string containing the html """ myMessage = m.Message() for proc, results_list in self.postProcessingOutput.iteritems(): self._currentOutputPostprocessor = proc # results_list is for example: # [ # (PyQt4.QtCore.QString(u'Entire area'), OrderedDict([ # (u'Total', {'value': 977536, 'metadata': {}}), # (u'Female population', {'value': 508319, 'metadata': {}}), # (u'Weekly hygiene packs', {'value': 403453, 'metadata': { # 'description': 'Females hygiene packs for weekly use'}}) # ])) #] #sorting using the first indicator of a postprocessor sortedResList = sorted( results_list, key=self._sortNoData, reverse=True) #init table hasNoDataValues = False myTable = m.Table( style_class='table table-condensed table-striped') myTable.caption = self.tr('Detailed %s report') % (safeTr( get_postprocessor_human_name(proc)).lower()) myHeaderRow = m.Row() myHeaderRow.add(str(self.attributeTitle).capitalize()) for calculationName in sortedResList[0][1]: myHeaderRow.add(self.tr(calculationName)) myTable.add(myHeaderRow) for zoneName, calc in sortedResList: myRow = m.Row(zoneName) for _, calculationData in calc.iteritems(): myValue = calculationData['value'] if myValue == self.aggregator.defaults['NO_DATA']: hasNoDataValues = True myValue += ' *' myRow.add(myValue) myTable.add(myRow) # add table to message myMessage.add(myTable) if hasNoDataValues: myMessage.add(m.EmphasizedText(self.tr( '* "%s" values mean that there where some problems while ' 'calculating them. This did not affect the other ' 'values.') % (self.aggregator.defaults['NO_DATA']))) return myMessage