1 # -*- coding: utf-8 -*-
 
   2 from django.template import RequestContext
 
   3 from django.shortcuts import render_to_response, get_object_or_404
 
   4 from django.http import HttpResponse, HttpResponseRedirect, Http404
 
   5 from django.core.urlresolvers import reverse
 
   6 from django.db.models import Q
 
   7 from django.contrib.auth.decorators import login_required
 
   8 from django.utils.datastructures import SortedDict
 
   9 from django.views.decorators.http import require_POST
 
  10 from django.contrib import auth
 
  11 from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
 
  12 from django.utils import simplejson
 
  13 from django.utils.functional import Promise
 
  14 from django.utils.encoding import force_unicode
 
  16 from catalogue import models
 
  17 from catalogue import forms
 
  18 from catalogue.utils import split_tags
 
  19 from newtagging import views as newtagging_views
 
  22 class LazyEncoder(simplejson.JSONEncoder):
 
  23     def default(self, obj):
 
  24         if isinstance(obj, Promise):
 
  25             return force_unicode(obj)
 
  30     query = request.GET.get('q', '')
 
  31     tags = request.GET.get('tags', '')
 
  36         tag_list = models.Tag.get_tag_list(tags)
 
  37         tag = models.Tag.objects.get(name=query)
 
  38     except models.Tag.DoesNotExist:
 
  40             book = models.Book.objects.get(title=query)
 
  41             return HttpResponseRedirect(book.get_absolute_url())
 
  42         except models.Book.DoesNotExist:
 
  43             return HttpResponseRedirect(reverse('catalogue.views.main_page'))
 
  46         return HttpResponseRedirect(reverse('catalogue.views.tagged_object_list', 
 
  47             kwargs={'tags': '/'.join(tag.slug for tag in tag_list)}
 
  51 def tags_starting_with(request):
 
  53         prefix = request.GET['q']
 
  57         books = models.Book.objects.filter(title__icontains=prefix)
 
  58         tags = models.Tag.objects.filter(name__icontains=prefix)
 
  59         if request.user.is_authenticated():
 
  60             tags = tags.filter(~Q(category='set') | Q(user=request.user))
 
  62             tags = tags.filter(~Q(category='set'))
 
  64         completions = [book.title for book in books] + [tag.name for tag in tags]
 
  66         return HttpResponse('\n'.join(completions))    
 
  69         return HttpResponse('')
 
  72 def main_page(request):    
 
  73     if request.user.is_authenticated():
 
  74         shelves = models.Tag.objects.filter(category='set', user=request.user)
 
  75         new_set_form = forms.NewSetForm()
 
  76     extra_where = 'NOT catalogue_tag.category = "set"'
 
  77     tags = models.Tag.objects.usage_for_model(models.Book, counts=True, extra={'where': [extra_where]})
 
  78     fragment_tags = models.Tag.objects.usage_for_model(models.Fragment, counts=True,
 
  79         extra={'where': ['catalogue_tag.category = "theme"'] + [extra_where]})
 
  80     categories = split_tags(tags)
 
  82     form = forms.SearchForm()
 
  83     return render_to_response('catalogue/main_page.html', locals(),
 
  84         context_instance=RequestContext(request))
 
  87 def book_list(request):
 
  88     books = models.Book.objects.all()
 
  89     form = forms.SearchForm()
 
  91     books_by_first_letter = SortedDict()
 
  93         books_by_first_letter.setdefault(book.title[0], []).append(book)
 
  95     return render_to_response('catalogue/book_list.html', locals(),
 
  96         context_instance=RequestContext(request))
 
  99 def tagged_object_list(request, tags=''):
 
 101         tags = models.Tag.get_tag_list(tags)
 
 102     except models.Tag.DoesNotExist:
 
 106     theme_is_set = any(tag.category == 'theme' for tag in tags)
 
 108         model = models.Fragment
 
 110     extra_where = 'NOT catalogue_tag.category = "set"'
 
 111     related_tags = models.Tag.objects.related_for_model(tags, model, counts=True, extra={'where': [extra_where]})
 
 112     categories = split_tags(related_tags)
 
 114     return newtagging_views.tagged_object_list(
 
 116         tag_model=models.Tag,
 
 117         queryset_or_model=model,
 
 119         template_name='catalogue/tagged_object_list.html',
 
 120         extra_context = {'categories': categories },
 
 124 def book_detail(request, slug):
 
 125     book = get_object_or_404(models.Book, slug=slug)
 
 126     tags = list(book.tags.filter(~Q(category='set')))
 
 127     categories = split_tags(tags)
 
 129     form = forms.SearchForm()
 
 130     return render_to_response('catalogue/book_detail.html', locals(),
 
 131         context_instance=RequestContext(request))
 
 134 def logout_then_redirect(request):
 
 136     return HttpResponseRedirect(request.GET.get('next', '/'))
 
 140 def register(request):
 
 141     registration_form = UserCreationForm(request.POST, prefix='registration')
 
 142     if registration_form.is_valid():
 
 143         user = registration_form.save()
 
 144         user = auth.authenticate(
 
 145             username=registration_form.cleaned_data['username'], 
 
 146             password=registration_form.cleaned_data['password1']
 
 148         auth.login(request, user)
 
 149         response_data = {'success': True, 'errors': {}}
 
 151         response_data = {'success': False, 'errors': registration_form.errors}
 
 152     return HttpResponse(LazyEncoder(ensure_ascii=False).encode(response_data))
 
 157     form = AuthenticationForm(data=request.POST, prefix='login')
 
 159         auth.login(request, form.get_user())
 
 160         response_data = {'success': True, 'errors': {}}
 
 162         response_data = {'success': False, 'errors': form.errors}
 
 163     return HttpResponse(LazyEncoder(ensure_ascii=False).encode(response_data))
 
 166 def book_sets(request, slug):
 
 167     book = get_object_or_404(models.Book, slug=slug)
 
 168     user_sets = models.Tag.objects.filter(category='set', user=request.user)
 
 169     book_sets = book.tags.filter(category='set', user=request.user)
 
 171     if not request.user.is_authenticated():
 
 172         return HttpResponse('<p>Aby zarządzać swoimi półkami, musisz się zalogować.</p>')
 
 174     if request.method == 'POST':
 
 175         form = forms.ObjectSetsForm(book, request.user, request.POST)
 
 177             book.tags = ([models.Tag.objects.get(pk=id) for id in form.cleaned_data['set_ids']] +
 
 178                 list(book.tags.filter(~Q(category='set') | ~Q(user=request.user))))
 
 179             if request.is_ajax():
 
 180                 return HttpResponse('<p>Półki zostały zapisane.</p>')
 
 182                 return HttpResponseRedirect('/')
 
 184         form = forms.ObjectSetsForm(book, request.user)
 
 185         new_set_form = forms.NewSetForm()
 
 187     return render_to_response('catalogue/book_sets.html', locals(),
 
 188         context_instance=RequestContext(request))
 
 191 def fragment_sets(request, id):
 
 192     fragment = get_object_or_404(models.Fragment, pk=id)
 
 193     user_sets = models.Tag.objects.filter(category='set', user=request.user)
 
 194     fragment_sets = fragment.tags.filter(category='set', user=request.user)
 
 196     if not request.user.is_authenticated():
 
 197         return HttpResponse('<p>Aby zarządzać swoimi półkami, musisz się zalogować.</p>')
 
 199     if request.method == 'POST':
 
 200         form = forms.ObjectSetsForm(fragment, request.user, request.POST)
 
 202             fragment.tags = ([models.Tag.objects.get(pk=id) for id in form.cleaned_data['set_ids']] +
 
 203                 list(fragment.tags.filter(~Q(category='set') | ~Q(user=request.user))))
 
 204             if request.is_ajax():
 
 205                 return HttpResponse('<p>Półki zostały zapisane.</p>')
 
 207                 return HttpResponseRedirect('/')
 
 209         form = forms.ObjectSetsForm(fragment, request.user)
 
 210         new_set_form = forms.NewSetForm()
 
 212     return render_to_response('catalogue/fragment_sets.html', locals(),
 
 213         context_instance=RequestContext(request))
 
 218 def new_set(request):
 
 219     new_set_form = forms.NewSetForm(request.POST)
 
 220     if new_set_form.is_valid():
 
 221         new_set = new_set_form.save(request.user)
 
 223         if request.is_ajax():
 
 224             return HttpResponse(u'<p>Półka <strong>%s</strong> została utworzona</p>' % new_set)
 
 226             return HttpResponseRedirect('/')
 
 228     return render_to_response('catalogue/book_sets.html', locals(),
 
 229             context_instance=RequestContext(request))
 
 234 def delete_shelf(request, slug):
 
 235     user_set = get_object_or_404(models.Tag, slug=slug, category='set', user=request.user)
 
 238     if request.is_ajax():
 
 239         return HttpResponse(u'<p>Półka <strong>%s</strong> została usunięta</p>' % user_set.name)
 
 241         return HttpResponseRedirect('/')
 
 245 def user_shelves(request):
 
 246     shelves = models.Tag.objects.filter(category='set', user=request.user)
 
 247     new_set_form = forms.NewSetForm()
 
 248     return render_to_response('catalogue/user_shelves.html', locals(),
 
 249             context_instance=RequestContext(request))