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 %}
-
-
- {% endif %}
-{% endfor %}
+
+
+
+
+ Mac Address |
+ Actions |
+
+
+
+ {% for device in unclaimed_devices %}
+ {% has_perm 'zezere.claim_device' user device as can_claim_device %}
+ {% if can_claim_device %}
+
+ {{ device.mac_address }} |
+
+
+ |
+
+
+ |
+
+ {% endif %}
+ {% endfor %}
+
+
+
{% 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:
-
-
- Mac Address |
- Hostname |
- Run Request |
- Actions |
-
- {% 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 %}
+
+
+
- {{ device.mac_address }} |
- {{ device.hostname }} |
-
- {% if device.run_request %}
- {{ device.run_request }}
- {% endif %}
- |
-
- {% if device.run_request %}
-
- {% else %}
- Submit provision request
- {% endif %}
- |
+ Mac Address |
+ Hostname |
+ Run Request |
+ Actions |
+ |
- {% endif %}
- {% endfor %}
-
+
+
+ {% 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 %}
+
+ {% else %}
+ Submit provision request
+ {% endif %}
+ |
+
+
+ |
+
+ {% 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)