def show_search_result(request, query_type, query_string, query_id): """ Display CachedSearchResult. If document is missing create new one using RESTful query redirect. @param query_type: a string containing query type @param query_string: a string containing query @param query_id: a string containing an ID of a CachedSearchResult document @return: a HttpResponseRedirect object or rendered search result page """ # TODO: add meta-header for robots: nocahe, norobots etc try: search_result = CachedSearchResult.get(query_id) except ResourceNotFound: return HttpResponseRedirect(reverse("create-search-result", args=(query_type, query_string))) # SEO check seo_query_type = slugify2(search_result.query_type) seo_query_string = slugify2(search_result.query_string) if query_type != seo_query_type or query_string != seo_query_string: return HttpResponseRedirect(reverse("show-search-result", args=(seo_query_type, seo_query_string, query_id))) # TODO: if only 1 result, redirect to it directly return render_to_response("search/%s_results.html" % search_result.query_type, locals())
def get_basic_cached_search_result(query_type, query_string): """ Make sure proper CachedSearchResult is present and return its id. Method performs local, then optional remote (MusicBrainz) lookup of query result @param query_type: a string containing query type @param query_string: a string containing query @return: a string containing SHA1 hash of a query string (the ID of a CachedSearchResult document) """ query_id = hashlib.sha1((query_type+query_string).encode('utf-8')).hexdigest() search_result = CachedSearchResult.get_or_create(query_id) search_result.query_string = query_string search_result.query_type = query_type if 'mb' not in search_result.cache_state: #TODO: add 14day window check try: t = mmda_logger('mb','request','search for',query_string) if query_type == 'artist': filter = ws.ArtistFilter(name=query_string,limit=RESULTS_LIMIT) results = mb_query.getArtists(filter) #TODO: add try, or maybe better in 'create_search' as a global wrapper search_result.results = [ {'name':r.artist.name, 'mbid':extractUuid(r.artist.id), 'score':r.score, 'note':r.artist.disambiguation } for r in results ] elif query_type == 'release': filter = ws.ReleaseFilter(title=query_string,limit=RESULTS_LIMIT) results = mb_query.getReleases(filter) #TODO: add try, or maybe better in 'create_search' as a global wrapper search_result.results = [ {'artist':r.release.artist.name, 'title':r.release.title, 'mbid':extractUuid(r.release.id), 'artist_mbid':extractUuid(r.release.artist.id), 'score':r.score, 'tracks_count':r.release.tracksCount, 'year':r.release.getEarliestReleaseEvent().getDate() if r.release.getEarliestReleaseEvent() else None} for r in results ] elif query_type == 'tag': # TODO: refactor to other packages import pylast lastfm = pylast.get_lastfm_network(api_key = settings.LASTFM_API_KEY) lastfm_similar_tags = lastfm.search_for_tag(query_string).get_next_page() search_result.results = [ tag.name for tag in lastfm_similar_tags ] except Exception, e: # TODO: hard error here mmda_logger('search','ERROR',e) raise e else: mmda_logger('mb','result','results',len(search_result.results),t) search_result.cache_state['mb'] = [1,datetime.utcnow()] search_result.save()