def build_breadcrumb(self): # Build breadcrumb for selected category. breadcrumb = category_util.build_breadcrumb(self.selected_category)[1:-1] breadcrumb.reverse() for breadcrumb_category in breadcrumb: breadcrumb_category.url = reverse( 'browse', kwargs={ 'category_slug': breadcrumb_category.url } ) self.breadcrumb = breadcrumb
def get_serialized_category(self, category): # TODO(Varun): Cache this call. if category.id not in self.categories: breadcrumb = category_util.build_breadcrumb(category) self.categories[category.id] = { 'id': category.id, 'title': category.title, 'slug': category.slug, 'url': reverse( 'browse', kwargs={ 'category_slug': breadcrumb[0].url } ) } return self.categories[category.id]
def standard(request, tag_title): # Get the tag. try: tag = Tag.objects.get(title=tag_title) except: raise Http404 # Get public resources associated with the tag. from oer.models import Resource resources = Resource.objects.filter(tags=tag)[:20] category = Category.objects.filter(tags=tag)[0] breadcrumb = catU.build_breadcrumb(category) breadcrumb_urlized = [] for breadcrumb_category in breadcrumb: if breadcrumb_category.parent.slug == 'standards': break try: breadcrumb_urlized.append(standard_urlize(breadcrumb_category.parent)) # HACK(Varun): For practice standards whose parent has been ripped away. except: breadcrumb_category.url = '' breadcrumb_urlized.append(breadcrumb_category) breadcrumb_urlized.reverse() context = { 'tag': tag, 'resources': resources, 'breadcrumb': breadcrumb_urlized, 'title': tag.title + " ‹ OpenCurriculum" } return render(request, 'standard.html', context)
def _get_category_url(node): import meta.CategoryUtilities as catU breadcrumb = catU.build_breadcrumb(node) return reverse("browse", kwargs={"category_slug": breadcrumb[0].url})
def process_category_slug(self): categories_slugs = self.category_slug.split('/') # Determine the depth to figure out what level of page needs to be displayed. try: host_category = Category.objects.filter(slug=categories_slugs[0]) if host_category.count() == 0: raise Http404 else: host_category = host_category[0] if categories_slugs[0] != 'common-core': self.is_common_core_hosted = False else: self.is_common_core_hosted = True (host_browse_tree, host_flattened_tree) = category_util.build_child_categories( {'root': [host_category]}, []) # Assume that there is a unique pair of child/parent relationship in any # host category. Breaks on the edge case where this pair is found twice. try: self.current_category = Category.objects.get( slug=categories_slugs[-1], parent__slug=categories_slugs[-2]) except IndexError: try: self.current_category = Category.objects.get(slug=categories_slugs[-1]) except MultipleObjectsReturned: self.current_category = Category.objects.filter(slug=categories_slugs[-1])[0] except MultipleObjectsReturned: # Find the unique combinator inside the host tree. self.current_category = next(category for category in host_flattened_tree if( category.slug == categories_slugs[-1] and category.parent.slug == categories_slugs[-2])) except Category.DoesNotExist: raise Http404 # Determine subject if subject. try: self.subject_category = Category.objects.get( slug=categories_slugs[1], parent__slug=categories_slugs[0]) except: pass for category in host_flattened_tree: if category == self.current_category: self.selected_category = category if not self.selected_category: raise Http404 if len(categories_slugs) == 1: self.return_url = None else: return_category_slug = category_util.build_breadcrumb(self.selected_category.parent.parent)[0].url if return_category_slug != '': self.return_url = reverse( 'browse', kwargs={ 'category_slug': return_category_slug } ) else: self.return_url = reverse('browse_default') if len(categories_slugs) == 2: self.is_subject_home = True # Build the breadcrumb associated with this slug. self.build_breadcrumb() except""" Exception, e""": # from django.core.mail import mail_admins # mail_admins('Browse failed to render category', str(e) + category_slug) # Happens either when the slug is not found. raise Http404 return { 'host_category': host_category, }
def build_child_tree(root_node): # Get the list of child of this node. nodes = list(itertools.chain.from_iterable(root_node.values())) node_elements = [] # Create <li> nodes for each. for node in nodes: node_element = ElementTree.Element('li') if type(node) is dict: current_node = get_root_key(node) else: current_node = node # Determine whether the node is a tag or category. if type(current_node).__name__.lower() == 'category': node_type = 'category' else: node_type = 'tag' # If this child has other children, build child tree. # Has to be the case of our tag category. if type(node) is dict: # Set a class to indicate that this element has child collections. node_element.set('class', 'parent-category') node_toggler = ElementTree.SubElement(node_element, 'span') node_toggler.set('class', 'toggle-category') node_toggler.text = ' ' node_href = ElementTree.SubElement(node_element, 'a') node_href.set('href', reverse('browse', kwargs={ 'category_slug': catU.build_breadcrumb(current_node)[0].url })) node_href.set('id', 'category-' + str(current_node.id)) node_href.text = current_node.title nodeList = ElementTree.SubElement(node_element, 'ul') child_nodes = build_child_tree(node) for child_node in child_nodes: nodeList.append(child_node) # Otherwise, append a child <a> element as is. # Can be a tag category or a tag. else: # Set a class to indicate that this element does not have child collections. node_element.set('class', 'empty-category' if node_type == 'category' else 'empty-tag') node_toggler = ElementTree.SubElement(node_element, 'span') node_toggler.set( 'class', 'toggle-category' if node_type == 'category' else 'toggle-tag') node_toggler.text = ' ' node_href = ElementTree.SubElement(node_element, 'a') if node_type == 'category': node_href.set('href', reverse('browse', kwargs={ 'category_slug': catU.build_breadcrumb(current_node)[0].url })) else: node_href.set('href', reverse('meta:standard', kwargs={ 'tag_title': current_node.title })) node_href.set( 'id', ('category-' if node_type == 'category' else 'tag-') + str(current_node.id)) node_href.text = current_node.title if node_type == 'category' else ( current_node.title + ': ' + (current_node.description if current_node.description else '')) node_elements.append(node_element) return node_elements