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
7424418c
Commit
7424418c
authored
Apr 21, 2016
by
Jan B
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #16 from cervinko/feature-custom_columns
Feature custom columns
parents
8d2a8654
0e4574da
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
240 additions
and
25 deletions
+240
-25
config.ini
config.ini
+4
-4
config.ini_example
config.ini_example
+12
-0
__init__.py
cps/__init__.py
+0
-1
db.py
cps/db.py
+44
-3
helper.py
cps/helper.py
+1
-0
detail.html
cps/templates/detail.html
+21
-0
edit_book.html
cps/templates/edit_book.html
+42
-1
web.py
cps/web.py
+116
-16
No files found.
config.ini
View file @
7424418c
[General]
DB_ROOT
=
APP_DB_ROOT =
MAIN_DIR
=
LOG_DIR =
DB_ROOT
=
APP_DB_ROOT
=
MAIN_DIR
=
LOG_DIR
=
PORT
=
8083
NEWEST_BOOKS
=
60
[Advanced]
...
...
config.ini_example
0 → 100644
View file @
7424418c
[General]
DB_ROOT =
APP_DB_ROOT =
MAIN_DIR =
LOG_DIR =
PORT = 8083
NEWEST_BOOKS = 60
[Advanced]
TITLE_REGEX = ^(A|The|An|Der|Die|Das|Den|Ein|Eine|Einen|Dem|Des|Einem|Eines)\s+
DEVELOPMENT = 1
PUBLIC_REG = 0
UPLOADING = 1
cps/__init__.py
View file @
7424418c
#!/usr/bin/env python
# -*- coding: utf-8 -*-
cps/db.py
View file @
7424418c
...
...
@@ -7,6 +7,7 @@ from sqlalchemy.orm import *
import
os
from
cps
import
config
import
re
import
ast
#calibre sort stuff
title_pat
=
re
.
compile
(
config
.
TITLE_REGEX
,
re
.
IGNORECASE
)
...
...
@@ -49,6 +50,25 @@ books_languages_link = Table('books_languages_link', Base.metadata,
Column
(
'lang_code'
,
Integer
,
ForeignKey
(
'languages.id'
),
primary_key
=
True
)
)
cc
=
conn
.
execute
(
"SELECT id, datatype FROM custom_columns"
)
cc_ids
=
[]
cc_exceptions
=
[
'bool'
,
'datetime'
,
'int'
,
'comments'
,
'float'
,
]
books_custom_column_links
=
{}
for
row
in
cc
:
if
row
.
datatype
not
in
cc_exceptions
:
books_custom_column_links
[
row
.
id
]
=
Table
(
'books_custom_column_'
+
str
(
row
.
id
)
+
'_link'
,
Base
.
metadata
,
Column
(
'book'
,
Integer
,
ForeignKey
(
'books.id'
),
primary_key
=
True
),
Column
(
'value'
,
Integer
,
ForeignKey
(
'custom_column_'
+
str
(
row
.
id
)
+
'.id'
),
primary_key
=
True
)
)
#books_custom_column_links[row.id]=
cc_ids
.
append
(
row
.
id
)
cc_classes
=
{}
for
id
in
cc_ids
:
ccdict
=
{
'__tablename__'
:
'custom_column_'
+
str
(
id
),
'id'
:
Column
(
Integer
,
primary_key
=
True
),
'value'
:
Column
(
String
)}
cc_classes
[
id
]
=
type
(
'Custom_Column_'
+
str
(
id
),
(
Base
,),
ccdict
)
class
Comments
(
Base
):
__tablename__
=
'comments'
...
...
@@ -152,7 +172,7 @@ class Data(Base):
class
Books
(
Base
):
__tablename__
=
'books'
id
=
Column
(
Integer
,
primary_key
=
True
)
id
=
Column
(
Integer
,
primary_key
=
True
)
title
=
Column
(
String
)
sort
=
Column
(
String
)
author_sort
=
Column
(
String
)
...
...
@@ -170,7 +190,7 @@ class Books(Base):
series
=
relationship
(
'Series'
,
secondary
=
books_series_link
,
backref
=
'books'
)
ratings
=
relationship
(
'Ratings'
,
secondary
=
books_ratings_link
,
backref
=
'books'
)
languages
=
relationship
(
'Languages'
,
secondary
=
books_languages_link
,
backref
=
'books'
)
def
__init__
(
self
,
title
,
sort
,
author_sort
,
timestamp
,
pubdate
,
series_index
,
last_modified
,
path
,
has_cover
,
authors
,
tags
):
self
.
title
=
title
self
.
sort
=
sort
...
...
@@ -184,8 +204,29 @@ class Books(Base):
def
__repr__
(
self
):
return
u"<Books('{0},{1}{2}{3}{4}{5}{6}{7}{8}')>"
.
format
(
self
.
title
,
self
.
sort
,
self
.
author_sort
,
self
.
timestamp
,
self
.
pubdate
,
self
.
series_index
,
self
.
last_modified
,
self
.
path
,
self
.
has_cover
)
for
id
in
cc_ids
:
setattr
(
Books
,
'custom_column_'
+
str
(
id
),
relationship
(
cc_classes
[
id
],
secondary
=
books_custom_column_links
[
id
],
backref
=
'books'
))
Base
.
metadata
.
create_all
(
engine
)
class
Custom_Columns
(
Base
):
__tablename__
=
'custom_columns'
id
=
Column
(
Integer
,
primary_key
=
True
)
label
=
Column
(
String
)
name
=
Column
(
String
)
datatype
=
Column
(
String
)
mark_for_delete
=
Column
(
Boolean
)
editable
=
Column
(
Boolean
)
display
=
Column
(
String
)
is_multiple
=
Column
(
Boolean
)
normalized
=
Column
(
Boolean
)
def
get_display_dict
(
self
):
display_dict
=
ast
.
literal_eval
(
self
.
display
)
return
display_dict
#Base.metadata.create_all(engine)
Session
=
sessionmaker
()
Session
.
configure
(
bind
=
engine
)
session
=
Session
()
cps/helper.py
View file @
7424418c
...
...
@@ -199,3 +199,4 @@ def update_dir_stucture(book_id):
os
.
renames
(
path
,
new_author_path
)
book
.
path
=
new_authordir
+
"/"
+
book
.
path
.
split
(
"/"
)[
1
]
db
.
session
.
commit
()
cps/templates/detail.html
View file @
7424418c
...
...
@@ -58,6 +58,27 @@
</div>
</p>
{% endif %}
{% if cc|length > 0 %}
<p>
<div
class=
"custom_columns"
>
{% for c in cc %}
{% if entry['custom_column_' ~ c.id]|length > 0 %}
{{ c.name }}:
{% for column in entry['custom_column_' ~ c.id] %}
{% if c.datatype == 'rating' %}
{{ '%d' % (column.value / 2) }}
{% else %}
{{ column.value }}
{% endif %}
{% endfor %}
<br
/>
{% endif %}
{% endfor %}
</div>
</p>
{% endif %}
{% if entry.comments|length > 0 %}
<h3>
Description:
</h3>
...
...
cps/templates/edit_book.html
View file @
7424418c
...
...
@@ -37,12 +37,53 @@
</div>
<div
class=
"form-group"
>
<label
for=
"rating"
>
Rating
</label>
<input
type=
"
text"
class=
"form-control"
name=
"rating"
id=
"rating"
value=
"{% if book.ratings %}{{book.ratings[0].rating
}}{% endif %}"
>
<input
type=
"
number"
min=
"1"
max=
"5"
step=
"1"
class=
"form-control"
name=
"rating"
id=
"rating"
value=
"{% if book.ratings %}{{book.ratings[0].rating / 2
}}{% endif %}"
>
</div>
<div
class=
"form-group"
>
<label
for=
"cover_url"
>
Cover URL (jpg)
</label>
<input
type=
"text"
class=
"form-control"
name=
"cover_url"
id=
"cover_url"
value=
""
>
</div>
{% if cc|length > 0 %}
{% for c in cc %}
<div
class=
"form-group"
>
<label
for=
"{{ 'custom_column_' ~ c.id }}"
>
{{ c.name }}
</label>
{% if c.datatype in ['text', 'series'] and not c.is_multiple %}
<input
type=
"text"
class=
"form-control"
name=
"{{ 'custom_column_' ~ c.id }}"
id=
"{{ 'custom_column_' ~ c.id }}"
{%
if
book
['
custom_column_
'
~
c
.
id
]|
length
>
0 %}
value="{{ book['custom_column_' ~ c.id][0].value }}"
{% endif %}>
{% endif %}
{% if c.datatype in ['text', 'series'] and c.is_multiple %}
<input
type=
"text"
class=
"form-control"
name=
"{{ 'custom_column_' ~ c.id }}"
id=
"{{ 'custom_column_' ~ c.id }}"
{%
if
book
['
custom_column_
'
~
c
.
id
]|
length
>
0 %}
value="{% for column in book['custom_column_' ~ c.id] %}{{ column.value.strip() }}{% if not loop.last %}, {% endif %}{% endfor %}"{% endif %}>
{% endif %}
{% if c.datatype == 'enumeration' %}
<select
class=
"form-control"
name=
"{{ 'custom_column_' ~ c.id }}"
id=
"{{ 'custom_column_' ~ c.id }}"
>
<option></option>
{% for opt in c.get_display_dict().enum_values %}
<option
{%
if
book
['
custom_column_
'
~
c
.
id
]|
length
>
0 %}
{% if book['custom_column_' ~ c.id][0].value == opt %}selected="selected"{% endif %}
{% endif %}
>{{ opt }}
</option>
{% endfor %}
</select>
{% endif %}
{% if c.datatype == 'rating' %}
<input
type=
"number"
min=
"1"
max=
"5"
step=
"1"
class=
"form-control"
name=
"{{ 'custom_column_' ~ c.id }}"
id=
"{{ 'custom_column_' ~ c.id }}"
{%
if
book
['
custom_column_
'
~
c
.
id
]|
length
>
0 %}
value="{{ '%d' % (book['custom_column_' ~ c.id][0].value / 2) }}"
{% endif %}>
{% endif %}
</div>
{% endfor %}
{% endif %}
<div
class=
"checkbox"
>
<label>
<input
name=
"detail_view"
type=
"checkbox"
checked
>
view book after edit
...
...
cps/web.py
View file @
7424418c
This diff is collapsed.
Click to expand it.
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