Skip to content

Commit 5dd04cd

Browse files
[UPD] spp_registry_name_suffix: simplify exclusion to boolean is_generational field
Replace exclusion_group (Char) with is_generational (Boolean) to prevent typographical errors in configuration. Generational suffixes (Jr., Sr., I-XV) are now marked with a simple checkbox, and the constraint ensures only one generational suffix can be selected per individual.
1 parent 90ba115 commit 5dd04cd

File tree

5 files changed

+65
-81
lines changed

5 files changed

+65
-81
lines changed

spp_registry_name_suffix/data/name_suffix_data.xml

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,143 +6,143 @@
66
<field name="name">Jr.</field>
77
<field name="code">JR</field>
88
<field name="sequence">10</field>
9-
<field name="exclusion_group">generational</field>
9+
<field name="is_generational" eval="True" />
1010
<field name="description">Junior - typically used for a son named after his father</field>
1111
</record>
1212

1313
<record id="suffix_sr" model="spp.name.suffix">
1414
<field name="name">Sr.</field>
1515
<field name="code">SR</field>
1616
<field name="sequence">20</field>
17-
<field name="exclusion_group">generational</field>
17+
<field name="is_generational" eval="True" />
1818
<field name="description">Senior - typically used for a father when a son has the same name</field>
1919
</record>
2020

2121
<record id="suffix_jra" model="spp.name.suffix">
2222
<field name="name">Jra.</field>
2323
<field name="code">JRA</field>
2424
<field name="sequence">25</field>
25-
<field name="exclusion_group">generational</field>
25+
<field name="is_generational" eval="True" />
2626
<field name="description">JRA</field>
2727
</record>
2828

2929
<record id="suffix_i" model="spp.name.suffix">
3030
<field name="name">I</field>
3131
<field name="code">I</field>
3232
<field name="sequence">30</field>
33-
<field name="exclusion_group">generational</field>
33+
<field name="is_generational" eval="True" />
3434
<field name="description">The First</field>
3535
</record>
3636

3737
<record id="suffix_ii" model="spp.name.suffix">
3838
<field name="name">II</field>
3939
<field name="code">II</field>
4040
<field name="sequence">40</field>
41-
<field name="exclusion_group">generational</field>
41+
<field name="is_generational" eval="True" />
4242
<field name="description">The Second</field>
4343
</record>
4444

4545
<record id="suffix_iii" model="spp.name.suffix">
4646
<field name="name">III</field>
4747
<field name="code">III</field>
4848
<field name="sequence">50</field>
49-
<field name="exclusion_group">generational</field>
49+
<field name="is_generational" eval="True" />
5050
<field name="description">The Third</field>
5151
</record>
5252

5353
<record id="suffix_iv" model="spp.name.suffix">
5454
<field name="name">IV</field>
5555
<field name="code">IV</field>
5656
<field name="sequence">60</field>
57-
<field name="exclusion_group">generational</field>
57+
<field name="is_generational" eval="True" />
5858
<field name="description">The Fourth</field>
5959
</record>
6060

6161
<record id="suffix_v" model="spp.name.suffix">
6262
<field name="name">V</field>
6363
<field name="code">V</field>
6464
<field name="sequence">70</field>
65-
<field name="exclusion_group">generational</field>
65+
<field name="is_generational" eval="True" />
6666
<field name="description">The Fifth</field>
6767
</record>
6868

6969
<record id="suffix_vi" model="spp.name.suffix">
7070
<field name="name">VI</field>
7171
<field name="code">VI</field>
7272
<field name="sequence">71</field>
73-
<field name="exclusion_group">generational</field>
73+
<field name="is_generational" eval="True" />
7474
<field name="description">The Sixth</field>
7575
</record>
7676

7777
<record id="suffix_vii" model="spp.name.suffix">
7878
<field name="name">VII</field>
7979
<field name="code">VII</field>
8080
<field name="sequence">72</field>
81-
<field name="exclusion_group">generational</field>
81+
<field name="is_generational" eval="True" />
8282
<field name="description">The Seventh</field>
8383
</record>
8484

8585
<record id="suffix_viii" model="spp.name.suffix">
8686
<field name="name">VIII</field>
8787
<field name="code">VIII</field>
8888
<field name="sequence">73</field>
89-
<field name="exclusion_group">generational</field>
89+
<field name="is_generational" eval="True" />
9090
<field name="description">The Eighth</field>
9191
</record>
9292

9393
<record id="suffix_ix" model="spp.name.suffix">
9494
<field name="name">IX</field>
9595
<field name="code">IX</field>
9696
<field name="sequence">74</field>
97-
<field name="exclusion_group">generational</field>
97+
<field name="is_generational" eval="True" />
9898
<field name="description">The Ninth</field>
9999
</record>
100100

101101
<record id="suffix_x" model="spp.name.suffix">
102102
<field name="name">X</field>
103103
<field name="code">X</field>
104104
<field name="sequence">75</field>
105-
<field name="exclusion_group">generational</field>
105+
<field name="is_generational" eval="True" />
106106
<field name="description">The Tenth</field>
107107
</record>
108108

109109
<record id="suffix_xi" model="spp.name.suffix">
110110
<field name="name">XI</field>
111111
<field name="code">XI</field>
112112
<field name="sequence">76</field>
113-
<field name="exclusion_group">generational</field>
113+
<field name="is_generational" eval="True" />
114114
<field name="description">The Eleventh</field>
115115
</record>
116116

117117
<record id="suffix_xii" model="spp.name.suffix">
118118
<field name="name">XII</field>
119119
<field name="code">XII</field>
120120
<field name="sequence">77</field>
121-
<field name="exclusion_group">generational</field>
121+
<field name="is_generational" eval="True" />
122122
<field name="description">The Twelfth</field>
123123
</record>
124124

125125
<record id="suffix_xiii" model="spp.name.suffix">
126126
<field name="name">XIII</field>
127127
<field name="code">XIII</field>
128128
<field name="sequence">78</field>
129-
<field name="exclusion_group">generational</field>
129+
<field name="is_generational" eval="True" />
130130
<field name="description">The Thirteenth</field>
131131
</record>
132132

133133
<record id="suffix_xiv" model="spp.name.suffix">
134134
<field name="name">XIV</field>
135135
<field name="code">XIV</field>
136136
<field name="sequence">79</field>
137-
<field name="exclusion_group">generational</field>
137+
<field name="is_generational" eval="True" />
138138
<field name="description">The Fourteenth</field>
139139
</record>
140140

141141
<record id="suffix_xv" model="spp.name.suffix">
142142
<field name="name">XV</field>
143143
<field name="code">XV</field>
144144
<field name="sequence">80</field>
145-
<field name="exclusion_group">generational</field>
145+
<field name="is_generational" eval="True" />
146146
<field name="description">The Fifteenth</field>
147147
</record>
148148

spp_registry_name_suffix/models/name_suffix.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,11 @@ class SPPNameSuffix(models.Model):
3030
string="Description",
3131
help="Additional description or usage notes for this suffix",
3232
)
33-
exclusion_group = fields.Char(
34-
string="Exclusion Group",
35-
help="Suffixes in the same exclusion group cannot be used together. "
36-
"For example, 'generational' for Jr., Sr., I, II, III, etc.",
33+
is_generational = fields.Boolean(
34+
string="Generational Suffix",
35+
default=False,
36+
help="Check this for generational suffixes (Jr., Sr., I, II, III, etc.). "
37+
"Only one generational suffix can be used per individual.",
3738
)
3839

3940
_sql_constraints = [

spp_registry_name_suffix/models/res_partner.py

Lines changed: 11 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,21 @@ class ResPartner(models.Model):
1515
)
1616

1717
@api.constrains("suffix_ids")
18-
def _check_suffix_exclusion_groups(self):
19-
"""Validate that no two suffixes from the same exclusion group are selected."""
18+
def _check_generational_suffix_conflict(self):
19+
"""Validate that only one generational suffix is selected."""
2020
for record in self:
2121
if not record.suffix_ids:
2222
continue
23-
# Get suffixes that have an exclusion group
24-
suffixes_with_groups = record.suffix_ids.filtered(lambda s: s.exclusion_group)
25-
# Group by exclusion_group
26-
groups = {}
27-
for suffix in suffixes_with_groups:
28-
group = suffix.exclusion_group
29-
if group not in groups:
30-
groups[group] = []
31-
groups[group].append(suffix.name)
32-
# Check for conflicts
33-
for group, suffix_names in groups.items():
34-
if len(suffix_names) > 1:
35-
raise ValidationError(
36-
_(
37-
"The following suffixes cannot be used together "
38-
"as they belong to the same exclusion group '%(group)s': "
39-
"%(suffixes)s",
40-
group=group,
41-
suffixes=", ".join(suffix_names),
42-
)
23+
generational_suffixes = record.suffix_ids.filtered(lambda s: s.is_generational)
24+
if len(generational_suffixes) > 1:
25+
suffix_names = ", ".join(generational_suffixes.mapped("name"))
26+
raise ValidationError(
27+
_(
28+
"Only one generational suffix can be used at a time. "
29+
"The following are generational suffixes: %(suffixes)s",
30+
suffixes=suffix_names,
4331
)
32+
)
4433

4534
@api.onchange("is_group", "family_name", "given_name", "addl_name", "suffix_ids")
4635
def name_change(self):

spp_registry_name_suffix/tests/test_name_suffix.py

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -244,30 +244,27 @@ def test_13_name_get_multiple_records(self):
244244
self.assertIn(self.suffix_jr.id, result_ids)
245245
self.assertIn(self.suffix_phd.id, result_ids)
246246

247-
def test_14_exclusion_group_set_on_generational_suffixes(self):
248-
"""Test that generational suffixes have exclusion group set."""
249-
self.assertEqual(
250-
self.suffix_jr.exclusion_group,
251-
"generational",
252-
"Jr. should have generational exclusion group",
247+
def test_14_is_generational_set_on_generational_suffixes(self):
248+
"""Test that generational suffixes have is_generational flag set."""
249+
self.assertTrue(
250+
self.suffix_jr.is_generational,
251+
"Jr. should be marked as generational",
253252
)
254-
self.assertEqual(
255-
self.suffix_sr.exclusion_group,
256-
"generational",
257-
"Sr. should have generational exclusion group",
253+
self.assertTrue(
254+
self.suffix_sr.is_generational,
255+
"Sr. should be marked as generational",
258256
)
259-
self.assertEqual(
260-
self.suffix_iii.exclusion_group,
261-
"generational",
262-
"III should have generational exclusion group",
257+
self.assertTrue(
258+
self.suffix_iii.is_generational,
259+
"III should be marked as generational",
263260
)
264261
self.assertFalse(
265-
self.suffix_phd.exclusion_group,
266-
"PhD should not have an exclusion group",
262+
self.suffix_phd.is_generational,
263+
"PhD should not be marked as generational",
267264
)
268265

269-
def test_15_exclusion_group_prevents_conflicting_suffixes(self):
270-
"""Test that two suffixes from same exclusion group cannot be selected."""
266+
def test_15_generational_suffix_conflict_prevented(self):
267+
"""Test that two generational suffixes cannot be selected together."""
271268
individual = self.env["res.partner"].create(
272269
{
273270
"name": "Temp",
@@ -277,14 +274,14 @@ def test_15_exclusion_group_prevents_conflicting_suffixes(self):
277274
"is_group": False,
278275
}
279276
)
280-
# Try to add both Jr. and Sr. (both in 'generational' group)
277+
# Try to add both Jr. and Sr. (both generational)
281278
with self.assertRaises(ValidationError) as context:
282279
individual.write({"suffix_ids": [(6, 0, [self.suffix_jr.id, self.suffix_sr.id])]})
283-
self.assertIn("generational", str(context.exception))
280+
self.assertIn("generational", str(context.exception).lower())
284281

285-
def test_16_exclusion_group_allows_different_groups(self):
286-
"""Test that suffixes from different groups can be selected together."""
287-
# Jr. (generational) + PhD (no group) should work
282+
def test_16_generational_with_non_generational_allowed(self):
283+
"""Test that generational + non-generational suffixes can be combined."""
284+
# Jr. (generational) + PhD (non-generational) should work
288285
individual = self.env["res.partner"].create(
289286
{
290287
"name": "Temp",
@@ -299,7 +296,7 @@ def test_16_exclusion_group_allows_different_groups(self):
299296
individual.name_change()
300297
self.assertEqual(individual.name, "SMITH, JANE, JR., PHD")
301298

302-
def test_17_exclusion_group_roman_numerals_conflict(self):
299+
def test_17_roman_numerals_conflict(self):
303300
"""Test that two roman numeral suffixes cannot be selected together."""
304301
individual = self.env["res.partner"].create(
305302
{
@@ -311,11 +308,11 @@ def test_17_exclusion_group_roman_numerals_conflict(self):
311308
}
312309
)
313310
suffix_iv = self.env.ref("spp_registry_name_suffix.suffix_iv")
314-
# Try to add both III and IV (both in 'generational' group)
311+
# Try to add both III and IV (both generational)
315312
with self.assertRaises(ValidationError):
316313
individual.write({"suffix_ids": [(6, 0, [self.suffix_iii.id, suffix_iv.id])]})
317314

318-
def test_18_exclusion_group_jr_and_roman_numeral_conflict(self):
315+
def test_18_jr_and_roman_numeral_conflict(self):
319316
"""Test that Jr. and roman numerals cannot be selected together."""
320317
individual = self.env["res.partner"].create(
321318
{
@@ -326,6 +323,6 @@ def test_18_exclusion_group_jr_and_roman_numeral_conflict(self):
326323
"is_group": False,
327324
}
328325
)
329-
# Try to add Jr. and III (both in 'generational' group)
326+
# Try to add Jr. and III (both generational)
330327
with self.assertRaises(ValidationError):
331328
individual.write({"suffix_ids": [(6, 0, [self.suffix_jr.id, self.suffix_iii.id])]})

spp_registry_name_suffix/views/name_suffix_views.xml

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<field name="sequence" widget="handle" />
1111
<field name="name" />
1212
<field name="code" />
13-
<field name="exclusion_group" optional="show" />
13+
<field name="is_generational" />
1414
<field name="active" />
1515
</tree>
1616
</field>
@@ -30,7 +30,7 @@
3030
</group>
3131
<group name="right_group">
3232
<field name="sequence" />
33-
<field name="exclusion_group" />
33+
<field name="is_generational" />
3434
</group>
3535
</group>
3636
<group name="description_group">
@@ -49,16 +49,13 @@
4949
<search>
5050
<field name="name" />
5151
<field name="code" />
52-
<field name="exclusion_group" />
5352
<filter name="filter_active" string="Active" domain="[('active', '=', True)]" />
5453
<filter name="filter_inactive" string="Archived" domain="[('active', '=', False)]" />
55-
<group expand="0" string="Group By">
56-
<filter
57-
name="groupby_exclusion"
58-
string="Exclusion Group"
59-
context="{'group_by': 'exclusion_group'}"
60-
/>
61-
</group>
54+
<filter
55+
name="filter_generational"
56+
string="Generational"
57+
domain="[('is_generational', '=', True)]"
58+
/>
6259
</search>
6360
</field>
6461
</record>

0 commit comments

Comments
 (0)