class ArticleContentListingObject(RealContentListingObject): adapts(IArticle) def __init__(self, obj): super(ArticleContentListingObject, self).__init__(obj) self.adapter = IArticleAdapter(self._realobject) self.shopping_site = IShoppingSite(self._realobject) def __repr__(self): return "<collective.cart.shopping.adapter.content_listing_object.ArticleContentListingObject instance at {}>".format(self.getPath()) def discount_available(self): """Return True if discount is available else False :rtype boolean """ return self.adapter.discount_available() def klass(self): """Return discount if discount is available esle normal :rtype: str """ if self.discount_available(): return 'discount' else: return 'normal' def gross(self): """Reterun localized gross :rtype: unicode """ return self.shopping_site.format_money(self.adapter.gross()) def money(self): """Return localize money :rtype: unicode """ return self.shopping_site.format_money(self._realobject.money) # IContentListingObject def CroppedDescription(self): """A cropped description""" raise NotImplementedError def getSize(self): """size in bytes""" raise NotImplementedError
def articles(self): """Returns list of articles to show in cart.""" res = [] shopping_site = IShoppingSite(self.context) for article in shopping_site.cart_article_listing(): adapter = getMultiAdapter((self.context, article), ICartArticleMultiAdapter) article.update({ 'image_url': adapter.image_url(size='mini'), 'gross': shopping_site.format_money(article['gross']), 'locale_gross_subtotal': shopping_site.format_money(adapter.gross_subtotal()), 'quantity_max': adapter.quantity_max(), 'quantity_size': adapter.quantity_size(), }) res.append(article) return res
def shipping_methods(self): """Returns list of dictionary of shipping methods :rtype: list """ shopping_site = IShoppingSite(self.context) default_charset = getattr(getattr(getToolByName( self.context, 'portal_properties'), 'site_properties'), 'default_charset', 'utf-8') res = [] for brain in shopping_site.shipping_methods(): uuid = brain.UID orig_uuid = shopping_site.shipping_method()['uuid'] if uuid == orig_uuid: shipping_gross_money = shopping_site.shipping_gross_money() else: shipping_gross_money = shopping_site.get_shipping_gross_money(uuid) if shipping_gross_money.amount == 0.0: title = brain.Title else: title = '{} {}'.format(brain.Title, shopping_site.format_money(shipping_gross_money).encode(default_charset)) res.append({ 'description': brain.Description, 'checked': uuid == orig_uuid, 'title': title, 'uuid': uuid, }) return res
def subarticles(self): """Returns subarticles for form select option :rtype: list """ res = [] if self.context.use_subarticle: subarticles = [] shopping_site = IShoppingSite(self.context) for brain in self.articles(salable=True, use_subarticle=False): obj = brain.getObject() if not IArticleAdapter(obj).soldout(): subarticles.append(obj) wftool = getToolByName(self.context, 'portal_workflow') wf = wftool.getChainFor(self.context)[0] for obj in subarticles: state = wftool.getStatusOf(wf, obj)['review_state'] if state != 'private': state = '' res.append({ 'title': safe_unicode(obj.Title()), 'gross': shopping_site.format_money(IArticleAdapter(obj).gross()), 'uuid': IUUID(obj), 'state': PMF(state), }) return res
def articles(self): """Returns list of dictionary of order articles :rtype: list """ res = [] utility = getUtility(IUnicodeUtility) shopping_site = IShoppingSite(self.context) vat_adapter = IVATAdapter(self.context) for item in self.get_content_listing(IOrderArticle): obj = item.getObject() order_article_adapter = IOrderArticleAdapter(obj) gross_subtotal = order_article_adapter.gross_subtotal() items = { 'description': utility.safe_unicode(item.Description()), 'gross': item.gross, 'gross_subtotal': gross_subtotal, 'locale_gross_subtotal': shopping_site.format_money(gross_subtotal), 'image_url': None, 'obj': obj, 'quantity': item.quantity, 'sku': item.sku, 'title': utility.safe_unicode(item.Title()), 'url': None, 'vat_rate': vat_adapter.percent(item.vat_rate), 'id': item.getId(), } orig_article = shopping_site.get_object(IArticle, path=shopping_site.portal_path(), UID=item.getId()) if orig_article: items['url'] = orig_article.absolute_url() items['image_url'] = IArticleAdapter(orig_article).image_url(size='mini') res.append(items) return res
def shipping_method(self): shopping_site = IShoppingSite(self.context) items = shopping_site.shipping_method().copy() if items['gross'].amount == 0.0: items['is_free'] = True else: items['is_free'] = False items['vat_rate'] = IVATAdapter(self.context).percent(items['vat_rate']) items['gross'] = shopping_site.format_money(items['gross']) return items
def articles(self): """Returns list of dictionary of articles :rtype: list """ res = [] shopping_site = IShoppingSite(self.context) articles = super(ArticlesInArticleViewlet, self).articles() if articles: for item in IContentListing(articles): obj = item.getObject() adapter = IArticleAdapter(obj) soldout = adapter.soldout() quantity_max = adapter.quantity_max() numbers = xrange(1, quantity_max + 1) quantity_size = len(str(quantity_max)) subarticles = [] if obj.use_subarticle: subarticles = adapter.subarticles() res.append({ 'description': item.Description(), 'discount_end': adapter.discount_end(), 'gross': shopping_site.format_money(adapter.gross()), 'id': item.getId(), 'image_url': adapter.image_url(size='mini'), 'klass': 'add-to-cart {}'.format(item.getId()), 'money': shopping_site.format_money(item.money), 'numbers': numbers, 'quantity_max': quantity_max, 'quantity_size': quantity_size, 'soldout': soldout, 'subarticles': subarticles, 'title': adapter.title(), 'url': item.getURL(), 'uuid': item.uuid(), 'vat_rate': IVATAdapter(self.context).percent(item.vat_rate) }) return res
def subarticles(self): """Returns subarticles for form select option :rtype: list """ res = [] if self.context.use_subarticle: subarticles = [] shopping_site = IShoppingSite(self.context) for brain in self.articles(salable=True, use_subarticle=False): obj = brain.getObject() if not IArticleAdapter(obj).soldout(): subarticles.append(obj) for obj in subarticles: res.append({ 'title': safe_unicode(obj.Title()), 'gross': shopping_site.format_money(IArticleAdapter(obj).gross()), 'uuid': IUUID(obj), }) return res
def test_format_money(self): adapter = IShoppingSite(self.portal) money = self.money('12.40') self.assertEqual(adapter.format_money(money), u'12.40 €')
def notify_ordered(context, event): if event.action == 'ordered': shopping_site = IShoppingSite(context) adapter = IOrderAdapter(context) portal = shopping_site.portal() email_from_address = getUtility(IRegistry)['collective.cart.shopping.notification_cc_email'] or portal.getProperty('email_from_address') billing = shopping_site.get_address('billing') default_charset = getattr(getattr(getToolByName(context, 'portal_properties'), 'site_properties'), 'default_charset', 'utf-8') email_charset = getUtility(ISiteRoot).getProperty('email_charset', 'utf-8') subject = context.translate(_(u'order-number', u'Order Number: ${number}', mapping={'number': context.id})) utility = getUtility(IUnicodeUtility) mfrom = u'"{}" <{}>'.format(utility.safe_unicode(shopping_site.shop().title), email_from_address) host = getToolByName(context, 'MailHost') underline = '=' * 28 billing_address = utility.address(billing) if shopping_site.billing_same_as_shipping(): shipping_address = billing_address else: shipping = shopping_site.get_address('shipping') shipping_address = utility.address(shipping) articles = shopping_site.cart_article_listing() for article in articles: subtotal = article['gross'] * article['quantity'] article.update({'subtotal': shopping_site.format_money(subtotal)}) shipping_method_title = hasattr( adapter.shipping_method(), 'Title') and adapter.shipping_method().Title.decode(default_charset) or u'' items = shopping_site.cart().copy() for key in ['articles', 'billing_same_as_shipping', 'shipping_method', 'billing', 'shipping']: if key in items: del items[key] items.update({ 'number': context.id, 'underline': underline, 'billing_address': billing_address, 'shipping_address': shipping_address, 'articles': articles, 'shipping_method_title': shipping_method_title, 'is_shipping_free': shopping_site.shipping_gross_money().amount == 0.0, 'shipping_gross': shopping_site.locale_shipping_gross(), 'total': shopping_site.locale_total(), }) message_to_customer = context.unrestrictedTraverse('@@to-customer-order-mail-template')(**items) mto_customer = u'"{}" <{}>'.format(utility.fullname(billing), billing['email']) subject_to_customer = subject message_to_shop = context.unrestrictedTraverse('@@to-shop-order-mail-template')(**items) mto_shop = mfrom subject_to_shop = subject try: host.send(message_to_customer, mto_customer, mfrom, subject=subject_to_customer, charset=email_charset) host.send(message_to_shop, mto_shop, mfrom, subject=subject_to_shop, charset=email_charset) except: message = _(u'order-processed-but', default=u'The order was processed but we could not send e-mail to you successfully. Please consult the shop owner.') IStatusMessage(context.REQUEST).addStatusMessage(message, type='warn')