mirror of
https://gitlab.science.ru.nl/technicie/MarietjeDjango.git
synced 2025-12-09 22:52:23 +01:00
Add caching for song searching
This commit is contained in:
@ -3,12 +3,14 @@ from functools import wraps
|
||||
|
||||
import django.middleware.csrf as csrf
|
||||
from django.contrib.auth import authenticate, login
|
||||
from django.core.cache import caches
|
||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
||||
from django.db import transaction
|
||||
from django.db.models import Q, Sum, Value
|
||||
from django.db.models.functions import Coalesce
|
||||
from django.http import JsonResponse, HttpResponseForbidden
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.views.decorators.cache import cache_page
|
||||
from django.views.decorators.http import require_http_methods
|
||||
from django.conf import settings
|
||||
from mutagen import File
|
||||
@ -80,35 +82,39 @@ def songs(request):
|
||||
try:
|
||||
pagesize = int(request.POST.get('pagesize'))
|
||||
except:
|
||||
pagesize = 10
|
||||
pagesize = 50
|
||||
|
||||
if not pagesize or pagesize < 10:
|
||||
pagesize = 10
|
||||
if not pagesize or pagesize < 50:
|
||||
pagesize = 50
|
||||
|
||||
try:
|
||||
page = int(request.POST.get('page'))
|
||||
except:
|
||||
page = 1
|
||||
|
||||
queries = [Q(deleted=False)]
|
||||
queries.extend([Q(Q(artist__icontains=word) | Q(title__icontains=word)) for word in request.POST.get('all', '').split()])
|
||||
queries.extend([Q(user__name__icontains=word) for word in request.POST.get('uploader', '').split()])
|
||||
def search_songs():
|
||||
queries = [Q(deleted=False)]
|
||||
queries.extend([Q(Q(artist__icontains=word) | Q(title__icontains=word)) for word in request.POST.get('all', '').split()])
|
||||
queries.extend([Q(user__name__icontains=word) for word in request.POST.get('uploader', '').split()])
|
||||
|
||||
filter_query = queries.pop()
|
||||
for query in queries:
|
||||
filter_query &= query
|
||||
filter_query = queries.pop()
|
||||
for query in queries:
|
||||
filter_query &= query
|
||||
|
||||
songs_query = Song.objects.filter(filter_query).order_by('artist', 'title').select_related('user')
|
||||
paginator = Paginator(songs_query, pagesize)
|
||||
songs_query = Song.objects.filter(filter_query).order_by('artist', 'title').select_related('user')
|
||||
paginator = Paginator(songs_query, pagesize)
|
||||
|
||||
try:
|
||||
songs = paginator.page(page)
|
||||
except PageNotAnInteger:
|
||||
songs = paginator.page(1)
|
||||
except EmptyPage:
|
||||
songs = paginator.page(paginator.num_pages)
|
||||
try:
|
||||
songs = paginator.page(page)
|
||||
except PageNotAnInteger:
|
||||
songs = paginator.page(1)
|
||||
except EmptyPage:
|
||||
songs = paginator.page(paginator.num_pages)
|
||||
|
||||
songs_dict = [song_to_dict(song, user=True) for song in songs.object_list]
|
||||
return [song_to_dict(song, user=True) for song in songs.object_list], paginator
|
||||
|
||||
cache_key = '|'.join(request.POST.get(k) for k in ('all', 'uploader', 'pagesize', 'page'))
|
||||
songs_dict, paginator = caches['song_search'].get_or_set(cache_key, search_songs, 60*60*2)
|
||||
|
||||
return JsonResponse({
|
||||
'per_page': pagesize,
|
||||
|
||||
Reference in New Issue
Block a user