From 7edfc98747ea123cb48ad2c00adeb779aa501b26 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sat, 30 Jan 2016 15:19:04 -0600 Subject: [PATCH] Add 'Stores' and 'Departments' fields to Employee fieldset. --- tailbone/templates/employees/view.mako | 13 ----- tailbone/views/employees.py | 79 +++++++++++++++++++------- 2 files changed, 60 insertions(+), 32 deletions(-) delete mode 100644 tailbone/templates/employees/view.mako diff --git a/tailbone/templates/employees/view.mako b/tailbone/templates/employees/view.mako deleted file mode 100644 index b02aaae7..00000000 --- a/tailbone/templates/employees/view.mako +++ /dev/null @@ -1,13 +0,0 @@ -## -*- coding: utf-8 -*- -<%inherit file="/master/view.mako" /> - -${parent.body()} - -

Departments

- -% if departments: -

This employee is assigned to the following departments:

- ${departments.render_grid()|n} -% else: -

This employee is not assigned to any departments.

-% endif diff --git a/tailbone/views/employees.py b/tailbone/views/employees.py index 3ac6f6d1..69bef032 100644 --- a/tailbone/views/employees.py +++ b/tailbone/views/employees.py @@ -31,7 +31,10 @@ import sqlalchemy as sa from rattail import enum from rattail.db import model +import formalchemy + from tailbone import forms +from tailbone.db import Session from tailbone.views import MasterView, AutocompleteView from tailbone.newgrids import AlchemyGrid, GridAction from tailbone.newgrids.filters import EnumValueRenderer @@ -112,6 +115,8 @@ class EmployeesView(MasterView): fs.append(forms.AssociationProxyField('first_name')) fs.append(forms.AssociationProxyField('last_name')) fs.append(forms.AssociationProxyField('display_name')) + fs.append(StoresField('stores')) + fs.append(DepartmentsField('departments')) fs.configure( include=[ fs.id.label("ID"), @@ -121,29 +126,65 @@ class EmployeesView(MasterView): fs.phone.label("Phone Number").readonly(), fs.email.label("Email Address").readonly(), fs.status.with_renderer(forms.EnumFieldRenderer(enum.EMPLOYEE_STATUS)), + fs.stores, + fs.departments, ]) - def template_kwargs_view(self, **kwargs): - employee = kwargs['instance'] - if employee.departments: - # TODO: This is the second attempt (after role.users) at using a - # new grid outside of the context of a primary master grid. The - # API here is really much hairier than I'd like... Looks like we - # shouldn't need a key for this one, for instance (no settings - # required), but there is plenty of room for improvement here. - departments = sorted(employee.departments, key=unicode) - departments = AlchemyGrid('employees.departments', self.request, data=departments, model_class=model.Department, - main_actions=[ - GridAction('view', icon='zoomin', - url=lambda d: self.request.route_url('departments.view', uuid=d.uuid)), - ]) - departments.configure(include=[departments.name], readonly=True) - kwargs['departments'] = departments +class StoresField(formalchemy.Field): - else: - kwargs['departments'] = None - return kwargs + def __init__(self, name, **kwargs): + kwargs.setdefault('type', formalchemy.types.Set) + kwargs.setdefault('options', Session.query(model.Store).order_by(model.Store.name)) + kwargs.setdefault('value', self.get_value) + kwargs.setdefault('multiple', True) + kwargs.setdefault('size', 3) + formalchemy.Field.__init__(self, name=name, **kwargs) + + def get_value(self, employee): + return [s.uuid for s in employee.stores] + + def sync(self): + if not self.is_readonly(): + employee = self.parent.model + old_stores = set([s.uuid for s in employee.stores]) + new_stores = set(self._deserialize()) + for uuid in new_stores: + if uuid not in old_stores: + employee._stores.append(model.EmployeeStore(store_uuid=uuid)) + for uuid in old_stores: + if uuid not in new_stores: + store = Session.query(model.Store).get(uuid) + assert store + employee.stores.remove(store) + + +class DepartmentsField(formalchemy.Field): + + def __init__(self, name, **kwargs): + kwargs.setdefault('type', formalchemy.types.Set) + kwargs.setdefault('options', Session.query(model.Department).order_by(model.Department.name)) + kwargs.setdefault('value', self.get_value) + kwargs.setdefault('multiple', True) + kwargs.setdefault('size', 10) + formalchemy.Field.__init__(self, name=name, **kwargs) + + def get_value(self, employee): + return [d.uuid for d in employee.departments] + + def sync(self): + if not self.is_readonly(): + employee = self.parent.model + old_depts = set([d.uuid for d in employee.departments]) + new_depts = set(self._deserialize()) + for uuid in new_depts: + if uuid not in old_depts: + employee._departments.append(model.EmployeeDepartment(department_uuid=uuid)) + for uuid in old_depts: + if uuid not in new_depts: + dept = Session.query(model.Department).get(uuid) + assert dept + employee.departments.remove(dept) class EmployeesAutocomplete(AutocompleteView):