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