From 4aa91414a547cf995a35b6d47d511ec8b1779806 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Mon, 3 Jul 2017 16:58:30 -0500 Subject: [PATCH] Tweak how customer/person relationships are displayed expose just a little more to make it easier to track down a data issue i had --- tailbone/forms/renderers/__init__.py | 2 +- tailbone/forms/renderers/people.py | 20 +++++++++++++++++++- tailbone/views/customers.py | 6 ++++-- tailbone/views/people.py | 10 ++++++++-- 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/tailbone/forms/renderers/__init__.py b/tailbone/forms/renderers/__init__.py index 127f47b5..02e9b08d 100644 --- a/tailbone/forms/renderers/__init__.py +++ b/tailbone/forms/renderers/__init__.py @@ -35,7 +35,7 @@ from .common import (StrippedTextFieldRenderer, CodeTextAreaFieldRenderer, Autoc from .files import FileFieldRenderer -from .people import PersonFieldRenderer, CustomerFieldRenderer +from .people import PersonFieldRenderer, PeopleFieldRenderer, CustomerFieldRenderer from .users import UserFieldRenderer, PermissionsFieldRenderer from .employees import EmployeeFieldRenderer diff --git a/tailbone/forms/renderers/people.py b/tailbone/forms/renderers/people.py index a864ff75..792bf422 100644 --- a/tailbone/forms/renderers/people.py +++ b/tailbone/forms/renderers/people.py @@ -27,7 +27,8 @@ People Field Renderers from __future__ import unicode_literals, absolute_import import six -from webhelpers.html import tags +import formalchemy as fa +from webhelpers.html import tags, HTML from tailbone.forms.renderers.common import AutocompleteFieldRenderer @@ -45,6 +46,23 @@ class PersonFieldRenderer(AutocompleteFieldRenderer): return tags.link_to(person, self.request.route_url('people.view', uuid=person.uuid)) +class PeopleFieldRenderer(fa.FieldRenderer): + """ + Renderer for "people" list relationship + """ + + def render_readonly(self, **kwargs): + html = '' + people = self.raw_value + if not people: + return html + for person in people: + link = tags.link_to(person, self.request.route_url('people.view', uuid=person.uuid)) + html += HTML.tag('li', c=link) + html = HTML.tag('ul', c=html) + return html + + class CustomerFieldRenderer(AutocompleteFieldRenderer): """ Renderer for :class:`rattail.db.model.Customer` instance fields. diff --git a/tailbone/views/customers.py b/tailbone/views/customers.py index 20631cba..c3c9ebf7 100644 --- a/tailbone/views/customers.py +++ b/tailbone/views/customers.py @@ -1,8 +1,8 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8; -*- ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2015 Lance Edgar +# Copyright © 2010-2017 Lance Edgar # # This file is part of Rattail. # @@ -121,6 +121,7 @@ class CustomersView(MasterView): fs.append(forms.fields.DefaultPhoneField('default_phone', label="Phone Number")) fs.append(forms.fields.DefaultEmailField('default_email', label="Email Address")) fs.email_preference.set(renderer=forms.EnumFieldRenderer(self.enum.EMAIL_PREFERENCE)) + fs.append(forms.AssociationProxyField('people', renderer=forms.renderers.PeopleFieldRenderer)) def configure_fieldset(self, fs): fs.configure( @@ -132,6 +133,7 @@ class CustomersView(MasterView): # fs.email.label("Email Address").readonly(), fs.default_email, fs.email_preference, + fs.people, ]) def configure_mobile_fieldset(self, fs): diff --git a/tailbone/views/people.py b/tailbone/views/people.py index 90c109c1..87cc7d21 100644 --- a/tailbone/views/people.py +++ b/tailbone/views/people.py @@ -1,8 +1,8 @@ -# -*- coding: utf-8 -*- +# -*- coding: utf-8; -*- ################################################################################ # # Rattail -- Retail Software Framework -# Copyright © 2010-2016 Lance Edgar +# Copyright © 2010-2017 Lance Edgar # # This file is part of Rattail. # @@ -32,6 +32,7 @@ import formalchemy as fa from pyramid.httpexceptions import HTTPFound, HTTPNotFound from webhelpers.html import HTML, tags +from tailbone import forms from tailbone.views import MasterView, AutocompleteView from rattail.db import model @@ -74,6 +75,9 @@ class PeopleView(MasterView): g.filters['phone'] = g.make_filter('phone', model.PersonPhoneNumber.number, label="Phone Number") + g.joiners['customer_id'] = lambda q: q.outerjoin(model.CustomerPerson).outerjoin(model.Customer) + g.filters['customer_id'] = g.make_filter('customer_id', model.Customer.id, label="Customer ID") + g.filters['first_name'].default_active = True g.filters['first_name'].default_verb = 'contains' @@ -122,6 +126,7 @@ class PeopleView(MasterView): fs.phone.set(label="Phone Number", readonly=True) fs.email.set(label="Email Address", readonly=True) fs.address.set(label="Mailing Address", readonly=True) + fs.employee.set(renderer=forms.renderers.EmployeeFieldRenderer, attrs={'hyperlink': True}) fs._customers.set(renderer=CustomersFieldRenderer, readonly=True) def configure_fieldset(self, fs): @@ -134,6 +139,7 @@ class PeopleView(MasterView): fs.phone, fs.email, fs.address, + fs.employee, fs._customers, ])