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'],
}