Browse Source

rsqlite UPDATE

ansible-setup-and-deploy
Alex 6 years ago
parent
commit
c4583482b5
  1. BIN
      .DS_Store
  2. 2
      app/__init__.py
  3. 4
      app/models.py
  4. 36
      app/templates/base.html
  5. 2
      app/templates/edit_book_detail.html
  6. 145
      app/templates/scape.html
  7. 5
      app/templates/show_book_detail.html
  8. 7
      app/templates/show_books.html
  9. 31
      app/templates/show_books_grid.html
  10. 23
      app/views.py
  11. 3
      xpublibrary.csv

BIN
.DS_Store

Binary file not shown.

2
app/__init__.py

@ -16,7 +16,7 @@ app = Flask(__name__)
app.config['SECRET_KEY'] = 'super secret key' app.config['SECRET_KEY'] = 'super secret key'
#app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/mydatabase.db' #app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/mydatabase.db'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'mydatabase.db') app.config['SQLALCHEMY_DATABASE_URI'] = 'rqlite+pyrqlite://localhost:4001/'
db = SQLAlchemy(app) db = SQLAlchemy(app)
app.config.from_object(__name__) app.config.from_object(__name__)

4
app/models.py

@ -23,6 +23,8 @@ class Book(db.Model):
backref=db.backref('books', lazy=True)) backref=db.backref('books', lazy=True))
tags = db.relationship('Tag', secondary=tags, lazy='subquery', tags = db.relationship('Tag', secondary=tags, lazy='subquery',
backref=db.backref('books', lazy=True)) backref=db.backref('books', lazy=True))
scapeX = db.Column(db.Numeric(10,2))
scapeY = db.Column(db.Numeric(10,2))
def __init__(self, title, file, cover, fileformat, category): def __init__(self, title, file, cover, fileformat, category):
self.title = title self.title = title
@ -30,6 +32,8 @@ class Book(db.Model):
self.cover = cover self.cover = cover
self.fileformat = fileformat self.fileformat = fileformat
self.category = category self.category = category
self.scapeX = 0
self.scapeY = 0
def __repr__(self): def __repr__(self):

36
app/templates/base.html

@ -38,14 +38,48 @@
<script src="https://code.jquery.com/jquery-2.1.4.js"></script> <script src="https://code.jquery.com/jquery-2.1.4.js"></script>
<script src="{{ url_for("static", filename="js/app.js") }}"></script> <script src="{{ url_for("static", filename="js/app.js") }}"></script>
<script> <script>
$( ".no_cover" ).each(function() { $( ".no_cover" ).each(function() {
var randomColor = '#'+ ('000000' + Math.floor(Math.random()*16777215).toString(16)).slice(-6); var string = $(this).children("p").html()
var randomColor = colorHash(string).rgb
$(this).css({ $(this).css({
'background-color' : randomColor, 'background-color' : randomColor,
}); });
} }
) )
function colorHash(inputString){
var sum = 0;
for(var i in inputString){
sum += inputString.charCodeAt(i);
}
r = ~~(('0.'+Math.sin(sum+1).toString().substr(6))*256);
g = ~~(('0.'+Math.sin(sum+2).toString().substr(6))*256);
b = ~~(('0.'+Math.sin(sum+3).toString().substr(6))*256);
var rgb = "rgb("+r+", "+g+", "+b+")";
var hex = "#";
hex += ("00" + r.toString(16)).substr(-2,2).toUpperCase();
hex += ("00" + g.toString(18)).substr(-2,2).toUpperCase();
hex += ("00" + b.toString(20)).substr(-2,2).toUpperCase();
return {
r: r
,g: g
,b: b
,rgb: rgb
,hex: hex
};
}
</script> </script>
</body> </body>
</html> </html>

2
app/templates/edit_book_detail.html

@ -11,7 +11,9 @@
{{ form.csrf_token }} {{ form.csrf_token }}
<div class="form-group"><h1 class="header">{{ form.title.label }} {{ form.title(size=20, class="form-control") }}</h1></div> <div class="form-group"><h1 class="header">{{ form.title.label }} {{ form.title(size=20, class="form-control") }}</h1></div>
<object class="no_cover" data="../../static/img/default_cover.png" type="image/png" width="150">
<img src="../../uploads/cover/{{ book.cover }}" width="200"> <img src="../../uploads/cover/{{ book.cover }}" width="200">
</object>
<br> <br> <br> <br>
<div data-toggle="fieldset" id="phone-fieldset"> <div data-toggle="fieldset" id="phone-fieldset">
{{ form.author.label }} <button type="button" data-toggle="fieldset-add-row" {{ form.author.label }} <button type="button" data-toggle="fieldset-add-row"

145
app/templates/scape.html

@ -0,0 +1,145 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css"/>
<style>
body .ui-selecting { border:2px solid yellow; }
body .ui-selected {border:2px solid black;}
body {overflow: scroll;}
#scape_container{overflow: scroll;width: 100%; height:100vh;}
</style>
</head>
<body>
<div id ="scape_container">
{% for book in books|sort(attribute='title', reverse = False) %}
<div class = "drag" id = "{{ book.id }}" style="position: absolute;width:40px;height:auto; top:{{ book.scapeY }}px; left:{{ book.scapeX }}px;">
<object class="no_cover" data="../static/img/default_cover.png" type="image/png" style="width:100%;height:auto;">
<p >{{ book.title }}</p>
<img src="../uploads/cover/{{ book.cover }}" width="80">
</object>
<p style="font-size:7px;"><a href="books/{{ book.id }}">{{ book.title }}</a></p>
</div>
{% endfor %}
<div id="random" style="padding:2px; margin: 0;position: absolute;width:120px;height:20px;background-color:yellow;z-index:999999999999999999900000000000000;cursor:pointer;">
<p style="padding:0; margin: 0;position: absolute; ">random position</p>
</div>
</div>
<script src="https://code.jquery.com/jquery-2.1.4.js"></script>
<script src="{{ url_for("static", filename="js/app.js") }}"></script>
<script>
$( ".no_cover" ).each(function() {
var string = $(this).children("p").html()
var randomColor = colorHash(string).rgb
$(this).css({
'background-color' : randomColor,
});
}
)
function colorHash(inputString){
var sum = 0;
for(var i in inputString){
sum += inputString.charCodeAt(i);
}
r = ~~(('0.'+Math.sin(sum+1).toString().substr(6))*256);
g = ~~(('0.'+Math.sin(sum+2).toString().substr(6))*256);
b = ~~(('0.'+Math.sin(sum+3).toString().substr(6))*256);
var rgb = "rgb("+r+", "+g+", "+b+")";
var hex = "#";
hex += ("00" + r.toString(16)).substr(-2,2).toUpperCase();
hex += ("00" + g.toString(18)).substr(-2,2).toUpperCase();
hex += ("00" + b.toString(20)).substr(-2,2).toUpperCase();
return {
r: r
,g: g
,b: b
,rgb: rgb
,hex: hex
};
}
</script>
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<script>
$( function() {
$( ".drag" ).draggable({ stack: ".drag",
stop: function(){
var offset = $(this).offset();
var id = $(this).attr('id');
var xPos = offset.left;
var yPos = offset.top;
console.log(xPos);
console.log(yPos);
var postForm = { //Fetch form data
'id' : id,
'x' : xPos, //Store name fields value,
'y' : yPos
};
$.ajax({ //Process the form using $.ajax()
type : 'POST', //Method type
url : '/scape', //Your form processing file URL
data : postForm, //Forms name
dataType : 'json'
});
} });
} );
$( function() {
$( ".drag" ).resizable({aspectRatio: true});
} );
/* $( function() {
$( "body" ).selectable();
} );*/
$( "#random" ).click(function() {
console.log("hallo");
$( ".drag" ).each(function() {
var id = $(this).attr('id');
var postForm = { //Fetch form data
'id' : id,
'x' : Math.floor(Math.random() * window.innerWidth) , //Store name fields value,
'y' : Math.floor(Math.random() * window.innerHeight)
};
$( this ).css("top", postForm['y']);
$( this ).css("left", postForm['x']);
$.ajax({ //Process the form using $.ajax()
type : 'POST', //Method type
url : '/scape', //Your form processing file URL
data : postForm, //Forms name
dataType : 'json'
});
});
});
</script>
</body>
</html>

5
app/templates/show_book_detail.html

@ -4,9 +4,10 @@
<div class="container"> <div class="container">
<h1 class="header">{{ book.title }}</h1> <h1 class="header">{{ book.title }}</h1>
<object class="no_cover" data="../static/img/default_cover.png" type="image/png" width="150">
<p hidden="True">{{ book.title }}</p>
<img src="../uploads/cover/{{ book.cover }}" width="200"> <img src="../uploads/cover/{{ book.cover }}" width="200">
</object>
<p>Author(s): <ul>{% for author in book.authors %} <p>Author(s): <ul>{% 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>

7
app/templates/show_books.html

@ -15,9 +15,9 @@
{% endif %} {% endif %}
{% endwith %} {% endwith %}
<table class="library_table" style="width:100%"> <table class="library_table" id="table" style="width:100%">
<tr> <tr id="header">
<th>Cover</th> <th>Cover</th>
<th>Title</th> <th>Title</th>
<th>Author</th> <th>Author</th>
<th>Filetype</th> <th>Filetype</th>
@ -27,6 +27,7 @@
<tr> <tr>
<td> <td>
<object class="no_cover" data="../static/img/default_cover.png" type="image/png" width="65"> <object class="no_cover" data="../static/img/default_cover.png" type="image/png" width="65">
<p hidden="True">{{ book.title }}</p>
<img src="../uploads/cover/{{ book.cover }}" width="80"> <img src="../uploads/cover/{{ book.cover }}" width="80">
</object> </object>
</td> </td>

31
app/templates/show_books_grid.html

@ -0,0 +1,31 @@
{% extends 'base.html' %}
{% block main %}
<div class="container">
<h1 class="page-header">All Books</h1>
{% with messages = get_flashed_messages() %}
{% if messages %}
<div class="alert alert-success">
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% endwith %}
{% for book in books|sort(attribute='title', reverse = False) %}
<a href="books/{{ book.id }}">
<object class="no_cover" data="../static/img/default_cover.png" type="image/png" width="105">
<img src="../uploads/cover/{{ book.cover }}" width="80">
</object>
{{ book.title }}</a>
{% endfor %}
</div>
{% endblock %}

23
app/views.py

@ -7,7 +7,7 @@ This file creates your application.
from app import app, db 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
import json
from app.forms import UserForm, UserForm_Edit from app.forms import UserForm, UserForm_Edit
from app.models import Book, BookSchema, Author, AuthorSchema from app.models import Book, BookSchema, Author, AuthorSchema
from app.cover import get_cover from app.cover import get_cover
@ -59,6 +59,25 @@ def show_books():
books = db.session.query(Book).all() # or you could have used User.query.all() books = db.session.query(Book).all() # or you could have used User.query.all()
return render_template('show_books.html', books=books) return render_template('show_books.html', books=books)
@app.route('/scape', methods=['POST', 'GET'])
def scape():
if request.method == 'POST':
data = request.form
book = Book.query.get(data['id'])
print(book.scapeX)
book.scapeX = data['x']
book.scapeY = data['y']
db.session.commit()
books = db.session.query(Book).all() # or you could have used User.query.all()
return render_template('scape.html', books=books)
@app.route('/books_grid')
def show_books_grid():
books = db.session.query(Book).all() # or you could have used User.query.all()
return render_template('show_books_grid.html', books=books)
@app.route('/books/<int:id>') @app.route('/books/<int:id>')
def show_book_by_id(id): def show_book_by_id(id):
book = Book.query.get(id) book = Book.query.get(id)
@ -73,7 +92,7 @@ def remove_book_by_id(id):
book_to_edit = Book.query.filter_by(id=id).first() book_to_edit = Book.query.filter_by(id=id).first()
title = book_to_edit.title title = book_to_edit.title
Book.query.filter_by(id=id).delete() Book.query.filter_by(id=id).delete()
author_table = Author.query.filter_by(user_id=book_to_edit.id).delete() #author_table = Author.query.filter_by(books_id=book_to_edit.id).delete()
db.session.commit() db.session.commit()
flash("%s deleted from library" % (title)) flash("%s deleted from library" % (title))
return redirect(url_for('show_books')) return redirect(url_for('show_books'))

3
xpublibrary.csv

@ -29,8 +29,6 @@ The Ultimate Guide to the Vi and Ex Text Editors,Hewlett-Packard,Technical,,,0,,
Getting Gread Sounds: The Microphone Book,Tom Lubin,Technical,,,0,, Getting Gread Sounds: The Microphone Book,Tom Lubin,Technical,,,0,,
How to Think Like a Computer Scientist,"Allen B. Downey, Jeffrey Elkner, Chris Meyers",Technical,pdf,1,1,LibGen, How to Think Like a Computer Scientist,"Allen B. Downey, Jeffrey Elkner, Chris Meyers",Technical,pdf,1,1,LibGen,
Python Pocket Reference,Mark Lutz,Technical,pdf,,1,LibGen, Python Pocket Reference,Mark Lutz,Technical,pdf,,1,LibGen,
Things That Talk,Lorraine Daston (Editor),Science/History,,,,,
The Social Construction of What?,Ian Hacking,Science/History,pdf,1,1,LibGen,
Instruments and the Imagination,Hankins & Silverman,Science/History,,,,, Instruments and the Imagination,Hankins & Silverman,Science/History,,,,,
"Mind, Machines and Human Consciousness",Robert Nadeau,Science/History,,,,, "Mind, Machines and Human Consciousness",Robert Nadeau,Science/History,,,,,
The Psychopath Test,Jon Ronson,Science/History,pdf,1,1,LibGen, The Psychopath Test,Jon Ronson,Science/History,pdf,1,1,LibGen,
@ -76,7 +74,6 @@ Loving Big Brother: Surveillance Culture and Performance Space,John McGrath,Medi
Selections from Cultural Writings,Antonio Gramsci,Media studies,,,0,, Selections from Cultural Writings,Antonio Gramsci,Media studies,,,0,,
Dark Money: The Hidden History of the Billionairs behind the Rise of the Radical Right,Jane Mayer,Media studies,EPUB,,1,Libgen, Dark Money: The Hidden History of the Billionairs behind the Rise of the Radical Right,Jane Mayer,Media studies,EPUB,,1,Libgen,
Walter Benjamin for beginners,"Howard Caygill, Alex Coles, Richard Appignanesi",Media studies,,,0,, Walter Benjamin for beginners,"Howard Caygill, Alex Coles, Richard Appignanesi",Media studies,,,0,,
What is Situationism? A Reader,Stewart Home (ed.),Media studies,pdf,1,1,MOTW,
Cyburbia,James Harkin,Media studies,,,0,, Cyburbia,James Harkin,Media studies,,,0,,
Mondothèque::a radiated book/un livre irradiant/een irradiërend boek,"Matthew Fuller +, Sînziana Păltineanu +, Michael Murtaugh +, Dennis Pohl +, ShinJoung Yeo +, Femke Snelting +, Natacha Roussel +, Dick Reckard +, Geraldine Juárez +, Tomislav Medak +, Marcell Mars +, Dušan Barok + and Alexia de Visscher +",Media studies,pdf,1,1,Monoskop, Mondothèque::a radiated book/un livre irradiant/een irradiërend boek,"Matthew Fuller +, Sînziana Păltineanu +, Michael Murtaugh +, Dennis Pohl +, ShinJoung Yeo +, Femke Snelting +, Natacha Roussel +, Dick Reckard +, Geraldine Juárez +, Tomislav Medak +, Marcell Mars +, Dušan Barok + and Alexia de Visscher +",Media studies,pdf,1,1,Monoskop,
Save and Forget,Thomas Walskaar,Media studies,pdf,1,1,Academia.edu, Save and Forget,Thomas Walskaar,Media studies,pdf,1,1,Academia.edu,

Can't render this file because it has a wrong number of fields in line 27.
Loading…
Cancel
Save