You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ma...@apache.org on 2018/02/27 17:08:01 UTC

[airavata-django-portal] 01/03: AIRAVATA-2698 Django app switchers added to header

This is an automated email from the ASF dual-hosted git repository.

machristie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-django-portal.git

commit 771677f65abf8e4f2f9384d367821745281e331b
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Tue Feb 27 09:58:39 2018 -0500

    AIRAVATA-2698 Django app switchers added to header
---
 django_airavata/app_config.py          | 26 ++++++++++++++++++++++++++
 django_airavata/apps/groups/apps.py    |  8 ++++++--
 django_airavata/apps/workspace/apps.py |  8 ++++++--
 django_airavata/context_processors.py  | 19 +++++++++++++++++++
 django_airavata/settings.py            |  2 ++
 django_airavata/templates/base.html    | 33 ++++++++++++++++++++++++++++-----
 6 files changed, 87 insertions(+), 9 deletions(-)

diff --git a/django_airavata/app_config.py b/django_airavata/app_config.py
new file mode 100644
index 0000000..540c29e
--- /dev/null
+++ b/django_airavata/app_config.py
@@ -0,0 +1,26 @@
+
+from abc import ABC, abstractmethod
+
+from django.apps import AppConfig
+
+
+class AiravataAppConfig(AppConfig, ABC):
+    """Custom AppConfig for Django Airavata apps."""
+
+    @property
+    @abstractmethod
+    def url_app_name(self):
+        """Return the urls application namespace (typically, same as label)."""
+        pass
+
+    @property
+    @abstractmethod
+    def app_order(self):
+        """Return positive int order of app in listings, lowest sorts first."""
+        pass
+
+    @property
+    @abstractmethod
+    def url_home(self):
+        """Named route of home page for this application."""
+        pass
diff --git a/django_airavata/apps/groups/apps.py b/django_airavata/apps/groups/apps.py
index f5a0e34..30cd9f7 100755
--- a/django_airavata/apps/groups/apps.py
+++ b/django_airavata/apps/groups/apps.py
@@ -1,6 +1,10 @@
-from django.apps import AppConfig
+from django_airavata.app_config import AiravataAppConfig
 
 
-class GroupsConfig(AppConfig):
+class GroupsConfig(AiravataAppConfig):
     name = 'django_airavata.apps.groups'
     label = 'django_airavata_groups'
+    verbose_name = 'Groups'
+    url_app_name = label
+    app_order = 10
+    url_home = url_app_name + ':manage'
diff --git a/django_airavata/apps/workspace/apps.py b/django_airavata/apps/workspace/apps.py
index ffa1ad0..79c4a20 100644
--- a/django_airavata/apps/workspace/apps.py
+++ b/django_airavata/apps/workspace/apps.py
@@ -1,6 +1,10 @@
-from django.apps import AppConfig
+from django_airavata.app_config import AiravataAppConfig
 
 
-class WorkspaceConfig(AppConfig):
+class WorkspaceConfig(AiravataAppConfig):
     name = 'django_airavata.apps.workspace'
     label = 'django_airavata_workspace'
+    verbose_name = 'Workspace'
+    url_app_name = label
+    app_order = 0
+    url_home = 'django_airavata_workspace:dashboard'
diff --git a/django_airavata/context_processors.py b/django_airavata/context_processors.py
new file mode 100644
index 0000000..8bd45ef
--- /dev/null
+++ b/django_airavata/context_processors.py
@@ -0,0 +1,19 @@
+from django.apps import apps
+
+from django_airavata.app_config import AiravataAppConfig
+
+
+def airavata_app_registry(request):
+    """Put airavata django apps into the context."""
+    airavata_apps = [app for app in apps.get_app_configs()
+                     if isinstance(app, AiravataAppConfig)]
+    # Sort by app_order then by verbose_name (case-insensitive)
+    airavata_apps.sort(
+        key=lambda app: "{:09}-{}".format(app.app_order,
+                                          app.verbose_name.lower()))
+    return {'airavata_apps': airavata_apps}
+
+
+def resolver_match(request):
+    """Put resolver_match (ResolverMatch instance) into the context."""
+    return {'resolver_match': request.resolver_match}
diff --git a/django_airavata/settings.py b/django_airavata/settings.py
index fa5ccd9..14a20ab 100644
--- a/django_airavata/settings.py
+++ b/django_airavata/settings.py
@@ -72,6 +72,8 @@ TEMPLATES = [
                 'django.template.context_processors.request',
                 'django.contrib.auth.context_processors.auth',
                 'django.contrib.messages.context_processors.messages',
+                'django_airavata.context_processors.airavata_app_registry',
+                'django_airavata.context_processors.resolver_match',
             ],
         },
     },
diff --git a/django_airavata/templates/base.html b/django_airavata/templates/base.html
index 7a0dd01..afba8ad 100644
--- a/django_airavata/templates/base.html
+++ b/django_airavata/templates/base.html
@@ -35,14 +35,37 @@
     <div class=c-header__title><a href="{% url 'home' %}">{% block title %}Django Airavata Gateway{% endblock %}</a></div>
     {% if user.is_authenticated %}
         <div class=c-header__controls>
-            <div class=dropdown><a href=#0 class="dropdown-toggle text-dark" id=dropdownMenuButton data-toggle=dropdown
-                                   aria-haspopup=true aria-expanded=false><i
+            <div class="btn-group">
+                <div class=dropdown>
+                    <a href=#0 class="dropdown-toggle text-dark" id=appDropdownMenuButton data-toggle=dropdown
+                            aria-haspopup=true aria-expanded=false>
+                        {% for app in airavata_apps %}
+                            {% if app.url_app_name == resolver_match.app_name %}
+                                {{ app.verbose_name }}
+                            {% endif %}
+                        {% endfor %}
+                    </a>
+                <div class=dropdown-menu aria-labelledby=appDropdownMenuButton>
+                        {% for app in airavata_apps %}
+                            {% if app.url_app_name == resolver_match.app_name %}
+                                <a class="dropdown-item active" href="{% url app.url_home %}">{{ app.verbose_name }}</a>
+                            {% else %}
+                                <a class="dropdown-item" href="{% url app.url_home %}">{{ app.verbose_name }}</a>
+                            {% endif %}
+                        {% endfor %}
+                </div>
+                </div>
+            </div>
+            <div class="btn-group ml-3">
+                <div class=dropdown><a href=#0 class="dropdown-toggle text-dark" id=dropdownMenuButton data-toggle=dropdown
+                    aria-haspopup=true aria-expanded=false><i
                     class="fa fa-user mr-2"></i> {{ request.session.USERINFO.given_name }} {{ request.session.USERINFO.family_name }}
-            </a>
+                </a>
                 <div class=dropdown-menu aria-labelledby=dropdownMenuButton><a class=dropdown-item href=#>User
                     settings</a> <a
-                        class=dropdown-item href="{% url 'django_airavata_auth:logout' %}">Logout <i
-                        class="fa fa-sign-out"></i></a></div>
+                    class=dropdown-item href="{% url 'django_airavata_auth:logout' %}">Logout <i
+                    class="fa fa-sign-out"></i></a></div>
+                </div>
             </div>
         </div>
     {% endif %}

-- 
To stop receiving notification emails like this one, please contact
machristie@apache.org.