You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
6.7 KiB
190 lines
6.7 KiB
import random
|
|
from rest_framework.generics import GenericAPIView, ListAPIView
|
|
from rest_framework.views import APIView
|
|
from rest_framework.response import Response
|
|
from rest_framework import serializers
|
|
from rest_framework.permissions import AllowAny
|
|
from drf_yasg.utils import swagger_auto_schema
|
|
from drf_yasg import openapi
|
|
|
|
from rest_framework.authtoken.models import Token
|
|
from apps.account.models import User
|
|
from apps.api.models import Comment, AppVersion
|
|
from apps.api.serializers import CommentSerializer, AppVersionSerializer
|
|
from utils.pagination import StandardResultsSetPagination
|
|
|
|
class HomeSerializer(serializers.Serializer):
|
|
token = serializers.CharField()
|
|
|
|
import json
|
|
from django.conf import settings
|
|
|
|
COUNTRIES_FILE_PATH = settings.BASE_DIR / 'utils' / 'country_city_list' / 'optimized_countries.json'
|
|
CITIES_FILE_PATH = settings.BASE_DIR / 'utils' / 'country_city_list' / 'optimized_cities.json'
|
|
|
|
def get_localized_name(translations, target_lang='en'):
|
|
if not translations:
|
|
return ""
|
|
for t in translations:
|
|
if t.get('language_code') == target_lang:
|
|
return t.get('title')
|
|
for t in translations:
|
|
if t.get('language_code') == 'en':
|
|
return t.get('title')
|
|
return translations[0].get('title', '')
|
|
|
|
def get_localized_cities(cities_data, country_code, target_lang='en'):
|
|
country_cities = cities_data.get(country_code.upper())
|
|
if not country_cities:
|
|
return []
|
|
for item in country_cities:
|
|
if item.get('language_code') == target_lang:
|
|
return item.get('title', [])
|
|
for item in country_cities:
|
|
if item.get('language_code') == 'en':
|
|
return item.get('title', [])
|
|
return country_cities[0].get('title', [])
|
|
|
|
|
|
# test class generate token
|
|
class HomeView(GenericAPIView):
|
|
serializer_class = HomeSerializer
|
|
|
|
@swagger_auto_schema(
|
|
operation_description="Health check and token test endpoint. Optionally reads BUILD_NUMBER from headers.",
|
|
manual_parameters=[
|
|
openapi.Parameter(
|
|
name='BUILD_NUMBER',
|
|
in_=openapi.IN_HEADER,
|
|
description='Client build number',
|
|
type=openapi.TYPE_STRING,
|
|
required=False
|
|
)
|
|
],
|
|
responses={
|
|
200: openapi.Response(
|
|
description="OK",
|
|
schema=HomeSerializer()
|
|
)
|
|
}
|
|
)
|
|
def get(self, request):
|
|
# Get build_number from headers
|
|
build_number = request.META.get('HTTP_BUILD_NUMBER')
|
|
|
|
# Print the build_number
|
|
print(f"Build Number: {build_number}")
|
|
|
|
return Response({'token': "ok", 'build_number': build_number})
|
|
|
|
class CountryView(APIView):
|
|
permission_classes = [AllowAny]
|
|
|
|
@swagger_auto_schema(
|
|
operation_description="List of optimized countries with codes and names",
|
|
responses={200: openapi.Response(description="Countries list")}
|
|
)
|
|
def get(self, request):
|
|
try:
|
|
with open(COUNTRIES_FILE_PATH, 'r', encoding='utf-8') as f:
|
|
countries_data = json.load(f)
|
|
except Exception as e:
|
|
return Response({"error": "Failed to load countries data"}, status=500)
|
|
|
|
lang = getattr(request, 'LANGUAGE_CODE', 'en')
|
|
result = []
|
|
for code, translations in countries_data.items():
|
|
name = get_localized_name(translations, lang)
|
|
result.append({
|
|
"code": code,
|
|
"name": name
|
|
})
|
|
|
|
# Sort countries alphabetically by name
|
|
result.sort(key=lambda x: x["name"])
|
|
return Response(result, status=200)
|
|
|
|
class CityListView(APIView):
|
|
permission_classes = [AllowAny]
|
|
|
|
@swagger_auto_schema(
|
|
operation_description="List of cities based on country code",
|
|
manual_parameters=[
|
|
openapi.Parameter(
|
|
name='country_code',
|
|
in_=openapi.IN_QUERY,
|
|
description='Two-letter country code (e.g. IR, CN, TR)',
|
|
type=openapi.TYPE_STRING,
|
|
required=True
|
|
)
|
|
],
|
|
responses={
|
|
200: openapi.Response(description="List of city names"),
|
|
400: openapi.Response(description="Country code is required or invalid")
|
|
}
|
|
)
|
|
def get(self, request):
|
|
country_code = request.query_params.get('country_code')
|
|
if not country_code:
|
|
return Response({"error": "country_code query parameter is required"}, status=400)
|
|
|
|
try:
|
|
with open(CITIES_FILE_PATH, 'r', encoding='utf-8') as f:
|
|
cities_data = json.load(f)
|
|
except Exception as e:
|
|
return Response({"error": "Failed to load cities data"}, status=500)
|
|
|
|
lang = getattr(request, 'LANGUAGE_CODE', 'en')
|
|
cities = get_localized_cities(cities_data, country_code, lang)
|
|
|
|
if not cities and country_code.upper() not in cities_data:
|
|
return Response({"error": f"No cities found or invalid country code: {country_code}"}, status=400)
|
|
|
|
# Sort cities alphabetically
|
|
sorted_cities = sorted(cities)
|
|
return Response(sorted_cities, status=200)
|
|
|
|
|
|
class CommentListAPIView(ListAPIView):
|
|
"""
|
|
API view to list comments ordered by order field and creation date
|
|
"""
|
|
queryset = Comment.objects.all()
|
|
serializer_class = CommentSerializer
|
|
permission_classes = [AllowAny]
|
|
ordering = ['order', '-created_at'] # Order by order field first, then by newest
|
|
pagination_class = StandardResultsSetPagination
|
|
|
|
@swagger_auto_schema(
|
|
operation_description="List comments ordered by 'order' then '-created_at'",
|
|
responses={
|
|
200: openapi.Response(
|
|
description="List of comments",
|
|
schema=CommentSerializer(many=True)
|
|
)
|
|
}
|
|
)
|
|
def get(self, request, *args, **kwargs):
|
|
return super().get(request, *args, **kwargs)
|
|
|
|
def get_queryset(self):
|
|
queryset = super().get_queryset()
|
|
return queryset.order_by('order', '-created_at')
|
|
|
|
|
|
class AppVersionListAPIView(ListAPIView):
|
|
queryset = AppVersion.objects.all().order_by('-created_at')
|
|
serializer_class = AppVersionSerializer
|
|
permission_classes = [AllowAny]
|
|
pagination_class = StandardResultsSetPagination
|
|
@swagger_auto_schema(
|
|
operation_description="List all app versions with fields.",
|
|
responses={
|
|
200: openapi.Response(
|
|
description="List of app versions",
|
|
schema=AppVersionSerializer(many=True)
|
|
)
|
|
}
|
|
)
|
|
def get(self, request, *args, **kwargs):
|
|
return super().get(request, *args, **kwargs)
|