from django.conf import settings from django.utils import timezone from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework.views import APIView from api_v1.models import AppVersion APP_VERSION_CACHE_KEY = "app_version:latest" def _coerce_version_part(value) -> int: return max(0, int(value or 0)) def _coerce_publish_date(value) -> str: return str(value or timezone.localdate().isoformat()).strip() def build_app_version_payload( *, major, minor, build, download_url: str, force=False, publish_date=None, message: str = "", ) -> dict: return { "latest_version": { "major": _coerce_version_part(major), "minor": _coerce_version_part(minor), "build": _coerce_version_part(build), }, "download_url": str(download_url or "").strip(), "force": bool(force), "publish_date": _coerce_publish_date(publish_date), "message": str(message or ""), } def get_app_version_payload() -> dict: app_version = ( AppVersion.objects.filter(is_current=True).order_by('-created_at').first() or AppVersion.objects.order_by('-created_at').first() ) if app_version: return build_app_version_payload( major=app_version.major, minor=app_version.minor, build=app_version.build, download_url=app_version.download_url, force=app_version.force, publish_date=app_version.publish_date, message=app_version.message, ) return build_app_version_payload( major=getattr(settings, "APP_LATEST_VERSION_MAJOR", 0), minor=getattr(settings, "APP_LATEST_VERSION_MINOR", 0), build=getattr(settings, "APP_LATEST_VERSION_BUILD", 0), download_url=getattr(settings, "APP_DOWNLOAD_URL", ""), force=getattr(settings, "APP_FORCE_UPDATE", False), publish_date=getattr(settings, "APP_PUBLISH_DATE", None), message=getattr(settings, "APP_VERSION_MESSAGE", ""), ) def set_cached_app_version_payload( *, major, minor, build, download_url: str, force=False, publish_date=None, message: str = "", ) -> dict: app_version = AppVersion.objects.create( major=major, minor=minor, build=build, download_url=download_url, force=force, publish_date=publish_date or timezone.localdate(), message=message, is_current=True, ) return build_app_version_payload( major=app_version.major, minor=app_version.minor, build=app_version.build, download_url=app_version.download_url, force=app_version.force, publish_date=app_version.publish_date, message=app_version.message, ) class AppVersionView(APIView): permission_classes = [AllowAny] def get(self, request): return Response(get_app_version_payload())