admin.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from django.contrib import admin, messages
  2. from django.contrib.admin.helpers import ACTION_CHECKBOX_NAME
  3. from django.shortcuts import redirect, render
  4. from .forms import ActivateUserKeyForm
  5. from .models import UserKey
  6. @admin.register(UserKey)
  7. class UserKeyAdmin(admin.ModelAdmin):
  8. actions = ['activate_selected']
  9. list_display = ['user', 'is_filled', 'is_active', 'created']
  10. fields = ['user', 'public_key', 'is_active', 'last_updated']
  11. readonly_fields = ['user', 'is_active', 'last_updated']
  12. def get_readonly_fields(self, request, obj=None):
  13. # Don't allow a user to modify an existing public key directly.
  14. if obj and obj.public_key:
  15. return ['public_key'] + self.readonly_fields
  16. return self.readonly_fields
  17. def get_actions(self, request):
  18. # Bulk deletion is disabled at the manager level, so remove the action from the admin site for this model.
  19. actions = super().get_actions(request)
  20. if 'delete_selected' in actions:
  21. del actions['delete_selected']
  22. if not request.user.has_perm('secrets.change_userkey'):
  23. del actions['activate_selected']
  24. return actions
  25. def activate_selected(modeladmin, request, queryset):
  26. """
  27. Enable bulk activation of UserKeys
  28. """
  29. try:
  30. my_userkey = UserKey.objects.get(user=request.user)
  31. except UserKey.DoesNotExist:
  32. messages.error(request, "You do not have an active User Key.")
  33. return redirect('admin:secrets_userkey_changelist')
  34. if 'activate' in request.POST:
  35. form = ActivateUserKeyForm(request.POST)
  36. if form.is_valid():
  37. master_key = my_userkey.get_master_key(form.cleaned_data['secret_key'])
  38. if master_key is not None:
  39. for uk in form.cleaned_data['_selected_action']:
  40. uk.activate(master_key)
  41. return redirect('admin:secrets_userkey_changelist')
  42. else:
  43. messages.error(
  44. request, "Invalid private key provided. Unable to retrieve master key.", extra_tags='error'
  45. )
  46. else:
  47. form = ActivateUserKeyForm(
  48. initial={'_selected_action': request.POST.getlist(ACTION_CHECKBOX_NAME)}
  49. )
  50. return render(request, 'activate_keys.html', {
  51. 'form': form,
  52. })
  53. activate_selected.short_description = "Activate selected user keys"