snipt/snipts/views.py

218 lines
6.6 KiB
Python
Raw Normal View History

from django.http import Http404, HttpResponseRedirect, HttpResponseBadRequest
2012-02-26 17:46:28 -08:00
from django.shortcuts import get_object_or_404, render_to_response
2012-04-22 20:51:52 -07:00
from django.core.paginator import Paginator, InvalidPage
2012-05-16 18:44:26 -07:00
from annoying.functions import get_object_or_None
2011-10-12 13:34:01 -07:00
from django.contrib.auth.models import User
2012-02-26 17:46:28 -08:00
from django.template import RequestContext
2011-10-12 08:29:21 -07:00
from annoying.decorators import render_to
2012-02-13 19:36:59 -08:00
from snipts.models import Favorite, Snipt
2011-10-12 08:29:21 -07:00
from django.db.models import Count
2012-05-31 22:21:28 -07:00
from blogs.views import blog_homepage, blog_list
2012-04-22 20:51:52 -07:00
from django.conf import settings
2012-02-13 19:36:59 -08:00
from django.db.models import Q
2011-10-12 08:29:21 -07:00
from taggit.models import Tag
2011-10-10 20:30:56 -07:00
2012-04-22 20:51:52 -07:00
from haystack.forms import ModelSearchForm
from haystack.query import EmptySearchQuerySet, SearchQuerySet
RESULTS_PER_PAGE = getattr(settings, 'HAYSTACK_SEARCH_RESULTS_PER_PAGE', 20)
2011-10-10 20:30:56 -07:00
def home(request):
2012-05-24 20:55:30 -07:00
2012-06-01 08:38:55 -07:00
if request.blog_user:
return blog_homepage(request)
2012-05-24 20:55:30 -07:00
2011-10-12 08:29:21 -07:00
if request.user.is_authenticated():
return HttpResponseRedirect('/%s/' % request.user.username)
2011-10-12 13:34:01 -07:00
else:
return list_public(request)
2012-05-31 19:32:32 -07:00
@render_to('snipts/detail.html')
def detail(request, username, snipt_slug):
snipt = get_object_or_404(Snipt, user__username=username, slug=snipt_slug)
user = snipt.user
if user != request.user:
if not snipt.public:
if 'key' not in request.GET:
raise Http404
else:
if request.GET.get('key') != snipt.key:
raise Http404
tags = Tag.objects
if user == request.user:
tags = tags.filter(snipt__user=user)
public = False
else:
tags = tags.filter(snipt__user=user, snipt__public=True)
public = True
tags = tags.annotate(count=Count('taggit_taggeditem_items__id'))
tags = tags.order_by('-count', 'name')
return {
'detail': True,
'has_snipts': True,
'public': public,
'snipt': snipt,
'tags': tags,
'user': user,
}
def embed(request, snipt_key):
snipt = get_object_or_404(Snipt, key=snipt_key)
lines = snipt.embedded.split('\n')
return render_to_response('snipts/embed.html',
{'lines': lines, 'snipt': snipt},
context_instance=RequestContext(request),
mimetype='application/javascript')
2011-10-12 13:34:01 -07:00
@render_to('snipts/list-public.html')
2012-01-16 15:47:09 -08:00
def list_public(request, tag_slug=None):
2011-10-12 08:29:21 -07:00
2012-06-01 08:41:06 -07:00
if request.blog_user:
return blog_list(request)
2011-10-12 08:29:21 -07:00
tags = Tag.objects.filter(snipt__public=True)
tags = tags.annotate(count=Count('taggit_taggeditem_items__id'))
2012-04-29 07:55:06 -07:00
tags = tags.order_by('-count')[:20]
tags = sorted(tags, key=lambda tag: tag.name)
2011-10-12 08:29:21 -07:00
snipts = Snipt.objects.filter(public=True).order_by('-created')
2012-01-16 15:47:09 -08:00
if tag_slug:
2012-03-10 18:52:46 -08:00
snipts = snipts.filter(tags__slug__in=[tag_slug])
tag = get_object_or_404(Tag, slug=tag_slug)
else:
tag = None
2012-04-13 20:30:23 -07:00
context = {
'has_snipts': True,
2012-02-12 18:13:13 -08:00
'public': True,
2011-10-12 08:29:21 -07:00
'snipts': snipts,
'tags': tags,
2012-03-10 18:52:46 -08:00
'tag': tag,
2011-10-12 08:29:21 -07:00
}
2012-04-13 20:30:23 -07:00
if 'rss' in request.GET:
context['snipts'] = context['snipts'][:20]
return rss(request, context)
return context
2011-10-12 13:34:01 -07:00
@render_to('snipts/list-user.html')
2012-05-03 19:19:05 -07:00
def list_user(request, username_or_custom_slug, tag_slug=None):
2012-06-01 08:41:06 -07:00
if request.blog_user:
2012-06-01 18:05:25 -07:00
return blog_list(request, username_or_custom_slug)
2012-06-01 08:41:06 -07:00
2012-05-03 19:19:05 -07:00
user = get_object_or_None(User, username=username_or_custom_slug)
if user is None:
snipt = get_object_or_404(Snipt, custom_slug=username_or_custom_slug)
return detail(request, snipt.user, snipt.slug)
2011-10-12 08:29:21 -07:00
2011-10-12 13:34:01 -07:00
tags = Tag.objects
snipts = Snipt.objects
2012-04-13 20:30:23 -07:00
if user == request.user or (request.GET.get('api_key') == user.api_key.key):
2012-02-12 21:42:25 -08:00
public = False
2012-02-13 19:36:59 -08:00
favorites = Favorite.objects.filter(user=user).values('snipt')
favorites = [f['snipt'] for f in favorites]
snipts = snipts.filter(Q(user=user) | Q(pk__in=favorites))
2012-04-12 19:04:37 -07:00
tags = tags.filter(Q(snipt__user=user) | Q(snipt__pk__in=favorites))
2011-10-12 13:34:01 -07:00
else:
tags = tags.filter(snipt__user=user, snipt__public=True)
snipts = snipts.filter(user=user, public=True)
2012-02-12 21:42:25 -08:00
public = True
2011-10-12 13:34:01 -07:00
tags = tags.annotate(count=Count('taggit_taggeditem_items__id'))
2012-04-29 07:55:06 -07:00
tags = tags.order_by('name')
2011-10-12 13:34:01 -07:00
snipts = snipts.order_by('-created')
2011-10-10 21:13:18 -07:00
2012-01-16 15:47:09 -08:00
if tag_slug:
2012-03-10 18:52:46 -08:00
snipts = snipts.filter(tags__slug__in=[tag_slug])
tag = get_object_or_404(Tag, slug=tag_slug)
else:
tag = None
2012-04-13 20:30:23 -07:00
context = {
'has_snipts': True,
2012-02-12 21:42:25 -08:00
'public': public,
2012-04-13 13:26:58 -07:00
'public_user': (public and user),
2011-10-10 21:13:18 -07:00
'snipts': snipts,
'tags': tags,
2012-03-10 18:52:46 -08:00
'tag': tag,
2011-10-12 13:34:01 -07:00
'user': user,
2011-10-10 20:30:56 -07:00
}
2012-01-16 15:04:24 -08:00
2012-04-13 20:30:23 -07:00
if 'rss' in request.GET:
context['snipts'] = context['snipts'][:20]
return rss(request, context)
return context
def raw(request, snipt_key):
snipt = get_object_or_404(Snipt, key=snipt_key)
2012-05-10 18:46:20 -07:00
if snipt.lexer != 'js' or not snipt.user.is_staff:
return HttpResponseBadRequest()
return render_to_response('snipts/raw.html',
{'snipt': snipt},
context_instance=RequestContext(request),
mimetype='text/javascript')
2012-04-13 20:30:23 -07:00
def rss(request, context):
return render_to_response(
'rss.xml',
context,
context_instance=RequestContext(request),
mimetype="application/rss+xml"
)
2012-04-22 20:51:52 -07:00
def search(request, template='search/search.html', load_all=True, form_class=ModelSearchForm, searchqueryset=None, context_class=RequestContext, extra_context=None, results_per_page=None):
query = ''
results = EmptySearchQuerySet()
if request.GET.get('q'):
searchqueryset = SearchQuerySet().filter(Q(public=True) | Q(author=request.user)).order_by('-pub_date')
form = ModelSearchForm(request.GET, searchqueryset=searchqueryset, load_all=load_all)
if form.is_valid():
query = form.cleaned_data['q']
results = form.search()
else:
form = form_class(searchqueryset=searchqueryset, load_all=load_all)
paginator = Paginator(results, results_per_page or RESULTS_PER_PAGE)
try:
page = paginator.page(int(request.GET.get('page', 1)))
except InvalidPage:
raise Http404("No such page of results!")
context = {
'form': form,
'page': page,
'paginator': paginator,
'query': query,
'suggestion': None,
}
if results.query.backend.include_spelling:
context['suggestion'] = form.get_suggestion()
if extra_context:
context.update(extra_context)
return render_to_response(template, context, context_instance=context_class(request))
2012-05-15 17:10:50 -07:00