Search working
This commit is contained in:
parent
33de8402b7
commit
231f8a7f30
|
@ -0,0 +1,19 @@
|
|||
{% load handletags %}
|
||||
<table class="table">
|
||||
{% for field in object|getFields:user %}
|
||||
<tr>
|
||||
<td>{{ field.0 }}</td>
|
||||
<td>{% if field.1.through %}{{ field.1.all|linkObjects|default:"-" }}{% else %}{{ field.1|default:"-" }}{% endif %}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% if object|userCanEdit:user %}
|
||||
<tr>
|
||||
<td>Actions</td>
|
||||
{% with request.resolver_match.namespaces.0|add:":"|add:object.getClassName|lower|add:"-edit" as editView %}
|
||||
{% with request.resolver_match.namespaces.0|add:":"|add:object.getClassName|lower|add:"-delete" as deleteView %}
|
||||
<td><a href="{% url editView object.getPK %}">Edit object<a/>, <a href="{% url deleteView object.getPK %}">Delete object</a></td>
|
||||
{% endwith %}
|
||||
{% endwith %}
|
||||
</tr>
|
||||
{% endif %}
|
||||
</table>
|
|
@ -0,0 +1,32 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="col-sm-12">
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">Search {% if term %}for {{ term }}{% else %}database{% endif %}</div>
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
<form class="form" method="post" action="{% url "whoisdb:search" %}">
|
||||
{% csrf_token %}
|
||||
<input type="text" name="q" placeholder="Search in DB">
|
||||
<button class="btn btn-primary">Search</button>
|
||||
</form>
|
||||
</p>
|
||||
{% if term %}
|
||||
<p>
|
||||
<h3>Search for '{{ term }}'</h3>
|
||||
{% for obj in results %}
|
||||
<h5>{{ obj }}</h5>
|
||||
{% include "whoisdb/handle_table.html" with object=obj %}
|
||||
{% empty %}
|
||||
No objects found.
|
||||
{% endfor %}
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -2,6 +2,7 @@ import whoisdb.models
|
|||
import domains.models
|
||||
|
||||
import ipaddress
|
||||
import re
|
||||
|
||||
def _addFields(fields, obj, fieldNames):
|
||||
for fieldName in fieldNames:
|
||||
|
@ -49,17 +50,67 @@ def guessWhoisObject(self, handle):
|
|||
|
||||
def findInDatabase(rawValue):
|
||||
# is this an ip address?
|
||||
rawValue = rawValue.strip()
|
||||
rawValue = rawValue.strip().upper()
|
||||
value = None
|
||||
isIp = False
|
||||
results = []
|
||||
|
||||
# try subnetwork
|
||||
try:
|
||||
value = ipaddress.ip_network(rawValue, strict=False)
|
||||
isIp = true
|
||||
except ValueError:
|
||||
try:
|
||||
value = ipaddress.ip_address(rawValue)
|
||||
except ValueError:
|
||||
pass
|
||||
pass
|
||||
|
||||
if value:
|
||||
# ssubnet
|
||||
obj = whoisdb.models.InetNum.objects.filter(address=str(value.network_address), netmask=value.prefixlen)
|
||||
results.extend(obj)
|
||||
|
||||
# single ip
|
||||
value = None
|
||||
try:
|
||||
value = ipaddress.ip_address(rawValue)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
if value:
|
||||
# TODO FIXME: find smallest matching network
|
||||
obj = whoisdb.models.InetNum.objects.filter(address=str(value))
|
||||
results.extend(obj)
|
||||
|
||||
# asnumber?
|
||||
m = re.match("^(?:AS)?(\d+)$", rawValue)
|
||||
if m:
|
||||
# asnumber!
|
||||
obj = whoisdb.models.ASNumber(number=int(m.group(1)))
|
||||
results.extend(obj)
|
||||
|
||||
# asblocks? smallest asblock containing the range
|
||||
# WHEN anotation foo... could also be done in asnumber match
|
||||
# also look for number - number queries?
|
||||
|
||||
# domain?
|
||||
if rawValue.endswith("DN") or rawValue.endswith("DN."):
|
||||
value = rawValue
|
||||
if not value.endswith("."):
|
||||
value += "."
|
||||
|
||||
obj = domains.models.Domain.filter(name=value)
|
||||
results.extend(obj)
|
||||
|
||||
# contact by name?
|
||||
|
||||
# handlenames for Maintainer, Contact, InetNum, ASNumber, ASBlock
|
||||
handleObjs = [
|
||||
whoisdb.models.Contact,
|
||||
whoisdb.models.Maintainer,
|
||||
whoisdb.models.InetNum,
|
||||
whoisdb.models.ASBlock,
|
||||
whoisdb.models.ASNumber,
|
||||
]
|
||||
for handleObj in handleObjs:
|
||||
results.extend(handleObj.objects.filter(handle=rawValue))
|
||||
|
||||
return results
|
||||
|
||||
# try:
|
||||
# - ipnetwork
|
||||
|
|
|
@ -158,7 +158,7 @@ class Contact(MntdObject):
|
|||
def getNoDeleteReasons(self):
|
||||
reasons = []
|
||||
|
||||
contactables = [Maintainer]
|
||||
contactables = [Maintainer, ASBlock, ASNumber, InetNum]
|
||||
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:
|
||||
|
|
|
@ -82,12 +82,13 @@ def showHandle(request, handle):
|
|||
|
||||
|
||||
def searchObject(request):
|
||||
results = None
|
||||
term = None
|
||||
if request.method == "POST":
|
||||
name = request.POST.get("q", None)
|
||||
if name:
|
||||
#print(name)
|
||||
findInDatabase(name)
|
||||
return render(request, "whoisdb/search.html", {})
|
||||
term = request.POST.get("q", None)
|
||||
if term:
|
||||
results = findInDatabase(term)
|
||||
return render(request, "whoisdb/search.html", {"results": results, "term": term})
|
||||
|
||||
|
||||
class MaintainerCreate(LoginRequiredMixin, CreateView):
|
||||
|
|
Loading…
Reference in New Issue