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
22344a39
Commit
22344a39
authored
Jun 18, 2020
by
Ozzieisaacs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improvements for delete book
parent
8dde6ba6
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
107 additions
and
59 deletions
+107
-59
editbooks.py
cps/editbooks.py
+47
-14
main.js
cps/static/js/main.js
+54
-0
table.js
cps/static/js/table.js
+1
-38
book_edit.html
cps/templates/book_edit.html
+2
-4
book_table.html
cps/templates/book_table.html
+1
-1
modal_dialogs.html
cps/templates/modal_dialogs.html
+2
-2
No files found.
cps/editbooks.py
View file @
22344a39
...
@@ -170,20 +170,42 @@ def modify_identifiers(input_identifiers, db_identifiers, db_session):
...
@@ -170,20 +170,42 @@ def modify_identifiers(input_identifiers, db_identifiers, db_session):
changed
=
True
changed
=
True
return
changed
return
changed
@
editbook
.
route
(
"/ajax/delete/<int:book_id>"
)
@
login_required
def
delete_book_from_details
(
book_id
):
return
delete_book
(
book_id
,
""
,
True
)
@
editbook
.
route
(
"/delete/<int:book_id>
/
"
,
defaults
=
{
'book_format'
:
""
})
@
editbook
.
route
(
"/delete/<int:book_id>"
,
defaults
=
{
'book_format'
:
""
})
@
editbook
.
route
(
"/delete/<int:book_id>/<string:book_format>
/
"
)
@
editbook
.
route
(
"/delete/<int:book_id>/<string:book_format>"
)
@
login_required
@
login_required
def
delete_book
(
book_id
,
book_format
):
def
delete_book_ajax
(
book_id
,
book_format
):
return
delete_book
(
book_id
,
book_format
,
False
)
def
delete_book
(
book_id
,
book_format
,
jsonResponse
):
warning
=
{}
if
current_user
.
role_delete_books
():
if
current_user
.
role_delete_books
():
book
=
calibre_db
.
get_book
(
book_id
)
book
=
calibre_db
.
get_book
(
book_id
)
if
book
:
if
book
:
try
:
try
:
result
,
error
=
helper
.
delete_book
(
book
,
config
.
config_calibre_dir
,
book_format
=
book_format
.
upper
())
result
,
error
=
helper
.
delete_book
(
book
,
config
.
config_calibre_dir
,
book_format
=
book_format
.
upper
())
if
not
result
:
if
not
result
:
if
jsonResponse
:
return
Response
(
json
.
dumps
({
"location"
:
url_for
(
"editbook.edit_book"
),
"type"
:
"alert"
,
"format"
:
""
,
"error"
:
error
}),
mimetype
=
'application/json'
)
else
:
flash
(
error
,
category
=
"error"
)
flash
(
error
,
category
=
"error"
)
return
redirect
(
url_for
(
'editbook.edit_book'
,
book_id
=
book_id
))
return
redirect
(
url_for
(
'editbook.edit_book'
,
book_id
=
book_id
))
if
error
:
if
error
:
if
jsonResponse
:
warning
=
{
"location"
:
url_for
(
"editbook.edit_book"
),
"type"
:
"warning"
,
"format"
:
""
,
"error"
:
error
}
else
:
flash
(
error
,
category
=
"warning"
)
flash
(
error
,
category
=
"warning"
)
if
not
book_format
:
if
not
book_format
:
# delete book from Shelfs, Downloads, Read list
# delete book from Shelfs, Downloads, Read list
...
@@ -240,8 +262,22 @@ def delete_book(book_id, book_format):
...
@@ -240,8 +262,22 @@ def delete_book(book_id, book_format):
# book not found
# book not found
log
.
error
(
'Book with id "
%
s" could not be deleted: not found'
,
book_id
)
log
.
error
(
'Book with id "
%
s" could not be deleted: not found'
,
book_id
)
if
book_format
:
if
book_format
:
if
jsonResponse
:
return
Response
(
json
.
dumps
([
warning
,
{
"location"
:
url_for
(
"editbook.edit_book"
,
book_id
=
book_id
),
"type"
:
"success"
,
"format"
:
book_format
,
"message"
:
_
(
'Book Format Successfully Deleted'
)}]),
mimetype
=
'application/json'
)
else
:
flash
(
_
(
'Book Format Successfully Deleted'
),
category
=
"success"
)
flash
(
_
(
'Book Format Successfully Deleted'
),
category
=
"success"
)
return
redirect
(
url_for
(
'editbook.edit_book'
,
book_id
=
book_id
))
return
redirect
(
url_for
(
'editbook.edit_book'
,
book_id
=
book_id
))
else
:
if
jsonResponse
:
return
Response
(
json
.
dumps
([
warning
,
{
"location"
:
url_for
(
'web.index'
),
"type"
:
"success"
,
"format"
:
book_format
,
"message"
:
_
(
'Book Successfully Deleted'
)}]),
mimetype
=
'application/json'
)
else
:
else
:
flash
(
_
(
'Book Successfully Deleted'
),
category
=
"success"
)
flash
(
_
(
'Book Successfully Deleted'
),
category
=
"success"
)
return
redirect
(
url_for
(
'web.index'
))
return
redirect
(
url_for
(
'web.index'
))
...
@@ -947,10 +983,7 @@ def get_sorted_entry(field, bookid):
...
@@ -947,10 +983,7 @@ def get_sorted_entry(field, bookid):
return
json
.
dumps
({
'author_sort'
:
book
.
author_sort
})
return
json
.
dumps
({
'author_sort'
:
book
.
author_sort
})
return
""
return
""
@
editbook
.
route
(
"/ajax/deletebooks"
)
@
login_required
def
delete_list_book
():
return
""
@
editbook
.
route
(
"/ajax/mergebooks"
,
methods
=
[
'POST'
])
@
editbook
.
route
(
"/ajax/mergebooks"
,
methods
=
[
'POST'
])
@
login_required
@
login_required
...
...
cps/static/js/main.js
View file @
22344a39
...
@@ -58,6 +58,60 @@ $(document).on("change", "select[data-controlall]", function() {
...
@@ -58,6 +58,60 @@ $(document).on("change", "select[data-controlall]", function() {
}
}
});
});
$
(
"#delete_confirm"
).
click
(
function
()
{
//get data-id attribute of the clicked element
var
pathname
=
document
.
getElementsByTagName
(
"script"
),
src
=
pathname
[
pathname
.
length
-
1
].
src
;
var
path
=
src
.
substring
(
0
,
src
.
lastIndexOf
(
"/"
));
var
deleteId
=
$
(
this
).
data
(
"delete-id"
);
var
bookFormat
=
$
(
this
).
data
(
"delete-format"
);
if
(
bookFormat
)
{
window
.
location
.
href
=
path
+
"/../../delete/"
+
deleteId
+
"/"
+
bookFormat
;
}
else
{
if
(
$
(
this
).
data
(
"delete-format"
))
{
path
=
path
+
"/../../ajax/delete/"
+
deleteId
;
$
.
ajax
({
method
:
"get"
,
url
:
path
,
timeout
:
900
,
success
:
function
(
data
)
{
data
.
forEach
(
function
(
item
)
{
if
(
!
jQuery
.
isEmptyObject
(
item
))
{
if
(
item
.
format
!=
""
)
{
$
(
"button[data-delete-format='"
+
item
.
format
+
"']"
).
addClass
(
'hidden'
);
}
$
(
".navbar"
).
after
(
'<div class="row-fluid text-center" style="margin-top: -20px;">'
+
'<div id="flash_'
+
item
.
type
+
'" class="alert alert-'
+
item
.
type
+
'">'
+
item
.
message
+
'</div>'
+
'</div>'
);
}
});
}
});
}
else
{
window
.
location
.
href
=
path
+
"/../../delete/"
+
deleteId
;
}
}
});
//triggered when modal is about to be shown
$
(
"#deleteModal"
).
on
(
"show.bs.modal"
,
function
(
e
)
{
//get data-id attribute of the clicked element and store in button
var
bookId
=
$
(
e
.
relatedTarget
).
data
(
"delete-id"
);
var
bookfomat
=
$
(
e
.
relatedTarget
).
data
(
"delete-format"
);
if
(
bookfomat
)
{
$
(
"#book_format"
).
removeClass
(
'hidden'
);
$
(
"#book_complete"
).
addClass
(
'hidden'
);
}
else
{
$
(
"#book_complete"
).
removeClass
(
'hidden'
);
$
(
"#book_format"
).
addClass
(
'hidden'
);
}
$
(
e
.
currentTarget
).
find
(
"#delete_confirm"
).
data
(
"delete-id"
,
bookId
);
$
(
e
.
currentTarget
).
find
(
"#delete_confirm"
).
data
(
"delete-format"
,
bookfomat
);
});
$
(
function
()
{
$
(
function
()
{
var
updateTimerID
;
var
updateTimerID
;
...
...
cps/static/js/table.js
View file @
22344a39
...
@@ -128,28 +128,14 @@ $(function() {
...
@@ -128,28 +128,14 @@ $(function() {
onColumnSwitch
:
function
(
field
,
checked
)
{
onColumnSwitch
:
function
(
field
,
checked
)
{
var
visible
=
$
(
"#books-table"
).
bootstrapTable
(
'getVisibleColumns'
);
var
visible
=
$
(
"#books-table"
).
bootstrapTable
(
'getVisibleColumns'
);
var
hidden
=
$
(
"#books-table"
).
bootstrapTable
(
'getHiddenColumns'
);
var
hidden
=
$
(
"#books-table"
).
bootstrapTable
(
'getHiddenColumns'
);
// to save current setting
// coresponding event: onColumnSwitch
//$table.bootstrapTable('getVisibleColumns')
//$table.bootstrapTable('getHiddenColumns').
var
visibility
=
[]
var
visibility
=
[]
var
st
=
""
var
st
=
""
visible
.
forEach
(
function
(
item
)
{
visible
.
forEach
(
function
(
item
)
{
st
+=
"
\"
"
+
item
.
field
+
"
\"
:
\"
"
+
"true"
+
"
\"
,"
st
+=
"
\"
"
+
item
.
field
+
"
\"
:
\"
"
+
"true"
+
"
\"
,"
/*var element = {};
element[item.field] = "true";
visibility.push(element);*/
});
});
hidden
.
forEach
(
function
(
item
)
{
hidden
.
forEach
(
function
(
item
)
{
st
+=
"
\"
"
+
item
.
field
+
"
\"
:
\"
"
+
"false"
+
"
\"
,"
st
+=
"
\"
"
+
item
.
field
+
"
\"
:
\"
"
+
"false"
+
"
\"
,"
/*var element = {};
});
element[item.field] = "false";
visibility.push(element);*/
});
/*
visibility.forEach(function(item) {
st += JSON.stringify(item) + ',';
});*/
st
=
st
.
slice
(
0
,
-
1
);
st
=
st
.
slice
(
0
,
-
1
);
$
.
ajax
({
$
.
ajax
({
method
:
"post"
,
method
:
"post"
,
...
@@ -238,29 +224,6 @@ $(function() {
...
@@ -238,29 +224,6 @@ $(function() {
$
(
e
.
currentTarget
).
find
(
"#btndeletedomain"
).
data
(
"domainId"
,
domainId
);
$
(
e
.
currentTarget
).
find
(
"#btndeletedomain"
).
data
(
"domainId"
,
domainId
);
});
});
$
(
"#delete_confirm"
).
click
(
function
()
{
//get data-id attribute of the clicked element
var
deleteId
=
$
(
this
).
data
(
"deleteid"
);
$
.
ajax
({
method
:
"get"
,
url
:
window
.
location
.
pathname
+
"/../../delete/"
+
deleteId
,
});
});
//triggered when modal is about to be shown
$
(
"#deleteModal"
).
on
(
"show.bs.modal"
,
function
(
e
)
{
//get data-id attribute of the clicked element and store in button
var
bookId
=
$
(
e
.
relatedTarget
).
data
(
"delete-id"
);
$
(
e
.
currentTarget
).
find
(
"#delete_confirm"
).
data
(
"deleteid"
,
bookId
);
});
// receive result from request, dismiss modal dialog, show flash message
// insert after navbar
/*$("#deleteModal").on("hidden.bs.modal", function () {
<div class="row-fluid text-center" style="margin-top: -20px;">
<div id="flash_success" class="alert alert-success">{{ message[1] }}</div>
</div>*/
$
(
"#restrictModal"
).
on
(
"hidden.bs.modal"
,
function
()
{
$
(
"#restrictModal"
).
on
(
"hidden.bs.modal"
,
function
()
{
// Destroy table and remove hooks for buttons
// Destroy table and remove hooks for buttons
$
(
"#restrict-elements-table"
).
unbind
();
$
(
"#restrict-elements-table"
).
unbind
();
...
@@ -385,7 +348,7 @@ function RestrictionActions (value, row) {
...
@@ -385,7 +348,7 @@ function RestrictionActions (value, row) {
/* Function for deleting books */
/* Function for deleting books */
function
EbookActions
(
value
,
row
)
{
function
EbookActions
(
value
,
row
)
{
return
[
return
[
"<div class=
\"
book-remove
\"
data-toggle=
\"
modal
\"
data-target=
\"
#deleteModal
\"
data-delete-id=
\"
"
+
row
.
id
+
"
\"
title=
\"
Remove
\"
>"
,
"<div class=
\"
book-remove
\"
data-toggle=
\"
modal
\"
data-target=
\"
#deleteModal
\"
data-
ajax=
\"
1
\"
data-
delete-id=
\"
"
+
row
.
id
+
"
\"
title=
\"
Remove
\"
>"
,
"<i class=
\"
glyphicon glyphicon-trash
\"
></i>"
,
"<i class=
\"
glyphicon glyphicon-trash
\"
></i>"
,
"</div>"
"</div>"
].
join
(
""
);
].
join
(
""
);
...
...
cps/templates/book_edit.html
View file @
22344a39
...
@@ -7,14 +7,12 @@
...
@@ -7,14 +7,12 @@
</div>
</div>
{% if g.user.role_delete_books() %}
{% if g.user.role_delete_books() %}
<div
class=
"text-center"
>
<div
class=
"text-center"
>
<button
type=
"button"
class=
"btn btn-danger"
id=
"delete"
data-toggle=
"modal"
data-target=
"#deleteModal"
>
{{_("Delete Book")}}
</button>
<button
type=
"button"
class=
"btn btn-danger"
id=
"delete"
data-toggle=
"modal"
data-
delete-id=
"{{ book.id }}"
data-
target=
"#deleteModal"
>
{{_("Delete Book")}}
</button>
</div>
</div>
{% if book.data|length > 1 %}
{% if book.data|length > 1 %}
<div
class=
"text-center more-stuff"
><h4>
{{_('Delete formats:')}}
</h4>
<div
class=
"text-center more-stuff"
><h4>
{{_('Delete formats:')}}
</h4>
{% for file in book.data %}
{% for file in book.data %}
<div
class=
"form-group"
>
<button
type=
"button"
class=
"btn btn-danger"
id=
"delete_format"
data-toggle=
"modal"
data-delete-id=
"{{ book.id }}"
data-delete-format=
"{{ file.format }}"
data-target=
"#deleteModal"
>
{{_('Delete')}} - {{file.format}}
</button>
<a
href=
"{{ url_for('editbook.delete_book', book_id=book.id, book_format=file.format) }}"
class=
"btn btn-danger"
type=
"button"
>
{{_('Delete')}} - {{file.format}}
</a>
</div>
{% endfor %}
{% endfor %}
</div>
</div>
{% endif %}
{% endif %}
...
...
cps/templates/book_table.html
View file @
22344a39
...
@@ -51,7 +51,7 @@
...
@@ -51,7 +51,7 @@
{{ text_table_row('series', _('Enter Series'),_('Series'), false) }}
{{ text_table_row('series', _('Enter Series'),_('Series'), false) }}
<th
data-field=
"series_index"
id=
"series_index"
data-visible=
"{{visiblility.get('series_index')}}"
data-edit-validate=
"{{ _('This Field is Required') }}"
data-sortable=
"true"
{%
if
g
.
user
.
role_edit
() %}
data-editable-type=
"number"
data-editable-placeholder=
"1"
data-editable-step=
"0.01"
data-editable-min=
"0"
data-editable-url=
"{{ url_for('editbook.edit_list_book', param='series_index')}}"
data-edit=
"true"
data-editable-title=
"{{_('Enter title')}}"
{%
endif
%}
>
{{_('Series Index')}}
</th>
<th
data-field=
"series_index"
id=
"series_index"
data-visible=
"{{visiblility.get('series_index')}}"
data-edit-validate=
"{{ _('This Field is Required') }}"
data-sortable=
"true"
{%
if
g
.
user
.
role_edit
() %}
data-editable-type=
"number"
data-editable-placeholder=
"1"
data-editable-step=
"0.01"
data-editable-min=
"0"
data-editable-url=
"{{ url_for('editbook.edit_list_book', param='series_index')}}"
data-edit=
"true"
data-editable-title=
"{{_('Enter title')}}"
{%
endif
%}
>
{{_('Series Index')}}
</th>
{{ text_table_row('languages', _('Enter Languages'),_('Languages'), false) }}
{{ text_table_row('languages', _('Enter Languages'),_('Languages'), false) }}
<
th
data-field=
"pubdate"
data-type=
"date"
data-visible=
"{{visiblility.get('pubdate')}}"
data-viewformat=
"dd.mm.yyyy"
id=
"pubdate"
data-sortable=
"true"
>
{{_('Publishing Date')}}
</th
>
<
!--th data-field="pubdate" data-type="date" data-visible="{{visiblility.get('pubdate')}}" data-viewformat="dd.mm.yyyy" id="pubdate" data-sortable="true">{{_('Publishing Date')}}</th--
>
{{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false) }}
{{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false) }}
{% if g.user.role_edit() %}
{% if g.user.role_edit() %}
<th
data-align=
"right"
data-formatter=
"EbookActions"
data-switchable=
"false"
>
{{_('Delete')}}
</th>
<th
data-align=
"right"
data-formatter=
"EbookActions"
data-switchable=
"false"
>
{{_('Delete')}}
</th>
...
...
cps/templates/modal_dialogs.html
View file @
22344a39
...
@@ -47,7 +47,8 @@
...
@@ -47,7 +47,8 @@
</div>
</div>
<div
class=
"modal-body text-center"
>
<div
class=
"modal-body text-center"
>
<p>
<p>
<span>
{{_('This book will be permanently erased from database')}}
</span>
<span
class=
"hidden"
id=
"book_format"
>
{{_('This book format will be permanently erased from database')}}
</span>
<span
class=
"hidden"
id=
"book_complete"
>
{{_('This book will be permanently erased from database')}}
</span>
<span>
{{_('and hard disk')}}
</span>
<span>
{{_('and hard disk')}}
</span>
</p>
</p>
{% if config.config_kobo_sync %}
{% if config.config_kobo_sync %}
...
@@ -60,7 +61,6 @@
...
@@ -60,7 +61,6 @@
<div
class=
"modal-footer"
>
<div
class=
"modal-footer"
>
<input
type=
"button"
class=
"btn btn-danger"
value=
"{{_('Delete')}}"
name=
"delete_confirm"
id=
"delete_confirm"
data-dismiss=
"modal"
>
<input
type=
"button"
class=
"btn btn-danger"
value=
"{{_('Delete')}}"
name=
"delete_confirm"
id=
"delete_confirm"
data-dismiss=
"modal"
>
<!--a href="{{ url_for('editbook.delete_book', book_id=bookid) }}" id="delete_confirm" class="btn btn-danger">{{_('Delete')}}</a-->
<button
type=
"button"
class=
"btn btn-default"
data-dismiss=
"modal"
>
{{_('Cancel')}}
</button>
<button
type=
"button"
class=
"btn btn-default"
data-dismiss=
"modal"
>
{{_('Cancel')}}
</button>
</div>
</div>
</div>
</div>
...
...
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