From c36e520339e5c0043fa6861f43ff5915999eb980 Mon Sep 17 00:00:00 2001 From: Oleg Broytman Date: Sun, 8 Apr 2018 00:23:52 +0300 Subject: [PATCH] Feat(web): Show books by an author --- m_librarian/web/app.py | 15 +- m_librarian/web/views/books_by_author.py | 207 +++++++++++++++++++++ m_librarian/web/views/books_by_author.tmpl | 32 ++++ m_librarian/web/views/list_authors.py | 17 +- m_librarian/web/views/list_authors.tmpl | 2 +- scripts/ml-web.py | 2 + 6 files changed, 265 insertions(+), 10 deletions(-) create mode 100644 m_librarian/web/views/books_by_author.py create mode 100644 m_librarian/web/views/books_by_author.tmpl diff --git a/m_librarian/web/app.py b/m_librarian/web/app.py index 638f152..95af5cb 100644 --- a/m_librarian/web/app.py +++ b/m_librarian/web/app.py @@ -1,7 +1,7 @@ from sqlobject.sqlbuilder import CONCAT from bottle import cheetah_view, redirect, request, route -from m_librarian.db import Author, open_db +from m_librarian.db import Author, AuthorBook, Book from m_librarian.search import search_authors @@ -49,7 +49,6 @@ def search_authors_post(): CONCAT(Author.q.surname, ' ', Author.q.name, ' ', Author.q.misc_name), decode(value) )] - open_db() authors = search_authors(search_type, case_sensitive, {}, expressions, orderBy=('surname', 'name', 'misc_name')) return { @@ -58,3 +57,15 @@ def search_authors_post(): 'search_type': search_type, 'case_sensitive': case_sensitive, } + + +@route('/books-by-author//', method='GET') +@cheetah_view('books_by_author.tmpl') +def books_by_author(id): + return { + 'author': Author.get(id), + 'books': Book.select( + Book.j.authors & (Author.q.id == id), + orderBy=['series', 'ser_no', 'title'], + ) + } diff --git a/m_librarian/web/views/books_by_author.py b/m_librarian/web/views/books_by_author.py new file mode 100644 index 0000000..aa4d96f --- /dev/null +++ b/m_librarian/web/views/books_by_author.py @@ -0,0 +1,207 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + + + + +################################################## +## DEPENDENCIES +import sys +import os +import os.path +try: + import builtins as builtin +except ImportError: + import __builtin__ as builtin +from os.path import getmtime, exists +import time +import types +from Cheetah.Version import MinCompatibleVersion as RequiredCheetahVersion +from Cheetah.Version import MinCompatibleVersionTuple as RequiredCheetahVersionTuple +from Cheetah.Template import Template +from Cheetah.DummyTransaction import * +from Cheetah.NameMapper import NotFound, valueForName, valueFromSearchList, valueFromFrameOrSearchList +from Cheetah.CacheRegion import CacheRegion +import Cheetah.Filters as Filters +import Cheetah.ErrorCatchers as ErrorCatchers +from Cheetah.compat import unicode +from views.layout import layout + +################################################## +## MODULE CONSTANTS +VFFSL=valueFromFrameOrSearchList +VFSL=valueFromSearchList +VFN=valueForName +currentTime=time.time +__CHEETAH_version__ = '3.1.0' +__CHEETAH_versionTuple__ = (3, 1, 0, 'final', 1) +__CHEETAH_genTime__ = 1523136060.80551 +__CHEETAH_genTimestamp__ = 'Sun Apr 8 00:21:00 2018' +__CHEETAH_src__ = 'books_by_author.tmpl' +__CHEETAH_srcLastModified__ = 'Sun Apr 8 00:20:58 2018' +__CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine' + +if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple: + raise AssertionError( + 'This template was compiled with Cheetah version' + ' %s. Templates compiled before version %s must be recompiled.'%( + __CHEETAH_version__, RequiredCheetahVersion)) + +################################################## +## CLASSES + +class books_by_author(layout): + + ################################################## + ## CHEETAH GENERATED METHODS + + + def __init__(self, *args, **KWs): + + super(books_by_author, self).__init__(*args, **KWs) + if not self._CHEETAH__instanceInitialized: + cheetahKWArgs = {} + allowedKWs = 'searchList namespaces filter filtersLib errorCatcher'.split() + for k,v in KWs.items(): + if k in allowedKWs: cheetahKWArgs[k] = v + self._initCheetahInstance(**cheetahKWArgs) + + + def body(self, **KWS): + + + + ## CHEETAH: generated from #def body at line 4, col 1. + trans = KWS.get("trans") + if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)): + trans = self.transaction # is None unless self.awake() was called + if not trans: + trans = DummyTransaction() + _dummyTrans = True + else: _dummyTrans = False + write = trans.response().write + SL = self._CHEETAH__searchList + _filter = self._CHEETAH__currentFilter + + ######################################## + ## START - generated method body + + write(u'''

''') + _v = VFFSL(SL,"title",True) # u'$title' on line 5, col 5 + if _v is not None: write(_filter(_v, rawExpr=u'$title')) # from line 5, col 5. + write(u'''

+ +''') + if VFFSL(SL,"books",True): # generated from line 7, col 1 + write(u''' +''') + series = None + for book in VFFSL(SL,"books",True): # generated from line 10, col 3 + if VFFSL(SL,"book.series",True) != VFFSL(SL,"series",True): # generated from line 11, col 3 + series = VFFSL(SL,"book.series",True) + if VFFSL(SL,"book.series",True): # generated from line 13, col 3 + write(u''' + + +''') + else: # generated from line 17, col 3 + write(u''' + + +''') + write(u''' + + + +''') + write(u'''
\u0421\u0435\u0440\u0438\u044f: ''') + _v = VFFSL(SL,"series",True) # u'$series' on line 15, col 26 + if _v is not None: write(_filter(_v, rawExpr=u'$series')) # from line 15, col 26. + write(u'''
\u0412\u043d\u0435 \u0441\u0435\u0440\u0438\u0439
''') + _v = VFFSL(SL,"book.ser_no",True) # u'$book.ser_no' on line 24, col 35 + if _v is not None: write(_filter(_v, rawExpr=u'$book.ser_no')) # from line 24, col 35. + write(u'''''') + _v = VFFSL(SL,"book.title",True) # u'$book.title' on line 25, col 39 + if _v is not None: write(_filter(_v, rawExpr=u'$book.title')) # from line 25, col 39. + write(u'''
+''') + else: # generated from line 29, col 1 + write(u'''

\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438!

+''') + + ######################################## + ## END - generated method body + + return _dummyTrans and trans.response().getvalue() or "" + + + def writeBody(self, **KWS): + + + + ## CHEETAH: main method generated for this template + trans = KWS.get("trans") + if (not trans and not self._CHEETAH__isBuffering and not callable(self.transaction)): + trans = self.transaction # is None unless self.awake() was called + if not trans: + trans = DummyTransaction() + _dummyTrans = True + else: _dummyTrans = False + write = trans.response().write + SL = self._CHEETAH__searchList + _filter = self._CHEETAH__currentFilter + + ######################################## + ## START - generated method body + + + ######################################## + ## END - generated method body + + return _dummyTrans and trans.response().getvalue() or "" + + ################################################## + ## CHEETAH GENERATED ATTRIBUTES + + + _CHEETAH__instanceInitialized = False + + _CHEETAH_version = __CHEETAH_version__ + + _CHEETAH_versionTuple = __CHEETAH_versionTuple__ + + _CHEETAH_genTime = __CHEETAH_genTime__ + + _CHEETAH_genTimestamp = __CHEETAH_genTimestamp__ + + _CHEETAH_src = __CHEETAH_src__ + + _CHEETAH_srcLastModified = __CHEETAH_srcLastModified__ + + title = 'Список книг автора $author.fullname' + + _mainCheetahMethod_for_books_by_author = 'writeBody' + +## END CLASS DEFINITION + +if not hasattr(books_by_author, '_initCheetahAttributes'): + templateAPIClass = getattr(books_by_author, + '_CHEETAH_templateClass', + Template) + templateAPIClass._addCheetahPlumbingCodeToClass(books_by_author) + + +# CHEETAH was developed by Tavis Rudd and Mike Orr +# with code, advice and input from many other volunteers. +# For more information visit http://cheetahtemplate.org/ + +################################################## +## if run from command line: +if __name__ == '__main__': + from Cheetah.TemplateCmdLineIface import CmdLineIface + CmdLineIface(templateObj=books_by_author()).run() + + diff --git a/m_librarian/web/views/books_by_author.tmpl b/m_librarian/web/views/books_by_author.tmpl new file mode 100644 index 0000000..d093d56 --- /dev/null +++ b/m_librarian/web/views/books_by_author.tmpl @@ -0,0 +1,32 @@ +#encoding utf-8 +#extends views.layout +#attr $title = 'Список книг автора $author.fullname' +#def body +

$title

+ +#if $books + + #set $series = None + #for $book in $books + #if $book.series != $series + #set $series = $book.series + #if $book.series + + + + #else + + + + #end if + #end if + + + + + #end for +
Серия: $series
Вне серий
$book.ser_no$book.title
+#else +

Не найдено ни одной книги!

+#end if +#end def diff --git a/m_librarian/web/views/list_authors.py b/m_librarian/web/views/list_authors.py index 3c5245a..5c70204 100644 --- a/m_librarian/web/views/list_authors.py +++ b/m_librarian/web/views/list_authors.py @@ -36,10 +36,10 @@ VFN=valueForName currentTime=time.time __CHEETAH_version__ = '3.1.0' __CHEETAH_versionTuple__ = (3, 1, 0, 'final', 1) -__CHEETAH_genTime__ = 1522961824.042332 -__CHEETAH_genTimestamp__ = 'Thu Apr 5 23:57:04 2018' +__CHEETAH_genTime__ = 1523134510.111994 +__CHEETAH_genTimestamp__ = 'Sat Apr 7 23:55:10 2018' __CHEETAH_src__ = 'list_authors.tmpl' -__CHEETAH_srcLastModified__ = 'Thu Apr 5 23:54:11 2018' +__CHEETAH_srcLastModified__ = 'Sat Apr 7 23:55:07 2018' __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine' if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple: @@ -104,10 +104,13 @@ class list_authors(layout): ''') for author in VFFSL(SL,"authors",True): # generated from line 13, col 3 write(u''' - ''') - _v = VFFSL(SL,"author.fullname",True) # u'$author.fullname' on line 15, col 9 - if _v is not None: write(_filter(_v, rawExpr=u'$author.fullname')) # from line 15, col 9. - write(u''' + ''') + _v = VFFSL(SL,"author.fullname",True) # u'$author.fullname' on line 15, col 48 + if _v is not None: write(_filter(_v, rawExpr=u'$author.fullname')) # from line 15, col 48. + write(u''' ''') write(u''' diff --git a/m_librarian/web/views/list_authors.tmpl b/m_librarian/web/views/list_authors.tmpl index 9bb4176..f7377ba 100644 --- a/m_librarian/web/views/list_authors.tmpl +++ b/m_librarian/web/views/list_authors.tmpl @@ -12,7 +12,7 @@ $search_authors_form(searchList=$searchList) #for $author in $authors - + #end for
$author.fullname$author.fullname
diff --git a/scripts/ml-web.py b/scripts/ml-web.py index f5a579e..bccac81 100755 --- a/scripts/ml-web.py +++ b/scripts/ml-web.py @@ -6,6 +6,7 @@ import webbrowser from bottle import thread # portable import +from m_librarian.db import open_db import m_librarian.web.app # noqa: F401 imported but unused from m_librarian.web.server import run_server from m_librarian.web.utils import get_open_port @@ -26,5 +27,6 @@ if __name__ == '__main__': else: port = get_open_port() + open_db() thread.start_new_thread(start_browser, (port,)) run_server(port=port) -- 2.39.2