LetsShop-shopdeck-actions/metadata/views.py
2023-02-24 19:30:23 +01:00

331 lines
20 KiB
Python

from django.shortcuts import render
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from shopdeck import settings
from shopdeckdb.models import *
from django.core.exceptions import ObjectDoesNotExist
from urllib.parse import unquote
from dateutil import relativedelta
import datetime
@csrf_exempt
def news(request, region):
news = announcement.objects.all().order_by("-date")
allnews = []
for ann in news:
ann.content = ann.content.replace("\\n", "\n")
result = {"headline": ann.title, "description": ann.content, "date":int(ann.date.timestamp())}
if ann.is_banner:
result.update(images={"image":[{"index": 1, "type": "banner", "url": ann.banner_url, "height": 126, "width": 300}]})
result.update(id=ann.id)
allnews.append(result)
res = {"news": {"news_entry": allnews, "length": len(allnews)}}
return JsonResponse(res)
@csrf_exempt
def telops(request, region):
motds = motd.objects.all().order_by('order')
allmotds = []
for ann in motds:
allmotds.append(ann.content)
res = {"telops": {"telop": allmotds, "length": len(allmotds)}}
return JsonResponse(res)
@csrf_exempt
def language(request, region):
lang = request.GET.get('lang', None)
if lang == None:
return JsonResponse({"error": True})
res = {"languages":{"language":[{"iso_code":lang,"name":"Unknown"}]}}
return JsonResponse(res)
#this should be named just tos but nintendo named it eshop message idfk why
@csrf_exempt
def eshop_message(request, region):
res = {"text": {"type": "html", "body": settings.TOS_ESHOP}}
return JsonResponse(res)
@csrf_exempt
def directories(request, region):
dirs = category.objects.all().order_by('order')
alldirectories = []
for directory in dirs:
alldirectories.append({"name": directory.name, "icon_url": directory.icon_url, "icon_width": 128, "icon_height": 96, "banner_url": directory.banner_url, "index": directory.index, "id": directory.id, "type": "search", "standard": directory.standard, "new": directory.new})
res = {"directories": {"directory": alldirectories, "length": len(alldirectories), "catalog_id": 1}}
return JsonResponse(res)
@csrf_exempt
def directory(request, region, cid):
try:
dir = category.objects.get(id=cid)
except ObjectDoesNotExist:
return JsonResponse({"error": True})
if request.GET.get("platform[]") == None and request.GET.get("genre[]") == None and request.GET.get("publisher[]") == None and request.GET.get("price_max")==None and request.GET.get("price_min")==None:
titles = Title.objects.filter(category=dir, public=True).order_by('-date')[int(request.GET.get("offset")):25+25]
total = titles.count()
movies = movie.objects.filter(category=dir).order_by('-date')
total_movie = movies.count()
total = total+total_movie
else:
#over complicated but at least works
if request.GET.get("platform[]") == None:
platforms = []
all_platforms = platform.objects.all()
for aplatform in all_platforms:
platforms.append(aplatform.id)
else:
platforms = request.GET.get("platform[]").split(",")
if request.GET.get("genre[]") == None:
genrel = []
all_genre = genre.objects.all()
for agenre in all_genre:
genrel.append(agenre.id)
else:
genrel = request.GET.get("genre[]").split(",")
if request.GET.get("publisher[]") == None:
publisherl = []
all_publisher = publisher.objects.all()
for apublisher in all_publisher:
publisherl.append(apublisher.id)
else:
publisherl = request.GET.get("publisher[]").split(",")
if request.GET.get("price_max") != None and request.GET.get("price_min") == None:
titles = Title.objects.filter(price__lte=int(request.GET.get("price_max")),category=dir, platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_min") != None and request.GET.get("price_max") == None:
titles = Title.objects.filter(price__gte=int(request.GET.get("price_min")),category=dir, platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_min") != None and request.GET.get("price_max") == None:
titles = Title.objects.filter(price__gte=int(request.GET.get("price_min")),price__lte=int(request.GET.get("price_max")),category=dir, platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_max") == None and request.GET.get("price_min")==None:
titles = Title.objects.filter(category=dir, platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
total = titles.count()
alltitles = []
i = 0
for title in titles:
if title.is_not_downloadable:
is_downloadable = False
else:
is_downloadable = True
alltitles.append({"title": {"platform": {"name": title.platform.name, "id": title.platform.id, "device": "CTR", "category": title.genre.id}, "publisher": {"name": title.publisher.publisher_name, "id": title.publisher.id}, "display_genre": title.genre.name, "release_date_on_eshop": str(title.date), "retail_sales": False, "eshop_sales": is_downloadable, "demo_available": False, "aoc_available": False, "in_app_purchase": title.in_app_purchase, "release_date_on_original": str(title.date), "name": title.name, "id": title.id, "product_code": title.product_code, "icon_url": title.icon_url, "banner_url": title.banner_url, "new": title.new}, "index": i})
i = i + 1
try:
for Movie in movies:
if i > 25:
continue
if Movie.is_3d:
dimension = "3d"
else:
dimension = "2d"
alltitles.append({"movie": {"name": Movie.name, "banner_url": Movie.banner_url, "thumbnail_url": Movie.thumbnail_url, "files": {"file": [{"format": "moflex", "movie_url": Movie.moflex_url, "width": 400, "height": 200, "dimension": dimension, "play_time_sec": Movie.time_in_sec}]}, "id": Movie.id, "new": Movie.new}, "index": i})
i = i + 1
except:
pass
res = {"directory": {"name": dir.name, "icon_url": dir.icon_url, "icon_width": 128, "icon_height": 96, "banner_url": dir.banner_url, "contents": {"content": alltitles, "length": len(alltitles), "offset": int(request.GET.get("offset")), "total": total}, "id": dir.id, "type": "search", "component": "title"}}
return JsonResponse(res)
@csrf_exempt
def title(request, region, tid):
try:
title = Title.objects.get(id=tid)
except ObjectDoesNotExist:
return JsonResponse({"error": True})
title.desc = title.desc.replace("\\n", "\n")
if title.is_not_downloadable:
is_downloadable = False
else:
is_downloadable = True
res = {"title": {"formal_name": title.name, "description": title.desc, "genres": {"genre": [{"name": title.genre.name, "id": title.genre.id}], "length": 1}, "keywords": {}, "ticket_available": title.ticket_available, "title_size": title.size, "download_code_sales": False, "download_card_sales": {"available": False}, "name": title.name, "thumbnails": {"thumbnail": [{"url": title.thumbnail_url, "height": 112, "width": 112, "type": "small"}]}, "id": title.id, "platform": {"name": title.platform.name, "id": title.platform.id, "device": "CTR", "category": title.genre.id }, "publisher": {"name": title.publisher.publisher_name, "id": title.publisher.id}, "product_code": title.product_code, "icon_url": title.icon_url, "banner_url": title.banner_url, "display_genre": title.genre.name, "release_date_on_eshop": str(title.date), "retail_sales": False, "eshop_sales": is_downloadable, "web_sales": is_downloadable, "demo_available": False, "aoc_available": False, "in_app_purchase": title.in_app_purchase, "new": title.new, "public": title.public}}
return JsonResponse(res)
@csrf_exempt
def agreement_send_info(request, region):
return JsonResponse({"text":{"type":"html","body":"This is useless shit that could break your\naccess to Let's Shop! in the future\ndon't accept plz"}})
@csrf_exempt
def searchcategory(request, region):
all_category = searchCategory.objects.all().order_by("-id")
categories = []
for category in all_category:
categories.append({"name": category.name, "params": {"param": [{"key": "platform[]", "value": category.platform_list}]}, "id": category.id})
res = {"search_categories":{"search_category_group":[{"name":"Search categories","search_category":categories}]}}
return JsonResponse(res)
@csrf_exempt
def genres(request, region):
all_genres = genre.objects.all().order_by("-id")
genres = []
for agenre in all_genres:
genres.append({"name": agenre.name, "id": agenre.id})
res = {"genres": {"genre": genres}}
return JsonResponse(res)
@csrf_exempt
def publishers(request, region):
all_publishers = publisher.objects.all().order_by("-id")
publishers = []
for apublisher in all_publishers:
publishers.append({"name": apublisher.publisher_name, "id": apublisher.id})
res = {"publishers": {"publisher": publishers}}
return JsonResponse(res)
@csrf_exempt
def contents(request, region):
search_term = unquote(request.GET.get("freeword"))
all_titles = Title.objects.filter(name__icontains=search_term, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
total = all_titles.count()
movies = movie.objects.filter(name__icontains=search_term).order_by('-date')
total_movie = movies.count()
total = total+total_movie
titles = []
i = 0
for title in all_titles:
if title.is_not_downloadable:
is_downloadable = False
else:
is_downloadable = True
titles.append({"title": {"platform": {"name": title.platform.name, "id": title.platform.id, "device": "CTR", "category": title.genre.id}, "publisher": {"name": title.publisher.publisher_name, "id": title.publisher.id}, "display_genre": title.genre.name, "release_date_on_eshop": str(title.date), "retail_sales": False, "eshop_sales": is_downloadable, "demo_available": False, "aoc_available": False, "in_app_purchase": title.in_app_purchase, "release_date_on_original": str(title.date), "name": title.name, "id": title.id, "product_code": title.product_code, "icon_url": title.icon_url, "banner_url": title.banner_url, "new": title.new}, "index": i})
i = i + 1
for Movie in movies:
if i > 25:
continue
if Movie.is_3d:
dimension = "3d"
else:
dimension = "2d"
titles.append({"movie": {"name": Movie.name, "banner_url": Movie.banner_url, "thumbnail_url": Movie.thumbnail_url, "files": {"file": [{"format": "moflex", "movie_url": Movie.moflex_url, "width": 400, "height": 200, "dimension": dimension, "play_time_sec": Movie.time_in_sec}]}, "id": Movie.id, "new": Movie.new}, "index": i})
i = i + 1
res = {"contents": {"content": titles, "length": len(titles), "offset": int(request.GET.get("offset")), "total": total}}
return JsonResponse(res)
@csrf_exempt
def titles(request, region):
if request.GET.get("platform[]") == None and request.GET.get("genre[]") == None and request.GET.get("publisher[]") == None and request.GET.get("price_max")==None and request.GET.get("price_min")==None and request.GET.get("title[]") == None:
if request.GET.get("freeword") != None:
search_term = unquote(request.GET.get("freeword"))
all_titles = Title.objects.filter(name__icontains=search_term, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("release_date_after") == None:
movies = movie.objects.filter(name__icontains=search_term).order_by('-date')
if request.GET.get('title[]') == None:
all_titles = Title.objects.filter(public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("release_date_after") == None:
movies = movie.objects.all().order_by('-date')
total = all_titles.count()
if request.GET.get("release_date_after") == None:
total_movie = movies.count()
total = total+total_movie
if request.GET.get("platform[]") != None or request.GET.get("genre[]") != None or request.GET.get("publisher[]") != None or request.GET.get("price_max")!=None or request.GET.get("price_min")!=None:
#over complicated but at least works
if request.GET.get("platform[]") == None:
platforms = []
all_platforms = platform.objects.all()
for aplatform in all_platforms:
platforms.append(aplatform.id)
else:
platforms = request.GET.get("platform[]").split(",")
if request.GET.get("genre[]") == None:
genrel = []
all_genre = genre.objects.all()
for agenre in all_genre:
genrel.append(agenre.id)
else:
genrel = request.GET.get("genre[]").split(",")
if request.GET.get("publisher[]") == None:
publisherl = []
all_publisher = publisher.objects.all()
for apublisher in all_publisher:
publisherl.append(apublisher.id)
else:
publisherl = request.GET.get("publisher[]").split(",")
if request.GET.get("freeword") != None:
search_term = unquote(request.GET.get("freeword"))
if request.GET.get("price_max") != None and request.GET.get("price_min") == None:
all_titles = Title.objects.filter(price__lte=int(request.GET.get("price_max")), name__icontains=search_term,platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_min") != None and request.GET.get("price_max") == None:
all_titles = Title.objects.filter(price__gte=int(request.GET.get("price_min")),name__icontains=search_term,platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_max") != None and request.GET.get("price_min") != None:
all_titles = Title.objects.filter(price__lte=int(request.GET.get("price_max")),price__gte=int(request.GET.get("price_min")),name__icontains=search_term,platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_max") == None and request.GET.get("price_min")==None:
all_titles = Title.objects.filter(name__icontains=search_term,platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
else:
if request.GET.get("price_max") != None and request.GET.get("price_min") == None:
all_titles = Title.objects.filter(price__lte=int(request.GET.get("price_max")), platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_min") != None and request.GET.get("price_max") == None:
all_titles = Title.objects.filter(price__gte=int(request.GET.get("price_min")), platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_max") != None and request.GET.get("price_min") != None:
all_titles = Title.objects.filter(price__lte=int(request.GET.get("price_max")),price__gte=int(request.GET.get("price_min")),platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
if request.GET.get("price_max") == None and request.GET.get("price_min")==None:
all_titles = Title.objects.filter(platform__in=platforms, genre__in=genrel, publisher__in=publisherl, public=True).order_by("-date")[int(request.GET.get("offset")):25+25]
total = all_titles.count()
if request.GET.get("title[]") != None:
title_ids = request.GET.get("title[]").split(",")
all_titles = Title.objects.filter(id__in=title_ids)
total = all_titles.count()
titles = []
i = 0
for title in all_titles:
#check date
if request.GET.get("release_date_after"):
now = datetime.date.today()
time_between_insertion = now - title.date
if int(time_between_insertion.days) > 90:
continue
if title.is_not_downloadable:
is_downloadable = False
else:
is_downloadable = True
titles.append({"title": {"platform": {"name": title.platform.name, "id": title.platform.id, "device": "CTR", "category": title.genre.id}, "publisher": {"name": title.publisher.publisher_name, "id": title.publisher.id}, "display_genre": title.genre.name, "release_date_on_eshop": str(title.date), "retail_sales": False, "eshop_sales": is_downloadable, "demo_available": False, "aoc_available": False, "in_app_purchase": title.in_app_purchase, "release_date_on_original": str(title.date), "name": title.name, "id": title.id, "product_code": title.product_code, "icon_url": title.icon_url, "banner_url": title.banner_url, "new": title.new}, "index": i})
i = i + 1
try:
for Movie in movies:
if i > 25:
continue
if Movie.is_3d:
dimension = "3d"
else:
dimension = "2d"
titles.append({"movie": {"name": Movie.name, "banner_url": Movie.banner_url, "thumbnail_url": Movie.thumbnail_url, "files": {"file": [{"format": "moflex", "movie_url": Movie.moflex_url, "width": 400, "height": 200, "dimension": dimension, "play_time_sec": Movie.time_in_sec}]}, "id": Movie.id, "new": Movie.new}, "index": i})
i = i + 1
except:
pass
if request.GET.get("offset") == None:
offset = 0
else:
offset = int(request.GET.get("offset"))
res = {"contents": {"content": titles, "length": len(titles), "offset": offset, "total": total}}
return JsonResponse(res)
@csrf_exempt
def viewmovie(request, region, mid):
try:
Movie = movie.objects.get(id=mid)
except ObjectDoesNotExist:
return JsonResponse({"error": True})
if Movie.is_3d:
dimension = "3d"
else:
dimension = "2d"
res = {"movie": {"name": Movie.name, "banner_url": Movie.banner_url, "thumbnail_url": Movie.thumbnail_url, "files": {"file": [{"format": "moflex", "movie_url": Movie.moflex_url, "width": 400, "height": 200, "dimension": dimension, "play_time_sec": Movie.time_in_sec}]}, "id": Movie.id, "new": Movie.new}}
return JsonResponse(res)
@csrf_exempt
def movies_content(request, region):
movies = movie.objects.all().order_by('-date')[int(request.GET.get("offset")):25+25]
total = movies.count()
all_movies = []
i = 0
for Movie in movies:
if request.GET.get("release_date_after"):
now = datetime.date.today()
time_between_insertion = now - Movie.date
if int(time_between_insertion.days) > 7:
continue
if Movie.is_3d:
dimension = "3d"
else:
dimension = "2d"
all_movies.append({"movie": {"name": Movie.name, "banner_url": Movie.banner_url, "thumbnail_url": Movie.thumbnail_url, "files": {"file": [{"format": "moflex", "movie_url": Movie.moflex_url, "width": 400, "height": 200, "dimension": dimension, "play_time_sec": Movie.time_in_sec}]}, "id": Movie.id, "new": Movie.new}, "index": i})
i = i + 1
res = {"contents": {"content": all_movies, "length": len(all_movies), "offset": int(request.GET.get("offset")), "total": total}}
return JsonResponse(res)
@csrf_exempt
def rankings(request, region):
return JsonResponse({"error": {"code": "5626", "message": "WIP. Not ready yet."}}, status=400)