]> git.phdru.name Git - m_librarian.git/commitdiff
Feat(web): Show books by an author
authorOleg Broytman <phd@phdru.name>
Sat, 7 Apr 2018 21:23:52 +0000 (00:23 +0300)
committerOleg Broytman <phd@phdru.name>
Sat, 7 Apr 2018 21:23:52 +0000 (00:23 +0300)
m_librarian/web/app.py
m_librarian/web/views/books_by_author.py [new file with mode: 0644]
m_librarian/web/views/books_by_author.tmpl [new file with mode: 0644]
m_librarian/web/views/list_authors.py
m_librarian/web/views/list_authors.tmpl
scripts/ml-web.py

index 638f1528e3826c41e102d164d4aa4ac7d8789aa1..95af5cb5d79e3060b0d7a923f02dc6c25a8013af 100644 (file)
@@ -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/<id:int>/', 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 (file)
index 0000000..aa4d96f
--- /dev/null
@@ -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'''<h1>''')
+        _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'''</h1>
+
+''')
+        if VFFSL(SL,"books",True): # generated from line 7, col 1
+            write(u'''  <table>
+''')
+            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'''  <tr>
+    <td colspan=2>\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'''</td>
+  </tr>
+''')
+                    else: # generated from line 17, col 3
+                        write(u'''  <tr>
+    <td colspan=2>\u0412\u043d\u0435 \u0441\u0435\u0440\u0438\u0439</td>
+  </tr>
+''')
+                write(u'''  <tr>
+    <td style="text-align: right">''')
+                _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'''</td>
+    <td><a href="/download/''')
+                _v = VFFSL(SL,"book.id",True) # u'$book.id' on line 25, col 28
+                if _v is not None: write(_filter(_v, rawExpr=u'$book.id')) # from line 25, col 28.
+                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'''</a></td>
+  </tr>
+''')
+            write(u'''  </table>
+''')
+        else: # generated from line 29, col 1
+            write(u'''  <p>\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043a\u043d\u0438\u0433\u0438!</p>
+''')
+        
+        ########################################
+        ## 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 (file)
index 0000000..d093d56
--- /dev/null
@@ -0,0 +1,32 @@
+#encoding utf-8
+#extends views.layout
+#attr $title = 'Список книг автора $author.fullname'
+#def body
+<h1>$title</h1>
+
+#if $books
+  <table>
+  #set $series = None
+  #for $book in $books
+  #if $book.series != $series
+  #set $series = $book.series
+  #if $book.series
+  <tr>
+    <td colspan=2>Серия: $series</td>
+  </tr>
+  #else
+  <tr>
+    <td colspan=2>Вне серий</td>
+  </tr>
+  #end if
+  #end if
+  <tr>
+    <td style="text-align: right">$book.ser_no</td>
+    <td><a href="/download/$book.id/">$book.title</a></td>
+  </tr>
+  #end for
+  </table>
+#else
+  <p>Не найдено ни одной книги!</p>
+#end if
+#end def
index 3c5245a92a31e5bc6b1ca6f0b79265cb211ac15e..5c70204c7f390cbc60e2050012a34ca32f875588 100644 (file)
@@ -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'''  <tr>
-    <td>''')
-                _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'''</td>
+    <td><a href="/books-by-author/''')
+                _v = VFFSL(SL,"author.id",True) # u'$author.id' on line 15, col 35
+                if _v is not None: write(_filter(_v, rawExpr=u'$author.id')) # from line 15, col 35.
+                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'''</a></td>
   </tr>
 ''')
             write(u'''  </table>
index 9bb417624c361fa33198ed6ebdfbfc157bfda95e..f7377ba29c5fc835f717d06f8e561fe17883eca1 100644 (file)
@@ -12,7 +12,7 @@ $search_authors_form(searchList=$searchList)
   <table>
   #for $author in $authors
   <tr>
-    <td>$author.fullname</td>
+    <td><a href="/books-by-author/$author.id/">$author.fullname</a></td>
   </tr>
   #end for
   </table>
index f5a579e006718b3be33d1ea85ca3856a4e00851a..bccac810821833844272fd2bf90eae29afbc73ee 100755 (executable)
@@ -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)