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 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 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)