import os import hashlib import mimetypes from django.core.files import File from django.db import models from django.conf import settings from django.utils import timezone from labs.models import ( LabUsage, User, LabGuideUpload, ) def record_lab_start(email: str, lab_code: str): usage, created = LabUsage.objects.get_or_create( email=email, lab_code=lab_code, defaults={"start_count": 1}, ) if not created: usage.start_count = models.F("start_count") + 1 usage.save(update_fields=["start_count"]) def upload_lab_guide_image_to_oss(file: File, user: User) -> str: import opendal retry_layer = opendal.layers.RetryLayer(max_times=3, factor=2.0, jitter=True) operator = opendal.Operator( "oss", bucket=settings.ALIYUN_OSS_BUCKET, endpoint=f"https://oss-{settings.ALIYUN_OSS_REGION}.aliyuncs.com", access_key_id=settings.ALIYUN_OSS_ACCESS_KEY_ID, access_key_secret=settings.ALIYUN_OSS_ACCESS_KEY_SECRET, ).layer(retry_layer) original_file_name = file.name file_size = file.size file_hash = hashlib.sha1(file.read()).hexdigest() extension = os.path.splitext(original_file_name)[1] now = timezone.now() file_path = f"images/{now.year}/{now.month}/{now.day}/{file_hash}{extension}" public_url = f"{settings.ALIYUN_CDN_URL}/{file_path}" content_type = mimetypes.guess_type(original_file_name)[0] or "application/octet-stream" LabGuideUpload.objects.create( user=user, original_file_name=original_file_name, file_size=file_size, file_hash=file_hash, public_url=public_url, ) file.seek(0) operator.write(file_path, file.read(), content_type=content_type) return public_url