def __init__(self, form, formconfig, feature, defaults, parent, *args, **kwargs): super(FeatureFormBase, self).__init__(parent) self.form = form self.formconfig = formconfig self.boundwidgets = CaseInsensitiveDict() self.requiredfields = CaseInsensitiveDict() self.feature = feature self.defaults = defaults self.bindingvalues = {} self.editingmode = kwargs.get("editmode", False)
def __init__(self, form, formconfig, feature, defaults, parent, *args, **kwargs): super(FeatureFormBase, self).__init__(parent) self.form = form self.formconfig = formconfig self.boundwidgets = CaseInsensitiveDict() self.requiredfields = CaseInsensitiveDict() self.feature = feature self.geomwidget = None self.defaults = defaults self.bindingvalues = CaseInsensitiveDict() self.editingmode = kwargs.get("editmode", False) self.widgetidlookup = {} self._has_save_buttons = False self.star_all_button = QAction(QIcon(":/icons/save_default_all"), "Star All", self, triggered=self.star_all)
def bindvalues(self, values, update=False): """ Bind the values to the form. """ if not update: self.bindingvalues = CaseInsensitiveDict(values) else: for key, value in values.items(): try: self.bindingvalues[key] = value except KeyError: continue for field, value in values.items(): value = nullcheck(value) try: wrapper = self.boundwidgets[field] if hasattr(wrapper, 'savetofile') and wrapper.savetofile: if value and not os.path.exists(value): value = os.path.join(self.form.project.image_folder, value) self.boundwidgets[field].setvalue(value) except KeyError: utils.debug( "Can't find control for field {}. Ignoring".format(field)) self.validateall() if self.geomwidget and self.feature: self.geomwidget.set_geometry(self.feature.geometry())
def load_feature_form(self, feature, form, editmode, clear=True, callback=None): """ Opens the form for the given feature. """ def _sink(_): pass if not callback: callback = _sink if clear: # Clear all the other open widgets that might be open. self.clear(dontemit=True) # One capture geometry, even for sub forms? # HACK Remove me and do something smarter roam.qgisfunctions.capturegeometry = feature.geometry() # Hold a reference to the fields because QGIS will let the # go out of scope and we get crashes. Yay! layer = form.QGISLayer self.fields = feature.fields() attributes = feature.attributes() fields = [field.name().lower() for field in self.fields] # Something is strange with default values and spatilite. Just delete them for now. if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) defaultvalues = {} if not editmode: defaultwidgets = form.widgetswithdefaults() defaultvalues = defaults.default_values(defaultwidgets, feature, layer) defaultvalues.update(featureform.loadsavedvalues(layer)) values.update(defaultvalues) initconfig = dict(form=form, canvas=self.canvas, editmode=editmode) config = dict(editmode=editmode, layers=QgsMapLayerRegistry.instance().mapLayers(), feature=feature) self.add_widget(FeatureFormWidgetEditor, values, callback, config, initconfig=initconfig)
def openform(self, form, feature, project, editmode): """ Opens a form for the given feature. """ roam.qgisfunctions.capturegeometry = feature.geometry() defaults = {} layer = form.QGISLayer if not editmode: defaults = getdefaults(form.widgetswithdefaults(), feature, layer, self.canvas) self.actionDelete.setVisible(editmode) for field, value in defaults.iteritems(): feature[field] = value self.formvalidation(passed=True) self.feature = feature # Hold a reference to the fields because QGIS will let the # go out of scope and we get crashes. Yay! self.fields = self.feature.fields() self.featureform = form.create_featureform(feature, defaults, canvas=self.canvas) self.featureform.editingmode = editmode self.featureform.rejected.connect(self.formrejected) self.featureform.enablesave.connect(self.actionSave.setEnabled) # Call the pre loading events for the form layers = QgsMapLayerRegistry.instance().mapLayers() self.project = project fields = [field.name().lower() for field in self.fields] attributes = feature.attributes() if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) try: self.featureform.load(feature, layers, values) except featureform.RejectedException as rejected: self.formrejected(rejected.message, rejected.level) return self.featureform.formvalidation.connect(self.formvalidation) self.featureform.helprequest.connect(self.helprequest.emit) self.featureform.bindvalues(values) self.featureform.showlargewidget.connect(self.setlargewidget) self.actionSave.setVisible(True) self.setwidget(self.featureform) self.featureform.loaded()
def values_from_feature(feature, layer): attributes = feature.attributes() fields = [field.name().lower() for field in feature.fields()] if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) return values
def load_feature_form(self, feature, form, editmode, clear=True, callback=None): """ Opens the form for the given feature. """ def _sink(_): pass if not callback: callback = _sink if clear: # Clear all the other open widgets that might be open. self.clear(dontemit=True) layer = form.QGISLayer attributes = feature.attributes() fields = [field.name().lower() for field in layer.pendingFields()] # Something is strange with default values and spatilite. Just delete them for now. if layer.dataProvider().name() == 'spatialite': pkindexes = layer.dataProvider().pkAttributeIndexes() for index in pkindexes: del fields[index] del attributes[index] values = CaseInsensitiveDict(zip(fields, attributes)) savedvalues = {} if not editmode: savedvalues = featureform.loadsavedvalues(layer) values.update(savedvalues) initconfig = dict(form=form, canvas=self.canvas, editmode=editmode, defaults=savedvalues) config = dict(editmode=editmode, layers=QgsMapLayerRegistry.instance().mapLayers(), feature=feature) if self.project: layertools = self.project.layer_tools(layer) config['tools'] = layertools self.add_widget(FeatureFormWidgetEditor, values, callback, config, initconfig=initconfig)
def values_from_feature(feature, safe_names=False): def escape(value): if safe_names: value = value.replace(" ", "_") return value else: return value attributes = feature.attributes() fields = [escape(field.name().lower()) for field in feature.fields()] values = CaseInsensitiveDict(zip(fields, attributes)) return values
def getvalues(self): def shouldsave(field): name = "{}_save".format(field) button = self.findcontrol(name) if not button is None: return button.isChecked() savedvalues = {} values = CaseInsensitiveDict(self.bindingvalues) for field, wrapper in self.boundwidgets.iteritems(): value = wrapper.value() if shouldsave(field): savedvalues[field] = value values[field] = value return values, savedvalues
def getvalues(self, no_defaults=False): def shouldsave(field): name = "{}_save".format(field) button = self.findcontrol(name) if not button is None: return button.isChecked() savedvalues = {} values = CaseInsensitiveDict(self.bindingvalues) for field, wrapper in self.boundwidgets.items(): if not no_defaults and wrapper.get_default_value_on_save: value = self.widget_default(field) else: value = wrapper.value() extradata = wrapper.extraData() values.update(extradata) # TODO this should put pulled out and unit tested. MOVE ME! # NOTE: This is photo widget stuff and really really doesn't belong here. if hasattr( wrapper, 'savetofile') and wrapper.savetofile and wrapper.saveable: if wrapper.filename and self.editingmode: name = os.path.basename(wrapper.filename) name, extension = os.path.splitext(name) if wrapper.modified: if not name.endswith("_edited"): newend = "_edited{}".format(extension) value = name + newend else: value = os.path.basename(wrapper.filename) else: value = os.path.basename(wrapper.filename) else: if wrapper.modified: value = wrapper.get_filename() else: value = '' if shouldsave(field): savedvalues[field] = value values[field] = value return values, savedvalues
def bindvalues(self, values, update=False): """ Bind the values to the form. """ if not update: self.bindingvalues = CaseInsensitiveDict(values) else: for key, value in values.iteritems(): try: self.bindingvalues[key] = value except KeyError: continue for field, value in values.iteritems(): value = nullcheck(value) try: self.boundwidgets[field].setvalue(value) except KeyError: utils.debug("Can't find control for field {}. Ignoring".format(field)) self.validateall()
def getvalues(self): def shouldsave(field): name = "{}_save".format(field) button = self.findcontrol(name) if not button is None: return button.isChecked() savedvalues = {} values = CaseInsensitiveDict(self.bindingvalues) for field, wrapper in self.boundwidgets.iteritems(): value = wrapper.value() # TODO this should put pulled out and unit tested if hasattr(wrapper, 'savetofile') and wrapper.savetofile: if wrapper.filename and self.editingmode: name = os.path.basename(wrapper.filename) name, extension = os.path.splitext(name) if wrapper.modified: if not name.endswith("_edited"): newend = "_edited{}".format(extension) value = name + newend else: value = os.path.basename(wrapper.filename) else: value = os.path.basename(wrapper.filename) else: if wrapper.modified: value = wrapper.get_filename() else: value = '' print value if shouldsave(field): savedvalues[field] = value values[field] = value return values, savedvalues
def values_from_feature(feature): attributes = feature.attributes() fields = [field.name().lower() for field in feature.fields()] values = CaseInsensitiveDict(zip(fields, attributes)) return values