Example #1
0
 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)
Example #2
0
 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)
Example #3
0
    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())
Example #4
0
    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)
Example #5
0
    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()
Example #6
0
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
Example #7
0
    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)
Example #8
0
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
Example #9
0
    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
Example #10
0
    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
Example #11
0
    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()
Example #12
0
    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
Example #13
0
File: utils.py Project: lmotta/Roam
def values_from_feature(feature):
    attributes = feature.attributes()
    fields = [field.name().lower() for field in feature.fields()]
    values = CaseInsensitiveDict(zip(fields, attributes))
    return values