Created
February 16, 2011 23:22
-
-
Save jokull/830533 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 flaskext.fungiform import Form, widgets, TextField, FileField | |
class Admin(object): | |
module = Module(__name__, name='_admin', url_prefix='/_admin') | |
def __init__(self, app=None, editables=[]): | |
for editable in editables: | |
self.register_editable(editable) | |
self.app = self.init_app(app) | |
def init_app(self, app): | |
app.register_module(self.module) | |
def register_editable(self, editable): | |
self.module.add_url_rule('/%s/<id>' % editable.endpoint, | |
editable.endpoint, editable.markup_view) | |
self.module.add_url_rule('/%s/<id>/add' % editable.endpoint, | |
editable.endpoint, editable.admin_view, methods=['GET', 'POST']) | |
class Editable(object): | |
def __init__(self, id): | |
self.id = id | |
self.key = '%s-%s' % (app.config.get('ADMIN_KEY_SCOPE', 'admin-'), id) | |
self.form = self.get_form() | |
@property | |
def endpoint(self): | |
return self.__class__.__name__.lower() | |
def get_form(self): | |
form = type('Form', (Form, ), {'value': self.field }) | |
return form(action=self.get_url(), initial={'value': self.get()}) | |
def get_url(self): | |
return url_for('_admin.%s' % self.endpoint, id=self.id) | |
def push(self, value): | |
g.redis.lpush(self.key, value) | |
def get(self, index=None): | |
if index is None: | |
index = g.redis.llen(self.key) | |
return gl.redis.lindex(self.key, index) | |
@classmethod | |
def admin_view(cls, id): | |
admin = cls(id) | |
if request.method == "POST" and self.form.validate(): | |
admin.push(form.data.get('value')) | |
return jsonify(form.data) | |
return self.form.as_widget() | |
@classmethod | |
def markup_view(cls, id): | |
admin = cls(id) | |
return Markup(admin.to_markup()) | |
def to_storage(self, value): | |
raise NotImplemented | |
def to_markup(self, value): | |
raise NotImplemented | |
def render(self): | |
pass # TODO use html_builder to construct admin chrome | |
def __call__(self, **attrs): | |
caller = attrs.pop('caller', None) | |
if caller is None: | |
content = "" | |
else: | |
content = caller() | |
return self.render(content) | |
class img(Editable): | |
def to_storage(self, value): | |
pass | |
class span(Editable): | |
pass | |
class p(Editable): | |
pass |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment