def get_live_map(request, *args, **kwargs): try: survey_id = request.GET["survey_id"] map_id = request.GET["map_id"] except KeyError: response = JsonResponse( { "ok": False, "error": ("You must provide a Survey ID and a Map ID " "to get a live sensor status image.") }, custom_header_data=kwargs) response.status_code = 400 return response # Thank you Stack Overflow # https://stackoverflow.com/a/1636354/5297057 colour_pattern = re.compile("^#(?:[0-9a-fA-F]{3}){1,2}$") absent_colour = request.GET.get("absent_colour", "#ABE00C") occupied_colour = request.GET.get("occupied_colour", "#FFC90E") image_scale_str = request.GET.get("image_scale", "0.02") circle_radius_str = request.GET.get("circle_radius", "128") if not re.match(colour_pattern, absent_colour) or \ not re.match(colour_pattern, occupied_colour): response = JsonResponse( { "ok": False, "error": ("The custom colours you specfied did not match " "the format of HTML hex colours. Colours must " "either be in the format #ABC or #ABCDEF.") }, custom_header_data=kwargs) response.status_code = 400 return response try: image_scale = float(image_scale_str) except ValueError: response = JsonResponse( { "ok": False, "error": ("The scale you specified is not valid. It " "must be a floating point number, such as 1 " "or 0.02.") }, custom_header_data=kwargs) response.status_code = 400 return response try: circle_radius = float(circle_radius_str) except ValueError: response = JsonResponse( { "ok": False, "error": ("The circle radiuus you specified is not valid. " "It must be a floating point number, such as 128 or " "100.5.") }, custom_header_data=kwargs) response.status_code = 400 return response try: ib = ImageBuilder(survey_id, map_id) except BadOccupEyeRequest: response = JsonResponse( { "ok": False, "error": ("Either the IDs you sent were not " "integers, or they do not exist.") }, custom_header_data=kwargs) response.status_code = 400 return response ib.set_colours(absent=absent_colour, occupied=occupied_colour) ib.set_circle_radius(circle_radius=circle_radius) ib.set_image_scale(image_scale=image_scale) map_svg = ib.get_live_map() response = HttpResponse(map_svg, content_type="image/svg+xml", custom_header_data=kwargs) response["Content-Length"] = len(map_svg) return response
def set_callback_url(request): if request.method != "POST": response = PrettyJsonResponse({ "success": False, "error": "Request is not of method POST" }) response.status_code = 400 return response try: app_id = request.POST["app_id"] except KeyError: response = PrettyJsonResponse({ "success": False, "message": "Request does not have an app_id." }) response.status_code = 400 return response try: user_id = request.session["user_id"] except (KeyError, AttributeError): response = PrettyJsonResponse({ "success": False, "message": "User ID not set in session. Please log in again." }) response.status_code = 400 return response try: new_callback_url = request.POST["callback_url"] except KeyError: response = PrettyJsonResponse({ "success": False, "message": "Request does not have a Callback URL." }) response.status_code = 400 return response if not is_url_safe(new_callback_url): response = PrettyJsonResponse({ "success": False, "message": ("The requested callback URL" " is not valid.") }) response.status_code = 400 return response user = get_user_by_id(user_id) apps = App.objects.filter(id=app_id, user=user) if len(apps) == 0: response = PrettyJsonResponse({ "success": False, "message": "App does not exist." }) response.status_code = 400 return response app = apps[0] app.callback_url = new_callback_url app.save() keen_add_event.delay("App callback URL changed", { "appid": app_id, "userid": user.id, "newcallbackurl": new_callback_url }) return PrettyJsonResponse({ "success": True, "message": "Callback URL successfully changed.", })
def get_historical_time_data(request, *args, **kwargs): api = OccupEyeApi() consts = OccupEyeConstants() survey_ids = request.GET.get("survey_ids", None) try: day_count = request.GET["days"] except KeyError: response = JsonResponse( { "ok": False, "error": ("You did not specify how many days of historical data " "should be returned. Valid options are: ") + str(consts.VALID_HISTORICAL_DATA_DAYS) }, custom_header_data=kwargs) response.status_code = 400 return response if not day_count.isdigit(): response = JsonResponse( { "ok": False, "error": ("You did not specify an integer number of days of " "historical days. Valid options are: ") + str(consts.VALID_HISTORICAL_DATA_DAYS) }, custom_header_data=kwargs) response.status_code = 400 return response day_count = int(day_count) if day_count not in consts.VALID_HISTORICAL_DATA_DAYS: response = JsonResponse( { "ok": False, "error": ("You did not specify a valid number of days of " "historical days. Valid options are: ") + str(consts.VALID_HISTORICAL_DATA_DAYS) }, custom_header_data=kwargs) response.status_code = 400 return response try: data = api.get_historical_time_usage_data(survey_ids, day_count) except BadOccupEyeRequest: response = JsonResponse( { "ok": False, "error": ("One or more of the survey_ids you requested is not valid.") }, custom_header_data=kwargs) response.status_code = 400 return response response = JsonResponse({ "ok": True, "surveys": data }, custom_header_data=kwargs) return response
def update_scopes(request): if request.method != "POST": response = PrettyJsonResponse({ "success": False, "error": "Request is not of method POST" }) response.status_code = 400 return response try: app_id = request.POST["app_id"] except KeyError: response = PrettyJsonResponse({ "success": False, "message": "Request does not have an app_id." }) response.status_code = 400 return response try: user_id = request.session["user_id"] except (KeyError, AttributeError): response = PrettyJsonResponse({ "success": False, "message": "User ID not set in session. Please log in again." }) response.status_code = 400 return response try: scopes_json = request.POST["scopes"] except KeyError: response = PrettyJsonResponse({ "success": False, "message": "No scopes data attached." }) response.status_code = 400 return response try: scopes = json.loads(scopes_json) except ValueError: response = PrettyJsonResponse({ "success": False, "message": "Invalid scope data that could not be parsed." }) response.status_code = 400 return response user = get_user_by_id(user_id) apps = App.objects.filter(id=app_id, user=user) if len(apps) == 0: response = PrettyJsonResponse({ "success": False, "message": "App does not exist." }) response.status_code = 400 return response else: app = apps[0] current = app.scope.scope_number s = Scopes() try: for scope in scopes: if "checked" in scope and scope["checked"]: current = s.add_scope(current, scope["name"]) else: current = s.remove_scope(current, scope["name"]) app.scope.scope_number = current app.scope.save() app.save() except (KeyError, ValueError, TypeError): response = PrettyJsonResponse({ "success": False, "message": "Invalid scope data that could not be iterated." }) response.status_code = 400 return response return PrettyJsonResponse({ "success": True, "message": "Scope successfully changed.", })
def set_callback_url(request): if request.method != "POST": response = PrettyJsonResponse({ "success": False, "error": "Request is not of method POST" }) response.status_code = 400 return response try: app_id = request.POST["app_id"] except KeyError: response = PrettyJsonResponse({ "success": False, "message": "Request does not have an app_id." }) response.status_code = 400 return response try: user_id = request.session["user_id"] except (KeyError, AttributeError): response = PrettyJsonResponse({ "success": False, "message": "User ID not set in session. Please log in again." }) response.status_code = 400 return response try: new_callback_url = request.POST["callback_url"] except KeyError: response = PrettyJsonResponse({ "success": False, "message": "Request does not have a Callback URL." }) response.status_code = 400 return response url_not_safe_saved = is_url_unsafe(new_callback_url) if url_not_safe_saved: if url_not_safe_saved == NOT_HTTPS: message = "The requested callback URL does not "\ "start with 'https://'." elif url_not_safe_saved == NOT_VALID: message = "The requested callback URL is not valid." elif url_not_safe_saved == URL_BLACKLISTED: message = "The requested callback URL is forbidden." elif url_not_safe_saved == NOT_PUBLIC: message = "The requested callback URL is not publicly available." response = PrettyJsonResponse({ "success": False, "message": message }) response.status_code = 400 return response user = get_user_by_id(user_id) apps = App.objects.filter(id=app_id, user=user) if len(apps) == 0: response = PrettyJsonResponse({ "success": False, "message": "App does not exist." }) response.status_code = 400 return response app = apps[0] app.callback_url = new_callback_url app.save() return PrettyJsonResponse({ "success": True, "message": "Callback URL successfully changed.", })
def edit_webhook(request): if request.method != "POST": response = PrettyJsonResponse({ "ok": False, "message": ("Request is not of method POST") }) response.status_code = 400 return response try: app_id = request.POST["app_id"] url = request.POST["url"] siteid = request.POST["siteid"] roomid = request.POST["roomid"] contact = request.POST["contact"] user_id = request.session["user_id"] except KeyError: response = PrettyJsonResponse({ "ok": False, "message": ("Request is missing parameters. Should have app_id" ", url, siteid, roomid, contact" " as well as a sessionid cookie") }) response.status_code = 400 return response if not user_owns_app(user_id, app_id): response = PrettyJsonResponse({ "ok": False, "message": ("App does not exist or user is lacking permission.") }) response.status_code = 400 return response app = App.objects.get(id=app_id) webhook = app.webhook if url != webhook.url: if is_url_unsafe(url): response = PrettyJsonResponse({ "ok": False, "message": ("Invalid URL") }) response.status_code = 400 return response if not verify_ownership(url, generate_secret(), webhook.verification_secret): response = PrettyJsonResponse({ "ok": False, "message": ("Ownership of webhook can't be verified." "Make sure to follow the documentation: " "https://uclapi.com/docs#webhook/challenge-event") }) response.status_code = 400 return response webhook.url = url webhook.save() webhook.siteid = siteid webhook.roomid = roomid webhook.contact = contact webhook.enabled = True webhook.save() return PrettyJsonResponse({ "ok": True, "message": "Webhook sucessfully changed.", "url": webhook.url, "roomid": webhook.roomid, "siteid": webhook.siteid, "contact": webhook.contact })
def get_course_modules_endpoint(request, *args, **kwargs): """ Returns all modules taught on a particular course. """ try: course_id = request.GET["course"] except KeyError: response = JsonResponse( { "ok": False, "error": "No course ID provided." }, custom_header_data=kwargs) response.status_code = 400 return response if not validate_amp_query_params(request.query_params): response = JsonResponse( { "ok": False, "error": "Given parameter is not of corrrect type" }, custom_header_data=kwargs) response.status_code = 400 return response if request.query_params.get('only_compulsory'): try: strtobool(request.query_params.get('only_compulsory')) except ValueError: response = JsonResponse( { "ok": False, "error": "Given parameter is not of correct type" }, custom_header_data=kwargs) response.status_code = 400 return response if request.query_params.get('only_available'): try: strtobool(request.query_params.get('only_available')) except ValueError: response = JsonResponse( { "ok": False, "error": "Given parameter is not of correct type" }, custom_header_data=kwargs) response.status_code = 400 return response if (request.query_params.get('only_available') and request.query_params.get('only_compulsory')): if (strtobool(request.query_params.get('only_available')) and strtobool(request.query_params.get('only_compulsory'))): response = JsonResponse( { "ok": False, "error": "only_available and only_compulsory" " cannot both be true" }, custom_header_data=kwargs) response.status_code = 400 return response modules = { "ok": True, "modules": get_course_modules(course_id, request.query_params) } return JsonResponse(modules, custom_header_data=kwargs)