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/10/10 13:23:05 UTC

[airavata-django-portal] 02/02: AIRAVATA-2857 Nav items can show/hide based on logged in status

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 70c9b8405d6c511d01dd46cf68d2478b57530608
Author: Marcus Christie <ma...@iu.edu>
AuthorDate: Tue Oct 9 21:45:42 2018 -0400

    AIRAVATA-2857 Nav items can show/hide based on logged in status
---
 django_airavata/apps/auth/views.py                 |  4 +-
 django_airavata/settings.py                        |  2 +-
 .../templates/blocks/bootstrap/nav-item.html       | 21 ++++++
 .../templates/blocks/bootstrap/nav.html            |  7 ++
 .../includes/nav_extra.html                        | 28 +------
 django_airavata/wagtailapps/base/blocks.py         | 69 +++++++++++++++++
 .../base/migrations/0018_auto_20181010_0136.py     | 80 ++++++++++++++++++++
 django_airavata/wagtailapps/base/models.py         | 88 +++-------------------
 .../base/templatetags/navigation_tags.py           |  4 +-
 9 files changed, 196 insertions(+), 107 deletions(-)

diff --git a/django_airavata/apps/auth/views.py b/django_airavata/apps/auth/views.py
index 827ff72..524586f 100644
--- a/django_airavata/apps/auth/views.py
+++ b/django_airavata/apps/auth/views.py
@@ -3,7 +3,7 @@ from urllib.parse import quote
 
 from django.conf import settings
 from django.contrib.auth import authenticate, login, logout
-from django.shortcuts import redirect, render
+from django.shortcuts import redirect, render, resolve_url
 from django.urls import reverse
 from requests_oauthlib import OAuth2Session
 
@@ -67,7 +67,7 @@ def handle_login(request):
 def start_logout(request):
     logout(request)
     redirect_url = request.build_absolute_uri(
-        reverse(settings.LOGOUT_REDIRECT_URL))
+        resolve_url(settings.LOGOUT_REDIRECT_URL))
     return redirect(settings.KEYCLOAK_LOGOUT_URL +
                     "?redirect_uri=" + quote(redirect_url))
 
diff --git a/django_airavata/settings.py b/django_airavata/settings.py
index dab69a5..1044127 100644
--- a/django_airavata/settings.py
+++ b/django_airavata/settings.py
@@ -190,7 +190,7 @@ WAGTAILIMAGES_JPEG_QUALITY = 100
 
 LOGIN_URL = 'django_airavata_auth:login'
 LOGIN_REDIRECT_URL = 'django_airavata_workspace:dashboard'
-LOGOUT_REDIRECT_URL = 'home'
+LOGOUT_REDIRECT_URL = '/'
 
 AUTHENTICATION_OPTIONS = {
     # Control whether username/password authentication is allowed
diff --git a/django_airavata/templates/blocks/bootstrap/nav-item.html b/django_airavata/templates/blocks/bootstrap/nav-item.html
new file mode 100644
index 0000000..20b517e
--- /dev/null
+++ b/django_airavata/templates/blocks/bootstrap/nav-item.html
@@ -0,0 +1,21 @@
+{% load wagtailcore_tags %}
+{% load wagtailimages_tags %}
+
+{% if value.show == 'logged-in' and request.user.is_authenticated or value.show == 'not-logged-in' and not request.user.is_authenticated or value.show == 'always' %}
+<li class="nav-item {% if value.horizontal_alignment == 'push-right' %}ml-auto{% endif %}">
+  <a class="nav-link" href="{{ value.link }}">
+    {% if value.image %}
+    {% image value.image height-24 as tmp_photo %}
+    <img src="{{tmp_photo.url}}">
+    {% endif %}
+
+    {% if value.icon_class %}
+    <i class="{{ value.icon_class }}"></i>
+    {% endif %}
+
+    {% if value.link_text %}
+    {{ value.link_text }}
+    {% endif %}
+  </a>
+</li>
+{% endif %}
diff --git a/django_airavata/templates/blocks/bootstrap/nav.html b/django_airavata/templates/blocks/bootstrap/nav.html
new file mode 100644
index 0000000..f1057bd
--- /dev/null
+++ b/django_airavata/templates/blocks/bootstrap/nav.html
@@ -0,0 +1,7 @@
+{% load wagtailcore_tags %}
+
+<ul class="nav {{value.custom_class}}">
+  {% for block in value.nav_items %}
+    {% include_block block %}
+  {% endfor %}
+</ul>
diff --git a/django_airavata/templates/django_airavata_wagtail_base/includes/nav_extra.html b/django_airavata/templates/django_airavata_wagtail_base/includes/nav_extra.html
index 40014a9..be1f6f7 100644
--- a/django_airavata/templates/django_airavata_wagtail_base/includes/nav_extra.html
+++ b/django_airavata/templates/django_airavata_wagtail_base/includes/nav_extra.html
@@ -1,25 +1,5 @@
-{% load wagtailimages_tags %}
+{% load wagtailcore_tags %}
 
-<ul class="nav {{navextra.custom_class}} ml-auto ">
-  {% if navextra.nav_logo %}
-  <li class="nav-item">
-    {% image navextra.nav_logo original as tmp_photo %}
-    <a href="{{navextra.nav_logo_link}}"><img src="{{tmp_photo.url}}" style="width:{{navextra.nav_logo_width}};height:{{navextra.nav_logo_height}};" alt="nav-extra-logo" class="nav-link"></a>
-  </li>
-  {% endif %}
-  {% if navextra.nav_text1 %}
-  <li class="nav-item ml-auto">
-    <a class="nav-link" href="{{navextra.nav_link1}}"><i class="{{navextra.faicon1}}"></i> {{navextra.nav_text1}}</a>
-  </li>
-  {% endif %}
-  {% if navextra.nav_text2 %}
-  <li class="nav-item">
-    <a class="nav-link" href="{{navextra.nav_link2}}"><i class="{{navextra.faicon2}}"></i> {{navextra.nav_text2}}</a>
-  </li>
-  {% endif %}
-  {% if navextra.nav_text3 %}
-  <li class="nav-item">
-    <a class="nav-link" href="{{navextra.nav_link3}}"><i class="{{navextra.faicon3}}"></i> {{navextra.nav_text3}}</a>
-  </li>
-  {% endif %}
-</ul>
+{% for block in navextra.nav %}
+{% include_block block %}
+{% endfor %}
diff --git a/django_airavata/wagtailapps/base/blocks.py b/django_airavata/wagtailapps/base/blocks.py
index 750632b..508e676 100644
--- a/django_airavata/wagtailapps/base/blocks.py
+++ b/django_airavata/wagtailapps/base/blocks.py
@@ -434,3 +434,72 @@ class CssStreamBlock(StreamBlock):
     """
     css_block = RawHTMLBlock(required=True, help_text="Write Css Here")
     css_comment = CssCommentBlock()
+
+
+class NavItem(StructBlock):
+    link = CharBlock(help_text="Full URL or relative path (e.g., /auth/login)")
+    link_text = CharBlock(required=False)
+    image = ImageChooserBlock(required=False)
+    icon_class = CharBlock(required=False, help_text="Font awesome icon class")
+    show = ChoiceBlock(choices=[
+        ('not-logged-in', 'Only when not logged in'),
+        ('logged-in', 'Only when logged in'),
+        ('always', 'Always'),
+    ], default='not-logged-in')
+    horizontal_alignment = ChoiceBlock(choices=[
+        ('', 'Select a horizontal alignment'),
+        ('push-right', 'Push Right'),
+    ], required=False)
+
+    class Meta:
+        icon = "fa-minus"
+        template = "blocks/bootstrap/nav-item.html"
+
+
+class LoginNavItem(NavItem):
+
+    class Meta:
+        default = {
+            'link': '/auth/login',
+            'link_text': 'Log in',
+            'icon_class': 'fas fa-sign-in-alt',
+            'show': 'not-logged-in',
+            'horizontal_alignment': 'push-right',
+        }
+
+
+class DashboardLinkNavItem(NavItem):
+
+    class Meta:
+        default = {
+            'link': '/workspace/dashboard',
+            'link_text': 'Go to Dashboard',
+            'icon_class': 'fas fa-arrow-circle-right',
+            'show': 'logged-in',
+            'horizontal_alignment': 'push-right',
+        }
+
+
+class LogoutNavItem(NavItem):
+
+    class Meta:
+        default = {
+            'link': '/auth/logout',
+            'link_text': 'Logout',
+            'icon_class': 'fas fa-sign-out-alt',
+            'show': 'logged-in',
+        }
+
+
+class Nav(StructBlock):
+    custom_class = CharBlock(required=False)
+    nav_items = StreamBlock([
+        ('nav_item', NavItem()),
+        ('login_link', LoginNavItem()),
+        ('dashboard_link', DashboardLinkNavItem()),
+        ('logout_link', LogoutNavItem()),
+    ])
+
+    class Meta:
+        icon = "fa-bars"
+        template = "blocks/bootstrap/nav.html"
diff --git a/django_airavata/wagtailapps/base/migrations/0018_auto_20181010_0136.py b/django_airavata/wagtailapps/base/migrations/0018_auto_20181010_0136.py
new file mode 100644
index 0000000..28125a6
--- /dev/null
+++ b/django_airavata/wagtailapps/base/migrations/0018_auto_20181010_0136.py
@@ -0,0 +1,80 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11.16 on 2018-10-10 01:36
+from __future__ import unicode_literals
+
+from django.db import migrations
+import wagtail.core.blocks
+import wagtail.core.fields
+import wagtail.images.blocks
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('django_airavata_wagtail_base', '0017_gatewayicon_gatewaytitle'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='navextra',
+            name='custom_class',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='faicon1',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='faicon2',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='faicon3',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_link1',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_link2',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_link3',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_logo',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_logo_height',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_logo_link',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_logo_width',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_text1',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_text2',
+        ),
+        migrations.RemoveField(
+            model_name='navextra',
+            name='nav_text3',
+        ),
+        migrations.AddField(
+            model_name='navextra',
+            name='nav',
+            field=wagtail.core.fields.StreamField((('nav', wagtail.core.blocks.StructBlock((('custom_class', wagtail.core.blocks.CharBlock(required=False)), ('nav_items', wagtail.core.blocks.StreamBlock((('nav_item', wagtail.core.blocks.StructBlock((('link', wagtail.core.blocks.CharBlock(help_text='Full URL or relative path (e.g., /auth/login)')), ('link_text', wagtail.core.blocks.CharBlock(required=False)), ('image', wagtail.images.blocks.ImageChooserBlock(required=False)), ('icon_class [...]
+            preserve_default=False,
+        ),
+    ]
diff --git a/django_airavata/wagtailapps/base/models.py b/django_airavata/wagtailapps/base/models.py
index 1af718b..5e4dd6d 100644
--- a/django_airavata/wagtailapps/base/models.py
+++ b/django_airavata/wagtailapps/base/models.py
@@ -11,7 +11,7 @@ from wagtail.core.models import Orderable, Page
 from wagtail.images.edit_handlers import ImageChooserPanel
 from wagtail.snippets.models import register_snippet
 
-from .blocks import BaseStreamBlock, CssStreamBlock
+from .blocks import BaseStreamBlock, CssStreamBlock, Nav
 
 
 @register_snippet
@@ -48,86 +48,16 @@ class Announcements(models.Model):
 @register_snippet
 class NavExtra(models.Model):
     """
-    This provides editable text for the site extra navbar which comes below the main navbar. Again it uses the decorator
-    `register_snippet` to allow it to be accessible via the admin. It is made
-    accessible on the template via a template tag defined in base/templatetags/
-    navigation_tags.py
+    This provides editable text for the site extra navbar which comes below
+    the main navbar. Again it uses the decorator `register_snippet` to allow
+    it to be accessible via the admin. It is made accessible on the template
+    via a template tag defined in base/templatetags/navigation_tags.py
     """
-    nav_logo = models.ForeignKey(
-        'wagtailimages.Image',
-        null=True,
-        blank=True,
-        on_delete=models.SET_NULL,
-        related_name='+',
-        help_text='Nav Extra Logo'
-    )
-    nav_logo_width = models.IntegerField(
-        null=True, blank=True, help_text="Navbar Logo width")
-    nav_logo_height = models.IntegerField(
-        null=True, blank=True, help_text="Navbar Logo height")
-    nav_logo_link = models.CharField(
-        max_length=255,
-        default="#",
-        help_text="Give a redirect link for the Logo")
-    nav_text1 = models.CharField(
-        max_length=25, help_text="Give a text for link 1")
-    faicon1 = models.CharField(
-        max_length=50,
-        help_text="Provide a class name of icon from font awesome website")
-    nav_link1 = models.CharField(
-        max_length=255, help_text="Provide a link address for link 1")
-    nav_text2 = models.CharField(
-        max_length=25,
-        help_text="Give a text for link 2",
-        null=True,
-        blank=True)
-    faicon2 = models.CharField(
-        max_length=50,
-        help_text="Provide a class name of icon from font awesome website",
-        null=True,
-        blank=True)
-    nav_link2 = models.CharField(
-        max_length=255,
-        help_text="Provide a link address for link 2",
-        null=True,
-        blank=True)
-    nav_text3 = models.CharField(
-        max_length=25,
-        help_text="Give a text for link 3",
-        null=True,
-        blank=True)
-    faicon3 = models.CharField(
-        max_length=50,
-        help_text="Provide a class name of icon from font awesome website",
-        null=True,
-        blank=True)
-    nav_link3 = models.CharField(
-        max_length=255,
-        help_text="Provide a link address for link 3",
-        null=True,
-        blank=True)
-    custom_class = models.CharField(
-        max_length=255,
-        help_text="Provide custom class names separated by space to gain extra control of nav",
-        null=True,
-        blank=True,
-    )
-
+    nav = StreamField([
+        ('nav', Nav(max_num=1)),
+    ])
     panels = [
-        ImageChooserPanel('nav_logo'),
-        FieldPanel('nav_logo_width'),
-        FieldPanel('nav_logo_height'),
-        FieldPanel('nav_logo_link'),
-        FieldPanel('nav_text1'),
-        FieldPanel('faicon1'),
-        FieldPanel('nav_link1'),
-        FieldPanel('nav_text2'),
-        FieldPanel('faicon2'),
-        FieldPanel('nav_link2'),
-        FieldPanel('nav_text3'),
-        FieldPanel('faicon3'),
-        FieldPanel('nav_link3'),
-        FieldPanel('custom_class')
+        StreamFieldPanel('nav'),
     ]
 
     def __str__(self):
diff --git a/django_airavata/wagtailapps/base/templatetags/navigation_tags.py b/django_airavata/wagtailapps/base/templatetags/navigation_tags.py
index 9765194..3cce7df 100644
--- a/django_airavata/wagtailapps/base/templatetags/navigation_tags.py
+++ b/django_airavata/wagtailapps/base/templatetags/navigation_tags.py
@@ -148,7 +148,8 @@ def get_css(context):
     }
 
 
-@register.inclusion_tag('django_airavata_wagtail_base/includes/nav_extra.html', takes_context=True)
+@register.inclusion_tag(
+    'django_airavata_wagtail_base/includes/nav_extra.html', takes_context=True)
 def get_nav_extra(context):
     nav_extra = ""
     if NavExtra.objects.first() is not None:
@@ -156,6 +157,7 @@ def get_nav_extra(context):
 
     return {
         'navextra': nav_extra,
+        'request': context['request'],
     }