Beispiel #1
0
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
Beispiel #2
0
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.",
    })
Beispiel #3
0
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
Beispiel #4
0
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.",
        })
Beispiel #5
0
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.",
    })
Beispiel #6
0
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
    })
Beispiel #7
0
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)