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 articles(self):
        """Returns list of dictionary of articles in shop

        :rtype: list
        """
        res = []
        for item in IShoppingSite(self.context).get_content_listing(IArticle, sort_on="sku"):
            obj = item.getObject()
            article = IArticleAdapter(obj)
            sbehavior = IStockBehavior(obj)
            stock = sbehavior.stock()
            stocks = sbehavior.stocks()
            if stocks:
                price = stocks[-1].price
                subtotal = price * stock
                price = getUtility(IPriceUtility, name="string")(price)
                subtotal = getUtility(IPriceUtility, name="string")(subtotal)
            else:
                price = subtotal = "N/A"
            res.append(
                {
                    "price": price,
                    "sku": item.sku,
                    "stock": stock,
                    "subtotal": subtotal,
                    "title": article.title(),
                    "url": item.getURL(),
                }
            )
        return res
    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 add_to_cart(self):
        """Add article to cart"""
        shopping_site = IShoppingSite(self.context)
        form = self.request.form
        add_to_cart = form.pop('form.buttons.AddToCart', None)
        subarticle = form.pop('subarticle', None)

        uuid = None
        quantity = '1'

        if subarticle is not None:

            uuids = subarticle
            parent_uuid = add_to_cart

            if not isinstance(uuids, list):
                uuids = [subarticle]

            for subarticle_uuid in uuids:
                parent = aq_parent(aq_inner(shopping_site.get_object(UID=subarticle_uuid)))
                if parent_uuid == IUUID(parent):
                    uuid = subarticle_uuid

                quantity = form.get(parent_uuid)

        uuid = uuid or add_to_cart

        if uuid is not None:

            quantity = form.get('quantity') or form.get(uuid) or quantity
            validate = validation.validatorFor('isInt')
            url = self.context.restrictedTraverse('@@plone_context_state').current_base_url()
            message = None

            if quantity is not None and validate(quantity) == 1:
                quantity = int(quantity)
                obj = shopping_site.get_object(UID=uuid)
                if obj:
                    item = IArticleAdapter(obj)
                    if quantity > item.quantity_max():
                        quantity = item.quantity_max()
                    if quantity > 0:
                        size = ISize(obj)
                        gross = item.gross()
                        kwargs = {
                            'depth': size.depth,
                            'gross': gross,
                            'height': size.height,
                            'net': item.get_net(gross),
                            'quantity': quantity,
                            'title': item.title(),
                            'sku': obj.sku,
                            'vat': item.get_vat(gross),
                            'vat_rate': item.context.vat_rate,
                            'weight': size.weight,
                            'width': size.width,
                        }
                        item.add_to_cart(**kwargs)
                        notify(ArticleAddedToCartEvent(item, self.request))
                    else:
                        message = _(u'Input positive integer value to add to cart.')
                else:
                    message = _(u"Not available to add to cart.")
            else:
                message = _(u"Input integer value to add to cart.")

            if message:
                IStatusMessage(self.request).addStatusMessage(message, type='warn')

            return self.request.response.redirect(url)