minor cleanup
[redakcja.git] / apps / catalogue / views.py
index a397830..3bee910 100644 (file)
@@ -1,7 +1,7 @@
-from datetime import datetime, date, timedelta
+# -*- coding: utf-8 -*-
+from datetime import date, timedelta
 import logging
 import os
-from StringIO import StringIO
 from urllib import unquote
 from urlparse import urlsplit, urlunsplit
 
@@ -10,7 +10,7 @@ from django.contrib import auth
 from django.contrib.auth.models import User
 from django.contrib.auth.decorators import login_required, permission_required
 from django.core.urlresolvers import reverse
-from django.db.models import Count, Q
+from django.db.models import Count
 from django.db import transaction
 from django import http
 from django.http import Http404, HttpResponse, HttpResponseForbidden
@@ -21,12 +21,12 @@ from django.utils.translation import ugettext_lazy as _
 from django.views.decorators.http import require_POST
 from django.template import RequestContext
 
-from apiclient import NotAuthorizedError
+from apiclient import NotAuthorizedError, ApiError
 from catalogue import forms
 from catalogue import helpers
-from catalogue.helpers import active_tab
-from catalogue.models import Book, Chunk, BookPublishRecord, ChunkPublishRecord
-from fileupload.views import UploadView
+from catalogue.helpers import active_tab, ajax
+from catalogue.models import Book, Chunk, Project
+from fileupload.views import UploadView, PackageView
 
 #
 # Quick hack around caching problems, TODO: use ETags
@@ -53,11 +53,11 @@ def user(request, username):
 @never_cache
 def my(request):
     return render(request, 'catalogue/my_page.html', {
-        'last_books': sorted(request.session.get("wiki_last_books", {}).items(),
-                        key=lambda x: x[1]['time'], reverse=True),
-
-        "logout_to": '/',
-        })
+        'last_books': sorted(
+            request.session.get("wiki_last_books", {}).items(),
+            key=lambda x: x[1]['time'], reverse=True),
+        'logout_to': '/',
+    })
 
 
 @active_tab('users')
@@ -101,7 +101,7 @@ def create_missing(request, slug=None):
     if request.method == "POST":
         form = forms.DocumentCreateForm(request.POST, request.FILES)
         if form.is_valid():
-            
+
             if request.user.is_authenticated():
                 creator = request.user
             else:
@@ -114,12 +114,11 @@ def create_missing(request, slug=None):
                 gallery=form.cleaned_data['gallery'],
             )
 
-            return http.HttpResponseRedirect(reverse("catalogue_book", args=[book.slug]))
+            return http.HttpResponseRedirect(reverse("wiki_editor", args=[book.slug]))
     else:
         form = forms.DocumentCreateForm(initial={
                 "slug": slug,
                 "title": slug.replace('-', ' ').title(),
-                "gallery": slug,
         })
 
     return render(request, "catalogue/document_create_missing.html", {
@@ -136,7 +135,7 @@ def upload(request):
     if request.method == "POST":
         form = forms.DocumentsUploadForm(request.POST, request.FILES)
         if form.is_valid():
-            import slughifi
+            from slughifi import slughifi
 
             if request.user.is_authenticated():
                 creator = request.user
@@ -162,7 +161,7 @@ def upload(request):
                     error_list.append((filename, slug, _('Slug already used in repository.')))
                 else:
                     try:
-                        zip.read(filename).decode('utf-8') # test read
+                        zip.read(filename).decode('utf-8')  # test read
                         ok_list.append((filename, slug, title))
                     except UnicodeDecodeError:
                         error_list.append((filename, title, _('File should be UTF-8 encoded.')))
@@ -226,7 +225,7 @@ def book_html(request, slug):
     if not book.accessible(request):
         return HttpResponseForbidden("Not authorized.")
 
-    doc = book.wldocument(parse_dublincore=False)
+    doc = book.wldocument()
     html = doc.as_html()
 
     html = html.get_string() if html is not None else ''
@@ -239,7 +238,8 @@ def book_html(request, slug):
 
     # book_themes = book_themes.items()
     # book_themes.sort(key=lambda s: s[0].sort_key)
-    return render_to_response('catalogue/book_text.html', locals(),
+    return render_to_response(
+        'catalogue/book_text.html', locals(),
         context_instance=RequestContext(request))
 
 
@@ -254,8 +254,7 @@ def book_pdf(request, slug):
     # TODO: error handling
     pdf_file = doc.as_pdf()
     from catalogue.ebook_utils import serve_file
-    return serve_file(pdf_file.get_filename(),
-                book.slug + '.pdf', 'application/pdf')
+    return serve_file(pdf_file.get_filename(), book.slug + '.pdf', 'application/pdf')
 
 
 @never_cache
@@ -331,7 +330,8 @@ def chunk_add(request, slug, chunk):
                 creator = request.user
             else:
                 creator = None
-            doc.split(creator=creator,
+            doc.split(
+                creator=creator,
                 slug=form.cleaned_data['slug'],
                 title=form.cleaned_data['title'],
                 gallery_start=form.cleaned_data['gallery_start'],
@@ -352,6 +352,7 @@ def chunk_add(request, slug, chunk):
     })
 
 
+@login_required
 def chunk_edit(request, slug, chunk):
     try:
         doc = Chunk.get(slug, chunk)
@@ -389,19 +390,21 @@ def chunk_edit(request, slug, chunk):
 
 
 @transaction.commit_on_success
+@login_required
 def chunk_mass_edit(request):
     if request.method == 'POST':
-        ids = map(int, filter(lambda i: i.strip()!='', request.POST.get('ids').split(',')))
+        ids = map(int, filter(lambda i: i.strip() != '', request.POST.get('ids').split(',')))
         chunks = map(lambda i: Chunk.objects.get(id=i), ids)
-        
+
         stage = request.POST.get('stage')
         if stage:
             try:
                 stage = Chunk.tag_model.objects.get(slug=stage)
-            except Chunk.DoesNotExist, e:
+            except Chunk.DoesNotExist:
                 stage = None
-           
-            for c in chunks: c.stage = stage
+
+            for c in chunks:
+                c.stage = stage
 
         username = request.POST.get('user')
         logger.info("username: %s" % username)
@@ -411,8 +414,9 @@ def chunk_mass_edit(request):
                 user = User.objects.get(username=username)
             except User.DoesNotExist, e:
                 user = None
-                
-            for c in chunks: c.user = user
+
+            for c in chunks:
+                c.user = user
 
         status = request.POST.get('status')
         if status:
@@ -429,7 +433,19 @@ def chunk_mass_edit(request):
             for b in books_affected:
                 b.touch()  # cache
 
-        for c in chunks: c.save()
+        project_id = request.POST.get('project')
+        if project_id:
+            try:
+                project = Project.objects.get(pk=int(project_id))
+            except (Project.DoesNotExist, ValueError), e:
+                project = None
+            for c in chunks:
+                book = c.book
+                book.project = project
+                book.save()
+
+        for c in chunks:
+            c.save()
 
         return HttpResponse("", content_type="text/plain")
     else:
@@ -466,19 +482,58 @@ def publish(request, slug):
         return HttpResponseForbidden("Not authorized.")
 
     try:
-        book.publish(request.user)
+        protocol = 'https://' if request.is_secure() else 'http://'
+        book.publish(request.user, host=protocol + request.get_host())
     except NotAuthorizedError:
         return http.HttpResponseRedirect(reverse('apiclient_oauth'))
-    except BaseException, e:
+    except ApiError, e:
         return http.HttpResponse(e)
     else:
         return http.HttpResponseRedirect(book.get_absolute_url())
 
 
-class GalleryView(UploadView):
-    def get_object(self, request, slug):
-        return get_object_or_404(Book, slug=slug)
-
+class GalleryMixin(object):
     def get_directory(self):
         return "%s%s/" % (settings.IMAGE_DIR, self.object.gallery)
 
+    @staticmethod
+    def get_object(request, slug):
+        book = get_object_or_404(Book, slug=slug)
+        if not book.gallery:
+            raise Http404
+        return book
+
+
+class GalleryView(GalleryMixin, UploadView):
+
+    def breadcrumbs(self):
+        return [
+            (u'moduły', reverse('catalogue_document_list')),
+            (self.object.title, self.object.get_absolute_url()),
+            (u'materiały',),
+        ]
+
+
+class GalleryPackageView(GalleryMixin, PackageView):
+
+    def get_redirect_url(self, slug):
+        return reverse('catalogue_book_gallery', kwargs={'slug': slug})
+
+
+@ajax(method='get')
+def lessons_for_cybernauts(request):
+    books = Book.objects.filter(for_cybernauts=True)
+    data = []
+    for book in books:
+        try:
+            changes = book.get_current_changes()
+            time_changed = max(change.created_at for change in changes)
+            xml_url = reverse('catalogue_book_xml', args=[book.slug])
+            data.append({
+                'slug': book.slug,
+                'url': xml_url,
+                'time_changed': time_changed.isoformat(),
+            })
+        except Book.NoTextError:
+            pass
+    return {'lessons': data}