Skip to content

Instantly share code, notes, and snippets.

@harvimt
Created March 2, 2012 02:29
Show Gist options
  • Save harvimt/1955047 to your computer and use it in GitHub Desktop.
Save harvimt/1955047 to your computer and use it in GitHub Desktop.
Boilerplate Complaint
from sqlalchemy import create_engine, Column, Integer, String
engine = create_engine('sqlite:///data.db')
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
sess = Session()
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
import flatland as flat
from flatland import Form
from flatland.validation import LengthBetween, ValueGreaterThan
from flask import Flask, request, redirect, url_for
app = Flask(__name__)
class Survey(Base):
__tablename__ = 'surveys'
__slots__ = ('survey_id','long_name')
survey_id = Column(Integer, primary_key=True)
long_name = Column(String(128))
def __init__(self, survey_id=None, long_name=None):
self.survey_id = survey_id
self.long_name = long_name
def __repr__(self):
return 'Survey(survey_id=%r,long_name=%r)' % (self.survey_id, self.long_name)
def update(self, **fields):
vars(self).update(**fields)
Base.metadata.create_all(engine)
class SurveyForm(Form):
survey_id = flat.Integer.using(default_value=None,validators=[ValueGreaterThan(0)])
long_name = flat.String.using(validators=[LengthBetween(0,128)])
@app.route('/surveys',methods=['GET'])
def list_surveys():
surveys = map(lambda x: SurveyForm.from_object(x).value, sess.query(Survey).all())
return json.dumps(surveys,indent=4)
@app.route('/surveys',methods=['POST'])
def add_survey():
survey_form = SurveyForm.from_flat(request.form)
survey_form.validate() #deal with validation errors and stuff
survey = Survey(**survey_form.value)
sess.add(survey)
sess.commit()
#return 'XX'
return redirect(url_for('get_survey',survey_id=survey.survey_id))
@app.route('/surveys/<int:survey_id>', methods=['GET'])
def get_survey(survey_id):
survey = sess.query(Survey).filter_by(survey_id=survey_id).one()
survey_form = SurveyForm.from_object(survey) #arguably unneccessary, added for orthogonality and the fact that the view/template layer will likely plug into flatland
return json.dumps(survey_form.value)
@app.route('/surveys/<int:survey_id>', methods=['PUT'])
def put_survey(survey_id):
survey = sess.query(Survey).filter_by(survey_id=survey_id).one()
survey_form = SurveyForm.from_flat(request.form)
survey.update(**survey_form.value)
sess.commit()
return redirect(url_for('get_survey'))
@app.route('/surveys/<int:survey_id>', methods=['DELETE'])
def del_survey(survey_id):
survey = sess.query(Survey).filter_by(survey_id=survey_id).one()
sess.delete(survey)
sess.commit()
return 'Successfully delete survey %s' % survey.long_name
if __name__ == '__main__':
app.run(debug=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment