예제 #1
0
    def render_blogentry(self, ctx, item):
        
        def gotComments(comments):
            
            comments = list(comments)
            try:
                lastComment = comments[-1].posted
                ago = relativedelta(datetime.now(),lastComment)
            except IndexError:
                lastComment = None
                ago = None
                
            tag = ctx.tag
            itemDate = item.getAttributeValue("date", "en")
            try:
                itemDate = itemDate['en']
            except:
                pass

            d = itemDate.day
            if 4 <= d <= 20 or 24 <= d <= 30:
                suffix = "th"
            else:
                suffix = ["st", "nd", "rd"][d % 10 - 1]
                

                
            m = itemDate.strftime('%B')
            y = itemDate.strftime('%Y')
            day = itemDate.strftime('%A')
            itemDate = '%s%s %s %s'%(d,suffix,m,y)   

            tag.fillSlots("url", url.here.child(item.name))
            tag.fillSlots("date", itemDate)
            if lastComment is not None:
                tag.fillSlots("lastComment", lastComment.strftime('%d %b %y %H:%M'))
                tag.fillSlots("ago", formatAgo(ago))
            else:
                tag.fillSlots("lastComment", '-')
                tag.fillSlots("ago", '-')
                
            tag.fillSlots("day", day)
            tag.fillSlots("title", item.getAttributeValue("title", "en"))
            tag.fillSlots("body", item.getAttributeValue("body", "en"))
            tag.fillSlots("sidebar", item.getAttributeValue("sidebar", "en"))
            comments = list(comments)
            commentcount = len(comments)
            if commentcount == 0:
                tag.fillSlots("comments", 'No Comments')
            elif commentcount == 1:
                tag.fillSlots("comments", '1 Comment')
            else:
                tag.fillSlots("comments", '%s Comments'%commentcount)
                
            return tag
            
        storeSession = tubcommon.getStoreSession(ctx) 
        d = self.avatar.realm.commentsService.getCommentsForItem(storeSession, item)        
        d.addCallback(gotComments)
        return d
예제 #2
0
    def _getRelatedContentItem(self, ctx):
        if self.filter is None:
            return defer.succeed(None)

        storeSession = getStoreSession(ctx)
        category = '.'.join( [self.filter[0][0]] +[c[1] for c in self.filter] )
        return self.avatar.realm.cmsService.getItem(storeSession, self.avatar, category=category)
예제 #3
0
def getCommentItems(ctx,self=None):

    @defer.inlineCallbacks
    def gotComments(comments):
        comments = list(comments)
        commentMap = {}
        for comment in comments:
            commentMap[ comment.id ] = comment
        for comment in comments:
            if comment.relatesToCommentId is not None:
                comment.relatesToComment = commentMap[comment.relatesToCommentId]
            else:
                comment.relatesToComment = None
            followUpComments = []
            for c in comments:
                if comment.id == c.relatesToCommentId:
                    followUpComments.append( c )
            comment.followUpComments = followUpComments
            relatedTo = yield storeSession.getItemById(comment.relatesToId)
            relatedToSummary = icomments.IRelatedToSummarizer(relatedTo).getTitle()
            comment.relatedToSummary = relatedToSummary
            comment.relatedToName = relatedTo.name

        defer.returnValue( [c for c in comments if c.approved is True] )
    
    
    avatar = icrux.IAvatar(ctx)
    storeSession = tubcommon.getStoreSession(ctx)        
    d = avatar.realm.commentsService.getComments(storeSession,  order='DESCENDING')
    d.addCallback(gotComments)        
    return d
예제 #4
0
 def data_products(self,ctx,data):
     def gotProducts(products):
         args = []
         large=ctx.arg('large',None)
         quality = ctx.arg('quality',None)
         if large is not None:
             args.append('large=%s'%large)
         if quality is not None:
             args.append('quality=%s'%quality)
         if len(args) > 0:
             args = '?%s'%('&'.join(args))
         else:
             args = ''
             
         
         p = {}
         l = len(products)
         for n,product in enumerate(products):
             if product.code == self.code:
                 if n == 0:
                     p['prev'] = '/gallery/%s/%s%s'%(self.categories[self.categories.index(self.category) - 1],'_last',args)
                 else:
                     p['prev'] = '/gallery/%s/%s%s'%(self.category,products[n-1].code,args)
                 if n+1 == l:
                     p['next'] = '/gallery/%s/%s%s'%(self.categories[divmod(self.categories.index(self.category) + 1,len(self.categories))[1]],'_first',args)
                 else:
                     p['next'] = '/gallery/%s/%s%s'%(self.category,products[n+1].code,args)
         return p
     avatar = icrux.IAvatar(ctx)
     storeSession = tubcommon.getStoreSession(ctx)
     d = avatar.getProducts(storeSession, categorisationFilters=[('gallery',self.category)])
     d.addCallback(gotProducts)
     return d
예제 #5
0
def getSimpleItem(ctx, segments):

    avatar = icrux.IAvatar(ctx)
    storeSession = common.getStoreSession(ctx)

    url = '/' + '/'.join(segments)
    d = avatar.realm.cmsService.getItem(storeSession, avatar, name=url)
    return d
예제 #6
0
 def render_category(self,ctx,data):
     def gotGalleryItem(galleryItem):
         return galleryItem[0].getProtectedObject().title
             
     avatar = icrux.IAvatar(ctx)
     storeSession = tubcommon.getStoreSession(ctx)        
     d = avatar.realm.cmsService.getItems(storeSession, avatar, name=self.category, type=gallery.GalleryItem)
     d.addCallback(gotGalleryItem)
     return d
예제 #7
0
 def data_products(self,ctx,data):
     avatar = icrux.IAvatar(ctx)
     storeSession = tubcommon.getStoreSession(ctx)
     items = yield avatar.realm.cmsService.getItems(storeSession, avatar, type=gallery.GalleryItem)
     products = yield avatar.getProducts(storeSession, categorisationFilters=[('flags','homepage')])
     shuffle(products)
     for cnt,p in enumerate(products):
         setattr(p,'cnt',cnt)
         setattr(p,'modcnt',cnt%3)
         setattr(p,'divcnt',cnt//3)
     defer.returnValue(products[:3])
예제 #8
0
 def childFactory(self, ctx, name):
     
     try:
         blogname = name
     except ValueError:
         return None
         
     avatar = icrux.IAvatar(ctx)
     storeSession = tubcommon.getStoreSession(ctx)
     return storeSession.getOneItem(where='name=%(name)s',params={'name':blogname},itemType=blogentry.BlogEntry).addCallback(
             lambda blogentry: BlogEntryResource(storeSession, avatar, blogentry))
예제 #9
0
    def data_products(self, ctx, data):

        keywords = inevow.IRequest(ctx).args.get('q', [''])[0]
        keywords = keywords.strip()

        if not keywords:
            return defer.succeed([])

        storeSession = tub_common.getStoreSession(ctx)
        d = self.avatar.getProducts(storeSession, keyWords=keywords)
        return d
예제 #10
0
 def render_admin(self,ctx,data):
     def gotGalleryItem(item):
         return T.div(id='admin')[ T.a(href=url.URL.fromString('http://admin.dw.timparkin.co.uk:8131/content/Gallery/%s'%item[0].getProtectedObject().id))[ 'Click here to edit gallery description' ] ]
         
     if common.isAdminOn(ctx):
         avatar = icrux.IAvatar(ctx)
         storeSession = tubcommon.getStoreSession(ctx)        
         d = avatar.realm.cmsService.getItems(storeSession, avatar, name=self.category, type=gallery.GalleryItem)
         d.addCallback(gotGalleryItem)
         return d            
     else:
         return ''    
예제 #11
0
    def getManager(self, ctx):
        try:
            return ctx.locate(ISiteMapMarker)
        except KeyError:
            avatar = icrux.IAvatar(ctx)
            storeSession = common.getStoreSession(ctx)

            mgr = manager.SiteMapManager(avatar, storeSession, self.sources )
            rCtx = self._findRequestCtx(ctx)
            if rCtx:
                rCtx.remember( mgr, ISiteMapMarker)
            return mgr
예제 #12
0
 def data_products(self,ctx,data):
     def gotProducts(products):
         p = {}
         l = len(products)
         for n,category in enumerate(self.categories):
             if category == self.category:
                 p['prev'] = '/gallery/%s'%(self.categories[self.categories.index(self.category) - 1])
                 p['next'] = '/gallery/%s'%(self.categories[divmod(self.categories.index(self.category) + 1,len(self.categories))[1]])
         return p
     avatar = icrux.IAvatar(ctx)
     storeSession = tubcommon.getStoreSession(ctx)
     d = avatar.getProducts(storeSession, categorisationFilters=[('gallery',self.category)])
     d.addCallback(gotProducts)
     return d
예제 #13
0
    def _productPage(self, ctx, productId, segments):

        # Find the product
        storeSession = getStoreSession(ctx)
        d = self.avatar.getProduct(storeSession, productId)

        # Create the resource for the product
        def createResource(product):
            if product is None:
                return None
            return ProductPage(self.avatar, product, self.basketURL, baseURL=self.baseURL), segments

        d.addCallback(createResource)
        return d
예제 #14
0
    def _placeOrder(self, ctx, form, data):


        def buildSalesOrder(data, storeSession):
            def gotSalesOrder(salesOrder):
                data['sales_order'] = salesOrder
            d = self._buildSalesOrder(storeSession, data)
            d.addCallback(gotSalesOrder)
            return d

        def addSalesOrder(data, storeSession):
            return self.avatar.realm.salesOrders.add(storeSession, data['sales_order'])


        def sendConfirmOrderEmail(data, ctx):
            salesOrder = data['sales_order']

            def getEmailText():
                emailPage = ConfirmOrderEmail(salesOrder)
                emailPage.remember(icrux.ISkin(ctx), icrux.ISkin)
                return emailPage.renderSynchronously()

            fromAddress = self.avatar.realm.config['mailService']['fromEmail']
            toAddress = [salesOrder.customer_email,self.avatar.realm.config['mailService']['fromEmail']]
            htmlemail = getEmailText()
            msg = mailutil.createhtmlmail(fromAddress, toAddress, 'David Ward Order Confirmation', htmlemail)
            return self.avatar.realm.mailService.sendMessage(toAddress, fromAddress, msg)


        def success(data):
            salesOrder = data['sales_order']
            self.avatar.basket.emptyBasket()
            self.avatar.checkoutDetails = None
            return url.URL.fromString('/basket/thankyou').add('order_num', salesOrder.order_num).add('basket_value', salesOrder.total_price).add('item_count', len(salesOrder.items))
            #return url.URL.fromContext(ctx).up().sibling('thankyou').add('order_num', salesOrder.order_num).add('basket_value', salesOrder.total_price).add('item_count', len(salesOrder.items))


        def failed(failure, data):
            raise formal.FormError('Unexpected error, please contact us on 0845 120 1036.')
        
        data['basket'] = self.avatar.basket
        storeSession = getStoreSession(ctx)
        d = buildSalesOrder(data, storeSession)
        d.addBoth(debug, 'after buildSalesOrder')
        d.addCallback(lambda ignore: addSalesOrder(data, storeSession))
        d.addBoth(debug, 'after addSalesOrder')
        d.addCallback(lambda ignore: sendConfirmOrderEmail(data, ctx))
        d.addBoth(debug, 'after addConfirmEmail')
        d.addCallback(lambda ignore: success(data))
        return d
예제 #15
0
 def render_gallerydescription(self,ctx,data):
     def gotGalleryItem(galleryItem):
         item = galleryItem[0].getProtectedObject()
         html = [
             T.div(class_="description")[
                 item.body
                 ],
             ]
         return html
             
     avatar = icrux.IAvatar(ctx)
     storeSession = tubcommon.getStoreSession(ctx)        
     d = avatar.realm.cmsService.getItems(storeSession, avatar, name=self.category, type=gallery.GalleryItem)
     d.addCallback(gotGalleryItem)
     return d
예제 #16
0
    def render_related_products(self, ctx, data):

        def gotProducts(products, storeSession):
            if products == []:
                return ''
            return ProductBrowserFragment(self.avatar, storeSession, self.baseURL, self.basketURL, data=products, fragmenttemplate='ProductSummaryFragment.html', browsertemplate='RelatedProductBrowser.html')

        relatedProducts = self.product.relatedProducts
        if relatedProducts is None:
            return ''
        codes = [c.strip() for c in relatedProducts.splitlines()]

        storeSession = getStoreSession(ctx)
        d = self.avatar.getProducts(storeSession, codes=codes)
        d.addCallback(gotProducts, storeSession)
        return d
예제 #17
0
def getItems(ctx,self=None):
    def gotItems(items):
        items = list(items)
        for item in items:
            item.date = datetime.fromordinal( item.date.toordinal() )
        items.sort(lambda x,y: -cmp(x.date,y.date))
        if self is not None:
            self.items = items
        return items
        
    if self is not None and hasattr(self,'items'):
        return defer.succeed(self.items)
    avatar = icrux.IAvatar(ctx)
    storeSession = tubcommon.getStoreSession(ctx)        
    d = storeSession.getItems(itemType=blogentry.BlogEntry)
    d.addCallback(gotItems)
    return d    
예제 #18
0
 def childFactory(self, ctx, category):
     avatar = icrux.IAvatar(ctx)
     storeSession = tubcommon.getStoreSession(ctx)
     def gotResult(result):
         categories = [r.textid for r in result.children]
         if category in categories:
             return Gallery(category,categories)
         
     if category == 'photos.rss':
         def gotProducts(products):
             return static.Data(str(getRss(products).encode('utf8')), 'text/xml')
         d = avatar.getProducts(storeSession)
         d.addCallback(gotProducts)
         return d
     
     d = avatar.realm.cmsService.loadCategories(storeSession, avatar, 'gallery')
     d.addCallback(gotResult)
     return d
예제 #19
0
    def render_galleries(self,ctx,data): 
        avatar = icrux.IAvatar(ctx)
        storeSession = tubcommon.getStoreSession(ctx)

        def gotCategories(categories):
            return avatar.realm.cmsService.getItems(storeSession, avatar, type=gallery.GalleryItem)

        def gotItems(items,categories):
            categoryCMSItems = {}
            for item in items:
                i = item.getProtectedObject()
                categoryCMSItems[i.name] = i

            for n, category in enumerate(categories.children):
                name = category.textid
                categoryCMSItem = categoryCMSItems.get(name,None)
                column = divmod(n,3)[1]+1
                try: 
                    title = categoryCMSItem.title
                    shortDescription = categoryCMSItem.shortDescription
                except AttributeError:
                    title = category.label
                    shortDescription = ''
                
                html = [
                    T.h4[
                        T.a(href=url.here.up().child(name))[
                            title
                            ]
                        ],
                    T.p[
                        T.a(href=url.here.up().child(name))[
                            shortDescription
                        ]
                    ]
                ]
                yield html

        d = avatar.realm.cmsService.loadCategories(storeSession, avatar,'gallery')
        d.addCallback(lambda categories: gotCategories(categories).addCallback(
            lambda items: gotItems(items,categories)
              )
            )
        return d
예제 #20
0
    def render_photo(self,ctx,data):
        
        def gotSize(size):
            quality = ctx.arg('quality')
            large = ctx.arg('large',None)
            if large is not None:            
                size = 'size=968x1200&'
                quality='100'
            else:
                size = 'size=600x632&'
            if quality is None:
                quality = '&quality=60'
                linkhref='?quality=93'
                enhance=T.p(class_='enhance')['click to enhance']
            else:
                quality = '&quality=100'
                linkhref='?large=True'
                enhance = T.p(class_='enhance')['click to see larger']

            if large is not None:
                enhance = T.p(class_='enhance')['click to return to small view']
                linkhref='?quality=93'
                
                
            if common.isInverted(ctx) is True:
                invert='&amp;invert=inverted'
            else:
                invert=''
            imgsrc='/system/ecommerce/%s/mainImage?%ssharpen=1.0x0.5%%2b0.8%%2b0.1%s%s'%(self.photo.id,size,quality,invert)
            html = T.a(class_='photo',href=linkhref)[ enhance,T.img(src=imgsrc) ]
            return html
        
        def gotAsset(path,imagingService):
            d = imaging.imagingService.getImageSize(path)
            d.addCallback(gotSize)
            return d
            
        avatar = icrux.IAvatar(ctx)
        storeSession = tubcommon.getStoreSession(ctx)
        imagingService = avatar.realm.systemServices.getService('ecommerce')
        d = imagingService.getPathForAsset(avatar, storeSession, self.photo, 'mainImage', '')
        d.addCallback(gotAsset,imagingService)
        return d
예제 #21
0
    def render_gallery(self,ctx,data):
        def gotProducts(products):
            htmlblock = []
            for n,product in enumerate(products):
                column = divmod(n,3)[1]+1
                name = product.code
                title = product.title
                shortDescription = product.summary
                imgsrc='/system/ecommerce/%s/mainImage?size=190x300&sharpen=1.0x0.5%%2b0.8%%2b0.1'%product.id
                
                html = T.div(class_='category c%s'%column)[
                    T.a(href=url.here.child(name))[
                        T.img(src=imgsrc,width=190),T.span(class_='mbf-item')['#gallery %s'%product.code]
                        ],
                    T.h4[
                        T.a(href=url.here.child(name))[
                            title
                            ]
                        ],
                    T.p[
                        T.a(href=url.here.child(name))[
                            shortDescription
                        ]
                    ]
                ]
                htmlblock.append(html)
                # Group the output into threes
                if column == 3:
                    out = htmlblock
                    htmlblock = []
                    yield T.div(class_="threecolumnleft clearfix")[ out ]
            # and then yield anything left over if the last item wasn't at the end of a row
            if column != 3:
                yield T.div(class_="threecolumnleft clearfix")[ htmlblock ]
 
                
        
        avatar = icrux.IAvatar(ctx)
        storeSession = tubcommon.getStoreSession(ctx)
        d = avatar.getProducts(storeSession, categorisationFilters=[('gallery',self.category)])
        d.addCallback(gotProducts)
        return d    
예제 #22
0
    def childFactory(self, ctx, name):
        # Handle the case when this is a news page and am asked
        # to resolve a news Item.
        try:
            id = int(name)
        except ValueError:
            return None

        def gotItem(item):
            if not item:
                return None
            try:
                return inevow.IResource(item)
            except:
                return None

        avatar = icrux.IAvatar(ctx)
        storeSession = tubcommon.getStoreSession(ctx)
        d = avatar.realm.cmsService.getItem(storeSession, avatar, id=id)
        d.addCallback(gotItem)
        return d
예제 #23
0
    def childFactory(self, ctx, photo):

        def gotProducts(products):
            if photo == '_first':
                return Photo(self.category,products[0],products[0].code,self.categories)
            if photo == '_last':
                return Photo(self.category,products[-1],products[-1].code,self.categories)
            if photo == 'photos.rss':
                return static.Data(str(getRss(products).encode('utf8')), 'text/xml')
        
                    
            
        def gotPhoto(product):
            return Photo(self.category,product,photo,self.categories)
            
        avatar = icrux.IAvatar(ctx)
        storeSession = tubcommon.getStoreSession(ctx)
        if photo == '_first' or photo == '_last' or photo == 'photos.rss':
            d = avatar.getProducts(storeSession, categorisationFilters=[('gallery',self.category)])
            d.addCallback(gotProducts)
        else:
            d = avatar.getProductByCode(storeSession, code=photo)
            d.addCallback(gotPhoto)
        return d
예제 #24
0
def notFoundResourceFactory(ctx):
    storeSession = tubcommon.getStoreSession(ctx)
    if storeSession:
        storeSession.forceRollback = True
    return NotFoundPage()
예제 #25
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
예제 #26
0
 def store():
     if not self.original.storeData:
         return defer.succeed(None)
     storeSession = tubcommon.getStoreSession(ctx)
     return self.original.storeSubmittedData(storeSession, data)
예제 #27
0
 def fragment_productBrowser(self, ctx, data):
     storeSession = getStoreSession(ctx)
     return ProductBrowserFragment(self.avatar, storeSession,
             self.baseURL, self.basketURL, self.filter)
예제 #28
0
    def render_galleries(self,ctx,data): 
        avatar = icrux.IAvatar(ctx)
        storeSession = tubcommon.getStoreSession(ctx)

        def gotCategories(categories):
            return avatar.realm.cmsService.getItems(storeSession, avatar, type=gallery.GalleryItem)

        def gotItems(items,categories):
            return avatar.getProducts(storeSession, categorisationFilters=[('flags','galleryindex')])
            
        def gotAll(items,categories,products):
            categoryCMSItems = {}
            for item in items:
                i = item.getProtectedObject()
                categoryCMSItems[i.name] = i

            categoryCMSItemMainImage = {}
            categoryCMSItemCode = {}
            for categoryCMSItem in categoryCMSItems.values():
                category = categoryCMSItem.name
                for product in products:
                    if u'gallery.%s'%category in product.categories: 
                        match = product
                        categoryCMSItemMainImage[categoryCMSItem.name] = match.id
                        categoryCMSItemCode[categoryCMSItem.name] = match.code
                        break

            htmlblock = []
            for n, category in enumerate(categories.children):
                name = category.textid
                categoryCMSItem = categoryCMSItems.get(name,None)
                column = divmod(n,3)[1]+1
                try: 
                    title = categoryCMSItem.title
                    shortDescription = categoryCMSItem.shortDescription
                except AttributeError:
                    title = category.label
                    shortDescription = ''
                
                try:
                    imgsrc='/system/ecommerce/%s/mainImage?size=190x300&sharpen=1.0x0.5%%2b0.7%%2b0.1'%categoryCMSItemMainImage[name]
                except KeyError:
                    imgsrc='/skin/images/spacer.gif'
                
                html = T.div(class_='category c%s'%column)[
                    T.a(href=url.here.child(name))[
                        T.img(src=imgsrc,width=190),T.span(class_='mbf-item')['#gallery %s'%categoryCMSItemCode[name]]
                        ],
                    T.h4[
                        T.a(href=url.here.child(name))[
                            title
                            ]
                        ],
                    T.p[
                        T.a(href=url.here.child(name))[
                            shortDescription
                        ]
                    ]
                ]
                htmlblock.append(html)
                # Group the output into threes
                if column == 3:
                    out = htmlblock
                    htmlblock = []
                    yield T.div(class_="threecolumnleft clearfix")[ out ]
            # and then yield anything left over if the last item wasn't at the end of a row
            if column != 3:
                yield T.div(class_="threecolumnleft clearfix")[ htmlblock ]

        d = avatar.realm.cmsService.loadCategories(storeSession, avatar,'gallery')
        d.addCallback(lambda categories: gotCategories(categories).addCallback(
            lambda items: gotItems(items,categories).addCallback(
                lambda products: gotAll(items,categories,products)
                )
              )
            )
        return d
예제 #29
0
 def itemFromId(id):
     storeSession = getStoreSession(ctx)
     return self.avatar.getProduct(storeSession, id)
예제 #30
0
 def form_details(self, ctx):
     storeSession = getStoreSession(ctx)
     d = self.getCountryOptions(storeSession)
     d.addCallback(lambda options: self._build_details_form(options['billing'], options['delivery']))
     return d