From 47bd9e55c58ba4930d19dc5744c481d1c3c075c3 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 20 Feb 2022 19:09:23 -0500 Subject: [PATCH] API v0 API v0 --- books/models.py | 15 +++++++++++++++ common/models.py | 12 ++++++++++++ common/urls.py | 1 + common/views.py | 23 +++++++++++++++-------- games/models.py | 12 ++++++++++++ movies/models.py | 17 ++++++++++++++++- music/models.py | 19 +++++++++++++++++++ 7 files changed, 90 insertions(+), 9 deletions(-) diff --git a/books/models.py b/books/models.py index 6c827f0e..a13ec298 100644 --- a/books/models.py +++ b/books/models.py @@ -63,6 +63,21 @@ class Book(Entity): def __str__(self): return self.title + def get_json(self): + r = { + 'subtitle': self.subtitle, + 'original_title': self.orig_title, + 'author': self.author, + 'translator': self.translator, + 'publisher': self.pub_house, + 'publish_year': self.pub_year, + 'publish_month': self.pub_month, + 'language': self.language, + 'isbn': self.isbn, + } + r.update(super().get_json()) + return r + def get_absolute_url(self): return reverse("books:retrieve", args=[self.id]) diff --git a/common/models.py b/common/models.py index 9365b336..7d21458f 100644 --- a/common/models.py +++ b/common/models.py @@ -59,6 +59,18 @@ class Entity(models.Model): def get_absolute_url(self): raise NotImplementedError("Subclass should implement this method") + def get_json(self): + return { + 'title': self.title, + 'brief': self.brief, + 'rating': self.rating, + 'url': settings.APP_WEBSITE + self.get_absolute_url(), + 'cover_url': settings.APP_WEBSITE + self.cover.url, + 'top_tags': self.tags[:5], + 'category_name': self.verbose_category_name, + 'other_info': self.other_info, + } + def save(self, *args, **kwargs): """ update rating and strip source url scheme & querystring before save to db """ if self.rating_number and self.rating_total_score: diff --git a/common/urls.py b/common/urls.py index d0cbe20a..b803a47d 100644 --- a/common/urls.py +++ b/common/urls.py @@ -6,5 +6,6 @@ urlpatterns = [ path('', home), path('home/', home, name='home'), path('search/', search, name='search'), + path('search.json/', search, name='search.json'), path('external_search/', external_search, name='external_search'), ] diff --git a/common/views.py b/common/views.py index 0d331536..d5a24100 100644 --- a/common/views.py +++ b/common/views.py @@ -25,6 +25,7 @@ from common.searcher import ExternalSources from management.models import Announcement from django.conf import settings from common.index import Indexer +from django.http import JsonResponse logger = logging.getLogger(__name__) @@ -68,17 +69,23 @@ def search(request): "items": None, } ) - url_validator = URLValidator() - try: - url_validator(keywords) - # validation success - return jump_or_scrape(request, keywords) - except ValidationError as e: - pass - # + if request.user.is_authenticated: + url_validator = URLValidator() + try: + url_validator(keywords) + # validation success + return jump_or_scrape(request, keywords) + except ValidationError as e: + pass + result = Indexer.search(keywords, page=page_number, category=category, tag=tag) for item in result.items: item.tag_list = item.all_tag_list[:TAG_NUMBER_ON_LIST] + if request.path.endswith('.json/'): + return JsonResponse({ + 'num_pages': result.num_pages, + 'items':list(map(lambda i:i.get_json(), result.items)) + }) return render( request, "common/search_result.html", diff --git a/games/models.py b/games/models.py index 177255cb..d7dc6d91 100644 --- a/games/models.py +++ b/games/models.py @@ -75,6 +75,18 @@ class Game(Entity): def __str__(self): return self.title + def get_json(self): + r = { + 'developer': self.developer, + 'other_title': self.other_title, + 'publisher': self.publisher, + 'release_date': self.release_date, + 'platform': self.platform, + 'genre': self.genre, + } + r.update(super().get_json()) + return r + def get_absolute_url(self): return reverse("games:retrieve", args=[self.id]) diff --git a/movies/models.py b/movies/models.py index 599b030f..8971a01a 100644 --- a/movies/models.py +++ b/movies/models.py @@ -170,6 +170,22 @@ class Movie(Entity): else: return self.title + def get_json(self): + r = { + 'other_title': self.other_title, + 'original_title': self.orig_title, + 'director': self.director, + 'playwright': self.playwright, + 'actor': self.actor, + 'release_year': self.year, + 'genre': self.genre, + 'language': self.language, + 'season': self.season, + 'duration': self.duration, + 'imdb_code': self.imdb_code, + } + r.update(super().get_json()) + return r def get_absolute_url(self): return reverse("movies:retrieve", args=[self.id]) @@ -177,7 +193,6 @@ class Movie(Entity): def get_tags_manager(self): return self.movie_tags - def get_genre_display(self): translated_genre = [] for g in self.genre: diff --git a/music/models.py b/music/models.py index 31493387..28d545d0 100644 --- a/music/models.py +++ b/music/models.py @@ -48,6 +48,16 @@ class Album(Entity): def __str__(self): return self.title + def get_json(self): + r = { + 'artist': self.artist, + 'release_date': self.release_date, + 'genre': self.genre, + 'publisher': self.company, + } + r.update(super().get_json()) + return r + def get_embed_link(self): if self.source_site == SourceSiteEnum.SPOTIFY.value: return self.source_url.replace("open.spotify.com/", "open.spotify.com/embed/") @@ -95,6 +105,15 @@ class Song(Entity): def __str__(self): return self.title + def get_json(self): + r = { + 'artist': self.artist, + 'release_date': self.release_date, + 'genre': self.genre, + } + r.update(super().get_json()) + return r + def get_embed_link(self): return self.source_url.replace("open.spotify.com/", "open.spotify.com/embed/") if self.source_site == SourceSiteEnum.SPOTIFY.value else None