def _showSubTree(self, category): """Decides, whether a subtree of a category will be displayed or not. """ if self.data.expand_all == True: return True context_url = self.context.absolute_url() category_url = category.getURL() if context_url.startswith(category_url) == True: return True elif IProduct.providedBy(self.context) == True: cm = ICategoryManagement(self.context) try: product_category = cm.getTopLevelCategories()[0] except IndexError: return False while ICategory.providedBy(product_category) == True: if product_category.UID() == category.UID: return True product_category = product_category.aq_inner.aq_parent return False
def getTopLevelCategories(self): """ """ mall = IMallManagement(self.context).getMall() cm = ICategoryManagement(mall) return cm.getTopLevelCategories()
def _getSubCategories(self, category): """ """ result = [] cm = ICategoryManagement(category) categories = cm.getTopLevelCategories() for category in categories: show_subtree = self._showSubTree(category) if show_subtree == True: sub_categories = self._getSubCategories(category) else: sub_categories = [] klass = "visualIconPadding" if len(category.getBRefs("parent_category")) > 0: klass += " hasCategories" if show_subtree == True: klass += " navTreeCurrentItem" result.append({ "klass": klass, "url": category.absolute_url(), "description": category.Description(), "title": category.Title(), "amount_of_products": 1, "subcategories": sub_categories, "show_subtree": show_subtree, }) return result
def getTopLevelCategories(self): """ """ shop = IShopManagement(self.context).getShop() cm = ICategoryManagement(shop) return cm.getTopLevelCategories()
def getSelectedProducts(self): """ """ selected_uids = self.request.get("selected_uids") catalog = getToolByName(self.context, "portal_catalog") brains = catalog.searchResults(UID=selected_uids) result = [] for brain in brains: product = brain.getObject() cm = ICategoryManagement(product) categories = cm.getTopLevelCategories() categories = ", ".join([c.Title() for c in categories]) result.append({ "uid": product.UID(), "id": product.getId(), "title": product.Title(), "price": product.getPrice(), "categories": categories, }) return result
def _getSubCategories(self, category): """ """ result = [] cm = ICategoryManagement(category) categories = cm.getTopLevelCategories() for category in categories: show_subtree = self._showSubTree(category) if show_subtree == True: sub_categories = self._getSubCategories(category) else: sub_categories = [] klass = "visualIconPadding" if len(category.getBRefs("parent_category")) > 0: klass += " hasCategories" if show_subtree == True: klass += " navTreeCurrentItem" result.append({ "klass" : klass, "url" : category.absolute_url(), "description" : category.Description(), "title" : category.Title(), "amount_of_products" : 1, "subcategories" : sub_categories, "show_subtree" : show_subtree, }) return result
def getSelectedProducts(self): """ """ selected_uids = self.request.get("selected_uids") catalog = getToolByName(self.context, "portal_catalog") brains = catalog.searchResults( UID = selected_uids ) result = [] for brain in brains: product = brain.getObject() cm = ICategoryManagement(product) categories = cm.getTopLevelCategories() categories = ", ".join([c.Title() for c in categories]) result.append({ "uid" : product.UID(), "id" : product.getId(), "title" : product.Title(), "price" : product.getPrice(), "categories" : categories, }) return result
def testGetCategories(self): """ """ cm = ICategoryManagement(self.shop) ids = [c.id for c in cm.getCategories()] self.failUnless("category_1" in ids) self.failUnless("category_2" in ids) self.failUnless("category_11" in ids) self.failUnless("category_111" in ids)
def testGetTopLevelCategories(self): """ """ self.shop.category_1.category_11.reindexObject() self.shop.category_1.category_12.reindexObject() self.shop.category_1.category_11.category_111.reindexObject() cm = ICategoryManagement(self.shop) ids = [c.id for c in cm.getTopLevelCategories()] self.assertEqual(ids, ["category_1", "category_2", "category_3"])
def getCategories(self): """ """ f = self.getFormats() products_per_line = f.get("products_per_line") cm = ICategoryManagement(self.context) line = [] lines = [] for i, category in enumerate(cm.getTopLevelCategories()): # Image if len(category.getImage()) != 0: image_url = "%s/image_%s" % \ (category.absolute_url(), f.get("image_size")) else: image_url = None # Text temp = f.get("text") if temp == "description": text = category.getDescription() elif temp == "short_text": text = category.getShortText() elif temp == "text": text = category.getText() else: text = "" # CSS Class if (i + 1) % products_per_line == 0: klass = "last" else: klass = "notlast" line.append({ "title" : category.Title(), "text" : text, "url" : category.absolute_url(), "image_url" : image_url, "klass" : klass, }) if (i+1) % products_per_line == 0: lines.append(line) line = [] if len(line) > 0: lines.append(line) return lines
def testGetTopLevelCategories(self): """ """ cm = ICategoryManagement(self.portal.myshop.categories.category_1) category_ids = [c.id for c in cm.getTopLevelCategories()] self.failUnless(len(category_ids) == 2) for id in ["category_11", "category_12"]: self.failUnless(id in category_ids) cm = ICategoryManagement(self.category_2) self.failUnless(len(cm.getCategories()) == 0)
def isValid(self, product): """Returns True if the given product has at least one of the selected categories of the criterion. """ cm = ICategoryManagement(product) product_categories = ["/".join(c.getPhysicalPath()) for c in cm.getTopLevelCategories()] criteria_categories = self.context.getCategories() for criteria_category in criteria_categories: if criteria_category in product_categories: return True return False
def getCategories(self): """ """ f = self.getFormats() products_per_line = f.get("products_per_line") cm = ICategoryManagement(self.context) line = [] lines = [] for i, category in enumerate(cm.getTopLevelCategories()): # Image if len(category.getImage()) != 0: image_url = "%s/image_%s" % \ (category.absolute_url(), f.get("image_size")) else: image_url = None # Text temp = f.get("text") if temp == "description": text = category.getDescription() elif temp == "short_text": text = category.getShortText() elif temp == "text": text = category.getText() else: text = "" # CSS Class if (i + 1) % products_per_line == 0: klass = "last" else: klass = "notlast" line.append({ "title": category.Title(), "text": text, "url": category.absolute_url(), "image_url": image_url, "klass": klass, }) if (i + 1) % products_per_line == 0: lines.append(line) line = [] if len(line) > 0: lines.append(line) return lines
def isValid(self, product): """Returns True if the given product has at least one of the selected categories of the criterion. """ cm = ICategoryManagement(product) product_categories = [ "/".join(c.getPhysicalPath()) for c in cm.getTopLevelCategories() ] criteria_categories = self.context.getCategories() for criteria_category in criteria_categories: if criteria_category in product_categories: return True return False
def getProductURLs(self): """ """ sorting = self.request.SESSION.get("sorting") try: sorted_on, sort_order = sorting.split("-") except (AttributeError, ValueError): sorted_on = "price" sort_order = "desc" # all categories of the product cm = ICategoryManagement(self.context) categories = cm.getTopLevelCategories() result = [] for category in categories: pm = IProductManagement(category) products = pm.getAllProducts( sorted_on=sorted_on, sort_order = sort_order) # determine position of product within category index = products.index(self.context) # generate previous/next url temp = {} if index==0: temp["previous"] = None temp["first"] = None else: product = products[index-1] temp["previous"] = product.absolute_url() temp["first"] = products[0].absolute_url() try: product = products[index+1] temp["next"] = product.absolute_url() temp["last"] = products[-1].absolute_url() except IndexError: temp["next"] = None temp["last"] = None temp["category_url"] = category.absolute_url() temp["category"] = category.Title() temp["position"] = index + 1 temp["amount"] = len(products) result.append(temp) return result
def getProductURLs(self): """ """ sorting = self.request.SESSION.get("sorting") try: sorted_on, sort_order = sorting.split("-") except (AttributeError, ValueError): sorted_on = "price" sort_order = "desc" # all categories of the product cm = ICategoryManagement(self.context) categories = cm.getTopLevelCategories() result = [] for category in categories: pm = IProductManagement(category) products = pm.getAllProducts(sorted_on=sorted_on, sort_order=sort_order) # determine position of product within category index = products.index(self.context) # generate previous/next url temp = {} if index == 0: temp["previous"] = None temp["first"] = None else: product = products[index - 1] temp["previous"] = product.absolute_url() temp["first"] = products[0].absolute_url() try: product = products[index + 1] temp["next"] = product.absolute_url() temp["last"] = products[-1].absolute_url() except IndexError: temp["next"] = None temp["last"] = None temp["category_url"] = category.absolute_url() temp["category"] = category.Title() temp["position"] = index + 1 temp["amount"] = len(products) result.append(temp) return result
def getCategories(self): """ """ shop = IShopManagement(self.context).getShop() categories = ICategoryManagement(shop).getTopLevelCategories( full_objects=False) result = [] for category in categories: klass = "" if self._isCurrentItem(category) == True: klass += "navTreeCurrentItem" result.append({ "klass": klass, "url": category.getURL(), "description": category.Description, "title": category.Title, "amount_of_products": category.total_amount_of_products, "subcategories": self._getSubCategories(category), "products": self._getProducts(category), }) return result
def getAllProducts(self, sorted_on=None, sort_order=None): """ """ pm = IProductManagement(self.context) products = pm.getProducts() cm = ICategoryManagement(self.context) for category in cm.getCategories(): pm = IProductManagement(category) products.extend(pm.getProducts()) if sorted_on == "name": products = self._sortProductsByName(products, sort_order) elif sorted_on == "price": products = self._sortProductsByPrice(products, sort_order) return products
def _showSubTree(self, category): """Decides, whether a subtree of a category will be displayed or not. """ if self.data.expand_all == True: return True # Check if the passed category is ancestor of context if ICategory.providedBy(self.context) == True: obj = self.context while obj is not None: if category == obj: return True try: obj = obj.getRefs("parent_category")[0] except IndexError: obj = None if IProduct.providedBy(self.context) == True: cm = ICategoryManagement(self.context) try: product_category = cm.getTopLevelCategories()[0] except IndexError: return False while ICategory.providedBy(product_category) == True: if product_category.UID() == category.UID(): return True product_category = product_category.aq_inner.aq_parent return False if IProductSelector.providedBy(self.context) == True: obj = self.context.aq_inner.aq_parent while obj is not None: if category == obj: return True try: obj = obj.getRefs("parent_category")[0] except IndexError: obj = None return False
def testGetCategories(self): """ """ cm = ICategoryManagement(self.portal.myshop.categories.category_1) category_ids = [c.id for c in cm.getCategories()] for id in ["category_11", "category_12", "category_111"]: self.failUnless(id in category_ids) cm = ICategoryManagement( self.portal.myshop.categories.category_1.category_11) category_ids = [c.id for c in cm.getCategories()] self.assertEqual(["category_111"], category_ids) cm = ICategoryManagement(self.portal.myshop.categories.category_2) self.failUnless(len(cm.getCategories()) == 0)
def getCategories(self): """ """ cm = ICategoryManagement(self.context) result = [] catalog = getToolByName(self.context, "portal_catalog") brains = catalog.searchResults( path="/".join(self.context.getPhysicalPath()), object_provides="easyshop.core.interfaces.catalog.ICategory", sort_on="sortable_title") return brains
def _reindexPositions(self, category): """ """ if category.getParentCategory() is not None: parent = category.getParentCategory() else: parent = category.aq_inner.aq_parent category.reindexObject() i = 0 for category in ICategoryManagement(parent).getTopLevelCategories(): i+=2 category.setPositionInParent(i) category.reindexObject()
def testGetTopLevelCategories_1(self): """ """ cm = ICategoryManagement(self.product_1) ids = [c.getId() for c in cm.getTopLevelCategories()] self.assertEqual(ids, ["category_11"]) # adding some more self.shop.categories.invokeFactory("Category", id="category_a") self.shop.categories.invokeFactory("Category", id="category_b") self.shop.categories.category_a.addReference( self.product_1, "categories_products") self.shop.categories.category_b.addReference( self.product_1, "categories_products") ids = [c.getId() for c in cm.getTopLevelCategories()] self.failUnless(len(ids) == 3) for id in ["category_11", "category_a", "category_b"]: self.failUnless(id in ids)
def _changeCategories(self, kind): """ """ target_categories = self.request.form.get("target_category", []) if not isinstance(target_categories, (list, tuple)): target_categories = (target_categories, ) new_target_category = self.request.form.get("new_target_category", "") if (len(target_categories) == 0) and (new_target_category == ""): return self._showView() all_target_categories = [] if len(target_categories) > 0: all_target_categories.extend(target_categories) if new_target_category != "": putils = getToolByName(self.context, "plone_utils") normalized_id = putils.normalizeString(new_target_category) self.context.manage_addProduct["easyshop.core"].addCategory( id=normalized_id, title=new_target_category) new_category = self.context.get(normalized_id) all_target_categories.append(new_category) catalog = getToolByName(self.context, "portal_catalog") category_brains = catalog.searchResults(UID=target_categories) if len(category_brains) == 0: return self._showView() target_categories = [c.getObject() for c in category_brains] uids = self.request.get("selected_uids", []) # Products are responsible for managing categories for brain in catalog.searchResults(UID=uids): product = brain.getObject() if kind == "add": existing_categories = ICategoryManagement( product).getCategories() all_target_categories.extend(existing_categories) # NOTE: the product is reindexed within "setCategories" product.setCategories(all_target_categories) return self._showView()
def categories(object, portal, **kwargs): """Indexes all categories and parent categories of a product. """ try: result = {} if IProduct.providedBy(object): for category in ICategoryManagement( object).getTopLevelCategories(): result[category.UID()] = 1 # Collect parent categories object = category while object is not None: result[object.UID()] = 1 object = object.getParentCategory() return result.keys() except (ComponentLookupError, TypeError, ValueError): raise AttributeError
def _getCategories(self, obj): """ """ selected_categories = self.request.get("selected_category", []) if not isinstance(selected_categories, (list, tuple)): selected_categories = (selected_categories, ) categories = [] tl_categories = ICategoryManagement(obj).getTopLevelCategories() for tl_category in tl_categories: if tl_category.UID == self.context.UID(): klass = "current-category" else: klass = "" selected = tl_category.UID() in selected_categories if selected or self._isChildOfSelected(tl_category): display_checkbox = False else: display_checkbox = True if tl_category.UID() in self.request.SESSION.get("extended", []): children_class = "extended" else: children_class = "collapsed" categories.append({ "title": tl_category.Title(), "uid": tl_category.UID(), "url": tl_category.absolute_url, "selected": selected, "display_checkbox": display_checkbox, "children": self._getCategories(tl_category), "class": klass, "children_class": children_class, }) return categories
def testGetCategories(self): """ """ cm = ICategoryManagement(self.portal.myshop.categories.category_1) category_ids = [c.id for c in cm.getCategories()] for id in ["category_11", "category_12", "category_111"]: self.failUnless(id in category_ids) cm = ICategoryManagement(self.portal.myshop.categories.category_1.category_11) category_ids = [c.id for c in cm.getCategories()] self.assertEqual(["category_111"], category_ids) cm = ICategoryManagement(self.portal.myshop.categories.category_2) self.failUnless(len(cm.getCategories()) == 0)
def _getCategories(self, obj): """ """ categories = [] tl_categories = ICategoryManagement(obj).getTopLevelCategories() for tl_category in tl_categories: if tl_category.UID == self.context.UID(): klass = "current-category" else: klass = "" categories.append({ "title": tl_category.Title(), "uid": tl_category.UID(), "url": tl_category.absolute_url, "children": self._getCategories(tl_category), "class": klass, }) return categories
def getCategories(self): """ """ category = self.getStartingCategory() if category is None: return [] else: categories = ICategoryManagement(category).getTopLevelCategories() result = [] for category in categories: show_subtree = self._showSubTree(category) if show_subtree == True: sub_categories = self._getSubCategories(category) else: sub_categories = [] klass = "visualIconPadding" if category.amount_of_categories > 0: klass += " hasCategories" if self._isCurrentItem(category) == True: klass += " navTreeCurrentItem" result.append({ "klass": klass, "url": category.getURL, "description": category.Description, "title": category.Title, "amount_of_products": category.total_amount_of_products, "subcategories": sub_categories, "show_subtree": show_subtree, }) return result
def getCategories(self): """Returns brains. """ return ICategoryManagement(self.product).getCategories()
def testGetTopLevelCategories_2(self): """No categories there """ cm = ICategoryManagement(self.product_3) self.assertEqual(cm.getTopLevelCategories(), [])
def getTopLevelCategories(self): """Returns objects. """ return ICategoryManagement(self.product).getTopLevelCategories()
def getCategories(self): """ """ current_category_uid = self.request.get("uid") view = getMultiAdapter((self.context, self.request), name='search-view') brains = view.getSearchResults() products = [brain.getObject() for brain in brains] category_amounts = {} category_titles = {} category_levels = {} category_tops = {} for product in products: cm = ICategoryManagement(product) for category in cm.getTopLevelCategories(): # Traverse to top category object = category while ICategory.providedBy(object) == True: uid = object.UID() category_titles[uid] = object.Title() category_levels[uid] = len(object.getPhysicalPath()) if category_amounts.has_key(uid) == False: category_amounts[uid] = 0 category_amounts[uid] += 1 temp = object object = object.aq_inner.aq_parent if ICategory.providedBy(object) == False: category_tops[uid] = temp result = [] for uid, category in category_tops.items(): # Calculate children children = [] for child in category.objectValues("Category"): child_uid = child.UID() if child_uid in category_titles.keys(): # Title title = category_titles[child_uid] short_title = title if len(short_title)>13: short_title = short_title[:13] + "..." # Current if current_category_uid == child_uid: klass = "navTreeCurrentItem" else: klass = "" children.append({ "uid" : child_uid, "title" : title, "short_title" : short_title, "amount" : category_amounts[child_uid], "level" : category_levels[child_uid], "class" : klass, }) # Title title = category_titles[uid] short_title = title if len(short_title)>15: short_title = short_title[:15] + "..." # Current if current_category_uid == uid: klass = "navTreeCurrentItem" else: klass = "" result.append({ "uid" : uid, "title" : title, "short_title" : short_title, "amount" : category_amounts[uid], "level" : category_levels[uid], "children" : children, "class" : klass, }) return result