def availability(request, tutorPK, pk): tutor = Tutor.objects.get(pk=tutorPK) avail = Avail.objects.get(pk=int(pk)) startDateTime = datetime.datetime(2018, 9, 9, avail.startHour, avail.startMinute, 0) endDateTime = datetime.datetime(2018, 9, 9, avail.endHour, avail.endMinute, 0) if avail.endHour == 0 and avail.endMinute == 0: endDateTime += datetime.timedelta(days=1) weekdays = [ ("Sunday", 0), ("Monday", 1), ("Tuesday", 2), ("Wednesday", 3), ("Thursday", 4), ("Friday", 5), ("Saturday", 6), ] weekdayDefault = avail.iso_weekday startHours = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 0)] startHourDefault = startDateTime.hour % 12 startMinutes = [("00", 0), ("15", 15), ("30", 30), ("45", 45)] startMinuteDefault = startDateTime.minute durationHours = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] durationHourDefault = (endDateTime - startDateTime).seconds // 3600 durationMinutes = [("00", 0), ("15", 15), ("30", 30), ("45", 45)] durationMinuteDefault = (endDateTime.minute - startDateTime.minute + 60) % 60 ampms = [("AM", 0), ("PM", 1)] if startDateTime - datetime.datetime(2018, 9, 9, 0, 0, 0) >= datetime.timedelta(hours=12): ampmDefault = 1 else: ampmDefault = 0 message = "" messageType = "default" weekdayMin = 0 weekdayMax = 7 startHourMin = 0 startHourMax = 12 startMinuteMin = 0 startMinuteMax = 4 ampmMin = 0 ampmMax = 2 durationHourMin = 0 durationHourMax = 25 durationMinuteMin = 0 durationMinuteMax = 4 if request.method == "POST": form = AvailForm(request.POST) if form.is_valid(): # Get hidden information from form # availPK = int(form.cleaned_data['availPK']) # print("test: " + str(availID)) delete = int(form.cleaned_data["delete"]) print("test delete: " + str(delete)) if delete == 1: print("would delete") # avail.delete() return HttpResponseRedirect("/availability/") weekdayMin = int(form.cleaned_data["weekdayMin"]) print("test: " + str(weekdayMin)) weekdayMax = int(form.cleaned_data["weekdayMax"]) print("test: " + str(weekdayMax)) startHourMin = int(form.cleaned_data["startHourMin"]) print("test: " + str(startHourMin)) startHourMax = int(form.cleaned_data["startHourMax"]) print("test: " + str(startHourMax)) startMinuteMin = int(form.cleaned_data["startMinuteMin"]) print("test: " + str(startMinuteMin)) startMinuteMax = int(form.cleaned_data["startMinuteMax"]) print("test: " + str(startMinuteMax)) ampmMin = int(form.cleaned_data["ampmMin"]) print("test: " + str(ampmMin)) ampmMax = int(form.cleaned_data["ampmMax"]) print("test: " + str(ampmMax)) durationHourMin = int(form.cleaned_data["durationHourMin"]) print("test: " + str(durationHourMin)) durationHourMax = int(form.cleaned_data["durationHourMax"]) print("test: " + str(durationHourMax)) durationMinuteMin = int(form.cleaned_data["durationMinuteMin"]) print("test: " + str(durationMinuteMin)) durationMinuteMax = int(form.cleaned_data["durationMinuteMax"]) print("test: " + str(durationMinuteMax)) # Get information from form weekday = int(form.cleaned_data["weekday"]) weekdayDefault = weekday startHour = int(form.cleaned_data["startHour"]) startHourDefault = startHour startMinute = int(form.cleaned_data["startMinute"]) startMinuteDefault = startMinute durationHour = int(form.cleaned_data["durationHour"]) durationHourDefault = durationHour durationMinute = int(form.cleaned_data["durationMinute"]) durationMinuteDefault = durationMinute ampm = int(form.cleaned_data["ampm"]) ampmDefault = ampm # Collect the start and end of the Avail newStartDateTime = datetime.datetime(2018, 9, 9, startHour, startMinute) if ampm == 1: newStartDateTime += datetime.timedelta(hours=12) newEndDateTime = ( newStartDateTime + datetime.timedelta(hours=durationHour) + datetime.timedelta(minutes=durationMinute) ) # Avail validation before checking for conflicts with already existing Avails message = availValidation(durationMinute, durationHour, newStartDateTime, newEndDateTime) if len(message) == 0: avail.iso_weekday = weekday avail.startHour = newStartDateTime.hour avail.startMinute = newStartDateTime.minute avail.endHour = newEndDateTime.hour avail.endMinute = newEndDateTime.minute # newAvail = Avail(iso_weekday=weekday, startHour=newStartDateTime.hour, startMinute=newStartDateTime.minute, endHour=newEndDateTime.hour, endMinute=newEndDateTime.minute) # Filter Avails by day avails = Avail.objects.filter(tutor=tutor, iso_weekday=weekday) # Compare Avail being created to the other Avail message = checkAvailConflict(avail, avails, True) if len(message) == 0: # TODO: message for if the avail really did update or not avail.save() messageType = "info" message = "Availability updated successfully! " message += ( str(weekdays[weekday][0]) + " " + newStartDateTime.time().strftime("%I:%M %p") + " - " + newEndDateTime.time().strftime("%I:%M %p") ) if newEndDateTime.time().hour == 0 and newEndDateTime.time().minute == 0: message += " (" + str(weekdays[(weekday + 1) % 7][0]) + ")" else: messageType = "warning" print(message) else: # jquery should prevent this from happening, but for some reason if it happens messageType = "danger" message = "Form wasn't complete due to an unforseen issue. Please report this bug to the Admin. Thank you." print("Form wasn't complete") # return render(request, 'main/avails2.html', {'message': message, 'messageType': messageType}) else: pass # form = AvailForm() # Limit the select options for the availability form weekdays = weekdays[weekdayMin:weekdayMax] startHours = startHours[startHourMin:startHourMax] startMinutes = startMinutes[startMinuteMin:startHourMax] durationHours = durationHours[durationHourMin:durationHourMax] durationMinutes = durationMinutes[durationMinuteMin:durationMinuteMax] ampms = ampms[ampmMin:ampmMax] startDateTime = datetime.datetime(2018, 9, 9, avail.startHour, avail.startMinute) endDateTime = datetime.datetime(2018, 9, 9, avail.endHour, avail.endMinute) if avail.endHour == 0 and avail.endMinute == 0: endDateTime += datetime.timedelta(days=1) startTime = startDateTime.time().strftime("%I:%M %p") endTime = endDateTime.time().strftime("%I:%M %p") seconds = (endDateTime - startDateTime).seconds hours = seconds // 3600 seconds -= hours * 3600 minutes = seconds // 60 duration = "" if hours == 1: duration += "1 hour" elif hours > 1: duration += str(hours) + " hours" if hours > 0 and minutes > 0: duration += " and " if minutes == 1: duration += "1 minute" elif minutes > 1: duration += str(minutes) + " minutes" startDateTime += datetime.timedelta(days=avail.iso_weekday) weekdayString = startDateTime.strftime("%A") return render( request, "main/avail.html", { "tutor": tutor, "pk": pk, "message": message, "messageType": messageType, "weekdays": weekdays, "weekdayDefault": weekdayDefault, "startHours": startHours, "startHourDefault": startHourDefault, "startMinutes": startMinutes, "startMinuteDefault": startMinuteDefault, "ampms": ampms, "ampmDefault": ampmDefault, "durationHours": durationHours, "durationHourDefault": durationHourDefault, "durationMinutes": durationMinutes, "durationMinuteDefault": durationMinuteDefault, "weekdayMin": weekdayMin, "weekdayMax": weekdayMax, "startHourMin": startHourMin, "startHourMax": startHourMax, "startMinuteMin": startMinuteMin, "startMinuteMax": startMinuteMax, "ampmMin": ampmMin, "ampmMax": ampmMax, "durationHourMin": durationHourMin, "durationHourMax": durationHourMax, "durationMinuteMin": durationMinuteMin, "durationMinuteMax": durationMinuteMax, "avail": avail, "startTime": startTime, "endTime": endTime, "weekdayString": weekdayString, "duration": duration, }, )
def availabilities(request, tutorPK): tutor = Tutor.objects.get(pk=tutorPK) if request.user.email == tutor.email or request.user.is_staff: pass else: return HttpResponseForbidden() weekdays = [ ("Sunday", 0), ("Monday", 1), ("Tuesday", 2), ("Wednesday", 3), ("Thursday", 4), ("Friday", 5), ("Saturday", 6), ] weekdayDefault = None startHours = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (10, 10), (11, 11), (12, 0)] startHourDefault = None startMinutes = [("00", 0), ("15", 15), ("30", 30), ("45", 45)] startMinuteDefault = None durationHours = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24] durationHourDefault = None durationMinutes = [("00", 0), ("15", 15), ("30", 30), ("45", 45)] durationMinuteDefault = None ampms = [("AM", 0), ("PM", 1)] ampmDefault = None message = "" messageType = "default" weekdayMin = 0 weekdayMax = 7 startHourMin = 0 startHourMax = 12 startMinuteMin = 0 startMinuteMax = 4 ampmMin = 0 ampmMax = 2 durationHourMin = 0 durationHourMax = 25 durationMinuteMin = 0 durationMinuteMax = 4 if request.method == "POST": form = AvailForm(request.POST) if form.is_valid(): delete = int(form.cleaned_data["delete"]) print("test delete: " + str(delete)) if delete == 1: print("would delete") # avail.delete() return HttpResponseRedirect("/availability/") # Get hidden information from form weekdayMin = int(form.cleaned_data["weekdayMin"]) print("test: " + str(weekdayMin)) weekdayMax = int(form.cleaned_data["weekdayMax"]) print("test: " + str(weekdayMax)) startHourMin = int(form.cleaned_data["startHourMin"]) print("test: " + str(startHourMin)) startHourMax = int(form.cleaned_data["startHourMax"]) print("test: " + str(startHourMax)) startMinuteMin = int(form.cleaned_data["startMinuteMin"]) print("test: " + str(startMinuteMin)) startMinuteMax = int(form.cleaned_data["startMinuteMax"]) print("test: " + str(startMinuteMax)) ampmMin = int(form.cleaned_data["ampmMin"]) print("test: " + str(ampmMin)) ampmMax = int(form.cleaned_data["ampmMax"]) print("test: " + str(ampmMax)) durationHourMin = int(form.cleaned_data["durationHourMin"]) print("test: " + str(durationHourMin)) durationHourMax = int(form.cleaned_data["durationHourMax"]) print("test: " + str(durationHourMax)) durationMinuteMin = int(form.cleaned_data["durationMinuteMin"]) print("test: " + str(durationMinuteMin)) durationMinuteMax = int(form.cleaned_data["durationMinuteMax"]) print("test: " + str(durationMinuteMax)) # Get information from form weekday = int(form.cleaned_data["weekday"]) weekdayDefault = weekday startHour = int(form.cleaned_data["startHour"]) startHourDefault = startHour startMinute = int(form.cleaned_data["startMinute"]) startMinuteDefault = startMinute durationHour = int(form.cleaned_data["durationHour"]) durationHourDefault = durationHour durationMinute = int(form.cleaned_data["durationMinute"]) durationMinuteDefault = durationMinute ampm = int(form.cleaned_data["ampm"]) ampmDefault = ampm # Collect the start and end of the Avail newStartDateTime = datetime.datetime(2018, 9, 9, startHour, startMinute) if ampm == 1: newStartDateTime += datetime.timedelta(hours=12) newEndDateTime = ( newStartDateTime + datetime.timedelta(hours=durationHour) + datetime.timedelta(minutes=durationMinute) ) # Avail validation before checking for conflicts with already existing Avails message = availValidation(durationMinute, durationHour, newStartDateTime, newEndDateTime) if len(message) == 0: # Filter Avails by day avails = Avail.objects.filter(tutor=tutor, iso_weekday=weekday) # Create new Avail if availPK == 0: print("derp" + str(availPK)) newAvail = Avail( iso_weekday=weekday, startHour=newStartDateTime.hour, startMinute=newStartDateTime.minute, endHour=newEndDateTime.hour, endMinute=newEndDateTime.minute, ) # Compare Avail being created to the other Avail message = checkAvailConflict(newAvail, avails, False) if len(message) == 0: # TODO: check if newAvail actually saved successfully and have a message if it doesn't, etc newAvail.save() messageType = "info" message = "Availability saved successfully! " message += ( str(weekdays[weekday][0]) + " " + newStartDateTime.time().strftime("%I:%M %p") + " - " + newEndDateTime.time().strftime("%I:%M %p") ) if newEndDateTime.time().hour == 0 and newEndDateTime.time().minute == 0: message += " (" + str(weekdays[(weekday + 1) % 7][0]) + ")" else: messageType = "warning" print(message) # Update avail else: print("moo") avail = Avail.objects.get(pk=int(availPK)) avail.iso_weekday = weekday avail.startHour = newStartDateTime.hour avail.startMinute = newStartDateTime.minute avail.endHour = newEndDateTime.hour avail.endMinute = newEndDateTime.minute # newAvail = Avail(iso_weekday=weekday, startHour=newStartDateTime.hour, startMinute=newStartDateTime.minute, endHour=newEndDateTime.hour, endMinute=newEndDateTime.minute) # Compare Avail being created to the other Avail message = checkAvailConflict(avail, avails, True) if len(message) == 0: # TODO: message for if the avail really did update or not avail.save() messageType = "info" message = "Availability updated successfully! " message += ( str(weekdays[weekday][0]) + " " + newStartDateTime.time().strftime("%I:%M %p") + " - " + newEndDateTime.time().strftime("%I:%M %p") ) if newEndDateTime.time().hour == 0 and newEndDateTime.time().minute == 0: message += " (" + str(weekdays[(weekday + 1) % 7][0]) + ")" else: # jquery should prevent this from happening, but for some reason if it happens messageType = "danger" message = "Form wasn't complete due to an unforseen issue. Please report this bug to the Admin. Thank you." print("Form wasn't complete") else: pass # form = AvailForm() # Limit the select options for the availability form # weekdays = weekdays[weekdayMin:weekdayMax] # startHours = startHours[startHourMin:startHourMax] # startMinutes = startMinutes[startMinuteMin:startHourMax] # durationHours = durationHours[durationHourMin:durationHourMax] # durationMinutes = durationMinutes[durationMinuteMin:durationMinuteMax] # ampms = ampms[ampmMin:ampmMax] return render( request, "main/avails2.html", { "tutor": tutor, "message": message, "messageType": messageType, "weekdays": weekdays, "weekdayDefault": weekdayDefault, "startHours": startHours, "startHourDefault": startHourDefault, "startMinutes": startMinutes, "startMinuteDefault": startMinuteDefault, "ampms": ampms, "ampmDefault": ampmDefault, "durationHours": durationHours, "durationHourDefault": durationHourDefault, "durationMinutes": durationMinutes, "durationMinuteDefault": durationMinuteDefault, "weekdayMin": weekdayMin, "weekdayMax": weekdayMax, "startHourMin": startHourMin, "startHourMax": startHourMax, "startMinuteMin": startMinuteMin, "startMinuteMax": startMinuteMax, "ampmMin": ampmMin, "ampmMax": ampmMax, "durationHourMin": durationHourMin, "durationHourMax": durationHourMax, "durationMinuteMin": durationMinuteMin, "durationMinuteMax": durationMinuteMax, }, )