stages/identification: add case_insensitive_matching

closes #248
This commit is contained in:
Jens Langhammer 2020-09-30 23:48:53 +02:00
parent 719099a5af
commit 516455f482
5 changed files with 43 additions and 2 deletions

View file

@ -15,6 +15,7 @@ class IdentificationStageSerializer(ModelSerializer):
"pk", "pk",
"name", "name",
"user_fields", "user_fields",
"case_insensitive_matching",
"template", "template",
"enrollment_flow", "enrollment_flow",
"recovery_flow", "recovery_flow",

View file

@ -27,7 +27,14 @@ class IdentificationStageForm(forms.ModelForm):
class Meta: class Meta:
model = IdentificationStage model = IdentificationStage
fields = ["name", "user_fields", "template", "enrollment_flow", "recovery_flow"] fields = [
"name",
"user_fields",
"case_insensitive_matching",
"template",
"enrollment_flow",
"recovery_flow",
]
widgets = { widgets = {
"name": forms.TextInput(), "name": forms.TextInput(),
"user_fields": FilteredSelectMultiple( "user_fields": FilteredSelectMultiple(

View file

@ -0,0 +1,21 @@
# Generated by Django 3.1.1 on 2020-09-30 21:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("passbook_stages_identification", "0003_auto_20200615_1641"),
]
operations = [
migrations.AddField(
model_name="identificationstage",
name="case_insensitive_matching",
field=models.BooleanField(
default=True,
help_text="When enabled, user fields are matched regardless of their casing.",
),
),
]

View file

@ -34,6 +34,13 @@ class IdentificationStage(Stage):
) )
template = models.TextField(choices=Templates.choices) template = models.TextField(choices=Templates.choices)
case_insensitive_matching = models.BooleanField(
default=True,
help_text=_(
"When enabled, user fields are matched regardless of their casing."
),
)
enrollment_flow = models.ForeignKey( enrollment_flow = models.ForeignKey(
Flow, Flow,
on_delete=models.SET_DEFAULT, on_delete=models.SET_DEFAULT,

View file

@ -70,7 +70,12 @@ class IdentificationStageView(FormView, StageView):
current_stage: IdentificationStage = self.executor.current_stage current_stage: IdentificationStage = self.executor.current_stage
query = Q() query = Q()
for search_field in current_stage.user_fields: for search_field in current_stage.user_fields:
query |= Q(**{search_field: uid_value}) model_field = search_field
if current_stage.case_insensitive_matching:
model_field += "__iexact"
else:
model_field += "__exact"
query |= Q(**{model_field: uid_value})
users = User.objects.filter(query) users = User.objects.filter(query)
if users.exists(): if users.exists():
LOGGER.debug("Found user", user=users.first(), query=query) LOGGER.debug("Found user", user=users.first(), query=query)