Renamed install.py to setup.py to sound more Python-y and finished up the blog upload/views for posts.
This commit is contained in:
parent
843b208a67
commit
aba62ead5b
10 changed files with 107 additions and 26 deletions
13
admin.py
13
admin.py
|
@ -1,9 +1,11 @@
|
|||
from flask import Flask, request, session, g, redirect, url_for, \
|
||||
abort, render_template, flash, Blueprint
|
||||
from flask.ext.mysqldb import MySQL
|
||||
import datetime
|
||||
|
||||
admin = Blueprint('admin', __name__,
|
||||
template_folder='templates')
|
||||
import flask_site
|
||||
|
||||
@admin.route('/')
|
||||
def home():
|
||||
|
@ -17,7 +19,9 @@ def posts():
|
|||
if not session.get('logged_in'):
|
||||
return redirect(url_for('login'))
|
||||
else:
|
||||
return render_template('admin/posts.html')
|
||||
g.db.execute('SELECT * FROM blog_posts ORDER BY updated_on DESC')
|
||||
entries = [dict(title=row[1], category=row[3], tags=row[4], created=row[6].strftime("%d-%m-%Y"), updated=row[7].strftime("%d-%m-%Y")) for row in g.db.fetchall()]
|
||||
return render_template('admin/posts.html', entries=entries)
|
||||
|
||||
@admin.route('/new-post', methods=['GET', 'POST'])
|
||||
def new_post():
|
||||
|
@ -25,9 +29,8 @@ def new_post():
|
|||
return redirect(url_for('login'))
|
||||
else:
|
||||
if request.method == 'POST':
|
||||
g.db.execute('insert into blog_posts (title, text, category, tags, created_on, updated_on) values (?, ?, ?, ?, str(datetime.datetime.now()), str(datetime.datetime.now()))',
|
||||
[request.form['title'], request.form['text'], request.form['category'], request.form['tags']])
|
||||
g.db.commit()
|
||||
g.db.execute("insert into blog_posts (title, text, category, tags, url, created_on, updated_on) values ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}')" .format(request.form['title'], request.form['text'], request.form['category'], request.form['tags'], request.form['title'].lower().replace(' ', '-'), str(datetime.datetime.now()), str(datetime.datetime.now())))
|
||||
flask_site.mysql.connection.commit()
|
||||
flash('New post added successfully')
|
||||
return redirect(url_for('blog'))
|
||||
else:
|
||||
|
@ -41,7 +44,7 @@ def edit_post():
|
|||
if request.method == 'POST':
|
||||
g.db.execute('UPDATE blog_posts SET (title, text, category, tags, updated_on) values (?, ?, ?, ?, str(datetime.datetime.now()))',
|
||||
[request.form['title'], request.form['text'], request.form['category'], request.form['tags']])
|
||||
g.db.commit()
|
||||
flask_site.mysql.connection.commit()
|
||||
flash('New post added successfully')
|
||||
return redirect(url_for('blog'))
|
||||
else:
|
||||
|
|
|
@ -2,12 +2,15 @@ from flask import Flask, request, session, g, redirect, url_for, \
|
|||
abort, render_template, flash
|
||||
from flask.ext.mysqldb import MySQL
|
||||
import hashlib
|
||||
from flask_debugtoolbar import DebugToolbarExtension
|
||||
from admin import admin
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config.from_pyfile('config.py')
|
||||
app.secret_key = app.config['SECRET_KEY']
|
||||
mysql = MySQL(app)
|
||||
toolbar = DebugToolbarExtension(app)
|
||||
|
||||
app.register_blueprint(admin, url_prefix='/admin')
|
||||
|
||||
|
@ -27,7 +30,7 @@ def teardown_request(exception):
|
|||
@app.route('/')
|
||||
def home():
|
||||
g.db.execute('SELECT * FROM blog_posts ORDER BY updated_on DESC')
|
||||
entries = [dict(title=row[1], text=row[2], created=row[5].strftime("%B %d, %Y"), updated=row[6].strftime("%B %d, %Y")) for row in g.db.fetchall()]
|
||||
entries = [dict(title=row[1], text=row[2], url=row[5], created=row[6].strftime("%B %d, %Y"), updated=row[7].strftime("%B %d, %Y")) for row in g.db.fetchall()]
|
||||
return render_template('home.html', entries=entries)
|
||||
|
||||
@app.route('/bio')
|
||||
|
@ -37,9 +40,16 @@ def bio():
|
|||
@app.route('/blog')
|
||||
def blog():
|
||||
g.db.execute('SELECT * FROM blog_posts ORDER BY id DESC')
|
||||
entries = [dict(title=row[1], text=row[2], created=row[5].strftime("%B %d, %Y"), updated=row[6].strftime("%B %d, %Y")) for row in g.db.fetchall()]
|
||||
entries = [dict(title=row[1], text=row[2], url=row[5], created=row[6].strftime("%B %d, %Y"), updated=row[7].strftime("%B %d, %Y")) for row in g.db.fetchall()]
|
||||
return render_template('blog.html', entries=entries)
|
||||
|
||||
@app.route('/blog/<url>')
|
||||
def blog_post(url):
|
||||
g.db.execute('SELECT * FROM blog_posts WHERE url="%s"' % url)
|
||||
row = g.db.fetchone()
|
||||
post = [dict(title=row[1], text=row[2], category=row[3], tags=row[4], created=row[6].strftime("%B %d, %Y"), updated=row[7].strftime("%B %d, %Y"))]
|
||||
return render_template('blog-post.html', post=post)
|
||||
|
||||
@app.route('/projects')
|
||||
def projects():
|
||||
return render_template('projects.html')
|
||||
|
|
|
@ -4,6 +4,7 @@ CREATE TABLE blog_posts (
|
|||
text VARCHAR( 10000 ) DEFAULT NULL ,
|
||||
category VARCHAR( 50 ) DEFAULT NULL ,
|
||||
tags VARCHAR( 100 ) DEFAULT NULL ,
|
||||
url VARCHAR(500) DEFAULT NULL UNIQUE,
|
||||
created_on DATETIME NOT NULL ,
|
||||
updated_on TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
|
||||
);
|
|
@ -33,7 +33,7 @@ td ul {
|
|||
margin: 5px;
|
||||
}
|
||||
|
||||
input {
|
||||
input, textarea {
|
||||
background-color: #FFF;
|
||||
color: #002900;
|
||||
border: 1px solid #002900;
|
||||
|
@ -464,6 +464,28 @@ a.social-link:hover, a.social-link:active {
|
|||
color: #fff;
|
||||
}
|
||||
|
||||
/* Admin Styles */
|
||||
.admin-table {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.admin-table th, .admin-table td {
|
||||
padding: 10px 5px;
|
||||
}
|
||||
|
||||
.admin-table tr:first-child th, {
|
||||
padding-bottom: 5px;
|
||||
|
||||
}
|
||||
.admin-table tr:first-child td {
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
|
||||
.admin-table th:first-child, .admin-table td:first-child {
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
@media screen and (max-width:1024px) {
|
||||
.main-nav, #nav {
|
||||
position: absolute;
|
||||
|
|
|
@ -1,6 +1,19 @@
|
|||
{% extends 'admin/master.html' %}
|
||||
{% block body %}
|
||||
<h1 style="border-width: 0px; text-align: center; min-height: 120px; position: relative; overflow: hidden;">
|
||||
<span>congrats, it worked</span>
|
||||
</h1>
|
||||
<div class="section">
|
||||
<h2>new post</h2>
|
||||
<form action="{{ url_for('admin.new_post') }}" method="post">
|
||||
<dl>
|
||||
<dt>Title:</dt>
|
||||
<dd><input type="text" size=30 name="title"></dd>
|
||||
<dt>Text:</dt>
|
||||
<dd><textarea name="text" rows=5 cols=40></textarea></dd>
|
||||
<dt>Category:</dt>
|
||||
<dd><input type="text" size=30 name="category"></dd>
|
||||
<dt>Tags:</dt>
|
||||
<dd><input type="text" size=30 name="tags"></dd>
|
||||
<dd><input type="submit" value="Publish"></dd>
|
||||
</dl>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
33
templates/admin/posts.html
Normal file
33
templates/admin/posts.html
Normal file
|
@ -0,0 +1,33 @@
|
|||
{% extends "admin/master.html" %}
|
||||
{% block body %}
|
||||
<div class="section">
|
||||
<h2>posts</h2>
|
||||
<a href="{{ url_for('admin.new_post') }}">Add new post</a>
|
||||
<table class="admin-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>title</th>
|
||||
<th>category</th>
|
||||
<th>tags</th>
|
||||
<th>comments</th>
|
||||
<th>published</th>
|
||||
<th>updated</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for entry in entries %}
|
||||
<tr>
|
||||
<td>{{ entry.title }}</td>
|
||||
<td>{{ entry.category }}</td>
|
||||
<td>{{ entry.tags }}</td>
|
||||
<td>{{ entry.comments }}</td>
|
||||
<td>{{ entry.created }}</td>
|
||||
<td>{{ entry.updated }}</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<em>Get to writing!</em>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endblock %}
|
10
templates/blog-post.html
Normal file
10
templates/blog-post.html
Normal file
|
@ -0,0 +1,10 @@
|
|||
{% extends 'master.html' %}
|
||||
{% block body %}
|
||||
{% for data in post %}
|
||||
<div class="section">
|
||||
<h2>{{ data.title }}</h2>
|
||||
<em>{{ data.updated }}</em>
|
||||
{{ data.text | safe }}
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
|
@ -1,23 +1,12 @@
|
|||
{% extends "master.html" %}
|
||||
{% block body %}
|
||||
{% if session.logged_in %}
|
||||
<form action="{{ url_for('add_entry') }}" method=post class=add-entry>
|
||||
<dl>
|
||||
<dt>Title:
|
||||
<dd><input type=text size=30 name=title>
|
||||
<dt>Text:
|
||||
<dd><textarea name=text rows=5 cols=40></textarea>
|
||||
<dd><input type=submit value=Share>
|
||||
</dl>
|
||||
</form>
|
||||
{% endif %}
|
||||
<div class="section">
|
||||
<h2>blog</h2>
|
||||
{% for entry in entries %}
|
||||
<div class="blog-entry">
|
||||
<h3>{{ entry.title }}</h3>
|
||||
<h3><a href="{{ url_for('blog') }}/{{ entry.url }}">{{ entry.title }}</a></h3>
|
||||
<h5>{{ entry.updated }}</h5>
|
||||
<p>{{ entry.text|safe }}</p>
|
||||
{{ entry.text|safe }}
|
||||
</div>
|
||||
{% else %}
|
||||
<em>Sorry, I still haven't gotten around to moving my blog posts over!</em>
|
||||
|
|
|
@ -8,9 +8,9 @@
|
|||
<h2 style="margin-top: 0;">from my blog</h2>
|
||||
{% for entry in entries %}
|
||||
<div class="blog-entry">
|
||||
<h3>{{ entry.title }}</h3>
|
||||
<h3><a href="{{ url_for('blog') }}/{{ entry.url }}">{{ entry.title }}</a></h3>
|
||||
<h5>{{ entry.updated }}</h5>
|
||||
<p>{{ entry.text|safe }}</p>
|
||||
{{ entry.text|safe }}
|
||||
</div>
|
||||
{% else %}
|
||||
<em>Sorry, I still haven't gotten around to moving my blog posts over!</em>
|
||||
|
|
Loading…
Reference in a new issue