def test_shipping_vat_money(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.shipping_vat_money())

        adapter.shipping_gross_money = mock.Mock(return_value=self.money('10.00'))
        adapter.shipping_method = mock.Mock(return_value={'vat_rate': 24.0})
        self.assertEqual(adapter.shipping_vat_money(), self.money('2.40'))
    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 articles

        :rtype: list
        """
        res = []

        context = aq_inner(self.context)
        if not getattr(context, 'related_articles', None):
            context = aq_parent(context)
            if not getattr(context, 'related_articles', None):
                context = aq_parent(context)

        if getattr(context, 'related_articles', None):
            shopping_site = IShoppingSite(self.context)
            path = shopping_site.shop_path()
            for uuid in context.related_articles:
                obj = shopping_site.get_object(IArticle, UID=uuid, path=path, review_state='published')
                if obj is not None:
                    art = IArticleAdapter(obj)
                    res.append({
                        'gross': art.gross(),
                        'image_url': art.image_url(size='preview'),
                        'title': art.title(),
                        'url': obj.absolute_url(),
                    })
        return res[:4]
    def test_total(self):
        adapter = IShoppingSite(self.portal)
        adapter.articles_total = mock.Mock(return_value=self.money('2.00'))
        self.assertEqual(adapter.total(), self.money('2.00'))

        adapter.shipping_gross_money = mock.Mock(return_value=self.money('10.00'))
        self.assertEqual(adapter.total(), self.money('12.00'))
    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 test_shipping_net_money(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.shipping_net_money())

        adapter.shipping_gross_money = mock.Mock(return_value=self.money('10.00'))
        adapter.shipping_vat_money = mock.Mock(return_value=self.money('2.40'))
        self.assertEqual(adapter.shipping_net_money(), self.money('7.60'))
    def test_articles_total(self):
        adapter = IShoppingSite(self.portal)
        adapter.cart_article_listing = mock.MagicMock()
        self.assertEqual(adapter.articles_total(), self.money('0.00'))

        adapter.cart_article_listing.return_value = [
            {'gross': self.money('10.00'), 'quantity': 2}, {'gross': self.money('5.00'), 'quantity': 4}]
        self.assertEqual(adapter.articles_total(), self.money('40.00'))
    def test_shipping_methods(self):
        adapter = IShoppingSite(self.portal)
        self.assertEqual(len(adapter.shipping_methods()), 0)

        alsoProvides(self.portal, IShoppingSiteRoot)
        container = self.create_content('collective.cart.shipping.ShippingMethodContainer')
        self.create_atcontent('ShippingMethod', container, id='shippingmethod1')
        self.assertEqual(len(adapter.shipping_methods()), 1)
 def test_reduce_stocks(self, IStock):
     adapter = IShoppingSite(self.portal)
     article1 = self.create_content('collective.cart.core.Article')
     uuid1 = IUUID(article1)
     article2 = self.create_content('collective.cart.core.Article')
     uuid2 = IUUID(article2)
     adapter.cart_article_listing = mock.Mock(return_value=[{'id': uuid1, 'quantity': 1}, {'id': uuid2, 'quantity': 2}])
     adapter.reduce_stocks()
     self.assertEqual(IStock().sub_stock.call_args_list, [((1,),), ((2,),)])
    def test_get_shipping_gross_money(self):
        alsoProvides(self.portal, IShoppingSiteRoot)
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.get_shipping_gross_money('UUID'))

        container = self.create_content('collective.cart.shipping.ShippingMethodContainer')
        shippingmethod1 = self.create_atcontent('ShippingMethod', container, id='shippingmethod1')
        uuid1 = IUUID(shippingmethod1)
        self.assertEqual(adapter.get_shipping_gross_money(uuid1), self.money('0.00'))
    def test_get_brain_for_text(self):
        alsoProvides(self.portal, IShoppingSiteRoot)
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.get_brain_for_text('name'))

        folder = self.create_atcontent('Folder', id='name')
        self.assertIsNone(adapter.get_brain_for_text('name'))

        doc = self.create_atcontent('Document', folder, id='doc')
        self.assertEqual(adapter.get_brain_for_text('name').getObject(), doc)
 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 test_clean_articles_in_cart(self, clean_articles_in_cart, IStock):
     article1 = self.create_content('collective.cart.core.Article')
     uuid1 = IUUID(article1)
     article2 = self.create_content('collective.cart.core.Article')
     uuid2 = IUUID(article2)
     clean_articles_in_cart.return_value = {uuid1: {}, uuid2: {}}
     IStock().stock = 0
     instance = IShoppingSite(self.portal)
     instance.update_cart = mock.Mock()
     self.assertEqual(instance.clean_articles_in_cart(), {})
     instance.update_cart.assert_called_with('articles', {})
Example #14
0
def add_shipping_info_to_address_book_for_the_first_time(event):
    member = IMember(event.context)
    if member.area and not member.default_shipping_info:
        data = IShoppingSite(event.context).get_address('shipping')
        oid = u'{}1'.format('shipping')
        info = createContentInContainer(
            member.area, 'collective.cart.shopping.CustomerInfo', id=oid, checkConstraints=False, **data)

        if not IShoppingSite(event.context).billing_same_as_shipping:
            info.info_type = u'shipping'

        modified(info)
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 test_update_address(self, update_address):
        from zope.interface import alsoProvides
        alsoProvides(self.portal, IShoppingSiteRoot)

        adapter = IShoppingSite(self.portal)
        data = {}

        self.assertIsNone(adapter.update_address('billing', data))

        update_address.return_value = None
        self.assertEqual(adapter.update_address('billing', data),
                         u'birth_date_warning')

        data = {'birth_date': 'BDATE'}
        self.assertEqual(adapter.update_address('billing', data),
                         u'birth_date_warning')

        data = {'birth_date': '1990-01-31'}
        self.assertEqual(adapter.update_address('billing', data),
                         u'birth_date_warning')

        data = {'birth_date': '31.01.1990'}
        self.assertIsNone(adapter.update_address('billing', data))

        data = {'birth_date': '31.01.1890'}
        self.assertEqual(adapter.update_address('billing', data),
                         u'birth_date_warning_too_old')
    def __call__(self, context):
        terms = []
        res = []
        adapter = IShoppingSite(context)
        path = adapter.shop_path()
        for item in adapter.get_content_listing(IArticle, path=path):
            obj = item.getObject()
            uuid = IUUID(obj)
            if not IPloneSiteRoot.providedBy(context) and uuid != IUUID(context):
                res.append((IArticleAdapter(obj).title(), uuid))
        res.sort()
        terms = [SimpleTerm(item[1], item[1], item[0]) for item in res]

        return SimpleVocabulary(terms)
Example #18
0
    def _orders(self):
        shopping_site = IShoppingSite(self.context)
        creator = self.context.restrictedTraverse('@@plone_portal_state').member().id
        query = {
            'Creator': creator,
            'path': shopping_site.shop_path(),
            'sort_on': 'modified',
            'sort_order': 'descending',
        }
        order_number = self.request.form.get('order_number')

        if order_number:
            query['id'] = order_number

        return shopping_site.get_content_listing(IOrder, **query)
    def message(self, name=None):
        if getattr(self, 'view', None):
            name = name or getattr(self.view, '__name__', None)
        else:
            name = name or getattr(self, '__name__', None)

        if name is not None:
            name = '{}-message'.format(name)
            brain = IShoppingSite(self.context).get_brain_for_text(name)
            if brain:
                return {
                    'title': brain.Title,
                    'description': brain.Description,
                    'text': brain.getObject().CookedBody(),
                }
 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 test_create_cart(self, create_order):
        adapter = IShoppingSite(self.portal)

        create_order.return_value = None
        self.assertIsNone(adapter.create_order())

        order1 = self.create_content('collective.cart.core.Order', id='1')
        create_order.return_value = order1
        self.assertEqual(adapter.create_order(), order1)
        with self.assertRaises(KeyError):
            order1['shipping_method']
        with self.assertRaises(KeyError):
            order1['billing']
        with self.assertRaises(KeyError):
            order1['shipping']

        adapter.shipping_method = mock.Mock(return_value={'gross': self.money('10.00')})
        order2 = self.create_content('collective.cart.core.Order', id='2')
        create_order.return_value = order2
        self.assertEqual(adapter.create_order(), order2)
        self.assertIsNotNone(order2['shipping_method'])
        with self.assertRaises(KeyError):
            order2['billing']
        with self.assertRaises(KeyError):
            order2['shipping']

        names = ['city', 'last_name', 'first_name', 'email', 'phone', 'post', 'street']
        address = {}
        for name in names:
            address[name] = name.upper()
        adapter.get_address = mock.Mock(return_value=address)
        adapter.billing_same_as_shipping = mock.Mock(return_value=True)
        order3 = self.create_content('collective.cart.core.Order', id='3')
        create_order.return_value = order3
        self.assertEqual(adapter.create_order(), order3)
        self.assertIsNotNone(order3['shipping_method'])
        self.assertIsNotNone(order3['billing'])
        with self.assertRaises(KeyError):
            order3['shipping']

        adapter.billing_same_as_shipping = mock.Mock(return_value=False)
        order4 = self.create_content('collective.cart.core.Order', id='4')
        create_order.return_value = order4
        self.assertEqual(adapter.create_order(), order4)
        self.assertIsNotNone(order4['shipping_method'])
        self.assertIsNotNone(order4['billing'])
        self.assertIsNotNone(order4['shipping'])
    def test_create_order(self, cart):
        from zope.interface import alsoProvides
        alsoProvides(self.portal, IShoppingSiteRoot)

        with self.assertRaises(AttributeError):
            IShoppingSite(
                self.portal).create_order(order_id='2').registration_number

        self.create_content('collective.cart.core.OrderContainer')
        cart.return_value = {
            'articles': {
                'UUID1': mock.MagicMock()
            },
            'registration_number': '3'
        }
        self.assertEqual(
            IShoppingSite(
                self.portal).create_order(order_id='3').registration_number,
            '3')
    def test_shipping_gross_money(self):
        adapter = IShoppingSite(self.portal)
        adapter.shipping_method = mock.Mock(return_value=None)
        self.assertIsNone(adapter.shipping_gross_money())

        adapter.get_shipping_gross_money = mock.Mock()
        adapter.shipping_method = mock.Mock(return_value={'uuid': 'UUID'})
        adapter.shipping_gross_money()
        adapter.get_shipping_gross_money.assert_called_with('UUID')
    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 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
Example #26
0
    def _objs(self):
        """Returns list of article objects

        :rtype: list
        """
        query = {
            'sort_on': 'feed_order',
            'sort_order': 'descending',
        }
        limit = getUtility(IRegistry)['slt.theme.articles_feed_on_top_page']
        if limit:
            query['sort_limit'] = limit
        return IShoppingSite(self.context).get_objects(IFeedToShopTop, **query)
    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 test_billing_same_as_shipping(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.billing_same_as_shipping())

        adapter.cart = mock.Mock(return_value={'billing_same_as_shipping': False})
        self.assertFalse(adapter.billing_same_as_shipping())

        adapter.cart = mock.Mock(return_value={'billing_same_as_shipping': True})
        self.assertTrue(adapter.billing_same_as_shipping())
    def test_is_addresses_filled(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.is_addresses_filled())

        adapter.is_address_filled = mock.Mock(return_value=True)
        self.assertTrue(adapter.is_addresses_filled())
        self.assertEqual(adapter.is_address_filled.call_args_list, [(('billing',),), (('shipping',),)])

        adapter.billing_same_as_shipping = mock.Mock(return_value=True)
        self.assertTrue(adapter.is_addresses_filled())
        self.assertEqual(adapter.is_address_filled.call_args_list, [(('billing',),), (('shipping',),), (('billing',),)])
    def test_is_address_filled(self):
        adapter = IShoppingSite(self.portal)
        self.assertFalse(adapter.is_address_filled('billing'))

        adapter.get_address = mock.Mock(return_value={})
        self.assertFalse(adapter.is_address_filled('billing'))

        names = ['city', 'last_name', 'first_name', 'email', 'phone', 'post', 'street']
        address = {}
        for name in names:
            address[name] = name.upper()

        adapter.get_address = mock.Mock(return_value=address)
        self.assertTrue(adapter.is_address_filled('billing'))

        del address['email']
        self.assertFalse(adapter.is_address_filled('billing'))
    def test_update_address(self, update_address):
        from zope.interface import alsoProvides
        alsoProvides(self.portal, IShoppingSiteRoot)

        adapter = IShoppingSite(self.portal)
        data = {}

        self.assertIsNone(adapter.update_address('billing', data))

        update_address.return_value = None
        self.assertEqual(adapter.update_address('billing', data), u'birth_date_warning')

        data = {'birth_date': 'BDATE'}
        self.assertEqual(adapter.update_address('billing', data), u'birth_date_warning')

        data = {'birth_date': '1990-01-31'}
        self.assertEqual(adapter.update_address('billing', data), u'birth_date_warning')

        data = {'birth_date': '31.01.1990'}
        self.assertIsNone(adapter.update_address('billing', data))

        data = {'birth_date': '31.01.1890'}
        self.assertEqual(adapter.update_address('billing', data), u'birth_date_warning_too_old')
 def test_verifyObject(self):
     from zope.interface.verify import verifyObject
     context = self.create_content('collective.cart.core.Order')
     self.assertTrue(verifyObject(IShoppingSite, IShoppingSite(context)))
 def test_verifyObject(self):
     from zope.interface.verify import verifyObject
     self.assertTrue(verifyObject(IShoppingSite,
                                  IShoppingSite(self.portal)))
 def test_link_to_order(self, getToolByName):
     context = self.create_content('collective.cart.core.Order', id='2')
     getToolByName().getHomeUrl.return_value = 'home_url'
     self.assertEqual(
         IShoppingSite(context).link_to_order(2), 'home_url?order_number=2')
 def test_locale_articles_total(self):
     adapter = IShoppingSite(self.portal)
     articles_total = mock.Mock()
     adapter.articles_total = articles_total
     adapter.articles_total = mock.Mock(return_value=self.money('40.00'))
     self.assertEqual(adapter.locale_articles_total(), u'40.00 €')
    def test_shipping_method(self):
        adapter = IShoppingSite(self.portal)
        self.assertIsNone(adapter.shipping_method())

        adapter.cart = mock.MagicMock(return_value={'shipping_method': 'SHIPPINIG_METHOD'})
        self.assertEqual(adapter.shipping_method(), 'SHIPPINIG_METHOD')
    def test__calculated_weight(self):
        adapter = IShoppingSite(self.portal)
        self.assertEqual(adapter._calculated_weight(), 0.0)

        adapter.shipping_method = mock.Mock()
        self.assertEqual(adapter._calculated_weight(), 0.0)
        self.assertEqual(adapter._calculated_weight('RATE'), 0.0)
        self.assertEqual(adapter._calculated_weight(10.0), 0.0)

        adapter.cart_article_listing = mock.MagicMock(return_value=[{'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'quantity': 1}])
        self.assertEqual(adapter._calculated_weight(10.0), 0.1)

        adapter.cart_article_listing = mock.MagicMock(return_value=[
            {'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'quantity': 1},
            {'weight': 10.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'quantity': 1}])
        self.assertEqual(adapter._calculated_weight(10.0), 0.16)

        adapter.cart_article_listing = mock.MagicMock(return_value=[
            {'weight': 100.0, 'depth': 10.0, 'height': 20.0, 'width': 30.0, 'quantity': 2, 'vat_rate': 24.0}])
        self.assertEqual(adapter._calculated_weight(10.0), 0.2)