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
7bb5afa5
Commit
7bb5afa5
authored
Apr 18, 2020
by
Ozzieisaacs
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'kobo/shelves' into Develop
parents
42ac06c1
41a3623f
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
325 additions
and
103 deletions
+325
-103
kobo.py
cps/kobo.py
+235
-19
opds.py
cps/opds.py
+2
-2
SyncToken.py
cps/services/SyncToken.py
+8
-3
shelf.py
cps/shelf.py
+44
-55
detail.html
cps/templates/detail.html
+0
-22
ub.py
cps/ub.py
+36
-2
No files found.
cps/kobo.py
View file @
7bb5afa5
This diff is collapsed.
Click to expand it.
cps/opds.py
View file @
7bb5afa5
...
...
@@ -326,12 +326,12 @@ def feed_shelfindex():
def
feed_shelf
(
book_id
):
off
=
request
.
args
.
get
(
"offset"
)
or
0
if
current_user
.
is_anonymous
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
book_id
)
.
first
()
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
book_id
,
not
ub
.
Shelf
.
deleted
)
.
first
()
else
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
or_
(
and_
(
ub
.
Shelf
.
user_id
==
int
(
current_user
.
id
),
ub
.
Shelf
.
id
==
book_id
),
and_
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
book_id
)))
.
first
()
ub
.
Shelf
.
id
==
book_id
))
,
not
ub
.
Shelf
.
deleted
)
.
first
()
result
=
list
()
# user is allowed to access shelf
if
shelf
:
...
...
cps/services/SyncToken.py
View file @
7bb5afa5
...
...
@@ -78,6 +78,7 @@ class SyncToken():
"books_last_created"
:
{
"type"
:
"string"
},
"archive_last_modified"
:
{
"type"
:
"string"
},
"reading_state_last_modified"
:
{
"type"
:
"string"
},
"tags_last_modified"
:
{
"type"
:
"string"
},
},
}
...
...
@@ -88,13 +89,14 @@ class SyncToken():
books_last_modified
=
datetime
.
min
,
archive_last_modified
=
datetime
.
min
,
reading_state_last_modified
=
datetime
.
min
,
tags_last_modified
=
datetime
.
min
,
):
self
.
raw_kobo_store_token
=
raw_kobo_store_token
self
.
books_last_created
=
books_last_created
self
.
books_last_modified
=
books_last_modified
self
.
archive_last_modified
=
archive_last_modified
self
.
reading_state_last_modified
=
reading_state_last_modified
self
.
tags_last_modified
=
tags_last_modified
@
staticmethod
def
from_headers
(
headers
):
...
...
@@ -128,6 +130,7 @@ class SyncToken():
books_last_created
=
get_datetime_from_json
(
data_json
,
"books_last_created"
)
archive_last_modified
=
get_datetime_from_json
(
data_json
,
"archive_last_modified"
)
reading_state_last_modified
=
get_datetime_from_json
(
data_json
,
"reading_state_last_modified"
)
tags_last_modified
=
get_datetime_from_json
(
data_json
,
"tags_last_modified"
)
except
TypeError
:
log
.
error
(
"SyncToken timestamps don't parse to a datetime."
)
return
SyncToken
(
raw_kobo_store_token
=
raw_kobo_store_token
)
...
...
@@ -137,7 +140,8 @@ class SyncToken():
books_last_created
=
books_last_created
,
books_last_modified
=
books_last_modified
,
archive_last_modified
=
archive_last_modified
,
reading_state_last_modified
=
reading_state_last_modified
reading_state_last_modified
=
reading_state_last_modified
,
tags_last_modified
=
tags_last_modified
)
def
set_kobo_store_header
(
self
,
store_headers
):
...
...
@@ -159,7 +163,8 @@ class SyncToken():
"books_last_modified"
:
to_epoch_timestamp
(
self
.
books_last_modified
),
"books_last_created"
:
to_epoch_timestamp
(
self
.
books_last_created
),
"archive_last_modified"
:
to_epoch_timestamp
(
self
.
archive_last_modified
),
"reading_state_last_modified"
:
to_epoch_timestamp
(
self
.
reading_state_last_modified
)
"reading_state_last_modified"
:
to_epoch_timestamp
(
self
.
reading_state_last_modified
),
"tags_last_modified"
:
to_epoch_timestamp
(
self
.
tags_last_modified
)
},
}
return
b64encode_json
(
token
)
cps/shelf.py
View file @
7bb5afa5
...
...
@@ -35,6 +35,24 @@ from .helper import common_filters
shelf
=
Blueprint
(
'shelf'
,
__name__
)
log
=
logger
.
create
()
def
check_shelf_edit_permissions
(
cur_shelf
):
if
not
cur_shelf
.
is_public
and
not
cur_shelf
.
user_id
==
int
(
current_user
.
id
):
log
.
error
(
"User
%
s not allowed to edit shelf
%
s"
,
current_user
,
cur_shelf
)
return
False
if
cur_shelf
.
is_public
and
not
current_user
.
role_edit_shelfs
():
log
.
info
(
"User
%
s not allowed to edit public shelves"
,
current_user
)
return
False
return
True
def
check_shelf_view_permissions
(
cur_shelf
):
if
cur_shelf
.
is_public
:
return
True
if
current_user
.
is_anonymous
or
cur_shelf
.
user_id
!=
current_user
.
id
:
log
.
error
(
"User is unauthorized to view non-public shelf:
%
s"
,
cur_shelf
)
return
False
return
True
@
shelf
.
route
(
"/shelf/add/<int:shelf_id>/<int:book_id>"
)
@
login_required
...
...
@@ -48,21 +66,13 @@ def add_to_shelf(shelf_id, book_id):
return
redirect
(
url_for
(
'web.index'
))
return
"Invalid shelf specified"
,
400
if
not
shelf
.
is_public
and
not
shelf
.
user_id
==
int
(
current_user
.
id
):
log
.
error
(
"User
%
s not allowed to add a book to
%
s"
,
current_user
,
shelf
)
if
not
check_shelf_edit_permissions
(
shelf
):
if
not
xhr
:
flash
(
_
(
u"Sorry you are not allowed to add a book to the the shelf:
%(shelfname)
s"
,
shelfname
=
shelf
.
name
),
category
=
"error"
)
return
redirect
(
url_for
(
'web.index'
))
return
"Sorry you are not allowed to add a book to the the shelf:
%
s"
%
shelf
.
name
,
403
if
shelf
.
is_public
and
not
current_user
.
role_edit_shelfs
():
log
.
info
(
"User
%
s not allowed to edit public shelves"
,
current_user
)
if
not
xhr
:
flash
(
_
(
u"You are not allowed to edit public shelves"
),
category
=
"error"
)
return
redirect
(
url_for
(
'web.index'
))
return
"User is not allowed to edit public shelves"
,
403
book_in_shelf
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
,
ub
.
BookShelf
.
book_id
==
book_id
)
.
first
()
if
book_in_shelf
:
...
...
@@ -78,8 +88,8 @@ def add_to_shelf(shelf_id, book_id):
else
:
maxOrder
=
maxOrder
[
0
]
ins
=
ub
.
BookShelf
(
shelf
=
shelf
.
id
,
book_id
=
book_id
,
order
=
maxOrder
+
1
)
ub
.
session
.
add
(
ins
)
shelf
.
books
.
append
(
ub
.
BookShelf
(
shelf
=
shelf
.
id
,
book_id
=
book_id
,
order
=
maxOrder
+
1
)
)
ub
.
session
.
merge
(
shelf
)
ub
.
session
.
commit
()
if
not
xhr
:
flash
(
_
(
u"Book has been added to shelf:
%(sname)
s"
,
sname
=
shelf
.
name
),
category
=
"success"
)
...
...
@@ -99,16 +109,10 @@ def search_to_shelf(shelf_id):
flash
(
_
(
u"Invalid shelf specified"
),
category
=
"error"
)
return
redirect
(
url_for
(
'web.index'
))
if
not
shelf
.
is_public
and
not
shelf
.
user_id
==
int
(
current_user
.
id
):
log
.
error
(
"User
%
s not allowed to add a book to
%
s"
,
current_user
,
shelf
)
if
not
check_shelf_edit_permissions
(
shelf
):
flash
(
_
(
u"You are not allowed to add a book to the the shelf:
%(name)
s"
,
name
=
shelf
.
name
),
category
=
"error"
)
return
redirect
(
url_for
(
'web.index'
))
if
shelf
.
is_public
and
not
current_user
.
role_edit_shelfs
():
log
.
error
(
"User
%
s not allowed to edit public shelves"
,
current_user
)
flash
(
_
(
u"User is not allowed to edit public shelves"
),
category
=
"error"
)
return
redirect
(
url_for
(
'web.index'
))
if
current_user
.
id
in
searched_ids
and
searched_ids
[
current_user
.
id
]:
books_for_shelf
=
list
()
books_in_shelf
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
.
all
()
...
...
@@ -135,8 +139,8 @@ def search_to_shelf(shelf_id):
for
book
in
books_for_shelf
:
maxOrder
=
maxOrder
+
1
ins
=
ub
.
BookShelf
(
shelf
=
shelf
.
id
,
book_id
=
book
,
order
=
maxOrder
)
ub
.
session
.
add
(
ins
)
shelf
.
books
.
append
(
ub
.
BookShelf
(
shelf
=
shelf
.
id
,
book_id
=
book
,
order
=
maxOrder
)
)
ub
.
session
.
merge
(
shelf
)
ub
.
session
.
commit
()
flash
(
_
(
u"Books have been added to shelf:
%(sname)
s"
,
sname
=
shelf
.
name
),
category
=
"success"
)
else
:
...
...
@@ -163,8 +167,7 @@ def remove_from_shelf(shelf_id, book_id):
# true 0 x 1
# false 0 x 0
if
(
not
shelf
.
is_public
and
shelf
.
user_id
==
int
(
current_user
.
id
))
\
or
(
shelf
.
is_public
and
current_user
.
role_edit_shelfs
()):
if
check_shelf_edit_permissions
(
shelf
):
book_shelf
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
,
ub
.
BookShelf
.
book_id
==
book_id
)
.
first
()
...
...
@@ -185,7 +188,6 @@ def remove_from_shelf(shelf_id, book_id):
return
redirect
(
url_for
(
'web.index'
))
return
""
,
204
else
:
log
.
error
(
"User
%
s not allowed to remove a book from
%
s"
,
current_user
,
shelf
)
if
not
xhr
:
flash
(
_
(
u"Sorry you are not allowed to remove a book from this shelf:
%(sname)
s"
,
sname
=
shelf
.
name
),
category
=
"error"
)
...
...
@@ -238,7 +240,7 @@ def create_shelf():
@
login_required
def
edit_shelf
(
shelf_id
):
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
id
==
shelf_id
)
.
first
()
if
request
.
method
==
"POST"
:
if
request
.
method
==
"POST"
:
to_save
=
request
.
form
.
to_dict
()
is_shelf_name_unique
=
False
...
...
@@ -275,41 +277,33 @@ def edit_shelf(shelf_id):
return
render_title_template
(
'shelf_edit.html'
,
shelf
=
shelf
,
title
=
_
(
u"Edit a shelf"
),
page
=
"shelfedit"
)
def
delete_shelf_helper
(
cur_shelf
):
if
not
cur_shelf
or
not
check_shelf_edit_permissions
(
cur_shelf
):
return
shelf_id
=
cur_shelf
.
id
ub
.
session
.
delete
(
cur_shelf
)
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
.
delete
()
ub
.
session
.
add
(
ub
.
ShelfArchive
(
uuid
=
cur_shelf
.
uuid
,
user_id
=
cur_shelf
.
uuid
))
ub
.
session
.
commit
()
log
.
info
(
"successfully deleted
%
s"
,
cur_shelf
)
@
shelf
.
route
(
"/shelf/delete/<int:shelf_id>"
)
@
login_required
def
delete_shelf
(
shelf_id
):
cur_shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
id
==
shelf_id
)
.
first
()
deleted
=
None
if
current_user
.
role_admin
():
deleted
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
id
==
shelf_id
)
.
delete
()
else
:
if
(
not
cur_shelf
.
is_public
and
cur_shelf
.
user_id
==
int
(
current_user
.
id
))
\
or
(
cur_shelf
.
is_public
and
current_user
.
role_edit_shelfs
()):
deleted
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
or_
(
and_
(
ub
.
Shelf
.
user_id
==
int
(
current_user
.
id
),
ub
.
Shelf
.
id
==
shelf_id
),
and_
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
shelf_id
)))
.
delete
()
if
deleted
:
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
.
delete
()
ub
.
session
.
commit
()
log
.
info
(
"successfully deleted
%
s"
,
cur_shelf
)
delete_shelf_helper
(
cur_shelf
)
return
redirect
(
url_for
(
'web.index'
))
# @shelf.route("/shelfdown/<int:shelf_id>")
@
shelf
.
route
(
"/shelf/<int:shelf_id>"
,
defaults
=
{
'shelf_type'
:
1
})
@
shelf
.
route
(
"/shelf/<int:shelf_id>/<int:shelf_type>"
)
def
show_shelf
(
shelf_type
,
shelf_id
):
if
current_user
.
is_anonymous
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
shelf_id
)
.
first
()
else
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
or_
(
and_
(
ub
.
Shelf
.
user_id
==
int
(
current_user
.
id
),
ub
.
Shelf
.
id
==
shelf_id
),
and_
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
shelf_id
)))
.
first
()
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
id
==
shelf_id
)
.
first
()
result
=
list
()
# user is allowed to access shelf
if
shelf
:
if
shelf
and
check_shelf_view_permissions
(
shelf
)
:
page
=
"shelf.html"
if
shelf_type
==
1
else
'shelfdown.html'
books_in_shelf
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
\
...
...
@@ -344,15 +338,10 @@ def order_shelf(shelf_id):
setattr
(
book
,
'order'
,
to_save
[
str
(
book
.
book_id
)])
counter
+=
1
ub
.
session
.
commit
()
if
current_user
.
is_anonymous
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
shelf_id
)
.
first
()
else
:
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
or_
(
and_
(
ub
.
Shelf
.
user_id
==
int
(
current_user
.
id
),
ub
.
Shelf
.
id
==
shelf_id
),
and_
(
ub
.
Shelf
.
is_public
==
1
,
ub
.
Shelf
.
id
==
shelf_id
)))
.
first
()
shelf
=
ub
.
session
.
query
(
ub
.
Shelf
)
.
filter
(
ub
.
Shelf
.
id
==
shelf_id
)
.
first
()
result
=
list
()
if
shelf
:
if
shelf
and
check_shelf_view_permissions
(
shelf
)
:
books_in_shelf2
=
ub
.
session
.
query
(
ub
.
BookShelf
)
.
filter
(
ub
.
BookShelf
.
shelf
==
shelf_id
)
\
.
order_by
(
ub
.
BookShelf
.
order
.
asc
())
.
all
()
for
book
in
books_in_shelf2
:
...
...
cps/templates/detail.html
View file @
7bb5afa5
...
...
@@ -233,18 +233,6 @@
<span
class=
"caret"
></span>
</button>
<ul
id=
"add-to-shelves"
class=
"dropdown-menu"
aria-labelledby=
"add-to-shelf"
>
{% for shelf in g.user.shelf %}
{% if not shelf.id in books_shelfs and shelf.is_public != 1 %}
<li>
<a
href=
"{{ url_for('shelf.add_to_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
data-remove-href=
"{{ url_for('shelf.remove_from_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
data-shelf-action=
"add"
>
{{shelf.name}}
</a>
</li>
{% endif %}
{%endfor%}
{% for shelf in g.shelves_access %}
{% if not shelf.id in books_shelfs %}
<li>
...
...
@@ -261,16 +249,6 @@
</div>
<div
id=
"remove-from-shelves"
class=
"btn-group"
role=
"group"
aria-label=
"Remove from shelves"
>
{% if books_shelfs %}
{% for shelf in g.user.shelf %}
{% if shelf.id in books_shelfs and shelf.is_public != 1 %}
<a
href=
"{{ url_for('shelf.remove_from_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
data-add-href=
"{{ url_for('shelf.add_to_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
class=
"btn btn-sm btn-default"
role=
"button"
data-shelf-action=
"remove"
>
<span
class=
"glyphicon glyphicon-remove"
></span>
{{shelf.name}}
</a>
{% endif %}
{%endfor%}
{% for shelf in g.shelves_access %}
{% if shelf.id in books_shelfs %}
<a
href=
"{{ url_for('shelf.remove_from_shelf', book_id=entry.id, shelf_id=shelf.id) }}"
...
...
cps/ub.py
View file @
7bb5afa5
...
...
@@ -21,6 +21,7 @@ from __future__ import division, print_function, unicode_literals
import
os
import
datetime
import
itertools
import
uuid
from
binascii
import
hexlify
from
flask
import
g
...
...
@@ -40,8 +41,8 @@ except ImportError:
from
sqlalchemy
import
create_engine
,
exc
,
exists
,
event
from
sqlalchemy
import
Column
,
ForeignKey
from
sqlalchemy
import
String
,
Integer
,
SmallInteger
,
Boolean
,
DateTime
,
Float
from
sqlalchemy.orm
import
backref
,
foreign
,
relationship
,
remote
,
sessionmaker
,
Session
from
sqlalchemy.ext.declarative
import
declarative_base
from
sqlalchemy.orm
import
backref
,
foreign
,
relationship
,
remote
,
sessionmaker
,
Session
from
sqlalchemy.sql.expression
import
and_
from
werkzeug.security
import
generate_password_hash
...
...
@@ -270,9 +271,13 @@ class Shelf(Base):
__tablename__
=
'shelf'
id
=
Column
(
Integer
,
primary_key
=
True
)
uuid
=
Column
(
String
,
default
=
lambda
:
str
(
uuid
.
uuid4
()))
name
=
Column
(
String
)
is_public
=
Column
(
Integer
,
default
=
0
)
user_id
=
Column
(
Integer
,
ForeignKey
(
'user.id'
))
books
=
relationship
(
"BookShelf"
,
backref
=
"ub_shelf"
,
cascade
=
"all, delete-orphan"
,
lazy
=
"dynamic"
)
created
=
Column
(
DateTime
,
default
=
datetime
.
datetime
.
utcnow
)
last_modified
=
Column
(
DateTime
,
default
=
datetime
.
datetime
.
utcnow
,
onupdate
=
datetime
.
datetime
.
utcnow
)
def
__repr__
(
self
):
return
'<Shelf
%
d:
%
r>'
%
(
self
.
id
,
self
.
name
)
...
...
@@ -286,11 +291,22 @@ class BookShelf(Base):
book_id
=
Column
(
Integer
)
order
=
Column
(
Integer
)
shelf
=
Column
(
Integer
,
ForeignKey
(
'shelf.id'
))
date_added
=
Column
(
DateTime
,
default
=
datetime
.
datetime
.
utcnow
)
def
__repr__
(
self
):
return
'<Book
%
r>'
%
self
.
id
# This table keeps track of deleted Shelves so that deletes can be propagated to any paired Kobo device.
class
ShelfArchive
(
Base
):
__tablename__
=
'shelf_archive'
id
=
Column
(
Integer
,
primary_key
=
True
)
uuid
=
Column
(
String
)
user_id
=
Column
(
Integer
,
ForeignKey
(
'user.id'
))
last_modified
=
Column
(
DateTime
,
default
=
datetime
.
datetime
.
utcnow
)
class
ReadBook
(
Base
):
__tablename__
=
'book_read_link'
...
...
@@ -375,6 +391,10 @@ def receive_before_flush(session, flush_context, instances):
if
isinstance
(
change
,
(
ReadBook
,
KoboStatistics
,
KoboBookmark
)):
if
change
.
kobo_reading_state
:
change
.
kobo_reading_state
.
last_modified
=
datetime
.
datetime
.
utcnow
()
# Maintain the last_modified bit for the Shelf table.
for
change
in
itertools
.
chain
(
session
.
new
,
session
.
deleted
):
if
isinstance
(
change
,
BookShelf
):
change
.
ub_shelf
.
last_modified
=
datetime
.
datetime
.
utcnow
()
# Baseclass representing Downloads from calibre-web in app.db
...
...
@@ -468,7 +488,21 @@ def migrate_Database(session):
conn
.
execute
(
"ALTER TABLE book_read_link ADD column 'last_time_started_reading' DATETIME"
)
conn
.
execute
(
"ALTER TABLE book_read_link ADD column 'times_started_reading' INTEGER DEFAULT 0"
)
session
.
commit
()
try
:
session
.
query
(
exists
()
.
where
(
Shelf
.
uuid
))
.
scalar
()
except
exc
.
OperationalError
:
conn
=
engine
.
connect
()
conn
.
execute
(
"ALTER TABLE shelf ADD column 'uuid' STRING"
)
conn
.
execute
(
"ALTER TABLE shelf ADD column 'created' DATETIME"
)
conn
.
execute
(
"ALTER TABLE shelf ADD column 'last_modified' DATETIME"
)
conn
.
execute
(
"ALTER TABLE book_shelf_link ADD column 'date_added' DATETIME"
)
for
shelf
in
session
.
query
(
Shelf
)
.
all
():
shelf
.
uuid
=
str
(
uuid
.
uuid4
())
shelf
.
created
=
datetime
.
datetime
.
now
()
shelf
.
last_modified
=
datetime
.
datetime
.
now
()
for
book_shelf
in
session
.
query
(
BookShelf
)
.
all
():
book_shelf
.
date_added
=
datetime
.
datetime
.
now
()
session
.
commit
()
# Handle table exists, but no content
cnt
=
session
.
query
(
Registration
)
.
count
()
if
not
cnt
:
...
...
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