Skip to content

Instantly share code, notes, and snippets.

@lxneng
Created September 15, 2010 14:02
Show Gist options
  • Save lxneng/580773 to your computer and use it in GitHub Desktop.
Save lxneng/580773 to your computer and use it in GitHub Desktop.
# -*- coding: utf-8 -*-
#import pyslideshare
#
#app = Flask(__name__)
#
#api_key = '54lpRVJG'
#secret_key = 'b7Vmgt7f'
#obj = pyslideshare.pyslideshare(locals(), verbose=True)
from datetime import datetime
from flask import Flask, request, flash, url_for, redirect, \
render_template
from flaskext.sqlalchemy import SQLAlchemy
import default_settings
app = Flask(__name__)
app.config.from_object(default_settings)
db = SQLAlchemy(app)
class Todo(db.Model):
__tablename__ = 'todos'
id = db.Column('todo_id', db.Integer, primary_key=True)
title = db.Column(db.String(60))
text = db.Column(db.String)
done = db.Column(db.Boolean)
pub_date = db.Column(db.DateTime)
def __init__(self, title, text):
self.title = title
self.text = text
self.done = False
self.pub_date = datetime.utcnow()
@app.route('/', defaults={'page':1})
@app.route('/<int:page>')
def show_all(page):
pagination = Todo.query.paginate(page=page, per_page=2)
if not pagination.total: flash("No posts so far")
return render_template('show_all.html',pagination=pagination)
@app.route('/new', methods=['GET', 'POST'])
def new():
if request.method == 'POST':
if not request.form['title']:
flash('Title is required', 'error')
elif not request.form['text']:
flash('Text is required', 'error')
else:
todo = Todo(request.form['title'], request.form['text'])
db.session.add(todo)
db.session.commit()
flash(u'Todo item was successfully created')
return redirect(url_for('show_all'))
return render_template('new.html')
@app.route('/update', methods=['POST'])
def update_done():
for todo in Todo.query.all():
todo.done = ('done.%d' % todo.id) in request.form
flash('Updated status')
db.session.commit()
return redirect(url_for('show_all'))
if __name__ == '__main__':
app.run()
<!doctype html>
<title>SQLAlchemy Todo</title>
<h1>SQLAlchemy Todo</h1>
{%- for category, message in get_flashed_messages(with_categories=true) %}
<p class="flask {{ category }}-flash">{{
"Error: " if category == 'error' }}{{ message }}</p>
{%- endfor %}
{% block body %}{% endblock %}
<hr>
<address>SQLAlchemy and Flask powered todo application</address>
{% extends "layout.html" %}
{% block body %}
<h2>New Todo Item</h2>
<form action="" method=post>
<p>
Title:
<input type=text name=title value="{{ request.form.title }}">
<p>Text:
<p><textarea name=text rows=10 cols=40>{{ request.form.text }}</textarea>
<p>
<input type=submit value="Create entry">
<a href="{{ url_for('show_all') }}">Back to list</a>
</form>
{% endblock %}
{% extends "layout.html" %}
{% block body %}
<h2>All Items</h2>
<form action="{{ url_for('update_done') }}" method=post>
<table class=todos>
<tr>
<th>#</th>
<th>Title</th>
<th>Date</th>
<th>Done?</th>
</tr>
{%- for todo in pagination.items %}
<tr class=title>
<td>{{ todo.id }}</td>
<td>{{ todo.title }}</td>
<td><input type=checkbox name=done.{{ todo.id }}{{ " checked" if todo.done }}></td>
</tr>
<tr class=text>
<td colspan=3>{{ todo.text }}</td>
</tr>
{%- endfor %}
</table>
<p>
<input type=submit value="Update" />
<a href="{{ url_for('new') }}">New item</a>
</p>
</form>
{% if pagination.pages > 1 %}
<div class=pagination>
{%- for page in pagination.iter_pages() %}
{% if page %}
{% if page != pagination.page %}
<a href="{{ url_for('show_all', page=page) }}">{{ page }}</a>
{% else %}
<strong>{{ page }}</strong>
{% endif %}
{% else %}
<span class=ellipsis>…</span>
{% endif %}
{%- endfor %}
</div>
{% endif %}
{% endblock %}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment