Skip to content

Commit

Permalink
feat(eighth): add advanced room creation page
Browse files Browse the repository at this point in the history
closes #703
  • Loading branch information
Laur04 committed Dec 26, 2020
1 parent d149a98 commit 4e535e5
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 26 deletions.
1 change: 1 addition & 0 deletions Ion.egg-info/SOURCES.txt
Expand Up @@ -318,6 +318,7 @@ intranet/apps/eighth/migrations/0059_auto_20180726_1739.py
intranet/apps/eighth/migrations/0060_auto_20180726_1815.py
intranet/apps/eighth/migrations/0061_auto_20191215_2222.py
intranet/apps/eighth/migrations/0062_auto_20200116_1926.py
intranet/apps/eighth/migrations/0063_auto_20201224_1745.py
intranet/apps/eighth/migrations/__init__.py
intranet/apps/eighth/views/__init__.py
intranet/apps/eighth/views/activities.py
Expand Down
9 changes: 8 additions & 1 deletion intranet/apps/eighth/forms/admin/rooms.py
@@ -1,10 +1,17 @@
from django import forms

from ...models import EighthRoom
from ...models import EighthActivity, EighthRoom
from .activities import ActivityMultiDisplayField


class RoomForm(forms.ModelForm):
activities = ActivityMultiDisplayField(queryset=None, required=False)

class Meta:
model = EighthRoom
fields = ["name", "capacity", "available_for_eighth"]
widgets = {"capacity": forms.TextInput(attrs={"size": 4})}

def __init__(self, *args, label="Activities", **kwargs): # pylint: disable=unused-argument
super().__init__(*args, **kwargs)
self.fields["activities"].queryset = EighthActivity.objects.exclude(deleted=True).all()
18 changes: 18 additions & 0 deletions intranet/apps/eighth/migrations/0063_auto_20201224_1745.py
@@ -0,0 +1,18 @@
# Generated by Django 2.2.13 on 2020-12-24 22:45

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('eighth', '0062_auto_20200116_1926'),
]

operations = [
migrations.AlterField(
model_name='eighthactivity',
name='rooms',
field=models.ManyToManyField(blank=True, related_name='room_activity_set', to='eighth.EighthRoom'),
),
]
2 changes: 1 addition & 1 deletion intranet/apps/eighth/models.py
Expand Up @@ -258,7 +258,7 @@ class EighthActivity(AbstractBaseEighthModel):
name = models.CharField(max_length=100, validators=[validators.MinLengthValidator(4)]) # This should really be unique
description = models.CharField(max_length=2000, blank=True)
sponsors = models.ManyToManyField(EighthSponsor, blank=True)
rooms = models.ManyToManyField(EighthRoom, blank=True)
rooms = models.ManyToManyField(EighthRoom, blank=True, related_name="room_activity_set")
default_capacity = models.SmallIntegerField(null=True, blank=True)

presign = models.BooleanField(default=False)
Expand Down
29 changes: 29 additions & 0 deletions intranet/apps/eighth/tests.py
Expand Up @@ -619,6 +619,35 @@ def test_activity_stats(self):
self.assertEqual(len(response.context["signed_up"]), 1)
self.assertEqual(response.context["signed_up"][0]["signups"], 2)

def test_room_change(self):
self.make_admin()
act1 = EighthActivity.objects.create(name="Act1")
act2 = EighthActivity.objects.create(name="Act2")
room1 = EighthRoom.objects.create(name="Room 1", capacity=1)
room2 = EighthRoom.objects.create(name="Room 2", capacity=1)
act1.rooms.add(room1)
act2.rooms.add(room2)
self.client.post(
reverse("eighth_admin_add_room"),
{
"name": "Room 3",
"capacity": 1,
"activities": [act2.id],
},
)
self.assertEqual(len(act1.rooms.all()), 1)
self.assertEqual(len(act2.rooms.all()), 2)
self.client.post(
reverse("eighth_admin_edit_room", args=[room2.id]),
{
"name": "Room 2",
"capacity": 1,
"activities": [act1.id],
},
)
self.assertEqual(len(act1.rooms.all()), 2)
self.assertEqual(len(act2.rooms.all()), 1)


class EighthExceptionTest(IonTestCase):
def test_signup_exception(self):
Expand Down
31 changes: 23 additions & 8 deletions intranet/apps/eighth/views/admin/rooms.py
@@ -1,5 +1,4 @@
import csv
import json
import logging
from collections import defaultdict

Expand All @@ -25,15 +24,18 @@ def add_room_view(request):
if request.method == "POST":
form = RoomForm(request.POST)
if form.is_valid():
form.save()
room = form.save()
for act in form.cleaned_data["activities"]:
act.rooms.add(room)
messages.success(request, "Successfully added room.")
return redirect("eighth_admin_dashboard")
else:
messages.error(request, "Error adding room.")
request.session["add_room_form"] = json.dumps(form.errors)
return redirect("eighth_admin_dashboard")
else:
return http.HttpResponseNotAllowed(["POST"], "HTTP 405: METHOD NOT ALLOWED")
form = RoomForm()

context = {"form": form, "admin_page_title": "Add Room"}
return render(request, "eighth/admin/edit_form.html", context)


@eighth_admin_required
Expand All @@ -43,16 +45,29 @@ def edit_room_view(request, room_id):
except EighthRoom.DoesNotExist as e:
raise http.Http404 from e

current_activities = list(room.room_activity_set.all())

if request.method == "POST":
form = RoomForm(request.POST, instance=room)
if form.is_valid():
form.save()
room = form.save()

new_activities = list(form.cleaned_data["activities"])
for act in current_activities:
if act in new_activities:
new_activities.remove(act)
else:
act.rooms.remove(room)
for act in new_activities:
act.rooms.add(room)

messages.success(request, "Successfully edited room.")
return redirect("eighth_admin_dashboard")
else:
messages.error(request, "Error adding room.")
messages.error(request, "Error editing room.")
else:
form = RoomForm(instance=room)
initial_dict = {"activities": current_activities}
form = RoomForm(instance=room, initial=initial_dict)

context = {"form": form, "delete_url": reverse("eighth_admin_delete_room", args=[room_id]), "admin_page_title": "Edit Room"}
return render(request, "eighth/admin/edit_form.html", context)
Expand Down
17 changes: 1 addition & 16 deletions intranet/templates/eighth/admin/dashboard.html
Expand Up @@ -112,6 +112,7 @@ <h3>Rooms</h3>

<div class="right-buttons">
<a class="dynamic-link button" data-select="room-select" data-href-pattern="{% url 'eighth_admin_edit_room' url_id_placeholder %}" class="button">Edit Room</a>
<a class="button" href="{% url 'eighth_admin_add_room' %}">Add Room</a>
</div>

<ul class="fa-ul">
Expand All @@ -121,22 +122,6 @@ <h3>Rooms</h3>
<li><a href="{% url 'eighth_admin_room_utilization' %}"><i class="fa-li fas fa-arrows-alt-h"></i><b>Room utilization</b> across blocks</a></li>
<li><a href="{% url 'eighth_admin_list_sponsor' %}"><i class="fa-li fas fa-list"></i><b>List</b> sponsor schedule</a></li>
</ul>

<form id="add-room-form" action="{% url 'eighth_admin_add_room' %}" method="post" autocomplete="off">
<h4>Add Room</h4>
{% csrf_token %}
<table>
<tr>
<th><label>Name:</label></th>
<td>{{ add_room_form.name }}</td>
<th><label>Capacity:</label></th>
<td>{{ add_room_form.capacity }}</td>
<td class="right-buttons">
<input type="submit" value="Add">
</td>
</tr>
</table>
</form>
</td>

</tr>
Expand Down

0 comments on commit 4e535e5

Please sign in to comment.