Created
August 4, 2013 02:46
-
-
Save Slater-Victoroff/6148884 to your computer and use it in GitHub Desktop.
Admin views
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from flask import Blueprint, request, redirect, render_template, url_for | |
from flask.views import MethodView | |
from flask.ext.mongoengine.wtf import model_form | |
from SpoolEngine.auth import requires_auth | |
from SpoolEngine.models import Post, BlogPost, Video, Image, Quote, Comment | |
admin = Blueprint('admin', __name__, template_folder='templates') | |
class List(MethodView): | |
decorators = [requires_auth] | |
cls = Post | |
def get(self): | |
posts = self.cls.objects.all() | |
return render_template('admin/list.html', posts=posts) | |
class Detail(MethodView): | |
decorators = [requires_auth] | |
# Map post types to models | |
class_map = { | |
'post': BlogPost, | |
'video': Video, | |
'image': Image, | |
'quote': Quote, | |
} | |
def get_context(self, slug=None): | |
if slug: | |
post = Post.objects.get_or_404(slug=slug) | |
# Handle old posts types as well | |
cls = post.__class__ if post.__class__ != Post else BlogPost | |
form_cls = model_form(cls, exclude=('created_at', 'comments')) | |
if request.method == 'POST': | |
form = form_cls(request.form, inital=post._data) | |
else: | |
form = form_cls(obj=post) | |
else: | |
# Determine which post type we need | |
cls = self.class_map.get(request.args.get('type', 'post')) | |
post = cls() | |
form_cls = model_form(cls, exclude=('created_at', 'comments')) | |
form = form_cls(request.form) | |
context = { | |
"post": post, | |
"form": form, | |
"create": slug is None | |
} | |
return context | |
def get(self, slug): | |
context = self.get_context(slug) | |
return render_template('admin/detail.html', **context) | |
def post(self, slug): | |
context = self.get_context(slug) | |
form = context.get('form') | |
if form.validate(): | |
post = context.get('post') | |
form.populate_obj(post) | |
post.save() | |
return redirect(url_for('admin.index')) | |
return render_template('admin/detail.html', **context) | |
# Register the urls | |
admin.add_url_rule('/admin/', view_func=List.as_view('index')) | |
admin.add_url_rule('/admin/create/', defaults={'slug': None}, view_func=Detail.as_view('create')) | |
admin.add_url_rule('/admin/<slug>/', view_func=Detail.as_view('edit')) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment