categories
This commit is contained in:
parent
85d3854f8a
commit
ac23e131c5
@ -21,8 +21,3 @@ db = SQLAlchemy(app)
|
|||||||
|
|
||||||
app.config.from_object(__name__)
|
app.config.from_object(__name__)
|
||||||
from app import views
|
from app import views
|
||||||
|
|
||||||
@app.cli.command()
|
|
||||||
@click.argument('name')
|
|
||||||
def import_csv(name):
|
|
||||||
print("hello")
|
|
||||||
|
@ -14,9 +14,10 @@ class AuthorForm(NoCsrfForm):
|
|||||||
class UserForm(FlaskForm):
|
class UserForm(FlaskForm):
|
||||||
title = StringField('title', validators=[InputRequired()])
|
title = StringField('title', validators=[InputRequired()])
|
||||||
author = FieldList(FormField(AuthorForm, default=lambda: Author()), min_entries=1)
|
author = FieldList(FormField(AuthorForm, default=lambda: Author()), min_entries=1)
|
||||||
tag = StringField('tag', validators=[InputRequired()])
|
category = StringField('category', validators=[InputRequired()])
|
||||||
file = FileField()
|
file = FileField()
|
||||||
|
|
||||||
class UserForm_Edit(FlaskForm):
|
class UserForm_Edit(FlaskForm):
|
||||||
title = StringField('title', validators=[InputRequired()])
|
title = StringField('title', validators=[InputRequired()])
|
||||||
author = FieldList(FormField(AuthorForm, default=lambda: Author()), min_entries=1)
|
author = FieldList(FormField(AuthorForm, default=lambda: Author()), min_entries=1)
|
||||||
|
category = StringField('category', validators=[InputRequired()])
|
||||||
|
@ -6,6 +6,11 @@ authors = db.Table('books_authors',
|
|||||||
db.Column('author_id', db.Integer, db.ForeignKey('authors.id'), primary_key=True)
|
db.Column('author_id', db.Integer, db.ForeignKey('authors.id'), primary_key=True)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
tags = db.Table('books_tags',
|
||||||
|
db.Column('book_id', db.Integer, db.ForeignKey('books.id'), primary_key=True),
|
||||||
|
db.Column('tag_id', db.Integer, db.ForeignKey('tags.id'), primary_key=True)
|
||||||
|
)
|
||||||
|
|
||||||
class Book(db.Model):
|
class Book(db.Model):
|
||||||
__tablename__ = 'books'
|
__tablename__ = 'books'
|
||||||
id = db.Column(db.Integer, primary_key = True)
|
id = db.Column(db.Integer, primary_key = True)
|
||||||
@ -13,17 +18,18 @@ class Book(db.Model):
|
|||||||
file = db.Column(db.String(255))
|
file = db.Column(db.String(255))
|
||||||
cover = db.Column(db.String(255))
|
cover = db.Column(db.String(255))
|
||||||
fileformat = db.Column(db.String(255))
|
fileformat = db.Column(db.String(255))
|
||||||
tag = db.Column(db.String(255))
|
category = db.Column(db.String(255))
|
||||||
|
|
||||||
authors = db.relationship('Author', secondary=authors, lazy='subquery',
|
authors = db.relationship('Author', secondary=authors, lazy='subquery',
|
||||||
backref=db.backref('books', lazy=True))
|
backref=db.backref('books', lazy=True))
|
||||||
def __init__(self, title, file, cover, fileformat, tag):
|
tags = db.relationship('Tag', secondary=tags, lazy='subquery',
|
||||||
|
backref=db.backref('books', lazy=True))
|
||||||
|
|
||||||
|
def __init__(self, title, file, cover, fileformat, category):
|
||||||
self.title = title
|
self.title = title
|
||||||
self.file = file
|
self.file = file
|
||||||
self.cover = cover
|
self.cover = cover
|
||||||
self.fileformat = fileformat
|
self.fileformat = fileformat
|
||||||
self.tag = tag
|
self.category = category
|
||||||
|
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
@ -38,18 +44,31 @@ class Author(db.Model):
|
|||||||
id = db.Column(db.Integer(), primary_key=True)
|
id = db.Column(db.Integer(), primary_key=True)
|
||||||
author_name = db.Column(db.String(50))
|
author_name = db.Column(db.String(50))
|
||||||
|
|
||||||
|
|
||||||
def __init__(self, author_name):
|
def __init__(self, author_name):
|
||||||
self.author_name = author_name
|
self.author_name = author_name
|
||||||
|
|
||||||
|
class Tag(db.Model):
|
||||||
|
__tablename__ = 'tags'
|
||||||
|
id = db.Column(db.Integer(), primary_key=True)
|
||||||
|
tag = db.Column(db.String(50))
|
||||||
|
|
||||||
|
def __init__(self, tag):
|
||||||
|
self.tag = tag
|
||||||
|
|
||||||
|
class AuthorSchema(Schema):
|
||||||
|
id = fields.Int(dump_only=True)
|
||||||
|
author_name = fields.Str()
|
||||||
|
|
||||||
class BookSchema(Schema):
|
class BookSchema(Schema):
|
||||||
id = fields.Int(dump_only=True)
|
id = fields.Int(dump_only=True)
|
||||||
title = fields.Str()
|
title = fields.Str()
|
||||||
author = fields.Str()
|
|
||||||
file = fields.Str()
|
file = fields.Str()
|
||||||
|
authors = fields.Nested(AuthorSchema, many=True)
|
||||||
cover = fields.Str()
|
cover = fields.Str()
|
||||||
fileformat = fields.Str()
|
fileformat = fields.Str()
|
||||||
tag = fields.Str()
|
category = fields.Str()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def must_not_be_blank(data):
|
def must_not_be_blank(data):
|
||||||
if not data:
|
if not data:
|
||||||
|
@ -35,6 +35,27 @@ font-style: italic;
|
|||||||
padding: 0px 8px;
|
padding: 0px 8px;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
.library_table a{
|
||||||
|
text-decoration: none;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.library_table .title_col{
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.library_table .author_col{
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.library_table li{
|
||||||
|
list-style-type: none;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.library_table tr:nth-child(even){
|
||||||
|
background-color: #F8F8F8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header input{
|
.header input{
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
<div class="form-group">{{ form.tag.label }} {{ form.tag(size=20, class="form-control") }}</div>
|
<div class="form-group">{{ form.category.label }} {{ form.category(size=20, class="form-control") }}</div>
|
||||||
{{ form.file }}
|
{{ form.file }}
|
||||||
<button type="submit" class="btn btn-primary">Upload</button>
|
<button type="submit" class="btn btn-primary">Upload</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -29,6 +29,9 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
{{ form.category.label }} {{ form.category(size=20, class="form-control") }}
|
||||||
|
</div>
|
||||||
<br>
|
<br>
|
||||||
<button type="submit" class="btn btn-primary">Update</button>
|
<button type="submit" class="btn btn-primary">Update</button>
|
||||||
</form>
|
</form>
|
||||||
|
@ -15,26 +15,26 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
|
|
||||||
<table style="width:100%">
|
<table class="library_table" style="width:100%">
|
||||||
<tr>
|
<tr>
|
||||||
<th>Cover</th>
|
<th>Cover</th>
|
||||||
<th>Title</th>
|
<th>Title</th>
|
||||||
<th>Author</th>
|
<th>Author</th>
|
||||||
<th>Filetype</th>
|
<th>Filetype</th>
|
||||||
<th>Tag</th>
|
<th>Category</th>
|
||||||
</tr>
|
</tr>
|
||||||
{% for book in books %}
|
{% for book in books|sort(attribute='title', reverse = False) %}
|
||||||
<tr>
|
<tr>
|
||||||
<td><img src="../uploads/cover/{{ book.cover }}" width="80"></td>
|
<td><img src="../uploads/cover/{{ book.cover }}" width="80"></td>
|
||||||
<td><a href="books/{{ book.id }}">{{ book.title }}</a></td>
|
<td class="title_col"><a href="books/{{ book.id }}">{{ book.title }}</a></td>
|
||||||
|
|
||||||
<td> {% for author in book.authors %}
|
<td class="author_col"> {% for author in book.authors %}
|
||||||
|
|
||||||
<li><a href="{{url_for('show_author_by_id', id=author.id)}}">{{ author.author_name }}</a> </li>
|
<li><a href="{{url_for('show_author_by_id', id=author.id)}}">{{ author.author_name }}</a> </li>
|
||||||
|
|
||||||
{% endfor %}</td>
|
{% endfor %}</td>
|
||||||
<td>{{ book.fileformat }}</td>
|
<td>{{ book.fileformat }}</td>
|
||||||
<td>{{ book.tag}}</td>
|
<td>{{ book.category}}</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
23
app/views.py
23
app/views.py
@ -9,7 +9,7 @@ from app import app, db
|
|||||||
from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory, jsonify, abort
|
from flask import Flask, render_template, request, redirect, url_for, flash, send_from_directory, jsonify, abort
|
||||||
|
|
||||||
from app.forms import UserForm, UserForm_Edit
|
from app.forms import UserForm, UserForm_Edit
|
||||||
from app.models import Book, BookSchema, Author
|
from app.models import Book, BookSchema, Author, AuthorSchema
|
||||||
from app.cover import get_cover
|
from app.cover import get_cover
|
||||||
|
|
||||||
import os
|
import os
|
||||||
@ -18,6 +18,8 @@ from werkzeug.utils import secure_filename
|
|||||||
# import sqlite3
|
# import sqlite3
|
||||||
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
|
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'])
|
||||||
|
|
||||||
|
author_schema = AuthorSchema()
|
||||||
|
authors_schema = AuthorSchema(many=True)
|
||||||
book_schema = BookSchema()
|
book_schema = BookSchema()
|
||||||
books_schema = BookSchema(many=True)
|
books_schema = BookSchema(many=True)
|
||||||
|
|
||||||
@ -79,19 +81,21 @@ def remove_book_by_id(id):
|
|||||||
@app.route('/books/<int:id>/edit', methods=['POST', 'GET'])
|
@app.route('/books/<int:id>/edit', methods=['POST', 'GET'])
|
||||||
def edit_book_by_id(id):
|
def edit_book_by_id(id):
|
||||||
book_to_edit = Book.query.filter_by(id=id).first()
|
book_to_edit = Book.query.filter_by(id=id).first()
|
||||||
user_form = UserForm_Edit(title = book_to_edit.title, author =book_to_edit.authors)
|
user_form = UserForm_Edit(title = book_to_edit.title, author =book_to_edit.authors, category = book_to_edit.category )
|
||||||
|
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
if user_form.validate_on_submit():
|
if user_form.validate_on_submit():
|
||||||
# check if the post request has the file part
|
# check if the post request has the file part
|
||||||
title = user_form.title.data # You could also have used request.form['name']
|
title = user_form.title.data # You could also have used request.form['name']
|
||||||
authors = user_form.author.data # You could also have used request.form['email']
|
authors = user_form.author.data # You could also have used request.form['email']
|
||||||
|
category = user_form.category.data
|
||||||
# save user to database
|
# save user to database
|
||||||
#book = Book(title, author, filename, cover, file_extension)
|
#book = Book(title, author, filename, cover, file_extension)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
book = Book.query.filter_by(id=id).first()
|
book = Book.query.filter_by(id=id).first()
|
||||||
book.title = title
|
book.title = title
|
||||||
|
book.category = category
|
||||||
book.authors= []
|
book.authors= []
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
for author in authors:
|
for author in authors:
|
||||||
@ -134,10 +138,10 @@ def add_book():
|
|||||||
cover = get_cover(fullpath, name)
|
cover = get_cover(fullpath, name)
|
||||||
title = user_form.title.data # You could also have used request.form['name']
|
title = user_form.title.data # You could also have used request.form['name']
|
||||||
authors = user_form.author.data # You could also have used
|
authors = user_form.author.data # You could also have used
|
||||||
tag = user_form.tag.data
|
category = user_form.category.data
|
||||||
#print(author)
|
#print(author)
|
||||||
#print(len(author))
|
#print(len(author))
|
||||||
book = Book(title, filename, cover, file_extension, tag)
|
book = Book(title, filename, cover, file_extension, category)
|
||||||
db.session.add(book)
|
db.session.add(book)
|
||||||
for author in authors:
|
for author in authors:
|
||||||
author_name = author.get("author_name")
|
author_name = author.get("author_name")
|
||||||
@ -181,9 +185,7 @@ def show_author_by_id(id):
|
|||||||
|
|
||||||
@app.route('/authors/<int:id>/edit', methods=['POST', 'GET'])
|
@app.route('/authors/<int:id>/edit', methods=['POST', 'GET'])
|
||||||
def edit_author_by_id(id):
|
def edit_author_by_id(id):
|
||||||
#EDIT AUTHOR TO DO
|
return "Ask the programmer."
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -195,16 +197,17 @@ def edit_author_by_id(id):
|
|||||||
def get_books():
|
def get_books():
|
||||||
books = Book.query.all()
|
books = Book.query.all()
|
||||||
data, errors = books_schema.dump(books)
|
data, errors = books_schema.dump(books)
|
||||||
|
print(errors)
|
||||||
return jsonify({'books': data})
|
return jsonify({'books': data})
|
||||||
|
|
||||||
@app.route('/api/books/<int:id>', methods=['GET'])
|
@app.route('/api/books/<int:id>', methods=['GET'])
|
||||||
def get_book_by_id(id):
|
def get_book_by_id(id):
|
||||||
book = Book.query.get(id)
|
book = Book.query.get(id)
|
||||||
book_result, error = book_schema.dump(book)
|
data, error = book_schema.dump(book)
|
||||||
if not book_result:
|
if not data:
|
||||||
return jsonify({"message": "Book could not be found."}), 400
|
return jsonify({"message": "Book could not be found."}), 400
|
||||||
else:
|
else:
|
||||||
return jsonify({'book': book_result})
|
return jsonify({'book': data })
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -140,7 +140,7 @@ Mondotheque: a radiated book / un livre irradiant / een iradierend boek,"André
|
|||||||
An Atlas of Typeforms,"James Sutton, Alan Bartram",design / writing / publishing,,,,,
|
An Atlas of Typeforms,"James Sutton, Alan Bartram",design / writing / publishing,,,,,
|
||||||
Structure of the Visual Book,Keith Smith,design / writing / publishing,,,,,
|
Structure of the Visual Book,Keith Smith,design / writing / publishing,,,,,
|
||||||
The Uses of Literacy,Richard Hoggart,design / writing / publishing,pdf,0,1,Monoskop,
|
The Uses of Literacy,Richard Hoggart,design / writing / publishing,pdf,0,1,Monoskop,
|
||||||
Control and Freedom: Power and Paranoia in the Age of Fiber Optics,Wendy Hui Kyong Chun,desk,pdf,1,1,LibGen,Chun_ControlandFreedom.pdf
|
Control and Freedom: Power and Paranoia in the Age of Fiber Optics,Wendy Hui Kyong Chun,desk,pdf,1,1,LibGen,
|
||||||
The New Media Reader,"Noah Wardrip-Fruin, Nick Montfort (editors)",desk,pdf,1,1,LibGen,
|
The New Media Reader,"Noah Wardrip-Fruin, Nick Montfort (editors)",desk,pdf,1,1,LibGen,
|
||||||
Art and Electronic Media,Edward A. Shanken,Art,,,0,,
|
Art and Electronic Media,Edward A. Shanken,Art,,,0,,
|
||||||
The Situationist City,Simon Sadler,Art,pdf,1,1,Monoskop,
|
The Situationist City,Simon Sadler,Art,pdf,1,1,Monoskop,
|
||||||
|
|
Loading…
Reference in New Issue
Block a user