made authorspage

This commit is contained in:
Alex 2018-05-23 17:53:30 +02:00
commit 8c3fdea707
11 changed files with 59 additions and 27 deletions

0
app/cover.py Normal file → Executable file
View File

View File

@ -1,6 +1,11 @@
from app import db from app import db
from marshmallow import Schema, fields, ValidationError, pre_load from marshmallow import Schema, fields, ValidationError, pre_load
authors = db.Table('books_authors',
db.Column('book_id', db.Integer, db.ForeignKey('books.id'), primary_key=True),
db.Column('author_id', db.Integer, db.ForeignKey('authors.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)
@ -8,9 +13,10 @@ 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))
author = db.relationship('Author')
tag = db.Column(db.String(255)) tag = db.Column(db.String(255))
authors = db.relationship('Author', secondary=authors, lazy='subquery',
backref=db.backref('books', lazy=True))
def __init__(self, title, file, cover, fileformat, tag): def __init__(self, title, file, cover, fileformat, tag):
self.title = title self.title = title
@ -30,7 +36,6 @@ class Book(db.Model):
class Author(db.Model): class Author(db.Model):
__tablename__ = 'authors' __tablename__ = 'authors'
id = db.Column(db.Integer(), primary_key=True) id = db.Column(db.Integer(), primary_key=True)
user_id = db.Column(db.Integer(), db.ForeignKey('books.id'))
author_name = db.Column(db.String(50)) author_name = db.Column(db.String(50))

0
app/static/css/style.css Normal file → Executable file
View File

0
app/templates/edit_book_detail.html Normal file → Executable file
View File

0
app/templates/red_link.html Normal file → Executable file
View File

View File

@ -0,0 +1,16 @@
{% extends 'base.html' %}
{% block main %}
<div class="container">
<h1 class="header">{{ author.author_name }}</h1>
<p>Books: {% for book in author.books %}
<li> {{ book.title }}</li>
{% endfor %}</p>
</div>
{% endblock %}

2
app/templates/show_book_detail.html Normal file → Executable file
View File

@ -7,7 +7,7 @@
<img src="../uploads/cover/{{ book.cover }}" width="200"> <img src="../uploads/cover/{{ book.cover }}" width="200">
<p>Author(s): {% for author in book.author %} <p>Author(s): {% for author in book.authors %}
<li> {{ author.author_name }}</li> <li> {{ author.author_name }}</li>

View File

@ -28,9 +28,9 @@
<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><a href="books/{{ book.id }}">{{ book.title }}</a></td>
<td> {% for author in book.author %} <td> {% for author in book.authors %}
<li> {{ author.author_name }}</li> <li> <a href ="authors/{{ author.id }}">{{ author.author_name }}</a></li>
{% endfor %}</td> {% endfor %}</td>
<td>{{ book.fileformat }}</td> <td>{{ book.fileformat }}</td>

View File

@ -78,7 +78,7 @@ 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.author) user_form = UserForm_Edit(title = book_to_edit.title, author =book_to_edit.authors)
if request.method == 'POST': if request.method == 'POST':
if user_form.validate_on_submit(): if user_form.validate_on_submit():
@ -91,10 +91,10 @@ def edit_book_by_id(id):
db.session.commit() db.session.commit()
book = Book.query.filter_by(title=title).first() book = Book.query.filter_by(title=title).first()
author_table = Author.query.filter_by(user_id=book.id).delete() author_table = Author.query.filter_by(book_id=book.id).delete()
for this_author in author: for this_author in author:
this_author = Author(this_author.get('author_name')) this_author = Author(this_author.get('author_name'))
book.author.append(this_author) book.authors.append(this_author)
db.session.commit() db.session.commit()
flash("%s updated" % (title)) flash("%s updated" % (title))
@ -127,17 +127,20 @@ def add_book():
file.save(fullpath) file.save(fullpath)
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']
author = user_form.author.data # You could also have used authors = user_form.author.data # You could also have used
tag = user_form.tag.data tag = user_form.tag.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, tag)
db.session.add(book) db.session.add(book)
db.session.commit() for author in authors:
book = Book.query.filter_by(title=title).first() author_name = author.get("author_name")
for this_author in author: if author_name:
this_author = Author(this_author.get('author_name')) a = db.session.query(Author).filter_by(author_name=author_name).first()
book.author.append(this_author) if a == None:
a = Author(author_name=author_name)
db.session.add(a)
book.authors.append(a)
db.session.commit() db.session.commit()
# save user to database # save user to database
@ -159,6 +162,13 @@ def flash_errors(form):
error error
)) ))
@app.route('/authors/<int:id>')
def show_author_by_id(id):
author = Author.query.get(id)
if not author:
abort(404)
else:
return render_template('show_author_detail.html', author=author)
### ###
# The API # The API

View File

@ -1,7 +1,7 @@
#import click #import click
#from flask import Flask #from flask import Flask
from app import app, db from app import app, db
from app.models import Book from app.models import Book, Author
from csv import DictReader from csv import DictReader
import argparse import argparse
@ -9,20 +9,21 @@ ap = argparse.ArgumentParser("import csv into flask")
ap.add_argument("csv", help = "csv file to import") ap.add_argument("csv", help = "csv file to import")
ap.add_argument("--limit", type=int, default = None, help = "limit to x number of x") ap.add_argument("--limit", type=int, default = None, help = "limit to x number of x")
args = ap.parse_args() args = ap.parse_args()
with open(args.csv) as f: with open(args.csv) as f:
for row in DictReader(f): for row in DictReader(f):
#print(row['Title']) book = Book(row['Title'], '', '', row['Format'], row['Shelf'])
book = Book (row['Title'], "", "", row['Format'], row['Shelf'])
db.session.add(book) db.session.add(book)
authors = row['Author'].split(',')
authors = [x.strip() for x in authors]
for author in authors:
if author:
a = db.session.query(Author).filter_by(author_name=author).first()
if a == None:
a = Author(author_name=author)
db.session.add(a)
book.authors.append(a)
db.session.commit() db.session.commit()
#app = Flask(__name__)
#books = db.session.query(Book).all()
#print(books)
# @app.cli.command() #books = db.session.query(Book).all()
# @click.argument('name')
# def import_csv(name):
# print("hello")

0
init.py Normal file → Executable file
View File