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
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)
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
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
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
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
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])
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))
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
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 ''
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
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
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
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
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
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
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
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
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
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='&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
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
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
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
def notFoundResourceFactory(ctx): storeSession = tubcommon.getStoreSession(ctx) if storeSession: storeSession.forceRollback = True return NotFoundPage()
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
def store(): if not self.original.storeData: return defer.succeed(None) storeSession = tubcommon.getStoreSession(ctx) return self.original.storeSubmittedData(storeSession, data)
def fragment_productBrowser(self, ctx, data): storeSession = getStoreSession(ctx) return ProductBrowserFragment(self.avatar, storeSession, self.baseURL, self.basketURL, self.filter)
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
def itemFromId(id): storeSession = getStoreSession(ctx) return self.avatar.getProduct(storeSession, id)
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