From 05343ad5716919453e631c464e3138ae463a1276 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sun, 12 Jan 2025 19:20:29 -0500 Subject: [PATCH 1/3] udpate more --- README.md | 4 ++++ deploy/app/__init__.py | 1 + 2 files changed, 5 insertions(+) diff --git a/README.md b/README.md index 9e332fa1..36936769 100644 --- a/README.md +++ b/README.md @@ -70,3 +70,7 @@ Keep your Lambda functions optimized for performance and cost. # Lambda and S3 Lamda limits returns to 6MB and uploads to around 256K. So large uploads are done with presigned POST to S3 and large downloads by putting the data into S3 and having it pulled with a presigned URL. + + +colima start +docker ps -a diff --git a/deploy/app/__init__.py b/deploy/app/__init__.py index e69de29b..691bfc1b 100644 --- a/deploy/app/__init__.py +++ b/deploy/app/__init__.py @@ -0,0 +1 @@ +__version__='0.9.0' From 182dd29228ad5fcd0c58e88ea754a0953de13f53 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sun, 12 Jan 2025 19:40:57 -0500 Subject: [PATCH 2/3] pylint passes --- deploy/app/__init__.py | 3 +++ deploy/app/apikey.py | 13 ++++++++++++- deploy/app/constants.py | 1 + deploy/app/templates/base.html | 6 +++--- deploy/demo.py | 7 +++++-- deploy/lambda_handler.py | 20 ++++++++++---------- 6 files changed, 34 insertions(+), 16 deletions(-) diff --git a/deploy/app/__init__.py b/deploy/app/__init__.py index 691bfc1b..20679c7b 100644 --- a/deploy/app/__init__.py +++ b/deploy/app/__init__.py @@ -1 +1,4 @@ +""" +stuff +""" __version__='0.9.0' diff --git a/deploy/app/apikey.py b/deploy/app/apikey.py index 93b17c14..d4aab7a0 100644 --- a/deploy/app/apikey.py +++ b/deploy/app/apikey.py @@ -10,10 +10,14 @@ import functools import subprocess import json +from functools import lru_cache +import base64 +from os.path import join from flask import request from . import db +from .paths import ETC_DIR from .auth import get_dbreader,AuthError from .constants import C,__version__ @@ -115,10 +119,16 @@ def get_user_dict(): userdict = db.validate_api_key(api_key) if not userdict: - logging.info("api_key %s is invalid ipaddr=%s request.url=%s", api_key,request.remote_addr,request.url) + logging.info("api_key %s is invalid ipaddr=%s request.url=%s", + api_key,request.remote_addr,request.url) raise AuthError(f"api_key '{api_key}' is invalid") return userdict +@lru_cache(maxsize=1) +def favicon_base64(): + with open( join( ETC_DIR, C.FAVICON), 'rb') as f: + return base64.b64encode(f.read()).decode('utf-8') + def page_dict(title='', *, require_auth=False, lookup=True, logout=False,debug=False): """Returns a dictionary that can be used by post of the templates. :param: title - the title we should give the page @@ -169,6 +179,7 @@ def page_dict(title='', *, require_auth=False, lookup=True, logout=False,debug=F ret= fix_types({ C.API_BASE: api_base, C.STATIC_BASE: static_base, + 'favicon_base64':favicon_base64(), 'api_key': api_key, # the API key that is currently active 'user_id': user_id, # the user_id that is active 'user_name': user_name, # the user's name diff --git a/deploy/app/constants.py b/deploy/app/constants.py index 9d8a3985..3fa34310 100644 --- a/deploy/app/constants.py +++ b/deploy/app/constants.py @@ -23,6 +23,7 @@ class C: FFMPEG_PATH = 'FFMPEG_PATH' # Other + FAVICON = 'icon.png' API_BASE='API_BASE' STATIC_BASE='STATIC_BASE' TRACKING_COMPLETED='TRACKING COMPLETED' # keep case; it's used as a flag diff --git a/deploy/app/templates/base.html b/deploy/app/templates/base.html index fb0e1d2c..2cfd7d84 100644 --- a/deploy/app/templates/base.html +++ b/deploy/app/templates/base.html @@ -1,12 +1,12 @@ - {% block title %} {{title}} {% endblock %} + + - - + {% block title %} {{title}} {% endblock %} Date: Sun, 12 Jan 2025 20:02:12 -0500 Subject: [PATCH 3/3] pytest works again --- deploy/app/bottle_app.py | 2 +- deploy/app/db_object.py | 1 + deploy/app/etc/icon.png | Bin 0 -> 3037 bytes deploy/app/paths.py | 9 +++++++-- deploy/app/templates/base.html | 2 +- 5 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 deploy/app/etc/icon.png diff --git a/deploy/app/bottle_app.py b/deploy/app/bottle_app.py index a99eb0ce..a93aff95 100644 --- a/deploy/app/bottle_app.py +++ b/deploy/app/bottle_app.py @@ -43,7 +43,7 @@ def lambda_startup(): clogging.setup(level=os.environ.get('PLANTTRACER_LOG_LEVEL',logging.INFO)) fix_boto_log_level() - if C.PLANTTRACER_S3_BUCKET in os.environ: + if os.environ.get(C.PLANTTRACER_S3_BUCKET,None): db_object.S3_BUCKET = os.environ[C.PLANTTRACER_S3_BUCKET] else: config = auth.config() diff --git a/deploy/app/db_object.py b/deploy/app/db_object.py index 88205a17..45323c5f 100644 --- a/deploy/app/db_object.py +++ b/deploy/app/db_object.py @@ -95,6 +95,7 @@ def make_urn(*, object_name, scheme = None ): if scheme == C.SCHEME_S3 and S3_BUCKET is None: scheme = C.SCHEME_DB if scheme == C.SCHEME_S3: + assert len(S3_BUCKET)>0 netloc = S3_BUCKET elif scheme == C.SCHEME_DB: netloc = DB_TABLE diff --git a/deploy/app/etc/icon.png b/deploy/app/etc/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..86bffcbdf4f89a5074bcffe08214b62ab0248a94 GIT binary patch literal 3037 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 XW)bhpX`ia*{n4VVoGi=C56AomGI$!T literal 0 HcmV?d00001 diff --git a/deploy/app/paths.py b/deploy/app/paths.py index a6109c88..3ce7b9f5 100644 --- a/deploy/app/paths.py +++ b/deploy/app/paths.py @@ -38,7 +38,12 @@ def ffmpeg_path(): if C.FFMPEG_PATH in os.environ: - return os.environ[C.FFMPEG_PATH] + pth = os.environ[C.FFMPEG_PATH] + if os.path.exists(path): + return pth + pth = shutil.which('ffmpeg') + if pth: + return pth if os.path.exists(AWS_LAMBDA_LINUX_STATIC_FFMPEG): return AWS_LAMBDA_LINUX_STATIC_FFMPEG - return shutil.which('ffmpeg') + raise FileNotFoundError("ffmpeg") diff --git a/deploy/app/templates/base.html b/deploy/app/templates/base.html index 2cfd7d84..226ef5dd 100644 --- a/deploy/app/templates/base.html +++ b/deploy/app/templates/base.html @@ -1,7 +1,7 @@ - +