https
[redakcja.git] / apps / catalogue / views.py
index 1436fc0..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
 import logging
 import os
-from StringIO import StringIO
 from urllib import unquote
 from urlparse import urlsplit, urlunsplit
 
 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.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
 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 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 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
 
 #
 # 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', {
 @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')
 
 
 @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.method == "POST":
         form = forms.DocumentCreateForm(request.POST, request.FILES)
         if form.is_valid():
-            
+
             if request.user.is_authenticated():
                 creator = request.user
             else:
             if request.user.is_authenticated():
                 creator = request.user
             else:
@@ -114,12 +114,11 @@ def create_missing(request, slug=None):
                 gallery=form.cleaned_data['gallery'],
             )
 
                 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(),
     else:
         form = forms.DocumentCreateForm(initial={
                 "slug": slug,
                 "title": slug.replace('-', ' ').title(),
-                "gallery": slug,
         })
 
     return render(request, "catalogue/document_create_missing.html", {
         })
 
     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():
     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
 
             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:
                     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.')))
                         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.")
 
     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 ''
     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)
 
     # 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))
 
 
         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
     # 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
 
 
 @never_cache
@@ -331,7 +330,8 @@ def chunk_add(request, slug, chunk):
                 creator = request.user
             else:
                 creator = None
                 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'],
                 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)
 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
 
 
 @transaction.commit_on_success
+@login_required
 def chunk_mass_edit(request):
     if request.method == 'POST':
 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)
         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)
         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
                 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)
 
         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
                 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:
 
         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 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:
 
         return HttpResponse("", content_type="text/plain")
     else:
@@ -466,28 +482,58 @@ def publish(request, slug):
         return HttpResponseForbidden("Not authorized.")
 
     try:
         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 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())
 
 
         return http.HttpResponse(e)
     else:
         return http.HttpResponseRedirect(book.get_absolute_url())
 
 
-class GalleryView(UploadView):
-    def get_object(self, request, 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
 
         book = get_object_or_404(Book, slug=slug)
         if not book.gallery:
             raise Http404
         return book
 
+
+class GalleryView(GalleryMixin, UploadView):
+
     def breadcrumbs(self):
         return [
     def breadcrumbs(self):
         return [
-            (_('books'), reverse('catalogue_document_list')),
+            (u'moduły', reverse('catalogue_document_list')),
             (self.object.title, self.object.get_absolute_url()),
             (self.object.title, self.object.get_absolute_url()),
-            (_('scan gallery'),),
+            (u'materiały',),
         ]
 
         ]
 
-    def get_directory(self):
-        return "%s%s/" % (settings.IMAGE_DIR, self.object.gallery)
+
+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}