Skip to content
Open
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
56 changes: 56 additions & 0 deletions intranet/apps/enrichment/forms.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import datetime # for mass form

from django import forms

from .models import EnrichmentActivity
Expand All @@ -13,3 +15,57 @@ class Meta:
model = EnrichmentActivity

fields = ["title", "description", "time", "location", "capacity", "presign", "groups_allowed", "groups_blacklisted"]


WEEKDAY_FIELDS = [
("monday", "Monday"),
("tuesday", "Tuesday"),
("wednesday", "Wednesday"),
("thursday", "Thursday"),
("friday", "Friday"),
]


class EnrichmentActivityBulkForm(EnrichmentActivityForm):
# A way to create multiple enrichment activities at once.

week_of = forms.DateField(
label="Target Week",
widget=forms.DateInput(attrs={"type": "date"}),
)
monday = forms.BooleanField(label="Monday", required=False)
tuesday = forms.BooleanField(label="Tuesday", required=False)
wednesday = forms.BooleanField(label="Wednesday", required=False)
thursday = forms.BooleanField(label="Thursday", required=False)
friday = forms.BooleanField(label="Friday", required=False)
activity_time = forms.TimeField(label="Time of day", widget=forms.TimeInput(attrs={"type": "time"}), initial=datetime.time(12, 0))

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# remove time so it doesn't appear in the form
self.fields.pop("time")

def clean(self):
cleaned = super().clean()
# Require at least one day to be checked
days_checked = any(cleaned.get(day) for day, _ in WEEKDAY_FIELDS)
if not days_checked:
raise forms.ValidationError("Please select at least one day of the week.")
return cleaned

def get_selected_dates(self): # returns in the form of a list.
week_of = self.cleaned_data["week_of"]
activity_time = self.cleaned_data["activity_time"]
monday = week_of - datetime.timedelta(days=week_of.weekday())
offsets = {
"monday": 0,
"tuesday": 1,
"wednesday": 2,
"thursday": 3,
"friday": 4,
}
return [
datetime.datetime.combine(monday + datetime.timedelta(days=offset), activity_time)
for day_name, offset in offsets.items()
if self.cleaned_data.get(day_name)
]
1 change: 1 addition & 0 deletions intranet/apps/enrichment/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
urlpatterns = [
path("", views.enrichment_view, name="enrichment"),
path("/add", views.add_enrichment_view, name="add_enrichment"),
path("/bulk_create", views.enrichment_bulk_create_view, name="enrichment_bulk_create"),
path("/modify/<int:enrichment_id>", views.modify_enrichment_view, name="modify_enrichment"),
path("/delete/<int:enrichment_id>", views.delete_enrichment_view, name="delete_enrichment"),
path("/join/<int:enrichment_id>", views.enrichment_signup_view, name="enrichment_signup"),
Expand Down
49 changes: 46 additions & 3 deletions intranet/apps/enrichment/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

from ...utils.html import safe_html
from ..auth.decorators import deny_restricted
from .forms import EnrichmentActivityForm
from .forms import EnrichmentActivityBulkForm, EnrichmentActivityForm
from .models import EnrichmentActivity

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -309,13 +309,56 @@ def add_enrichment_view(request):
return render(request, "enrichment/add_modify.html", context)


@login_required
@deny_restricted
def enrichment_bulk_create_view(request):
"""View for creating multiple enrichments.

Get requests will render bulk-create form with Mon-Fri checkboxes.
Post requests create one EnrichmentActivity for each checked day and then redirect.
"""
is_enrichment_admin = request.user.has_admin_permission("enrichment")
if not is_enrichment_admin:
raise http.Http404

if request.method == "POST":
form = EnrichmentActivityBulkForm(data=request.POST)
if form.is_valid():
created = []
for dt in form.get_selected_dates():
activity = form.save(commit=False)
activity.pk = None
activity.user = request.user
activity.time = dt
activity.description = safe_html(activity.description) # sanitize the html to prevent injection
activity.save()
form.save_m2m()
created.append(dt.strftime("%A, %b %-d"))

messages.success(
request,
f"Created {len(created)} enrichment activities: " + ", ".join(created),
)
return redirect("enrichment")
else:
form = EnrichmentActivityBulkForm()

return render(
request,
"enrichment/bulk_create.html",
{"form": form},
)


@login_required
@deny_restricted
def modify_enrichment_view(request, enrichment_id):
"""Modify enrichment activity page.
"""
Modify enrichment activity page.

Args:
enrichment_id (int): enrichment activity id
request (HttpRequest): The HTTP request object.
enrichment_id (int): The unique identifier of the enrichment activity.
"""

enrichment = get_object_or_404(EnrichmentActivity, id=enrichment_id)
Expand Down
74 changes: 74 additions & 0 deletions intranet/templates/enrichment/bulk_create.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
{% extends "page_with_nav.html" %}
{% load static %}
{% load dates %}
{% load pipeline %}
{% block title %}
{{ block.super }} - Bulk Create Enrichment Activities
{% endblock %}
{% block js %}
{{ block.super }}
<script src="{% static 'vendor/selectize.js-0.12.4/dist/js/standalone/selectize.min.js' %}"></script>
<script>
$(function() {
$("#id_groups_allowed").selectize({
create: false
})
$("#id_groups_blacklisted").selectize({
create: false
});
});
</script>
{% endblock %}
{% block css %}
{{ block.super }}
<link rel="stylesheet" href="{% static 'vendor/selectize.js-0.12.4/dist/css/selectize.default.css' %}">
{% stylesheet 'announcements.form' %}
{% stylesheet 'enrichment' %}
{% endblock %}
{% block head %}
{% if dark_mode_enabled %}
{% stylesheet 'dark/base' %}
{% stylesheet 'dark/nav' %}
{% stylesheet 'dark/events' %}
{% endif %}
{% endblock %}
{% block main %}
<div class="events enrichment announcements primary-content">
<h2>Bulk Create Enrichment Activities</h2>
<p>Choose a week for your activity, and check off the days you want. One activity will be created for each checked day.</p>
<form method="post" id="event_form">
<table>
{% csrf_token %}
<tr><th><label for="id_title">Title:</label></th><td>{{ form.title }}{{ form.title.errors }}</td></tr>
<tr><th><label for="id_description">Description:</label></th><td>{{ form.description }}{{ form.description.errors }}</td></tr>
<tr><th><label for="id_capacity">Capacity:</label></th><td>{{ form.capacity }}{{ form.capacity.errors }}</td></tr>
<tr><th><label for="id_location">Location:</label></th><td>{{ form.location }}{{ form.location.errors }}</td></tr>
<tr><th><label for="id_groups_allowed">Groups allowed:</label></th><td>{{ form.groups_allowed }}{{ form.groups_allowed.errors }}</td></tr>
<tr><th><label for="id_groups_blacklisted">Groups blacklisted:</label></th><td>{{ form.groups_blacklisted }}{{ form.groups_blacklisted.errors }}</td></tr>
<tr><th><label for="id_presign">Presign:</label></th><td>{{ form.presign }}{{ form.presign.errors }}</td></tr>
<tr><th><label for="id_week_of">Week of:</label></th><td>{{ form.week_of }}{{ form.week_of.errors }}</td></tr>
<tr><th><label for="id_activity_time">Time of day:</label></th><td>{{ form.activity_time }}{{ form.activity_time.errors }}</td></tr>
<tr>
<td><b>Days of the week:</b></td>
<td>
<div class="weekday-checkboxes">
{# creates a day checkbox within the weekday checkboxes for each day #}
<label class="day-checkbox">{{ form.monday }} {{ form.monday.label }}</label>
<label class="day-checkbox">{{ form.tuesday }} {{ form.tuesday.label }}</label>
<label class="day-checkbox">{{ form.wednesday }} {{ form.wednesday.label }}</label>
<label class="day-checkbox">{{ form.thursday }} {{ form.thursday.label }}</label>
<label class="day-checkbox">{{ form.friday }} {{ form.friday.label }}</label>
</div>
{% if form.non_field_errors %}
<ul class="errorlist">{{ form.non_field_errors }}</ul>
{% endif %}
</td>
</tr>
<tr><td>&nbsp;</td><td>
<input type="submit" style="width: 270px" value="Bulk Create Enrichment">
<a href="{% url 'enrichment' %}" class="button">Cancel</a>
</td></tr>
</table>
</form>
</div>
{% endblock %}
1 change: 1 addition & 0 deletions intranet/templates/enrichment/home.html
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ <h2>Enrichment</h2>
<i class="fas fa-plus"></i>
Add
</a>
<a href="{% url 'enrichment_bulk_create' %}" class="button"> <i class="fas fa-plus"></i> Bulk Create (by week) </a>
{% endif %}

</div>
Expand Down
Loading