Skip to content

Commit 7fc06bd

Browse files
committed
Enable editing/creating/deleting events
Wholly through modals, yay!
1 parent e28912b commit 7fc06bd

File tree

4 files changed

+113
-4
lines changed

4 files changed

+113
-4
lines changed

goathacks/admin/events.py

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import flask
2-
from flask import Response, render_template, redirect, request, url_for, flash
2+
from flask import Response, render_template, redirect, request, url_for, flash, current_app
33
from flask_login import current_user, login_required
44
from goathacks.admin import bp, forms
55
from goathacks import db
66
from goathacks.models import Event
77

8-
import io, qrcode
8+
import io, qrcode, datetime
99
import qrcode.image.pure
1010

1111
@bp.route("/events")
@@ -20,6 +20,80 @@ def list_events():
2020

2121
return render_template("events/list.html", events=events, form=form)
2222

23+
@bp.route("/event/<int:id>/delete")
24+
@login_required
25+
def delete_event(id):
26+
if not current_user.is_admin:
27+
return {"status": "error", "message": "Unauthorized"}
28+
29+
event = Event.query.filter_by(id=id).first()
30+
31+
if event is None:
32+
return {"status": "error", "message": "Invalid event ID"}
33+
34+
db.session.delete(event)
35+
db.session.commit()
36+
37+
return {"status": "success"}
38+
39+
@bp.route("/event/<int:id>")
40+
@login_required
41+
def event(id):
42+
if not current_user.is_admin:
43+
return {"status": "error", "message": "Unauthorized"}
44+
45+
event = Event.query.filter_by(id=id).first()
46+
47+
if event is None:
48+
return {"status": "error", "message": "Invalid event ID"}
49+
50+
return event.create_json()
51+
52+
@bp.route("/event/<int:id>", methods=["POST"])
53+
@login_required
54+
def update_create_event(id):
55+
if not current_user.is_admin:
56+
flash("Unauthorized")
57+
return redirect(url_for("dashboard.home"))
58+
59+
name = request.form.get('name')
60+
description = request.form.get('description')
61+
location = request.form.get('location')
62+
start_day = request.form.get('start_day')
63+
start_time = request.form.get('start_time')
64+
end_day = request.form.get('end_day')
65+
end_time = request.form.get('end_time')
66+
start = datetime.datetime.combine(datetime.date.fromisoformat(start_day),
67+
datetime.time.fromisoformat(start_time))
68+
end = datetime.datetime.combine(datetime.date.fromisoformat(end_day),
69+
datetime.time.fromisoformat(end_time))
70+
71+
if id == 0:
72+
# new event
73+
e = Event(
74+
name=name,
75+
description=description,
76+
location=location,
77+
start_time=start,
78+
end_time=end)
79+
db.session.add(e)
80+
db.session.commit()
81+
current_app.logger.info(f"{current_user} is creating a new event: {e.name}")
82+
else:
83+
e = Event.query.filter_by(id=id).first()
84+
if e is None:
85+
return {"status": "error", "message": "Invalid event ID"}
86+
e.name = name
87+
e.description = description
88+
e.location = location
89+
e.start_time = start
90+
e.end_time = end
91+
db.session.commit()
92+
current_app.logger.info(f"{current_user} is updating an existing event: {e.name}")
93+
94+
95+
return redirect(url_for("admin.list_events"))
96+
2397
@bp.route("/events/events.json")
2498
@login_required
2599
def events_json():

goathacks/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,16 @@ def create_json_output(lis):
8484
})
8585

8686
return events
87+
88+
def create_json(self):
89+
return {
90+
"id": self.id,
91+
"name": self.name,
92+
"description": self.description,
93+
"location": self.location,
94+
"start_time": self.start_time.isoformat(),
95+
"end_time": self.end_time.isoformat(),
96+
}
8797

8898
def get_checkins(self):
8999
checkins = EventCheckins.query.filter_by(event_id=self.id).all()

goathacks/static/js/jquery-3.6.3.min.js

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

goathacks/templates/events/list.html

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ <h2>Events</h2>
3434
<td>{{ event.get_checkins()|length }}</td>
3535
<td><a href='{{ url_for("admin.qrcode_event", id=event.id)
3636
}}'>QR Code</a></td>
37-
<td><a href="#editModal" data-bs-toggle="modal" data-id="{{ e.id}}" >Edit</a></td>
37+
<td><a href="#editModal" data-bs-toggle="modal" data-id="{{ event.id}}" >Edit</a></td>
3838
</tr>
3939
{% endfor %}
4040
</tbody>
@@ -95,7 +95,7 @@ <h1 class="modal-title fs-5" id="editModalLabel">Event</h1>
9595
</div>
9696
</div>
9797
<div class="modal-footer">
98-
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
98+
<button type="button" class="btn btn-danger" data-id="0" id="delete">Delete</button>
9999
<button type="submit" class="btn btn-primary" id="edit-save">Save changes</button>
100100
</div>
101101
</form>
@@ -108,6 +108,22 @@ <h1 class="modal-title fs-5" id="editModalLabel">Event</h1>
108108
<script charset="utf-8">
109109
const editButton = document.getElementById("edit-save")
110110

111+
$('#delete').on("click", (event) => {
112+
if (window.confirm("Delete this event?")) {
113+
console.log("Got OK")
114+
deleteButton = document.getElementById("delete")
115+
id = deleteButton.dataset.id
116+
$.get(`/admin/event/${id}/delete`, (data) => {
117+
if (data.status == "error") {
118+
window.alert(`Error: ${data.message}`)
119+
} else {
120+
window.alert("Success")
121+
}
122+
location.reload()
123+
})
124+
}
125+
})
126+
111127
$('#editModal').on('show.bs.modal', function(event) {
112128
var modal = $(this)
113129
modal.find('#name').val('')
@@ -125,6 +141,9 @@ <h1 class="modal-title fs-5" id="editModalLabel">Event</h1>
125141
saveButton = document.getElementById("edit-save")
126142
saveButton.dataset.id = id
127143

144+
deleteButton = document.getElementById("delete")
145+
deleteButton.dataset.id = id
146+
128147
editForm = document.getElementById("edit-form")
129148
editForm.action = "/admin/event/" + id
130149

@@ -166,5 +185,9 @@ <h1 class="modal-title fs-5" id="editModalLabel">Event</h1>
166185
});
167186
}
168187
})
188+
189+
function padTwoDigits(num) {
190+
return num.toString().padStart(2, '0')
191+
}
169192
</script>
170193
{% endblock %}

0 commit comments

Comments
 (0)