]> git.phdru.name Git - m_librarian.git/commitdiff
Feat(web): Download one book
authorOleg Broytman <phd@phdru.name>
Sun, 8 Apr 2018 00:28:21 +0000 (03:28 +0300)
committerOleg Broytman <phd@phdru.name>
Sun, 8 Apr 2018 00:40:50 +0000 (03:40 +0300)
m_librarian/download.py
m_librarian/web/app.py
m_librarian/web/views/download.py [new file with mode: 0644]
m_librarian/web/views/download.tmpl [new file with mode: 0644]
sample/m_librarian.conf
scripts/ml-search.py

index 30412013123eb317883464c7fef5d9c1cf0c790e..e10e9fe0e49fad48421354bce8ebd04915710ce6 100755 (executable)
@@ -64,12 +64,12 @@ def _compile_format():
 _library_path = None
 
 
-def download(book, path=None, a_format=None):
-    if path is None:
+def download(book, dest_path=None, lib_path=None, a_format=None):
+    if lib_path is None:
         global _library_path
         if _library_path is None:
             _library_path = get_config().get('library', 'path')
-        path = _library_path
+        lib_path = _library_path
 
     global format, compile_format, compiled_format
     if a_format:
@@ -92,19 +92,20 @@ def download(book, path=None, a_format=None):
     if '%(extension)s' not in compiled_format:
         compiled_format += '.%(extension)s'
     filename = compiled_format % bdict
+    full_path = os.path.join(dest_path, filename)
     try:
-        os.makedirs(os.path.dirname(filename))
+        os.makedirs(os.path.dirname(full_path))
     except OSError:
         pass  # Already exists
-    zf = ZipFile(os.path.join(path, book.archive),  'r')
+    zf = ZipFile(os.path.join(lib_path, book.archive),  'r')
     infile = zf.open('%s.%s' % (book.file, book.extension.name))
-    outfile = open(filename, 'wb')
+    outfile = open(full_path, 'wb')
     copyfileobj(infile, outfile)
     outfile.close()
     infile.close()
     zf.close()
     dt = mktime(book.date.timetuple())
-    os.utime(filename, (dt, dt))
+    os.utime(full_path, (dt, dt))
 
 
 def test():
index 686dafedaed5a11eae2a8a158dd07c7735aba73d..7032825e8224d3f4c0cf94e04228eeddd46d21f7 100644 (file)
@@ -1,9 +1,13 @@
+# -*- coding: utf-8 -*-
+
 import os
 
 from sqlobject.sqlbuilder import CONCAT
 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
 
 
@@ -81,3 +85,13 @@ def send_static(filename):
             'static'
         )
     )
+
+
+@route('/download/<id:int>/', method='GET')
+@cheetah_view('download.tmpl')
+def download_book(id):
+    book = Book.get(id)
+    download(book, get_config().get('download', 'path'))
+    return {
+        'message': u'Книга сохранена',
+    }
diff --git a/m_librarian/web/views/download.py b/m_librarian/web/views/download.py
new file mode 100644 (file)
index 0000000..ef05ca4
--- /dev/null
@@ -0,0 +1,172 @@
+#!/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__ = 1523146500.915016
+__CHEETAH_genTimestamp__ = 'Sun Apr  8 03:15:00 2018'
+__CHEETAH_src__ = 'download.tmpl'
+__CHEETAH_srcLastModified__ = 'Sun Apr  8 03:14:43 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 download(layout):
+
+    ##################################################
+    ## CHEETAH GENERATED METHODS
+
+
+    def __init__(self, *args, **KWs):
+
+        super(download, 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>
+
+<p>''')
+        _v = VFFSL(SL,"message",True) # u'$message' on line 7, col 4
+        if _v is not None: write(_filter(_v, rawExpr=u'$message')) # from line 7, col 4.
+        write(u'''</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 = 'Загрузка'
+
+    _mainCheetahMethod_for_download = 'writeBody'
+
+## END CLASS DEFINITION
+
+if not hasattr(download, '_initCheetahAttributes'):
+    templateAPIClass = getattr(download,
+                               '_CHEETAH_templateClass',
+                               Template)
+    templateAPIClass._addCheetahPlumbingCodeToClass(download)
+
+
+# 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=download()).run()
+
+
diff --git a/m_librarian/web/views/download.tmpl b/m_librarian/web/views/download.tmpl
new file mode 100644 (file)
index 0000000..cf7e5bf
--- /dev/null
@@ -0,0 +1,8 @@
+#encoding utf-8
+#extends views.layout
+#attr $title = 'Загрузка'
+#def body
+<h1>$title</h1>
+
+<p>$message</p>
+#end def
index 2ed0f8a39d601607257f1e0892f6bd6ba81d1ab5..5b8bee9135b29f7cb15c6e2ca7433d527cb467b6 100644 (file)
@@ -26,3 +26,6 @@ path = /var/lib/LRE_Flibusta
 # Examples:
 # format = %f (this is the default)
 # format = %a/%s/%n %t
+
+# Directory to download books to
+path = /tmp
index fe8dc48be67140af19d63108f9b96474be8fcb74..5ee84ccd1e19c6b390c6a1cede087d3cfc3f4635 100755 (executable)
@@ -2,6 +2,7 @@
 
 from __future__ import print_function
 import argparse
+import os
 import sys
 from sqlobject.sqlbuilder import CONCAT
 
@@ -199,7 +200,7 @@ def _search_books(case_sensitive, search_type, args):
             print(" ", encode(_("Deleted")), ":",
                   encode(_(str(book.deleted))))
         if args.get or args.get_many:
-            download(book, args.path, args.format)
+            download(book, os.path.curdir, args.path, args.format)
         count += 1
     print_count(count)