|
1 | 1 | import textwrap |
| 2 | +import logging |
2 | 3 |
|
3 | 4 | from django import template |
4 | 5 | from django.db.models import IntegerField |
|
8 | 9 | from django.apps import apps |
9 | 10 | from django.core.exceptions import FieldDoesNotExist |
10 | 11 | from guardian.shortcuts import get_objects_for_user |
| 12 | +from django.utils.module_loading import import_string |
11 | 13 |
|
12 | 14 | from tom_targets.models import Target |
13 | 15 |
|
14 | | -register = template.Library() |
15 | | - |
| 16 | +logger = logging.getLogger(__name__) |
16 | 17 |
|
17 | | -@register.inclusion_tag('tom_common/partials/navbar_login.html', takes_context=True) |
18 | | -def navbar_login(context): |
19 | | - """ |
20 | | - Renders the username as a link to the user page, as well as the login button. Can be overridden to render additional |
21 | | - account-related buttons. |
22 | | - """ |
23 | | - nav_item_list = [] |
24 | | - for app in apps.get_app_configs(): |
25 | | - try: |
26 | | - nav_items = app.nav_items() |
27 | | - if nav_items: |
28 | | - for item in nav_items: |
29 | | - if item.get('position', 'left') == 'right': |
30 | | - nav_item_list.append(item) |
31 | | - except AttributeError: |
32 | | - pass |
33 | | - return {'user': context['user'], |
34 | | - 'nav_item_list': nav_item_list} |
| 18 | +register = template.Library() |
35 | 19 |
|
36 | 20 |
|
37 | 21 | @register.inclusion_tag('tom_common/partials/navbar_app_addons.html', takes_context=True) |
38 | | -def navbar_app_addons(context): |
| 22 | +def navbar_app_addons(context, position='left'): |
39 | 23 | """ |
40 | 24 | Imports the navbar content from appropriate apps |
41 | 25 | This should be a list of partials containing an <li> element that you would like displayed in the navbar with the |
42 | 26 | following format: |
43 | 27 | `<li class="nav-item"> <a class="nav-link" href="{% url 'namespace:view_name' %}">Link Text</a> </li>` |
44 | 28 | """ |
45 | | - nav_item_list = [] |
| 29 | + nav_items_to_display = [] |
46 | 30 | for app in apps.get_app_configs(): |
47 | 31 | try: |
48 | 32 | nav_items = app.nav_items() |
49 | | - if nav_items: |
50 | | - for item in nav_items: |
51 | | - if item.get('position', 'left') != 'right': |
52 | | - nav_item_list.append(item) |
53 | 33 | except AttributeError: |
54 | | - pass |
55 | | - return {'nav_item_list': nav_item_list} |
| 34 | + continue |
| 35 | + if nav_items: |
| 36 | + for item in nav_items: |
| 37 | + context_method_path = item.get('context', None) |
| 38 | + if context_method_path: |
| 39 | + try: |
| 40 | + context_method = import_string(item.get('context')) |
| 41 | + new_context = context_method({}) |
| 42 | + except ImportError as e: |
| 43 | + logger.warning(f'WARNING: Could not import context for {app.name} navbar item from ' |
| 44 | + f'{item["context"]}: \n' |
| 45 | + f'{e}') |
| 46 | + continue |
| 47 | + else: |
| 48 | + new_context = {} |
| 49 | + if item.get('position', 'left') == position: |
| 50 | + nav_items_to_display.append({'partial': item['partial'], 'context': new_context}) |
| 51 | + |
| 52 | + context['nav_items_to_display'] = nav_items_to_display |
| 53 | + return context |
56 | 54 |
|
57 | 55 |
|
58 | 56 | @register.simple_tag |
|
0 commit comments