From f2a60f683c930cfdb698c37ba7809138aefe9b15 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Thu, 22 Feb 2018 12:27:08 -0600 Subject: [PATCH] Add logic for editing default phone/email in base master view and refactor customer, vendor views to use it --- tailbone/views/customers.py | 30 +++-------------- tailbone/views/master.py | 26 +++++++++++++++ tailbone/views/vendors/core.py | 61 +++++++++++++++++++++++++++++----- 3 files changed, 82 insertions(+), 35 deletions(-) diff --git a/tailbone/views/customers.py b/tailbone/views/customers.py index c6b64379..aab47181 100644 --- a/tailbone/views/customers.py +++ b/tailbone/views/customers.py @@ -209,32 +209,10 @@ class CustomersView(MasterView): f.set_renderer('groups', self.render_groups) f.set_readonly('groups') - # TODO: something like this should be supported for default_email, default_phone - # def after_edit(self, customer): - # - # if not self.is_readonly(): - # address = self._deserialize() - # contact = self.parent.model - # if contact.emails: - # if address: - # email = contact.emails[0] - # email.address = address - # else: - # contact.emails.pop(0) - # elif address: - # email = contact.add_email_address(address) - # - # if not self.is_readonly(): - # number = self._deserialize() - # contact = self.parent.model - # if contact.phones: - # if number: - # phone = contact.phones[0] - # phone.number = number - # else: - # contact.phones.pop(0) - # elif number: - # phone = contact.add_phone_number(number) + def objectify(self, form, data): + customer = super(CustomersView, self).objectify(form, data) + customer = self.objectify_contact(customer, data) + return customer def render_default_email(self, customer, field): if customer.emails: diff --git a/tailbone/views/master.py b/tailbone/views/master.py index f3d49514..59b6d9b7 100644 --- a/tailbone/views/master.py +++ b/tailbone/views/master.py @@ -2233,6 +2233,32 @@ class MasterView(View): obj = form.schema.objectify(data, context=form.model_instance) return obj + def objectify_contact(self, contact, data): + + if 'default_email' in data: + address = data['default_email'] + if contact.emails: + if address: + email = contact.emails[0] + email.address = address + else: + contact.emails.pop(0) + elif address: + contact.add_email_address(address) + + if 'default_phone' in data: + number = data['default_phone'] + if contact.phones: + if number: + phone = contact.phones[0] + phone.number = number + else: + contact.phones.pop(0) + elif number: + contact.add_phone_number(number) + + return contact + def save_form(self, form): form.save() diff --git a/tailbone/views/vendors/core.py b/tailbone/views/vendors/core.py index 60e43682..59034faa 100644 --- a/tailbone/views/vendors/core.py +++ b/tailbone/views/vendors/core.py @@ -42,6 +42,12 @@ class VendorsView(MasterView): model_class = model.Vendor has_versions = True + labels = { + 'id': "ID", + 'default_phone': "Phone Number", + 'default_email': "Default Email", + } + grid_columns = [ 'id', 'name', @@ -56,8 +62,9 @@ class VendorsView(MasterView): 'special_discount', 'lead_time_days', 'order_interval_days', - 'phone', - 'email', + 'default_phone', + 'default_email', + 'orders_email', 'contact', ] @@ -68,7 +75,6 @@ class VendorsView(MasterView): g.filters['name'].default_verb = 'contains' g.set_sort_defaults('name') - g.set_label('id', "ID") g.set_label('phone', "Phone Number") g.set_label('email', "Email Address") @@ -77,22 +83,59 @@ class VendorsView(MasterView): def configure_form(self, f): super(VendorsView, self).configure_form(f) - - f.set_label('id', "ID") + vendor = f.model_instance f.set_label('lead_time_days', "Lead Time in Days") f.set_label('order_interval', "Order Interval in Days") - f.set_readonly('phone') - f.set_label('phone', "Phone Number") + # 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) - f.set_readonly('email') - f.set_label('email', "Email Address") + # 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 '') f.set_readonly('contact') f.set_renderer('contact', self.render_contact) + def objectify(self, form, data): + vendor = super(VendorsView, 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: