|
3 | 3 | import requests
|
4 | 4 | from django.contrib.auth.decorators import login_required
|
5 | 5 | from django.contrib.auth.forms import UserChangeForm
|
| 6 | +from django.db.models import Q |
6 | 7 | from django.http import JsonResponse
|
7 | 8 | from django.shortcuts import redirect, render, get_object_or_404
|
8 | 9 | from django.urls import reverse_lazy, reverse, resolve
|
9 | 10 | from django.views.decorators.http import require_POST, require_GET
|
10 |
| -from django.views.generic import ListView, UpdateView, DetailView |
| 11 | +from django.views.generic import ListView, UpdateView, DetailView, View |
11 | 12 |
|
12 | 13 | from .models import Movie, Profile, Request
|
13 | 14 | from django.views.generic import ListView
|
14 | 15 |
|
15 | 16 | from .models import Movie
|
16 | 17 |
|
| 18 | +from .workers import * |
17 | 19 |
|
18 | 20 | class MovieListView(ListView):
|
19 | 21 | model = Movie
|
20 | 22 | template_name = 'movie_list.html'
|
21 | 23 | paginate_by = 10
|
22 | 24 |
|
23 | 25 |
|
24 |
| -class SearchMovieListView(ListView): |
| 26 | +class SearchMovieListView(MovieListView): |
25 | 27 | def get_queryset(self):
|
26 | 28 | query = self.request.GET.get('q')
|
| 29 | + res = self.model.objects.filter(Q(title__icontains=query) | Q(description__icontains=query)) |
| 30 | + if not res: # try to catch mispelled infos |
| 31 | + similars = find_similar_movies(Movie.objects.values_list('title'), query) |
| 32 | + return Movie.objects.filter(title__in=similars) |
27 | 33 | if query:
|
28 |
| - return Movie.objects.filter(title__icontains=query) |
| 34 | + return res |
29 | 35 | else:
|
30 | 36 | return Movie.objects.none()
|
31 | 37 |
|
32 | 38 |
|
| 39 | +class MovieAutocomplete(View): |
| 40 | + def get(self, request, *args, **kwargs): |
| 41 | + term = request.GET.get('term', '') |
| 42 | + movies = Movie.objects.filter(Q(title__icontains=term) | Q(description__icontains=term))[:10] |
| 43 | + suggestions = [] |
| 44 | + for movie in movies: |
| 45 | + suggestions.append({ |
| 46 | + 'label': f"{movie.title} ({movie.year})", |
| 47 | + 'value': movie.title |
| 48 | + }) |
| 49 | + return JsonResponse(suggestions, safe=False) |
| 50 | + |
| 51 | + |
33 | 52 | class MovieDetailView(DetailView):
|
34 | 53 | model = Movie
|
35 | 54 | template_name = 'movie_detail.html'
|
@@ -65,23 +84,7 @@ def get_context_data(self, **kwargs):
|
65 | 84 | return context
|
66 | 85 |
|
67 | 86 |
|
68 |
| -def title_recommendation(movie: Movie): |
69 |
| - def count_common_genres(list1, list2): |
70 |
| - return len(set(list1) & set(list2)) |
71 |
| - |
72 |
| - genres = movie.get_genre_as_list() |
73 |
| - allmovies_genre_list = [(m, m.get_genre_as_list()) for m in |
74 |
| - Movie.objects.all().exclude(tmdb_id=movie.tmdb_id)] |
75 | 87 |
|
76 |
| - common_genres_list = [[elem[0], count_common_genres(genres, elem[1])] for elem in allmovies_genre_list] |
77 |
| - common_genres_list = sorted(common_genres_list, key=lambda x: x[1], reverse=True) |
78 |
| - |
79 |
| - recommended_titles = [elem[0] for elem in common_genres_list if elem[1]][:5] |
80 |
| - |
81 |
| - if len(recommended_titles) > 0: |
82 |
| - return recommended_titles |
83 |
| - else: |
84 |
| - return None |
85 | 88 |
|
86 | 89 |
|
87 | 90 | @login_required
|
|
0 commit comments