diff --git a/labAdmin/admin.py b/labAdmin/admin.py index 37a2ee7..1302da3 100755 --- a/labAdmin/admin.py +++ b/labAdmin/admin.py @@ -14,6 +14,8 @@ UserProfile, ) +from .arp import get_neighbours + class CardAdmin(admin.ModelAdmin): list_display = ('nfc_id', 'user', 'credits') @@ -66,6 +68,22 @@ class CategoryAdmin(admin.ModelAdmin): class DeviceAdmin(admin.ModelAdmin): list_display = ('name', 'hourlyCost', 'category', 'mac', 'last_activity') ordering = ('name',) + change_form_template = 'labadmin/admin/device_change_form.html' + add_form_template = 'labadmin/admin/device_change_form.html' + + def change_view(self, request, object_id, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['labadmin_available_devices'] = get_neighbours() + return super(DeviceAdmin, self).change_view( + request, object_id, form_url, extra_context=extra_context + ) + + def add_view(self, request, form_url='', extra_context=None): + extra_context = extra_context or {} + extra_context['labadmin_available_devices'] = get_neighbours() + return super(DeviceAdmin, self).add_view( + request, form_url, extra_context=extra_context + ) admin.site.register(Device, DeviceAdmin) diff --git a/labAdmin/arp.py b/labAdmin/arp.py new file mode 100644 index 0000000..952120f --- /dev/null +++ b/labAdmin/arp.py @@ -0,0 +1,20 @@ +IP_INDEX = 0 +MAC_INDEX = 3 +NUM_FIELDS = 6 + + +def get_neighbours(): + """ + Returns a generator of ip address, mac address tuples. + Empty mac addresses are filtered out. + """ + with open('/proc/net/arp', 'r') as f: + # skip header + next(f) + for row in f: + fields = row.split() + if len(fields) < NUM_FIELDS: + continue + if fields[MAC_INDEX] == '00:00:00:00:00:00': + continue + yield fields[IP_INDEX], fields[MAC_INDEX] diff --git a/labAdmin/templates/labadmin/admin/device_change_form.html b/labAdmin/templates/labadmin/admin/device_change_form.html new file mode 100644 index 0000000..22cb4dc --- /dev/null +++ b/labAdmin/templates/labadmin/admin/device_change_form.html @@ -0,0 +1,43 @@ +{% extends "admin/change_form.html" %} +{% load i18n admin_urls %} + +{% block object-tools %} +{% if not is_popup %} +