Example #1
0
    def renderHTTP(self, ctx):
        # For the case when I'm asked to render myself

        def gotItem(item):
            if item:
                return item
            else:
                return ProductsPage(self.avatar, None, self.basketURL)

        d = tub_pages.getSimpleItem(ctx, url.URL.fromContext(ctx).pathList())
        d.addCallback(gotItem)
        return d
Example #2
0
    def locateChild(self, ctx, segments):
        # Load the CMS item, if present this is used as a last resort.
        # Wander down the segments tracking the category hierarchy
        # If I end at a leaf node then that is a product listing page.
        # If I end at a non leaf node, and I have a cms item use it, otherwise use a product listing page
        # If on my travels I find what looks like a product then use that.
        # If all else fails return a 404.

        def gotCategories(categories, data):
            data['categories'] = categories


        def gotCMSItem(item, data):
            data['item'] = item


        def returnResource(segments, data):
            filter = []

            # Start looking for categories in the pathList
            category = data['categories']
            productId = None
            remainingSegments = segments[:]
            for segment in segments:
                try:
                    # Does it look like a product?
                    productId = int(segment)
                except ValueError:
                    # Is is a category?
                    category = category.findChildByTextId(segment)

                if productId is not None:
                    remainingSegments = remainingSegments[1:]
                    break

                if category is None:
                    # Gone as far as I can
                    break

                remainingSegments = remainingSegments[1:]
                filter.append(('category', segment))


            if productId:
                return self._productPage(ctx, productId, remainingSegments)

            if category is None:
                if data['item']:
                    # No matching category, but CMS item, use CMS item
                    return inevow.IResource(data['item']), ()
                else:
                    # No matching category, and no CMS item, fail
                    return appserver.NotFound

            if category.children in (None, []):
                # Leaf category, product listing page
                return ProductsPage(self.avatar, None, self.basketURL, filter=filter), remainingSegments 

            # Non leaf category, use the CMS item, fall back to a product listing page
            if data['item']:
                return inevow.IResource(data['item']), ()
            else:
                return ProductsPage(self.avatar, None, self.basketURL, filter=filter),  remainingSegments


        data = {}

        cmsItemName = [i for i in itertools.chain(url.URL.fromContext(ctx).pathList(), segments)]

        storeSession = getStoreSession(ctx)
        d = self.avatar.realm.cmsService.loadCategories(storeSession, self.avatar, 'category')
        d.addCallback(gotCategories, data)
        d.addCallback(lambda ignore: tub_pages.getSimpleItem(ctx, cmsItemName))
        d.addCallback(gotCMSItem, data)
        d.addCallback(lambda ignore: returnResource(segments, data))
        return d