def search_text(request, text): """Searches recordings by poetry text fragment""" journal_event(models.Journal, request, {'event':'s', 'search_query':text, 'search_mode':'p'}) words = search_words(text) recordings = models.Recording.objects.select_related('poetry', 'music').prefetch_related('performers', 'poetry__poets', 'music__composers', 'production_set').filter(poetry__in=models.Poetry.objects.filter(search_query('text__iregex', words))).order_by('title', 'poetry', 'music') context = RequestContext(request, { 'search': text, 'recordings': recordings, }) return XHttpResponse(request, {'title':u'Поиск', 'content':get_template('search.htm').render(context)})
def journal(request): """Events journaling: POST event to log or GET journal webpage""" if request.method == 'POST': # AJAX notification about client-side events # Playback journal_event(models.Journal, request, {'event':'p', 'playback_recording':models.Recording.objects.get(id=request.POST.get('id'))}) return HttpResponse('') context = RequestContext(request, { 'events': models.Journal.objects.all().order_by('-timestamp')[:10], }) return XHttpResponse(request, {'title':'', 'content':get_template('journal.htm').render(context)})
def search_name(request, name): """Searches people by name""" journal_event(models.Journal, request, {'event':'s', 'search_query':name, 'search_mode':'n'}) words = search_words(name) people = models.Person.objects.filter(search_query('name__iregex', words)) context = RequestContext(request, { 'search': name, 'people': people, }) return XHttpResponse(request, {'title':u'Поиск', 'content':get_template('people.htm').render(context)})
def person(request, name): """Shows details about given person with a list of all related pieces and recordings""" journal_event(models.Journal, request, {'event':'v', 'view_url':request.get_full_path()}) # id-based addresses are bad, because id isn't guaranteed to remain persistent, messing clients bookmarks and history # name-based should be used instead, name is persistent and unique in models.pesron # Cache fragments are still identified by person id supplied through person.htm template # Would be nice to use try...except here to provide error message in DoesNotExist case with similar existing names person = models.Person.objects.get(name=name.replace("_", " ")) recordings = models.Recording.objects.select_related('poetry', 'music').prefetch_related('performers', 'poetry__poets', 'music__composers', 'production_set').filter(Q(performers=person)|Q(music__composers=person)|Q(poetry__poets=person)).distinct().order_by('title', 'poetry', 'music') context = RequestContext(request, { 'person': person, 'recordings': recordings, }) return XHttpResponse(request, {'title':person.name, 'content':get_template('person.htm').render(context)})
def search_title(request, title): """Searches recordings by title""" journal_event(models.Journal, request, {'event':'s', 'search_query':title, 'search_mode':'t'}) # Multiple search methods: sphinx (if available) and simple substring^W db regex (as a fallback) try: # TODO this query duplicates Recording.title_piece_object logic, as well as the query in the 'except:' branch # implementing an abstraction for title inheritance will be a very complex task recordings = models.Recording.objects.select_related('poetry', 'music').prefetch_related('performers', 'poetry__poets', 'music__composers', 'production_set').filter((~Q(poetry=None)&Q(poetry__in=models.Poetry.search.query(title)))|(Q(poetry=None)&~Q(music=None)&~Q(music__poetry=None)&Q(music__poetry__in=models.Poetry.search.query(title)))|(Q(poetry=None)&~Q(music=None)&Q(music__poetry=None)&Q(music__in=models.Music.search.query(title)))).order_by('title', 'poetry', 'music') except: words = search_words(title) recordings = models.Recording.objects.select_related('poetry', 'music').prefetch_related('performers', 'poetry__poets', 'music__composers', 'production_set').filter((Q(poetry=None)&((Q(music__poetry=None)&search_query('music__title__iregex', words))|search_query('music__poetry__title__iregex', words)))|search_query('poetry__title__iregex', words)).order_by('title', 'poetry', 'music') context = RequestContext(request, { 'search': title, 'recordings': recordings, }) return XHttpResponse(request, {'title':u'Поиск', 'content':get_template('search.htm').render(context)})