Skip to content

Commit ecf9516

Browse files
committed
more refactoring, improved model
1 parent c333a50 commit ecf9516

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+1900
-793
lines changed

pylintrc

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ disable=raw-checker-failed,
156156
fixme,
157157
C0115, # missing-class-docstring
158158
C0116, # missing-function-docstring
159-
159+
C1803, # use-implicit-booleaness-not-comparison
160160
R0902, # too-many-instance-attributes
161161
R0903, # too-few-public-methods
162162
R0904, # too-many-public-methods

redistricting/__init__.py

+4
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
# noinspection PyPep8Naming
4444

4545

46+
class CanceledError(Exception):
47+
...
48+
49+
4650
if not hasattr(typing, "Self"):
4751
class Self:
4852
...

redistricting/controllers/PendingCtlr.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@
3131
from qgis.PyQt.QtGui import QIcon
3232

3333
from ..gui import DockPendingChanges
34-
from ..models import (
35-
DeltaList,
36-
RdsPlan
37-
)
34+
from ..models import RdsPlan
3835
from ..services import (
3936
DeltaFieldFilterProxy,
4037
DeltaListModel,
@@ -66,16 +63,19 @@ def __init__(
6663
self.model: DeltaListModel = DeltaListModel(self.iface)
6764
self.proxyModel = DeltaFieldFilterProxy(self.iface)
6865
self.proxyModel.setSourceModel(self.model)
69-
self.deltaService.updateCompleted.connect(self.updateDelta)
66+
67+
self.deltaService.deltaStarted.connect(self.startDelta)
7068

7169
def load(self):
7270
super().load()
7371
self.planManager.activePlanChanged.connect(self.activePlanChanged)
7472
self.deltaService.updateStarted.connect(self.showOverlay)
7573
self.deltaService.updateCompleted.connect(self.hideOverlay)
7674
self.deltaService.updateTerminated.connect(self.hideOverlay)
75+
# self.editingStartedSignals.mappedObject.connect(self.startDelta)
7776

7877
def unload(self):
78+
# self.editingStartedSignals.mappedObject.disconnect(self.startDelta)
7979
self.deltaService.updateStarted.disconnect(self.showOverlay)
8080
self.deltaService.updateCompleted.disconnect(self.hideOverlay)
8181
self.deltaService.updateTerminated.disconnect(self.hideOverlay)
@@ -104,15 +104,15 @@ def activePlanChanged(self, plan: Union[RdsPlan, None]):
104104
self.dockwidget.setWaiting(False)
105105
self.dockwidget.plan = plan
106106
if plan is None:
107-
self.model.setDelta(None, None)
107+
self.model.setPlan(None, None)
108108
else:
109-
self.model.setDelta(plan, self.deltaService.getDelta(plan))
109+
self.model.setPlan(plan, self.deltaService.getDelta(plan))
110110
if self.deltaService.isUpdating(plan):
111111
self.dockwidget.setWaiting(True)
112112

113-
def updateDelta(self, plan, delta: DeltaList):
113+
def startDelta(self, plan):
114114
if plan == self.activePlan:
115-
self.model.setDelta(plan, delta)
115+
self.model.setDelta(self.deltaService.getDelta(plan))
116116

117117
def showOverlay(self, plan: RdsPlan):
118118
if plan == self.activePlan:

redistricting/models/DeltaList.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
begin : 2022-01-15
55
git sha : $Format:%H$
6-
copyright : (C) 2022 by Cryptodira
6+
copyright : (C) 2022-2024 by Cryptodira
77
88
99
/***************************************************************************

redistricting/models/District.py

+37-38
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
begin : 2022-01-15
55
git sha : $Format:%H$
6-
copyright : (C) 2022 by Cryptodira
6+
copyright : (C) 2022-2024 by Cryptodira
77
88
99
/***************************************************************************
@@ -33,13 +33,13 @@
3333
overload
3434
)
3535

36-
from qgis.PyQt.QtCore import pyqtSignal
36+
from qgis.PyQt.QtCore import (
37+
QObject,
38+
pyqtSignal
39+
)
3740

3841
from ..utils import tr
3942
from .base import (
40-
MISSING,
41-
Factory,
42-
RdsBaseModel,
4343
SortedKeyedList,
4444
in_range,
4545
not_empty,
@@ -51,7 +51,7 @@
5151
)
5252

5353

54-
class RdsDistrict(RdsBaseModel):
54+
class RdsDistrict(QObject):
5555
BASE_COLUMNS = list(DistrictColumns)
5656
STATS_COLUMNS = list(MetricsColumns)
5757
WRITABLE_ATTRIBUTES = (DistrictColumns.NAME, int(DistrictColumns.NAME),
@@ -62,29 +62,29 @@ class RdsDistrict(RdsBaseModel):
6262
descriptionChanged = pyqtSignal()
6363

6464
district: int
65-
name: Annotated[str, not_empty] = rds_property(
66-
notify=nameChanged, strict=True, factory=Factory(lambda self: str(self.district))
67-
)
68-
members: Annotated[int, in_range(0, 9999)] = rds_property(notify=membersChanged, strict=True, default=1)
65+
name: Annotated[str, not_empty] = rds_property(notify=nameChanged)
66+
members: Annotated[int, in_range(0, 9999)] = rds_property(notify=membersChanged)
6967
population: int = 0
7068
deviation: int = 0
7169
pct_deviation: float = 0.0
72-
description: str = rds_property(private=True, notify=descriptionChanged, strict=True, default="")
70+
description: str = rds_property(private=True, notify=descriptionChanged)
7371
fid: int = -1
7472

75-
def __pre_init__(self):
73+
def __init__(self, district: int, name: Optional[str] = None, members: Optional[int] = 1, description: str = '', fid=-1, **kwargs):
74+
super().__init__()
75+
self.fid = fid
7676
self._data = {
77-
DistrictColumns.DISTRICT: MISSING,
78-
DistrictColumns.NAME: MISSING,
79-
DistrictColumns.MEMBERS: 1,
77+
DistrictColumns.DISTRICT: district,
78+
DistrictColumns.NAME: name or str(district),
79+
DistrictColumns.MEMBERS: members,
8080
DistrictColumns.POPULATION: 0,
8181
DistrictColumns.DEVIATION: 0,
8282
DistrictColumns.PCT_DEVIATION: 0.0,
8383
}
84+
self._description = description
8485
self._data.update(zip(RdsDistrict.STATS_COLUMNS, repeat(None)))
8586

86-
def __post_init__(self, **data):
87-
self.update(data)
87+
self.update(kwargs)
8888

8989
def __key__(self):
9090
return str(self.district).rjust(4, "0")
@@ -138,18 +138,15 @@ def __eq__(self, __value: "RdsDistrict"):
138138
return self._data == __value._data
139139

140140
def __getattr__(self, name):
141-
if not name in self._data:
142-
raise AttributeError(tr("District object has no attribute {name}").format(name=name))
143-
return self._data[name]
141+
if name in self._data:
142+
return self._data[name]
143+
144+
return super().__getattr__(name)
144145

145-
@rds_property(readonly=True)
146+
@rds_property
146147
def district(self):
147148
return self._data[DistrictColumns.DISTRICT]
148149

149-
@district.setter
150-
def district(self, value: int):
151-
self._data[DistrictColumns.DISTRICT] = value
152-
153150
@name.getter
154151
def name(self):
155152
return self._data[DistrictColumns.NAME]
@@ -166,23 +163,23 @@ def members(self):
166163
def members(self, value: int):
167164
self._data[DistrictColumns.MEMBERS] = value
168165

169-
@rds_property(strict=True)
166+
@rds_property
170167
def population(self):
171168
return self._data[DistrictColumns.POPULATION]
172169

173170
@population.setter
174171
def population(self, value: int):
175172
self._data[DistrictColumns.POPULATION] = value
176173

177-
@rds_property(strict=True)
174+
@rds_property
178175
def deviation(self):
179176
return self._data[DistrictColumns.DEVIATION]
180177

181178
@deviation.setter
182179
def deviation(self, value: int):
183180
self._data[DistrictColumns.DEVIATION] = value
184181

185-
@rds_property(strict=True)
182+
@rds_property
186183
def pct_deviation(self):
187184
return self._data[DistrictColumns.PCT_DEVIATION]
188185

@@ -218,20 +215,22 @@ def update(self, data: Union["RdsDistrict", dict[str, Any]]):
218215

219216

220217
class RdsUnassigned(RdsDistrict):
221-
district: Literal[0] = rds_property(
222-
init=False, readonly=True, default=0, fget=RdsDistrict.district.fget, fset=RdsDistrict.district.fset)
223-
name: str = rds_property(init=False, readonly=True, default=tr("Unassigned"),
224-
fget=RdsDistrict.name.fget, fset=RdsDistrict.name.fset)
218+
district: Literal[0] = rds_property(fget=RdsDistrict.district.fget)
219+
name: str = rds_property(fget=RdsDistrict.name.fget)
225220
members: Optional[int] = None
226221
deviation: Optional[int] = None
227222
pct_deviation: Optional[float] = None
228223

229-
def __pre_init__(self):
230-
super().__pre_init__()
231-
self._data[DistrictColumns.MEMBERS] = None
232-
self._data[DistrictColumns.POPULATION] = None
233-
self._data[DistrictColumns.DEVIATION] = None
234-
self._data[DistrictColumns.PCT_DEVIATION] = None
224+
def __init__(self, *, fid=-1, **kwargs):
225+
if DistrictColumns.DISTRICT in kwargs:
226+
del kwargs[DistrictColumns.DISTRICT]
227+
if DistrictColumns.NAME in kwargs:
228+
del kwargs[DistrictColumns.NAME]
229+
kwargs[DistrictColumns.MEMBERS] = None
230+
kwargs[DistrictColumns.DEVIATION] = None
231+
kwargs[DistrictColumns.PCT_DEVIATION] = None
232+
233+
super().__init__(0, tr("Unassigned"), fid=fid, **kwargs)
235234

236235
def __setitem__(self, key: Union[str, int, slice], value: Any):
237236
raise IndexError(tr("'{key}' field is readonly for Unassigned goegraphies").format(key=key))

redistricting/models/Field.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
begin : 2022-01-15
55
git sha : $Format:%H$
6-
copyright : (C) 2022 by Cryptodira
6+
copyright : (C) 2022-2024 by Cryptodira
77
88
99
/***************************************************************************
@@ -24,6 +24,7 @@
2424
"""
2525
import re
2626
from typing import (
27+
Optional,
2728
Union,
2829
overload
2930
)
@@ -244,7 +245,7 @@ def _createNameField(self):
244245
return nameField
245246

246247
category: int = FieldCategory.Geography
247-
nameField: RdsRelatedField = rds_property(private=True, factory=Factory(_createNameField))
248+
nameField: Optional[RdsRelatedField] = rds_property(private=True, factory=Factory(_createNameField))
248249

249250
def getRelation(self):
250251
index = QgsExpression.expressionToLayerFieldIndex(self._field, self._layer)
@@ -306,19 +307,19 @@ class RdsDataField(RdsField):
306307
sumFieldChanged = pyqtSignal()
307308
pctBaseChanged = pyqtSignal()
308309

310+
def isNumeric(self):
311+
return self.fieldType() in (QMetaType.Double, QMetaType.Int, QMetaType.LongLong, QMetaType.UInt, QMetaType.ULongLong)
312+
309313
category: int = FieldCategory.Demographic
310314
sumField: bool = rds_property(
311315
private=True,
312316
fvalid=lambda inst, value: value and inst.isNumeric(),
313317
notify=sumFieldChanged,
314-
factory=Factory(lambda self: self.isNumeric())
318+
factory=Factory(isNumeric)
315319
)
316320
pctBase: Union[str, None] = rds_property(
317321
private=True,
318322
fvalid=lambda inst, value: None if not inst.isNumeric() else value,
319323
notify=pctBaseChanged,
320324
default=None
321325
)
322-
323-
def isNumeric(self):
324-
return self.fieldType() in (QVariant.Double, QVariant.Int, QVariant.LongLong, QVariant.UInt, QVariant.ULongLong)

0 commit comments

Comments
 (0)