Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
douban-api-proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
captainwong
douban-api-proxy
Commits
d3f8153b
Commit
d3f8153b
authored
Mar 20, 2021
by
Ozzie Isaacs
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' into development
parents
5d8d7968
99ecf227
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
176 additions
and
118 deletions
+176
-118
config.yml
.github/ISSUE_TEMPLATE/config.yml
+1
-0
caliBlur.js
cps/static/js/caliBlur.js
+33
-0
search_form.html
cps/templates/search_form.html
+92
-73
web.py
cps/web.py
+50
-45
No files found.
.github/ISSUE_TEMPLATE/config.yml
0 → 100644
View file @
d3f8153b
blank_issues_enabled
:
false
cps/static/js/caliBlur.js
View file @
d3f8153b
...
...
@@ -403,6 +403,39 @@ $("div.comments").readmore({
// End of Global Work //
///////////////////////////////
// Advanced Search Results
if
(
$
(
"body.advsearch"
).
length
>
0
)
{
$
(
"#loader + .container-fluid"
)
.
prepend
(
"<div class='blur-wrapper'></div>"
);
$
(
"#add-to-shelves"
).
insertBefore
(
".blur-wrapper"
);
$
(
'div[aria-label="Add to shelves"]'
).
click
(
function
()
{
$
(
"#add-to-shelves"
).
toggle
();
});
$
(
'#add-to-shelf'
).
height
(
"40px"
);
function
dropdownToggle
()
{
topPos
=
$
(
"#add-to-shelf"
).
offset
().
top
-
20
;
if
(
$
(
'div[aria-label="Add to shelves"]'
).
length
>
0
)
{
position
=
$
(
'div[aria-label="Add to shelves"]'
).
offset
().
left
if
(
position
+
$
(
"#add-to-shelves"
).
width
()
>
$
(
window
).
width
())
{
positionOff
=
position
+
$
(
"#add-to-shelves"
).
width
()
-
$
(
window
).
width
();
adsPosition
=
position
-
positionOff
-
5
$
(
"#add-to-shelves"
).
attr
(
"style"
,
"left: "
+
adsPosition
+
"px !important; right: auto; top: "
+
topPos
+
"px"
);
}
else
{
$
(
"#add-to-shelves"
).
attr
(
"style"
,
"left: "
+
position
+
"px !important; right: auto; top: "
+
topPos
+
"px"
);
}
}
}
dropdownToggle
();
$
(
window
).
on
(
"resize"
,
function
()
{
dropdownToggle
();
});
}
// Author Page Background Blur
if
(
$
(
"body.author"
).
length
>
0
)
{
cover
=
$
(
".author-bio img"
).
attr
(
"src"
);
...
...
cps/templates/search_form.html
View file @
d3f8153b
...
...
@@ -42,7 +42,7 @@
<div
class=
"row"
>
<div
class=
"form-group col-sm-6"
id=
"tag"
>
<div><label
for=
"include_tag"
>
{{_('Tags')}}
</label></div>
<select
class=
"selectpicker"
name=
"include_tag"
id=
"include_tag"
data-live-search=
"true"
data-style=
"btn-primary"
multiple
>
<select
class=
"selectpicker"
name=
"include_tag"
id=
"include_tag"
data-live-search=
"true"
data-style=
"btn-primary"
data-dropup-auto=
"false"
multiple
>
{% for tag in tags %}
<option
class=
"tags_click"
value=
"{{tag.id}}"
>
{{tag.name}}
</option>
{% endfor %}
...
...
@@ -50,7 +50,7 @@
</div>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"exclude_tag"
>
{{_('Exclude Tags')}}
</label></div>
<select
class=
"selectpicker"
name=
"exclude_tag"
id=
"exclude_tag"
data-live-search=
"true"
data-style=
"btn-danger"
multiple
>
<select
class=
"selectpicker"
name=
"exclude_tag"
id=
"exclude_tag"
data-live-search=
"true"
data-style=
"btn-danger"
data-dropup-auto=
"false"
multiple
>
{% for tag in tags %}
<option
class=
"tags_click"
value=
"{{tag.id}}"
>
{{tag.name}}
</option>
{% endfor %}
...
...
@@ -60,7 +60,7 @@
<div
class=
"row"
>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"include_serie"
>
{{_('Series')}}
</label></div>
<select
class=
"selectpicker"
name=
"include_serie"
id=
"include_serie"
data-live-search=
"true"
data-style=
"btn-primary"
multiple
>
<select
class=
"selectpicker"
name=
"include_serie"
id=
"include_serie"
data-live-search=
"true"
data-style=
"btn-primary"
data-dropup-auto=
"false"
data-actions-box=
"true"
multiple
>
{% for serie in series %}
<option
value=
"{{serie.id}}"
>
{{serie.name}}
</option>
{% endfor %}
...
...
@@ -68,18 +68,37 @@
</div>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"exclude_serie"
>
{{_('Exclude Series')}}
</label></div>
<select
class=
"selectpicker"
name=
"exclude_serie"
id=
"exclude_serie"
data-live-search=
"true"
data-style=
"btn-danger"
multiple
>
<select
class=
"selectpicker"
name=
"exclude_serie"
id=
"exclude_serie"
data-live-search=
"true"
data-style=
"btn-danger"
data-dropup-auto=
"false"
data-actions-box=
"true"
multiple
>
{% for serie in series %}
<option
value=
"{{serie.id}}"
>
{{serie.name}}
</option>
{% endfor %}
</select>
</div>
</div>
<div
class=
"row"
>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"include_shelf"
>
{{_('Shelves')}}
</label></div>
<select
class=
"selectpicker"
name=
"include_shelf"
id=
"include_shelf"
data-live-search=
"true"
data-style=
"btn-primary"
data-dropup-auto=
"false"
data-actions-box=
"true"
multiple
>
{% for shelf in shelves %}
<option
value=
"{{shelf.id}}"
>
{{shelf.name}}
</option>
{% endfor %}
</select>
</div>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"exclude_shelf"
>
{{_('Exclude Shelves')}}
</label></div>
<select
class=
"selectpicker"
name=
"exclude_shelf"
id=
"exclude_shelf"
data-live-search=
"true"
data-style=
"btn-danger"
data-dropup-auto=
"false"
data-actions-box=
"true"
multiple
>
{% for shelf in shelves %}
<option
value=
"{{shelf.id}}"
>
{{shelf.name}}
</option>
{% endfor %}
</select>
</div>
</div>
{% if languages %}
<div
class=
"row"
>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"include_language"
>
{{_('Languages')}}
</label></div>
<select
class=
"selectpicker"
name=
"include_language"
id=
"include_language"
data-live-search=
"true"
data-style=
"btn-primary"
multiple
>
<select
class=
"selectpicker"
name=
"include_language"
id=
"include_language"
data-live-search=
"true"
data-style=
"btn-primary"
data-dropup-auto=
"false"
data-actions-box=
"true"
multiple
>
{% for language in languages %}
<option
value=
"{{language.id}}"
>
{{language.name}}
</option>
{% endfor %}
...
...
@@ -87,7 +106,7 @@
</div>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"exclude_language"
>
{{_('Exclude Languages')}}
</label></div>
<select
class=
"selectpicker"
name=
"exclude_language"
id=
"exclude_language"
data-live-search=
"true"
data-style=
"btn-danger"
multiple
>
<select
class=
"selectpicker"
name=
"exclude_language"
id=
"exclude_language"
data-live-search=
"true"
data-style=
"btn-danger"
data-dropup-auto=
"false"
data-actions-box=
"true"
multiple
>
{% for language in languages %}
<option
value=
"{{language.id}}"
>
{{language.name}}
</option>
{% endfor %}
...
...
@@ -98,7 +117,7 @@
<div
class=
"row"
>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"include_extension"
>
{{_('Extensions')}}
</label></div>
<select
class=
"selectpicker"
name=
"include_extension"
id=
"include_extension"
data-live-search=
"true"
data-style=
"btn-primary"
multiple
>
<select
class=
"selectpicker"
name=
"include_extension"
id=
"include_extension"
data-live-search=
"true"
data-style=
"btn-primary"
data-dropup-auto=
"false"
data-actions-box=
"true"
multiple
>
{% for extension in extensions %}
<option
value=
"{{extension.format}}"
>
{{extension.format}}
</option>
{% endfor %}
...
...
@@ -106,7 +125,7 @@
</div>
<div
class=
"form-group col-sm-6"
>
<div><label
for=
"exclude_extension"
>
{{_('Exclude Extensions')}}
</label></div>
<select
class=
"selectpicker"
name=
"exclude_extension"
id=
"exclude_extension"
data-live-search=
"true"
data-style=
"btn-danger"
multiple
>
<select
class=
"selectpicker"
name=
"exclude_extension"
id=
"exclude_extension"
data-live-search=
"true"
data-style=
"btn-danger"
data-dropup-auto=
"false"
data-actions-box=
"true"
multiple
>
{% for extension in extensions %}
<option
value=
"{{extension.format}}"
>
{{extension.format}}
</option>
{% endfor %}
...
...
cps/web.py
View file @
d3f8153b
...
...
@@ -37,7 +37,7 @@ from flask import session as flask_session
from
flask_babel
import
gettext
as
_
from
flask_login
import
login_user
,
logout_user
,
login_required
,
current_user
from
sqlalchemy.exc
import
IntegrityError
,
InvalidRequestError
,
OperationalError
from
sqlalchemy.sql.expression
import
text
,
func
,
false
,
not_
,
and_
from
sqlalchemy.sql.expression
import
text
,
func
,
false
,
not_
,
and_
,
or_
from
sqlalchemy.orm.attributes
import
flag_modified
from
sqlalchemy.sql.functions
import
coalesce
...
...
@@ -687,6 +687,9 @@ def render_prepare_search_form(cc):
.
group_by
(
text
(
'books_series_link.series'
))
\
.
order_by
(
db
.
Series
.
name
)
\
.
filter
(
calibre_db
.
common_filters
())
.
all
()
shelves
=
ub
.
session
.
query
(
ub
.
Shelf
)
\
.
filter
(
or_
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
user_id
==
int
(
current_user
.
id
)))
\
.
order_by
(
ub
.
Shelf
.
name
)
.
all
()
extensions
=
calibre_db
.
session
.
query
(
db
.
Data
)
\
.
join
(
db
.
Books
)
\
.
filter
(
calibre_db
.
common_filters
())
\
...
...
@@ -697,7 +700,7 @@ def render_prepare_search_form(cc):
else
:
languages
=
None
return
render_title_template
(
'search_form.html'
,
tags
=
tags
,
languages
=
languages
,
extensions
=
extensions
,
series
=
series
,
title
=
_
(
u"Advanced Search"
),
cc
=
cc
,
page
=
"advsearch"
)
series
=
series
,
shelves
=
shelves
,
title
=
_
(
u"Advanced Search"
),
cc
=
cc
,
page
=
"advsearch"
)
def
render_search_results
(
term
,
offset
=
None
,
order
=
None
,
limit
=
None
):
...
...
@@ -989,7 +992,7 @@ def search():
@
login_required_if_no_ano
def
advanced_search
():
values
=
dict
(
request
.
form
)
params
=
[
'include_tag'
,
'exclude_tag'
,
'include_serie'
,
'exclude_serie'
,
'include_language'
,
params
=
[
'include_tag'
,
'exclude_tag'
,
'include_serie'
,
'exclude_serie'
,
'include_
shelf'
,
'exclude_shelf'
,
'include_
language'
,
'exclude_language'
,
'include_extension'
,
'exclude_extension'
]
for
param
in
params
:
values
[
param
]
=
list
(
request
.
form
.
getlist
(
param
))
...
...
@@ -1081,6 +1084,12 @@ def adv_search_serie(q, include_series_inputs, exclude_series_inputs):
q
=
q
.
filter
(
not_
(
db
.
Books
.
series
.
any
(
db
.
Series
.
id
==
serie
)))
return
q
def
adv_search_shelf
(
q
,
include_shelf_inputs
,
exclude_shelf_inputs
):
q
=
q
.
outerjoin
(
ub
.
BookShelf
,
db
.
Books
.
id
==
ub
.
BookShelf
.
book_id
)
\
.
filter
(
or_
(
ub
.
BookShelf
.
shelf
==
None
,
ub
.
BookShelf
.
shelf
.
notin_
(
exclude_shelf_inputs
)))
if
len
(
include_shelf_inputs
)
>
0
:
q
=
q
.
filter
(
ub
.
BookShelf
.
shelf
.
in_
(
include_shelf_inputs
))
return
q
def
extend_search_term
(
searchterm
,
author_name
,
...
...
@@ -1088,16 +1097,10 @@ def extend_search_term(searchterm,
publisher
,
pub_start
,
pub_end
,
include_tag_inputs
,
exclude_tag_inputs
,
include_series_inputs
,
exclude_series_inputs
,
include_languages_inputs
,
tags
,
rating_high
,
rating_low
,
read_status
,
include_extension_inputs
,
exclude_extension_inputs
):
searchterm
.
extend
((
author_name
.
replace
(
'|'
,
','
),
book_title
,
publisher
))
if
pub_start
:
...
...
@@ -1114,16 +1117,27 @@ def extend_search_term(searchterm,
format
=
'medium'
,
locale
=
get_locale
())])
except
ValueError
:
pub_start
=
u""
tag_names
=
calibre_db
.
session
.
query
(
db
.
Tags
)
.
filter
(
db
.
Tags
.
id
.
in_
(
include_tag_inputs
))
.
all
()
elements
=
{
'tag'
:
db
.
Tags
,
'serie'
:
db
.
Series
,
'shelf'
:
ub
.
Shelf
}
for
key
,
db_element
in
elements
.
items
():
tag_names
=
calibre_db
.
session
.
query
(
db_element
)
.
filter
(
db_element
.
id
.
in_
(
tags
[
'include_'
+
key
]))
.
all
()
searchterm
.
extend
(
tag
.
name
for
tag
in
tag_names
)
tag_names
=
calibre_db
.
session
.
query
(
db
.
Tags
)
.
filter
(
db
.
Tags
.
id
.
in_
(
exclude_tag_inputs
))
.
all
()
tag_names
=
calibre_db
.
session
.
query
(
db_element
)
.
filter
(
db
.
Tags
.
id
.
in_
(
tags
[
'exclude_'
+
key
]
))
.
all
()
searchterm
.
extend
(
tag
.
name
for
tag
in
tag_names
)
serie_names
=
calibre_db
.
session
.
query
(
db
.
Series
)
.
filter
(
db
.
Series
.
id
.
in_
(
include_series_inputs
))
.
all
()
searchterm
.
extend
(
serie
.
name
for
serie
in
serie_names
)
serie_names
=
calibre_db
.
session
.
query
(
db
.
Series
)
.
filter
(
db
.
Series
.
id
.
in_
(
exclude_series_inputs
))
.
all
()
searchterm
.
extend
(
serie
.
name
for
serie
in
serie_names
)
#serie_names = calibre_db.session.query(db.Series).filter(db.Series.id.in_(tags['include_serie'])).all()
#searchterm.extend(serie.name for serie in serie_names)
#serie_names = calibre_db.session.query(db.Series).filter(db.Series.id.in_(tags['include_serie'])).all()
#searchterm.extend(serie.name for serie in serie_names)
#shelf_names = ub.session.query(ub.Shelf).filter(ub.Shelf.id.in_(tags['include_shelf'])).all()
#searchterm.extend(shelf.name for shelf in shelf_names)
#shelf_names = ub.session.query(ub.Shelf).filter(ub.Shelf.id.in_(tags['include_shelf'])).all()
#searchterm.extend(shelf.name for shelf in shelf_names)
language_names
=
calibre_db
.
session
.
query
(
db
.
Languages
)
.
\
filter
(
db
.
Languages
.
id
.
in_
(
tags
[
'include_language'
]))
.
all
()
if
language_names
:
language_names
=
calibre_db
.
speaking_language
(
language_names
)
searchterm
.
extend
(
language
.
name
for
language
in
language_names
)
language_names
=
calibre_db
.
session
.
query
(
db
.
Languages
)
.
\
filter
(
db
.
Languages
.
id
.
in_
(
include_languages_inputs
))
.
all
()
filter
(
db
.
Languages
.
id
.
in_
(
tags
[
'exclude_language'
]
))
.
all
()
if
language_names
:
language_names
=
calibre_db
.
speaking_language
(
language_names
)
searchterm
.
extend
(
language
.
name
for
language
in
language_names
)
...
...
@@ -1133,8 +1147,8 @@ def extend_search_term(searchterm,
searchterm
.
extend
([
_
(
u"Rating >=
%(rating)
s"
,
rating
=
rating_low
)])
if
read_status
:
searchterm
.
extend
([
_
(
u"Read Status =
%(status)
s"
,
status
=
read_status
)])
searchterm
.
extend
(
ext
for
ext
in
include_extension_inputs
)
searchterm
.
extend
(
ext
for
ext
in
exclude_extension_inputs
)
searchterm
.
extend
(
ext
for
ext
in
tags
[
'include_extension'
]
)
searchterm
.
extend
(
ext
for
ext
in
tags
[
'exclude_extension'
]
)
# handle custom columns
searchterm
=
" + "
.
join
(
filter
(
None
,
searchterm
))
return
searchterm
,
pub_start
,
pub_end
...
...
@@ -1148,14 +1162,12 @@ def render_adv_search_results(term, offset=None, order=None, limit=None):
calibre_db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
"lower"
,
1
,
db
.
lcase
)
q
=
calibre_db
.
session
.
query
(
db
.
Books
)
.
filter
(
calibre_db
.
common_filters
(
True
))
include_tag_inputs
=
term
.
get
(
'include_tag'
)
exclude_tag_inputs
=
term
.
get
(
'exclude_tag'
)
include_series_inputs
=
term
.
get
(
'include_serie'
)
exclude_series_inputs
=
term
.
get
(
'exclude_serie'
)
include_languages_inputs
=
term
.
get
(
'include_language'
)
exclude_languages_inputs
=
term
.
get
(
'exclude_language'
)
include_extension_inputs
=
term
.
get
(
'include_extension'
)
exclude_extension_inputs
=
term
.
get
(
'exclude_extension'
)
# parse multiselects to a complete dict
tags
=
dict
()
elements
=
[
'tag'
,
'serie'
,
'shelf'
,
'language'
,
'extension'
]
for
element
in
elements
:
tags
[
'include_'
+
element
]
=
term
.
get
(
'include_'
+
element
)
tags
[
'exclude_'
+
element
]
=
term
.
get
(
'exclude_'
+
element
)
author_name
=
term
.
get
(
"author_name"
)
book_title
=
term
.
get
(
"book_title"
)
...
...
@@ -1180,26 +1192,18 @@ def render_adv_search_results(term, offset=None, order=None, limit=None):
searchterm
.
extend
([(
u"
%
s:
%
s"
%
(
c
.
name
,
term
.
get
(
'custom_column_'
+
str
(
c
.
id
))))])
cc_present
=
True
if
include_tag_inputs
or
exclude_tag_inputs
or
include_series_inputs
or
exclude_series_inputs
or
\
include_languages_inputs
or
exclude_languages_inputs
or
author_name
or
book_title
or
\
publisher
or
pub_start
or
pub_end
or
rating_low
or
rating_high
or
description
or
cc_present
or
\
include_extension_inputs
or
exclude_extension_inputs
or
read_status
:
if
any
(
tags
.
values
())
or
author_name
or
book_title
or
publisher
or
pub_start
or
pub_end
or
rating_low
\
or
rating_high
or
description
or
cc_present
or
read_status
:
searchterm
,
pub_start
,
pub_end
=
extend_search_term
(
searchterm
,
author_name
,
book_title
,
publisher
,
pub_start
,
pub_end
,
include_tag_inputs
,
exclude_tag_inputs
,
include_series_inputs
,
exclude_series_inputs
,
include_languages_inputs
,
tags
,
rating_high
,
rating_low
,
read_status
,
include_extension_inputs
,
exclude_extension_inputs
)
read_status
)
q
=
q
.
filter
()
if
author_name
:
q
=
q
.
filter
(
db
.
Books
.
authors
.
any
(
func
.
lower
(
db
.
Authors
.
name
)
.
ilike
(
"
%
"
+
author_name
+
"
%
"
)))
...
...
@@ -1212,10 +1216,11 @@ def render_adv_search_results(term, offset=None, order=None, limit=None):
q
=
adv_search_read_status
(
q
,
read_status
)
if
publisher
:
q
=
q
.
filter
(
db
.
Books
.
publishers
.
any
(
func
.
lower
(
db
.
Publishers
.
name
)
.
ilike
(
"
%
"
+
publisher
+
"
%
"
)))
q
=
adv_search_tag
(
q
,
include_tag_inputs
,
exclude_tag_inputs
)
q
=
adv_search_serie
(
q
,
include_series_inputs
,
exclude_series_inputs
)
q
=
adv_search_extension
(
q
,
include_extension_inputs
,
exclude_extension_inputs
)
q
=
adv_search_language
(
q
,
include_languages_inputs
,
exclude_languages_inputs
)
q
=
adv_search_tag
(
q
,
tags
[
'include_tag'
],
tags
[
'exclude_tag'
])
q
=
adv_search_serie
(
q
,
tags
[
'include_serie'
],
tags
[
'exclude_serie'
])
q
=
adv_search_shelf
(
q
,
tags
[
'include_shelf'
],
tags
[
'exclude_shelf'
])
q
=
adv_search_extension
(
q
,
tags
[
'include_extension'
],
tags
[
'exclude_extension'
])
q
=
adv_search_language
(
q
,
tags
[
'include_language'
],
tags
[
'exclude_language'
])
q
=
adv_search_ratings
(
q
,
rating_high
,
rating_low
)
if
description
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment