Merge pull request #108 from bugsink/hijacked-pr-84

feat: add delete functionality for users
This commit is contained in:
Klaas van Schelven
2025-05-29 17:21:53 +02:00
committed by GitHub
5 changed files with 102 additions and 3 deletions

27
static/js/entity_edit.js Normal file
View File

@@ -0,0 +1,27 @@
"use strict";
/**
* Initializes delete functionality for entity edit pages
*/
function initializeDeleteModal() {
const modal = document.getElementById('deleteModal');
const deleteBtn = document.getElementById('deleteButton');
const cancelBtn = document.getElementById('cancelDelete');
if (!modal || !deleteBtn || !cancelBtn) {
console.error('One or more required elements not found');
return;
}
deleteBtn.addEventListener('click', () => {
modal.classList.remove('hidden');
});
cancelBtn.addEventListener('click', () => {
modal.classList.add('hidden');
});
}
document.addEventListener('DOMContentLoaded', function() {
initializeDeleteModal();
});

32
static/js/user_list.js Normal file
View File

@@ -0,0 +1,32 @@
"use strict";
/**
* Initializes delete functionality for user list page
*/
function initializeDeleteModal() {
const modal = document.getElementById('deleteModal');
const deleteButtons = document.querySelectorAll('.delete-button');
const cancelBtn = document.getElementById('cancelDelete');
const deleteActionInput = document.getElementById('deleteAction');
if (!modal || deleteButtons.length === 0 || !cancelBtn || !deleteActionInput) {
console.error('One or more required elements not found');
return;
}
deleteButtons.forEach(button => {
button.addEventListener('click', () => {
const userId = button.getAttribute('data-user-id');
deleteActionInput.value = 'delete:' + userId;
modal.classList.remove('hidden');
});
});
cancelBtn.addEventListener('click', () => {
modal.classList.add('hidden');
});
}
document.addEventListener('DOMContentLoaded', function() {
initializeDeleteModal();
});

File diff suppressed because one or more lines are too long

View File

@@ -5,6 +5,28 @@
{% block content %}
<!-- Delete Confirmation Modal -->
<div id="deleteModal" class="hidden fixed inset-0 bg-slate-600 bg-opacity-50 overflow-y-auto h-full w-full z-50 flex items-center justify-center">
<div class="relative p-6 border border-slate-300 w-96 shadow-lg rounded-md bg-white">
<div class="text-center m-4">
<h3 class="text-2xl font-semibold text-slate-800 mt-3 mb-4">Delete User</h3>
<div class="mt-4 mb-6">
<p class="text-slate-700">
Are you sure you want to delete this user? This action cannot be undone.
</p>
</div>
<div class="flex items-center justify-center space-x-4 mb-4">
<button id="cancelDelete" class="text-cyan-500 font-bold">Cancel</button>
<form method="post" action="." id="deleteForm">
{% csrf_token %}
<input type="hidden" name="action" id="deleteAction" value="">
<button type="submit" class="font-bold py-2 px-4 rounded bg-red-500 text-white border-2 border-red-600 hover:bg-red-600 active:ring">Confirm</button>
</form>
</div>
</div>
</div>
</div>
<div class="flex items-center justify-center">
<div class="m-4 max-w-4xl flex-auto">
@@ -25,7 +47,7 @@
Our current invite-system is tied to either a team or a project; no "global" invites (yet).
<div class="ml-auto mt-6">
<a class="font-bold text-slate-800 border-slate-500 pl-4 pr-4 pb-2 pt-2 ml-1 border-2 bg-cyan-200 hover:bg-cyan-400 active:ring rounded-md" href="{% url "team_members_invite" team_pk=team.pk %}">Invite Member</a>
</div>
</div>
{% endcomment %}
</div>
@@ -59,9 +81,10 @@
<button name="action" value="deactivate:{{ user.id }}" class="font-bold text-slate-500 border-slate-300 pl-4 pr-4 pb-2 pt-2 ml-2 border-2 hover:bg-slate-200 active:ring rounded-md">Deactivate</button>
{% else %}
<button name="action" value="activate:{{ user.id }}" class="font-bold text-slate-500 border-slate-300 pl-4 pr-4 pb-2 pt-2 ml-2 border-2 hover:bg-slate-200 active:ring rounded-md">Activate</button>
<button type="button" class="delete-button font-bold py-2 px-4 rounded bg-red-500 text-white border-2 border-red-600 hover:bg-red-600 active:ring ml-4" data-user-id="{{ user.id }}">Delete</button>
{% endif %}
{% endif %}
</div>
</div>
</td>
</tr>
@@ -84,3 +107,10 @@
</div>
{% endblock %}
{% block extra_js %}
<script>
var csrftoken = '{{ csrf_token }}';
</script>
<script src="{% static 'js/user_list.js' %}"></script>
{% endblock %}

View File

@@ -44,6 +44,16 @@ def user_list(request):
messages.success(request, 'User %s activated' % user.username)
return redirect('user_list')
if action == "delete":
user = User.objects.get(pk=user_pk)
if user.is_active:
messages.error(request, 'Cannot delete active user %s' % user.username)
else:
username = user.username
user.delete()
messages.success(request, 'User %s deleted' % username)
return redirect('user_list')
return render(request, 'users/user_list.html', {
'users': users,
})