You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.6 KiB
87 lines
2.6 KiB
from django import forms
|
|
from django.core.exceptions import ValidationError
|
|
from django.utils.translation import gettext_lazy as _
|
|
from django.db import IntegrityError
|
|
|
|
from djing.lib.tln.tln import ValidationError as TlnValidationError
|
|
from . import models
|
|
from djing import MAC_ADDR_REGEX, IP_ADDR_REGEX
|
|
|
|
|
|
class DeviceForm(forms.ModelForm):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
"""
|
|
Move comment from value to placeholder in HTML form
|
|
"""
|
|
initial = kwargs.get('initial')
|
|
if initial:
|
|
comment = initial.get('comment')
|
|
del initial['comment']
|
|
else:
|
|
comment = None
|
|
super(DeviceForm, self).__init__(*args, **kwargs)
|
|
self.fields['comment'].widget.attrs['placeholder'] = comment
|
|
|
|
mac_addr = forms.CharField(widget=forms.TextInput(attrs={
|
|
'pattern': MAC_ADDR_REGEX,
|
|
'required': True
|
|
}), error_messages={
|
|
'required': _('Mac address is required for fill'),
|
|
'unique': _('Device with that mac is already exist')
|
|
})
|
|
|
|
def clean_snmp_extra(self):
|
|
snmp_extra = self.cleaned_data.get('snmp_extra')
|
|
if snmp_extra is None:
|
|
return
|
|
device = self.instance
|
|
# fixme: if creating device than check disabled
|
|
if device.pk is not None:
|
|
manager_class = device.get_manager_klass()
|
|
try:
|
|
manager_class.validate_extra_snmp_info(snmp_extra)
|
|
except TlnValidationError as e:
|
|
raise ValidationError(
|
|
e, code='invalid'
|
|
)
|
|
return snmp_extra
|
|
|
|
class Meta:
|
|
model = models.Device
|
|
exclude = ('map_dot', 'status', 'extra_data')
|
|
widgets = {
|
|
'ip_address': forms.TextInput(attrs={
|
|
'pattern': IP_ADDR_REGEX,
|
|
'placeholder': '192.168.0.100'
|
|
}),
|
|
'comment': forms.TextInput(attrs={
|
|
'required': True
|
|
})
|
|
}
|
|
|
|
|
|
class DeviceExtraDataForm(forms.ModelForm):
|
|
class Meta:
|
|
model = models.Device
|
|
fields = ('extra_data',)
|
|
|
|
|
|
class PortForm(forms.ModelForm):
|
|
class Meta:
|
|
model = models.Port
|
|
exclude = ('device',)
|
|
widgets = {
|
|
'num': forms.NumberInput(attrs={
|
|
'min': '0'
|
|
})
|
|
}
|
|
|
|
def save(self, commit=True):
|
|
try:
|
|
super(PortForm, self).save(commit)
|
|
except IntegrityError as e:
|
|
if "Duplicate entry" in str(e):
|
|
raise models.DeviceDBException(_('Port number on device must be unique'))
|
|
else:
|
|
raise models.DeviceDBException(e)
|