Skip to content

Commit 5959b3a

Browse files
committed
Added a validator for the reviewer settings' Filter Regexp field, to make sure that we don't later hit exceptions when trying to compile and use the regexp entered.
- Legacy-Id: 12439
1 parent e3ce2a9 commit 5959b3a

2 files changed

Lines changed: 36 additions & 1 deletion

File tree

ietf/review/models.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from ietf.group.models import Group
77
from ietf.person.models import Person, Email
88
from ietf.name.models import ReviewTypeName, ReviewRequestStateName, ReviewResultName
9+
from ietf.utils.validators import validate_regular_expression_string
910

1011
class ReviewerSettings(models.Model):
1112
"""Keeps track of admin data associated with a reviewer in a team."""
@@ -19,7 +20,9 @@ class ReviewerSettings(models.Model):
1920
(91, "Once per quarter"),
2021
]
2122
min_interval = models.IntegerField(verbose_name="Can review at most", choices=INTERVALS, blank=True, null=True)
22-
filter_re = models.CharField(max_length=255, verbose_name="Filter regexp", blank=True, help_text="Draft names matching regular expression should not be assigned")
23+
filter_re = models.CharField(max_length=255, verbose_name="Filter regexp", blank=True,
24+
validators=[validate_regular_expression_string, ],
25+
help_text="Draft names matching this regular expression should not be assigned")
2326
skip_next = models.IntegerField(default=0, verbose_name="Skip next assignments")
2427
remind_days_before_deadline = models.IntegerField(null=True, blank=True, help_text="To get an email reminder in case you forget to do an assigned review, enter the number of days before review deadline you want to receive it. Clear the field if you don't want a reminder.")
2528

ietf/utils/validators.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# -*- python -*-
2+
# Copyright The IETF Trust 2007, All Rights Reserved
3+
from __future__ import unicode_literals
4+
5+
import re
6+
7+
from django.core.exceptions import ValidationError
8+
9+
10+
class RegexStringValidator(object):
11+
12+
def __init__(self,):
13+
pass
14+
15+
def __call__(self, value):
16+
"""
17+
Validates that the given regular expression can be compiled.
18+
"""
19+
try:
20+
re.compile(value)
21+
except Exception as e:
22+
raise ValidationError('Please enter a valid regular expression. '
23+
'Got an error when trying to compile this: "%s" : "%s"'
24+
% (self.message, value, e))
25+
if '-*' in value:
26+
raise ValidationError('Did you really mean that? The regular expression '
27+
'contains "-*" which will match zero or more dashes. '
28+
'Maybe you meant to write "-.*"? If you actually meant "-*", '
29+
'you can use "[-]*" instead to get past this error.')
30+
31+
32+
validate_regular_expression_string = RegexStringValidator()

0 commit comments

Comments
 (0)