From f5604193e6ca9efcc904fa38c0c7fda12dae8ece Mon Sep 17 00:00:00 2001
From: Benjamin Bertrand <benjamin.bertrand@esss.se>
Date: Wed, 13 Dec 2017 14:46:05 +0100
Subject: [PATCH] Allow to register MAC addresses with items

---
 app/inventory/forms.py                   | 16 ++++++++++++++--
 app/inventory/views.py                   |  1 +
 app/networks/forms.py                    |  2 +-
 app/templates/inventory/create_item.html |  1 +
 4 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/app/inventory/forms.py b/app/inventory/forms.py
index ff89563..008c72e 100644
--- a/app/inventory/forms.py
+++ b/app/inventory/forms.py
@@ -9,10 +9,19 @@ This module defines the inventory blueprint forms.
 :license: BSD 2-Clause, see LICENSE for more details.
 
 """
+import re
 from flask_wtf import FlaskForm
-from wtforms import SelectField, StringField, SelectMultipleField, validators
+from wtforms import SelectField, StringField, validators
 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(FlaskForm):
     name = StringField('name', validators=[validators.DataRequired()])
@@ -29,7 +38,10 @@ class ItemForm(FlaskForm):
     location_id = SelectField('Location')
     status_id = SelectField('Status')
     parent_id = SelectField('Parent')
-    # macs = SelectMultipleField('Macs')
+    mac_addresses = StringField(
+        'MAC addresses',
+        description='space separated list of MAC addresses',
+        validators=[validators.Optional(), check_mac_addresses_list])
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
diff --git a/app/inventory/views.py b/app/inventory/views.py
index 6347dd4..33bf7a4 100644
--- a/app/inventory/views.py
+++ b/app/inventory/views.py
@@ -81,6 +81,7 @@ def create_item():
                            location_id=form.location_id.data or None,
                            status_id=form.status_id.data or None,
                            parent_id=form.parent_id.data or None)
+        item.macs = [models.Mac(address=address) for address in form.mac_addresses.data.split()]
         current_app.logger.debug(f'Trying to create: {item!r}')
         db.session.add(item)
         try:
diff --git a/app/networks/forms.py b/app/networks/forms.py
index 0cbba4b..cc36dcd 100644
--- a/app/networks/forms.py
+++ b/app/networks/forms.py
@@ -10,7 +10,7 @@ This module defines the networks blueprint forms.
 
 """
 from flask_wtf import FlaskForm
-from wtforms import SelectField, StringField, SelectMultipleField, validators
+from wtforms import SelectField, StringField, validators
 from .. import utils, models
 
 
diff --git a/app/templates/inventory/create_item.html b/app/templates/inventory/create_item.html
index 3f0bfe0..fca4dcd 100644
--- a/app/templates/inventory/create_item.html
+++ b/app/templates/inventory/create_item.html
@@ -24,6 +24,7 @@
     {{ render_field(form.location_id) }}
     {{ render_field(form.status_id) }}
     {{ render_field(form.parent_id) }}
+    {{ render_field(form.mac_addresses) }}
     <div class="form-group row">
       <div class="col-sm-10">
         <button type="submit" class="btn btn-primary">Submit</button>
-- 
GitLab