diff --git a/netbox/dcim/fields.py b/netbox/dcim/fields.py new file mode 100644 index 000000000..1d756c910 --- /dev/null +++ b/netbox/dcim/fields.py @@ -0,0 +1,43 @@ +from netaddr import EUI, mac_unix_expanded + +from django.core.exceptions import ValidationError +from django.db import models + +from .formfields import MACAddressFormField + +class mac_unix_expanded_uppercase(mac_unix_expanded): + word_fmt = '%.2X' + + +class MACAddressField(models.Field): + description = "PostgreSQL MAC Address field" + + def python_type(self): + return EUI + + def from_db_value(self, value, expression, connection, context): + return self.to_python(value) + + def to_python(self, value): + if not value: + return value + try: + return EUI(value, dialect=mac_unix_expanded_uppercase) + except ValueError as e: + raise ValidationError(e) + + def db_type(self, connection): + return 'macaddr' + + def get_prep_value(self, value): + if not value: + return None + return str(self.to_python(value)) + + def form_class(self): + return MACAddressFormField + + def formfield(self, **kwargs): + defaults = {'form_class': self.form_class()} + defaults.update(kwargs) + return super(MACAddressField, self).formfield(**defaults) diff --git a/netbox/dcim/formfields.py b/netbox/dcim/formfields.py new file mode 100644 index 000000000..e3f1ae39d --- /dev/null +++ b/netbox/dcim/formfields.py @@ -0,0 +1,26 @@ +from netaddr import EUI, AddrFormatError + +from django import forms +from django.core.exceptions import ValidationError + + +# +# Form fields +# + +class MACAddressFormField(forms.Field): + default_error_messages = { + 'invalid': "Enter a valid MAC address.", + } + + def to_python(self, value): + if not value: + return None + + if isinstance(value, EUI): + return value + + try: + return EUI(value) + except AddrFormatError: + raise ValidationError("Please specify a valid MAC address.") diff --git a/netbox/dcim/migrations/0004_interface_mac_address.py b/netbox/dcim/migrations/0004_interface_mac_address.py index 5dd393ab1..fd1ac958d 100644 --- a/netbox/dcim/migrations/0004_interface_mac_address.py +++ b/netbox/dcim/migrations/0004_interface_mac_address.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-01 13:53 +# Generated by Django 1.9.7 on 2016-07-05 10:01 from __future__ import unicode_literals -from django.db import migrations -import macaddress.fields +from django.db import migrations, models +from ..fields import MACAddressField class Migration(migrations.Migration): @@ -16,6 +16,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='interface', name='mac_address', - field=macaddress.fields.MACAddressField(blank=True, integer=True, null=True), + field=MACAddressField(blank=True, null=True, verbose_name=b'MAC Address'), ), ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 5670516e3..2f1a62d36 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -10,7 +10,7 @@ from extras.rpc import RPC_CLIENTS from utilities.fields import NullableCharField from utilities.models import CreatedUpdatedModel -from macaddress.fields import MACAddressField +from .fields import MACAddressField RACK_FACE_FRONT = 0 RACK_FACE_REAR = 1 diff --git a/requirements.txt b/requirements.txt index f99ce2ddf..c1afc1b21 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,7 +5,6 @@ django-filter==0.13.0 django-rest-swagger==0.3.7 django-tables2==1.2.1 djangorestframework==3.3.3 -django-macaddress==1.3.2 graphviz==0.4.10 Markdown==2.6.6 ncclient==0.4.7