示例#1
0
def ok(
    data: Union[BaseResponse, Sequence[BaseResponse], ModelMixin,
                Sequence[ModelMixin]]
) -> HttpResponse:
    if isinstance(data, BaseResponse):
        return HttpResponse(data.json(exclude_none=True),
                            mimetype="application/json")

    if isinstance(data, list) and len(data) > 0 and isinstance(
            data[0], BaseResponse):
        decoded = [json.loads(x.json(exclude_none=True)) for x in data]
        return HttpResponse(json.dumps(decoded), mimetype="application/json")

    if isinstance(data, ModelMixin):
        return HttpResponse(
            data.json(exclude_none=True, exclude=data.export_exclude()),
            mimetype="application/json",
        )

    decoded = [
        x.raw(exclude_none=True, exclude=x.export_exclude()) if isinstance(
            x, ModelMixin) else x for x in data
    ]
    return HttpResponse(
        json.dumps(decoded),
        mimetype="application/json",
    )
示例#2
0
async def process_modals(req: HttpRequest) -> HttpResponse:
    """
    Modal processor (main entry point).

    Processes markdown files and substitutes the placeholders.

    Parameters
    ----------
    req: HttpRequest
        HTTP trigger request (web hook).

    Returns
    -------
    HttpResponse
        Response to the HTTP request (200 if successful, otherwise 500).
    """
    logging.info(
        f"--- Web hook has triggered the function. Starting the process...")

    event_loop = get_event_loop()

    try:
        task = process_github_files(repository_url=REPOSITORY_ARCHIVE_URL,
                                    callback=process_and_upload_data,
                                    excluded=EXCLUDED_ITEMS,
                                    base_path=REPOSITORY_BASE_PATH,
                                    container=STORAGE_CONTAINER)

        event_loop.create_task(task)

    except Exception as err:
        logging.exception(err)
        return HttpResponse(status_code=int(HTTPStatus.INTERNAL_SERVER_ERROR))

    return HttpResponse(status_code=int(HTTPStatus.OK))
示例#3
0
def main(req: HttpRequest) -> HttpResponse:
    logging.info(
        'Python HTTP trigger function processed a request to parse text for relevent information.'
    )
    body_to_return = {}
    text_from_image = None

    try:
        req_body = req.get_body()

        if req_body is None or req_body == b'':
            raise ValueError()
    except ValueError:
        return HttpResponse(json.dumps({"Error": "No body"}), status_code=404)
    else:
        try:
            tweet, image_url = parse_tweet_url_from_body(
                req_body.decode('utf-8'))
            cities_referenced = fetch_city_info(tweet)
            resources_referenced = fetch_resources_info(tweet)
            contact_details = fetch_contact_info(tweet)

            if image_url is not None and _is_valid_url(image_url):
                text_from_image = process_image_url_to_get_text(
                    image_url=image_url)
                cities_referenced_in_image = fetch_city_info(
                    ' '.join(text_from_image))
                resources_referenced_in_image = fetch_resources_info(
                    ' '.join(text_from_image))
                contact_details_in_image = fetch_contact_info(
                    ' '.join(text_from_image))

        except Exception as e:
            logging.error(e)
            return HttpResponse(json.dumps({"Error": "No tweet"}),
                                status_code=404)

    body_to_return = {
        "cities":
        str(cities_referenced),
        "resources_referenced":
        str(resources_referenced),
        "contact_details":
        str(contact_details),
        "text_from_image":
        text_from_image if text_from_image else "",
        "cities_from_image":
        cities_referenced_in_image if text_from_image else "",
        "resources_referenced_from_image":
        resources_referenced_in_image if text_from_image else "",
        "contact_details_from_image":
        contact_details_in_image if text_from_image else ""
    }

    return HttpResponse(json.dumps(body_to_return), status_code=200)
示例#4
0
def main(req: HttpRequest) -> HttpResponse:
    ds_secret_key = environ.get(ENV_VAR_KEY_SECRET)
    if not ds_secret_key:
        return HttpResponse('Could not load Dark Sky API secret', status_code=500)
    ds_location = environ.get(ENV_VAR_KEY_LOCATION)
    if not ds_location:
        return HttpResponse('Could not load location key', status_code=500)
    r = httpx.get(f'https://api.darksky.net/forecast/{ds_secret_key}/{ds_location}?exclude=minutely')
    if not r.status_code == 200:
        return HttpResponse(f'Got status code {r.status_code} from Dark Sky API', status_code=500)
    return HttpResponse(json.dumps(build_response_json(r.json())), mimetype='application/json')
    def inner(req: HttpRequest, lastUpdateTimestamp: str) -> HttpResponse:
        code, response, raw_query, formatter = func(req, lastUpdateTimestamp)

        if len(lastUpdateTimestamp.split('.')[-1].strip("Z")) == 7:
            lastUpdateTimestamp = lastUpdateTimestamp.replace("0Z", "").replace("5Z", "") + "Z"

        data = response
        if isinstance(response, (list, dict)):
            data = dumps(response, separators=(",", ":"))

        gzipped_data = compress(data.encode())

        timestamp = str()

        if lastUpdateTimestamp:
            timestamp = datetime.strptime(lastUpdateTimestamp, "%Y-%m-%dT%H:%M:%S.%fZ")

        headers = {
            "Content-Type": instance_settings.RESPONSE_TYPE[formatter],
            **UNIVERSAL_HEADERS
        }

        if 'csv' in instance_settings.RESPONSE_TYPE[formatter] and len(data):
            headers['Content-Disposition'] = (
                f"attachment;filename=data_{timestamp.strftime('%Y-%b-%d')}.csv"
            )
            headers['X-Content-Type-Options'] = 'nosniff'
            del headers["Content-Type"]

        if code < 400:
            headers.update({
                "Cache-Control": "public, max-age=60",
                "Content-Location": f"/v1/data?{raw_query}"
            })

        if timestamp:
            headers.update({
                "Last-Modified": timestamp.strftime("%a, %d %b %Y %H:%M:%S GMT")
            })

        if req.method == "HEAD":
            return HttpResponse(
                status_code=204 if code < 400 else int(code),
                headers=headers
            )

        return HttpResponse(
            body=gzipped_data,
            status_code=int(code),
            headers=headers
        )
async def process_layouts(req: HttpRequest) -> HttpResponse:
    logging.info(f"--- Web hook has triggered the function. Starting the process...")

    event_loop = get_event_loop()

    try:
        task = process_github_files(
            repository_url=REPOSITORY_ARCHIVE_URL,
            callback=process_and_upload_data,
            excluded=EXCLUDED_ITEMS,
            base_path=REPOSITORY_BASE_PATH,
            container=STORAGE_CONTAINER
        )

        event_loop.create_task(task)

    except Exception as err:
        logging.exception(err)
        return HttpResponse(status_code=int(HTTPStatus.INTERNAL_SERVER_ERROR))

    return HttpResponse(status_code=int(HTTPStatus.OK))
async def main(req: HttpRequest) -> HttpResponse:
    body = req.get_body()
    data = loads(body)

    file_name = data.get("fileName")

    if file_name is None:
        return HttpResponse(None, status_code=400)

    hashable_filename = str.join("", file_pattern.search(file_name).groups())
    instance_id = blake2b(hashable_filename.encode()).hexdigest()
    try:
        register_file(filepath=file_name,
                      timestamp=datetime.utcnow(),
                      instance_id=instance_id)
    except IntegrityError:
        return HttpResponse(None, status_code=403)

    response = dumps({"instance_id": instance_id})
    return HttpResponse(response,
                        status_code=200,
                        headers={"content-type": "application/json"})
示例#8
0
def not_ok(error: Error,
           *,
           status_code: int = 400,
           context: Union[str, UUID]) -> HttpResponse:
    if 400 <= status_code and status_code <= 599:
        logging.error("request error - %s: %s" % (str(context), error.json()))

        return HttpResponse(error.json(),
                            status_code=status_code,
                            mimetype="application/json")
    else:
        raise Exception(
            "status code %s is not int the expected range [400; 599]" %
            status_code)
def main(req: HttpRequest) -> HttpResponse:
    logging.info("Running health checks")

    logging.info("Testing database connection and response")
    session = Session()
    conn = session.connection()
    try:
        q = conn.execute(text("SELECT 1 AS result;"))
        _ = q.fetchone()
        logging.info("Database is alive")
    except Exception as err:
        session.rollback()
        logging.warning("Database is dead")
        raise err
    finally:
        session.close()

    storage_kws = dict(
        container="pipeline",
        path="healthchecks/etl",
        content_type="text/plain",
        compressed=False
    )
    logging.info("Testing storage connection")
    try:
        with StorageClient(**storage_kws) as storage:
            storage.upload("test")
            storage.download()
            storage.delete()
        logging.info("Storage is alive")
    except Exception as err:
        logging.warning("Storage is dead")
        raise err

    logging.info("All tests passed.")

    return HttpResponse(b"ALIVE", status_code=200)
示例#10
0
 def response(self) -> HttpResponse:
     return HttpResponse(
         body=self.body,
         status_code=self.status_code,
         headers=dict(self.headers),
     )
示例#11
0
def get_json(response: func.HttpResponse) -> Dict:
    """Get JSON from an HttpResponse."""
    return json.loads(response.get_body().decode("utf-8"))
示例#12
0
def main(req: HttpRequest) -> HttpResponse:
    logging.info('Python HTTP trigger twittercode-daily started')
    code = get_daily_code()
    logging.info(f"Today's code was {code}  !")
    return HttpResponse(code, status_code=200, mimetype="application/json")
示例#13
0
 def response_to_body(self, response: func.HttpResponse):
     return [response.get_body()]
示例#14
0
def redirect(location: str) -> HttpResponse:
    return HttpResponse(status_code=302, headers={"Location": location})