gremmie@1: """ gremmie@1: Views for the weblinks application. gremmie@1: """ gremmie@1: gremmie@1: import datetime gremmie@1: import random gremmie@1: from django.shortcuts import render_to_response gremmie@1: from django.template import RequestContext gremmie@1: from django.contrib import auth gremmie@1: from django.http import HttpResponseRedirect gremmie@1: from django.contrib.auth.decorators import login_required gremmie@1: from django.shortcuts import get_object_or_404 gremmie@1: from django.core.urlresolvers import reverse gremmie@1: from django.db.models import Q gremmie@1: from django.http import Http404 gremmie@1: gremmie@1: from core.paginator import DiggPaginator gremmie@1: from core.functions import email_admins gremmie@1: from weblinks.models import Category gremmie@1: from weblinks.models import Link gremmie@1: from weblinks.models import FlaggedLink gremmie@1: from weblinks.forms import SearchForm gremmie@1: from weblinks.forms import AddLinkForm gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: LINKS_PER_PAGE = 10 gremmie@1: gremmie@1: def create_paginator(links): gremmie@1: return DiggPaginator(links, LINKS_PER_PAGE, body=5, tail=3, margin=3, padding=2) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: def link_index(request): gremmie@1: categories = Category.objects.all() gremmie@1: total_links = Link.public_objects.all().count() gremmie@1: form = SearchForm() gremmie@1: return render_to_response('weblinks/index.html', { gremmie@1: 'categories': categories, gremmie@1: 'total_links': total_links, gremmie@1: 'search_form': form, gremmie@1: }, gremmie@1: context_instance = RequestContext(request)) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: def new_links(request): gremmie@1: links = Link.public_objects.order_by('-date_added')[:LINKS_PER_PAGE] gremmie@1: return render_to_response('weblinks/link_summary.html', { gremmie@1: 'links': links, gremmie@1: 'title': 'Newest Links', gremmie@1: 'search_form': SearchForm(), gremmie@1: }, gremmie@1: context_instance = RequestContext(request)) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: def popular_links(request): gremmie@1: links = Link.public_objects.order_by('-hits')[:LINKS_PER_PAGE] gremmie@1: return render_to_response('weblinks/link_summary.html', { gremmie@1: 'links': links, gremmie@1: 'title': 'Popular Links', gremmie@1: 'search_form': SearchForm(), gremmie@1: }, gremmie@1: context_instance = RequestContext(request)) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: @login_required gremmie@1: def add_link(request): gremmie@1: if request.method == 'POST': gremmie@1: add_form = AddLinkForm(request.POST) gremmie@1: if add_form.is_valid(): gremmie@1: new_link = add_form.save(commit=False) gremmie@1: new_link.user = request.user gremmie@1: new_link.is_public = False gremmie@1: new_link.save() gremmie@1: email_admins('New link for approval', """Hello, gremmie@1: gremmie@1: A user has added a new link for your approval. gremmie@1: """) gremmie@1: return HttpResponseRedirect(reverse('weblinks.views.add_thanks')) gremmie@1: else: gremmie@1: add_form = AddLinkForm() gremmie@1: gremmie@1: return render_to_response('weblinks/add_link.html', { gremmie@1: 'search_form': SearchForm(), gremmie@1: 'add_form': add_form, gremmie@1: }, gremmie@1: context_instance = RequestContext(request)) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: @login_required gremmie@1: def add_thanks(request): gremmie@1: return render_to_response('weblinks/add_link.html', { gremmie@1: 'search_form': SearchForm(), gremmie@1: }, gremmie@1: context_instance = RequestContext(request)) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: # Maps URL component to database field name for the links table: gremmie@1: gremmie@1: LINK_FIELD_MAP = { gremmie@1: 'title': 'title', gremmie@1: 'date': '-date_added', gremmie@1: 'hits': '-hits' gremmie@1: } gremmie@1: gremmie@1: def view_links(request, category, sort='title', page='1'): gremmie@1: try: gremmie@1: cat = Category.objects.get(pk=category) gremmie@1: except Category.DoesNotExist: gremmie@1: raise Http404 gremmie@1: gremmie@1: if sort in LINK_FIELD_MAP: gremmie@1: order_by = LINK_FIELD_MAP[sort] gremmie@1: else: gremmie@1: sort = 'title' gremmie@1: order_by = LINK_FIELD_MAP['title'] gremmie@1: gremmie@1: links = Link.public_objects.filter(category = category).order_by(order_by) gremmie@1: paginator = create_paginator(links) gremmie@1: try: gremmie@1: the_page = paginator.page(int(page)) gremmie@1: except InvalidPage: gremmie@1: raise Http404 gremmie@1: gremmie@1: return render_to_response('weblinks/view_links.html', { gremmie@1: 's' : sort, gremmie@1: 'category' : cat, gremmie@1: 'page' : the_page, gremmie@1: 'search_form': SearchForm(), gremmie@1: }, gremmie@1: context_instance = RequestContext(request)) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: def _visit_link(request, link): gremmie@1: link.hits += 1 gremmie@1: link.save() gremmie@1: return HttpResponseRedirect(link.url) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: def visit(request, link_id): gremmie@1: link = get_object_or_404(Link, pk = link_id) gremmie@1: return _visit_link(request, link) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: def random_link(request): gremmie@1: ids = Link.public_objects.values_list('id', flat=True) gremmie@1: if not ids: gremmie@1: raise Http404 gremmie@1: id = random.choice(ids) gremmie@1: random_link = Link.public_objects.get(pk=id) gremmie@1: return _visit_link(request, random_link) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: @login_required gremmie@1: def report_link(request, link_id): gremmie@1: link = get_object_or_404(Link, pk = link_id) gremmie@1: if request.method == "POST": gremmie@1: FlaggedLink.objects.create(link, request.user) gremmie@1: email_admins('A Link Has Been Flagged as Broken', """Hello, gremmie@1: gremmie@1: A user has flagged a link as broken. gremmie@1: """) gremmie@1: return HttpResponseRedirect(reverse('weblinks.views.report_thanks', args = (link_id, ))) gremmie@1: gremmie@1: return render_to_response('weblinks/report_link.html', { gremmie@1: 'link': link, gremmie@1: 'search_form': SearchForm(), gremmie@1: 'report_thanks': False, gremmie@1: }, gremmie@1: context_instance = RequestContext(request)) gremmie@1: gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: @login_required gremmie@1: def report_thanks(request, link_id): gremmie@1: link = get_object_or_404(Link, pk = link_id) gremmie@1: return render_to_response('weblinks/report_link.html', { gremmie@1: 'link': link, gremmie@1: 'search_form': SearchForm(), gremmie@1: 'report_thanks': True, gremmie@1: }, gremmie@1: context_instance = RequestContext(request)) gremmie@1: gremmie@1: ####################################################################### gremmie@1: gremmie@1: def search_links(request, page=1): gremmie@1: if request.method == 'POST': gremmie@1: form = SearchForm(request.POST) gremmie@1: if form.is_valid(): gremmie@1: query_text = form.query() gremmie@1: page = 1 gremmie@1: else: gremmie@1: return HttpResponseRedirect(reverse('weblinks.views.link_index')) gremmie@1: else: gremmie@1: if 'query' in request.GET: gremmie@1: query_text = request.GET['query'] gremmie@1: else: gremmie@1: return HttpResponseRedirect(reverse('weblinks.views.link_index')) gremmie@1: gremmie@1: links = Link.public_objects.filter( gremmie@1: Q(title__icontains = query_text) | gremmie@1: Q(description__icontains = query_text)).order_by('title') gremmie@1: paginator = create_paginator(links) gremmie@1: try: gremmie@1: the_page = paginator.page(int(page)) gremmie@1: except EmptyPage: gremmie@1: links = Link.public_objects.none() gremmie@1: except InvalidPage: gremmie@1: raise Http404 gremmie@1: gremmie@1: return render_to_response('weblinks/search_results.html', { gremmie@1: 'query': query_text, gremmie@1: 'page': the_page, gremmie@1: 'search_form': SearchForm(), gremmie@1: }, gremmie@1: context_instance = RequestContext(request))