Exemplo n.º 1
0
def add_book(request):
    from booki.utils.book import createBook

    if request.method == "POST":
        frm = NewBookForm(request.POST, request.FILES)

        if request.POST["submit"] == _("Cancel"):
            return HttpResponseRedirect(reverse("control_books"))

        if frm.is_valid():
            try:
                book = createBook(frm.cleaned_data["owner"], frm.cleaned_data["title"])
                book.license = frm.cleaned_data["license"]
                book.description = frm.cleaned_data["description"]
                book.is_hidden = frm.cleaned_data["is_hidden"]
                book.save()

                if request.FILES.has_key("cover"):
                    from booki.utils import misc
                    import os

                    try:
                        fh, fname = misc.saveUploadedAsFile(request.FILES["cover"])

                        book.setCover(fname)
                        os.unlink(fname)
                    except:
                        pass

                book.save()

                messages.success(request, _("Successfuly created new book."))

                return HttpResponseRedirect(reverse("control_books"))
            except:
                messages.warning(request, _("Unknown error while creating new book."))

    else:
        frm = NewBookForm()

    return render_to_response(
        "booktypecontrol/add_book.html",
        {"request": request, "admin_options": ADMIN_OPTIONS, "form": frm},
        context_instance=RequestContext(request),
    )
Exemplo n.º 2
0
def create_book(request, username):
    """
    Django View. Show content for Create Book dialog and creates book.

    @type request: C{django.http.HttpRequest}
    @param request: Django Request
    @type username: C{string}
    @param username: Username.
    """

    from django.contrib.auth.models import User
    from booki.utils.misc import isBookLimitReached

    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        try:
            resp = pages.ErrorPage(request, "errors/user_does_not_exist.html",
                                   {"username": username})
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()

        return resp

    if isBookLimitReached() or not request.user.is_authenticated():
        try:
            resp = pages.ErrorPage(request, "errors/no_permissions.html")
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()

        return resp

    from booki.utils.book import checkBookAvailability, createBook
    from booki.editor import models

    book_visible = config.getConfiguration('CREATE_BOOK_VISIBLE')
    book_license = config.getConfiguration('CREATE_BOOK_LICENSE')
    admin_create = config.getConfiguration('ADMIN_CREATE_BOOKS')

    if request.user.is_superuser:
        admin_create = False

    if request.GET.get("q", "") == "check":
        from booki.utils.json_wrapper import json

        data = {
            "available":
            checkBookAvailability(request.GET.get('bookname', '').strip())
        }

        try:
            resp = HttpResponse(json.dumps(data), "text/plain")
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()

        return resp

    if request.method == 'POST' and admin_create == False:
        book = None
        try:
            # hidden on
            # description
            # license
            # title
            # cover

            book = createBook(request.user, request.POST.get('title'))

            lic = models.License.objects.get(
                abbrevation=request.POST.get('license'))
            book.license = lic
            book.description = request.POST.get('description', '')

            if request.POST.get("hidden", "") == "on":
                is_hidden = True
            else:
                is_hidden = False
            book.hidden = is_hidden

            from django.core.files import File

            if request.FILES.has_key('cover'):
                # TODO: Show some kind of error message to the user
                from booki.utils import misc
                import os

                try:
                    fh, fname = misc.saveUploadedAsFile(request.FILES['cover'])
                    book.setCover(fname)
                    os.unlink(fname)
                except:
                    pass

            book.save()

        except:
            transaction.rollback()
        else:
            transaction.commit()

        try:
            resp = render_to_response('account/create_book_redirect.html', {
                "request": request,
                "user": user,
                "book": book
            })
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()

        return resp

    from booki.editor.models import License

    licenses = License.objects.all().order_by('name')

    try:
        resp = render_to_response(
            'account/create_book.html', {
                "request": request,
                "book_visible": book_visible,
                "book_license": book_license,
                "admin_create": admin_create,
                "licenses": licenses,
                "user": user
            })
    except:
        transaction.rollback()
        raise
    else:
        transaction.commit()

    return resp
Exemplo n.º 3
0
def importBookFromFile(user, zname, createTOC=False, **extraOptions):
    """Create a new book from a bookizip filename"""

    from booki.utils.log import logChapterHistory

    # unzip it
    zf = zipfile.ZipFile(zname)
    # load info.json
    info = json.loads(zf.read("info.json"))
    logWarning("Loaded json file %r" % info)

    metadata = info["metadata"]
    manifest = info["manifest"]
    TOC = info["TOC"]

    if extraOptions.get("book_title", None):
        bookTitle = extraOptions["book_title"]
    else:
        bookTitle = get_metadata(metadata, "title", ns=DC)[0]

    bookTitle = makeTitleUnique(bookTitle)
    logWarning("Chose unique book title %r" % bookTitle)

    if extraOptions.get("book_url", None):
        bookURL = extraOptions["book_url"]
    else:
        bookURL = None

    book = createBook(user, bookTitle, status="new", bookURL=bookURL)

    if extraOptions.get("hidden"):
        book.hidden = True
        book.save()

    # this is for Table of Contents
    p = re.compile('\ssrc="(.*)"')

    # what if it does not have status "new"
    stat = models.BookStatus.objects.filter(book=book, name="new")[0]

    chapters = getChaptersFromTOC(TOC)
    n = len(chapters) + 1  # is +1 necessary?
    now = datetime.datetime.now()

    for chapterName, chapterFile, is_section in chapters:
        urlName = bookiSlugify(chapterName)

        if is_section:  # create section
            if createTOC:
                c = models.BookToc(book=book, version=book.version, name=chapterName, chapter=None, weight=n, typeof=2)
                c.save()
                n -= 1
        else:  # create chapter
            # check if i can open this file at all
            content = zf.read(chapterFile)

            # content = p.sub(r' src="../\1"', content)

            chapter = models.Chapter(
                book=book,
                version=book.version,
                url_title=urlName,
                title=chapterName,
                status=stat,
                content=content,
                created=now,
                modified=now,
            )
            chapter.save()

            history = logChapterHistory(
                chapter=chapter, content=content, user=user, comment="", revision=chapter.revision
            )

            if createTOC:
                c = models.BookToc(
                    book=book, version=book.version, name=chapterName, chapter=chapter, weight=n, typeof=1
                )
                c.save()
                n -= 1

    stat = models.BookStatus.objects.filter(book=book, name="new")[0]

    from django.core.files import File

    for item in manifest.values():
        if item["mimetype"] != "text/html":
            attachmentName = item["url"]

            if attachmentName.startswith("static/"):
                att = models.Attachment(book=book, version=book.version, status=stat)

                s = zf.read(attachmentName)
                f = StringIO(s)
                f2 = File(f)
                f2.size = len(s)
                att.attachment.save(os.path.basename(attachmentName), f2, save=False)
                att.save()
                f.close()

    # metadata
    for namespace in metadata:
        # namespace is something like "http://purl.org/dc/elements/1.1/" or ""
        # in the former case, preepend it to the name, in {}.
        ns = "{%s}" % namespace if namespace else ""
        for keyword, schemes in metadata[namespace].iteritems():
            for scheme, values in schemes.iteritems():
                # schema, if it is set, describes the value's format.
                # for example, an identifier might be an ISBN.
                sc = "{%s}" % scheme if scheme else ""
                key = "%s%s%s" % (ns, keyword, sc)
                for v in values:
                    if not v:
                        continue
                    try:
                        info = models.Info(book=book, name=key)
                        if len(v) >= 2500:
                            info.value_text = v
                            info.kind = 2
                        else:
                            info.value_string = v
                            info.kind = 0
                        info.save()
                    except:
                        # For now just ignore any kind of error here.
                        # Considering we don't handle metadata as we
                        # should it is not such a problem.
                        pass

    zf.close()

    return book
Exemplo n.º 4
0
def importBookFromFile(user, zname, createTOC=False, **extraOptions):
    """Create a new book from a bookizip filename"""

    from booki.utils.log import logChapterHistory

    # unzip it
    zf = zipfile.ZipFile(zname)
    # load info.json
    info = json.loads(zf.read('info.json'))
    logWarning("Loaded json file %r" % info)

    metadata = info['metadata']
    manifest = info['manifest']
    TOC = info['TOC']

    if extraOptions.get('book_title', None):
        bookTitle = extraOptions['book_title']
    else:
        bookTitle = get_metadata(metadata, 'title', ns=DC)[0]

    bookTitle = makeTitleUnique(bookTitle)
    logWarning("Chose unique book title %r" % bookTitle)

    if extraOptions.get('book_url', None):
        bookURL = extraOptions['book_url']
    else:
        bookURL = None

    book = createBook(user, bookTitle, status="new", bookURL=bookURL)

    if extraOptions.get("hidden"):
        book.hidden = True
        book.save()

    # this is for Table of Contents
    p = re.compile('\ssrc="(.*)"')

    # what if it does not have status "new"
    stat = models.BookStatus.objects.filter(book=book, name="new")[0]

    chapters = getChaptersFromTOC(TOC)
    n = len(chapters) + 1  #is +1 necessary?
    now = datetime.datetime.now()

    for chapterName, chapterFile, is_section in chapters:
        urlName = bookiSlugify(chapterName)

        if is_section:  # create section
            if createTOC:
                c = models.BookToc(book=book,
                                   version=book.version,
                                   name=chapterName,
                                   chapter=None,
                                   weight=n,
                                   typeof=2)
                c.save()
                n -= 1
        else:  # create chapter
            # check if i can open this file at all
            content = zf.read(chapterFile)

            #content = p.sub(r' src="../\1"', content)

            chapter = models.Chapter(book=book,
                                     version=book.version,
                                     url_title=urlName,
                                     title=chapterName,
                                     status=stat,
                                     content=content,
                                     created=now,
                                     modified=now)
            chapter.save()

            history = logChapterHistory(chapter=chapter,
                                        content=content,
                                        user=user,
                                        comment="",
                                        revision=chapter.revision)

            if createTOC:
                c = models.BookToc(book=book,
                                   version=book.version,
                                   name=chapterName,
                                   chapter=chapter,
                                   weight=n,
                                   typeof=1)
                c.save()
                n -= 1

    stat = models.BookStatus.objects.filter(book=book, name="new")[0]

    from django.core.files import File

    for item in manifest.values():
        if item["mimetype"] != 'text/html':
            attachmentName = item['url']

            if attachmentName.startswith("static/"):
                att = models.Attachment(book=book,
                                        version=book.version,
                                        status=stat)

                s = zf.read(attachmentName)
                f = StringIO(s)
                f2 = File(f)
                f2.size = len(s)
                att.attachment.save(os.path.basename(attachmentName),
                                    f2,
                                    save=False)
                att.save()
                f.close()

    # metadata
    for namespace in metadata:
        # namespace is something like "http://purl.org/dc/elements/1.1/" or ""
        # in the former case, preepend it to the name, in {}.
        ns = ('{%s}' % namespace if namespace else '')
        for keyword, schemes in metadata[namespace].iteritems():
            for scheme, values in schemes.iteritems():
                #schema, if it is set, describes the value's format.
                #for example, an identifier might be an ISBN.
                sc = ('{%s}' % scheme if scheme else '')
                key = "%s%s%s" % (ns, keyword, sc)
                for v in values:
                    if not v: continue
                    try:
                        info = models.Info(book=book, name=key)
                        if len(v) >= 2500:
                            info.value_text = v
                            info.kind = 2
                        else:
                            info.value_string = v
                            info.kind = 0
                        info.save()
                    except:
                        # For now just ignore any kind of error here.
                        # Considering we don't handle metadata as we
                        # should it is not such a problem.
                        pass

    zf.close()

    return book
Exemplo n.º 5
0
def create_book(request, username):
    """
    Django View. Show content for Create Book dialog and creates book.

    @type request: C{django.http.HttpRequest}
    @param request: Django Request
    @type username: C{string}
    @param username: Username.
    """

    from django.contrib.auth.models import User

    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        try:
            return pages.ErrorPage(request, "errors/user_does_not_exist.html", {"username": username})
        except:
            transaction.rollback()
        finally:
            transaction.commit()    

    if not request.user.is_authenticated():
        try:
            return pages.ErrorPage(request, "errors/no_permissions.html")
        except:
            transaction.rollback()
        finally:
            transaction.commit()    


    from booki.utils.book import checkBookAvailability, createBook
    from booki.editor import models

    if request.GET.get("q", "") == "check":
        from booki.utils.json_wrapper import json

        data = {"available": checkBookAvailability(request.GET.get('bookname', '').strip())}

        try:
            return HttpResponse(json.dumps(data), "text/plain")
        except:
            transaction.rollback()
        finally:
            transaction.commit()    

    if request.method == 'POST':
        book = None
        try:
            # hidden on
            # description
            # license
            # title
            # cover

            book = createBook(request.user, request.POST.get('title'))

            lic = models.License.objects.get(abbrevation=request.POST.get('license'))
            book.license = lic
            book.description = request.POST.get('description', '')

            if request.POST.get("hidden", "") == "on":
                is_hidden = True
            else:
                is_hidden = False
            book.hidden = is_hidden
            
            from django.core.files import File

            if request.FILES.has_key('cover'):
                import tempfile
                import os

                fh, fname = tempfile.mkstemp(suffix='', prefix='cover')
                
                f = open(fname, 'wb')
                for chunk in request.FILES['cover'].chunks():
                    f.write(chunk)
                f.close()


                try:
                    import Image
                    
                    im = Image.open(fname)
                    im.thumbnail((240, 240), Image.ANTIALIAS)
                    imageName = '%s.jpg' % fname
                    im.save(imageName)
                    
                    book.cover.save('%s.jpg' % book.url_title, File(file(imageName)))
                except:
                    pass

                os.unlink(fname)

            book.save()
                
        except:
            transaction.rollback()
        else:
            transaction.commit()
        try:
            return render_to_response('account/create_book_redirect.html', {"request": request,
                                                                            "user": user,
                                                                            "book": book})
        except:
            transaction.rollback()
        finally:
            transaction.commit()    
        
    from booki.editor.models import License
    
    licenses = License.objects.all().order_by('name')

    try:
        return render_to_response('account/create_book.html', {"request": request,
                                                               "licenses": licenses,
                                                               "user": user})
    except:
        transaction.rollback()
    finally:
        transaction.commit()    
Exemplo n.º 6
0
def importBookFromFile(user, zname, createTOC=False, **extraOptions):
    """Create a new book from a bookizip filename"""
    # unzip it
    zf = zipfile.ZipFile(zname)
    # load info.json
    info = json.loads(zf.read('info.json'))
    logWarning("Loaded json file %r" % info)

    metadata = info['metadata']
    manifest = info['manifest']
    TOC =      info['TOC']

    if extraOptions.get('book_title', None):
        bookTitle = extraOptions['book_title']
    else:
        bookTitle = get_metadata(metadata, 'title', ns=DC)[0]
    
    bookTitle = makeTitleUnique(bookTitle)

    if extraOptions.get('book_url', None):
        bookURL = extraOptions['book_url']
    else:
        bookURL = None

    book = createBook(user, bookTitle, status = "imported", bookURL = bookURL)

    # this is for Table of Contents
    p = re.compile('\ssrc="(.*)"')

    # what if it does not have status "imported"
    stat = models.BookStatus.objects.filter(book=book, name="imported")[0]

    chapters = getChaptersFromTOC(TOC)
    n = len(chapters) + 1 #is +1 necessary?
    now = datetime.datetime.now()

    for chapterName, chapterFile, is_section in chapters:
        urlName = slugify(chapterName)

        if is_section: # create section
            if createTOC:
                c = models.BookToc(book = book,
                                   version = book.version,
                                   name = chapterName,
                                   chapter = None,
                                   weight = n,
                                   typeof = 2)
                c.save()
                n -= 1
        else: # create chapter
            # check if i can open this file at all
            content = zf.read(chapterFile)

            #content = p.sub(r' src="../\1"', content)

            chapter = models.Chapter(book = book,
                                     version = book.version,
                                     url_title = urlName,
                                     title = chapterName,
                                     status = stat,
                                     content = content,
                                     created = now,
                                     modified = now)
            chapter.save()

            if createTOC:
                c = models.BookToc(book = book,
                                   version = book.version,
                                   name = chapterName,
                                   chapter = chapter,
                                   weight = n,
                                   typeof = 1)
                c.save()
                n -= 1

    stat = models.BookStatus.objects.filter(book=book, name="imported")[0]

    from django.core.files import File

    for item in manifest.values():
        if item["mimetype"] != 'text/html':
            attachmentName = item['url']

            if attachmentName.startswith("static/"):
                att = models.Attachment(book = book,
                                        version = book.version,
                                        status = stat)

                s = zf.read(attachmentName)
                f = StringIO(s)
                f2 = File(f)
                f2.size = len(s)
                att.attachment.save(os.path.basename(attachmentName), f2, save=False)
                att.save()
                f.close()

    # metadata
    for namespace in metadata:
        # namespace is something like "http://purl.org/dc/elements/1.1/" or ""
        # in the former case, preepend it to the name, in {}.
        ns = ('{%s}' % namespace if namespace else '')
        for keyword, schemes in metadata[namespace].iteritems():
            for scheme, values in schemes.iteritems():
                #schema, if it is set, describes the value's format.
                #for example, an identifier might be an ISBN.
                sc = ('{%s}' % scheme if scheme else '')
                key = "%s%s%s" % (ns, keyword, sc)
                for v in values:
                    info = models.Info(book=book, name=key)
                    if len(v) >= 2500:
                        info.value_text = v
                        info.kind = 2
                    else:
                        info.value_string = v
                        info.kind = 0
                    info.save()
    zf.close()
Exemplo n.º 7
0
def my_books (request, username):
    """
    Django View. Show user books.

    @type request: C{django.http.HttpRequest}
    @param request: Django Request
    @type username: C{string}
    @param username: Username.
    """

    from django.contrib.auth.models import User
    from booki.editor import models

    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        return pages.ErrorPage(request, "errors/user_does_not_exist.html", {"username": username})
        
    books = models.Book.objects.filter(owner=user)

    if request.POST.get("action") == "hide":
        book = models.Book.objects.get(url_title=request.POST.get("book"))
        book.hidden = True
        book.save()
        transaction.commit()
    elif request.POST.get("action") == "unhide":
        book = models.Book.objects.get(url_title=request.POST.get("book"))
        book.hidden = False
        book.save()
        transaction.commit()

    if request.method == 'POST' and not request.POST.get("action"):
        project_form = BookForm(request.POST)
        import_form = ImportForm(request.POST)

        if import_form.is_valid() and import_form.cleaned_data["id"]:
            project_form = BookForm() # reset the other form

            try:
                ID = import_form.cleaned_data["id"]
                import_type = import_form.cleaned_data["type"]
                rename_title = import_form.cleaned_data["rename_title"]

                extraOptions = {}
                if rename_title:
                    extraOptions['book_title'] = rename_title

                if import_form.cleaned_data["hidden"]:
                    extraOptions['hidden'] = True

                import_sources = {   # base_url    source=
                    'flossmanuals': (TWIKI_GATEWAY_URL, "en.flossmanuals.net"),
                    "archive":      (ESPRI_URL, "archive.org"),
                    "wikibooks":    (ESPRI_URL, "wikibooks"),
                    "epub":         (ESPRI_URL, "url"),
                    }

                if import_type == "booki":
                    ID = ID.rstrip("/")
                    booki_url, book_url_title = ID.rsplit("/", 1)
                    base_url = "%s/export/%s/export" % (booki_url, book_url_title)
                    source = "booki"
                else:
                    base_url, source = import_sources[import_type]

                common.importBookFromUrl2(user, base_url,
                                          args=dict(source=source,
                                                    book=ID),
                                          **extraOptions
                                          )
            except Exception:
                transaction.rollback()
                logError(traceback.format_exc())
                return render_to_response('account/error_import.html',
                                          {"request": request, "user": user})
            else:
                transaction.commit()

        #XXX should this be elif? even if the POST is valid as both forms, the
        # transaction will end up being commited twice.
        if project_form.is_valid() and project_form.cleaned_data["title"]:
            import_form = ImportForm() # reset the other form
            
            from booki.utils.book import createBook
            title = project_form.cleaned_data["title"]

            try:
                book = createBook(user, title)

                license   = project_form.cleaned_data["license"]
                lic = models.License.objects.get(abbrevation=license)
                book.license = lic
                book.hidden = project_form.cleaned_data["hidden"]
                book.save()
            except:
                transaction.rollback()
            else:
                transaction.commit()

            return HttpResponseRedirect(reverse("my_books", args=[username]))
    else:
        project_form = BookForm()
        import_form = ImportForm()


    try:
        return render_to_response('account/my_books.html', {"request": request,
                                                            "user": user,
                                                            
                                                            "project_form": project_form,
                                                            "import_form": import_form,
                                                            
                                                            "books": books,})
    except:
        transaction.rollback()
    finally:
        transaction.commit()
Exemplo n.º 8
0
def create_book(request, username):
    """
    Django View. Show content for Create Book dialog and creates book.

    @type request: C{django.http.HttpRequest}
    @param request: Django Request
    @type username: C{string}
    @param username: Username.
    """

    from django.contrib.auth.models import User

    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        try:
            return pages.ErrorPage(request, "errors/user_does_not_exist.html", {"username": username})
        except:
            transaction.rollback()
        finally:
            transaction.commit()    

    if not request.user.is_authenticated():
        try:
            return pages.ErrorPage(request, "errors/no_permissions.html")
        except:
            transaction.rollback()
        finally:
            transaction.commit()    


    from booki.utils.book import checkBookAvailability, createBook
    from booki.editor import models

    book_visible = config.getConfiguration('CREATE_BOOK_VISIBLE')
    book_license = config.getConfiguration('CREATE_BOOK_LICENSE')
    admin_create = config.getConfiguration('ADMIN_CREATE_BOOKS')

    if request.user.is_superuser:
        admin_create = False


    if request.GET.get("q", "") == "check":
        from booki.utils.json_wrapper import json

        data = {"available": checkBookAvailability(request.GET.get('bookname', '').strip())}

        try:
            return HttpResponse(json.dumps(data), "text/plain")
        except:
            transaction.rollback()
        finally:
            transaction.commit()    

    if request.method == 'POST' and admin_create == False:
        book = None
        try:
            # hidden on
            # description
            # license
            # title
            # cover

            book = createBook(request.user, request.POST.get('title'))

            lic = models.License.objects.get(abbrevation=request.POST.get('license'))
            book.license = lic
            book.description = request.POST.get('description', '')

            if request.POST.get("hidden", "") == "on":
                is_hidden = True
            else:
                is_hidden = False
            book.hidden = is_hidden
            
            from django.core.files import File

            if request.FILES.has_key('cover'):
                # TODO: Show some kind of error message to the user
                from booki.utils import misc
                import os

                try:
                    fh, fname = misc.saveUploadedAsFile(request.FILES['cover'])
                    book.setCover(fname)
                    os.unlink(fname)
                except:
                    pass

            book.save()
                
        except:
            transaction.rollback()
        else:
            transaction.commit()
        try:
            return render_to_response('account/create_book_redirect.html', {"request": request,
                                                                            "user": user,
                                                                            "book": book})
        except:
            transaction.rollback()
        finally:
            transaction.commit()    
        
    from booki.editor.models import License
    
    licenses = License.objects.all().order_by('name')


    try:
        return render_to_response('account/create_book.html', {"request": request,
                                                               "book_visible": book_visible,
                                                               "book_license": book_license,
                                                               "admin_create": admin_create,
                                                               "licenses": licenses,
                                                               "user": user})
    except:
        transaction.rollback()
    finally:
        transaction.commit()    
Exemplo n.º 9
0
def create_book(request, username):
    """
    Django View. Show content for Create Book dialog and creates book.

    @type request: C{django.http.HttpRequest}
    @param request: Django Request
    @type username: C{string}
    @param username: Username.
    """

    import os
    from glob import glob
    import datetime
    from xml.dom import minidom
    from django.contrib.auth.models import User
    from booki.utils.misc import isBookLimitReached

    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        try:
            resp = pages.ErrorPage(request, "errors/user_does_not_exist.html", {"username": username})
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()    

        return resp

    if isBookLimitReached() or not request.user.is_authenticated():
        try:
            resp = pages.ErrorPage(request, "errors/no_permissions.html")
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()    

        return resp

    from booki.utils.book import checkBookAvailability, createBook
    from booki.editor import models

    book_visible = config.getConfiguration('CREATE_BOOK_VISIBLE')
    book_license = config.getConfiguration('CREATE_BOOK_LICENSE')
    admin_create = config.getConfiguration('ADMIN_CREATE_BOOKS')
    templates_source = config.getConfiguration('BOOK_TYPES_DIR')

    if request.user.is_superuser:
        admin_create = False


    if request.GET.get("q", "") == "check":
        from booki.utils.json_wrapper import json

        data = {"available": checkBookAvailability(request.GET.get('bookname', '').strip())}

        try:
            resp = HttpResponse(json.dumps(data), "text/plain")
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()    

        return resp

    if request.method == 'POST' and admin_create == False:
        book = None
        try:
            # hidden on
            # description
            # license
            # title
            # cover
            x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
            if x_forwarded_for:
                ip = x_forwarded_for.split(',')[-1].strip()
            else:
                ip = request.META.get('REMOTE_ADDR')
            book = createBook(request.user, request.POST.get('title'), ip)

            lic = models.License.objects.get(abbrevation=request.POST.get('license'))
            book.license = lic
            book.description = request.POST.get('description', '')

            if request.POST.get("hidden", "") == "on":
                is_hidden = True
            else:
                is_hidden = False
            book.hidden = is_hidden
            
            from django.core.files import File

            if request.FILES.has_key('cover'):
                # TODO: Show some kind of error message to the user
                from booki.utils import misc
                import os

                try:
                    fh, fname = misc.saveUploadedAsFile(request.FILES['cover'])
                    book.setCover(fname)
                    os.unlink(fname)
                except:
                    pass

            book.save()
            book_version = book.getVersion()
            tf = request.POST.get('template', '')
            try:
                xmldoc = minidom.parse(tf)
                chapters = xmldoc.getElementsByTagName('chapter')
            except:
                chapters = []
            for chapter in chapters:
                chapter_title = chapter.attributes['title'].value
                chapter_content = u'<h1>{}</h1>'.format(chapter.attributes['content'].value)
                url_title = bookiSlugify(chapter_title)
                status = models.BookStatus.objects.filter(book=book).order_by("-weight")[0]
                chapter_o = models.Chapter(book=book,
                                 version = book_version,
                                 url_title = url_title,
                                 title = chapter_title,
                                 status = status,
                                 content = chapter_content,
                                 created = datetime.datetime.now(),
                                 modified = datetime.datetime.now())
                chapter_o.save()

                toc_items = len(book_version.getTOC()) + 1
                for itm in models.BookToc.objects.filter(version=book_version, book=book).order_by("-weight"):
                    itm.weight = toc_items
                    itm.save()
                toc_items -= 1
                tc = models.BookToc(version=book_version,
                                book = book,
                                name = chapter_title,
                                chapter = chapter_o,
                                weight = 1,
                                typeof = 1)
                tc.save()

        except:
            lines = traceback.format_exc().split('\n')
            for line in lines:
                print line
            transaction.rollback()
        else:
            transaction.commit()


        try:
            resp = render_to_response('account/create_book_redirect.html', {"request": request,
                                                                            "user": user,
                                                                            "book": book})
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()    

        return resp
        
    from booki.editor.models import License
    
    licenses = License.objects.all().order_by('name')

    try:
        template_files = glob(os.path.join(templates_source, '*.xml'))
    except:
        template_files = []
    templates = [{'name': 'Vac\xc3\xado', 'file': '/'}]
    for tf in template_files:
        print 'parse ' + tf
        xmldoc = minidom.parse(tf)
        print 'ok'
        tpltag = xmldoc.getElementsByTagName('template')[0]
        template = {}
        template['name'] = tpltag.attributes['title'].value
        template['file'] = tf
        templates.append(template)

    try:
        resp = render_to_response('account/create_book.html', {"request": request,
                                                               "book_visible": book_visible,
                                                               "book_license": book_license,
                                                               "admin_create": admin_create,
                                                               "licenses": licenses,
                                                               'templates': templates,
                                                               "user": user})
    except:
        transaction.rollback()
        raise
    else:
        transaction.commit()    

    return resp
Exemplo n.º 10
0
def my_books (request, username):
    """
    Django View. Show user books.

    @type request: C{django.http.HttpRequest}
    @param request: Django Request
    @type username: C{string}
    @param username: Username.
    """

    from django.contrib.auth.models import User
    from booki.editor import models
    from django.template.defaultfilters import slugify

    try:
        user = User.objects.get(username=username)
    except User.DoesNotExist:
        return pages.ErrorPage(request, "errors/user_does_not_exist.html", {"username": username})
        
    books = models.Book.objects.filter(owner=user)

    if request.method == 'POST':
        project_form = BookForm(request.POST)
        import_form = ImportForm(request.POST)

        if import_form.is_valid() and import_form.cleaned_data["id"]:
            try:
                ID = import_form.cleaned_data["id"]
                import_type = import_form.cleaned_data["type"]

                import_sources = {   # base_url    source=
                    'flossmanuals': (TWIKI_GATEWAY_URL, "en.flossmanuals.net"),
                    "archive":      (ESPRI_URL, "archive.org"),
                    "wikibooks":    (ESPRI_URL, "wikibooks"),
                    "epub":         (ESPRI_URL, "url"),
                    }
                base_url, source = import_sources[import_type]
                common.importBookFromUrl2(user, base_url,
                                          source=source,
                                          book=ID
                                          )
            except Exception:
                transaction.rollback()
                logError(traceback.format_exc())
                return render_to_response('account/error_import.html',
                                          {"request": request, "user": user})
            else:
                transaction.commit()

        #XXX should this be elif? even if the POST is valid as both forms, the
        # transaction will end up being commited twice.
        if project_form.is_valid() and project_form.cleaned_data["title"] != "":
            from booki.utils.book import createBook
            title = project_form.cleaned_data["title"]

            try:
                book = createBook(user, title)

                license   = project_form.cleaned_data["license"]
                lic = models.License.objects.get(abbrevation=license)
                book.license = lic
                book.save()
            except:
                transaction.rollback()
            else:
                transaction.commit()

            return HttpResponseRedirect(reverse("my_books", args=[username]))
    else:
        project_form = BookForm()
        import_form = ImportForm()


    return render_to_response('account/my_books.html', {"request": request,
                                                            "user": user,

                                                            "project_form": project_form,
                                                            "import_form": import_form,

                                                            "books": books,})
Exemplo n.º 11
0
def importFeed(document, conf):
    """
    Imports content of Wordpress export into Booktype.
    """

    # To create a book we use "createBook" function. It will do good part of magic for us in the background.
    # We have to provide:
    #   - owner of the book; every book must have an owner
    #   - book title; this is full book name
    #   - book status; every book has a status, let us just use "new" for now
    #   - book url; book must have unique name and in Booktype world it is book url name

    from booki.utils.book import createBook

    book = createBook(conf["user"], conf["bookTitle"], status="new", bookURL=conf["bookTitleURL"])

    # We use config API to check if books are by default visible or not
    isVisible = config.getConfiguration("CREATE_BOOK_VISIBLE", True)
    book.hidden = not isVisible

    book.save()

    # "createBook" function has already created default list of statuses. Let's just fetch "new" status because
    # we will need it for Chapters later
    stat = models.BookStatus.objects.filter(book=book, name="new")[0]

    # What is default URL for Wordpress blog
    wpLink = document["feed"]["link"]

    attachments = []

    for item in document["items"]:
        # We only care about posts which have "publish" status. Ignore everything else for now.
        if item["wp_status"] != u"publish":
            continue

        chapterTitle = item["title"]
        print ">> ", chapterTitle

        # So... let's clean our Wordpress post a bit. Here we ASSUME that empty line is used to separate paragraphs in Wordpress post.
        content = item["content"][0]["value"].replace("\r\n", "\n")
        content = "\n".join(["<p>%s</p>" % p for p in content.split("\n\n") if p.strip() != ""])

        # Every Booktype chapter starts with Chapter title embded in H2 tag.
        content = u"<h2>%s</h2>%s" % (chapterTitle, content)

        tree = html.document_fromstring(content)

        for e in tree.iter():

            # We only care about images now
            if e.tag == "img":
                src = e.get("src")

                if src:
                    if src.startswith("/"):
                        src = wpLink + src

                    # We don't need to download picture if it was already downloaed
                    if not src in attachments:
                        attachments.append(src)

                        u = urlparse.urlsplit(src)

                        # Get the file name and take care of funny stuff like %20 in file names
                        fileName = os.path.basename(urllib.unquote(u.path))

                        print "      >> ", fileName

                        # Download image
                        data = downloadFile(src)

                        # Let us create this attachment if we managed to download something
                        if data:
                            # Create new Attachment. "book" argument is part of legacy here, we really should care only about "version".
                            # Expect this to be removed in the future. Also, every Attachment can have different status. Not that it is
                            # used anywhere at the moment, but it has to be here.

                            att = models.Attachment(book=book, version=book.version, status=stat)

                            # We use standard method for saving the data.
                            f2 = File(StringIO(data))
                            f2.size = len(data)
                            att.attachment.save(fileName, f2, save=True)

                            # If filename with the same name already exists then Django will add prefix to the name.
                            # For instance: Image.jpg would become Image_1.jpg. That is why we check the new name.

                            fileName = os.path.basename(att.attachment.path)

                            # Set whatever we got as a new attachment name. Also notice all images are referenced as
                            # "static/image.jpg" in Booktype so we have to change the source also.
                            e.set("src", "static/%s" % fileName)

        content = etree.tostring(tree, encoding="UTF-8", method="html")

        # Create new chapter. New chapter will be in "Hold chapters". If you want it to be in "Table of contents" you would
        # need to do some extra magic. But we don't care about it now. We also don't really care about writing anything to
        # log files...

        now = datetime.datetime.now()
        chapter = models.Chapter(
            book=book,
            version=book.version,
            url_title=bookiSlugify(chapterTitle),
            title=chapterTitle,
            status=stat,
            content=content,
            created=now,
            modified=now,
        )
        chapter.save()
Exemplo n.º 12
0
def importFeed(document, conf):
    """
    Imports content of Wordpress export into Booktype.
    """

    # To create a book we use "createBook" function. It will do good part of magic for us in the background.
    # We have to provide:
    #   - owner of the book; every book must have an owner
    #   - book title; this is full book name
    #   - book status; every book has a status, let us just use "new" for now
    #   - book url; book must have unique name and in Booktype world it is book url name

    from booki.utils.book import createBook

    book = createBook(conf['user'],
                      conf['bookTitle'],
                      status="new",
                      bookURL=conf['bookTitleURL'])

    # We use config API to check if books are by default visible or not
    isVisible = config.getConfiguration('CREATE_BOOK_VISIBLE', True)
    book.hidden = not isVisible

    book.save()

    # "createBook" function has already created default list of statuses. Let's just fetch "new" status because
    # we will need it for Chapters later
    stat = models.BookStatus.objects.filter(book=book, name="new")[0]

    # What is default URL for Wordpress blog
    wpLink = document['feed']['link']

    attachments = []

    for item in document['items']:
        # We only care about posts which have "publish" status. Ignore everything else for now.
        if item['wp_status'] != u'publish':
            continue

        chapterTitle = item['title']
        print '>> ', chapterTitle

        # So... let's clean our Wordpress post a bit. Here we ASSUME that empty line is used to separate paragraphs in Wordpress post.
        content = item['content'][0]['value'].replace('\r\n', '\n')
        content = '\n'.join([
            '<p>%s</p>' % p for p in content.split('\n\n') if p.strip() != ''
        ])

        # Every Booktype chapter starts with Chapter title embded in H2 tag.
        content = u'<h2>%s</h2>%s' % (chapterTitle, content)

        tree = html.document_fromstring(content)

        for e in tree.iter():

            # We only care about images now
            if e.tag == 'img':
                src = e.get('src')

                if src:
                    if src.startswith('/'):
                        src = wpLink + src

                    # We don't need to download picture if it was already downloaed
                    if not src in attachments:
                        attachments.append(src)

                        u = urlparse.urlsplit(src)

                        # Get the file name and take care of funny stuff like %20 in file names
                        fileName = os.path.basename(urllib.unquote(u.path))

                        print '      >> ', fileName

                        # Download image
                        data = downloadFile(src)

                        # Let us create this attachment if we managed to download something
                        if data:
                            # Create new Attachment. "book" argument is part of legacy here, we really should care only about "version".
                            # Expect this to be removed in the future. Also, every Attachment can have different status. Not that it is
                            # used anywhere at the moment, but it has to be here.

                            att = models.Attachment(book=book,
                                                    version=book.version,
                                                    status=stat)

                            # We use standard method for saving the data.
                            f2 = File(StringIO(data))
                            f2.size = len(data)
                            att.attachment.save(fileName, f2, save=True)

                            # If filename with the same name already exists then Django will add prefix to the name.
                            # For instance: Image.jpg would become Image_1.jpg. That is why we check the new name.

                            fileName = os.path.basename(att.attachment.path)

                            # Set whatever we got as a new attachment name. Also notice all images are referenced as
                            # "static/image.jpg" in Booktype so we have to change the source also.
                            e.set('src', 'static/%s' % fileName)

        content = etree.tostring(tree, encoding='UTF-8', method='html')

        # Create new chapter. New chapter will be in "Hold chapters". If you want it to be in "Table of contents" you would
        # need to do some extra magic. But we don't care about it now. We also don't really care about writing anything to
        # log files...

        now = datetime.datetime.now()
        chapter = models.Chapter(book=book,
                                 version=book.version,
                                 url_title=bookiSlugify(chapterTitle),
                                 title=chapterTitle,
                                 status=stat,
                                 content=content,
                                 created=now,
                                 modified=now)
        chapter.save()