parent
							
								
									b78130e3b1
								
							
						
					
					
						commit
						863b77a5d7
					
				| 
						 | 
					@ -114,9 +114,9 @@ def send_registration_mail(e_mail, user_name, default_password, resend=False):
 | 
				
			||||||
    return
 | 
					    return
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def check_send_to_kindle(entry):
 | 
					def check_send_to_kindle(entry):
 | 
				
			||||||
    '''
 | 
					    """
 | 
				
			||||||
        returns all available book formats for sending to Kindle
 | 
					        returns all available book formats for sending to Kindle
 | 
				
			||||||
    '''
 | 
					    """
 | 
				
			||||||
    if len(entry.data):
 | 
					    if len(entry.data):
 | 
				
			||||||
        bookformats=list()
 | 
					        bookformats=list()
 | 
				
			||||||
        if ub.config.config_ebookconverter == 0:
 | 
					        if ub.config.config_ebookconverter == 0:
 | 
				
			||||||
| 
						 | 
					@ -156,6 +156,18 @@ def check_send_to_kindle(entry):
 | 
				
			||||||
        return None
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Check if a reader is existing for any of the book formats, if not, return empty list, otherwise return
 | 
				
			||||||
 | 
					# list with supported formats
 | 
				
			||||||
 | 
					def check_read_formats(entry):
 | 
				
			||||||
 | 
					    EXTENSIONS_READER = {'TXT', 'PDF', 'EPUB', 'ZIP', 'CBZ', 'TAR', 'CBT', 'RAR', 'CBR'}
 | 
				
			||||||
 | 
					    bookformats = list()
 | 
				
			||||||
 | 
					    if len(entry.data):
 | 
				
			||||||
 | 
					        for ele in iter(entry.data):
 | 
				
			||||||
 | 
					            if ele.format in EXTENSIONS_READER:
 | 
				
			||||||
 | 
					                bookformats.append(ele.format.lower())
 | 
				
			||||||
 | 
					    return bookformats
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Files are processed in the following order/priority:
 | 
					# Files are processed in the following order/priority:
 | 
				
			||||||
# 1: If Mobi file is existing, it's directly send to kindle email,
 | 
					# 1: If Mobi file is existing, it's directly send to kindle email,
 | 
				
			||||||
# 2: If Epub file is existing, it's converted and send to kindle email,
 | 
					# 2: If Epub file is existing, it's converted and send to kindle email,
 | 
				
			||||||
| 
						 | 
					@ -336,6 +348,7 @@ def delete_book_gdrive(book, book_format):
 | 
				
			||||||
        error =_(u'Book path %(path)s not found on Google Drive', path=book.path)  # file not found
 | 
					        error =_(u'Book path %(path)s not found on Google Drive', path=book.path)  # file not found
 | 
				
			||||||
    return error
 | 
					    return error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def generate_random_password():
 | 
					def generate_random_password():
 | 
				
			||||||
    s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%&*()?"
 | 
					    s = "abcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%&*()?"
 | 
				
			||||||
    passlen = 8
 | 
					    passlen = 8
 | 
				
			||||||
| 
						 | 
					@ -349,12 +362,14 @@ def update_dir_stucture(book_id, calibrepath):
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return update_dir_structure_file(book_id, calibrepath)
 | 
					        return update_dir_structure_file(book_id, calibrepath)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def delete_book(book, calibrepath, book_format):
 | 
					def delete_book(book, calibrepath, book_format):
 | 
				
			||||||
    if ub.config.config_use_google_drive:
 | 
					    if ub.config.config_use_google_drive:
 | 
				
			||||||
        return delete_book_gdrive(book, book_format)
 | 
					        return delete_book_gdrive(book, book_format)
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return delete_book_file(book, calibrepath, book_format)
 | 
					        return delete_book_file(book, calibrepath, book_format)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_book_cover(cover_path):
 | 
					def get_book_cover(cover_path):
 | 
				
			||||||
    if ub.config.config_use_google_drive:
 | 
					    if ub.config.config_use_google_drive:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
| 
						 | 
					@ -372,6 +387,7 @@ def get_book_cover(cover_path):
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        return send_from_directory(os.path.join(ub.config.config_calibre_dir, cover_path), "cover.jpg")
 | 
					        return send_from_directory(os.path.join(ub.config.config_calibre_dir, cover_path), "cover.jpg")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# saves book cover to gdrive or locally
 | 
					# saves book cover to gdrive or locally
 | 
				
			||||||
def save_cover(url, book_path):
 | 
					def save_cover(url, book_path):
 | 
				
			||||||
    img = requests.get(url)
 | 
					    img = requests.get(url)
 | 
				
			||||||
| 
						 | 
					@ -384,7 +400,7 @@ def save_cover(url, book_path):
 | 
				
			||||||
        f = open(os.path.join(tmpDir, "uploaded_cover.jpg"), "wb")
 | 
					        f = open(os.path.join(tmpDir, "uploaded_cover.jpg"), "wb")
 | 
				
			||||||
        f.write(img.content)
 | 
					        f.write(img.content)
 | 
				
			||||||
        f.close()
 | 
					        f.close()
 | 
				
			||||||
        uploadFileToEbooksFolder(os.path.join(book_path, 'cover.jpg'), os.path.join(tmpDir, f.name))
 | 
					        gd.uploadFileToEbooksFolder(os.path.join(book_path, 'cover.jpg'), os.path.join(tmpDir, f.name))
 | 
				
			||||||
        web.app.logger.info("Cover is saved on Google Drive")
 | 
					        web.app.logger.info("Cover is saved on Google Drive")
 | 
				
			||||||
        return True
 | 
					        return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -394,6 +410,7 @@ def save_cover(url, book_path):
 | 
				
			||||||
    web.app.logger.info("Cover is saved")
 | 
					    web.app.logger.info("Cover is saved")
 | 
				
			||||||
    return True
 | 
					    return True
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def do_download_file(book, book_format, data, headers):
 | 
					def do_download_file(book, book_format, data, headers):
 | 
				
			||||||
    if ub.config.config_use_google_drive:
 | 
					    if ub.config.config_use_google_drive:
 | 
				
			||||||
        startTime = time.time()
 | 
					        startTime = time.time()
 | 
				
			||||||
| 
						 | 
					@ -621,6 +638,7 @@ def get_current_version_info():
 | 
				
			||||||
        return {'hash': content[0], 'datetime': content[1]}
 | 
					        return {'hash': content[0], 'datetime': content[1]}
 | 
				
			||||||
    return False
 | 
					    return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def json_serial(obj):
 | 
					def json_serial(obj):
 | 
				
			||||||
    """JSON serializer for objects not serializable by default json code"""
 | 
					    """JSON serializer for objects not serializable by default json code"""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -628,6 +646,7 @@ def json_serial(obj):
 | 
				
			||||||
        return obj.isoformat()
 | 
					        return obj.isoformat()
 | 
				
			||||||
    raise TypeError ("Type %s not serializable" % type(obj))
 | 
					    raise TypeError ("Type %s not serializable" % type(obj))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def render_task_status(tasklist):
 | 
					def render_task_status(tasklist):
 | 
				
			||||||
    #helper function to apply localize status information in tasklist entries
 | 
					    #helper function to apply localize status information in tasklist entries
 | 
				
			||||||
    renderedtasklist=list()
 | 
					    renderedtasklist=list()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,17 +57,15 @@
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
              {% endif %}
 | 
					              {% endif %}
 | 
				
			||||||
            {% endif %}
 | 
					            {% endif %}
 | 
				
			||||||
              {% if entry.data|length  %}
 | 
					              {% if reader_list  %}
 | 
				
			||||||
              <div class="btn-group" role="group">
 | 
					              <div class="btn-group" role="group">
 | 
				
			||||||
                <button id="read-in-browser" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
 | 
					                <button id="read-in-browser" type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
 | 
				
			||||||
                  <span class="glyphicon glyphicon-eye-open"></span> {{_('Read in browser')}}
 | 
					                  <span class="glyphicon glyphicon-eye-open"></span> {{_('Read in browser')}}
 | 
				
			||||||
                  <span class="caret"></span>
 | 
					                  <span class="caret"></span>
 | 
				
			||||||
                </button>
 | 
					                </button>
 | 
				
			||||||
                    <ul class="dropdown-menu" aria-labelledby="read-in-browser">
 | 
					                    <ul class="dropdown-menu" aria-labelledby="read-in-browser">
 | 
				
			||||||
                    {% for format in entry.data %}
 | 
					                    {% for format in reader_list %}
 | 
				
			||||||
                      {%if format.format|lower == 'epub' or format.format|lower == 'txt' or format.format|lower == 'pdf' or format.format|lower == 'cbr' or format.format|lower == 'cbt' or format.format|lower == 'cbz' %}
 | 
					                      <li><a target="_blank" href="{{ url_for('read_book', book_id=entry.id, book_format=format) }}">{{format}}</a></li>
 | 
				
			||||||
                      <li><a target="_blank" href="{{ url_for('read_book', book_id=entry.id, book_format=format.format|lower) }}">{{format.format}}</a></li>
 | 
					 | 
				
			||||||
                      {% endif %}
 | 
					 | 
				
			||||||
                    {%endfor%}
 | 
					                    {%endfor%}
 | 
				
			||||||
                    </ul>
 | 
					                    </ul>
 | 
				
			||||||
              </div>
 | 
					              </div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										100
									
								
								cps/web.py
									
									
									
									
									
								
							
							
						
						
									
										100
									
								
								cps/web.py
									
									
									
									
									
								
							| 
						 | 
					@ -56,7 +56,6 @@ import tempfile
 | 
				
			||||||
from redirect import redirect_back
 | 
					from redirect import redirect_back
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import server
 | 
					import server
 | 
				
			||||||
# import copy
 | 
					 | 
				
			||||||
from reverseproxy import ReverseProxied
 | 
					from reverseproxy import ReverseProxied
 | 
				
			||||||
 | 
					
 | 
				
			||||||
try:
 | 
					try:
 | 
				
			||||||
| 
						 | 
					@ -116,8 +115,6 @@ EXTENSIONS_UPLOAD = {'txt', 'pdf', 'epub', 'mobi', 'azw', 'azw3', 'cbr', 'cbz',
 | 
				
			||||||
                      'fb2', 'html', 'rtf', 'odt'}
 | 
					                      'fb2', 'html', 'rtf', 'odt'}
 | 
				
			||||||
EXTENSIONS_CONVERT = {'pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'html', 'rtf', 'odt'}
 | 
					EXTENSIONS_CONVERT = {'pdf', 'epub', 'mobi', 'azw3', 'docx', 'rtf', 'fb2', 'lit', 'lrf', 'txt', 'html', 'rtf', 'odt'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# EXTENSIONS_READER = set(['txt', 'pdf', 'epub', 'zip', 'cbz', 'tar', 'cbt'] + (['rar','cbr'] if rar_support else []))
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Main code
 | 
					# Main code
 | 
				
			||||||
mimetypes.init()
 | 
					mimetypes.init()
 | 
				
			||||||
| 
						 | 
					@ -733,7 +730,8 @@ def feed_hot():
 | 
				
			||||||
            # ub.session.query(ub.Downloads).filter(book.Downloads.book_id == ub.Downloads.book_id).delete()
 | 
					            # ub.session.query(ub.Downloads).filter(book.Downloads.book_id == ub.Downloads.book_id).delete()
 | 
				
			||||||
            # ub.session.commit()
 | 
					            # ub.session.commit()
 | 
				
			||||||
    numBooks = entries.__len__()
 | 
					    numBooks = entries.__len__()
 | 
				
			||||||
    pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, numBooks)
 | 
					    pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1),
 | 
				
			||||||
 | 
					                            config.config_books_per_page, numBooks)
 | 
				
			||||||
    return render_xml_template('feed.xml', entries=entries, pagination=pagination)
 | 
					    return render_xml_template('feed.xml', entries=entries, pagination=pagination)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -773,7 +771,8 @@ def feed_publisherindex():
 | 
				
			||||||
def feed_publisher(book_id):
 | 
					def feed_publisher(book_id):
 | 
				
			||||||
    off = request.args.get("offset") or 0
 | 
					    off = request.args.get("offset") or 0
 | 
				
			||||||
    entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1),
 | 
					    entries, __, pagination = fill_indexpage((int(off) / (int(config.config_books_per_page)) + 1),
 | 
				
			||||||
                                             db.Books, db.Books.publishers.any(db.Publishers.id == book_id), [db.Books.timestamp.desc()])
 | 
					                                             db.Books, db.Books.publishers.any(db.Publishers.id == book_id),
 | 
				
			||||||
 | 
					                                             [db.Books.timestamp.desc()])
 | 
				
			||||||
    return render_xml_template('feed.xml', entries=entries, pagination=pagination)
 | 
					    return render_xml_template('feed.xml', entries=entries, pagination=pagination)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -872,7 +871,8 @@ def get_opds_download_link(book_id, book_format):
 | 
				
			||||||
        file_name = book.authors[0].name + '_' + file_name
 | 
					        file_name = book.authors[0].name + '_' + file_name
 | 
				
			||||||
    file_name = helper.get_valid_filename(file_name)
 | 
					    file_name = helper.get_valid_filename(file_name)
 | 
				
			||||||
    headers = Headers()
 | 
					    headers = Headers()
 | 
				
			||||||
    headers["Content-Disposition"] = "attachment; filename*=UTF-8''%s.%s" % (quote(file_name.encode('utf8')), book_format)
 | 
					    headers["Content-Disposition"] = "attachment; filename*=UTF-8''%s.%s" % (quote(file_name.encode('utf8')),
 | 
				
			||||||
 | 
					                                                                             book_format)
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        headers["Content-Type"] = mimetypes.types_map['.' + book_format]
 | 
					        headers["Content-Type"] = mimetypes.types_map['.' + book_format]
 | 
				
			||||||
    except KeyError:
 | 
					    except KeyError:
 | 
				
			||||||
| 
						 | 
					@ -895,32 +895,8 @@ def get_metadata_calibre_companion(uuid):
 | 
				
			||||||
@app.route("/ajax/emailstat")
 | 
					@app.route("/ajax/emailstat")
 | 
				
			||||||
@login_required
 | 
					@login_required
 | 
				
			||||||
def get_email_status_json():
 | 
					def get_email_status_json():
 | 
				
			||||||
    answer=list()
 | 
					 | 
				
			||||||
    # UIanswer = list()
 | 
					 | 
				
			||||||
    tasks=helper.global_WorkerThread.get_taskstatus()
 | 
					    tasks=helper.global_WorkerThread.get_taskstatus()
 | 
				
			||||||
    '''if not current_user.role_admin():
 | 
					 | 
				
			||||||
        for task in tasks:
 | 
					 | 
				
			||||||
            if task['user'] == current_user.nickname:
 | 
					 | 
				
			||||||
                if task['formStarttime']:
 | 
					 | 
				
			||||||
                    task['starttime'] = format_datetime(task['formStarttime'], format='short', locale=get_locale())
 | 
					 | 
				
			||||||
                    # task['formStarttime'] = ""
 | 
					 | 
				
			||||||
                else:
 | 
					 | 
				
			||||||
                    if 'starttime' not in task:
 | 
					 | 
				
			||||||
                        task['starttime'] = ""
 | 
					 | 
				
			||||||
                answer.append(task)
 | 
					 | 
				
			||||||
    else:
 | 
					 | 
				
			||||||
        for task in tasks:
 | 
					 | 
				
			||||||
            if task['formStarttime']:
 | 
					 | 
				
			||||||
                task['starttime'] = format_datetime(task['formStarttime'], format='short', locale=get_locale())
 | 
					 | 
				
			||||||
                task['formStarttime'] = ""
 | 
					 | 
				
			||||||
            else:
 | 
					 | 
				
			||||||
                if 'starttime' not in  task:
 | 
					 | 
				
			||||||
                    task['starttime'] = ""
 | 
					 | 
				
			||||||
        answer = tasks'''
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    # UIanswer = copy.deepcopy(answer)
 | 
					 | 
				
			||||||
    answer = helper.render_task_status(tasks)
 | 
					    answer = helper.render_task_status(tasks)
 | 
				
			||||||
 | 
					 | 
				
			||||||
    js=json.dumps(answer, default=helper.json_serial)
 | 
					    js=json.dumps(answer, default=helper.json_serial)
 | 
				
			||||||
    response = make_response(js)
 | 
					    response = make_response(js)
 | 
				
			||||||
    response.headers["Content-Type"] = "application/json; charset=utf-8"
 | 
					    response.headers["Content-Type"] = "application/json; charset=utf-8"
 | 
				
			||||||
| 
						 | 
					@ -1464,7 +1440,8 @@ def publisher_list():
 | 
				
			||||||
def publisher(book_id, page):
 | 
					def publisher(book_id, page):
 | 
				
			||||||
    publisher = db.session.query(db.Publishers).filter(db.Publishers.id == book_id).first()
 | 
					    publisher = db.session.query(db.Publishers).filter(db.Publishers.id == book_id).first()
 | 
				
			||||||
    if publisher:
 | 
					    if publisher:
 | 
				
			||||||
        entries, random, pagination = fill_indexpage(page, db.Books, db.Books.publishers.any(db.Publishers.id == book_id),
 | 
					        entries, random, pagination = fill_indexpage(page, db.Books,
 | 
				
			||||||
 | 
					                                            db.Books.publishers.any(db.Publishers.id == book_id),
 | 
				
			||||||
                                            (db.Series.name, db.Books.series_index), db.books_series_link, db.Series)
 | 
					                                            (db.Series.name, db.Books.series_index), db.books_series_link, db.Series)
 | 
				
			||||||
        return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
 | 
					        return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
 | 
				
			||||||
                                 title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher")
 | 
					                                 title=_(u"Publisher: %(name)s", name=publisher.name), page="publisher")
 | 
				
			||||||
| 
						 | 
					@ -1675,10 +1652,11 @@ def show_book(book_id):
 | 
				
			||||||
        entries.tags = sort(entries.tags, key = lambda tag: tag.name)
 | 
					        entries.tags = sort(entries.tags, key = lambda tag: tag.name)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        kindle_list = helper.check_send_to_kindle(entries)
 | 
					        kindle_list = helper.check_send_to_kindle(entries)
 | 
				
			||||||
 | 
					        reader_list = helper.check_read_formats(entries)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return render_title_template('detail.html', entry=entries, cc=cc, is_xhr=request.is_xhr,
 | 
					        return render_title_template('detail.html', entry=entries, cc=cc, is_xhr=request.is_xhr,
 | 
				
			||||||
                                     title=entries.title, books_shelfs=book_in_shelfs,
 | 
					                                     title=entries.title, books_shelfs=book_in_shelfs,
 | 
				
			||||||
                                     have_read=have_read, kindle_list=kindle_list, page="book")
 | 
					                                     have_read=have_read, kindle_list=kindle_list, reader_list=reader_list, page="book")
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
 | 
					        flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
 | 
				
			||||||
        return redirect(url_for("index"))
 | 
					        return redirect(url_for("index"))
 | 
				
			||||||
| 
						 | 
					@ -1795,7 +1773,8 @@ def delete_book(book_id, book_format):
 | 
				
			||||||
                                getattr(book, cc_string).remove(del_cc)
 | 
					                                getattr(book, cc_string).remove(del_cc)
 | 
				
			||||||
                                db.session.delete(del_cc)
 | 
					                                db.session.delete(del_cc)
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        modify_database_object([u''], getattr(book, cc_string), db.cc_classes[c.id], db.session, 'custom')
 | 
					                        modify_database_object([u''], getattr(book, cc_string), db.cc_classes[c.id],
 | 
				
			||||||
 | 
					                                               db.session, 'custom')
 | 
				
			||||||
                db.session.query(db.Books).filter(db.Books.id == book_id).delete()
 | 
					                db.session.query(db.Books).filter(db.Books.id == book_id).delete()
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == book_format).delete()
 | 
					                db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == book_format).delete()
 | 
				
			||||||
| 
						 | 
					@ -1871,7 +1850,8 @@ def revoke_watch_gdrive():
 | 
				
			||||||
    last_watch_response = config.config_google_drive_watch_changes_response
 | 
					    last_watch_response = config.config_google_drive_watch_changes_response
 | 
				
			||||||
    if last_watch_response:
 | 
					    if last_watch_response:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            gdriveutils.stopChannel(gdriveutils.Gdrive.Instance().drive, last_watch_response['id'], last_watch_response['resourceId'])
 | 
					            gdriveutils.stopChannel(gdriveutils.Gdrive.Instance().drive, last_watch_response['id'],
 | 
				
			||||||
 | 
					                                    last_watch_response['resourceId'])
 | 
				
			||||||
        except HttpError:
 | 
					        except HttpError:
 | 
				
			||||||
            pass
 | 
					            pass
 | 
				
			||||||
        settings = ub.session.query(ub.Settings).first()
 | 
					        settings = ub.session.query(ub.Settings).first()
 | 
				
			||||||
| 
						 | 
					@ -2467,7 +2447,8 @@ def send_to_kindle(book_id, book_format, convert):
 | 
				
			||||||
    if settings.get("mail_server", "mail.example.com") == "mail.example.com":
 | 
					    if settings.get("mail_server", "mail.example.com") == "mail.example.com":
 | 
				
			||||||
        flash(_(u"Please configure the SMTP mail settings first..."), category="error")
 | 
					        flash(_(u"Please configure the SMTP mail settings first..."), category="error")
 | 
				
			||||||
    elif current_user.kindle_mail:
 | 
					    elif current_user.kindle_mail:
 | 
				
			||||||
        result = helper.send_mail(book_id, book_format, convert, current_user.kindle_mail, config.config_calibre_dir, current_user.nickname)
 | 
					        result = helper.send_mail(book_id, book_format, convert, current_user.kindle_mail, config.config_calibre_dir,
 | 
				
			||||||
 | 
					                                  current_user.nickname)
 | 
				
			||||||
        if result is None:
 | 
					        if result is None:
 | 
				
			||||||
            flash(_(u"Book successfully queued for sending to %(kindlemail)s", kindlemail=current_user.kindle_mail),
 | 
					            flash(_(u"Book successfully queued for sending to %(kindlemail)s", kindlemail=current_user.kindle_mail),
 | 
				
			||||||
                  category="success")
 | 
					                  category="success")
 | 
				
			||||||
| 
						 | 
					@ -2625,7 +2606,8 @@ def remove_from_shelf(shelf_id, book_id):
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        app.logger.info("Sorry you are not allowed to remove a book from this shelf: %s" % shelf.name)
 | 
					        app.logger.info("Sorry you are not allowed to remove a book from this shelf: %s" % shelf.name)
 | 
				
			||||||
        if not request.is_xhr:
 | 
					        if not request.is_xhr:
 | 
				
			||||||
            flash(_(u"Sorry you are not allowed to remove a book from this shelf: %(sname)s", sname=shelf.name), category="error")
 | 
					            flash(_(u"Sorry you are not allowed to remove a book from this shelf: %(sname)s", sname=shelf.name),
 | 
				
			||||||
 | 
					                  category="error")
 | 
				
			||||||
            return redirect(url_for('index'))
 | 
					            return redirect(url_for('index'))
 | 
				
			||||||
        return "Sorry you are not allowed to remove a book from this shelf: %s" % shelf.name, 403
 | 
					        return "Sorry you are not allowed to remove a book from this shelf: %s" % shelf.name, 403
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3111,9 +3093,9 @@ def configuration_helper(origin):
 | 
				
			||||||
                content.config_rarfile_location = to_save["config_rarfile_location"].strip()
 | 
					                content.config_rarfile_location = to_save["config_rarfile_location"].strip()
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                flash(check[1], category="error")
 | 
					                flash(check[1], category="error")
 | 
				
			||||||
                return render_title_template("config_edit.html", content=config, origin=origin, gdrive=gdriveutils.gdrive_support,
 | 
					                return render_title_template("config_edit.html", content=config, origin=origin,
 | 
				
			||||||
                                         goodreads=goodreads_support, rarfile_support=rar_support,
 | 
					                                             gdrive=gdriveutils.gdrive_support, goodreads=goodreads_support,
 | 
				
			||||||
                                         title=_(u"Basic Configuration"))
 | 
					                                             rarfile_support=rar_support, title=_(u"Basic Configuration"))
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            if content.config_use_google_drive and is_gdrive_ready() and not os.path.exists(config.config_calibre_dir + "/metadata.db"):
 | 
					            if content.config_use_google_drive and is_gdrive_ready() and not os.path.exists(config.config_calibre_dir + "/metadata.db"):
 | 
				
			||||||
                gdriveutils.downloadFile(None, "metadata.db", config.config_calibre_dir + "/metadata.db")
 | 
					                gdriveutils.downloadFile(None, "metadata.db", config.config_calibre_dir + "/metadata.db")
 | 
				
			||||||
| 
						 | 
					@ -3128,15 +3110,17 @@ def configuration_helper(origin):
 | 
				
			||||||
            logging.getLogger("book_formats").setLevel(config.config_log_level)
 | 
					            logging.getLogger("book_formats").setLevel(config.config_log_level)
 | 
				
			||||||
        except Exception as e:
 | 
					        except Exception as e:
 | 
				
			||||||
            flash(e, category="error")
 | 
					            flash(e, category="error")
 | 
				
			||||||
            return render_title_template("config_edit.html", content=config, origin=origin, gdrive=gdriveutils.gdrive_support,
 | 
					            return render_title_template("config_edit.html", content=config, origin=origin,
 | 
				
			||||||
                                         gdriveError=gdriveError, goodreads=goodreads_support, rarfile_support=rar_support,
 | 
					                                         gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError,
 | 
				
			||||||
 | 
					                                         goodreads=goodreads_support, rarfile_support=rar_support,
 | 
				
			||||||
                                         title=_(u"Basic Configuration"), page="config")
 | 
					                                         title=_(u"Basic Configuration"), page="config")
 | 
				
			||||||
        if db_change:
 | 
					        if db_change:
 | 
				
			||||||
            reload(db)
 | 
					            reload(db)
 | 
				
			||||||
            if not db.setup_db():
 | 
					            if not db.setup_db():
 | 
				
			||||||
                flash(_(u'DB location is not valid, please enter correct path'), category="error")
 | 
					                flash(_(u'DB location is not valid, please enter correct path'), category="error")
 | 
				
			||||||
                return render_title_template("config_edit.html", content=config, origin=origin, gdrive=gdriveutils.gdrive_support,
 | 
					                return render_title_template("config_edit.html", content=config, origin=origin,
 | 
				
			||||||
                                             gdriveError=gdriveError, goodreads=goodreads_support, rarfile_support=rar_support,
 | 
					                                             gdrive=gdriveutils.gdrive_support,gdriveError=gdriveError,
 | 
				
			||||||
 | 
					                                             goodreads=goodreads_support, rarfile_support=rar_support,
 | 
				
			||||||
                                             title=_(u"Basic Configuration"), page="config")
 | 
					                                             title=_(u"Basic Configuration"), page="config")
 | 
				
			||||||
        if reboot_required:
 | 
					        if reboot_required:
 | 
				
			||||||
            # stop Server
 | 
					            # stop Server
 | 
				
			||||||
| 
						 | 
					@ -3150,8 +3134,9 @@ def configuration_helper(origin):
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        gdrivefolders=list()
 | 
					        gdrivefolders=list()
 | 
				
			||||||
    return render_title_template("config_edit.html", origin=origin, success=success, content=config,
 | 
					    return render_title_template("config_edit.html", origin=origin, success=success, content=config,
 | 
				
			||||||
                                 show_authenticate_google_drive=not is_gdrive_ready(), gdrive=gdriveutils.gdrive_support,
 | 
					                                 show_authenticate_google_drive=not is_gdrive_ready(),
 | 
				
			||||||
                                 gdriveError=gdriveError, gdrivefolders=gdrivefolders, rarfile_support=rar_support,
 | 
					                                 gdrive=gdriveutils.gdrive_support, gdriveError=gdriveError,
 | 
				
			||||||
 | 
					                                 gdrivefolders=gdrivefolders, rarfile_support=rar_support,
 | 
				
			||||||
                                 goodreads=goodreads_support, title=_(u"Basic Configuration"), page="config")
 | 
					                                 goodreads=goodreads_support, title=_(u"Basic Configuration"), page="config")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3581,7 +3566,8 @@ def upload_single_file(request, book, book_id):
 | 
				
			||||||
                return redirect(url_for('show_book', book_id=book.id))
 | 
					                return redirect(url_for('show_book', book_id=book.id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            file_size = os.path.getsize(saved_filename)
 | 
					            file_size = os.path.getsize(saved_filename)
 | 
				
			||||||
            is_format = db.session.query(db.Data).filter(db.Data.book == book_id).filter(db.Data.format == file_ext.upper()).first()
 | 
					            is_format = db.session.query(db.Data).filter(db.Data.book == book_id).\
 | 
				
			||||||
 | 
					                filter(db.Data.format == file_ext.upper()).first()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Format entry already exists, no need to update the database
 | 
					            # Format entry already exists, no need to update the database
 | 
				
			||||||
            if is_format:
 | 
					            if is_format:
 | 
				
			||||||
| 
						 | 
					@ -3611,7 +3597,8 @@ def upload_cover(request, book):
 | 
				
			||||||
                try:
 | 
					                try:
 | 
				
			||||||
                    os.makedirs(filepath)
 | 
					                    os.makedirs(filepath)
 | 
				
			||||||
                except OSError:
 | 
					                except OSError:
 | 
				
			||||||
                    flash(_(u"Failed to create path for cover %(path)s (Permission denied).", cover=filepath), category="error")
 | 
					                    flash(_(u"Failed to create path for cover %(path)s (Permission denied).", cover=filepath),
 | 
				
			||||||
 | 
					                          category="error")
 | 
				
			||||||
                    return redirect(url_for('show_book', book_id=book.id))
 | 
					                    return redirect(url_for('show_book', book_id=book.id))
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                requested_file.save(saved_filename)
 | 
					                requested_file.save(saved_filename)
 | 
				
			||||||
| 
						 | 
					@ -3826,11 +3813,13 @@ def upload():
 | 
				
			||||||
            try:
 | 
					            try:
 | 
				
			||||||
                os.unlink(meta.file_path)
 | 
					                os.unlink(meta.file_path)
 | 
				
			||||||
            except OSError:
 | 
					            except OSError:
 | 
				
			||||||
                flash(_(u"Failed to delete file %(file)s (Permission denied).", file= meta.file_path), category="warning")
 | 
					                flash(_(u"Failed to delete file %(file)s (Permission denied).", file= meta.file_path),
 | 
				
			||||||
 | 
					                      category="warning")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if meta.cover is None:
 | 
					            if meta.cover is None:
 | 
				
			||||||
                has_cover = 0
 | 
					                has_cover = 0
 | 
				
			||||||
                copyfile(os.path.join(config.get_main_dir, "cps/static/generic_cover.jpg"), os.path.join(filepath, "cover.jpg"))
 | 
					                copyfile(os.path.join(config.get_main_dir, "cps/static/generic_cover.jpg"),
 | 
				
			||||||
 | 
					                         os.path.join(filepath, "cover.jpg"))
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                has_cover = 1
 | 
					                has_cover = 1
 | 
				
			||||||
                move(meta.cover, os.path.join(filepath, "cover.jpg"))
 | 
					                move(meta.cover, os.path.join(filepath, "cover.jpg"))
 | 
				
			||||||
| 
						 | 
					@ -3896,8 +3885,7 @@ def upload():
 | 
				
			||||||
            # save data to database, reread data
 | 
					            # save data to database, reread data
 | 
				
			||||||
            db.session.commit()
 | 
					            db.session.commit()
 | 
				
			||||||
            db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort)
 | 
					            db.session.connection().connection.connection.create_function("title_sort", 1, db.title_sort)
 | 
				
			||||||
            book = db.session.query(db.Books) \
 | 
					            book = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first()
 | 
				
			||||||
                .filter(db.Books.id == book_id).filter(common_filters()).first()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # upload book to gdrive if nesseccary and add "(bookid)" to folder name
 | 
					            # upload book to gdrive if nesseccary and add "(bookid)" to folder name
 | 
				
			||||||
            if config.config_use_google_drive:
 | 
					            if config.config_use_google_drive:
 | 
				
			||||||
| 
						 | 
					@ -3919,14 +3907,18 @@ def upload():
 | 
				
			||||||
            for author in db_book.authors:
 | 
					            for author in db_book.authors:
 | 
				
			||||||
                author_names.append(author.name)
 | 
					                author_names.append(author.name)
 | 
				
			||||||
            if len(request.files.getlist("btn-upload")) < 2:
 | 
					            if len(request.files.getlist("btn-upload")) < 2:
 | 
				
			||||||
                cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all()
 | 
					                cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.
 | 
				
			||||||
 | 
					                                                                datatype.notin_(db.cc_exceptions)).all()
 | 
				
			||||||
                if current_user.role_edit() or current_user.role_admin():
 | 
					                if current_user.role_edit() or current_user.role_admin():
 | 
				
			||||||
                    return render_title_template('book_edit.html', book=book, authors=author_names,
 | 
					                    return render_title_template('book_edit.html', book=book, authors=author_names,
 | 
				
			||||||
                                                 cc=cc, title=_(u"edit metadata"), page="upload")
 | 
					                                                 cc=cc, title=_(u"edit metadata"), page="upload")
 | 
				
			||||||
                book_in_shelfs = []
 | 
					                book_in_shelfs = []
 | 
				
			||||||
                flg_send_to_kindle = helper.chk_send_to_kindle(book_id)
 | 
					                kindle_list = helper.check_send_to_kindle(book)
 | 
				
			||||||
 | 
					                reader_list = helper.check_read_formats(book)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                return render_title_template('detail.html', entry=book, cc=cc,
 | 
					                return render_title_template('detail.html', entry=book, cc=cc,
 | 
				
			||||||
                                             title=book.title, books_shelfs=book_in_shelfs, flg_kindle=flg_send_to_kindle, page="upload")
 | 
					                                             title=book.title, books_shelfs=book_in_shelfs, kindle_list=kindle_list,
 | 
				
			||||||
 | 
					                                             reader_list=reader_list, page="upload")
 | 
				
			||||||
    return redirect(url_for("index"))
 | 
					    return redirect(url_for("index"))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user