diff --git a/.gitignore b/.gitignore index 316a346..b49a9f3 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,6 @@ venv.bak/ # mypy .mypy_cache/ + +# conf file +zezere.conf \ No newline at end of file diff --git a/zezere/models.py b/zezere/models.py index 731113d..e1eafc3 100644 --- a/zezere/models.py +++ b/zezere/models.py @@ -158,6 +158,7 @@ class Meta: "delete": rules.owns_device, "provision": rules.owns_device, "claim": rules.can_claim, + "remove_unclaimed": rules.can_claim, } def __str__(self): diff --git a/zezere/templates/portal/claim.html b/zezere/templates/portal/claim.html index 7c30c33..0d7b2f1 100644 --- a/zezere/templates/portal/claim.html +++ b/zezere/templates/portal/claim.html @@ -6,20 +6,42 @@ {% block content %} {% if super %} -Unowned devices: +

Unowned devices:

{% else %} -Unowned devices from this IP address: +

Unowned devices from this IP address:

{% endif %} -{% for device in unclaimed_devices %} - {% has_perm 'zezere.claim_device' user device as can_claim_device %} - {% if can_claim_device %} -
- MAC address: {{ device.mac_address }} - {% csrf_token %} - - -
-
- {% endif %} -{% endfor %} +
+ + + + + + + + + {% for device in unclaimed_devices %} + {% has_perm 'zezere.claim_device' user device as can_claim_device %} + {% if can_claim_device %} + + + + + + {% endif %} + {% endfor %} + +
Mac AddressActions
{{ device.mac_address }} +
+ {% csrf_token %} + + +
+
+
+ {% csrf_token %} + + +
+
+
{% endblock %} diff --git a/zezere/templates/portal/devices.html b/zezere/templates/portal/devices.html index 9a6c5e7..773fda5 100644 --- a/zezere/templates/portal/devices.html +++ b/zezere/templates/portal/devices.html @@ -5,37 +5,56 @@ {% block title %}Device list{% endblock %} {% block content %} -Your devices: - - - - - - - - {% for device in devices %} - {% has_perm 'zezere.view_device' user device as can_view_device %} - {% if can_view_device %} +

Your devices:

+
+{% if not devices %} +

No claimed devices

+{% else %} +
+
Mac AddressHostnameRun RequestActions
+ - - - - + + + + + - {% endif %} - {% endfor %} -
{{ device.mac_address }}{{ device.hostname }} - {% if device.run_request %} - {{ device.run_request }} - {% endif %} - - {% if device.run_request %} -
- {% csrf_token %} - -
- {% else %} - Submit provision request - {% endif %} -
Mac AddressHostnameRun RequestActions
+ + + {% for device in devices %} + {% has_perm 'zezere.view_device' user device as can_view_device %} + {% if can_view_device %} + + {{ device.mac_address }} + {{ device.hostname }} + + {% if device.run_request %} + {{ device.run_request }} + {% endif %} + + + {% if device.run_request %} +
+ {% csrf_token %} + +
+ {% else %} + Submit provision request + {% endif %} + + +
+ {% csrf_token %} + + +
+ + + {% endif %} + {% endfor %} + + + +{% endif %} {% endblock %} diff --git a/zezere/urls.py b/zezere/urls.py index 370eb4e..62fce52 100644 --- a/zezere/urls.py +++ b/zezere/urls.py @@ -22,7 +22,13 @@ # Portal path("portal/", views_portal.index, name="portal_index"), path("portal/claim/", views_portal.claim, name="portal_claim"), + path("portal/claim/remove/", views_portal.remove_unclaimed, name="portal_remove_unclamed"), path("portal/devices/", views_portal.devices, name="portal_devices"), + path( + "portal/devices/delete/", + views_portal.unclaim, + name="portal_unclaim_device", + ), path( "portal/devices/runreq//", views_portal.new_runreq, diff --git a/zezere/views_portal.py b/zezere/views_portal.py index eaff942..406a7ee 100644 --- a/zezere/views_portal.py +++ b/zezere/views_portal.py @@ -37,6 +37,31 @@ def claim(request): return render(request, "portal/claim.html", context) +@login_required +@require_POST +def remove_unclaimed(request): + device_id = request.POST.get("device_id") + device = get_object_or_404(Device, id=device_id) + if not request.user.has_perm(Device.get_perm("remove_unclaimed"), device): + raise PermissionDenied() + + device.delete() + return redirect("/portal/claim/") + + +@login_required +@require_POST +def unclaim(request): + device_id = request.POST.get("device_id") + device = get_object_or_404(Device, id=device_id) + if not request.user.has_perm(Device.get_perm("delete"), device): + raise PermissionDenied() + + device.owner = None + device.save() + return redirect("/portal/devices/") + + @login_required def devices(request): devices = Device.objects.filter(owner=request.user)