def book_info(request, bookid, version=None): try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) book_history = models.BookHistory.objects.filter(version = book_version).order_by("-modified")[:20] book_collaborators = [e.values()[0] for e in models.BookHistory.objects.filter(version = book_version, kind = 2).values("user__username").distinct()] import sputnik channel_name = "/booki/book/%s/%s/" % (book.id, book_version.getVersion()) online_users = sputnik.smembers("sputnik:channel:%s:users" % channel_name) book_versions = models.BookVersion.objects.filter(book=book).order_by("created") return render_to_response('reader/book_info.html', {"book": book, "book_version": book_version.getVersion(), "book_versions": book_versions, "book_history": book_history, "book_collaborators": book_collaborators, "has_css": _customCSSExists(book.url_title), "online_users": online_users, "request": request})
def staticattachment(request, bookid, attachment, version=None, chapter = None): """ Django View. Returns content of an attachment. @todo: It is wrong in so many different levels to serve attachments this way. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Book ID @type attachment: C{string} @param attachment: Name of the attachment @type version: C{string} @param version: Version of the book """ from django.views import static try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) path = '%s/%s' % (book_version.getVersion(), attachment) document_root = '%s/books/%s/' % (settings.DATA_ROOT, bookid) return static.serve(request, path, document_root)
def view_full(request, bookid, version=None): chapters = [] try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) for chapter in models.BookToc.objects.filter(version=book_version).order_by("-weight"): if chapter.isChapter(): chapters.append({"type": "chapter", "title": chapter.chapter.title, "content": chapter.chapter.content, "chapter": chapter.chapter}) else: chapters.append({"type": "section", "title": chapter.name}) return render_to_response('reader/full.html', {"book": book, "book_version": book_version.getVersion(), "chapters": chapters, "has_css": _customCSSExists(book.url_title), "request": request})
def attachmentinfo(request, bookid, version, attachment): """ Returns formated attachment info page. Used for the tooltip info. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Booki name @type version: C{string} @param version: Booki version @type attachment: C{string} @param attachment: Attachment name """ from booki.editor import models from booki.editor.views import getVersion book = models.Book.objects.get(url_title__iexact=bookid) book_version = getVersion(book, version) att = None # very stupid for a in book_version.getAttachments(): if a.getName() == attachment: att = a return render_to_response('booki/attachmentinfo.html', {"book": book, "attachment_name": attachment, "attachment": att, "request": request } )
def draft_chapter(request, bookid, chapter, version=None): try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) chapters = [] for chap in models.BookToc.objects.filter(version=book_version).order_by("-weight"): if chap.isChapter(): chapters.append({"url_title": chap.chapter.url_title, "name": chap.chapter.title}) else: chapters.append({"url_title": None, "name": chap.name}) try: content = models.Chapter.objects.get(version=book_version, url_title = chapter) except models.Chapter.DoesNotExist: return pages.ErrorPage(request, "errors/chapter_does_not_exist.html", {"chapter_name": chapter, "book": book}) return render_to_response('reader/draft_chapter.html', {"chapter": chapter, "book": book, "book_version": book_version.getVersion(), "chapters": chapters, "has_css": _customCSSExists(book.url_title), "request": request, "content": content})
def attachmentinfo(request, bookid, version, attachment): """ Returns formated attachment info page. Used for the tooltip info. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Booki name @type version: C{string} @param version: Booki version @type attachment: C{string} @param attachment: Attachment name """ from booki.editor import models from booki.editor.views import getVersion book = models.Book.objects.get(url_title__iexact=bookid) book_version = getVersion(book, version) att = None # very stupid for a in book_version.getAttachments(): if a.getName() == attachment: att = a return render_to_response( 'booki/attachmentinfo.html', { "book": book, "attachment_name": attachment, "attachment": att, "request": request })
def remote_chapters_changed(request, message, bookid, version): lst = [chap[5:] for chap in message["chapters"]] lstHold = [chap[5:] for chap in message["hold"]] book = models.Book.objects.get(id=bookid) book_version = getVersion(book, version) weight = len(lst) logBookHistory(book = book, version = book_version, user = request.user, kind = "chapter_reorder") for chap in lst: if chap[0] == 's': m = models.BookToc.objects.get(id__exact=int(chap[1:])) m.weight = weight m.save() else: try: m = models.BookToc.objects.get(chapter__id__exact=int(chap)) m.weight = weight m.save() except: chptr = models.Chapter.objects.get(id__exact=int(chap)) m = models.BookToc(book = book, version = book_version, name = "SOMETHING", chapter = chptr, weight = weight, typeof=1) m.save() weight -= 1 if message["kind"] == "remove": if type(message["chapter_id"]) == type(u' ') and message["chapter_id"][0] == 's': m = models.BookToc.objects.get(id__exact=message["chapter_id"][1:]) m.delete() else: m = models.BookToc.objects.get(chapter__id__exact=int(message["chapter_id"])) m.delete() # addMessageToChannel(request, "/chat/%s/%s/" % (projectid, bookid), {"command": "message_info", "from": request.user.username, "message": 'User %s has rearranged chapters.' % request.user.username}) sputnik.addMessageToChannel(request, "/booki/book/%s/%s/" % (bookid, version), {"command": "chapters_changed", "ids": lst, "hold_ids": lstHold, "kind": message["kind"], "chapter_id": message["chapter_id"]}) # TODO # this should be changed, to check for errors transaction.commit() return {}
def remote_attachments_list(request, message, bookid, version): book = models.Book.objects.get(id=bookid) book_version = getVersion(book, version) try: attachments = getAttachments(book_version) except: attachments = [] return {"attachments": attachments}
def book_chapter(request, bookid, chapter, version=None): """ Django View. Shows chapter for the published version of a book. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Book ID @type chapter: C{string} @param chapter: Chapter name @type version: C{string} @param verson: Book version """ try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) from booki.utils import security bookSecurity = security.getUserSecurityForBook(request.user, book) hasPermission = security.canEditBook(book, bookSecurity) if book.hidden and not hasPermission: return pages.ErrorPage(request, "errors/no_permissions.html") chapters = [] for chap in models.BookToc.objects.filter(version=book_version).order_by("-weight"): if chap.isChapter(): chapters.append({"url_title": chap.chapter.url_title, "name": chap.chapter.title}) else: chapters.append({"url_title": None, "name": chap.name}) try: content = models.Chapter.objects.get(version=book_version, url_title = chapter) except models.Chapter.DoesNotExist: return pages.ErrorPage(request, "errors/chapter_does_not_exist.html", {"chapter_name": chapter, "book": book}) except models.Chapter.MultipleObjectsReturned: return pages.ErrorPage(request, "errors/chapter_duplicate.html", {"chapter_name": chapter, "book": book}) return render_to_response('reader/book_chapter.html', {"chapter": chapter, "book": book, "book_version": book_version.getVersion(), "chapters": chapters, "has_css": _customCSSExists(book.url_title), "request": request, "content": content})
def remote_chapter_save(request, message, bookid, version): # TODO # put this outside in common module # or maybe even betterm put it in the Model book = models.Book.objects.get(id=bookid) book_version = getVersion(book, version) chapter = models.Chapter.objects.get(id=int(message["chapterID"])) if message.get("minor", False) != True: history = logChapterHistory(chapter = chapter, content = message["content"], user = request.user, comment = message.get("comment", ""), revision = chapter.revision+1) logBookHistory(book = chapter.book, version = book_version, chapter = chapter, chapter_history = history, user = request.user, args = {"comment": message.get("comment", ""), "author": message.get("author", ""), "authorcomment": message.get("authorcomment", "")}, kind = 'chapter_save') chapter.revision += 1 chapter.content = message["content"]; try: chapter.save() sputnik.addMessageToChannel(request, "/chat/%s/" % bookid, {"command": "message_info", "from": request.user.username, "message": 'User %s has saved chapter "%s".' % (request.user.username, chapter.title)}, myself=True) except: transaction.rollback() else: transaction.commit() if not message['continue']: sputnik.addMessageToChannel(request, "/booki/book/%s/%s/" % (bookid, version), {"command": "chapter_status", "chapterID": message["chapterID"], "status": "normal", "username": request.user.username}) sputnik.rdelete("booki:%s:locks:%s:%s" % (bookid, message["chapterID"], request.user.username)) # fire the signal import booki.editor.signals booki.editor.signals.chapter_modified.send(sender = book_version, chapter = chapter, user = request.user) return {}
def _is_book_modified(book): from booki.editor.views import getVersion from time import mktime bv = getVersion(book, None) created = mktime(book.created.timetuple()) for chapter in models.Chapter.objects.filter(version=bv): logWarning("chapter %s created %s mod %s" % (chapter.id, book.created, chapter.modified)) #5 seconds grace before a chapter is deemed modified if created + 5 < mktime(chapter.modified.timetuple()): return True return False
def remote_create_section(request, message, bookid, version): import datetime book = models.Book.objects.get(id=bookid) book_version = getVersion(book, version) ch = models.BookToc.objects.filter(book=book, version=book_version, name=message['chapter'], typeof=0) if len(list(ch)) > 0: return {"created": False} c = models.BookToc(book = book, version = book_version, name = message["chapter"], chapter = None, weight = 0, typeof=0) result = True try: c.save() except: result = False transaction.rollback() else: logBookHistory(book = book, version = book_version, user = request.user, args = {"title": message["chapter"]}, kind = 'section_create') transaction.commit() result = ("s%s" % c.id, c.name, None, c.typeof) sputnik.addMessageToChannel(request, "/chat/%s/" % bookid, {"command": "message_info", "from": request.user.username, "message": 'User %s has created new section "%s".' % (request.user.username, message["chapter"])}, myself=True) sputnik.addMessageToChannel(request, "/booki/book/%s/%s/" % (bookid, version), {"command": "chapter_create", "chapter": result, "typeof": c.typeof}, myself = True) return {"created": result}
def staticattachment(request, bookid, attachment, version=None, chapter = None): from django.views import static try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) path = '%s/%s' % (book_version.getVersion(), attachment) document_root = '%s/books/%s/' % (settings.DATA_ROOT, bookid) return static.serve(request, path, document_root)
def book_info(request, bookid, version=None): """ Django View. Shows single page with all the Book info. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Book ID @type version: C{string} @param verson: Book version """ try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) book_history = models.BookHistory.objects.filter(version = book_version).order_by("-modified")[:20] book_collaborators = [e.values()[0] for e in models.BookHistory.objects.filter(version = book_version, kind = 2).values("user__username").distinct()] from booki.utils import security bookSecurity = security.getUserSecurityForBook(request.user, book) isBookAdmin = bookSecurity.isAdmin() import sputnik channel_name = "/booki/book/%s/%s/" % (book.id, book_version.getVersion()) online_users = sputnik.smembers("sputnik:channel:%s:users" % channel_name) book_versions = models.BookVersion.objects.filter(book=book).order_by("created") from django.utils.html import escape bookDescription = escape(book.description) return render_to_response('reader/book_info.html', {"book": book, "book_version": book_version.getVersion(), "book_versions": book_versions, "book_history": book_history, "book_collaborators": book_collaborators, "has_css": _customCSSExists(book.url_title), "is_book_admin": isBookAdmin, "online_users": online_users, "book_description": '<br/>'.join(bookDescription.replace('\r','').split('\n')), "request": request})
def attachmentinfo(request, bookid, version, attachment): from booki.editor import models from booki.editor.views import getVersion book = models.Book.objects.get(url_title__iexact=bookid) book_version = getVersion(book, version) att = None # very stupid for a in book_version.getAttachments(): if a.getName() == attachment: att = a return render_to_response( "booki/attachmentinfo.html", {"book": book, "attachment_name": attachment, "attachment": att, "request": request}, )
def book_chapter(request, bookid, chapter, version=None): """ Django View. Shows chapter for the published version of a book. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Book ID @type chapter: C{string} @param chapter: Chapter name @type version: C{string} @param verson: Book version """ try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) chapters = [] for chap in models.BookToc.objects.filter(version=book_version).order_by("-weight"): if chap.isChapter(): chapters.append({"url_title": chap.chapter.url_title, "name": chap.chapter.title}) else: chapters.append({"url_title": None, "name": chap.name}) try: content = models.Chapter.objects.get(version=book_version, url_title = chapter) except models.Chapter.DoesNotExist: return pages.ErrorPage(request, "errors/chapter_does_not_exist.html", {"chapter_name": chapter, "book": book}) except models.Chapter.MultipleObjectsReturned: return pages.ErrorPage(request, "errors/chapter_duplicate.html", {"chapter_name": chapter, "book": book}) return render_to_response('reader/book_chapter.html', {"chapter": chapter, "book": book, "book_version": book_version.getVersion(), "chapters": chapters, "has_css": _customCSSExists(book.url_title), "request": request, "content": content})
def view_full(request, bookid, version=None): """ Django View. Shows full content of book on one page. This is published version of a book. @type request: C{django.http.HttpRequest} @param request: Django Request @type bookid: C{string} @param bookid: Unique Book ID @type version: C{string} @param version: Version of the book """ chapters = [] try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) from booki.utils import security bookSecurity = security.getUserSecurityForBook(request.user, book) hasPermission = security.canEditBook(book, bookSecurity) if book.hidden and not hasPermission: return pages.ErrorPage(request, "errors/no_permissions.html") for chapter in models.BookToc.objects.filter(version=book_version).order_by("-weight"): if chapter.isChapter(): chapters.append({"type": "chapter", "title": chapter.chapter.title, "content": chapter.chapter.content, "chapter": chapter.chapter}) else: chapters.append({"type": "section", "title": chapter.name}) return render_to_response('reader/full.html', {"book": book, "book_version": book_version.getVersion(), "chapters": chapters, "has_css": _customCSSExists(book.url_title), "request": request})
def remote_revert_revision(request, message, bookid, version): from booki.editor.views import getVersion book = models.Book.objects.get(id=bookid) book_ver = getVersion(book, version) chapter = models.Chapter.objects.get(version=book_ver, url_title=message["chapter"]) revision = models.ChapterHistory.objects.get(revision=message["revision"], chapter__url_title=message["chapter"], chapter__version=book_ver.id) # TODO # does chapter history really needs to keep content or it can only keep reference to chapter history = logChapterHistory(chapter = chapter, content = revision.content, user = request.user, comment = "Reverted to revision %s." % message["revision"], revision = chapter.revision+1) logBookHistory(book = book, version = book_ver, chapter = chapter, chapter_history = history, user = request.user, args = {}, kind = 'chapter_save') chapter.revision += 1 chapter.content = revision.content; try: chapter.save() except: transaction.rollback() else: transaction.commit() sputnik.addMessageToChannel(request, "/chat/%s/" % bookid, {"command": "message_info", "from": request.user.username, "message": 'User %s has reverted chapter "%s" to revision %s.' % (request.user.username, chapter.title, message["revision"])}, myself=True) return {}
def remote_get_chapter_history(request, message, bookid, version): import datetime from booki.editor.views import getVersion book = models.Book.objects.get(id=bookid) book_ver = getVersion(book, version) chapter_history = models.ChapterHistory.objects.filter(chapter__book=book, chapter__url_title=message["chapter"]).order_by("-modified") history = [] for entry in chapter_history: history.append({"chapter": entry.chapter.title, "chapter_url": entry.chapter.url_title, "modified": entry.modified.strftime("%d.%m.%Y %H:%M:%S"), "user": entry.user.username, "revision": entry.revision, "comment": entry.comment}) return {"history": history}
def remote_create_major_version(request, message, bookid, version): from booki.editor.views import getVersion book = models.Book.objects.get(id=bookid) book_ver = getVersion(book, version) try: new_version = create_new_version(book, book_ver, message, book_ver.major+1, 0) except: transaction.rollback() else: logBookHistory(book = book, version = new_version, chapter = None, chapter_history = None, user = request.user, args = {"version": new_version.getVersion()}, kind = 'major_version') transaction.commit() return {"version": new_version.getVersion()}
def remote_chapter_rename(request, message, bookid, version): book = models.Book.objects.get(id=bookid) book_version = getVersion(book, version) chapter = models.Chapter.objects.get(id=int(message["chapterID"])) oldTitle = chapter.title chapter.title = message["chapter"]; try: chapter.save() except: transaction.rollback() else: logBookHistory(book = chapter.book, version = book_version, chapter = chapter, user = request.user, args = {"old": oldTitle, "new": message["chapter"]}, kind = "chapter_rename") sputnik.addMessageToChannel(request, "/chat/%s/" % bookid, {"command": "message_info", "from": request.user.username, "message": 'User %s has renamed chapter "%s" to "%s".' % (request.user.username, oldTitle, message["chapter"])}, myself=True) sputnik.addMessageToChannel(request, "/booki/book/%s/%s/" % (bookid, version), {"command": "chapter_status", "chapterID": message["chapterID"], "status": "normal", "username": request.user.username}) sputnik.addMessageToChannel(request, "/booki/book/%s/%s/" % (bookid, version), {"command": "chapter_rename", "chapterID": message["chapterID"], "chapter": message["chapter"]}) transaction.commit() return {}
def _is_book_modified(book): """ Checks if specific book has been modified. @todo: This has to be changed, this is terrible way to check difference in timestamps. This has been developed for archive.org, and is not in use anymore. @type book: C{booki.editor.models.Book} @param book: Book object @rtype: C{bool} @return: Returns True or False """ from booki.editor.views import getVersion from time import mktime bv = getVersion(book, None) created = mktime(book.created.timetuple()) for chapter in models.Chapter.objects.filter(version=bv): logWarning("chapter %s created %s mod %s" % (chapter.id, book.created, chapter.modified)) #5 seconds grace before a chapter is deemed modified if created + 5 < mktime(chapter.modified.timetuple()): return True return False
def book_info(request, bookid, version=None): """ Django View. Shows single page with all the Book info. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Book ID @type version: C{string} @param verson: Book version """ try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) book_history = models.BookHistory.objects.filter(version = book_version).order_by("-modified")[:20] book_collaborators = [e.values()[0] for e in models.BookHistory.objects.filter(version = book_version, kind = 2).values("user__username").distinct()] import sputnik channel_name = "/booki/book/%s/%s/" % (book.id, book_version.getVersion()) online_users = sputnik.smembers("sputnik:channel:%s:users" % channel_name) book_versions = models.BookVersion.objects.filter(book=book).order_by("created") return render_to_response('reader/book_info.html', {"book": book, "book_version": book_version.getVersion(), "book_versions": book_versions, "book_history": book_history, "book_collaborators": book_collaborators, "has_css": _customCSSExists(book.url_title), "online_users": online_users, "request": request})
def handle(self, *args, **options): from booki.editor.views import getVersion if len(args) == 0: raise CommandError("You must specify book name!") try: book = models.Book.objects.get(url_title__iexact=args[0]) except models.Book.DoesNotExist: raise CommandError('Book "%s" does not exist.' % args[0]) try: book_version = getVersion(book, options["book_version"]) except models.BookVersion.DoesNotExist: raise CommandError("Book version %s does not exist." % options["book_version"]) fileName = common.exportBook(book_version) exportFileName = None if options["output_name"]: if options["output_name"] == "--": print open(fileName, "rb").read(), import os os.unlink(fileName) return else: exportFileName = options["output_name"] else: exportFileName = "export-%s.zip" % book.url_title shutil.move(fileName, exportFileName) if options["verbosity"] in ["1", "2"]: print 'Book successfully exported into "%s" file.' % exportFileName
def handle(self, *args, **options): from booki.editor.views import getVersion if len(args) == 0: raise CommandError("You must specify book name!") try: book = models.Book.objects.get(url_title__iexact=args[0]) except models.Book.DoesNotExist: raise CommandError('Book "%s" does not exist.' % args[0]) try: book_version = getVersion(book, options['book_version']) except models.BookVersion.DoesNotExist: raise CommandError('Book version %s does not exist.' % options['book_version']) fileName = common.exportBook(book_version) exportFileName = None if options['output_name']: if options['output_name'] == '--': print open(fileName, 'rb').read(), import os os.unlink(fileName) return else: exportFileName = options['output_name'] else: exportFileName = 'export-%s.zip' % book.url_title shutil.move(fileName, exportFileName) if options['verbosity'] in ['1', '2']: print 'Book successfully exported into "%s" file.' % exportFileName
def draft_book(request, bookid, version=None): """ Django View. Shows main page for the draft version of a book. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Book ID @type version: C{string} @param verson: Book version """ try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) chapters = [] for chapter in models.BookToc.objects.filter(version=book_version).order_by("-weight"): if chapter.isChapter(): chapters.append({"url_title": chapter.chapter.url_title, "name": chapter.chapter.title}) else: chapters.append({"url_title": None, "name": chapter.name}) return render_to_response('reader/draft_book.html', {"book": book, "book_version": book_version.getVersion(), "chapters": chapters, "has_css": _customCSSExists(book.url_title), "request": request})
def view_full(request, bookid, version=None): """ Django View. Shows full content of book on one page. This is published version of a book. @type request: C{django.http.HttpRequest} @param request: Django Request @type bookid: C{string} @param bookid: Unique Book ID @type version: C{string} @param version: Version of the book """ chapters = [] try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) for chapter in models.BookToc.objects.filter(version=book_version).order_by("-weight"): if chapter.isChapter(): chapters.append({"type": "chapter", "title": chapter.chapter.title, "content": chapter.chapter.content, "chapter": chapter.chapter}) else: chapters.append({"type": "section", "title": chapter.name}) return render_to_response('reader/full.html', {"book": book, "book_version": book_version.getVersion(), "chapters": chapters, "has_css": _customCSSExists(book.url_title), "request": request})
def book_view(request, bookid, version=None): """ Django View. Shows main book page for the published version of a book. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Book ID @type version: C{string} @param verson: Book version """ try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) chapters = [] for chapter in models.BookToc.objects.filter(version=book_version).order_by("-weight"): if chapter.isChapter(): chapters.append({"url_title": chapter.chapter.url_title, "name": chapter.chapter.title}) else: chapters.append({"url_title": None, "name": chapter.name}) return render_to_response('reader/book_view.html', {"book": book, "book_version": book_version.getVersion(), "chapters": chapters, "has_css": _customCSSExists(book.url_title), "request": request})
def remote_init_editor(request, message, bookid, version): book = models.Book.objects.get(id=bookid) book_version = getVersion(book, version) ## get chapters chapters = getTOCForBook(book_version) holdChapters = getHoldChapters(book_version) ## get users def _getUserName(a): if a == request.sputnikID: return "<b>%s</b>" % a return a try: users = [_getUserName(m) for m in list(sputnik.smembers("sputnik:channel:%s:channel" % message["channel"]))] except: users = [] ## get workflow statuses statuses = [(status.id, status.name) for status in models.BookStatus.objects.filter(book=book).order_by("-weight")] ## get attachments try: attachments = getAttachments(book_version) except: attachments = [] ## get metadata metadata = [{'name': v.name, 'value': v.getValue()} for v in models.Info.objects.filter(book=book)] ## notify others sputnik.addMessageToChannel(request, "/chat/%s/" % bookid, {"command": "user_joined", "user_joined": request.user.username}, myself = False) ## get licenses licenses = [(elem.abbrevation, elem.name) for elem in models.License.objects.all().order_by("name")] ## get online users try: _onlineUsers = sputnik.smembers("sputnik:channel:%s:users" % message["channel"]) except: _onlineUsers = [] if request.user.username not in _onlineUsers: try: sputnik.sadd("sputnik:channel:%s:users" % message["channel"], request.user.username) _onlineUsers.append(request.user.username) except: pass ## get mood message for current user ## send mood as seperate message ## set notifications to other clients profile = request.user.get_profile() if profile: moodMessage = profile.mood; else: moodMessage = '' sputnik.addMessageToChannel(request, "/booki/book/%s/%s/" % (bookid, version), {"command": "user_add", "username": request.user.username, "mood": moodMessage} ) ## get online users and their mood messages from django.contrib.auth.models import User def _getUser(_user): try: _u = User.objects.get(username=_user) return (_user, _u.get_profile().mood) except: return None onlineUsers = [x for x in [_getUser(x) for x in _onlineUsers] if x] # for now, this is one big temp here import time, decimal, re _now = time.time() locks = {} try: for key in sputnik.rkeys("booki:*:locks:*"): lastAccess = sputnik.get(key) if type(lastAccess) in [type(' '), type(u' ')]: try: lastAccess = decimal.Decimal(lastAccess) except: continue if lastAccess and decimal.Decimal("%f" % _now) - lastAccess <= 30: m = re.match("booki:(\d+):locks:(\d+):(\w+)", key) if m: if m.group(1) == bookid: locks[m.group(2)] = m.group(3) except: pass return {"licenses": licenses, "chapters": chapters, "metadata": metadata, "hold": holdChapters, "users": users, "locks": locks, "statuses": statuses, "attachments": attachments, "onlineUsers": list(onlineUsers)}
def edit_info(request, bookid, version=None): """ Django View. @type request: C{django.http.HttpRequest} @param request: Client Request object @type bookid: C{string} @param bookid: Unique Book ID @type version: C{string} @param verson: Book version """ try: book = models.Book.objects.get(url_title__iexact=bookid) except models.Book.DoesNotExist: return pages.ErrorPage(request, "errors/book_does_not_exist.html", {"book_name": bookid}) book_version = getVersion(book, version) if request.method == 'POST': book.description = request.POST.get('description', '') 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) im.save('%s/%s%s.jpg' % (settings.MEDIA_ROOT, settings.COVER_IMAGE_UPLOAD_DIR, book.id), "JPEG") book.cover = '%s%s.jpg' % (settings.COVER_IMAGE_UPLOAD_DIR, book.id) except: transaction.rollback() os.unlink(fname) try: book.save() return render_to_response('reader/edit_info_redirect.html', {"request": request, "book": book}) except: transaction.rollback() finally: transaction.commit() try: return render_to_response('reader/edit_info.html', {"request": request, "book": book}) except: transaction.rollback() finally: transaction.commit()
def remote_chapter_split(request, message, bookid, version): book = models.Book.objects.get(id=bookid) book_version = getVersion(book, version) logBookHistory(book = book, version = book_version, user = request.user, kind = 'chapter_split') allChapters = [] try: originalChapter = models.Chapter.objects.get(id=int(message["chapterID"])) except: originalChapter = None try: tocChapter = models.BookToc.objects.get(book=book, chapter__id__exact=message["chapterID"]) except: tocChapter = None import datetime from django.template.defaultfilters import slugify if tocChapter: allChapters = [chap for chap in models.BookToc.objects.filter(book=book).order_by("-weight")] initialPosition = len(allChapters)-tocChapter.weight else: initialPosition = 0 s = models.BookStatus.objects.filter(book=book).order_by("weight")[0] n = 0 for chap in message["chapters"]: chapter = models.Chapter(book = book, url_title = slugify(chap[0]), title = chap[0], status = s, content = '<h1>%s</h1>%s' % (chap[0], chap[1]), created = datetime.datetime.now(), modified = datetime.datetime.now()) chapter.save() if tocChapter: m = models.BookToc(book = book, chapter = chapter, name = chap[0], weight = 0, typeof = 1) m.save() allChapters.insert(1+initialPosition+n, m) n += 1 if originalChapter: sputnik.addMessageToChannel(request, "/chat/%s/" % bookid, {"command": "message_info", "from": request.user.username, "message": 'User %s has split chapter "%s".' % (request.user.username, originalChapter.title)}, myself=True) originalChapter.delete() if tocChapter: tocChapter.delete() n = len(allChapters) for chap in allChapters: try: chap.weight = n chap.save() n -= 1 except: pass ## get chapters chapters = getTOCForBook(book_version) holdChapters = getHoldChapters(book_version) sputnik.addMessageToChannel(request, "/booki/book/%s/%s/" % (bookid, version), {"command": "chapter_split", "chapterID": message["chapterID"], "chapters": chapters, "hold": holdChapters, "username": request.user.username}, myself = True) transaction.commit() return {}
def remote_create_chapter(request, message, bookid, version): import datetime # BookVersion treba uzeti book = models.Book.objects.get(id=bookid) book_version = getVersion(book, version) from django.template.defaultfilters import slugify url_title = slugify(message["chapter"]) # here i should probably set it to default project status s = models.BookStatus.objects.filter(book=book).order_by("weight")[0] ch = models.Chapter.objects.filter(book=book, version=book_version, url_title=url_title) if len(list(ch)) > 0: return {"created": False} content = u'<h1>%s</h1>' % message["chapter"] chapter = models.Chapter(book = book, version = book_version, url_title = url_title, title = message["chapter"], status = s, content = content, created = datetime.datetime.now(), modified = datetime.datetime.now()) try: chapter.save() except: transaction.rollback() return {"created": False} else: # this should be solved in better way # should have createChapter in booki.utils.book module toc_items = len(book_version.getTOC())+1 for itm in models.BookToc.objects.filter(version = book_version, book = book): itm.weight = toc_items itm.save() toc_items -= 1 tc = models.BookToc(version = book_version, book = book, name = message["chapter"], chapter = chapter, weight = 1, typeof = 1) try: tc.save() except: transaction.rollback() return {"created": False} history = logChapterHistory(chapter = chapter, content = content, user = request.user, comment = message.get("comment", ""), revision = chapter.revision) logBookHistory(book = book, version = book_version, chapter = chapter, chapter_history = history, user = request.user, kind = 'chapter_create') transaction.commit() result = (chapter.id, chapter.title, chapter.url_title, 1, s.id) sputnik.addMessageToChannel(request, "/chat/%s/" % bookid, {"command": "message_info", "from": request.user.username, "message": 'User %s has created new chapter "%s".' % (request.user.username, message["chapter"])}, myself=True) sputnik.addMessageToChannel(request, "/booki/book/%s/%s/" % (bookid, version), {"command": "chapter_create", "chapter": result}, myself = True) return {"created": True}