snipt/snipts/views.py

377 lines
10 KiB
Python
Raw Permalink Normal View History

2011-10-12 08:29:21 -07:00
from annoying.decorators import render_to
2015-07-24 18:39:25 -07:00
from annoying.functions import get_object_or_None
2012-06-04 17:57:20 -07:00
from blogs.views import blog_list
2012-04-22 20:51:52 -07:00
from django.conf import settings
2015-07-24 18:39:25 -07:00
from django.contrib.auth.models import User
2016-03-31 07:27:56 -07:00
from django.core.mail import send_mail
2015-07-24 18:39:25 -07:00
from django.core.paginator import Paginator, InvalidPage
from django.db.models import Count
2012-02-13 19:36:59 -08:00
from django.db.models import Q
2019-01-23 15:52:55 -08:00
from django.http import (
Http404,
HttpResponse,
HttpResponseBadRequest,
2019-03-13 11:22:01 -07:00
HttpResponseForbidden,
HttpResponseRedirect,
2019-01-23 15:52:55 -08:00
)
2016-11-01 09:59:35 -07:00
from django.shortcuts import get_object_or_404, render
2015-07-24 18:39:25 -07:00
from django.template import RequestContext
2015-10-27 11:08:28 -07:00
from django.views.decorators.cache import never_cache
# from haystack.forms import ModelSearchForm
# from haystack.query import EmptySearchQuerySet, SearchQuerySet
2015-07-24 18:39:25 -07:00
from pygments.lexers import get_lexer_by_name
2016-05-12 08:47:07 -07:00
from snipts.models import Favorite, Snipt, SniptSecureView
2015-07-24 18:39:25 -07:00
from taggit.models import Tag
2015-10-24 17:55:58 -07:00
from teams.models import Team
2012-04-22 20:51:52 -07:00
2016-11-01 11:30:33 -07:00
import os
# RESULTS_PER_PAGE = getattr(settings, "HAYSTACK_SEARCH_RESULTS_PER_PAGE", 20)
2012-04-22 20:51:52 -07:00
2019-01-23 15:52:55 -08:00
@render_to("snipts/detail.html")
2012-05-31 19:32:32 -07:00
def detail(request, username, snipt_slug):
snipt = get_object_or_404(Snipt, user__username=username, slug=snipt_slug)
user = snipt.user
2019-01-23 15:52:55 -08:00
if snipt.lexer != "markdown":
if "linenos" not in snipt.stylized:
2012-07-23 07:09:26 -07:00
snipt.save()
2012-05-31 19:32:32 -07:00
if user != request.user:
if not snipt.public:
2019-01-23 15:52:55 -08:00
if "key" not in request.GET:
2012-05-31 19:32:32 -07:00
raise Http404
else:
2019-01-23 15:52:55 -08:00
if request.GET.get("key") != snipt.key:
2012-05-31 19:32:32 -07:00
raise Http404
2016-05-12 08:47:07 -07:00
if snipt.secure and not request.user.is_authenticated():
raise Http404
2013-10-15 07:23:50 -07:00
snipt.views = snipt.views + 1
snipt.save()
2012-09-17 10:26:54 -07:00
2016-05-12 08:47:07 -07:00
if snipt.secure:
secure_view = SniptSecureView(user=request.user, snipt=snipt)
secure_view.save()
2012-05-31 19:32:32 -07:00
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
2019-01-23 15:52:55 -08:00
tags = tags.annotate(count=Count("taggit_taggeditem_items__id"))
tags = tags.order_by("-count", "name")
2012-05-31 19:32:32 -07:00
return {
2019-01-23 15:52:55 -08:00
"detail": True,
"has_snipts": True,
"public": public,
"snipt": snipt,
"tags": tags,
"user": user,
2012-05-31 19:32:32 -07:00
}
2015-07-24 18:28:31 -07:00
def download(request, snipt_key):
snipt = get_object_or_404(Snipt, key=snipt_key)
2019-01-23 15:52:55 -08:00
return HttpResponse(snipt.code, content_type="application/x-download")
2015-07-24 18:28:31 -07:00
2012-05-31 19:32:32 -07:00
def embed(request, snipt_key):
snipt = get_object_or_404(Snipt, key=snipt_key)
2019-01-23 15:52:55 -08:00
lines = snipt.embedded.split("\n")
return render(
request,
"snipts/embed.html",
{"lines": lines, "snipt": snipt},
content_type="application/javascript",
)
2012-05-31 19:32:32 -07:00
2015-07-24 18:28:31 -07:00
2019-01-23 15:52:55 -08:00
@render_to("snipts/list-user.html")
2013-02-08 18:01:23 -08:00
def blog_posts(request, username):
if request.blog_user:
raise Http404
if request.user.username == username:
public = False
public_user = False
user = request.user
2013-02-13 07:52:08 -08:00
snipts = Snipt.objects.filter(user=request.user, blog_post=True)
2013-02-08 18:01:23 -08:00
tags = Tag.objects.filter(snipt__user=request.user).distinct()
else:
public = True
public_user = True
user = get_object_or_404(User, username=username)
2013-02-13 07:52:08 -08:00
snipts = Snipt.objects.filter(blog_post=True, user=user, public=True)
2019-01-23 15:52:55 -08:00
tags = Tag.objects.filter(snipt__user=user, snipt__public=True).distinct()
2013-02-08 18:01:23 -08:00
2019-01-23 15:52:55 -08:00
tags = tags.order_by("name")
snipts = snipts.order_by("-created")
2013-02-08 18:01:23 -08:00
context = {
2019-01-23 15:52:55 -08:00
"has_snipts": True,
"public": public,
"public_user": public_user,
"snipts": snipts,
"tags": tags,
"user": user,
2013-02-08 18:01:23 -08:00
}
return context
2015-07-24 18:28:31 -07:00
2019-01-23 15:52:55 -08:00
@render_to("snipts/list-user.html")
def favorites(request, username):
if request.user.username != username:
raise Http404
if request.blog_user:
raise Http404
public = False
2019-01-23 15:52:55 -08:00
favorites = Favorite.objects.filter(user=request.user).values("snipt")
favorites = [f["snipt"] for f in favorites]
snipts = Snipt.objects.filter(Q(pk__in=favorites))
tags = Tag.objects.filter(snipt__user=request.user).distinct()
2019-01-23 15:52:55 -08:00
tags = tags.order_by("name")
snipts = snipts.order_by("-created")
context = {
2019-01-23 15:52:55 -08:00
"favorites": favorites,
"has_snipts": True,
"public": public,
"public_user": False,
"snipts": snipts,
"tags": tags,
"user": request.user,
}
return context
2015-07-24 18:28:31 -07:00
2019-01-23 15:52:55 -08: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)
2019-01-23 15:52:55 -08:00
snipts = Snipt.objects.filter(public=True).order_by("-created")
2011-10-12 08:29:21 -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
2019-01-23 15:52:55 -08:00
context = {"has_snipts": True, "public": True, "snipts": snipts, "tag": tag}
2011-10-12 08:29:21 -07:00
2012-04-13 20:30:23 -07:00
return context
2015-07-24 18:28:31 -07:00
2019-01-23 15:52:55 -08: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
2019-01-23 15:52:55 -08:00
if (
user == request.user
or (request.GET.get("api_key") == user.api_key.key)
or (user.profile.is_a_team and user.team.user_is_member(request.user))
):
2015-10-18 07:35:44 -07:00
2012-02-12 21:42:25 -08:00
public = False
2012-02-13 19:36:59 -08:00
2019-01-23 15:52:55 -08:00
favorites = Favorite.objects.filter(user=user).values("snipt")
favorites = [f["snipt"] for f in favorites]
2012-02-13 19:36:59 -08:00
snipts = snipts.filter(Q(user=user) | Q(pk__in=favorites))
2012-04-12 19:04:37 -07:00
tags = tags.filter(snipt__user=user).distinct()
2011-10-12 13:34:01 -07:00
else:
tags = tags.filter(snipt__user=user, snipt__public=True).distinct()
2011-10-12 13:34:01 -07:00
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
2019-01-23 15:52:55 -08:00
tags = tags.order_by("name")
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-07-05 17:07:49 -07:00
if tag is None:
2019-01-23 15:52:55 -08:00
snipts = snipts.exclude(tags__name__in=["tmp"])
2012-07-05 17:07:49 -07:00
2012-04-13 20:30:23 -07:00
context = {
2019-01-23 15:52:55 -08:00
"has_snipts": True,
"public": public,
"public_user": (public and user),
"snipts": snipts,
"tags": tags,
"tag": tag,
"user": user,
"users_for_full_page": ["robertbanh"],
2011-10-10 20:30:56 -07:00
}
2012-01-16 15:04:24 -08:00
2012-04-13 20:30:23 -07:00
return context
2015-07-24 18:28:31 -07:00
def raw(request, snipt_key, lexer=None):
snipt = get_object_or_404(Snipt, key=snipt_key)
if request.user == snipt.user:
if lexer:
2019-01-23 15:52:55 -08:00
lexer = lexer.strip("/")
if lexer != snipt.lexer:
try:
lexer_obj = get_lexer_by_name(lexer)
except:
lexer_obj = None
if lexer_obj:
snipt.lexer = lexer
snipt.save()
2019-01-23 15:52:55 -08:00
content_type = "text/plain"
2019-01-23 15:52:55 -08:00
if "nice" in request.GET:
content_type = "text/html"
2013-03-15 11:58:56 -07:00
2019-01-23 15:52:55 -08:00
return render(
request, "snipts/raw.html", {"snipt": snipt}, content_type=content_type
)
# @never_cache
# 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")
# )
# if request.user.is_authenticated() and "mine-only" in request.GET:
# searchqueryset = (
# SearchQuerySet().filter(author=request.user).order_by("-pub_date")
# )
# elif request.user.is_authenticated() and (
# "author" in request.GET and request.GET.get("author")
# ):
# author = request.GET.get("author")
# if author == request.user.username:
# searchqueryset = (
# SearchQuerySet().filter(author=request.user).order_by("-pub_date")
# )
# else:
# team = get_object_or_None(Team, slug=author)
# if team and team.user_is_member(request.user):
# searchqueryset = (
# SearchQuerySet().filter(author=team).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,
# "has_snipts": True,
# "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(request, template, context)
2012-05-15 17:10:50 -07:00
2013-03-26 10:18:40 -07:00
def redirect_snipt(request, snipt_key, lexer=None):
snipt = get_object_or_404(Snipt, key=snipt_key)
return HttpResponseRedirect(snipt.get_absolute_url())
2019-03-11 13:45:49 -07:00
def report_spam(request, snipt_id):
2019-03-13 11:22:01 -07:00
if not request.user.is_authenticated():
return HttpResponseForbidden()
2019-03-11 13:45:49 -07:00
snipt = get_object_or_404(Snipt, pk=snipt_id)
send_mail('[Snipt] Spam reported',
"""
2019-04-24 06:13:47 -07:00
Snipt: https://snipt.net/admin/snipts/snipt/{}/
User: https://snipt.net/admin/auth/user/{}/delete/
User who reported: https://snipt.net/admin/auth/user/{}/
2019-03-13 11:09:54 -07:00
""".format(snipt.id, snipt.user.id, request.user.id),
2019-04-24 06:13:47 -07:00
'support@snipt.net',
['support@snipt.net'],
2019-03-11 13:45:49 -07:00
fail_silently=False)
return HttpResponse("""Thanks! Your report has been
submitted to the site admins.""")