Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add send to ereader permission #2892

Open
wants to merge 16 commits into
base: Develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,12 @@ cps/cache
*.bak
*.log.*
.key
.venv

settings.yaml
gdrive_credentials
client_secrets.json
gmail.json
/.key

pages/
2 changes: 1 addition & 1 deletion cps/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -1981,7 +1981,7 @@ def _handle_edit_user(to_save, content, languages, translations, kobo_support):
return redirect(url_for('admin.admin'))

val = [int(k[5:]) for k in to_save if k.startswith('show_')]
sidebar, __ = get_sidebar_config()
sidebar, __, __, __ = get_sidebar_config()
for element in sidebar:
value = element['visibility']
if value in val and not content.check_visibility(value):
Expand Down
2 changes: 2 additions & 0 deletions cps/constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
ROLE_EDIT_SHELFS = 1 << 6
ROLE_DELETE_BOOKS = 1 << 7
ROLE_VIEWER = 1 << 8
ROLE_SEND_TO_EREADER = 1 << 9

ALL_ROLES = {
"admin_role": ROLE_ADMIN,
Expand All @@ -78,6 +79,7 @@
"edit_shelf_role": ROLE_EDIT_SHELFS,
"delete_role": ROLE_DELETE_BOOKS,
"viewer_role": ROLE_VIEWER,
"send_to_ereader": ROLE_SEND_TO_EREADER,
}

DETAIL_RANDOM = 1 << 0
Expand Down
108 changes: 108 additions & 0 deletions cps/editpage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import os
import flask
from flask import Blueprint, Flask, abort, request
from functools import wraps
from pathlib import Path
from flask_login import current_user, login_required
from werkzeug.exceptions import NotFound

from .render_template import render_title_template
from . import logger, config, ub
from .constants import CONFIG_DIR as _CONFIG_DIR

log = logger.create()

editpage = Blueprint('editpage', __name__)

def edit_required(f):
@wraps(f)
def inner(*args, **kwargs):
if current_user.role_edit() or current_user.role_admin():
return f(*args, **kwargs)
abort(403)

return inner

def _get_checkbox(dictionary, field, default):
new_value = dictionary.get(field, default)
convertor = lambda y: y == "on"
new_value = convertor(new_value)

return new_value

@editpage.route("/admin/page/<string:file>", methods=["GET", "POST"])
@login_required
@edit_required
def edit_page(file):
doc = ""
title = ""
name = ""
icon = "file"
is_enabled = True
order = 0
position = "0"

page = ub.session.query(ub.Page).filter(ub.Page.id == file).first()

try:
title = page.title
name = page.name
icon = page.icon
is_enabled = page.is_enabled
order = page.order
position = page.position
except AttributeError:
if file != "new":
abort(404)

if request.method == "POST":
to_save = request.form.to_dict()
title = to_save.get("title", "").strip()
name = to_save.get("name", "").strip()
icon = to_save.get("icon", "").strip()
position = to_save.get("position", "").strip()
order = int(to_save.get("order", 0))
content = to_save.get("content", "").strip()
is_enabled = _get_checkbox(to_save, "is_enabled", True)

if page:
page.title = title
page.name = name
page.icon = icon
page.is_enabled = is_enabled
page.order = order
page.position = position
ub.session_commit("Page edited {}".format(file))
else:
new_page = ub.Page(title=title, name=name, icon=icon, is_enabled=is_enabled, order=order, position=position)
ub.session.add(new_page)
ub.session_commit("Page added {}".format(file))

if (file == "new"):
file = str(new_page.id)
dir_config_path = os.path.join(_CONFIG_DIR, 'pages')
file_name = Path(name + '.md')
file_path = dir_config_path / file_name
os.makedirs(dir_config_path, exist_ok=True)

try:
with open(file_path, 'w') as f:
f.write(content)
f.close()
except Exception as ex:
log.error(ex)

if file != "new":
try:
dir_config_path = Path(_CONFIG_DIR) / 'pages'
file_path = dir_config_path / f"{name}.md"

with open(file_path, 'r') as f:
doc = f.read()
except NotFound:
log.error("'%s' was accessed but file doesn't exists." % file)

else:
doc = "## New file\n\nInformation"

return render_title_template("edit_page.html", title=title, name=name, icon=icon, is_enabled=is_enabled, order=order, position=position, content=doc, file=file)
2 changes: 1 addition & 1 deletion cps/kobo.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@

KOBO_FORMATS = {"KEPUB": ["KEPUB"], "EPUB": ["EPUB3", "EPUB"]}
KOBO_STOREAPI_URL = "https://storeapi.kobo.com"
KOBO_IMAGEHOST_URL = "https://kbimages1-a.akamaihd.net"
KOBO_IMAGEHOST_URL = "https://cdn.kobo.com/book-images"

SYNC_ITEM_LIMIT = 100

Expand Down
28 changes: 28 additions & 0 deletions cps/listpages.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import flask
import json
from flask import Blueprint, jsonify, make_response,abort
from flask_login import current_user, login_required
from functools import wraps
from flask_babel import gettext as _

from .render_template import render_title_template
from . import ub, db

listpages = Blueprint('listpages', __name__)

def edit_required(f):
@wraps(f)
def inner(*args, **kwargs):
if current_user.role_edit() or current_user.role_admin():
return f(*args, **kwargs)
abort(403)

return inner

@listpages.route("/admin/pages/", methods=["GET"])
@login_required
@edit_required
def show_list():
pages = ub.session.query(ub.Page).order_by(ub.Page.position).order_by(ub.Page.order).all()

return render_title_template('list_pages.html', title=_("Pages List"), page="book_table", pages=pages)
6 changes: 6 additions & 0 deletions cps/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ def main():
from .gdrive import gdrive
from .editbooks import editbook
from .about import about
from .page import page
from .listpages import listpages
from .editpage import editpage
from .search import search
from .search_metadata import meta
from .shelf import shelf
Expand Down Expand Up @@ -65,6 +68,9 @@ def main():
limiter.limit("3/minute",key_func=request_username)(opds)
app.register_blueprint(jinjia)
app.register_blueprint(about)
app.register_blueprint(page)
app.register_blueprint(listpages)
app.register_blueprint(editpage)
app.register_blueprint(shelf)
app.register_blueprint(admi)
app.register_blueprint(remotelogin)
Expand Down
5 changes: 3 additions & 2 deletions cps/metadata_provider/douban.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,8 @@ def _parse_single_book(self,
),
)

html = etree.HTML(r.content.decode("utf8"))
decode_content = r.content.decode("utf8")
html = etree.HTML(decode_content)

match.title = html.xpath(self.TITTLE_XPATH)[0].text
match.cover = html.xpath(
Expand All @@ -184,7 +185,7 @@ def _parse_single_book(self,
if len(tag_elements):
match.tags = [tag_element.text for tag_element in tag_elements]
else:
match.tags = self._get_tags(html.text)
match.tags = self._get_tags(decode_content)

description_element = html.xpath(self.DESCRIPTION_XPATH)
if len(description_element):
Expand Down
38 changes: 38 additions & 0 deletions cps/page.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import os
import flask
import markdown
from flask import abort
from pathlib import Path
from flask_babel import gettext as _
from werkzeug.exceptions import NotFound

from . import logger, config, ub
from .render_template import render_title_template
from .constants import CONFIG_DIR as _CONFIG_DIR

page = flask.Blueprint('page', __name__)

log = logger.create()

@page.route('/page/<string:file>', methods=['GET'])
def get_page(file):
page = ub.session.query(ub.Page)\
.filter(ub.Page.name == file)\
.filter(ub.Page.is_enabled)\
.first()

if not page:
log.error(f"'{file}' was accessed but is not enabled or it's not in database.")
abort(404)

try:
dir_config_path = Path(_CONFIG_DIR) / 'pages'
file_path = dir_config_path / f"{file}.md"
with open(file_path, 'r') as f:
temp_md = f.read()
body = markdown.markdown(temp_md)

return render_title_template('page.html', body=body, title=page.title, page=page.name)
except NotFound:
log.error("'%s' was accessed but file doesn't exists." % file)
abort(404)
14 changes: 12 additions & 2 deletions cps/render_template.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,14 +104,24 @@ def get_sidebar_config(kwargs=None):
g.shelves_access = ub.session.query(ub.Shelf).filter(
or_(ub.Shelf.is_public == 1, ub.Shelf.user_id == current_user.id)).order_by(ub.Shelf.name).all()

return sidebar, simple
top_pages = ub.session.query(ub.Page)\
.filter(ub.Page.position == "1")\
.filter(ub.Page.is_enabled)\
.order_by(ub.Page.order)
bottom_pages = ub.session.query(ub.Page)\
.filter(ub.Page.position == "0")\
.filter(ub.Page.is_enabled)\
.order_by(ub.Page.order)

return sidebar, simple, top_pages, bottom_pages


# Returns the template for rendering and includes the instance name
def render_title_template(*args, **kwargs):
sidebar, simple = get_sidebar_config(kwargs)
sidebar, simple, top_pages, bottom_pages = get_sidebar_config(kwargs)
try:
return render_template(instance=config.config_calibre_web_title, sidebar=sidebar, simple=simple,
top_pages=top_pages, bottom_pages=bottom_pages,
accept=constants.EXTENSIONS_UPLOAD,
*args, **kwargs)
except PermissionError:
Expand Down
45 changes: 41 additions & 4 deletions cps/static/css/caliBlur.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion cps/tasks/thumbnail.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,7 +218,7 @@ def generate_book_thumbnail(self, book, thumbnail):
filename = self.cache.get_cache_file_path(thumbnail.filename, constants.CACHE_TYPE_THUMBNAILS)
if img.height > height:
width = get_resize_width(thumbnail.resolution, img.width, img.height)
img.resize(width=width, height=height, filter='lanczos')
img.resize(width=width, height=height)#, filter='lanczos')
img.format = thumbnail.format
img.save(filename=filename)
else:
Expand Down
Loading