forked from erp-dev/erp
107 lines
2.9 KiB
Python
107 lines
2.9 KiB
Python
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())
|