From: Oleg Broytman Date: Sat, 26 May 2018 17:20:20 +0000 (+0300) Subject: Feat(web:books): Поиск по названиям книг X-Git-Tag: 0.1.4~19 X-Git-Url: https://git.phdru.name/?a=commitdiff_plain;h=fdede95cc489c5519b2e38130d66d4c01775e341;p=m_librarian.git Feat(web:books): Поиск по названиям книг --- diff --git a/docs-ru/news.rst b/docs-ru/news.rst index 7bece3f..79f2447 100644 --- a/docs-ru/news.rst +++ b/docs-ru/news.rst @@ -1,6 +1,11 @@ Новости ======= +Version 0.1.4 (2018-05-??) +-------------------------- + +* Поиск по названиям книг. + Version 0.1.3 (2018-05-25) -------------------------- diff --git a/docs/news.rst b/docs/news.rst index 066f208..d28346e 100644 --- a/docs/news.rst +++ b/docs/news.rst @@ -1,6 +1,11 @@ News ==== +Version 0.1.4 (2018-05-??) +-------------------------- + +* Search by book's title. + Version 0.1.3 (2018-05-25) -------------------------- diff --git a/m_librarian/web/app.py b/m_librarian/web/app.py index 2296d27..19fca6c 100644 --- a/m_librarian/web/app.py +++ b/m_librarian/web/app.py @@ -8,7 +8,7 @@ from bottle import cheetah_view, redirect, request, route, static_file from m_librarian.config import get_config from m_librarian.db import Author, Book from m_librarian.download import download -from m_librarian.search import search_authors +from m_librarian.search import search_authors, search_books @route('/') @@ -103,3 +103,37 @@ def download_books(): return { 'message': u'Не выбрано книг для сохранения.', } + + +@route('/search_books', method='GET') +def _search_books(): + return redirect('/search_books/') + + +@route('/search_books/', method='GET') +@cheetah_view('search_books.tmpl') +def search_books_get(): + return {} + + +@route('/search_books/', method='POST') +@cheetah_view('list_books.tmpl') +def search_books_post(): + value = request.forms.get('search_books') + if not value: + return redirect('/search_books/') + value = decode(value) + search_type = request.forms.get('search_type') + if not search_type: + search_type = 'start' + case_sensitive = request.forms.get('case_sensitive') + if case_sensitive is None: + case_sensitive = _guess_case_sensitivity(value) + books = search_books(search_type, case_sensitive, {'title': value}, None, + orderBy=('title',)) + return { + 'books': list(books), + 'search_books': value, + 'search_type': search_type, + 'case_sensitive': case_sensitive, + } diff --git a/m_librarian/web/views/index.py b/m_librarian/web/views/index.py index e039c2a..e066e53 100644 --- a/m_librarian/web/views/index.py +++ b/m_librarian/web/views/index.py @@ -27,6 +27,7 @@ import Cheetah.ErrorCatchers as ErrorCatchers from Cheetah.compat import unicode from views.layout import layout from views.search_authors_form import search_authors_form +from views.search_books_form import search_books_form ################################################## ## MODULE CONSTANTS @@ -36,10 +37,10 @@ VFN=valueForName currentTime=time.time __CHEETAH_version__ = '3.1.0' __CHEETAH_versionTuple__ = (3, 1, 0, 'final', 1) -__CHEETAH_genTime__ = 1522961823.924543 -__CHEETAH_genTimestamp__ = 'Thu Apr 5 23:57:03 2018' +__CHEETAH_genTime__ = 1527354191.441549 +__CHEETAH_genTimestamp__ = 'Sat May 26 20:03:11 2018' __CHEETAH_src__ = 'index.tmpl' -__CHEETAH_srcLastModified__ = 'Thu Apr 5 23:54:01 2018' +__CHEETAH_srcLastModified__ = 'Sat May 26 20:03:09 2018' __CHEETAH_docstring__ = 'Autogenerated by Cheetah: The Python-Powered Template Engine' if __CHEETAH_versionTuple__ < RequiredCheetahVersionTuple: @@ -93,6 +94,13 @@ class index(layout): _v = VFFSL(SL,"search_authors_form",False)(searchList=VFFSL(SL,"searchList",True)) # u'$search_authors_form(searchList=$searchList)' on line 8, col 1 if _v is not None: write(_filter(_v, rawExpr=u'$search_authors_form(searchList=$searchList)')) # from line 8, col 1. write(u''' + +

\u041f\u043e\u0438\u0441\u043a \u043a\u043d\u0438\u0433

+ +''') + _v = VFFSL(SL,"search_books_form",False)(searchList=VFFSL(SL,"searchList",True)) # u'$search_books_form(searchList=$searchList)' on line 13, col 1 + if _v is not None: write(_filter(_v, rawExpr=u'$search_books_form(searchList=$searchList)')) # from line 13, col 1. + write(u''' ''') ######################################## diff --git a/m_librarian/web/views/index.tmpl b/m_librarian/web/views/index.tmpl index f8be6c7..a16ff1a 100644 --- a/m_librarian/web/views/index.tmpl +++ b/m_librarian/web/views/index.tmpl @@ -6,4 +6,9 @@ #from views.search_authors_form import search_authors_form $search_authors_form(searchList=$searchList) + +

Поиск книг

+ +#from views.search_books_form import search_books_form +$search_books_form(searchList=$searchList) #end def diff --git a/m_librarian/web/views/list_books.py b/m_librarian/web/views/list_books.py new file mode 100644 index 0000000..73af92b --- /dev/null +++ b/m_librarian/web/views/list_books.py @@ -0,0 +1,211 @@ +#!/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 +import cgi +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__ = 1527354802.495612 +__CHEETAH_genTimestamp__ = 'Sat May 26 20:13:22 2018' +__CHEETAH_src__ = 'list_books.tmpl' +__CHEETAH_srcLastModified__ = 'Sat May 26 20:13:18 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 list_books(layout): + + ################################################## + ## CHEETAH GENERATED METHODS + + + def __init__(self, *args, **KWs): + + super(list_books, 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 5, 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 6, col 5 + if _v is not None: write(_filter(_v, rawExpr=u'$title')) # from line 6, col 5. + write(u'''

+ +''') + if VFFSL(SL,"books",True): # generated from line 8, col 1 + write(u'''
+
+ +
+
+ +
+
+''') + else: # generated from line 36, 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 = 'Список книг' + + _mainCheetahMethod_for_list_books = 'writeBody' + +## END CLASS DEFINITION + +if not hasattr(list_books, '_initCheetahAttributes'): + templateAPIClass = getattr(list_books, + '_CHEETAH_templateClass', + Template) + templateAPIClass._addCheetahPlumbingCodeToClass(list_books) + + +# 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=list_books()).run() + + diff --git a/m_librarian/web/views/list_books.tmpl b/m_librarian/web/views/list_books.tmpl new file mode 100644 index 0000000..9566e89 --- /dev/null +++ b/m_librarian/web/views/list_books.tmpl @@ -0,0 +1,39 @@ +#encoding utf-8 +#import cgi +#extends views.layout +#attr $title = 'Список книг' +#def body +

$title

+ +#if $books +
+
+ +
+
+ +
+
+#else +

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

+#end if +#end def diff --git a/m_librarian/web/views/search_books.py b/m_librarian/web/views/search_books.py new file mode 100644 index 0000000..2e8636b --- /dev/null +++ b/m_librarian/web/views/search_books.py @@ -0,0 +1,173 @@ +#!/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 +from views.search_books_form import search_books_form + +################################################## +## 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__ = 1527354048.738532 +__CHEETAH_genTimestamp__ = 'Sat May 26 20:00:48 2018' +__CHEETAH_src__ = 'search_books.tmpl' +__CHEETAH_srcLastModified__ = 'Sat May 26 19:59:55 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 search_books(layout): + + ################################################## + ## CHEETAH GENERATED METHODS + + + def __init__(self, *args, **KWs): + + super(search_books, 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'''

+ +''') + _v = VFFSL(SL,"search_books_form",False)(searchList=VFFSL(SL,"searchList",True)) # u'$search_books_form(searchList=$searchList)' on line 8, col 1 + if _v is not None: write(_filter(_v, rawExpr=u'$search_books_form(searchList=$searchList)')) # from line 8, col 1. + write(u''' +''') + + ######################################## + ## 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 = 'Поиск книг' + + _mainCheetahMethod_for_search_books = 'writeBody' + +## END CLASS DEFINITION + +if not hasattr(search_books, '_initCheetahAttributes'): + templateAPIClass = getattr(search_books, + '_CHEETAH_templateClass', + Template) + templateAPIClass._addCheetahPlumbingCodeToClass(search_books) + + +# 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=search_books()).run() + + diff --git a/m_librarian/web/views/search_books.tmpl b/m_librarian/web/views/search_books.tmpl new file mode 100644 index 0000000..0446d8f --- /dev/null +++ b/m_librarian/web/views/search_books.tmpl @@ -0,0 +1,9 @@ +#encoding utf-8 +#extends views.layout +#attr $title = 'Поиск книг' +#def body +

$title

+ +#from views.search_books_form import search_books_form +$search_books_form(searchList=$searchList) +#end def diff --git a/m_librarian/web/views/search_books_form.py b/m_librarian/web/views/search_books_form.py new file mode 100644 index 0000000..74b4c58 --- /dev/null +++ b/m_librarian/web/views/search_books_form.py @@ -0,0 +1,224 @@ +#!/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 bottle import html_escape + +################################################## +## 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__ = 1527354048.844765 +__CHEETAH_genTimestamp__ = 'Sat May 26 20:00:48 2018' +__CHEETAH_src__ = 'search_books_form.tmpl' +__CHEETAH_srcLastModified__ = 'Sat May 26 20:00:32 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 search_books_form(Template): + + ################################################## + ## CHEETAH GENERATED METHODS + + + def __init__(self, *args, **KWs): + + super(search_books_form, 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 search_type_checked(self, value, **KWS): + + + + ## CHEETAH: generated from #def $search_type_checked($value) at line 3, 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 + + if VFFSL(SL,"getVar",False)('search_type', '') == VFFSL(SL,"value",True): # generated from line 4, col 1 + write(u'''checked''') + + ######################################## + ## END - generated method body + + return _dummyTrans and trans.response().getvalue() or "" + + + def case_sensitive_checked(self, **KWS): + + + + ## CHEETAH: generated from #def $case_sensitive_checked at line 8, 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 + + if VFFSL(SL,"getVar",False)('case_sensitive', None): # generated from line 9, col 1 + write(u'''checked''') + + ######################################## + ## END - generated method body + + return _dummyTrans and trans.response().getvalue() or "" + + + def respond(self, trans=None): + + + + ## CHEETAH: main method generated for this template + 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'''
+
+ +
+ + \u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 + + \u041f\u043e\u0434\u0441\u0442\u0440\u043e\u043a\u0430 + + \u0422\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 +
+ + \u0420\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u043f\u0438\u0441\u043d\u044b\u0435/\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435 +
+
+ +
+
+''') + + ######################################## + ## 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__ + + _mainCheetahMethod_for_search_books_form = 'respond' + +## END CLASS DEFINITION + +if not hasattr(search_books_form, '_initCheetahAttributes'): + templateAPIClass = getattr(search_books_form, + '_CHEETAH_templateClass', + Template) + templateAPIClass._addCheetahPlumbingCodeToClass(search_books_form) + + +# 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=search_books_form()).run() + + diff --git a/m_librarian/web/views/search_books_form.tmpl b/m_librarian/web/views/search_books_form.tmpl new file mode 100644 index 0000000..0f2f667 --- /dev/null +++ b/m_librarian/web/views/search_books_form.tmpl @@ -0,0 +1,31 @@ +#encoding utf-8 +#from bottle import html_escape +#def $search_type_checked($value) +#if $getVar('search_type', '') == $value +checked#slurp +#end if +#end def +#def $case_sensitive_checked +#if $getVar('case_sensitive', None) +checked#slurp +#end if +#end def +
+
+ +
+ + Подстрока в начале + + Подстрока + + Точное совпадение +
+ + Различать прописные/строчные +
+
+ +
+