Skip to content

FieldFactory

Import
from pyqgis_wrapper.field import FieldFactory

FieldFactory

Handle field creation from user input

register(builder) classmethod

Register the field builder tagged with the @FieldFactory.resiter decorator

Parameters:

Name Type Description Default
builder typing.Type[pyqgis_wrapper.field.field_factory.BaseField]

Field builder inherited from BaseField

required

Returns:

Type Description
BaseField

Field builder just registered. The return only serves to allow a NoneType return ,provoked by the decorator. It should not be used directly. Use get method instead.

Source code in pyqgis_wrapper/field/field_factory.py
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@classmethod
def register(cls, builder: Type[BaseField]):
    """
    Register the field builder tagged with the @FieldFactory.resiter decorator

    :param builder: Field builder inherited from BaseField
    :type builder: BaseField

    :return: Field builder just registered. The return only serves to allow
    a NoneType return ,provoked by the decorator. It should not be used directly.
    Use get method instead.
    :rtype: BaseField
    """
    cls._builders[builder.TYPE_ID] = builder
    return builder

get(type_id) classmethod

Get a registered field builder form is 'type_id'.

Parameters:

Name Type Description Default
type_id str

Type of the field, can be : int32, int64, float, str, date, date_time, time, bool.

required

Returns:

Type Description
Type[BaseField]

Field builder of the specified type_id

Source code in pyqgis_wrapper/field/field_factory.py
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
@classmethod
def get(cls, type_id: str) -> Type[BaseField]:
    """
    Get a registered field builder form is 'type_id'.
    :param type_id: Type of the field, can be :
        int32, int64, float, str, date, date_time, time, bool.
    :type type_id: str

    :return: Field builder of the specified type_id
    :rtype: Type[BaseField]
    """
    builder = cls._builders[type_id]
    if not builder:
        raise ValueError(f"No builder registered for type ID '{type_id}'")
    return builder

create(*args, **kwargs) classmethod

Create one or more QgsField(s) from:

  • Positional args: (type_id, name, length, precision)
  • A dict of parameters : {{"type_id":"int32", "name":"my_field", "length": 10, "precision": 2}}
  • A list of dicts : [{"type_id": "int32", "name",...}]
  • Keyword arguments: type_id="int32", name="my_field", "length"=10, "precision"=2

For each type of inputs ony type_id and name are mandatory.

Returns:

Type Description
Union[QgsField, QgsFields]

QgsField for a single field or QgsFields for multiple fields

Source code in pyqgis_wrapper/field/field_factory.py
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
@classmethod
def create(cls, *args, **kwargs) -> Union[QgsField, QgsFields]:
    """
    Create one or more QgsField(s) from:

    - Positional args:
        (type_id, name, length, precision)
    - A dict of parameters :
        {{"type_id":"int32", "name":"my_field", "length": 10, "precision": 2}}
    - A list of dicts :
        [{"type_id": "int32", "name",...}]
    - Keyword arguments:
        type_id="int32", name="my_field", "length"=10, "precision"=2

    For each type of inputs ony type_id and name are mandatory.

    :return: QgsField  for a single field or QgsFields for multiple fields
    :rtype: Union[QgsField, QgsFields]
    """
    # Positional args - single field
    if len(args) >= 2 and isinstance(args[0], str) and isinstance(args[1], str):
        type_id = args[0]
        name = args[1]
        length = args[2] if len(args) > 2 else 10
        precision = args[3] if len(args) > 3 else 2
        return cls._create_field(type_id, name, length, precision)

    # Single dict - single field
    elif len(args) == 1 and isinstance(args[0], dict):
        field = args[0]
        return cls._create_field(
            type_id=field["type_id"],
            name=field["name"],
            length=field.get("length", 10),
            precision=field.get("precision", 2),
        )

    # Kwargs - single field
    elif "type_id" in kwargs and "name" in kwargs:
        return cls._create_field(
            type_id=kwargs["type_id"],
            name=kwargs["name"],
            length=kwargs.get("length", 10),
            precision=kwargs.get("precision", 2),
        )
    # List of dict - multiple fields
    elif len(args) == 1 and isinstance(args[0], list):
        return cls._create_fields(args[0])

    # Invalid usage
    raise TypeError(
        "Invalid arguments for FieldFactory.create(). Expected either "
        "(type, name, ...), a dict, a list of dicts, or keyword arguments."
    )

BaseField

Bases: abc.ABC

Abstract builder for creating fields with the specified QMetaType type.

create(name, length=20, precision=2) classmethod

Create a field with the specified type.

Parameters:

Name Type Description Default
name str

Name of the field

required
length int

The length of the field when needed

20
precision int

The precision of the field when needed

2

Returns:

Type Description
QgsField

QgsField

Source code in pyqgis_wrapper/field/field_factory.py
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
@classmethod
def create(cls, name: str, length: int = 20, precision: int = 2) -> QgsField:
    """
    Create a field with the specified type.

    :param name: Name of the field
    :type name: str
    :param length: The length of the field when needed
    :param precision: The precision of the field when needed

    :return: QgsField
    :rtype: QgsField
    """
    cls._validate_parameters(name)
    return QgsField(name, cls.TYPE, cls.TYPENAME, length, precision)

Int32Field

Bases: pyqgis_wrapper.field.field_factory.BaseField

Int64Field

Bases: pyqgis_wrapper.field.field_factory.BaseField

DoubleField

Bases: pyqgis_wrapper.field.field_factory.BaseField

StringField

Bases: pyqgis_wrapper.field.field_factory.BaseField

DateField

Bases: pyqgis_wrapper.field.field_factory.BaseField

DateTimeField

Bases: pyqgis_wrapper.field.field_factory.BaseField

TimeField

Bases: pyqgis_wrapper.field.field_factory.BaseField

BoolField

Bases: pyqgis_wrapper.field.field_factory.BaseField