summaryrefslogtreecommitdiff
path: root/slot
diff options
context:
space:
mode:
Diffstat (limited to 'slot')
-rw-r--r--slot/__init__.py0
-rw-r--r--slot/admin.py3
-rw-r--r--slot/models.py3
-rw-r--r--slot/tests.py3
-rw-r--r--slot/urls.py11
-rw-r--r--slot/views.py76
6 files changed, 96 insertions, 0 deletions
diff --git a/slot/__init__.py b/slot/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/slot/__init__.py
diff --git a/slot/admin.py b/slot/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/slot/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/slot/models.py b/slot/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/slot/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/slot/tests.py b/slot/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/slot/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/slot/urls.py b/slot/urls.py
new file mode 100644
index 0000000..1ca18ba
--- /dev/null
+++ b/slot/urls.py
@@ -0,0 +1,11 @@
+from django.conf.urls import url
+
+from . import views
+
+urlpatterns = [
+ url(r'^$', views.index, name='slot_index'),
+ url(r'^new/?$', views.new, name='slot_new'),
+ url(r'^show/(.*)/?$', views.show, name='slot_show'),
+ url(r'^create/?$', views.create, name='slot_create'),
+ url(r'^delete/([0-9]+)/?$', views.delete, name='slot_delete'),
+] \ No newline at end of file
diff --git a/slot/views.py b/slot/views.py
new file mode 100644
index 0000000..b137f93
--- /dev/null
+++ b/slot/views.py
@@ -0,0 +1,76 @@
+from django.contrib.auth.decorators import login_required
+from django.shortcuts import render, redirect
+from django.contrib import messages
+from sbhs_server.tables.models import Account, Slot, Booking
+import datetime
+
+LIMIT = 2
+
+@login_required(redirect_field_name=None)
+def new(req):
+ cur_slots = Slot.current_slots(req.user.board.mid)
+ all_slots = Slot.get_free_slots(req.user.board.mid)
+ date = (datetime.datetime.now()).strftime("%Y-%m-%d")
+ return render(req, "slot/new.html", {"all_slots": all_slots, "cur_slots": cur_slots, "nowdate": date})
+
+@login_required(redirect_field_name=None)
+def show(req, date_string):
+ date = datetime.datetime.strptime(date_string, "%Y-%m-%d")
+ all_slots = Slot.get_free_slots_on(date, req.user.board.mid)
+ return render(req, "slot/show.html", {"all_slots": all_slots})
+
+@login_required(redirect_field_name=None)
+def create(req):
+ slot = Slot.objects.get(id=req.POST.get("slot"))
+ date_string = req.POST.get("date")
+ date = datetime.date.today() if date_string == "CURRENT" else datetime.datetime.strptime(date_string, "%Y-%m-%d")
+ all_slots = Slot.get_free_slots(req.user.board.mid) if date_string == "CURRENT" else Slot.get_free_slots_on(date, req.user.board.mid)
+
+ if slot in all_slots:
+ if date_string == "CURRENT":
+ Booking.objects.create(slot=slot, account=req.user, booking_date=date)
+ messages.add_message(req, messages.SUCCESS, "Slot " + str(slot) + " booked successfully.")
+ else:
+ bookings = req.user.booking_set.select_related("slot").filter(booking_date__year=date.year,
+ booking_date__month=date.month,
+ booking_date__day=date.day)
+ if len(bookings) >= LIMIT:
+ messages.add_message(req, messages.ERROR, "Can't book more than " + str(LIMIT) + " slots in a day in advance.")
+ elif len(bookings) < LIMIT:
+ consecutive_check = True
+ for b in bookings:
+ if abs(b.slot.start_hour - slot.start_hour) <= 1:
+ consecutive_check = False
+ break
+ if not consecutive_check:
+ messages.add_message(req, messages.ERROR, "Can't book 2 consecutive slots in a day in advance.")
+ else:
+ Booking.objects.create(slot=slot, account=req.user, booking_date=date)
+ messages.add_message(req, messages.SUCCESS, "Slot " + str(slot) + " booked successfully.")
+ else:
+ messages.add_message(req, messages.ERROR, "Slot " + str(slot) + " already booked.")
+
+ return redirect(index)
+
+@login_required(redirect_field_name=None)
+def index(req):
+ bookings = req.user.booking_set.select_related("slot").order_by("booking_date")
+
+ return render(req, "slot/index.html", {"bookings": reversed(bookings),
+ "now_time": datetime.datetime.now()})
+
+
+@login_required(redirect_field_name=None)
+def delete(req, booking_id):
+ try:
+ booking = Booking.objects.select_related("slot").get(id=booking_id)
+ assert booking.account_id == req.user.id
+ if booking.start_time() > datetime.datetime.now():
+ booking.delete()
+ messages.add_message(req, messages.SUCCESS, "Slot booking deleted successfully.")
+ else:
+ messages.add_message(req, messages.ERROR, "Slot time is over. Cannot delete this booking now.")
+ except:
+ messages.add_message(req, messages.ERROR, "Booking does not exist.")
+
+ return redirect(index)