Browse Source

Add tabs for different networks types. And add validate mask in create form

devel
bashmak 8 years ago
parent
commit
fdfd085cbe
  1. 11
      ip_pool/forms.py
  2. 56
      ip_pool/migrations/0001_initial.py
  3. 22
      ip_pool/models.py
  4. 24
      ip_pool/templates/ip_pool/ext.html
  5. 16
      ip_pool/templates/ip_pool/network_list.html
  6. 0
      ip_pool/templatetags/__init__.py
  7. 14
      ip_pool/templatetags/ip_pool_tags.py
  8. 8
      ip_pool/urls.py
  9. 11
      ip_pool/views.py

11
ip_pool/forms.py

@ -1,15 +1,20 @@
from netaddr import IPNetwork, AddrFormatError, IPAddress
from django import forms
from django.core.exceptions import ValidationError
from ip_pool import models
class NetworkForm(forms.ModelForm):
mask = forms.CharField(max_length=39, min_length=7, widget=forms.TextInput())
def clean_network(self):
network = self.cleaned_data.get('network')
def clean_mask(self):
try:
return IPAddress(network)
network = IPAddress(self.data.get('network'))
mask = self.data.get('mask')
net = IPNetwork('%s/%s' % (network, mask))
ip, new_mask = str(net.cidr).split('/')
return new_mask
except AddrFormatError as e:
raise ValidationError(e, code='invalid')

56
ip_pool/migrations/0001_initial.py

@ -1,56 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11 on 2018-06-12 13:24
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='EmployedIpModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('ip', models.GenericIPAddressField(unique=True, verbose_name='Ip address')),
],
options={
'verbose_name': 'Employed ip',
'verbose_name_plural': 'Employed ip addresses',
'db_table': 'ip_pool_employed_ip',
'ordering': ('-id',),
},
),
migrations.CreateModel(
name='NetworkModel',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('network', models.GenericIPAddressField(help_text='Dot separated ip address. For example: 192.168.1.100', unique=True, verbose_name='IP network')),
('mask', models.PositiveSmallIntegerField(default=24, help_text='For example: 24, if network is 192.168.1.0/24', verbose_name='Mask')),
('work_range_start_ip', models.GenericIPAddressField(default=2, help_text='Ip from 192.168.1.2 may be used', verbose_name='Work range start ip')),
('work_range_end_ip', models.GenericIPAddressField(default=254, help_text='Ip may be used until 192.168.1.254', verbose_name='Work range end ip')),
('description', models.CharField(max_length=64, verbose_name='Description')),
],
options={
'verbose_name': 'Network',
'verbose_name_plural': 'Networks',
'db_table': 'ip_pool_network',
'ordering': ('description',),
},
),
migrations.AddField(
model_name='employedipmodel',
name='network',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='ip_pool.NetworkModel', verbose_name='Parent network'),
),
migrations.AlterUniqueTogether(
name='employedipmodel',
unique_together=set([('ip', 'network')]),
),
]

22
ip_pool/models.py

@ -7,6 +7,15 @@ from django.db import models
from django.utils.translation import gettext_lazy as _
IP_SUBNET_RE = (
'^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.'
'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.'
'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.'
'(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\/'
'(3[0-2]|2\d|1\d|\d))|(\/(3[0-2]|2\d|1\d|\d))$'
)
class NetworkModel(models.Model):
_netw_cache = None
@ -18,7 +27,8 @@ class NetworkModel(models.Model):
mask = models.PositiveSmallIntegerField(
_('Mask'),
help_text=_('For example: 24, if network is 192.168.1.0/24'),
default=24
default=24,
validators=()
)
work_range_start_ip = models.GenericIPAddressField(
verbose_name=_('Work range start ip'),
@ -28,6 +38,16 @@ class NetworkModel(models.Model):
verbose_name=_('Work range end ip'),
help_text=_('Ip may be used until 192.168.1.254')
)
NETWORK_KINDS = (
('inet', _('Internet')),
('guest', _('Guest')),
('trust', _('Trusted')),
('device', _('Devices')),
('admin', _('Admin'))
)
kind = models.CharField(_('Kind of network'), max_length=6, choices=NETWORK_KINDS, default='guest')
description = models.CharField(_('Description'), max_length=64)
def __str__(self):

24
ip_pool/templates/ip_pool/ext.html

@ -1,6 +1,6 @@
{% extends request.is_ajax|yesno:'bajax.html,base.html' %}
{% load i18n %}
{% load ip_pool_tags %}
{% block breadcrumb %}
<ol class="breadcrumb">
@ -9,16 +9,30 @@
</ol>
{% endblock %}
{% block page-header %}
{% trans 'Networks' %}
{% endblock %}
{% block main %}
<ul class="nav nav-tabs">
{% url 'taskapp:home' as taskhome %}
<li{% if taskhome == request.path %} class="active"{% endif %}>
<a href="{{ taskhome }}">
{% trans 'New tasks' %}
{% url 'ip_pool:networks' as net_list_url %}
<li{% if net_list_url == request.path %} class="active"{% endif %}>
<a href="{{ net_list_url }}">
{% trans 'All networks' %}
</a>
</li>
{% get_device_kinds as device_kinds_codes %}
{% for dev_kind_code_url, dev_kind_descr in device_kinds_codes %}
<li{% if dev_kind_code_url == request.path %} class="active"{% endif %}>
<a href="{{ dev_kind_code_url }}">
{% trans dev_kind_descr %}
</a>
</li>
{% endfor %}
</ul>
<div class="tab-content">

16
ip_pool/templates/ip_pool/network_list.html

@ -1,4 +1,4 @@
{% extends 'base.html' %}
{% extends 'ip_pool/ext.html' %}
{% load i18n %}
{% block breadcrumb %}
@ -12,7 +12,7 @@
{% trans 'Networks' %}
{% endblock %}
{% block main %}
{% block content %}
<div class="table-responsive">
<table class="table table-striped table-bordered">
<thead>
@ -25,14 +25,14 @@
</thead>
<tbody>
{% with can_ch_net=perms.ip_pool.change_networkmodel %}
{% for net in networks %}
{% for netw in networks_list %}
<tr>
<td><a href="{% url 'ip_pool:ip_list' net.pk %}">{{ net }}</a></td>
<td>{{ net.work_range_start_ip }}</td>
<td>{{ net.work_range_end_ip }}</td>
<td><a href="{% url 'ip_pool:ip_list' netw.id %}">{{ netw }}</a></td>
<td>{{ netw.work_range_start_ip }}</td>
<td>{{ netw.work_range_end_ip }}</td>
<td class="btn-group btn-group-sm btn-group-justified">
{% if can_ch_net %}
<a href="{% url 'ip_pool:net_edit' net.pk %}" class="btn btn-primary">
<a href="{% url 'ip_pool:net_edit' netw.pk %}" class="btn btn-primary">
<span class="glyphicon glyphicon-edit"></span>
<span class="hidden-xs hidden-sm">{% trans 'Edit' %}</span>
</a>
@ -42,7 +42,7 @@
<span class="hidden-xs hidden-sm">{% trans 'Edit' %}</span>
</a>
{% endif %}
<a href="{% url 'ip_pool:ip_list' net.pk %}" class="btn btn-default">
<a href="{% url 'ip_pool:ip_list' netw.pk %}" class="btn btn-default">
<span class="glyphicon glyphicon-eye-open"></span>
<span class="hidden-xs hidden-sm">{% trans 'View employed' %}</span>
</a>

0
ip_pool/templatetags/__init__.py

14
ip_pool/templatetags/ip_pool_tags.py

@ -0,0 +1,14 @@
from django import template
from django.shortcuts import resolve_url
from ip_pool.models import NetworkModel
register = template.Library()
@register.simple_tag
def get_device_kinds():
return ((
resolve_url('ip_pool:networks_%s' % kind_code),
kind_descr
)for kind_code, kind_descr in NetworkModel.NETWORK_KINDS)

8
ip_pool/urls.py

@ -1,5 +1,6 @@
from django.conf.urls import url
from ip_pool import views
from ip_pool import models
app_name = 'ip_pool'
@ -9,3 +10,10 @@ urlpatterns = [
url('^(?P<net_id>\d{1,6})/$', views.IpEmployedListView.as_view(), name='ip_list'),
url('^(?P<net_id>\d{1,6})/edit$', views.NetworkUpdateView.as_view(), name='net_edit'),
]
for dev_kind_code, _ in models.NetworkModel.NETWORK_KINDS:
urlpatterns.append(url(
'^networks_%s/$' % dev_kind_code,
views.NetworksListView.as_view(device_kind_code=dev_kind_code),
name='networks_%s' % dev_kind_code
))

11
ip_pool/views.py

@ -1,6 +1,6 @@
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.shortcuts import resolve_url, get_object_or_404
from django.shortcuts import get_object_or_404
from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _
from django.views.generic import UpdateView, CreateView
@ -12,10 +12,17 @@ from ip_pool import models, forms
@method_decorator(login_required, name='dispatch')
class NetworksListView(BaseOrderedFilteringList):
device_kind_code = None
template_name = 'ip_pool/network_list.html'
context_object_name = 'networks'
context_object_name = 'networks_list'
model = models.NetworkModel
def get_queryset(self):
qs = super().get_queryset()
if isinstance(self.device_kind_code, str):
return qs.filter(kind=self.device_kind_code)
return qs
@method_decorator(login_required, name='dispatch')
@method_decorator(permission_required('ip_pool.change_networkmodel'), name='dispatch')

Loading…
Cancel
Save