|
21 | 21 | )
|
22 | 22 | from swapper import load_model
|
23 | 23 |
|
| 24 | +from openwisp_controller.config.admin import DeactivatedDeviceReadOnlyMixin |
24 | 25 | from openwisp_controller.config.admin import DeviceAdmin as BaseDeviceAdmin
|
25 | 26 | from openwisp_users.multitenancy import MultitenantAdminMixin
|
26 | 27 | from openwisp_utils.admin import ReadOnlyAdmin
|
@@ -58,30 +59,68 @@ def full_clean(self):
|
58 | 59 |
|
59 | 60 |
|
60 | 61 | class InlinePermissionMixin:
|
| 62 | + """ |
| 63 | + Manages permissions for the inline objects. |
| 64 | +
|
| 65 | + This mixin class handles the permissions for the inline objects. |
| 66 | + It checks if the user has permission to modify the main object |
| 67 | + (e.g., view_model, add_model, change_model, or delete_model), |
| 68 | + and if not, it checks if the user has permission to modify the |
| 69 | + inline object (e.g., view_model_inline, add_model_inline, |
| 70 | + change_model_inline, or delete_model_inline). |
| 71 | + """ |
| 72 | + |
61 | 73 | def has_add_permission(self, request, obj=None):
|
62 |
| - # User will be able to add objects from inline even |
63 |
| - # if it only has permission to add a model object |
64 |
| - return super().has_add_permission(request, obj) or request.user.has_perm( |
| 74 | + return super(admin.options.InlineModelAdmin, self).has_add_permission( |
| 75 | + request |
| 76 | + ) or request.user.has_perm( |
65 | 77 | f'{self.model._meta.app_label}.add_{self.inline_permission_suffix}'
|
66 | 78 | )
|
67 | 79 |
|
68 | 80 | def has_change_permission(self, request, obj=None):
|
69 |
| - return super().has_change_permission(request, obj) or request.user.has_perm( |
| 81 | + return super(admin.options.InlineModelAdmin, self).has_change_permission( |
| 82 | + request, obj |
| 83 | + ) or request.user.has_perm( |
70 | 84 | f'{self.model._meta.app_label}.change_{self.inline_permission_suffix}'
|
71 | 85 | )
|
72 | 86 |
|
73 | 87 | def has_view_permission(self, request, obj=None):
|
74 |
| - return super().has_view_permission(request, obj) or request.user.has_perm( |
| 88 | + return super(admin.options.InlineModelAdmin, self).has_view_permission( |
| 89 | + request, obj |
| 90 | + ) or request.user.has_perm( |
75 | 91 | f'{self.model._meta.app_label}.view_{self.inline_permission_suffix}'
|
76 | 92 | )
|
77 | 93 |
|
78 | 94 | def has_delete_permission(self, request, obj=None):
|
79 |
| - return super().has_delete_permission(request, obj) or request.user.has_perm( |
| 95 | + return super(admin.options.InlineModelAdmin, self).has_delete_permission( |
| 96 | + request, obj |
| 97 | + ) or request.user.has_perm( |
80 | 98 | f'{self.model._meta.app_label}.delete_{self.inline_permission_suffix}'
|
81 | 99 | )
|
82 | 100 |
|
83 | 101 |
|
84 |
| -class CheckInline(InlinePermissionMixin, GenericStackedInline): |
| 102 | +class DeactivatedDeviceReadOnlyInlinePermissionMixin( |
| 103 | + DeactivatedDeviceReadOnlyMixin, |
| 104 | + InlinePermissionMixin, |
| 105 | +): |
| 106 | + def has_add_permission(self, request, obj=None): |
| 107 | + perm = super().has_add_permission(request, obj) |
| 108 | + return self._has_permission(request, obj, perm) |
| 109 | + |
| 110 | + def has_change_permission(self, request, obj=None): |
| 111 | + perm = super().has_change_permission(request, obj) |
| 112 | + return self._has_permission(request, obj, perm) |
| 113 | + |
| 114 | + def has_view_permission(self, request, obj=None): |
| 115 | + perm = super().has_view_permission(request, obj) |
| 116 | + return self._has_permission(request, obj, perm) |
| 117 | + |
| 118 | + def has_delete_permission(self, request, obj=None): |
| 119 | + perm = super().has_delete_permission(request, obj) |
| 120 | + return self._has_permission(request, obj, perm) |
| 121 | + |
| 122 | + |
| 123 | +class CheckInline(DeactivatedDeviceReadOnlyInlinePermissionMixin, GenericStackedInline): |
85 | 124 | model = Check
|
86 | 125 | extra = 0
|
87 | 126 | formset = CheckInlineFormSet
|
@@ -152,7 +191,9 @@ def get_queryset(self, request):
|
152 | 191 | return super().get_queryset(request).order_by('created')
|
153 | 192 |
|
154 | 193 |
|
155 |
| -class MetricInline(InlinePermissionMixin, NestedGenericStackedInline): |
| 194 | +class MetricInline( |
| 195 | + DeactivatedDeviceReadOnlyInlinePermissionMixin, NestedGenericStackedInline |
| 196 | +): |
156 | 197 | model = Metric
|
157 | 198 | extra = 0
|
158 | 199 | inlines = [AlertSettingsInline]
|
@@ -205,7 +246,7 @@ def has_delete_permission(self, request, obj=None):
|
205 | 246 |
|
206 | 247 |
|
207 | 248 | class DeviceAdmin(BaseDeviceAdmin, NestedModelAdmin):
|
208 |
| - change_form_template = 'admin/config/device/change_form.html' |
| 249 | + change_form_template = 'admin/monitoring/device/change_form.html' |
209 | 250 | list_filter = ['monitoring__status'] + BaseDeviceAdmin.list_filter
|
210 | 251 | list_select_related = ['monitoring'] + list(BaseDeviceAdmin.list_select_related)
|
211 | 252 | list_display = list(BaseDeviceAdmin.list_display)
|
@@ -302,7 +343,7 @@ def get_fields(self, request, obj=None):
|
302 | 343 | fields = list(super().get_fields(request, obj))
|
303 | 344 | if obj and not obj._state.adding:
|
304 | 345 | fields.insert(fields.index('last_ip'), 'health_status')
|
305 |
| - if not obj or obj.monitoring.status in ['ok', 'unknown']: |
| 346 | + if not obj or obj.monitoring.status in ['ok', 'unknown', 'deactivated']: |
306 | 347 | return fields
|
307 | 348 | fields.insert(fields.index('health_status') + 1, 'health_checks')
|
308 | 349 | return fields
|
@@ -415,7 +456,7 @@ class WiFiSessionInline(WifiSessionAdminHelperMixin, admin.TabularInline):
|
415 | 456 | readonly_fields = fields
|
416 | 457 | can_delete = False
|
417 | 458 | extra = 0
|
418 |
| - template = 'admin/config/device/wifisession_tabular.html' |
| 459 | + template = 'admin/monitoring/device/wifisession_tabular.html' |
419 | 460 |
|
420 | 461 | class Media:
|
421 | 462 | css = {'all': ('monitoring/css/wifi-sessions.css',)}
|
|
0 commit comments