Noot
This commit is contained in:
parent
e3311a6df7
commit
814a8b62cb
4
README
4
README
|
@ -2,3 +2,7 @@ whoisdb
|
|||
see own objects
|
||||
|
||||
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">
|
||||
{% if mnts %}
|
||||
<ul>
|
||||
<li><a href="">Create new Maintainer</a></li>
|
||||
<li><a href="">Create new Role/Person</a></li>
|
||||
<li><a href="{% url "whoisdb:mnt-create" %}">Create new Maintainer</a></li>
|
||||
<li><a href="{% url "whoisdb:contact-create" %}">Create new Role/Person</a></li>
|
||||
<li><a href="">Request resources</a></li>
|
||||
{% if netblock %}
|
||||
<li><a href="">Create Subnet</a></li>
|
||||
{% if netblocks %}
|
||||
<li><a href="{% url "whoisdb:inetnum-create" %}">Create Subnet</a></li>
|
||||
{% endif %}
|
||||
{% if asblock %}
|
||||
{% if asblocks %}
|
||||
<li><a href="">Create AS</a></li>
|
||||
<li><a href="">Create ASblock</a></li>
|
||||
{% endif %}
|
||||
|
@ -28,6 +28,7 @@
|
|||
<thead>
|
||||
<tr>
|
||||
<th>Handle</th>
|
||||
<th>Type</th>
|
||||
<th>Name?</th>
|
||||
<th>Contact</th>
|
||||
<th>Actions</th>
|
||||
|
@ -35,12 +36,19 @@
|
|||
</thead>
|
||||
<tbody>
|
||||
{% for mnt in mnts %}
|
||||
<tr>
|
||||
<td>{{ mnt.handle }}</td>
|
||||
<td>{{ mnt.description }}</td>
|
||||
<td>{% for contact in mnt.admin_c.all %}{{ contact }}{% endfor %}</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
{% include "whoisdb/handle_table_row.html" with obj=mnt objType="Maintainer" prefix="mnt" %}
|
||||
{% endfor %}
|
||||
{% for contact in contacts %}
|
||||
{% include "whoisdb/handle_table_row.html" with obj=contact objType="Contact / Role" prefix="contact" %}
|
||||
{% endfor %}
|
||||
{% 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 %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
|
|
@ -4,19 +4,71 @@ from django import forms
|
|||
#from crispy_forms.layout import Submit, Layout
|
||||
#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 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:
|
||||
model = Maintainer
|
||||
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:
|
||||
model = Contact
|
||||
fields = ['handle', 'name']
|
||||
|
||||
def __init__(self, person=True, *args, **kwargs):
|
||||
super(ContactForm, self).__init__(*args, **kwargs)
|
||||
# check if this is a person
|
||||
self.person = person
|
||||
class InetNumForm(WhoisObjectMixin, forms.ModelForm):
|
||||
class Meta:
|
||||
model = InetNum
|
||||
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.urls import reverse
|
||||
|
||||
from dncore.models import User
|
||||
from .validators import HandleValidator, HandleValidatorWithSuffix
|
||||
|
@ -19,6 +20,10 @@ class WhoisObject(models.Model):
|
|||
def genHandle(self, main=None):
|
||||
if not main:
|
||||
main = self.name
|
||||
return self.genGenericHandle(main)
|
||||
|
||||
@classmethod
|
||||
def genGenericHandle(clazz, main):
|
||||
prefix = ""
|
||||
if " " in main:
|
||||
parts = main.split(" ")
|
||||
|
@ -30,17 +35,23 @@ class WhoisObject(models.Model):
|
|||
prefix = prefix.upper()
|
||||
|
||||
i = 1
|
||||
handle = "%s%%d-%s" % (prefix, self.handleSuffix)
|
||||
handle = "%s%%d-%s" % (prefix, clazz.handleSuffix)
|
||||
while True:
|
||||
try:
|
||||
prefix
|
||||
self.__class__.objects.get(handle=handle % i)
|
||||
clazz.objects.get(handle=handle % i)
|
||||
i += 1
|
||||
except self.DoesNotExist:
|
||||
except clazz.DoesNotExist:
|
||||
break
|
||||
|
||||
return handle % i
|
||||
|
||||
def getNoDeleteReasons(self):
|
||||
raise NotImplementedError()
|
||||
|
||||
def canBeDeleted(self):
|
||||
return not bool(self.getNoDeleteReasons())
|
||||
|
||||
def handleAuto(self, name=None):
|
||||
if self.handle == "AUTO":
|
||||
self.handle = self.genHandle(name)
|
||||
|
@ -50,13 +61,27 @@ class Maintainer(WhoisObject):
|
|||
handleSuffix = "MNT"
|
||||
|
||||
auth = models.ManyToManyField(User)
|
||||
handle = models.SlugField(max_length=32, unique=True, verbose_name='handle', validators=[HandleValidatorWithSuffix('MNT')])
|
||||
description = models.CharField(max_length=64, blank=True)
|
||||
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, help_text="Short description what this maintainer is for")
|
||||
|
||||
admin_c = models.ManyToManyField("Contact")
|
||||
|
||||
# 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):
|
||||
|
@ -68,10 +93,27 @@ class MntdObject(WhoisObject):
|
|||
|
||||
class Contact(MntdObject):
|
||||
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)
|
||||
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):
|
||||
handleSuffix = "ASB"
|
||||
|
@ -79,6 +121,7 @@ class ASBlock(MntdObject):
|
|||
parent_block = models.ForeignKey("ASBlock", models.CASCADE, null=True, blank=True, default=None)
|
||||
description = models.CharField(max_length=64, blank=True)
|
||||
|
||||
mnt_lower = models.ManyToManyField(Maintainer, related_name='lower_asblock_set', blank=True)
|
||||
|
||||
class ASNumber(MntdObject):
|
||||
handleSuffix = "AS"
|
||||
|
@ -88,16 +131,20 @@ class ASNumber(MntdObject):
|
|||
asblock = models.ForeignKey(ASBlock, models.CASCADE)
|
||||
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"
|
||||
|
||||
PROTO = (('ipv4', 'ipv4'), ('ipv6', 'ipv6'))
|
||||
IPv4 = "ipv4"
|
||||
IPv6 = "ipv6"
|
||||
|
||||
PROTO = ((IPv4, 'IPv4'), (IPv6, 'IPv6'))
|
||||
protocol = models.CharField(max_length=4, choices=PROTO)
|
||||
address = models.GenericIPAddressField(db_index=True)
|
||||
netmask = models.PositiveIntegerField()
|
||||
parent_range = models.ForeignKey("InetNum", models.CASCADE, null=True, blank=True, default=None)
|
||||
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 = [
|
||||
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.db.models import Q
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.urls import reverse
|
||||
|
||||
from .forms import MntForm, ContactForm
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.views.generic import DetailView, CreateView, UpdateView
|
||||
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
|
||||
def dbDashboard(request):
|
||||
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
|
||||
|
||||
if mnts.count() == 0:
|
||||
mntForm = contactForm = None
|
||||
if request.method == "POST":
|
||||
mntForm = MntForm(data=request.POST, prefix="mnt")
|
||||
contactForm = ContactForm(person=True, data=request.POST, prefix="contact")
|
||||
mntForm = MntInitialForm(user=request.user, data=request.POST, prefix="mnt")
|
||||
contactForm = ContactInitialForm(user=request.user, person=True, data=request.POST, prefix="contact")
|
||||
if mntForm.is_valid() and contactForm.is_valid():
|
||||
mnt = mntForm.save(commit=False)
|
||||
mnt.handleAuto(request.user.username)
|
||||
|
@ -23,6 +31,7 @@ def dbDashboard(request):
|
|||
|
||||
contact = contactForm.save(commit=False)
|
||||
contact.handleAuto()
|
||||
contact.type = Contact.TYPE_PERSON
|
||||
contact.save()
|
||||
contact.mnt_by.add(mnt.id)
|
||||
contact.save()
|
||||
|
@ -33,14 +42,123 @@ def dbDashboard(request):
|
|||
|
||||
return HttpResponseRedirect(reverse("whoisdb:dashboard"))
|
||||
else:
|
||||
mntForm = MntForm(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')
|
||||
mntForm = MntInitialForm(user=request.user, prefix="mnt", initial={'handle': 'AUTO', 'description': 'Primary maintainer of %s' % request.user.username})
|
||||
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)
|
||||
|
||||
|
||||
def manageMnt(request, mnt=None):
|
||||
if mnt:
|
||||
# object or 404
|
||||
pass
|
||||
return render(request, "whoisdb/overview.html", {})
|
||||
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue