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), )
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
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
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
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()
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()
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()
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()
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
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,})
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()
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()