Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Delete Community Drive Functionality #383

Merged
merged 4 commits into from
Dec 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions src/community_drives/templates/community_drives/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ <h2 class="subtitle">Community Drives</h2>
<div class="columns is-multiline is-variable">
{% if drives %}
{% for drive in drives %}
{% if drive.active %}
<div class="column is-full">
<div class="card mb-5">
<div class="card-content">
Expand Down Expand Up @@ -139,6 +140,7 @@ <h2 class="subtitle">Community Drives</h2>
</div>
</div>
</div>
{% endif %}
{% endfor %}
{% else %}
<p class="box">No active community drives to display.</p>
Expand All @@ -149,6 +151,7 @@ <h2 class="subtitle">Community Drives</h2>
<div class="columns is-multiline is-variable">
{% if my_drives %}
{% for drive in my_drives %}
{% if drive.active %}
<div class="column is-full">
<div class="card mb-5">
<div class="card-content">
Expand Down Expand Up @@ -192,11 +195,20 @@ <h2 class="subtitle">Community Drives</h2>
<p class="is-size-4 has-text-weight-semibold">{{ drive.meal_progress }} / {{ drive.meal_target }}</p>
<p>meals contributed</p>
<a href="#" class="button is-primary mt-2">View Drive</a>
<form
id="delete-drive-{{ drive.drive_id }}"
method="post"
action="{% url 'community_drives:delete_drive' drive.drive_id %}"
>
{% csrf_token %}
<button href="#" class="button is-danger mt-2" onclick="confirmDeleteDrive('{{ drive.drive_id }}')">Delete Drive</button>
</form>
</div>
</div>
</div>
</div>
</div>
{% endif %}
{% endfor %}
{% else %}
<p class="box">You have no active community drives.</p>
Expand Down
33 changes: 33 additions & 0 deletions src/community_drives/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,3 +221,36 @@ def test_delete_participation_invalid_method(self):
self.assertEqual(response.status_code, 405)
self.assertEqual(response.json()["success"], False)
self.assertEqual(response.json()["error"], "Invalid request method")

def test_delete_drive_success(self):
url = reverse(
"community_drives:delete_drive", kwargs={"drive_id": self.drive.drive_id}
)

response = self.client.post(url)

self.assertEqual(response.status_code, 302) # Expect redirect after success
self.drive.refresh_from_db()
self.assertFalse(self.drive.active) # Ensure the drive is deactivated
drive_orgs = DriveOrganization.objects.filter(drive=self.drive)
for drive_org in drive_orgs:
self.assertEqual(drive_org.meal_pledge, 0)
self.assertEqual(drive_org.volunteer_pledge, 0)

def test_delete_drive_nonexistent(self):
invalid_drive_id = uuid4()
url = reverse(
"community_drives:delete_drive", kwargs={"drive_id": invalid_drive_id}
)

response = self.client.post(url)

self.assertEqual(
response.status_code, 302
) # Expect redirect even if deletion fails
messages = list(response.wsgi_request._messages)
self.assertEqual(len(messages), 1)
self.assertEqual(
str(messages[0]),
"Failed to delete community drive. Couldn't find the drive.",
)
5 changes: 5 additions & 0 deletions src/community_drives/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,9 @@
views.delete_participation,
name="delete-participation",
),
path(
"delete-drive/<uuid:drive_id>/",
views.delete_drive,
name="delete_drive",
),
]
24 changes: 24 additions & 0 deletions src/community_drives/views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from datetime import timezone
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from django.contrib import messages
Expand Down Expand Up @@ -254,3 +255,26 @@ def delete_participation(request, organization_id, drive_id):
return JsonResponse(
{"success": False, "error": "Invalid request method"}, status=405
)


def delete_drive(request, drive_id):
if request.method == "POST":
try:
drive = CommunityDrive.objects.get(drive_id=drive_id)
drive.active = False
drive.save()
for drive_org in DriveOrganization.objects.filter(drive=drive):
drive_org.meal_pledge = 0
drive_org.volunteer_pledge = 0
drive_org.modified_at = timezone.now()
drive_org.save()

messages.success(
request, f"Community drive '{drive}' successfully deleted."
)
return redirect("/community_drives")
except CommunityDrive.DoesNotExist:
messages.error(
request, "Failed to delete community drive. Couldn't find the drive."
)
return redirect("/community_drives")
8 changes: 7 additions & 1 deletion src/static/js/drive_list.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.short-text').forEach(element => {
const maxChars = 300;
if (element.textContent.length > maxChars) {
element.textContent = element.textContent.slice(0, maxChars-3) + ' ...';
element.textContent = element.textContent.slice(0, maxChars - 3) + ' ...';
}
});
});
Expand All @@ -110,6 +110,12 @@ document.addEventListener('DOMContentLoaded', () => {
// document.getElementById(`file-upload-${donationId}`).click();
// }

function confirmDeleteDrive(driveId) {
if (confirm('Are you sure you want to delete this drive?')) {
document.getElementById('delete-form-' + driveId).submit();
}
}

// Handle file upload and send to the server
function uploadDriveImage(inputElement) {
const driveId = inputElement.dataset.id;
Expand Down
Loading