Skip to content

Instantly share code, notes, and snippets.

@jokull
Created February 16, 2011 23:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jokull/830533 to your computer and use it in GitHub Desktop.
Save jokull/830533 to your computer and use it in GitHub Desktop.
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