a7f4b2e6ef
finally! this cleans up some view config and AFAIK there is no loss in functionality etc.
174 lines
5 KiB
Python
174 lines
5 KiB
Python
# -*- coding: utf-8; -*-
|
|
################################################################################
|
|
#
|
|
# Rattail -- Retail Software Framework
|
|
# Copyright © 2010-2021 Lance Edgar
|
|
#
|
|
# This file is part of Rattail.
|
|
#
|
|
# Rattail is free software: you can redistribute it and/or modify it under the
|
|
# terms of the GNU General Public License as published by the Free Software
|
|
# Foundation, either version 3 of the License, or (at your option) any later
|
|
# version.
|
|
#
|
|
# Rattail 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 General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# Rattail. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
################################################################################
|
|
"""
|
|
Vendor Views
|
|
"""
|
|
|
|
from __future__ import unicode_literals, absolute_import
|
|
|
|
import six
|
|
|
|
from rattail.db import model
|
|
|
|
from webhelpers2.html import tags
|
|
|
|
from tailbone.views import MasterView
|
|
|
|
|
|
class VendorView(MasterView):
|
|
"""
|
|
Master view for the Vendor class.
|
|
"""
|
|
model_class = model.Vendor
|
|
has_versions = True
|
|
touchable = True
|
|
supports_autocomplete = True
|
|
|
|
labels = {
|
|
'id': "ID",
|
|
'default_phone': "Phone Number",
|
|
'default_email': "Default Email",
|
|
}
|
|
|
|
grid_columns = [
|
|
'id',
|
|
'name',
|
|
'abbreviation',
|
|
'phone',
|
|
'email',
|
|
'contact',
|
|
]
|
|
|
|
form_fields = [
|
|
'id',
|
|
'name',
|
|
'abbreviation',
|
|
'special_discount',
|
|
'lead_time_days',
|
|
'order_interval_days',
|
|
'default_phone',
|
|
'default_email',
|
|
'orders_email',
|
|
'contact',
|
|
]
|
|
|
|
def configure_grid(self, g):
|
|
super(VendorView, self).configure_grid(g)
|
|
|
|
g.filters['name'].default_active = True
|
|
g.filters['name'].default_verb = 'contains'
|
|
g.set_sort_defaults('name')
|
|
|
|
g.set_label('phone', "Phone Number")
|
|
g.set_label('email', "Email Address")
|
|
|
|
g.set_link('id')
|
|
g.set_link('name')
|
|
g.set_link('abbreviation')
|
|
|
|
def configure_form(self, f):
|
|
super(VendorView, self).configure_form(f)
|
|
vendor = f.model_instance
|
|
|
|
f.set_type('lead_time_days', 'quantity')
|
|
f.set_type('order_interval_days', 'quantity')
|
|
|
|
# default_phone
|
|
f.set_renderer('default_phone', self.render_default_phone)
|
|
if not self.creating and vendor.phones:
|
|
f.set_default('default_phone', vendor.phones[0].number)
|
|
|
|
# default_email
|
|
f.set_renderer('default_email', self.render_default_email)
|
|
if not self.creating and vendor.emails:
|
|
f.set_default('default_email', vendor.emails[0].address)
|
|
|
|
# orders_email
|
|
f.set_renderer('orders_email', self.render_orders_email)
|
|
if not self.creating and vendor.emails:
|
|
f.set_default('orders_email', vendor.get_email_address(type_='Orders') or '')
|
|
|
|
# contact
|
|
if self.creating:
|
|
f.remove_field('contact')
|
|
else:
|
|
f.set_readonly('contact')
|
|
f.set_renderer('contact', self.render_contact)
|
|
|
|
def objectify(self, form, data=None):
|
|
if data is None:
|
|
data = form.validated
|
|
vendor = super(VendorView, self).objectify(form, data)
|
|
vendor = self.objectify_contact(vendor, data)
|
|
|
|
if 'orders_email' in data:
|
|
address = data['orders_email']
|
|
email = vendor.get_email(type_='Orders')
|
|
if address:
|
|
if email:
|
|
if email.address != address:
|
|
email.address = address
|
|
else:
|
|
vendor.add_email_address(address, type='Orders')
|
|
elif email:
|
|
vendor.emails.remove(email)
|
|
|
|
return vendor
|
|
|
|
def render_default_email(self, vendor, field):
|
|
if vendor.emails:
|
|
return vendor.emails[0].address
|
|
|
|
def render_orders_email(self, vendor, field):
|
|
return vendor.get_email_address(type_='Orders')
|
|
|
|
def render_default_phone(self, vendor, field):
|
|
if vendor.phones:
|
|
return vendor.phones[0].number
|
|
|
|
def render_contact(self, vendor, field):
|
|
person = vendor.contact
|
|
if not person:
|
|
return ""
|
|
text = six.text_type(person)
|
|
url = self.request.route_url('people.view', uuid=person.uuid)
|
|
return tags.link_to(text, url)
|
|
|
|
def before_delete(self, vendor):
|
|
# Remove all product costs.
|
|
q = self.Session.query(model.ProductCost).filter(
|
|
model.ProductCost.vendor == vendor)
|
|
for cost in q:
|
|
self.Session.delete(cost)
|
|
|
|
def get_version_child_classes(self):
|
|
return [
|
|
(model.VendorPhoneNumber, 'parent_uuid'),
|
|
(model.VendorEmailAddress, 'parent_uuid'),
|
|
(model.VendorContact, 'vendor_uuid'),
|
|
]
|
|
|
|
|
|
def includeme(config):
|
|
VendorView.defaults(config)
|