From 3133e816508363c3c5fd750fcdae175d2e453c8a Mon Sep 17 00:00:00 2001 From: Fam Zheng Date: Wed, 14 May 2025 22:10:38 +0100 Subject: [PATCH] api: Add qr-std-upload api --- api/emblemapi/settings.py | 3 +++ api/products/views.py | 29 +++++++++++++++++++++++++++++ api/tests/test_qr_std.py | 8 ++++++++ 3 files changed, 40 insertions(+) create mode 100644 api/tests/test_qr_std.py diff --git a/api/emblemapi/settings.py b/api/emblemapi/settings.py index a69326a..77f29a8 100644 --- a/api/emblemapi/settings.py +++ b/api/emblemapi/settings.py @@ -161,11 +161,14 @@ if ENV == "prod": FEATURES_BUCKET = "emblem-features-prod" ARCHIVE_BUCKET = "emblem-archive-prod" FRAMES_BUCKET = "emblem-frames-prod" + OSS_QRS_BUCKET = "emblem-qrs" else: OSS = aliyun_dev_key FEATURES_BUCKET = "emblem-features-dev-1" ARCHIVE_BUCKET = "emblem-oss-archive-dev-1" FRAMES_BUCKET = "emblem-frames-dev" + OSS_QRS_BUCKET = ARCHIVE_BUCKET + IPINFO_TOKEN = '537dea9ec5c99a' diff --git a/api/products/views.py b/api/products/views.py index da53473..a21cb69 100644 --- a/api/products/views.py +++ b/api/products/views.py @@ -1609,6 +1609,35 @@ class EstorFeatureRoi(BaseView): "saved": 1, }) +class QrStdUploadView(BaseView): + name = 'qr-std-upload' + auth_check = None + + def post(self, request): + files = request.FILES + for f in files.values(): + try: + QrStdUploadView.save_qr(f.name, f.read()) + except Exception as e: + return http400(f'{f.name}: {str(e)}') + return JsonResponse({ + 'ok': True, + 'nfiles': len(files), + }) + + def save_qr(fname, body): + basename = os.path.basename(fname) + name, ext = os.path.splitext(basename) + if ext != ".jpg": + raise Exception("invalid file extension") + if len(body) > 1024 * 1024 * 10: + raise Exception("file too large") + if len(name) < 2: + raise Exception("invalid file name") + pref = name[:2] + key = f"v5/{pref}/{fname}" + r = oss_put(key, body, bucket=settings.OSS_QRS_BUCKET) + class EstorArchive(BaseView): name = 'estor-archive' auth_check = None diff --git a/api/tests/test_qr_std.py b/api/tests/test_qr_std.py new file mode 100644 index 0000000..8dbf24e --- /dev/null +++ b/api/tests/test_qr_std.py @@ -0,0 +1,8 @@ +from django.test import TestCase +from products.views import QrStdUploadView + +class QrStdTestCase(TestCase): + def test_qr_std_upload(self): + fname = '99999999.jpg' + body = b'1234' + r = QrStdUploadView.save_qr(fname, body) \ No newline at end of file