import logging import cherrypy import turbogears as tg from cherrypy import request, response import naked_planning.model as model log = logging.getLogger("naked_planning.controllers") class RestResource(object): @tg.expose() def index(self): if self.list and self.list.exposed: return self.list(self.query_all()) else: raise cherrypy.NotFound() @tg.expose() def default(self, *vpath, **params): if len(vpath) == 1: identifier = vpath[0] action = self.read elif len(vpath) == 2: identifier, verb = vpath verb.replace('.', '_') action = getattr(self, verb, None) if action is None: raise cherrypy.NotFound() if not action.exposed: raise cherrypy.NotFound() else: raise cherrypy.NotFound() resource = self.query_one(identifier) if not resource: raise cherrypy.NotFound() else: return action(resource, **params) class MmfFields(tg.widgets.WidgetsList): name = tg.widgets.TextField(validator=tg.validators.NotEmpty()) MmfForm = tg.widgets.ListForm(fields=MmfFields(), submit_text="Add MMF", action="do_add") class Mmf(RestResource): @tg.expose(template="naked_planning.templates.mmf_add") def add(self, tg_errors=None): return dict(form=MmfForm) @tg.validate(form=MmfForm) @tg.error_handler(add) @tg.expose() def do_add(self, name): m = model.plan.Mmf(name=name,description='') tg.redirect("/mmf") @tg.expose(template="naked_planning.templates.dashboard") def list(self, mmfs): return dict(mmfs=mmfs) @tg.expose(template="naked_planning.templates.single_mmf") def show(self, mmf): return {'mmf':mmf} def query_one(self, name): return model.plan.Mmf.query().filter(model.plan.Mmf.c.name == name).first() def query_all(self): return model.plan.Mmf.query().order_by(model.plan.Mmf.c.order).all() class Root(tg.controllers.RootController): mmf = Mmf() @tg.expose() # @tg.identity.require(identity.in_group("admin")) def index(self): raise tg.redirect('/mmf/') @tg.expose(template="naked_planning.templates.login") def login(self, forward_url=None, previous_url=None, *args, **kw): if not tg.identity.current.anonymous \ and tg.identity.was_login_attempted() \ and not tg.identity.get_identity_errors(): raise tg.redirect(forward_url) forward_url=None previous_url= request.path if tg.identity.was_login_attempted(): msg=_("The credentials you supplied were not correct or " "did not grant access to this resource.") elif tg.identity.get_identity_errors(): msg=_("You must provide your credentials before accessing " "this resource.") else: msg=_("Please log in.") forward_url= request.headers.get("Referer", "/") response.status=403 return dict(message=msg, previous_url=previous_url, logging_in=True, original_parameters=request.params, forward_url=forward_url) @tg.expose() def logout(self): tg.identity.current.logout() raise redirect("/")