def create_mail_body(templates, context, order_data): """Creates a rendered mail body templates Dict with a bunch of cbs and the body template itself. context Some object in Plone which can be used as a context to acquire from order_data Order-data instance. """ lang = context.restrictedTraverse('@@plone_portal_state').language() attrs = order_data.order.attrs arguments = dict(attrs.items()) arguments['portal_url'] = getSite().absolute_url() arguments['date'] = attrs['created'].strftime(DT_FORMAT) salutation = translate(attrs['personal_data.gender'], domain='bda.plone.checkout', target_language=lang) arguments['salutation'] = safe_encode(salutation) # todo: next should be a cb if attrs['delivery_address.alternative_delivery']: delivery_address_template = templates['delivery_address'] arguments['delivery_address'] = delivery_address_template % arguments else: arguments['delivery_address'] = '' for name in POSSIBLE_TEMPLATE_CALLBACKS: _process_template_cb(name, templates, arguments, context, order_data) return templates['body'] % arguments
def _indent(text, ind=5, width=80): """helper indents text""" wrapped = textwrap.fill( safe_unicode(text), width, initial_indent=ind * u' ' ) return safe_encode(wrapped)
def create_mail_listing(context, order_data): """Create item listing for notification mail. """ lines = [] for booking in order_data.bookings: brain = get_catalog_brain(context, booking.attrs['buyable_uid']) # fetch buyable buyable = brain.getObject() # fetch buyable title title = safe_encode(booking.attrs['title']) # fetch buyable comment comment = booking.attrs['buyable_comment'] if comment: title = '%s (%s)' % (title, comment) # fetch currency currency = booking.attrs['currency'] # fetch net net = booking.attrs['net'] # build price price = '%s %0.2f' % (currency, net) # XXX: discount state = booking.attrs.get('state') state_text = '' if state == ifaces.STATE_RESERVED: state_text = ' ({})'.format(vocabs.state_vocab()[state]) line = '{count: 4f} {title}{state} {price}'.format( count=booking.attrs['buyable_count'], title=title, state=state_text, price=price, ) lines.append(line) if comment: lines.append(_indent('({0})'.format(comment))) notificationtext = IItemNotificationText(buyable) if state == ifaces.STATE_RESERVED: text = notificationtext.overbook_text elif state == ifaces.STATE_NEW: text = notificationtext.order_text else: text = None if text: lines.append(_indent(text)) return '\n'.join([safe_encode(l) for l in lines])
def cleanup_for_csv(value): """Cleanup a value for CSV export. """ if isinstance(value, datetime.datetime): value = value.strftime(DT_FORMAT) if value == '-': value = '' if isinstance(value, float) or \ isinstance(value, Decimal): value = str(value).replace('.', ',') return safe_encode(value)
def description(self): order = self.order_data.order attrs = order.attrs amount = '%s %s' % (self.currency, str(round(self.order_data.total, 2))) description = ', '.join([ attrs['created'].strftime(DT_FORMAT), attrs['personal_data.firstname'], attrs['personal_data.lastname'], attrs['billing_address.city'], safe_encode(amount)]) return description
def description(self): order = self.order_data.order attrs = order.attrs amount = '%s %s' % (self.currency, str(round(self.order_data.total, 2))) description = ', '.join([ attrs['created'].strftime(DT_FORMAT), attrs['personal_data.firstname'], attrs['personal_data.lastname'], attrs['billing_address.city'], safe_encode(amount) ]) return description
def __call__(self): user = plone.api.user.get_current() # check if authenticated user is vendor if not user.checkPermission(permissions.ModifyOrders, self.context): raise Unauthorized filename = '{}_{}.csv'.format( safe_encode(self.context.title), datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) resp = self.request.response resp.setHeader('content-type', 'text/csv; charset=utf-8') resp.setHeader('content-disposition', 'attachment;filename={}'.format(filename)) return self.get_csv()
def __call__(self): user = plone.api.user.get_current() # check if authenticated user is vendor if not user.checkPermission(permissions.ModifyOrders, self.context): raise Unauthorized filename = '{}_{}.csv'.format( safe_encode(self.context.title), datetime.datetime.now().strftime('%Y-%m-%d_%H-%M')) resp = self.request.response resp.setHeader('content-type', 'text/csv; charset=utf-8') resp.setHeader( 'content-disposition', 'attachment;filename={}'.format(filename)) return self.get_csv()
def send(self, subject, message, receiver): shop_manager_address = self.settings.admin_email if not shop_manager_address: raise ValueError('Shop manager address is missing in settings.') shop_manager_name = self.settings.admin_name if shop_manager_name: from_name = safe_encode(shop_manager_name) mailfrom = formataddr((from_name, shop_manager_address)) else: mailfrom = shop_manager_address api.portal.send_email( recipient=receiver, sender=mailfrom, subject=subject, body=message, )
def create_global_text(context, order_data): order_state = order_data.state notifications = set() for booking in order_data.bookings: brain = get_catalog_brain(context, booking.attrs['buyable_uid']) buyable = brain.getObject() notificationtext = IGlobalNotificationText(buyable) if order_state in (ifaces.STATE_RESERVED, ifaces.STATE_MIXED): # XXX: might need custom text for MIXED state text = notificationtext.global_overbook_text if text: notifications.add(text) elif order_state == ifaces.STATE_NEW: text = notificationtext.global_order_text if text: notifications.add(text) global_text = '\n\n'.join([safe_encode(line) for line in notifications]) if global_text.strip(): return '\n\n' + global_text.strip() + '\n' return ''
def create_mail_body(templates, context, order_data): """Creates a rendered mail body templates Dict with a bunch of cbs and the body template itself. context Some object in Plone which can be used as a context to acquire from order_data Order-data instance. """ lang = context.restrictedTraverse('@@plone_portal_state').language() attrs = order_data.order.attrs arguments = dict(attrs.items()) arguments['portal_url'] = getSite().absolute_url() arguments['date'] = attrs['created'].strftime(DT_FORMAT) salutation = translate(attrs['personal_data.gender'], domain='bda.plone.checkout', target_language=lang) arguments['salutation'] = safe_encode(salutation) # todo: next should be a cb if attrs['delivery_address.alternative_delivery']: delivery_address_template = templates['delivery_address'] arguments['delivery_address'] = delivery_address_template % arguments else: arguments['delivery_address'] = '' for name in POSSIBLE_TEMPLATE_CALLBACKS: _process_template_cb( name, templates, arguments, context, order_data ) return templates['body'] % arguments
def _indent(text, ind=5, width=80): """helper indents text""" wrapped = textwrap.fill(safe_unicode(text), width, initial_indent=ind * u' ') return safe_encode(wrapped)
def create_payment_text(context, order_data): payment = order_data.order.attrs['payment_method'] payment_text = safe_encode(IPaymentText(getSite()).payment_text(payment)) if payment_text.strip(): return '\n\n' + payment_text.strip() + '\n' return ''
def create_order_summary(context, order_data): """Create summary for notification mail. """ attrs = order_data.order.attrs cart_total = order_data.total # no costs at all if not cart_total: return '' lines = [] request = getRequest() # currency currency = order_data.currency # cart net and vat cart_net = order_data.net if cart_net: # cart net order_summary_cart_net = _('order_summary_cart_net', default=u'Net: ${value} ${currency}', mapping={ 'value': ascur(cart_net), 'currency': currency, }) lines.append(translate(order_summary_cart_net, context=request)) # cart vat cart_vat = order_data.vat order_summary_cart_vat = _('order_summary_cart_vat', default=u'VAT: ${value} ${currency}', mapping={ 'value': ascur(cart_vat), 'currency': currency, }) lines.append(translate(order_summary_cart_vat, context=request)) # cart discount discount_net = order_data.discount_net if discount_net: # discount net order_summary_discount_net = _( 'order_summary_discount_net', default=u'Discount Net: ${value} ${currency}', mapping={ 'value': ascur(discount_net), 'currency': currency, }) lines.append(translate(order_summary_discount_net, context=request)) # discount vat discount_vat = order_data.discount_vat order_summary_discount_vat = _( 'order_summary_discount_vat', default=u'Discount VAT: ${value} ${currency}', mapping={ 'value': ascur(discount_vat), 'currency': currency, }) lines.append(translate(order_summary_discount_vat, context=request)) # discount total discount_total = discount_net + discount_vat order_summary_discount_total = _( 'order_summary_discount_total', default=u'Discount Total: ${value} ${currency}', mapping={ 'value': ascur(discount_total), 'currency': currency, }) lines.append(translate(order_summary_discount_total, context=request)) # shipping costs shipping_net = order_data.shipping_net if shipping_net: # shiping label shipping_label = attrs['shipping_label'] order_summary_shipping_label = _('order_summary_shipping_label', default=u'Shipping: ${label}', mapping={ 'label': translate(shipping_label, context=request), }) lines.append(translate(order_summary_shipping_label, context=request)) # shiping description shipping_description = attrs['shipping_description'] lines.append(translate(shipping_description, context=request)) # shiping net order_summary_shipping_net = _( 'order_summary_shipping_net', default=u'Shipping Net: ${value} ${currency}', mapping={ 'value': ascur(shipping_net), 'currency': currency, }) lines.append(translate(order_summary_shipping_net, context=request)) # shiping vat shipping_vat = order_data.shipping_vat order_summary_shipping_vat = _( 'order_summary_shipping_vat', default=u'Shipping VAT: ${value} ${currency}', mapping={ 'value': ascur(shipping_vat), 'currency': currency, }) lines.append(translate(order_summary_shipping_vat, context=request)) # shiping total shipping_total = shipping_net + shipping_vat order_summary_shipping_total = _( 'order_summary_shipping_total', default=u'Shipping Total: ${value} ${currency}', mapping={ 'value': ascur(shipping_total), 'currency': currency, }) lines.append(translate(order_summary_shipping_total, context=request)) # cart total order_summary_cart_total = _('order_summary_cart_total', default=u'Total: ${value} ${currency}', mapping={ 'value': ascur(cart_total), 'currency': currency, }) lines.append(translate(order_summary_cart_total, context=request)) summary_title = translate(_('order_summary_label', default=u'Summary:'), context=request) summary_text = '\n' + '\n'.join([safe_encode(line) for line in lines]) return '\n' + safe_encode(summary_title) + summary_text + '\n'
def create_order_summary(context, order_data): """Create summary for notification mail. """ attrs = order_data.order.attrs cart_total = order_data.total # no costs at all if not cart_total: return '' lines = [] request = getRequest() # currency currency = order_data.currency # cart net and vat cart_net = order_data.net if cart_net: # cart net order_summary_cart_net = _( 'order_summary_cart_net', default=u'Net: ${value} ${currency}', mapping={ 'value': ascur(cart_net), 'currency': currency, }) lines.append(translate(order_summary_cart_net, context=request)) # cart vat cart_vat = order_data.vat order_summary_cart_vat = _( 'order_summary_cart_vat', default=u'VAT: ${value} ${currency}', mapping={ 'value': ascur(cart_vat), 'currency': currency, }) lines.append(translate(order_summary_cart_vat, context=request)) # cart discount discount_net = order_data.discount_net if discount_net: # discount net order_summary_discount_net = _( 'order_summary_discount_net', default=u'Discount Net: ${value} ${currency}', mapping={ 'value': ascur(discount_net), 'currency': currency, }) lines.append(translate(order_summary_discount_net, context=request)) # discount vat discount_vat = order_data.discount_vat order_summary_discount_vat = _( 'order_summary_discount_vat', default=u'Discount VAT: ${value} ${currency}', mapping={ 'value': ascur(discount_vat), 'currency': currency, }) lines.append(translate(order_summary_discount_vat, context=request)) # discount total discount_total = discount_net + discount_vat order_summary_discount_total = _( 'order_summary_discount_total', default=u'Discount Total: ${value} ${currency}', mapping={ 'value': ascur(discount_total), 'currency': currency, }) lines.append(translate(order_summary_discount_total, context=request)) # shipping costs shipping_net = order_data.shipping_net if shipping_net: # shiping label shipping_label = attrs['shipping_label'] order_summary_shipping_label = _( 'order_summary_shipping_label', default=u'Shipping: ${label}', mapping={ 'label': translate(shipping_label, context=request), }) lines.append(translate(order_summary_shipping_label, context=request)) # shiping description shipping_description = attrs['shipping_description'] lines.append(translate(shipping_description, context=request)) # shiping net order_summary_shipping_net = _( 'order_summary_shipping_net', default=u'Shipping Net: ${value} ${currency}', mapping={ 'value': ascur(shipping_net), 'currency': currency, }) lines.append(translate(order_summary_shipping_net, context=request)) # shiping vat shipping_vat = order_data.shipping_vat order_summary_shipping_vat = _( 'order_summary_shipping_vat', default=u'Shipping VAT: ${value} ${currency}', mapping={ 'value': ascur(shipping_vat), 'currency': currency, }) lines.append(translate(order_summary_shipping_vat, context=request)) # shiping total shipping_total = shipping_net + shipping_vat order_summary_shipping_total = _( 'order_summary_shipping_total', default=u'Shipping Total: ${value} ${currency}', mapping={ 'value': ascur(shipping_total), 'currency': currency, }) lines.append(translate(order_summary_shipping_total, context=request)) # cart total order_summary_cart_total = _( 'order_summary_cart_total', default=u'Total: ${value} ${currency}', mapping={ 'value': ascur(cart_total), 'currency': currency, }) lines.append(translate(order_summary_cart_total, context=request)) summary_title = translate( _('order_summary_label', default=u'Summary:'), context=request) summary_text = '\n' + '\n'.join([safe_encode(line) for line in lines]) return '\n' + safe_encode(summary_title) + summary_text + '\n'