From ed04caf68c46f4045b79c307171f49e7c7257ac9 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Fri, 9 Nov 2012 09:00:33 -0800 Subject: [PATCH] remove pyramid/handlers (what was that still doing there?) --- edbob/pyramid/handlers/__init__.py | 0 edbob/pyramid/handlers/base.py | 291 ----------------------------- edbob/pyramid/handlers/util.py | 72 ------- 3 files changed, 363 deletions(-) delete mode 100644 edbob/pyramid/handlers/__init__.py delete mode 100644 edbob/pyramid/handlers/base.py delete mode 100644 edbob/pyramid/handlers/util.py diff --git a/edbob/pyramid/handlers/__init__.py b/edbob/pyramid/handlers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/edbob/pyramid/handlers/base.py b/edbob/pyramid/handlers/base.py deleted file mode 100644 index bf2eac2..0000000 --- a/edbob/pyramid/handlers/base.py +++ /dev/null @@ -1,291 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -################################################################################ -# -# edbob -- Pythonic Software Framework -# Copyright © 2010-2012 Lance Edgar -# -# This file is part of edbob. -# -# edbob is free software: you can redistribute it and/or modify it under the -# terms of the GNU Affero General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) -# any later version. -# -# edbob is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for -# more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with edbob. If not, see . -# -################################################################################ - -""" -``edbob.pyramid.handlers.base`` -- Base Handlers -""" - -from pyramid.renderers import render_to_response -from pyramid.httpexceptions import HTTPException, HTTPFound, HTTPOk, HTTPUnauthorized - -# import sqlahelper - -# # import rattail.pyramid.forms.util as util -# from rattail.db.perms import has_permission -# from rattail.pyramid.forms.formalchemy import Grid - - -class needs_perm(object): - """ - Decorator to be used for handler methods which should restrict access based - on the current user's permissions. - """ - - def __init__(self, permission, **kwargs): - self.permission = permission - self.kwargs = kwargs - - def __call__(self, fn): - permission = self.permission - kw = self.kwargs - def wrapped(self): - if not self.request.current_user: - self.request.session['referrer'] = self.request.url_generator.current() - self.request.session.flash("You must be logged in to do that.", 'error') - return HTTPFound(location=self.request.route_url('login')) - if not has_permission(self.request.current_user, permission): - self.request.session.flash("You do not have permission to do that.", 'error') - home = kw.get('redirect', self.request.route_url('home')) - return HTTPFound(location=home) - return fn(self) - return wrapped - - -def needs_user(fn): - """ - Decorator for handler methods which require simply that a user be currently - logged in. - """ - - def wrapped(self): - if not self.request.current_user: - self.request.session['referrer'] = self.request.url_generator.current() - self.request.session.flash("You must be logged in to do that.", 'error') - return HTTPFound(location=self.request.route_url('login')) - return fn(self) - return wrapped - - -class Handler(object): - - def __init__(self, request): - self.request = request - self.Session = sqlahelper.get_session() - - # def json_response(self, data={}): - # response = render_to_response('json', data, request=self.request) - # response.headers['Content-Type'] = 'application/json' - # return response - - -class CrudHandler(Handler): - # """ - # This handler provides all the goodies typically associated with general - # CRUD functionality, e.g. search filters and grids. - # """ - - def crud(self, cls, fieldset_factory, home=None, delete=None, post_sync=None, pre_render=None): - """ - Adds a common CRUD mechanism for objects. - - ``cls`` should be a SQLAlchemy-mapped class, presumably deriving from - :class:`rattail.Object`. - - ``fieldset_factory`` must be a callable which accepts the fieldset's - "model" as its only positional argument. - - ``home`` will be used as the redirect location once a form is fully - validated and data saved. If you do not speficy this parameter, the - user will be redirected to be the CRUD page for the new object (e.g. so - an object may be created before certain properties may be edited). - - ``delete`` may either be a string containing a URL to which the user - should be redirected after the object has been deleted, or else a - callback which will be executed *instead of* the normal algorithm - (which is merely to delete the object via the Session). - - ``post_sync`` may be a callback which will be executed immediately - after ``FieldSet.sync()`` is called, i.e. after validation as well. - - ``pre_render`` may be a callback which will be executed after any POST - processing has occured, but just before rendering. - """ - - uuid = self.request.params.get('uuid') - obj = self.Session.query(cls).get(uuid) if uuid else cls - assert obj - - if self.request.params.get('delete'): - if delete: - if isinstance(delete, basestring): - self.Session.delete(obj) - return HTTPFound(location=delete) - res = delete(obj) - if res: - return res - else: - self.Session.delete(obj) - if not home: - raise ValueError("Must specify 'home' or 'delete' url " - "in call to CrudHandler.crud()") - return HTTPFound(location=home) - - fs = fieldset_factory(obj) - - # if not fs.readonly and self.request.params.get('fieldset'): - # fs.rebind(data=self.request.params) - # if fs.validate(): - # fs.sync() - # if post_sync: - # res = post_sync(fs) - # if isinstance(res, HTTPFound): - # return res - # if self.request.params.get('partial'): - # self.Session.flush() - # return self.json_success(uuid=fs.model.uuid) - # return HTTPFound(location=self.request.route_url(objects, action='index')) - - if not fs.readonly and self.request.POST: - # print self.request.POST - fs.rebind(data=self.request.params) - if fs.validate(): - fs.sync() - if post_sync: - res = post_sync(fs) - if res: - return res - if self.request.params.get('partial'): - self.Session.flush() - return self.json_success(uuid=fs.model.uuid) - - if not home: - self.Session.flush() - home = self.request.url_generator.current() + '?uuid=' + fs.model.uuid - self.request.session.flash("%s \"%s\" has been %s." % ( - fs.crud_title, fs.get_display_text(), - 'updated' if fs.edit else 'created')) - return HTTPFound(location=home) - - data = {'fieldset': fs, 'crud': True} - - if pre_render: - res = pre_render(fs) - if res: - if isinstance(res, HTTPException): - return res - data.update(res) - - # data = {'fieldset':fs} - # if self.request.params.get('partial'): - # return render_to_response('/%s/crud_partial.mako' % objects, - # data, request=self.request) - # return data - - return data - - def grid(self, *args, **kwargs): - """ - Convenience function which returns a grid. The only functionality this - method adds is the ``session`` parameter. - """ - - return Grid(session=self.Session(), *args, **kwargs) - - # def get_grid(self, name, grid, query, search=None, url=None, **defaults): - # """ - # Convenience function for obtaining the configuration for a grid, - # and then obtaining the grid itself. - - # ``name`` is essentially the config key, e.g. ``'products.lookup'``, and - # in fact is expected to take that precise form (where the first part is - # considered the handler name and the second part the action name). - - # ``grid`` must be a callable with a signature of ``grid(query, - # config)``, and ``query`` will be passed directly to the ``grid`` - # callable. ``search`` will be used to inform the grid of the search in - # effect, if any. ``defaults`` will be used to customize the grid config. - # """ - - # if not url: - # handler, action = name.split('.') - # url = self.request.route_url(handler, action=action) - # config = util.get_grid_config(name, self.request, search, - # url=url, **defaults) - # return grid(query, config) - - # def get_search_form(self, name, labels={}, **defaults): - # """ - # Convenience function for obtaining the configuration for a search form, - # and then obtaining the form itself. - - # ``name`` is essentially the config key, e.g. ``'products.lookup'``. - # The ``labels`` dictionary can be used to override the default labels - # displayed for the various search fields. The ``defaults`` dictionary - # is used to customize the search config. - # """ - - # config = util.get_search_config(name, self.request, - # self.filter_map(), **defaults) - # form = util.get_search_form(config, **labels) - # return form - - # def object_crud(self, cls, objects=None, post_sync=None): - # """ - # This method is a desperate attempt to encapsulate shared CRUD logic - # which is useful across all editable data objects. - - # ``objects``, if provided, should be the plural name for the class as - # used in internal naming, e.g. ``'products'``. A default will be used - # if you do not provide this value. - - # ``post_sync``, if provided, should be a callable which accepts a - # ``formalchemy.Fieldset`` instance as its only argument. It will be - # called immediately after the fieldset is synced. - # """ - - # if not objects: - # objects = cls.__name__.lower() + 's' - - # uuid = self.request.params.get('uuid') - # obj = self.Session.query(cls).get(uuid) if uuid else cls - # assert obj - - # fs = self.fieldset(obj) - - # if not fs.readonly and self.request.params.get('fieldset'): - # fs.rebind(data=self.request.params) - # if fs.validate(): - # fs.sync() - # if post_sync: - # res = post_sync(fs) - # if isinstance(res, HTTPFound): - # return res - # if self.request.params.get('partial'): - # self.Session.flush() - # return self.json_success(uuid=fs.model.uuid) - # return HTTPFound(location=self.request.route_url(objects, action='index')) - - # data = {'fieldset':fs} - # if self.request.params.get('partial'): - # return render_to_response('/%s/crud_partial.mako' % objects, - # data, request=self.request) - # return data - - # def render_grid(self, grid, search=None, **kwargs): - # """ - # Convenience function to render a standard grid. Really just calls - # :func:`dtail.forms.util.render_grid()`. - # """ - - # return util.render_grid(self.request, grid, search, **kwargs) diff --git a/edbob/pyramid/handlers/util.py b/edbob/pyramid/handlers/util.py deleted file mode 100644 index 0530947..0000000 --- a/edbob/pyramid/handlers/util.py +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -################################################################################ -# -# edbob -- Pythonic Software Framework -# Copyright © 2010-2012 Lance Edgar -# -# This file is part of edbob. -# -# edbob is free software: you can redistribute it and/or modify it under the -# terms of the GNU Affero General Public License as published by the Free -# Software Foundation, either version 3 of the License, or (at your option) -# any later version. -# -# edbob is distributed in the hope that it will be useful, but WITHOUT ANY -# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for -# more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with edbob. If not, see . -# -################################################################################ - -""" -``edbob.pyramid.handlers.util`` -- Handler Utilities -""" - -from pyramid.httpexceptions import HTTPFound - -from edbob.db.perms import has_permission - - -class needs_perm(object): - """ - Decorator to be used for handler methods which should restrict access based - on the current user's permissions. - """ - - def __init__(self, permission, **kwargs): - self.permission = permission - self.kwargs = kwargs - - def __call__(self, fn): - permission = self.permission - kw = self.kwargs - def wrapped(self): - if not self.request.current_user: - self.request.session['referrer'] = self.request.url_generator.current() - self.request.session.flash("You must be logged in to do that.", 'error') - return HTTPFound(location=self.request.route_url('login')) - if not has_permission(self.request.current_user, permission): - self.request.session.flash("You do not have permission to do that.", 'error') - home = kw.get('redirect', self.request.route_url('home')) - return HTTPFound(location=home) - return fn(self) - return wrapped - - -def needs_user(fn): - """ - Decorator for handler methods which require simply that a user be currently - logged in. - """ - - def wrapped(self): - if not self.request.current_user: - self.request.session['referrer'] = self.request.url_generator.current() - self.request.session.flash("You must be logged in to do that.", 'error') - return HTTPFound(location=self.request.route_url('login')) - return fn(self) - return wrapped