diff --git a/app/inventory/forms.py b/app/inventory/forms.py index 67773e0c3772f5f0beaf9c4c2c389369da28e956..90163beb2277f541ffabb7d9e6176e6e6ce96a0d 100644 --- a/app/inventory/forms.py +++ b/app/inventory/forms.py @@ -9,20 +9,11 @@ This module defines the inventory blueprint forms. :license: BSD 2-Clause, see LICENSE for more details. """ -import re from wtforms import SelectField, StringField, TextAreaField, validators from ..helpers import CSEntryForm -from ..validators import Unique +from ..validators import Unique, RegexpList, MAC_ADDRESS_RE from .. import utils, models -MAC_ADDRESS_RE = re.compile('^(?:[0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$') - - -def check_mac_addresses_list(form, field): - for address in field.data.split(): - if MAC_ADDRESS_RE.match(address) is None: - raise validators.ValidationError('Invalid Mac address') - class AttributeForm(CSEntryForm): name = StringField('name', validators=[validators.DataRequired()]) @@ -43,7 +34,8 @@ class ItemForm(CSEntryForm): mac_addresses = StringField( 'MAC addresses', description='space separated list of MAC addresses', - validators=[validators.Optional(), check_mac_addresses_list]) + validators=[validators.Optional(), + RegexpList(MAC_ADDRESS_RE, message='Invalid MAC address')]) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/app/validators.py b/app/validators.py index 3beb4dbccc8b70b4e163d6bcc1b2ec65983eedff..88f8f9ae7d48ace3b418224581249e8aee8a9a32 100644 --- a/app/validators.py +++ b/app/validators.py @@ -10,9 +10,12 @@ This module defines extra field validators """ import ipaddress +import re import sqlalchemy as sa from wtforms import ValidationError +MAC_ADDRESS_RE = re.compile('^(?:[0-9a-fA-F]{2}[:-]){5}[0-9a-fA-F]{2}$') + class IPNetwork: """Validates an IP network. @@ -59,3 +62,21 @@ class Unique(object): raise ValidationError(self.message) except sa.orm.exc.NoResultFound: pass + + +class RegexpList: + """Validates a list of strings against a user provided regexp. + + :param regex: the regular expression to use + :param message: the error message + """ + def __init__(self, regex, message=None): + self.regex = regex + if message is None: + message = 'Invalid input.' + self.message = message + + def __call__(self, form, field): + for string in field.data.split(): + if self.regex.match(string) is None: + raise ValidationError(self.message)