extended commit (see note)

- Slight overhaul of init() system; added ``edbob.init_modules()`` function.

- Added ``read_service()`` method to ``AppConfigParser`` class, for use with
  Windows services.

- Added generic ``Service`` class to ``edbob.win32`` module.  (File monitor now
  inherits from it.)

- Tweaked ``edbob.db`` initialization somewhat.  (``Base.metadata`` no longer
  binds to ``edbob.db.engine``.)

- Fixed guest role bug in ``edbob.db.auth.has_permission()`` function.

- Added "automagical" enumeration support for database extensions.

- Added ``EMAIL_PREFERENCE`` enum to ``contact`` database extension.

- Tweaked ``edbob.pyramid.includeme()``.

- Tweaked ``people`` Pyramid views.
This commit is contained in:
Lance Edgar 2012-09-17 11:43:13 -07:00
parent 526ff5dd6b
commit c7e0bfef6a
18 changed files with 457 additions and 248 deletions

View file

@ -26,155 +26,239 @@
``edbob.pyramid.views.people`` -- Person Views
"""
import transaction
from pyramid.httpexceptions import HTTPFound
from sqlalchemy import and_
from formalchemy import Field
# import transaction
# from pyramid.httpexceptions import HTTPFound
# from formalchemy import Field
import edbob
from edbob.pyramid import filters
from edbob.pyramid import forms
from edbob.pyramid import grids
from edbob.pyramid import Session
# from edbob.pyramid import filters
# from edbob.pyramid import forms
# from edbob.pyramid import grids
# from edbob.pyramid import Session
from edbob.pyramid.views import SearchableAlchemyGridView, CrudView
def filter_map():
return filters.get_filter_map(
edbob.Person,
ilike=['first_name', 'last_name', 'display_name'])
class PeopleGrid(SearchableAlchemyGridView):
def search_config(request, fmap):
return filters.get_search_config(
'people.list', request, fmap,
include_filter_display_name=True,
filter_type_display_name='lk')
mapped_class = edbob.Person
config_prefix = 'people'
sort = 'first_name'
def search_form(config):
return filters.get_search_form(config)
def join_map(self):
return {
'email':
lambda q: q.outerjoin(edbob.PersonEmailAddress, and_(
edbob.PersonEmailAddress.parent_uuid == edbob.Person.uuid,
edbob.PersonEmailAddress.preference == 1)),
'phone':
lambda q: q.outerjoin(edbob.PersonPhoneNumber, and_(
edbob.PersonPhoneNumber.parent_uuid == edbob.Person.uuid,
edbob.PersonPhoneNumber.preference == 1)),
}
def grid_config(request, search, fmap):
return grids.get_grid_config(
'people.list', request, search,
filter_map=fmap, sort='display_name')
def filter_map(self):
return self.make_filter_map(
ilike=['first_name', 'last_name'],
email=self.filter_ilike(edbob.PersonEmailAddress.address),
phone=self.filter_ilike(edbob.PersonPhoneNumber.number))
def sort_map():
return grids.get_sort_map(
edbob.Person,
['first_name', 'last_name', 'display_name'])
def filter_config(self):
return self.make_filter_config(
include_filter_first_name=True,
filter_type_first_name='lk',
include_filter_last_name=True,
filter_type_last_name='lk',
filter_label_phone="Phone Number",
filter_label_email="Email Address")
def query(config):
smap = sort_map()
q = Session.query(edbob.Person)
q = filters.filter_query(q, config)
q = grids.sort_query(q, config, smap)
return q
def sort_map(self):
return self.make_sort_map(
'first_name', 'last_name',
email=self.sorter(edbob.PersonEmailAddress.address),
phone=self.sorter(edbob.PersonPhoneNumber.number))
def grid(self):
g = self.make_grid()
g.configure(
include=[
g.first_name,
g.last_name,
g.phone.label("Phone Number"),
g.email.label("Email Address"),
],
readonly=True)
g.clickable = True
g.click_route_name = 'person.read'
return g
def people(context, request):
class PersonCrud(CrudView):
fmap = filter_map()
config = search_config(request, fmap)
search = search_form(config)
config = grid_config(request, search, fmap)
people = grids.get_pager(query, config)
mapped_class = edbob.Person
home_route = 'people'
g = forms.AlchemyGrid(
edbob.Person, people, config,
gridurl=request.route_url('people.list'),
objurl='person.edit')
g.configure(
include=[
g.first_name,
g.last_name,
g.display_name,
],
readonly=True)
grid = g.render(class_='clickable people')
return grids.render_grid(request, grid, search)
def fieldset(self, model):
fs = self.make_fieldset(model)
fs.configure(
include=[
fs.first_name,
fs.last_name,
fs.phone.label("Phone Number"),
fs.email.label("Email Address"),
])
return fs
def person_fieldset(person, request):
fs = forms.make_fieldset(person, url=request.route_url,
url_action=request.current_route_url(),
route_name='people.list')
fs.configure(
include=[
fs.first_name,
fs.last_name,
fs.display_name,
])
return fs
# def filter_map():
# return filters.get_filter_map(
# edbob.Person,
# ilike=['first_name', 'last_name', 'display_name'])
# def search_config(request, fmap):
# return filters.get_search_config(
# 'people.list', request, fmap,
# include_filter_display_name=True,
# filter_type_display_name='lk')
# def search_form(config):
# return filters.get_search_form(config)
# def grid_config(request, search, fmap):
# return grids.get_grid_config(
# 'people.list', request, search,
# filter_map=fmap, sort='display_name')
# def sort_map():
# return grids.get_sort_map(
# edbob.Person,
# ['first_name', 'last_name', 'display_name'])
# def query(config):
# smap = sort_map()
# q = Session.query(edbob.Person)
# q = filters.filter_query(q, config)
# q = grids.sort_query(q, config, smap)
# return q
def new_person(context, request):
# def people(context, request):
fs = person_fieldset(edbob.Person, request)
if not fs.readonly and request.POST:
fs.rebind(data=request.params)
if fs.validate():
# fmap = filter_map()
# config = search_config(request, fmap)
# search = search_form(config)
# config = grid_config(request, search, fmap)
# people = grids.get_pager(query, config)
with transaction.manager:
fs.sync()
Session.add(fs.model)
Session.flush()
request.session.flash("%s \"%s\" has been %s." % (
fs.crud_title, fs.get_display_text(),
'updated' if fs.edit else 'created'))
# g = forms.AlchemyGrid(
# edbob.Person, people, config,
# gridurl=request.route_url('people.list'),
# objurl='person.edit')
return HTTPFound(location=request.route_url('people.list'))
# g.configure(
# include=[
# g.first_name,
# g.last_name,
# g.display_name,
# ],
# readonly=True)
return {'fieldset': fs, 'crud': True}
# grid = g.render(class_='clickable people')
# return grids.render_grid(request, grid, search)
def edit_person(request):
"""
View for editing a :class:`edbob.Person` instance.
"""
# def person_fieldset(person, request):
# fs = forms.make_fieldset(person, url=request.route_url,
# url_action=request.current_route_url(),
# route_name='people.list')
# fs.configure(
# include=[
# fs.first_name,
# fs.last_name,
# fs.display_name,
# ])
# return fs
from edbob.pyramid.views.users import user_fieldset
uuid = request.matchdict['uuid']
person = Session.query(edbob.Person).get(uuid) if uuid else None
assert person
# def new_person(context, request):
fs = person_fieldset(person, request)
if request.POST:
fs.rebind(data=request.params)
if fs.validate():
# fs = person_fieldset(edbob.Person, request)
# if not fs.readonly and request.POST:
# fs.rebind(data=request.params)
# if fs.validate():
with transaction.manager:
fs.sync()
fs.model = Session.merge(fs.model)
request.session.flash("%s \"%s\" has been %s." % (
fs.crud_title, fs.get_display_text(),
'updated' if fs.edit else 'created'))
home = request.route_url('people.list')
# with transaction.manager:
# fs.sync()
# Session.add(fs.model)
# Session.flush()
# 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)
# return HTTPFound(location=request.route_url('people.list'))
user = fs.model.user
if user:
user = user_fieldset(user, request)
user.readonly = True
del user.person
del user.password
del user.confirm_password
# return {'fieldset': fs, 'crud': True}
return {'fieldset': fs, 'crud': True, 'user': user}
# def edit_person(request):
# """
# View for editing a :class:`edbob.Person` instance.
# """
# from edbob.pyramid.views.users import user_fieldset
# uuid = request.matchdict['uuid']
# person = Session.query(edbob.Person).get(uuid) if uuid else None
# assert person
# fs = person_fieldset(person, request)
# if request.POST:
# fs.rebind(data=request.params)
# if fs.validate():
# with transaction.manager:
# fs.sync()
# fs.model = Session.merge(fs.model)
# request.session.flash("%s \"%s\" has been %s." % (
# fs.crud_title, fs.get_display_text(),
# 'updated' if fs.edit else 'created'))
# home = request.route_url('people.list')
# return HTTPFound(location=home)
# user = fs.model.user
# if user:
# user = user_fieldset(user, request)
# user.readonly = True
# del user.person
# del user.password
# del user.confirm_password
# return {'fieldset': fs, 'crud': True, 'user': user}
def includeme(config):
config.add_route('people.list', '/people')
config.add_view(people, route_name='people.list', renderer='/people/index.mako',
permission='people.list', http_cache=0)
config.add_route('people', '/people')
config.add_view(PeopleGrid, route_name='people',
renderer='/people/index.mako',
permission='people.list')
config.add_route('person.new', '/people/new')
config.add_view(new_person, route_name='person.new', renderer='/people/person.mako',
permission='people.create', http_cache=0)
# config.add_route('people.list', '/people')
# config.add_view(people, route_name='people.list', renderer='/people/index.mako',
# permission='people.list', http_cache=0)
config.add_route('person.edit', '/people/{uuid}/edit')
config.add_view(edit_person, route_name='person.edit', renderer='/people/person.mako',
permission='people.edit', http_cache=0)
config.add_route('person.read', '/people/{uuid}')
config.add_view(PersonCrud, attr='read', route_name='person.read',
renderer='/people/crud.mako',
permission='people.read')
# config.add_route('person.new', '/people/new')
# config.add_view(new_person, route_name='person.new', renderer='/people/person.mako',
# permission='people.create', http_cache=0)
# config.add_route('person.edit', '/people/{uuid}/edit')
# config.add_view(edit_person, route_name='person.edit', renderer='/people/person.mako',
# permission='people.edit', http_cache=0)