mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-28 03:16:25 -06:00
Fix to pass PEP8 check and tests
This commit is contained in:
parent
50dc519a42
commit
f873848e29
@ -12,6 +12,7 @@ class ZoneAdmin(admin.ModelAdmin):
|
|||||||
'soa_name': ['name'],
|
'soa_name': ['name'],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Record)
|
@admin.register(Record)
|
||||||
class RecordAdmin(admin.ModelAdmin):
|
class RecordAdmin(admin.ModelAdmin):
|
||||||
list_display = ['name', 'zone', 'record_type', 'priority', 'address', 'value']
|
list_display = ['name', 'zone', 'record_type', 'priority', 'address', 'value']
|
||||||
|
@ -7,12 +7,14 @@ from dns.models import Zone, Record
|
|||||||
# Zones
|
# Zones
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class ZoneSerializer(serializers.ModelSerializer):
|
class ZoneSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Zone
|
model = Zone
|
||||||
fields = ['id', 'name', 'ttl', 'soa_name', 'soa_contact', 'soa_serial', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'description']
|
fields = ['id', 'name', 'ttl', 'soa_name', 'soa_contact', 'soa_serial', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'description']
|
||||||
|
|
||||||
|
|
||||||
class ZoneNestedSerializer(ZoneSerializer):
|
class ZoneNestedSerializer(ZoneSerializer):
|
||||||
|
|
||||||
class Meta(ZoneSerializer.Meta):
|
class Meta(ZoneSerializer.Meta):
|
||||||
@ -23,6 +25,7 @@ class ZoneNestedSerializer(ZoneSerializer):
|
|||||||
# Records
|
# Records
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class RecordSerializer(serializers.ModelSerializer):
|
class RecordSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
zone = ZoneNestedSerializer()
|
zone = ZoneNestedSerializer()
|
||||||
@ -32,6 +35,7 @@ class RecordSerializer(serializers.ModelSerializer):
|
|||||||
model = Record
|
model = Record
|
||||||
fields = ['id', 'name', 'record_type', 'priority', 'zone', 'address', 'value', 'description']
|
fields = ['id', 'name', 'record_type', 'priority', 'zone', 'address', 'value', 'description']
|
||||||
|
|
||||||
|
|
||||||
class RecordNestedSerializer(RecordSerializer):
|
class RecordNestedSerializer(RecordSerializer):
|
||||||
|
|
||||||
class Meta(RecordSerializer.Meta):
|
class Meta(RecordSerializer.Meta):
|
||||||
|
@ -14,6 +14,7 @@ from . import serializers
|
|||||||
# Zones
|
# Zones
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class ZoneListView(generics.ListAPIView):
|
class ZoneListView(generics.ListAPIView):
|
||||||
"""
|
"""
|
||||||
List all zones
|
List all zones
|
||||||
@ -22,6 +23,7 @@ class ZoneListView(generics.ListAPIView):
|
|||||||
serializer_class = serializers.ZoneSerializer
|
serializer_class = serializers.ZoneSerializer
|
||||||
filter_class = filters.ZoneFilter
|
filter_class = filters.ZoneFilter
|
||||||
|
|
||||||
|
|
||||||
class ZoneDetailView(generics.RetrieveAPIView):
|
class ZoneDetailView(generics.RetrieveAPIView):
|
||||||
"""
|
"""
|
||||||
Retrieve a single zone
|
Retrieve a single zone
|
||||||
@ -29,10 +31,12 @@ class ZoneDetailView(generics.RetrieveAPIView):
|
|||||||
queryset = Zone.objects.all()
|
queryset = Zone.objects.all()
|
||||||
serializer_class = serializers.ZoneSerializer
|
serializer_class = serializers.ZoneSerializer
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Records
|
# Records
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class RecordListView(generics.ListAPIView):
|
class RecordListView(generics.ListAPIView):
|
||||||
"""
|
"""
|
||||||
List all records
|
List all records
|
||||||
@ -40,6 +44,7 @@ class RecordListView(generics.ListAPIView):
|
|||||||
queryset = Record.objects.all()
|
queryset = Record.objects.all()
|
||||||
serializer_class = serializers.RecordSerializer
|
serializer_class = serializers.RecordSerializer
|
||||||
|
|
||||||
|
|
||||||
class RecordDetailView(generics.RetrieveAPIView):
|
class RecordDetailView(generics.RetrieveAPIView):
|
||||||
"""
|
"""
|
||||||
Retrieve a single record
|
Retrieve a single record
|
||||||
@ -47,10 +52,12 @@ class RecordDetailView(generics.RetrieveAPIView):
|
|||||||
queryset = Record.objects.all()
|
queryset = Record.objects.all()
|
||||||
serializer_class = serializers.RecordSerializer
|
serializer_class = serializers.RecordSerializer
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BIND Exports
|
# BIND Exports
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
@api_view(['GET'])
|
@api_view(['GET'])
|
||||||
def bind_forward(request):
|
def bind_forward(request):
|
||||||
"""
|
"""
|
||||||
@ -59,6 +66,7 @@ def bind_forward(request):
|
|||||||
zones_list = export_bind_forward()
|
zones_list = export_bind_forward()
|
||||||
return Response(zones_list)
|
return Response(zones_list)
|
||||||
|
|
||||||
|
|
||||||
@api_view(['GET'])
|
@api_view(['GET'])
|
||||||
def bind_reverse(request):
|
def bind_reverse(request):
|
||||||
"""
|
"""
|
||||||
@ -66,4 +74,3 @@ def bind_reverse(request):
|
|||||||
"""
|
"""
|
||||||
zones_list = export_bind_reverse()
|
zones_list = export_bind_reverse()
|
||||||
return Response(zones_list)
|
return Response(zones_list)
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ from .models import (
|
|||||||
)
|
)
|
||||||
from .forms import record_type_choices
|
from .forms import record_type_choices
|
||||||
|
|
||||||
|
|
||||||
class ZoneFilter(django_filters.FilterSet):
|
class ZoneFilter(django_filters.FilterSet):
|
||||||
name = django_filters.CharFilter(
|
name = django_filters.CharFilter(
|
||||||
name='name',
|
name='name',
|
||||||
@ -19,6 +20,7 @@ class ZoneFilter(django_filters.FilterSet):
|
|||||||
model = Zone
|
model = Zone
|
||||||
fields = ['name']
|
fields = ['name']
|
||||||
|
|
||||||
|
|
||||||
class RecordFilter(django_filters.FilterSet):
|
class RecordFilter(django_filters.FilterSet):
|
||||||
zone__name = django_filters.ModelMultipleChoiceFilter(
|
zone__name = django_filters.ModelMultipleChoiceFilter(
|
||||||
name='zone__name',
|
name='zone__name',
|
||||||
|
@ -37,5 +37,3 @@ class AddressFormField(forms.Field):
|
|||||||
return obj
|
return obj
|
||||||
else:
|
else:
|
||||||
return ip[0]
|
return ip[0]
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ from .formfields import AddressFormField
|
|||||||
# Zones
|
# Zones
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class ZoneForm(forms.ModelForm, BootstrapMixin):
|
class ZoneForm(forms.ModelForm, BootstrapMixin):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
@ -41,15 +42,18 @@ class ZoneForm(forms.ModelForm, BootstrapMixin):
|
|||||||
'soa_minimum': "Negative result TTL, in seconds",
|
'soa_minimum': "Negative result TTL, in seconds",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class ZoneFromCSVForm(forms.ModelForm):
|
class ZoneFromCSVForm(forms.ModelForm):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Zone
|
model = Zone
|
||||||
fields = ['name', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'description']
|
fields = ['name', 'ttl', 'soa_name', 'soa_contact', 'soa_refresh', 'soa_retry', 'soa_expire', 'soa_minimum', 'description']
|
||||||
|
|
||||||
|
|
||||||
class ZoneImportForm(BulkImportForm, BootstrapMixin):
|
class ZoneImportForm(BulkImportForm, BootstrapMixin):
|
||||||
csv = CSVDataField(csv_form=ZoneFromCSVForm)
|
csv = CSVDataField(csv_form=ZoneFromCSVForm)
|
||||||
|
|
||||||
|
|
||||||
class ZoneBulkEditForm(forms.Form, BootstrapMixin):
|
class ZoneBulkEditForm(forms.Form, BootstrapMixin):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=Zone.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(queryset=Zone.objects.all(), widget=forms.MultipleHiddenInput)
|
||||||
name = forms.CharField(max_length=100, required=False, label='Name')
|
name = forms.CharField(max_length=100, required=False, label='Name')
|
||||||
@ -66,6 +70,7 @@ class ZoneBulkEditForm(forms.Form, BootstrapMixin):
|
|||||||
class ZoneBulkDeleteForm(ConfirmationForm):
|
class ZoneBulkDeleteForm(ConfirmationForm):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=Zone.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(queryset=Zone.objects.all(), widget=forms.MultipleHiddenInput)
|
||||||
|
|
||||||
|
|
||||||
class ZoneFilterForm(forms.Form, BootstrapMixin):
|
class ZoneFilterForm(forms.Form, BootstrapMixin):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -73,6 +78,7 @@ class ZoneFilterForm(forms.Form, BootstrapMixin):
|
|||||||
# Records
|
# Records
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class RecordForm(forms.ModelForm, BootstrapMixin):
|
class RecordForm(forms.ModelForm, BootstrapMixin):
|
||||||
|
|
||||||
address = AddressFormField(required=False)
|
address = AddressFormField(required=False)
|
||||||
@ -102,17 +108,11 @@ class RecordFromCSVForm(forms.ModelForm):
|
|||||||
model = Record
|
model = Record
|
||||||
fields = ['zone', 'name', 'record_type', 'priority', 'address', 'value', 'description']
|
fields = ['zone', 'name', 'record_type', 'priority', 'address', 'value', 'description']
|
||||||
|
|
||||||
# class RecordBINDImportForm(forms.Form, BootstrapMixin):
|
|
||||||
# bind = BINDDataField()
|
|
||||||
# zone_name = CharField(max_length=100, label='Zone')
|
|
||||||
# slash_v4 = IntegerField()
|
|
||||||
|
|
||||||
# def clean(self):
|
|
||||||
# self.cleaned_data
|
|
||||||
|
|
||||||
class RecordImportForm(BulkImportForm, BootstrapMixin):
|
class RecordImportForm(BulkImportForm, BootstrapMixin):
|
||||||
csv = CSVDataField(csv_form=RecordFromCSVForm)
|
csv = CSVDataField(csv_form=RecordFromCSVForm)
|
||||||
|
|
||||||
|
|
||||||
class RecordBulkEditForm(forms.Form, BootstrapMixin):
|
class RecordBulkEditForm(forms.Form, BootstrapMixin):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=Record.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(queryset=Record.objects.all(), widget=forms.MultipleHiddenInput)
|
||||||
name = forms.CharField(max_length=100, required=False, label='Name')
|
name = forms.CharField(max_length=100, required=False, label='Name')
|
||||||
@ -122,26 +122,29 @@ class RecordBulkEditForm(forms.Form, BootstrapMixin):
|
|||||||
address = AddressFormField(required=False)
|
address = AddressFormField(required=False)
|
||||||
value = forms.CharField(max_length=100, required=False)
|
value = forms.CharField(max_length=100, required=False)
|
||||||
|
|
||||||
|
|
||||||
class RecordBulkDeleteForm(ConfirmationForm):
|
class RecordBulkDeleteForm(ConfirmationForm):
|
||||||
pk = forms.ModelMultipleChoiceField(queryset=Record.objects.all(), widget=forms.MultipleHiddenInput)
|
pk = forms.ModelMultipleChoiceField(queryset=Record.objects.all(), widget=forms.MultipleHiddenInput)
|
||||||
|
|
||||||
|
|
||||||
def record_zone_choices():
|
def record_zone_choices():
|
||||||
zone_choices = Zone.objects.annotate(record_count=Count('records'))
|
zone_choices = Zone.objects.annotate(record_count=Count('records'))
|
||||||
return [(z.name, '{} ({})'.format(z.name, z.record_count)) for z in zone_choices]
|
return [(z.name, '{} ({})'.format(z.name, z.record_count)) for z in zone_choices]
|
||||||
|
|
||||||
|
|
||||||
def record_type_choices():
|
def record_type_choices():
|
||||||
type_choices = {}
|
type_choices = {}
|
||||||
records = Record.objects.all()
|
records = Record.objects.all()
|
||||||
for r in records:
|
for r in records:
|
||||||
if not r.record_type in type_choices:
|
if r.record_type not in type_choices:
|
||||||
type_choices[r.record_type] = 1
|
type_choices[r.record_type] = 1
|
||||||
else:
|
else:
|
||||||
type_choices[r.record_type] += 1
|
type_choices[r.record_type] += 1
|
||||||
return [(t, '{} ({})'.format(t, count)) for t, count in type_choices.items()]
|
return [(t, '{} ({})'.format(t, count)) for t, count in type_choices.items()]
|
||||||
|
|
||||||
|
|
||||||
class RecordFilterForm(forms.Form, BootstrapMixin):
|
class RecordFilterForm(forms.Form, BootstrapMixin):
|
||||||
zone__name = forms.MultipleChoiceField(required=False, choices=record_zone_choices, label='Zone',
|
zone__name = forms.MultipleChoiceField(required=False, choices=record_zone_choices, label='Zone',
|
||||||
widget=forms.SelectMultiple(attrs={'size': 8}))
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
record_type = forms.MultipleChoiceField(required=False, choices=record_type_choices, label='Type',
|
record_type = forms.MultipleChoiceField(required=False, choices=record_type_choices, label='Type',
|
||||||
widget=forms.SelectMultiple(attrs={'size': 8}))
|
widget=forms.SelectMultiple(attrs={'size': 8}))
|
||||||
|
|
||||||
|
@ -4,7 +4,6 @@ from django.core.exceptions import ValidationError
|
|||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
#from ipam.models import IPAddress
|
|
||||||
from utilities.models import CreatedUpdatedModel
|
from utilities.models import CreatedUpdatedModel
|
||||||
|
|
||||||
import time
|
import time
|
||||||
@ -14,6 +13,7 @@ from django.dispatch import receiver
|
|||||||
|
|
||||||
import ipam.models
|
import ipam.models
|
||||||
|
|
||||||
|
|
||||||
class Zone(CreatedUpdatedModel):
|
class Zone(CreatedUpdatedModel):
|
||||||
"""
|
"""
|
||||||
A Zone represents a DNS zone. It contains SOA data but no records, records are represented as Record objects.
|
A Zone represents a DNS zone. It contains SOA data but no records, records are represented as Record objects.
|
||||||
@ -71,7 +71,6 @@ class Zone(CreatedUpdatedModel):
|
|||||||
self.soa_serial = current_date + str(serial_num)
|
self.soa_serial = current_date + str(serial_num)
|
||||||
self.set_bind_changed(False)
|
self.set_bind_changed(False)
|
||||||
|
|
||||||
|
|
||||||
def to_csv(self):
|
def to_csv(self):
|
||||||
return ','.join([
|
return ','.join([
|
||||||
self.name,
|
self.name,
|
||||||
@ -112,7 +111,6 @@ class Zone(CreatedUpdatedModel):
|
|||||||
return bind_export
|
return bind_export
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Record(CreatedUpdatedModel):
|
class Record(CreatedUpdatedModel):
|
||||||
"""
|
"""
|
||||||
A Record represents a DNS record, i.e. a row in a DNS zone.
|
A Record represents a DNS record, i.e. a row in a DNS zone.
|
||||||
@ -167,14 +165,17 @@ class Record(CreatedUpdatedModel):
|
|||||||
' ; ' + self.description + ' ; gen by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) '
|
' ; ' + self.description + ' ; gen by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) '
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
@receiver(pre_delete, sender=Record)
|
@receiver(pre_delete, sender=Record)
|
||||||
def on_record_delete(sender, **kwargs):
|
def on_record_delete(sender, **kwargs):
|
||||||
kwargs['instance'].zone.save()
|
kwargs['instance'].zone.save()
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BIND Exports
|
# BIND Exports
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
def export_bind_forward():
|
def export_bind_forward():
|
||||||
zones = Zone.objects.all()
|
zones = Zone.objects.all()
|
||||||
|
|
||||||
@ -189,6 +190,7 @@ def export_bind_forward():
|
|||||||
|
|
||||||
return zones_list
|
return zones_list
|
||||||
|
|
||||||
|
|
||||||
def export_bind_reverse():
|
def export_bind_reverse():
|
||||||
zones = {}
|
zones = {}
|
||||||
|
|
||||||
@ -210,5 +212,3 @@ def export_bind_reverse():
|
|||||||
})
|
})
|
||||||
|
|
||||||
return zones_list
|
return zones_list
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@ from .models import Zone, Record
|
|||||||
# Zones
|
# Zones
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class ZoneTable(BaseTable):
|
class ZoneTable(BaseTable):
|
||||||
pk = ToggleColumn()
|
pk = ToggleColumn()
|
||||||
name = tables.LinkColumn('dns:zone', args=[Accessor('pk')], verbose_name='Name')
|
name = tables.LinkColumn('dns:zone', args=[Accessor('pk')], verbose_name='Name')
|
||||||
@ -23,10 +24,12 @@ class ZoneTable(BaseTable):
|
|||||||
model = Zone
|
model = Zone
|
||||||
fields = ('pk', 'name', 'ttl', 'soa_name', 'soa_contact', 'soa_serial')
|
fields = ('pk', 'name', 'ttl', 'soa_name', 'soa_contact', 'soa_serial')
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Records
|
# Records
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class RecordTable(BaseTable):
|
class RecordTable(BaseTable):
|
||||||
pk = ToggleColumn()
|
pk = ToggleColumn()
|
||||||
name = tables.LinkColumn('dns:record', args=[Accessor('pk')], verbose_name='Name')
|
name = tables.LinkColumn('dns:record', args=[Accessor('pk')], verbose_name='Name')
|
||||||
@ -40,6 +43,7 @@ class RecordTable(BaseTable):
|
|||||||
model = Record
|
model = Record
|
||||||
fields = ('pk', 'name', 'record_type', 'priority', 'address', 'value')
|
fields = ('pk', 'name', 'record_type', 'priority', 'address', 'value')
|
||||||
|
|
||||||
|
|
||||||
class RecordBriefTable(BaseTable):
|
class RecordBriefTable(BaseTable):
|
||||||
name = tables.LinkColumn('dns:record', args=[Accessor('pk')], verbose_name='Name')
|
name = tables.LinkColumn('dns:record', args=[Accessor('pk')], verbose_name='Name')
|
||||||
record_type = tables.Column(verbose_name='Type')
|
record_type = tables.Column(verbose_name='Type')
|
||||||
@ -50,6 +54,7 @@ class RecordBriefTable(BaseTable):
|
|||||||
model = Record
|
model = Record
|
||||||
fields = ('name', 'record_type', 'priority', 'zone')
|
fields = ('name', 'record_type', 'priority', 'zone')
|
||||||
|
|
||||||
|
|
||||||
class RecordZoneTable(BaseTable):
|
class RecordZoneTable(BaseTable):
|
||||||
name = tables.LinkColumn('dns:record', args=[Accessor('pk')], verbose_name='Name')
|
name = tables.LinkColumn('dns:record', args=[Accessor('pk')], verbose_name='Name')
|
||||||
record_type = tables.Column(verbose_name='Type')
|
record_type = tables.Column(verbose_name='Type')
|
||||||
@ -60,4 +65,3 @@ class RecordZoneTable(BaseTable):
|
|||||||
class Meta(BaseTable.Meta):
|
class Meta(BaseTable.Meta):
|
||||||
model = Record
|
model = Record
|
||||||
fields = ('name', 'record_type', 'priority', 'address', 'value')
|
fields = ('name', 'record_type', 'priority', 'address', 'value')
|
||||||
|
|
@ -15,12 +15,15 @@ from . import filters, forms, tables
|
|||||||
from .models import Zone, Record, export_bind_forward, export_bind_reverse
|
from .models import Zone, Record, export_bind_forward, export_bind_reverse
|
||||||
from .tables import RecordZoneTable
|
from .tables import RecordZoneTable
|
||||||
|
|
||||||
import StringIO, zipfile, time
|
import StringIO
|
||||||
|
import zipfile
|
||||||
|
import time
|
||||||
|
|
||||||
#
|
#
|
||||||
# Zones
|
# Zones
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class ZoneListView(ObjectListView):
|
class ZoneListView(ObjectListView):
|
||||||
queryset = Zone.objects.annotate(record_count=Count('records'))
|
queryset = Zone.objects.annotate(record_count=Count('records'))
|
||||||
filter = filters.ZoneFilter
|
filter = filters.ZoneFilter
|
||||||
@ -29,6 +32,7 @@ class ZoneListView(ObjectListView):
|
|||||||
edit_permissions = ['dns.change_zone', 'dns.delete_zone']
|
edit_permissions = ['dns.change_zone', 'dns.delete_zone']
|
||||||
template_name = 'dns/zone_list.html'
|
template_name = 'dns/zone_list.html'
|
||||||
|
|
||||||
|
|
||||||
def zone(request, pk):
|
def zone(request, pk):
|
||||||
|
|
||||||
zone = get_object_or_404(Zone.objects.all(), pk=pk)
|
zone = get_object_or_404(Zone.objects.all(), pk=pk)
|
||||||
@ -46,12 +50,14 @@ def zone(request, pk):
|
|||||||
'dns_records_table': dns_records_table,
|
'dns_records_table': dns_records_table,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class ZoneEditView(PermissionRequiredMixin, ObjectEditView):
|
class ZoneEditView(PermissionRequiredMixin, ObjectEditView):
|
||||||
permission_required = 'dns.change_zone'
|
permission_required = 'dns.change_zone'
|
||||||
model = Zone
|
model = Zone
|
||||||
form_class = forms.ZoneForm
|
form_class = forms.ZoneForm
|
||||||
cancel_url = 'dns:zone_list'
|
cancel_url = 'dns:zone_list'
|
||||||
|
|
||||||
|
|
||||||
class ZoneDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
class ZoneDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
||||||
permission_required = 'dns.delete_zone'
|
permission_required = 'dns.delete_zone'
|
||||||
model = Zone
|
model = Zone
|
||||||
@ -65,6 +71,7 @@ class ZoneBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|||||||
template_name = 'dns/zone_import.html'
|
template_name = 'dns/zone_import.html'
|
||||||
obj_list_url = 'dns:zone_list'
|
obj_list_url = 'dns:zone_list'
|
||||||
|
|
||||||
|
|
||||||
class ZoneBulkEditView(PermissionRequiredMixin, BulkEditView):
|
class ZoneBulkEditView(PermissionRequiredMixin, BulkEditView):
|
||||||
permission_required = 'dns.change_zone'
|
permission_required = 'dns.change_zone'
|
||||||
cls = Zone
|
cls = Zone
|
||||||
@ -91,10 +98,12 @@ class ZoneBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|||||||
form = forms.ZoneBulkDeleteForm
|
form = forms.ZoneBulkDeleteForm
|
||||||
default_redirect_url = 'dns:zone_list'
|
default_redirect_url = 'dns:zone_list'
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Records
|
# Records
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
class RecordListView(ObjectListView):
|
class RecordListView(ObjectListView):
|
||||||
queryset = Record.objects.all()
|
queryset = Record.objects.all()
|
||||||
filter = filters.RecordFilter
|
filter = filters.RecordFilter
|
||||||
@ -103,6 +112,7 @@ class RecordListView(ObjectListView):
|
|||||||
edit_permissions = ['dns.change_record', 'dns.delete_record']
|
edit_permissions = ['dns.change_record', 'dns.delete_record']
|
||||||
template_name = 'dns/record_list.html'
|
template_name = 'dns/record_list.html'
|
||||||
|
|
||||||
|
|
||||||
def record(request, pk):
|
def record(request, pk):
|
||||||
|
|
||||||
record = get_object_or_404(Record.objects.all(), pk=pk)
|
record = get_object_or_404(Record.objects.all(), pk=pk)
|
||||||
@ -113,17 +123,20 @@ def record(request, pk):
|
|||||||
'bind_export': bind_export,
|
'bind_export': bind_export,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class RecordEditView(PermissionRequiredMixin, ObjectEditView):
|
class RecordEditView(PermissionRequiredMixin, ObjectEditView):
|
||||||
permission_required = 'dns.change_record'
|
permission_required = 'dns.change_record'
|
||||||
model = Record
|
model = Record
|
||||||
form_class = forms.RecordForm
|
form_class = forms.RecordForm
|
||||||
cancel_url = 'dns:record_list'
|
cancel_url = 'dns:record_list'
|
||||||
|
|
||||||
|
|
||||||
class RecordDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
class RecordDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
||||||
permission_required = 'dns.delete_record'
|
permission_required = 'dns.delete_record'
|
||||||
model = Record
|
model = Record
|
||||||
redirect_url = 'dns:record_list'
|
redirect_url = 'dns:record_list'
|
||||||
|
|
||||||
|
|
||||||
class RecordBulkImportView(PermissionRequiredMixin, BulkImportView):
|
class RecordBulkImportView(PermissionRequiredMixin, BulkImportView):
|
||||||
permission_required = 'dns.add_record'
|
permission_required = 'dns.add_record'
|
||||||
form = forms.RecordImportForm
|
form = forms.RecordImportForm
|
||||||
@ -131,6 +144,7 @@ class RecordBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|||||||
template_name = 'dns/record_import.html'
|
template_name = 'dns/record_import.html'
|
||||||
obj_list_url = 'dns:record_list'
|
obj_list_url = 'dns:record_list'
|
||||||
|
|
||||||
|
|
||||||
class RecordBulkEditView(PermissionRequiredMixin, BulkEditView):
|
class RecordBulkEditView(PermissionRequiredMixin, BulkEditView):
|
||||||
permission_required = 'dns.change_record'
|
permission_required = 'dns.change_record'
|
||||||
cls = Record
|
cls = Record
|
||||||
@ -150,16 +164,19 @@ class RecordBulkEditView(PermissionRequiredMixin, BulkEditView):
|
|||||||
rlist[0].save()
|
rlist[0].save()
|
||||||
return rlist.update(**fields_to_update)
|
return rlist.update(**fields_to_update)
|
||||||
|
|
||||||
|
|
||||||
class RecordBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
class RecordBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
||||||
permission_required = 'dns.delete_record'
|
permission_required = 'dns.delete_record'
|
||||||
cls = Record
|
cls = Record
|
||||||
form = forms.RecordBulkEditForm
|
form = forms.RecordBulkEditForm
|
||||||
default_redirect_url = 'dns:record_list'
|
default_redirect_url = 'dns:record_list'
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# BIND Exports
|
# BIND Exports
|
||||||
#
|
#
|
||||||
|
|
||||||
|
|
||||||
def bind_export(request, zones_list, context):
|
def bind_export(request, zones_list, context):
|
||||||
download = request.GET.get('download')
|
download = request.GET.get('download')
|
||||||
if download:
|
if download:
|
||||||
@ -193,9 +210,10 @@ def bind_export(request, zones_list, context):
|
|||||||
'bind_export_count': len(zones_list),
|
'bind_export_count': len(zones_list),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
def full_forward(request):
|
def full_forward(request):
|
||||||
return bind_export(request, export_bind_forward(), 'forward')
|
return bind_export(request, export_bind_forward(), 'forward')
|
||||||
|
|
||||||
|
|
||||||
def full_reverse(request):
|
def full_reverse(request):
|
||||||
return bind_export(request, export_bind_reverse(), 'reverse')
|
return bind_export(request, export_bind_reverse(), 'reverse')
|
||||||
|
|
||||||
|
@ -71,10 +71,10 @@
|
|||||||
"soa_name": "",
|
"soa_name": "",
|
||||||
"soa_contact": "",
|
"soa_contact": "",
|
||||||
"soa_serial": "",
|
"soa_serial": "",
|
||||||
"soa_refresh": "",
|
"soa_refresh": null,
|
||||||
"soa_retry": "",
|
"soa_retry": null,
|
||||||
"soa_expire": "",
|
"soa_expire": null,
|
||||||
"soa_minimum": ""
|
"soa_minimum": null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -411,7 +411,6 @@ class IPAddressFromCSVForm(forms.ModelForm):
|
|||||||
model = IPAddress
|
model = IPAddress
|
||||||
fields = ['address', 'vrf', 'tenant', 'ptr', 'device', 'interface_name', 'is_primary', 'description']
|
fields = ['address', 'vrf', 'tenant', 'ptr', 'device', 'interface_name', 'is_primary', 'description']
|
||||||
|
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
|
||||||
device = self.cleaned_data.get('device')
|
device = self.cleaned_data.get('device')
|
||||||
@ -461,7 +460,6 @@ class IPAddressBulkEditForm(forms.Form, BootstrapMixin):
|
|||||||
description = forms.CharField(max_length=100, required=False)
|
description = forms.CharField(max_length=100, required=False)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def ipaddress_family_choices():
|
def ipaddress_family_choices():
|
||||||
return [('', 'All'), (4, 'IPv4'), (6, 'IPv6')]
|
return [('', 'All'), (4, 'IPv4'), (6, 'IPv6')]
|
||||||
|
|
||||||
|
@ -13,7 +13,8 @@ import dns.models
|
|||||||
|
|
||||||
from .fields import IPNetworkField, IPAddressField
|
from .fields import IPNetworkField, IPAddressField
|
||||||
|
|
||||||
import time, ipaddress
|
import time
|
||||||
|
import ipaddress
|
||||||
import netaddr
|
import netaddr
|
||||||
|
|
||||||
|
|
||||||
@ -352,7 +353,8 @@ class Prefix(CreatedUpdatedModel):
|
|||||||
|
|
||||||
zones = {}
|
zones = {}
|
||||||
|
|
||||||
def header (zone_id): return '\n'.join([
|
def header(zone_id):
|
||||||
|
return '\n'.join([
|
||||||
'; ' + zone_id,
|
'; ' + zone_id,
|
||||||
'; gen from prefix ' + str(self.prefix) + ' (' + (self.description if self.description else '') + ') by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) ',
|
'; gen from prefix ' + str(self.prefix) + ' (' + (self.description if self.description else '') + ') by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) ',
|
||||||
'',
|
'',
|
||||||
@ -386,7 +388,6 @@ class Prefix(CreatedUpdatedModel):
|
|||||||
pbytes[2] = '0'
|
pbytes[2] = '0'
|
||||||
zslash = 16
|
zslash = 16
|
||||||
|
|
||||||
|
|
||||||
if pslash > zslash:
|
if pslash > zslash:
|
||||||
pslash = zslash
|
pslash = zslash
|
||||||
|
|
||||||
@ -402,17 +403,15 @@ class Prefix(CreatedUpdatedModel):
|
|||||||
if i in p:
|
if i in p:
|
||||||
if zslash == 24:
|
if zslash == 24:
|
||||||
zone_id = ibytes[2] + '.' + ibytes[1] + '.' + ibytes[0] + '.in-addr.arpa.'
|
zone_id = ibytes[2] + '.' + ibytes[1] + '.' + ibytes[0] + '.in-addr.arpa.'
|
||||||
if not zone_id in zones:
|
if zone_id not in zones:
|
||||||
zones[zone_id] = header(zone_id)
|
zones[zone_id] = header(zone_id)
|
||||||
zones[zone_id] += ibytes[3].ljust(3) + ' IN PTR ' + ip.ptr.ljust(40) + ' ; ' + ip.description.ljust(20) + ' ; gen by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) \n'
|
zones[zone_id] += ibytes[3].ljust(3) + ' IN PTR ' + ip.ptr.ljust(40) + ' ; ' + ip.description.ljust(20) + ' ; gen by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) \n'
|
||||||
else:
|
else:
|
||||||
zone_id = ibytes[1] + '.' + ibytes[0] + '.in-addr.arpa.'
|
zone_id = ibytes[1] + '.' + ibytes[0] + '.in-addr.arpa.'
|
||||||
if not zone_id in zones:
|
if zone_id not in zones:
|
||||||
zones[zone_id] = header(zone_id)
|
zones[zone_id] = header(zone_id)
|
||||||
zones[zone_id] += (ibytes[3] + '.' + ibytes[2]).ljust(7) + ' IN PTR ' + ip.ptr.ljust(40) + ' ; ' + ip.description.ljust(20) + ' ; gen by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) \n'
|
zones[zone_id] += (ibytes[3] + '.' + ibytes[2]).ljust(7) + ' IN PTR ' + ip.ptr.ljust(40) + ' ; ' + ip.description.ljust(20) + ' ; gen by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) \n'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
pfull = str(ipaddress.IPv6Address(unicode(str(self.prefix).split('/')[0])).exploded)
|
pfull = str(ipaddress.IPv6Address(unicode(str(self.prefix).split('/')[0])).exploded)
|
||||||
pnibbles = pfull.split(':')
|
pnibbles = pfull.split(':')
|
||||||
@ -424,7 +423,6 @@ class Prefix(CreatedUpdatedModel):
|
|||||||
|
|
||||||
largerPrefix = Prefix.objects.filter(family=6, prefix__net_contains_or_equals=':'.join(pnibbles) + '/' + str(zslash))
|
largerPrefix = Prefix.objects.filter(family=6, prefix__net_contains_or_equals=':'.join(pnibbles) + '/' + str(zslash))
|
||||||
if largerPrefix:
|
if largerPrefix:
|
||||||
#choper le plus grand
|
|
||||||
minSlash = 128
|
minSlash = 128
|
||||||
for pp in largerPrefix:
|
for pp in largerPrefix:
|
||||||
ppslash = int(str(pp.prefix).split('/')[1])
|
ppslash = int(str(pp.prefix).split('/')[1])
|
||||||
@ -442,12 +440,11 @@ class Prefix(CreatedUpdatedModel):
|
|||||||
|
|
||||||
pdigitszone = pdigits[:zslash / 4][::-1]
|
pdigitszone = pdigits[:zslash / 4][::-1]
|
||||||
zone_id = '.'.join(pdigitszone) + '.ip6.arpa.'
|
zone_id = '.'.join(pdigitszone) + '.ip6.arpa.'
|
||||||
if not zone_id in zones:
|
if zone_id not in zones:
|
||||||
zones[zone_id] = header(zone_id)
|
zones[zone_id] = header(zone_id)
|
||||||
|
|
||||||
zones[zone_id] += ('.'.join(idigits[:32 - zslash / 4])).ljust(30) + ' IN PTR ' + ip.ptr.ljust(40) + ' ; ' + ip.description.ljust(20) + ' ; gen by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) \n'
|
zones[zone_id] += ('.'.join(idigits[:32 - zslash / 4])).ljust(30) + ' IN PTR ' + ip.ptr.ljust(40) + ' ; ' + ip.description.ljust(20) + ' ; gen by netbox ( ' + time.strftime('%A %B %d %Y %H:%M:%S', time.localtime()) + ' ) \n'
|
||||||
|
|
||||||
|
|
||||||
for z in zones:
|
for z in zones:
|
||||||
z += '\n\n; end '
|
z += '\n\n; end '
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user