Noot
This commit is contained in:
parent
e3311a6df7
commit
814a8b62cb
4
README
4
README
|
@ -2,3 +2,7 @@ whoisdb
|
||||||
see own objects
|
see own objects
|
||||||
|
|
||||||
list of all ASses?
|
list of all ASses?
|
||||||
|
|
||||||
|
FIXME
|
||||||
|
contact soll nur einen mnt_by haben
|
||||||
|
mnt_by ==> mnt_by_in in filter statements
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">Header</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
{{ contact }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
{% with "whoisdb:"|add:prefix|add:"-detail" as detailView %}
|
||||||
|
{% with "whoisdb:"|add:prefix|add:"-delete" as deleteView %}
|
||||||
|
{% with "whoisdb:"|add:prefix|add:"-edit" as editView %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{% url detailView obj.handle %}">{{ obj.handle }}</a></td>
|
||||||
|
<td>{{ objType }}</td>
|
||||||
|
<td>{{obj.name }}{{ obj.description }}</td>
|
||||||
|
<td>{% for contact in obj.admin_c.all %}<a href="{% url "whoisdb:contact-detail" contact.handle %}">{{ contact }}</a> {% endfor %}</td>
|
||||||
|
<td><a href="{% url editView obj.handle %}">Edit</a> <a href="{% url deleteView obj.handle %}">Delete</a></td>
|
||||||
|
</tr>
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
||||||
|
{% endwith %}
|
|
@ -0,0 +1,15 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">Header</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
{{ mnt }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">Header</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<form method="post" action="#">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form | crispy }}
|
||||||
|
<button type="submit" class="btn btn-primary">Create</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">Header</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<form method="post" action="#">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form | crispy }}
|
||||||
|
<button type="submit" class="btn btn-primary">Create</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,32 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="panel panel-{% if reasons %}danger{%else%}default{%endif%}">
|
||||||
|
<div class="panel-heading">Header</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
{% if reasons %}
|
||||||
|
<p>
|
||||||
|
You cannot delete this object, as other objects in the database depend on it!
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<ul>
|
||||||
|
{% for reason in reasons %}
|
||||||
|
<li>{{ reason }}</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<form method="post" action="#">
|
||||||
|
{% csrf_token %}
|
||||||
|
<button type="submit" class="btn btn-primary">Create</button>
|
||||||
|
</form>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
|
||||||
|
{% load crispy_forms_tags %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-12">
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">Header</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<form method="post" action="#">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form | crispy }}
|
||||||
|
<button type="submit" class="btn btn-primary">Update</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
|
@ -10,13 +10,13 @@
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
{% if mnts %}
|
{% if mnts %}
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="">Create new Maintainer</a></li>
|
<li><a href="{% url "whoisdb:mnt-create" %}">Create new Maintainer</a></li>
|
||||||
<li><a href="">Create new Role/Person</a></li>
|
<li><a href="{% url "whoisdb:contact-create" %}">Create new Role/Person</a></li>
|
||||||
<li><a href="">Request resources</a></li>
|
<li><a href="">Request resources</a></li>
|
||||||
{% if netblock %}
|
{% if netblocks %}
|
||||||
<li><a href="">Create Subnet</a></li>
|
<li><a href="{% url "whoisdb:inetnum-create" %}">Create Subnet</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if asblock %}
|
{% if asblocks %}
|
||||||
<li><a href="">Create AS</a></li>
|
<li><a href="">Create AS</a></li>
|
||||||
<li><a href="">Create ASblock</a></li>
|
<li><a href="">Create ASblock</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -28,6 +28,7 @@
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Handle</th>
|
<th>Handle</th>
|
||||||
|
<th>Type</th>
|
||||||
<th>Name?</th>
|
<th>Name?</th>
|
||||||
<th>Contact</th>
|
<th>Contact</th>
|
||||||
<th>Actions</th>
|
<th>Actions</th>
|
||||||
|
@ -35,12 +36,19 @@
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for mnt in mnts %}
|
{% for mnt in mnts %}
|
||||||
<tr>
|
{% include "whoisdb/handle_table_row.html" with obj=mnt objType="Maintainer" prefix="mnt" %}
|
||||||
<td>{{ mnt.handle }}</td>
|
{% endfor %}
|
||||||
<td>{{ mnt.description }}</td>
|
{% for contact in contacts %}
|
||||||
<td>{% for contact in mnt.admin_c.all %}{{ contact }}{% endfor %}</td>
|
{% include "whoisdb/handle_table_row.html" with obj=contact objType="Contact / Role" prefix="contact" %}
|
||||||
<td></td>
|
{% endfor %}
|
||||||
</tr>
|
{% for asblock in asblocks %}
|
||||||
|
{% include "whoisdb/handle_table_row.html" with obj=asblock objType="AS Block" prefix="mnt" %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for asnumber in asnumbers %}
|
||||||
|
{% include "whoisdb/handle_table_row.html" with obj=asnumber objType="AS Number" prefix="contact" %}
|
||||||
|
{% endfor %}
|
||||||
|
{% for netblock in netblocks %}
|
||||||
|
{% include "whoisdb/handle_table_row.html" with obj=netblock objType="IP Netblock" prefix="contact" %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
|
@ -4,19 +4,71 @@ from django import forms
|
||||||
#from crispy_forms.layout import Submit, Layout
|
#from crispy_forms.layout import Submit, Layout
|
||||||
#from django.urls import reverse
|
#from django.urls import reverse
|
||||||
|
|
||||||
from .models import Maintainer, Contact
|
from .models import Maintainer, Contact, InetNum
|
||||||
|
|
||||||
|
class WhoisObjectMixin(object):
|
||||||
|
def __init__(self, user, *args, **kwargs):
|
||||||
|
super(WhoisObjectMixin, self).__init__(*args, **kwargs)
|
||||||
|
self._user = user
|
||||||
|
|
||||||
|
instance = getattr(self, 'instance', None)
|
||||||
|
if instance and instance.pk:
|
||||||
|
self.fields['handle'].widget.attrs['readonly'] = True
|
||||||
|
|
||||||
|
def clean_handle(self):
|
||||||
|
instance = getattr(self, 'instance', None)
|
||||||
|
if instance and instance.pk:
|
||||||
|
return instance.handle
|
||||||
|
else:
|
||||||
|
return self.cleaned_data['handle']
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
cleaned_data = super(WhoisObjectMixin, self).clean()
|
||||||
|
if cleaned_data.get("handle") == "AUTO":
|
||||||
|
cleaned_data['handle'] = self._meta.model.genGenericHandle(cleaned_data.get("name"))
|
||||||
|
|
||||||
class MntForm(forms.ModelForm):
|
class MntForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Maintainer
|
||||||
|
fields = ['handle', 'description', 'admin_c']
|
||||||
|
|
||||||
|
def __init__(self, user, *args, **kwargs):
|
||||||
|
super(MntForm, self).__init__(*args, **kwargs)
|
||||||
|
self._user = user
|
||||||
|
if 'admin_c' in self.fields:
|
||||||
|
self.fields['admin_c'].queryset = Contact.objects.filter(mnt_by=user.maintainer_set.all())
|
||||||
|
|
||||||
|
class MntInitialForm(MntForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Maintainer
|
model = Maintainer
|
||||||
fields = ['handle', 'description']
|
fields = ['handle', 'description']
|
||||||
|
|
||||||
class ContactForm(forms.ModelForm):
|
class ContactForm(WhoisObjectMixin, forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = Contact
|
||||||
|
fields = ['type', 'handle', 'name', 'mnt_by']
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(ContactForm, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
class ContactInitialForm(ContactForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Contact
|
model = Contact
|
||||||
fields = ['handle', 'name']
|
fields = ['handle', 'name']
|
||||||
|
|
||||||
def __init__(self, person=True, *args, **kwargs):
|
class InetNumForm(WhoisObjectMixin, forms.ModelForm):
|
||||||
super(ContactForm, self).__init__(*args, **kwargs)
|
class Meta:
|
||||||
# check if this is a person
|
model = InetNum
|
||||||
self.person = person
|
fields = ['protocol', 'parent_range', 'address', 'description', 'mnt_lower']
|
||||||
|
|
||||||
|
def __init__(self, lower=False, *args, **kwargs):
|
||||||
|
super(MntForm, self).__init__(*args, **kwargs)
|
||||||
|
self._editLower = lower
|
||||||
|
if 'admin_c' in self.fields:
|
||||||
|
self.fields['admin_c'].queryset = Contact.objects.filter(mnt_by=self.user.maintainer_set.all())
|
||||||
|
|
||||||
|
if self._editLower:
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
# FIXME: Reset certain field sto instance:
|
||||||
|
pass
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
from django.views.generic import DeleteView
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.contrib import messages
|
||||||
|
|
||||||
|
class DeleteCheckView(DeleteView):
|
||||||
|
""" Check if object actually can be deleted. Provide reasons to template
|
||||||
|
if not.
|
||||||
|
"""
|
||||||
|
def delete(self, request, *args, **kwargs):
|
||||||
|
self.object = self.get_object()
|
||||||
|
success_url = self.get_success_url()
|
||||||
|
|
||||||
|
reasons = self.object.getNoDeleteReasons()
|
||||||
|
if reasons:
|
||||||
|
# do not delete, do what get does...
|
||||||
|
return self.get(request, *args, **kwargs)
|
||||||
|
else:
|
||||||
|
self.object.delete()
|
||||||
|
messages.info(request, "Object %s has been deleted" % self.object.handle)
|
||||||
|
return HttpResponseRedirect(success_url)
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
if 'reasons' not in kwargs:
|
||||||
|
kwargs['reasons'] = self.object.getNoDeleteReasons()
|
||||||
|
return super(DeleteCheckView, self).get_context_data(**kwargs)
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-02-28 10:41
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import whoisdb.validators
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('whoisdb', '0003_auto_20170222_1812'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='contact',
|
||||||
|
name='type',
|
||||||
|
field=models.CharField(choices=[('person', 'person'), ('role', 'role')], default='person', max_length=10),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='asblock',
|
||||||
|
name='handle',
|
||||||
|
field=models.SlugField(max_length=32, unique=True, validators=[whoisdb.validators.HandleValidator()], verbose_name='handle'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='asnumber',
|
||||||
|
name='handle',
|
||||||
|
field=models.SlugField(max_length=32, unique=True, validators=[whoisdb.validators.HandleValidator()], verbose_name='handle'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='contact',
|
||||||
|
name='handle',
|
||||||
|
field=models.SlugField(max_length=32, unique=True, validators=[whoisdb.validators.HandleValidator()], verbose_name='handle'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='inetnum',
|
||||||
|
name='handle',
|
||||||
|
field=models.SlugField(max_length=32, unique=True, validators=[whoisdb.validators.HandleValidator()], verbose_name='handle'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='maintainer',
|
||||||
|
name='description',
|
||||||
|
field=models.CharField(blank=True, help_text='Short description what this maintainer is for', max_length=64),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='maintainer',
|
||||||
|
name='handle',
|
||||||
|
field=models.SlugField(help_text='Must end with -MNT, eg FOO3-MNT', max_length=32, unique=True, validators=[whoisdb.validators.HandleValidatorWithSuffix('MNT')], verbose_name='handle'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,26 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-02-28 14:35
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('whoisdb', '0004_auto_20170228_1041'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='inetnum',
|
||||||
|
name='address',
|
||||||
|
field=models.GenericIPAddressField(db_index=True, default='10.0.0.0'),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='contact',
|
||||||
|
name='type',
|
||||||
|
field=models.CharField(choices=[('person', 'PERSON')], max_length=10),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,30 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-02-28 14:40
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('whoisdb', '0005_auto_20170228_1435'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='inetnum',
|
||||||
|
name='mnt_by',
|
||||||
|
field=models.ManyToManyField(to='whoisdb.Maintainer'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='asnumber',
|
||||||
|
name='mnt_lower',
|
||||||
|
field=models.ManyToManyField(blank=True, related_name='lower_asnumber_set', to='whoisdb.Maintainer'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='inetnum',
|
||||||
|
name='mnt_lower',
|
||||||
|
field=models.ManyToManyField(blank=True, related_name='lower_inetnum_set', to='whoisdb.Maintainer'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.10.5 on 2017-02-28 15:03
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('whoisdb', '0006_auto_20170228_1440'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='asblock',
|
||||||
|
name='mnt_lower',
|
||||||
|
field=models.ManyToManyField(blank=True, related_name='lower_asblock_set', to='whoisdb.Maintainer'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,4 +1,5 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.urls import reverse
|
||||||
|
|
||||||
from dncore.models import User
|
from dncore.models import User
|
||||||
from .validators import HandleValidator, HandleValidatorWithSuffix
|
from .validators import HandleValidator, HandleValidatorWithSuffix
|
||||||
|
@ -19,6 +20,10 @@ class WhoisObject(models.Model):
|
||||||
def genHandle(self, main=None):
|
def genHandle(self, main=None):
|
||||||
if not main:
|
if not main:
|
||||||
main = self.name
|
main = self.name
|
||||||
|
return self.genGenericHandle(main)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def genGenericHandle(clazz, main):
|
||||||
prefix = ""
|
prefix = ""
|
||||||
if " " in main:
|
if " " in main:
|
||||||
parts = main.split(" ")
|
parts = main.split(" ")
|
||||||
|
@ -30,17 +35,23 @@ class WhoisObject(models.Model):
|
||||||
prefix = prefix.upper()
|
prefix = prefix.upper()
|
||||||
|
|
||||||
i = 1
|
i = 1
|
||||||
handle = "%s%%d-%s" % (prefix, self.handleSuffix)
|
handle = "%s%%d-%s" % (prefix, clazz.handleSuffix)
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
prefix
|
prefix
|
||||||
self.__class__.objects.get(handle=handle % i)
|
clazz.objects.get(handle=handle % i)
|
||||||
i += 1
|
i += 1
|
||||||
except self.DoesNotExist:
|
except clazz.DoesNotExist:
|
||||||
break
|
break
|
||||||
|
|
||||||
return handle % i
|
return handle % i
|
||||||
|
|
||||||
|
def getNoDeleteReasons(self):
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def canBeDeleted(self):
|
||||||
|
return not bool(self.getNoDeleteReasons())
|
||||||
|
|
||||||
def handleAuto(self, name=None):
|
def handleAuto(self, name=None):
|
||||||
if self.handle == "AUTO":
|
if self.handle == "AUTO":
|
||||||
self.handle = self.genHandle(name)
|
self.handle = self.genHandle(name)
|
||||||
|
@ -50,13 +61,27 @@ class Maintainer(WhoisObject):
|
||||||
handleSuffix = "MNT"
|
handleSuffix = "MNT"
|
||||||
|
|
||||||
auth = models.ManyToManyField(User)
|
auth = models.ManyToManyField(User)
|
||||||
handle = models.SlugField(max_length=32, unique=True, verbose_name='handle', validators=[HandleValidatorWithSuffix('MNT')])
|
handle = models.SlugField(max_length=32, unique=True, verbose_name='handle', validators=[HandleValidatorWithSuffix('MNT')], help_text="Must end with -MNT, eg FOO3-MNT")
|
||||||
description = models.CharField(max_length=64, blank=True)
|
description = models.CharField(max_length=64, blank=True, help_text="Short description what this maintainer is for")
|
||||||
|
|
||||||
admin_c = models.ManyToManyField("Contact")
|
admin_c = models.ManyToManyField("Contact")
|
||||||
|
|
||||||
# autoInclude = models.BooleanField(default=True)
|
# autoInclude = models.BooleanField(default=True)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse("whoisdb:mnt-detail", kwargs={"handle": self.handle})
|
||||||
|
|
||||||
|
def getNoDeleteReasons(self):
|
||||||
|
reasons = []
|
||||||
|
|
||||||
|
mntables = [Contact, ASBlock, ASNumber, InetNum]
|
||||||
|
for mntable in mntables:
|
||||||
|
candidates = mntable.objects.filter(mnt_by=self).annotate(mntCount=models.Count('mnt_by')).filter(mntCount__lte=1)
|
||||||
|
for candidate in candidates:
|
||||||
|
reasons.append("Object %s would have no maintainers left." % candidate.handle)
|
||||||
|
|
||||||
|
return reasons
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MntdObject(WhoisObject):
|
class MntdObject(WhoisObject):
|
||||||
|
@ -68,10 +93,27 @@ class MntdObject(WhoisObject):
|
||||||
|
|
||||||
class Contact(MntdObject):
|
class Contact(MntdObject):
|
||||||
handleSuffix = "DN"
|
handleSuffix = "DN"
|
||||||
TYPE = (('person', 'person'), ('role', 'role'))
|
TYPE_PERSON = 'PERSON'
|
||||||
|
TYPE_ROLE = 'ROLE'
|
||||||
|
TYPE = (('person', TYPE_PERSON), ('role', TYPE_ROLE))
|
||||||
|
TYPE = (('person', TYPE_PERSON),)
|
||||||
|
|
||||||
name = models.CharField(max_length=128)
|
name = models.CharField(max_length=128)
|
||||||
|
type = models.CharField(max_length=10, choices=TYPE)
|
||||||
|
|
||||||
|
def get_absolute_url(self):
|
||||||
|
return reverse("whoisdb:contact-detail", kwargs={"handle": self.handle})
|
||||||
|
|
||||||
|
def getNoDeleteReasons(self):
|
||||||
|
reasons = []
|
||||||
|
|
||||||
|
contactables = [Maintainer]
|
||||||
|
for contactable in contactables:
|
||||||
|
candidates = contactable.objects.filter(admin_c=self).annotate(contactCount=models.Count('admin_c')).filter(contactCount__lte=1)
|
||||||
|
for candidate in candidates:
|
||||||
|
reasons.append("Object %s would have no contact left." % candidate.handle)
|
||||||
|
|
||||||
|
return reasons
|
||||||
|
|
||||||
class ASBlock(MntdObject):
|
class ASBlock(MntdObject):
|
||||||
handleSuffix = "ASB"
|
handleSuffix = "ASB"
|
||||||
|
@ -79,6 +121,7 @@ class ASBlock(MntdObject):
|
||||||
parent_block = models.ForeignKey("ASBlock", models.CASCADE, null=True, blank=True, default=None)
|
parent_block = models.ForeignKey("ASBlock", models.CASCADE, null=True, blank=True, default=None)
|
||||||
description = models.CharField(max_length=64, blank=True)
|
description = models.CharField(max_length=64, blank=True)
|
||||||
|
|
||||||
|
mnt_lower = models.ManyToManyField(Maintainer, related_name='lower_asblock_set', blank=True)
|
||||||
|
|
||||||
class ASNumber(MntdObject):
|
class ASNumber(MntdObject):
|
||||||
handleSuffix = "AS"
|
handleSuffix = "AS"
|
||||||
|
@ -88,16 +131,20 @@ class ASNumber(MntdObject):
|
||||||
asblock = models.ForeignKey(ASBlock, models.CASCADE)
|
asblock = models.ForeignKey(ASBlock, models.CASCADE)
|
||||||
description = models.CharField(max_length=64, blank=True)
|
description = models.CharField(max_length=64, blank=True)
|
||||||
|
|
||||||
mnt_lower = models.ManyToManyField(Maintainer, related_name='lower_asnumber_set')
|
mnt_lower = models.ManyToManyField(Maintainer, related_name='lower_asnumber_set', blank=True)
|
||||||
|
|
||||||
|
|
||||||
class InetNum(WhoisObject):
|
class InetNum(MntdObject):
|
||||||
handleSuffix = "NET"
|
handleSuffix = "NET"
|
||||||
|
|
||||||
PROTO = (('ipv4', 'ipv4'), ('ipv6', 'ipv6'))
|
IPv4 = "ipv4"
|
||||||
|
IPv6 = "ipv6"
|
||||||
|
|
||||||
|
PROTO = ((IPv4, 'IPv4'), (IPv6, 'IPv6'))
|
||||||
protocol = models.CharField(max_length=4, choices=PROTO)
|
protocol = models.CharField(max_length=4, choices=PROTO)
|
||||||
|
address = models.GenericIPAddressField(db_index=True)
|
||||||
netmask = models.PositiveIntegerField()
|
netmask = models.PositiveIntegerField()
|
||||||
parent_range = models.ForeignKey("InetNum", models.CASCADE, null=True, blank=True, default=None)
|
parent_range = models.ForeignKey("InetNum", models.CASCADE, null=True, blank=True, default=None)
|
||||||
description = models.CharField(max_length=64, blank=True)
|
description = models.CharField(max_length=64, blank=True)
|
||||||
|
|
||||||
mnt_lower = models.ManyToManyField(Maintainer)
|
mnt_lower = models.ManyToManyField(Maintainer, related_name='lower_inetnum_set', blank=True)
|
||||||
|
|
|
@ -4,5 +4,20 @@ from . import views as whoisdb_views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^$', whoisdb_views.dbDashboard, name='dashboard'),
|
url(r'^$', whoisdb_views.dbDashboard, name='dashboard'),
|
||||||
|
|
||||||
|
url(r'^mnt/create/$', whoisdb_views.MaintainerCreate.as_view(), name='mnt-create'),
|
||||||
|
url(r'^mnt/show/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.MaintainerDetail.as_view(), name='mnt-detail'),
|
||||||
|
url(r'^mnt/edit/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.MaintainerEdit.as_view(), name='mnt-edit'),
|
||||||
|
url(r'^mnt/delete/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.MaintainerDelete.as_view(), name='mnt-delete'),
|
||||||
|
|
||||||
|
url(r'^contact/create/$', whoisdb_views.ContactCreate.as_view(), name='contact-create'),
|
||||||
|
url(r'^contact/show/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.ContactDetail.as_view(), name='contact-detail'),
|
||||||
|
url(r'^contact/edit/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.ContactEdit.as_view(), name='contact-edit'),
|
||||||
|
url(r'^contact/delete/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.ContactDelete.as_view(), name='contact-delete'),
|
||||||
|
|
||||||
|
url(r'^inetnum/create/$', whoisdb_views.InetNumCreate.as_view(), name='inetnum-create'),
|
||||||
|
url(r'^inetnum/show/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.ContactDetail.as_view(), name='inetnum-detail'),
|
||||||
|
url(r'^inetnum/edit/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.ContactEdit.as_view(), name='inetnum-edit'),
|
||||||
|
url(r'^inetnum/delete/(?P<handle>[A-Z0-9-]+)/$', whoisdb_views.ContactDelete.as_view(), name='inetnum-delete'),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
144
whoisdb/views.py
144
whoisdb/views.py
|
@ -1,21 +1,29 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
from django.db.models import Q
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.urls import reverse
|
from django.urls import reverse, reverse_lazy
|
||||||
|
from django.views.generic import DetailView, CreateView, UpdateView
|
||||||
from .forms import MntForm, ContactForm
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
|
||||||
|
from .models import Maintainer, Contact, InetNum, ASBlock, ASNumber
|
||||||
|
from .forms import MntForm, MntInitialForm, ContactForm, ContactInitialForm, InetNumForm
|
||||||
|
from .generic import DeleteCheckView
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def dbDashboard(request):
|
def dbDashboard(request):
|
||||||
mnts = request.user.maintainer_set.all()
|
mnts = request.user.maintainer_set.all()
|
||||||
|
contacts = Contact.objects.filter(mnt_by__in=mnts)
|
||||||
|
netblocks = InetNum.objects.filter(Q(mnt_by__in=mnts)|Q(mnt_lower__in=mnts))
|
||||||
|
asblocks = ASBlock.objects.filter(Q(mnt_by__in=mnts)|Q(mnt_lower__in=mnts))
|
||||||
|
asnumbers = ASNumber.objects.filter(Q(mnt_by__in=mnts)|Q(mnt_lower__in=mnts))
|
||||||
mntForm = contactForm = None
|
mntForm = contactForm = None
|
||||||
|
|
||||||
if mnts.count() == 0:
|
if mnts.count() == 0:
|
||||||
mntForm = contactForm = None
|
mntForm = contactForm = None
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
mntForm = MntForm(data=request.POST, prefix="mnt")
|
mntForm = MntInitialForm(user=request.user, data=request.POST, prefix="mnt")
|
||||||
contactForm = ContactForm(person=True, data=request.POST, prefix="contact")
|
contactForm = ContactInitialForm(user=request.user, person=True, data=request.POST, prefix="contact")
|
||||||
if mntForm.is_valid() and contactForm.is_valid():
|
if mntForm.is_valid() and contactForm.is_valid():
|
||||||
mnt = mntForm.save(commit=False)
|
mnt = mntForm.save(commit=False)
|
||||||
mnt.handleAuto(request.user.username)
|
mnt.handleAuto(request.user.username)
|
||||||
|
@ -23,6 +31,7 @@ def dbDashboard(request):
|
||||||
|
|
||||||
contact = contactForm.save(commit=False)
|
contact = contactForm.save(commit=False)
|
||||||
contact.handleAuto()
|
contact.handleAuto()
|
||||||
|
contact.type = Contact.TYPE_PERSON
|
||||||
contact.save()
|
contact.save()
|
||||||
contact.mnt_by.add(mnt.id)
|
contact.mnt_by.add(mnt.id)
|
||||||
contact.save()
|
contact.save()
|
||||||
|
@ -33,14 +42,123 @@ def dbDashboard(request):
|
||||||
|
|
||||||
return HttpResponseRedirect(reverse("whoisdb:dashboard"))
|
return HttpResponseRedirect(reverse("whoisdb:dashboard"))
|
||||||
else:
|
else:
|
||||||
mntForm = MntForm(prefix="mnt", initial={'handle': 'AUTO', 'description': 'Primary maintainer of %s' % request.user.username})
|
mntForm = MntInitialForm(user=request.user, prefix="mnt", initial={'handle': 'AUTO', 'description': 'Primary maintainer of %s' % request.user.username})
|
||||||
contactForm = ContactForm(person=True, initial={'handle': 'AUTO', 'name': request.user.username.capitalize()}, prefix='contact')
|
contactForm = ContactInitialForm(user=request.user, person=True, initial={'handle': 'AUTO', 'name': request.user.username.capitalize()}, prefix='contact')
|
||||||
|
|
||||||
return render(request, "whoisdb/overview.html", {"mnts": mnts, "mntForm": mntForm, "contactForm": contactForm})
|
print(asnumbers, asblocks, netblocks, mnts)
|
||||||
|
|
||||||
|
return render(request, "whoisdb/overview.html", {"mnts": mnts, "contacts": contacts, "mntForm": mntForm, "contactForm": contactForm, "netblocks": netblocks, "asblocks": asblocks, "asnumbers": asnumbers})
|
||||||
|
|
||||||
|
class MaintainerCreate(LoginRequiredMixin, CreateView):
|
||||||
|
template_name = "whoisdb/obj_create.html"
|
||||||
|
form_class = MntForm
|
||||||
|
|
||||||
|
def get_form_kwargs(self, *args, **kwargs):
|
||||||
|
kwargs = super(MaintainerCreate, self).get_form_kwargs(*args, **kwargs)
|
||||||
|
kwargs["user"] = self.request.user
|
||||||
|
kwargs["initial"] = {
|
||||||
|
"handle": "AUTO",
|
||||||
|
}
|
||||||
|
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
self.object = form.save(commit=False)
|
||||||
|
self.object.handleAuto(self.request.user.username)
|
||||||
|
self.object.save()
|
||||||
|
self.object.auth.add(self.request.user)
|
||||||
|
self.object.save()
|
||||||
|
|
||||||
|
return super(MaintainerCreate, self).form_valid(form)
|
||||||
|
|
||||||
|
class MaintainerEdit(LoginRequiredMixin, UpdateView):
|
||||||
|
template_name = "whoisdb/maintainer_edit.html"
|
||||||
|
model = Maintainer
|
||||||
|
form_class = MntForm
|
||||||
|
slug_field = "handle"
|
||||||
|
slug_url_kwarg = "handle"
|
||||||
|
|
||||||
|
def get_form_kwargs(self, *args, **kwargs):
|
||||||
|
kwargs = super(MaintainerEdit, self).get_form_kwargs(*args, **kwargs)
|
||||||
|
kwargs["user"] = self.request.user
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return self.model.objects.filter(auth=self.request.user)
|
||||||
|
|
||||||
|
class MaintainerDelete(LoginRequiredMixin, DeleteCheckView):
|
||||||
|
template_name = "whoisdb/obj_delete.html"
|
||||||
|
model = Maintainer
|
||||||
|
slug_field = "handle"
|
||||||
|
slug_url_kwarg = "handle"
|
||||||
|
success_url = reverse_lazy("whoisdb:dashboard")
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return self.model.objects.filter(auth=self.request.user)
|
||||||
|
|
||||||
|
|
||||||
|
class MaintainerDetail(LoginRequiredMixin, DetailView):
|
||||||
|
model = Maintainer
|
||||||
|
slug_field = "handle"
|
||||||
|
slug_url_kwarg = "handle"
|
||||||
|
context_object_name = "mnt"
|
||||||
|
|
||||||
|
class ContactDetail(DetailView):
|
||||||
|
model = Contact
|
||||||
|
slug_field = "handle"
|
||||||
|
slug_url_kwarg = "handle"
|
||||||
|
context_object_name = "contact"
|
||||||
|
|
||||||
|
class ContactEdit(LoginRequiredMixin, UpdateView):
|
||||||
|
template_name = "whoisdb/obj_edit.html"
|
||||||
|
model = Contact
|
||||||
|
form_class = ContactForm
|
||||||
|
slug_field = "handle"
|
||||||
|
slug_url_kwarg = "handle"
|
||||||
|
|
||||||
|
def get_form_kwargs(self, *args, **kwargs):
|
||||||
|
kwargs = super(ContactEdit, self).get_form_kwargs(*args, **kwargs)
|
||||||
|
kwargs["user"] = self.request.user
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
# FIXME: we need all maintainers to be available. autofill own maintainers
|
||||||
|
return self.model.objects.filter(mnt_by__in=self.request.user.maintainer_set.all())
|
||||||
|
|
||||||
|
class ContactCreate(LoginRequiredMixin, CreateView):
|
||||||
|
template_name = "whoisdb/obj_create.html"
|
||||||
|
form_class = ContactForm
|
||||||
|
|
||||||
|
def get_form_kwargs(self, *args, **kwargs):
|
||||||
|
kwargs = super(ContactCreate, self).get_form_kwargs(*args, **kwargs)
|
||||||
|
kwargs["user"] = self.request.user
|
||||||
|
kwargs["initial"] = {
|
||||||
|
"handle": "AUTO",
|
||||||
|
"type": Contact.TYPE_PERSON
|
||||||
|
}
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
class ContactDelete(LoginRequiredMixin, DeleteCheckView):
|
||||||
|
template_name = "whoisdb/obj_delete.html"
|
||||||
|
model = Contact
|
||||||
|
slug_field = "handle"
|
||||||
|
slug_url_kwarg = "handle"
|
||||||
|
success_url = reverse_lazy("whoisdb:dashboard")
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return self.model.objects.filter(mnt_by__in=self.request.user.maintainer_set.all())
|
||||||
|
|
||||||
|
# InetNum
|
||||||
|
class InetNumCreate(LoginRequiredMixin, CreateView):
|
||||||
|
template_name = "whoisdb/obj_create.html"
|
||||||
|
form_class = InetNumForm
|
||||||
|
|
||||||
|
def get_form_kwargs(self, *args, **kwargs):
|
||||||
|
kwargs = super(InetNumCreate, self).get_form_kwargs(*args, **kwargs)
|
||||||
|
kwargs["user"] = self.request.user
|
||||||
|
kwargs["initial"] = {
|
||||||
|
"handle": "AUTO",
|
||||||
|
"type": Contact.TYPE_PERSON
|
||||||
|
}
|
||||||
|
return kwargs
|
||||||
|
|
||||||
def manageMnt(request, mnt=None):
|
|
||||||
if mnt:
|
|
||||||
# object or 404
|
|
||||||
pass
|
|
||||||
return render(request, "whoisdb/overview.html", {})
|
|
||||||
|
|
Loading…
Reference in New Issue