Exemple #1
0
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)})
Exemple #2
0
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)})
Exemple #3
0
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)})
Exemple #4
0
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)})
Exemple #5
0
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)})