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:00 UTC

[airavata-django-portal] branch master updated (1d47f00 -> 3464e2f)

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

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


    from 1d47f00  Go to group listing when group created
     new 771677f  AIRAVATA-2698 Django app switchers added to header
     new f30a4bb  AIRAVATA-2698 Add icon class name to apps to dislay in app switcher
     new 3464e2f  AIRAVATA-2698 App descriptions, displayed on home page

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 django_airavata/app_config.py                      | 38 +++++++++++++++++
 django_airavata/apps/groups/apps.py                | 12 +++++-
 django_airavata/apps/workspace/apps.py             | 12 +++++-
 django_airavata/context_processors.py              | 25 ++++++++++++
 django_airavata/settings.py                        |  2 +
 django_airavata/templates/base.html                | 47 ++++++++++++++++++----
 .../templates/django_airavata/home.html            | 25 +++++++++---
 7 files changed, 144 insertions(+), 17 deletions(-)
 create mode 100644 django_airavata/app_config.py
 create mode 100644 django_airavata/context_processors.py

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

[airavata-django-portal] 03/03: AIRAVATA-2698 App descriptions, displayed on home page

Posted by ma...@apache.org.
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 3464e2f31a7d7f5a18084896ab4db412ee7302fb
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Tue Feb 27 12:07:54 2018 -0500

    AIRAVATA-2698 App descriptions, displayed on home page
---
 django_airavata/app_config.py                      |  6 ++++++
 django_airavata/apps/groups/apps.py                |  3 +++
 django_airavata/apps/workspace/apps.py             |  3 +++
 .../templates/django_airavata/home.html            | 25 +++++++++++++++++-----
 4 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/django_airavata/app_config.py b/django_airavata/app_config.py
index f4dfb34..57fdde2 100644
--- a/django_airavata/app_config.py
+++ b/django_airavata/app_config.py
@@ -30,3 +30,9 @@ class AiravataAppConfig(AppConfig, ABC):
     def fa_icon_class(self):
         """Font Awesome icon class name."""
         pass
+
+    @property
+    @abstractmethod
+    def app_description(self):
+        """Some user friendly text to briefly describe the application."""
+        pass
diff --git a/django_airavata/apps/groups/apps.py b/django_airavata/apps/groups/apps.py
index 1680810..7abdfba 100755
--- a/django_airavata/apps/groups/apps.py
+++ b/django_airavata/apps/groups/apps.py
@@ -9,3 +9,6 @@ class GroupsConfig(AiravataAppConfig):
     app_order = 10
     url_home = url_app_name + ':manage'
     fa_icon_class = 'fa-users'
+    app_description = """
+        Create and manage user groups.
+    """
diff --git a/django_airavata/apps/workspace/apps.py b/django_airavata/apps/workspace/apps.py
index 2692ec1..e95c1d7 100644
--- a/django_airavata/apps/workspace/apps.py
+++ b/django_airavata/apps/workspace/apps.py
@@ -9,3 +9,6 @@ class WorkspaceConfig(AiravataAppConfig):
     app_order = 0
     url_home = 'django_airavata_workspace:dashboard'
     fa_icon_class = 'fa-flask'
+    app_description = """
+        Launch applications and manage your experiments and projects.
+    """
diff --git a/django_airavata/templates/django_airavata/home.html b/django_airavata/templates/django_airavata/home.html
index 00c7ce4..048df50 100644
--- a/django_airavata/templates/django_airavata/home.html
+++ b/django_airavata/templates/django_airavata/home.html
@@ -2,16 +2,31 @@
 
 {% block content %}
 <div class="jumbotron">
-    <div class="container">
         <h1>Welcome!</h1>
         <p>This is the Django based web portal for the Airavata project. This
         portal can be used as the basis for developing a science gateway using
         Airavata.</p>
-        {% if user.is_authenticated %}
-        <p><a class="btn btn-primary btn-lg" href="{% url 'django_airavata_workspace:projects' %}" role="button">Go to your Projects »</a></p>
-        {% else %}
+        {% if not user.is_authenticated %}
         <p><a class="btn btn-primary btn-lg" href="{% url 'django_airavata_auth:login' %}" role="button">Login »</a></p>
         {% endif %}
-    </div>
 </div>
+{% if user.is_authenticated %}
+    {% for app in airavata_apps %}
+    {% if not forloop.counter|divisibleby:"2" %}
+    <div class="row">
+    {% endif %}
+        <div class="col-sm-6">
+            <div class="card">
+                <div class="card-body">
+                    <h5 class="card-title"><i class="fa {{ app.fa_icon_class }} mr-2"></i>{{ app.verbose_name }}</h5>
+                    <p class="card-text">{{ app.app_description }}</p>
+                    <a href="{% url app.url_home %}" class="btn btn-primary">Go to {{ app.verbose_name }} »</a>
+                </div>
+            </div>
+        </div>
+    {% if forloop.counter|divisibleby:"2" %}
+    </div>
+    {% endif %}
+    {% endfor %}
+{% endif %}
 {% endblock content %}

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

[airavata-django-portal] 02/03: AIRAVATA-2698 Add icon class name to apps to dislay in app switcher

Posted by ma...@apache.org.
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 f30a4bbfcd60bc6e433dbd1d7903c1ae0e590515
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Tue Feb 27 11:47:08 2018 -0500

    AIRAVATA-2698 Add icon class name to apps to dislay in app switcher
---
 django_airavata/app_config.py          |  6 ++++
 django_airavata/apps/groups/apps.py    |  1 +
 django_airavata/apps/workspace/apps.py |  1 +
 django_airavata/context_processors.py  |  8 +++++-
 django_airavata/settings.py            |  2 +-
 django_airavata/templates/base.html    | 52 ++++++++++++++++++++--------------
 6 files changed, 46 insertions(+), 24 deletions(-)

diff --git a/django_airavata/app_config.py b/django_airavata/app_config.py
index 540c29e..f4dfb34 100644
--- a/django_airavata/app_config.py
+++ b/django_airavata/app_config.py
@@ -24,3 +24,9 @@ class AiravataAppConfig(AppConfig, ABC):
     def url_home(self):
         """Named route of home page for this application."""
         pass
+
+    @property
+    @abstractmethod
+    def fa_icon_class(self):
+        """Font Awesome icon class name."""
+        pass
diff --git a/django_airavata/apps/groups/apps.py b/django_airavata/apps/groups/apps.py
index 30cd9f7..1680810 100755
--- a/django_airavata/apps/groups/apps.py
+++ b/django_airavata/apps/groups/apps.py
@@ -8,3 +8,4 @@ class GroupsConfig(AiravataAppConfig):
     url_app_name = label
     app_order = 10
     url_home = url_app_name + ':manage'
+    fa_icon_class = 'fa-users'
diff --git a/django_airavata/apps/workspace/apps.py b/django_airavata/apps/workspace/apps.py
index 79c4a20..2692ec1 100644
--- a/django_airavata/apps/workspace/apps.py
+++ b/django_airavata/apps/workspace/apps.py
@@ -8,3 +8,4 @@ class WorkspaceConfig(AiravataAppConfig):
     url_app_name = label
     app_order = 0
     url_home = 'django_airavata_workspace:dashboard'
+    fa_icon_class = 'fa-flask'
diff --git a/django_airavata/context_processors.py b/django_airavata/context_processors.py
index 8bd45ef..5989a83 100644
--- a/django_airavata/context_processors.py
+++ b/django_airavata/context_processors.py
@@ -11,7 +11,13 @@ def airavata_app_registry(request):
     airavata_apps.sort(
         key=lambda app: "{:09}-{}".format(app.app_order,
                                           app.verbose_name.lower()))
-    return {'airavata_apps': airavata_apps}
+    current_airavata_app = [app for app in airavata_apps if app.url_app_name == request.resolver_match.app_name]
+    current_airavata_app = current_airavata_app[0]\
+        if len(current_airavata_app) > 0 else None
+    return {
+        'airavata_apps': airavata_apps,
+        'current_airavata_app': current_airavata_app,
+    }
 
 
 def resolver_match(request):
diff --git a/django_airavata/settings.py b/django_airavata/settings.py
index 14a20ab..e857e8e 100644
--- a/django_airavata/settings.py
+++ b/django_airavata/settings.py
@@ -73,7 +73,7 @@ TEMPLATES = [
                 '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',
+                # 'django_airavata.context_processors.resolver_match',
             ],
         },
     },
diff --git a/django_airavata/templates/base.html b/django_airavata/templates/base.html
index afba8ad..aa9a3c2 100644
--- a/django_airavata/templates/base.html
+++ b/django_airavata/templates/base.html
@@ -39,32 +39,40 @@
                 <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 %}
+                        {% if current_airavata_app %}
+                            <i class="fa {{ current_airavata_app.fa_icon_class }} mr-2"></i>
+                            {{ current_airavata_app.verbose_name }}
+                        {% else %}
+                            Menu
+                        {% endif %}
                     </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 class=dropdown-menu aria-labelledby=appDropdownMenuButton>
+                            {% for app in airavata_apps %}
+                                {% if app == current_airavata_app %}
+                                    <a class="dropdown-item active" href="{% url app.url_home %}">
+                                        <i class="fa {{ app.fa_icon_class }} mr-2"></i>{{ app.verbose_name }}
+                                    </a>
+                                {% else %}
+                                    <a class="dropdown-item" href="{% url app.url_home %}">
+                                        <i class="fa {{ app.fa_icon_class }} mr-2"></i>{{ 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>
-                <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>
+                <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>
+                    <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>
                 </div>
             </div>
         </div>

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

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

Posted by ma...@apache.org.
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.