def recursive(nodes): for child in nodes: try: ancestor = child.ancestor except: ancestor = False try: selected = child.selected except: selected = False if selected or ancestor: if 'news_and_events' in settings.INSTALLED_APPS and child in pages and child.entity.all()[0].auto_news_page: menutitle = child.entity.all()[0].news_page_menu_title new_node = NavigationNode(mark_safe(menutitle), child.entity.all()[0].get_absolute_url() + "news-and-events/") if request.path == new_node.get_absolute_url(): new_node.selected = True child.selected=False child.childrens.append(new_node) if child in pages and child.entity.all()[0].auto_contacts_page: menutitle = child.entity.all()[0].contacts_page_menu_title new_node = NavigationNode(mark_safe(menutitle), child.entity.all()[0].get_absolute_url() + "contact/") if request.path == new_node.get_absolute_url(): new_node.selected = True child.selected=False child.childrens.append(new_node) if 'vacancies_and_studentships' in settings.INSTALLED_APPS and child in pages and child.entity.all()[0].auto_vacancies_page: menutitle = child.entity.all()[0].vacancies_page_menu_title new_node = NavigationNode(mark_safe(menutitle), child.entity.all()[0].get_absolute_url() + "vacancies-and-studentships/") if request.path == new_node.get_absolute_url(): new_node.selected = True child.selected=False child.childrens.append(new_node) if 'publications' in settings.INSTALLED_APPS and child in pages and child.entity.all()[0].auto_publications_page: menutitle = child.entity.all()[0].publications_page_menu_title new_node = NavigationNode(mark_safe(menutitle), child.entity.all()[0].get_absolute_url() + "publications/") if request.path == new_node.get_absolute_url(): new_node.selected = True child.selected=False child.childrens.append(new_node) recursive(child.childrens)
def get_nodes(request): """ creates mptt style parent-child list for extending django-cms navigation (menu & breadcrumb); structured on photologue.urls """ res = [] #NavigationNode result list for q in gallery_args, photo_args: #get public Galleries & Photos if q.has_key('queryset'): #use default querysets from photologue.urls queryset = q['queryset'] try: #get the name of the queryset's model model = q['queryset'][0].__class__.__name__.lower() except IndexError: #abort if empty return res #check if multilingual middleware is installed # from django.conf import settings # if 'cms.middleware.multilingual.MultilingualURLMiddleware' in settings.MIDDLEWARE_CLASSES: # multilingual = True ## from django.utils.translation import get_language # from django.utils.translation import get_language_from_request # import ipdb; ipdb.set_trace() # lang_namespace = "%s:" % get_language_from_request(request) # else: # lang_namespace = '' else: return res #create the base path of the URL ('gallery/' or 'photo/') base_node = NavigationNode(model, reverse('pl-%s-archive' % model,)) # base_node = NavigationNode(model, reverse('%spl-%s-archive' % (lang_namespace, model))) base_node.childrens = [] #create node for object_list view (photologue uses this view for pagination) #urlpattern to match: url(r'^photo/page/(?P<page>[0-9]+)/$', 'object_list', {'queryset': Photo.objects.filter(is_public=True), 'allow_empty': True, 'paginate_by': 20}, name='pl-photo-list'), #path example: request.META['PATH_INFO'] = u'/galleries/photo/page/2/' or u'/galleries/gallery/page/1/' try: #page_path gets the relevant parts of the path for paging page_path = request.META['PATH_INFO'].split('/')[-4:-1] #eg: '/mygalleries/gallery/page/1/' -> ['gallery', 'page', '1'] #execute only if page_path is a photologue paged url for this model assert len(page_path) == 3 and [model, 'page', str(int(page_path[2]))] == page_path #name the node with a string, reverse to the paged named url, and pass the page value from page_path pages_node = NavigationNode('page %s' % page_path[2], reverse('pl-%s-list' % model, kwargs=dict(page=page_path[2]))) # pages_node = NavigationNode('page %s' % page_path[2], reverse('%spl-%s-list' % (lang_namespace, model), kwargs=dict(page=page_path[2]))) #modify url used in href, this doesn't work because NavigationNode uses the passed url for get_absolute_url pages_node.get_absolute_url = lambda: reverse('pl-%s-list' % model, kwargs=dict(page=1)) # pages_node.get_absolute_url = lambda: reverse('%spl-%s-list' % (lang_namespace, model), kwargs=dict(page=1)) #attach the node to the main list base_node.childrens.append(pages_node) except: #fail silently if not applicable pass #create NavigationNodes for the queryset for item in queryset: years_done = [] #keeps track of published item years months_done = [] days_done = [] slug_done = [] page_done = [] #get the date for this query object; 'date_added' called 'date published' in photologue admin date = item.date_added if not date.year in years_done: #if this year is not in the years_done list years_done.append(date.year) #add it to years_done list #name the navigation node with the item's year, reverse to a named url, and pass the value captured by url regex year_node = NavigationNode(date.year, reverse('pl-%s-archive-year' % model, kwargs=dict(year=date.year))) # year_node = NavigationNode(date.year, reverse('%spl-%s-archive-year' % (lang_namespace, model), kwargs=dict(year=date.year))) year_node.childrens = [] #create childrens sublist for this year months_done = [] #keeps track of published item months for this year base_node.childrens.append(year_node) #add this NavigationNode to the main list if not date.month in months_done: months_done.append(date.month) month_node = NavigationNode(date.strftime('%b').lower(), reverse('pl-%s-archive-month' % model, kwargs=dict(year=date.year, month=date.strftime('%b').lower()))) # month_node = NavigationNode(date.strftime('%b').lower(), reverse('%spl-%s-archive-month' % (lang_namespace, model), kwargs=dict(year=date.year, month=date.strftime('%b').lower()))) month_node.get_menu_title = date.strftime('%m') #use double int month name for menus month_node.childrens = [] days_done = [] year_node.childrens.append(month_node) if not date.day in days_done: days_done.append(date.day) day_node = NavigationNode(date.day, reverse('pl-%s-archive-day' % model, kwargs=dict(year=date.year, month=date.strftime('%b').lower(), day=date.day))) # day_node = NavigationNode(date.day, reverse('%spl-%s-archive-day' % (lang_namespace, model), kwargs=dict(year=date.year, month=date.strftime('%b').lower(), day=date.day))) day_node.childrens = [] slug_done = [] month_node.childrens.append(day_node) if not item.title_slug in slug_done: slug_done.append(item.title_slug) #one node child for the day node item_node = NavigationNode(item.title, reverse('pl-%s-detail' % model, kwargs=dict(year=date.year, month=date.strftime('%b').lower(), day=date.day, slug=item.title_slug))) # item_node = NavigationNode(item.title, reverse('%spl-%s-detail' % (lang_namespace, model), kwargs=dict(year=date.year, month=date.strftime('%b').lower(), day=date.day, slug=item.title_slug))) day_node.childrens.append(item_node) #and finally, one node child for the base node item_node = NavigationNode(item.title, reverse('pl-%s' % model, kwargs=dict(slug=item.title_slug))) # item_node = NavigationNode(item.title, reverse('%spl-%s' % (lang_namespace, model), kwargs=dict(slug=item.title_slug))) base_node.childrens.append(item_node) res.append(base_node) return res