Skip to content

Commit 1b61f4f

Browse files
committed
change restricted councils to be councils to select from first
1 parent 3da2ecf commit 1b61f4f

File tree

3 files changed

+69
-37
lines changed

3 files changed

+69
-37
lines changed

crowdsourcer/management/commands/import_volunteers.py

+46-18
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ def add_arguments(self, parser):
119119
)
120120

121121
parser.add_argument(
122-
"--council_restrictions",
122+
"--preferred_councils",
123123
action="store_true",
124-
help="the data contains a column with council restrictions, e.g Welsh councils.",
124+
help="the data contains a column with councils to select from first, e.g Welsh councils.",
125125
)
126126

127127
parser.add_argument(
@@ -156,8 +156,8 @@ def init(self, file, options):
156156
self.column_names.append("assignment_count")
157157
self.usecols.append("How many sections?")
158158

159-
if options["council_restrictions"]:
160-
self.column_names.append("council_restrictions")
159+
if options["preferred_councils"]:
160+
self.column_names.append("preferred_councils")
161161
self.usecols.append("Nations/London")
162162

163163
if options["debug"]:
@@ -170,8 +170,8 @@ def get_df(self, filename):
170170
)
171171
df.columns = self.column_names
172172

173-
if "council_restrictions" in df.columns:
174-
df["council_restrictions"] = df["council_restrictions"].astype(str)
173+
if "preferred_councils" in df.columns:
174+
df["preferred_councils"] = df["preferred_councils"].astype(str)
175175

176176
return df
177177

@@ -330,18 +330,18 @@ def add_users_and_assignments(self, df, response_type, session, rt, options):
330330

331331
included_types = []
332332
included_countries = []
333-
if options["council_restrictions"]:
334-
restrictions = row["council_restrictions"].split(",")
333+
if options["preferred_councils"]:
334+
preferred = row["preferred_councils"].split(",")
335335

336-
for r in restrictions:
337-
if r.lower() in [
336+
for p in preferred:
337+
if p.lower() in [
338338
"scotland",
339339
"england",
340340
"wales",
341341
"northern ireland",
342342
]:
343-
included_countries.append(r.lower())
344-
elif r == "London":
343+
included_countries.append(p.lower())
344+
elif p == "London":
345345
included_types.append("LBO")
346346

347347
councils_to_assign = PublicAuthority.objects.filter(
@@ -350,25 +350,53 @@ def add_users_and_assignments(self, df, response_type, session, rt, options):
350350
Q(id__in=assigned_councils) | Q(type="COMB") | Q(do_not_mark=True)
351351
)
352352

353+
preferred_councils = councils_to_assign
354+
has_preferred = False
353355
if len(included_types) > 0 and len(included_countries) > 0:
354-
councils_to_assign = councils_to_assign.filter(
356+
has_preferred = True
357+
preferred_councils = preferred_councils.filter(
355358
Q(country__in=included_countries) | Q(type__in=included_types)
356359
)
357360
elif len(included_types) > 0:
358-
councils_to_assign = councils_to_assign.filter(type__in=included_types)
361+
has_preferred = True
362+
preferred_councils = preferred_councils.filter(type__in=included_types)
359363
elif len(included_countries) > 0:
360-
councils_to_assign = councils_to_assign.filter(
364+
has_preferred = True
365+
preferred_councils = preferred_councils.filter(
361366
country__in=included_countries
362367
)
363368

364-
councils_to_assign = councils_to_assign[:num_councils]
369+
if has_preferred:
370+
preferred_councils = preferred_councils[:num_councils]
371+
councils_left = num_councils - preferred_councils.count()
372+
councils_to_assign = councils_to_assign.exclude(
373+
id__in=preferred_councils
374+
)[:councils_left]
375+
council_count = preferred_councils.count() + councils_to_assign.count()
376+
else:
377+
councils_to_assign = councils_to_assign[:num_councils]
378+
council_count = councils_to_assign.count()
365379

366-
if councils_to_assign.count() == 0:
380+
if council_count == 0:
367381
self.stdout.write(
368382
f"{YELLOW}No councils left in {s.title} for {u.email}{NOBOLD}"
369383
)
370384

371385
if options["make_assignments"] is True:
386+
if self.debug:
387+
self.stdout.write(
388+
f"{YELLOW}Assigning {council_count} councils in {s.title} to {u.email}{NOBOLD}"
389+
)
390+
391+
if has_preferred:
392+
for council in preferred_councils:
393+
a, created = Assigned.objects.update_or_create(
394+
user=u,
395+
section=s,
396+
authority=council,
397+
marking_session=session,
398+
response_type=rt,
399+
)
372400
for council in councils_to_assign:
373401
a, created = Assigned.objects.update_or_create(
374402
user=u,
@@ -415,7 +443,7 @@ def handle(
415443
).count()
416444
for section in Section.objects.filter(marking_session=session).all():
417445
assigned = Assigned.objects.filter(
418-
section=section, response_type=rt
446+
section=section, response_type=rt, marking_session=session
419447
).count()
420448
if assigned != council_count:
421449
self.stdout.write(
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
First name,Last name,Email,Council Area,Type of Volunteering,Assigned Section,Nations/London
2-
First,Last,first_last@example.org,Aberdeenshire Council,Scorecards Volunteering,Transport,"Scotland,London"
2+
First,Last,first_last@example.org,Aberdeenshire Council,Scorecards Volunteering,Transport,"England,London"

crowdsourcer/tests/test_import_volunteers_script.py

+22-18
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ def add_extra_councils(self):
5151
ms = MarkingSession.objects.get(label="Default")
5252
for council in councils:
5353
a = PublicAuthority.objects.create(
54-
name=council[0], unique_id=council[1], type="DIS", questiongroup_id=2
54+
name=council[0],
55+
country="england",
56+
unique_id=council[1],
57+
type="DIS",
58+
questiongroup_id=2,
5559
)
5660
a.marking_session.set([ms])
5761

@@ -442,7 +446,7 @@ def test_assignment_limits_in_file(self):
442446
3,
443447
)
444448

445-
def test_council_restrictions(self):
449+
def test_council_preferences(self):
446450
data_file = (
447451
pathlib.Path(__file__).parent.resolve()
448452
/ "data"
@@ -457,53 +461,53 @@ def test_council_restrictions(self):
457461
file=data_file,
458462
add_users=True,
459463
make_assignments=True,
460-
council_restrictions=True,
464+
preferred_councils=True,
461465
)
462466
self.assertEquals(User.objects.count(), 1)
463467
self.assertEquals(Marker.objects.count(), 1)
464-
self.assertEquals(Assigned.objects.count(), 1)
468+
self.assertEquals(Assigned.objects.count(), 6)
465469
self.assertEquals(
466470
Assigned.objects.filter(
467471
marking_session__label="Default", section__title="Transport"
468472
).count(),
469-
1,
473+
6,
470474
)
471475

472-
a = Assigned.objects.filter(
473-
marking_session__label="Default", section__title="Transport"
474-
).first()
475-
self.assertEquals(a.authority.name, "Aberdeen City Council")
476+
councils = [a.authority.name for a in Assigned.objects.all()]
477+
self.assertTrue("Aberdeen City Council" not in councils)
476478

477479
# need to remove them all as won't assign to people with existing assignments
478480
Assigned.objects.all().delete()
479481

480-
ob = PublicAuthority.objects.get(unique_id="E90008")
482+
ob = PublicAuthority.objects.get(unique_id="E90001")
481483
ob.type = "LBO"
482484
ob.save()
483485

486+
PublicAuthority.objects.filter(
487+
unique_id__in=("E90004", "E90005", "E90006", "E90007")
488+
).delete()
489+
484490
self.call_command(
485491
"import_volunteers",
486492
session="Default",
487493
file=data_file,
488494
add_users=True,
489495
make_assignments=True,
490-
council_restrictions=True,
496+
preferred_councils=True,
491497
)
492498
self.assertEquals(User.objects.count(), 1)
493499
self.assertEquals(Marker.objects.count(), 1)
494-
self.assertEquals(Assigned.objects.count(), 2)
500+
self.assertEquals(Assigned.objects.count(), 6)
495501
self.assertEquals(
496502
Assigned.objects.filter(
497503
marking_session__label="Default", section__title="Transport"
498504
).count(),
499-
2,
505+
6,
500506
)
501507

502-
a = Assigned.objects.filter(
503-
marking_session__label="Default", section__title="Transport"
504-
)
505-
self.assertEquals(a[0].authority.name, "Aberdeen City Council")
506-
self.assertEquals(a[1].authority.name, "Old Borsetshire")
508+
councils = [a.authority.name for a in Assigned.objects.all()]
509+
self.assertTrue("East Borsetshire" in councils)
510+
self.assertTrue("Aberdeen City Council" in councils)
507511

508512
def test_audit_assignments(self):
509513
data_file = pathlib.Path(__file__).parent.resolve() / "data" / "volunteers.csv"

0 commit comments

Comments
 (0)