コード例 #1
0
ファイル: categories.py プロジェクト: viona/Easyshop
    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
コード例 #2
0
ファイル: categories.py プロジェクト: viona/Easyshop
    def getTopLevelCategories(self):
        """
        """
        mall = IMallManagement(self.context).getMall()

        cm = ICategoryManagement(mall)
        return cm.getTopLevelCategories()
コード例 #3
0
ファイル: categories.py プロジェクト: Easyshop/Easyshop
 def getTopLevelCategories(self):
     """
     """
     mall = IMallManagement(self.context).getMall()
     
     cm = ICategoryManagement(mall)
     return cm.getTopLevelCategories()
コード例 #4
0
ファイル: categories.py プロジェクト: viona/Easyshop
    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
コード例 #5
0
ファイル: categories.py プロジェクト: viona/Easyshop
    def getTopLevelCategories(self):
        """
        """
        shop = IShopManagement(self.context).getShop()

        cm = ICategoryManagement(shop)
        return cm.getTopLevelCategories()
コード例 #6
0
ファイル: actions.py プロジェクト: viona/Easyshop
    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
コード例 #7
0
ファイル: categories.py プロジェクト: Easyshop/Easyshop
    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
コード例 #8
0
ファイル: categories.py プロジェクト: Easyshop/Easyshop
    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 
コード例 #9
0
ファイル: actions.py プロジェクト: Easyshop/Easyshop
    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
コード例 #10
0
ファイル: categories.py プロジェクト: Easyshop/Easyshop
 def getTopLevelCategories(self):
     """
     """
     shop = IShopManagement(self.context).getShop()
     
     cm = ICategoryManagement(shop)
     return cm.getTopLevelCategories()
コード例 #11
0
    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)
コード例 #12
0
    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"])
コード例 #13
0
ファイル: categories.py プロジェクト: Easyshop/Easyshop
    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
コード例 #14
0
    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)
コード例 #15
0
ファイル: category.py プロジェクト: Easyshop/Easyshop
    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
コード例 #16
0
ファイル: categories.py プロジェクト: viona/Easyshop
    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
コード例 #17
0
ファイル: category.py プロジェクト: viona/Easyshop
    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
コード例 #18
0
ファイル: easyshop_macros.py プロジェクト: Easyshop/Easyshop
    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
コード例 #19
0
    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
コード例 #20
0
ファイル: sitemap.py プロジェクト: viona/Easyshop
    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
コード例 #21
0
    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
コード例 #22
0
ファイル: product_management.py プロジェクト: viona/Easyshop
    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
コード例 #23
0
ファイル: categories.py プロジェクト: Easyshop/Easyshop
    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
コード例 #24
0
    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)
コード例 #25
0
ファイル: categories.py プロジェクト: viona/Easyshop
    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
コード例 #26
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
コード例 #27
0
    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()
コード例 #28
0
    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)
コード例 #29
0
    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()
コード例 #30
0
    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)
コード例 #31
0
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
コード例 #32
0
    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
コード例 #33
0
    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)
コード例 #34
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
コード例 #35
0
ファイル: categories.py プロジェクト: viona/Easyshop
    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
コード例 #36
0
ファイル: category_management.py プロジェクト: viona/Easyshop
 def getCategories(self):
     """Returns brains.
     """
     return ICategoryManagement(self.product).getCategories()
コード例 #37
0
 def testGetTopLevelCategories_2(self):
     """No categories there
     """
     cm = ICategoryManagement(self.product_3)
     self.assertEqual(cm.getTopLevelCategories(), [])
コード例 #38
0
ファイル: category_management.py プロジェクト: viona/Easyshop
 def getTopLevelCategories(self):
     """Returns objects.
     """
     return ICategoryManagement(self.product).getTopLevelCategories()
コード例 #39
0
ファイル: search_results.py プロジェクト: viona/Easyshop
    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