Skip to content

Commit

Permalink
[feature] Added support for device deactivation #560
Browse files Browse the repository at this point in the history
Closes #560
  • Loading branch information
pandafy committed Aug 8, 2024
1 parent cf0915c commit f7ff6f3
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 11 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@ jobs:
pip install -r requirements-test.txt
pip install -U -I -e .
pip uninstall -y django
pip install -U --force-reinstall --no-deps https://github.com/openwisp/openwisp-utils/tarball/extendable-submit-line
pip install -U --force-reinstall --no-deps https://github.com/openwisp/openwisp-controller/tarball/issues/625-device-deactivation
pip install ${{ matrix.django-version }}
sudo npm install -g jshint stylelint
Expand Down
21 changes: 13 additions & 8 deletions openwisp_monitoring/device/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
from swapper import load_model

from openwisp_controller.config.admin import DeviceAdmin as BaseDeviceAdmin
from openwisp_controller.config.admin import DeactivatedDeviceReadOnlyMixin
from openwisp_users.multitenancy import MultitenantAdminMixin
from openwisp_utils.admin import ReadOnlyAdmin

Expand Down Expand Up @@ -61,27 +62,29 @@ class InlinePermissionMixin:
def has_add_permission(self, request, obj=None):
# User will be able to add objects from inline even
# if it only has permission to add a model object
return super().has_add_permission(request, obj) or request.user.has_perm(
return super().has_add_permission(request, obj) and request.user.has_perm(
f'{self.model._meta.app_label}.add_{self.inline_permission_suffix}'
)

def has_change_permission(self, request, obj=None):
return super().has_change_permission(request, obj) or request.user.has_perm(
return super().has_change_permission(request, obj) and request.user.has_perm(
f'{self.model._meta.app_label}.change_{self.inline_permission_suffix}'
)

def has_view_permission(self, request, obj=None):
return super().has_view_permission(request, obj) or request.user.has_perm(
return super().has_view_permission(request, obj) and request.user.has_perm(
f'{self.model._meta.app_label}.view_{self.inline_permission_suffix}'
)

def has_delete_permission(self, request, obj=None):
return super().has_delete_permission(request, obj) or request.user.has_perm(
return super().has_delete_permission(request, obj) and request.user.has_perm(
f'{self.model._meta.app_label}.delete_{self.inline_permission_suffix}'
)


class CheckInline(InlinePermissionMixin, GenericStackedInline):
class CheckInline(
InlinePermissionMixin, DeactivatedDeviceReadOnlyMixin, GenericStackedInline
):
model = Check
extra = 0
formset = CheckInlineFormSet
Expand Down Expand Up @@ -152,7 +155,9 @@ def get_queryset(self, request):
return super().get_queryset(request).order_by('created')


class MetricInline(InlinePermissionMixin, NestedGenericStackedInline):
class MetricInline(
InlinePermissionMixin, DeactivatedDeviceReadOnlyMixin, NestedGenericStackedInline
):
model = Metric
extra = 0
inlines = [AlertSettingsInline]
Expand Down Expand Up @@ -205,7 +210,7 @@ def has_delete_permission(self, request, obj=None):


class DeviceAdmin(BaseDeviceAdmin, NestedModelAdmin):
change_form_template = 'admin/config/device/change_form.html'
change_form_template = 'admin/monitoring/device/change_form.html'
list_filter = ['monitoring__status'] + BaseDeviceAdmin.list_filter
list_select_related = ['monitoring'] + list(BaseDeviceAdmin.list_select_related)
list_display = list(BaseDeviceAdmin.list_display)
Expand Down Expand Up @@ -415,7 +420,7 @@ class WiFiSessionInline(WifiSessionAdminHelperMixin, admin.TabularInline):
readonly_fields = fields
can_delete = False
extra = 0
template = 'admin/config/device/wifisession_tabular.html'
template = 'admin/monitoring/device/wifisession_tabular.html'

class Media:
css = {'all': ('monitoring/css/wifi-sessions.css',)}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
{% extends "admin/config/change_form.html" %}
{% extends "admin/config/device/change_form.html" %}
{% load i18n static %}
{% block after_field_sets %}
{% if not add and device_data %}
Expand Down
6 changes: 4 additions & 2 deletions openwisp_monitoring/device/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -572,11 +572,11 @@ def test_check_alertsetting_inline(self):
self.client.force_login(test_user)

def _add_device_permissions(user):
test_user.user_permissions.clear()
user.user_permissions.clear()
self.assertEqual(user.user_permissions.count(), 0)
device_permissions = Permission.objects.filter(codename__endswith='device')
# Permissions required to access device page
test_user.user_permissions.add(*device_permissions),
user.user_permissions.add(*device_permissions),
self.assertEqual(user.user_permissions.count(), 4)

def _add_user_permissions(user, permission_query, expected_perm_count):
Expand Down Expand Up @@ -989,6 +989,8 @@ def test_wifi_session_chart_on_index(self):

def test_deleting_device_with_wifisessions(self):
device_data = self._save_device_data()
device = Device.objects.first()
device.deactivate()
path = reverse('admin:config_device_delete', args=[device_data.pk])
response = self.client.post(path, {'post': 'yes'}, follow=True)
self.assertEqual(response.status_code, 200)
Expand Down
2 changes: 2 additions & 0 deletions openwisp_monitoring/tests/test_selenium.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,8 @@ def test_restoring_deleted_device(self):
self.fail('Failed saving device')

# Delete the device
device.deactivate()
device.config.set_status_deactivated()
self.open(
reverse(f'admin:{self.config_app_label}_device_delete', args=[device.id])
)
Expand Down

0 comments on commit f7ff6f3

Please sign in to comment.