summaryrefslogtreecommitdiffstats
path: root/tools/pharos-dashboard/src/account
diff options
context:
space:
mode:
Diffstat (limited to 'tools/pharos-dashboard/src/account')
-rw-r--r--tools/pharos-dashboard/src/account/jira_util.py3
-rw-r--r--tools/pharos-dashboard/src/account/migrations/0002_auto_20161005_1201.py25
-rw-r--r--tools/pharos-dashboard/src/account/models.py11
-rw-r--r--tools/pharos-dashboard/src/account/tasks.py34
-rw-r--r--tools/pharos-dashboard/src/account/tests/test_general.py10
-rw-r--r--tools/pharos-dashboard/src/account/views.py41
6 files changed, 109 insertions, 15 deletions
diff --git a/tools/pharos-dashboard/src/account/jira_util.py b/tools/pharos-dashboard/src/account/jira_util.py
index c333f8c4..fdb87f77 100644
--- a/tools/pharos-dashboard/src/account/jira_util.py
+++ b/tools/pharos-dashboard/src/account/jira_util.py
@@ -12,11 +12,10 @@ import base64
import os
import oauth2 as oauth
+from django.conf import settings
from jira import JIRA
from tlslite.utils import keyfactory
-from django.conf import settings
-
class SignatureMethod_RSA_SHA1(oauth.SignatureMethod):
name = 'RSA-SHA1'
diff --git a/tools/pharos-dashboard/src/account/migrations/0002_auto_20161005_1201.py b/tools/pharos-dashboard/src/account/migrations/0002_auto_20161005_1201.py
new file mode 100644
index 00000000..33d2cc54
--- /dev/null
+++ b/tools/pharos-dashboard/src/account/migrations/0002_auto_20161005_1201.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10 on 2016-10-05 12:01
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('account', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='userprofile',
+ name='full_name',
+ field=models.CharField(default='', max_length=100),
+ ),
+ migrations.AddField(
+ model_name='userprofile',
+ name='jira_url',
+ field=models.CharField(default='', max_length=100),
+ ),
+ ]
diff --git a/tools/pharos-dashboard/src/account/models.py b/tools/pharos-dashboard/src/account/models.py
index 621f6697..c2e99028 100644
--- a/tools/pharos-dashboard/src/account/models.py
+++ b/tools/pharos-dashboard/src/account/models.py
@@ -8,11 +8,9 @@
##############################################################################
-from django.db import models
-
from django.contrib.auth.models import User
+from django.db import models
-from dashboard.models import Resource
def upload_to(object, filename):
return object.user.username + '/' + filename
@@ -23,8 +21,15 @@ class UserProfile(models.Model):
ssh_public_key = models.FileField(upload_to=upload_to, null=True, blank=True)
pgp_public_key = models.FileField(upload_to=upload_to, null=True, blank=True)
company = models.CharField(max_length=200, blank=False)
+
oauth_token = models.CharField(max_length=1024, blank=False)
oauth_secret = models.CharField(max_length=1024, blank=False)
+ jira_url = models.CharField(max_length=100, default='')
+ full_name = models.CharField(max_length=100, default='')
+
class Meta:
db_table = 'user_profile'
+
+ def __str__(self):
+ return self.user.username
diff --git a/tools/pharos-dashboard/src/account/tasks.py b/tools/pharos-dashboard/src/account/tasks.py
new file mode 100644
index 00000000..bfb865dd
--- /dev/null
+++ b/tools/pharos-dashboard/src/account/tasks.py
@@ -0,0 +1,34 @@
+##############################################################################
+# Copyright (c) 2016 Max Breitenfeldt and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+
+from celery import shared_task
+from django.contrib.auth.models import User
+from jira import JIRAError
+
+from account.jira_util import get_jira
+
+
+@shared_task
+def sync_jira_accounts():
+ users = User.objects.all()
+ for user in users:
+ jira = get_jira(user)
+ try:
+ user_dict = jira.myself()
+ except JIRAError:
+ # User can be anonymous (local django admin account)
+ continue
+ user.email = user_dict['emailAddress']
+ user.userprofile.url = user_dict['self']
+ user.userprofile.full_name = user_dict['displayName']
+ print(user_dict)
+
+ user.userprofile.save()
+ user.save() \ No newline at end of file
diff --git a/tools/pharos-dashboard/src/account/tests/test_general.py b/tools/pharos-dashboard/src/account/tests/test_general.py
index 72e7ea11..e8f483b5 100644
--- a/tools/pharos-dashboard/src/account/tests/test_general.py
+++ b/tools/pharos-dashboard/src/account/tests/test_general.py
@@ -48,3 +48,13 @@ class AccountMiddlewareTestCase(TestCase):
self.user1profile.save()
self.client.get(url)
self.assertEqual(timezone.get_current_timezone_name(), 'Etc/Greenwich')
+
+ # if there is no profile for a user, it should be created
+ user2 = User.objects.create(username='user2')
+ user2.set_password('user2')
+ user2.save()
+ self.client.login(username='user2', password='user2')
+ self.client.get(url)
+ self.assertTrue(user2.userprofile)
+
+
diff --git a/tools/pharos-dashboard/src/account/views.py b/tools/pharos-dashboard/src/account/views.py
index 3b4269de..17fbdc3a 100644
--- a/tools/pharos-dashboard/src/account/views.py
+++ b/tools/pharos-dashboard/src/account/views.py
@@ -12,6 +12,7 @@ import os
import urllib
import oauth2 as oauth
+from django.conf import settings
from django.contrib import messages
from django.contrib.auth import logout, authenticate, login
from django.contrib.auth.decorators import login_required
@@ -19,17 +20,13 @@ from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils.decorators import method_decorator
-from django.views.generic import RedirectView
-from django.views.generic import TemplateView
-from django.views.generic import UpdateView
+from django.views.generic import RedirectView, TemplateView, UpdateView
from jira import JIRA
+from rest_framework.authtoken.models import Token
from account.forms import AccountSettingsForm
from account.jira_util import SignatureMethod_RSA_SHA1
from account.models import UserProfile
-from django.conf import settings
-
-consumer = oauth.Consumer(settings.OAUTH_CONSUMER_KEY, settings.OAUTH_CONSUMER_SECRET)
@method_decorator(login_required, name='dispatch')
@@ -46,22 +43,36 @@ class AccountSettingsView(UpdateView):
def get_object(self, queryset=None):
return self.request.user.userprofile
+ def get_context_data(self, **kwargs):
+ token, created = Token.objects.get_or_create(user=self.request.user)
+ context = super(AccountSettingsView, self).get_context_data(**kwargs)
+ context.update({'title': "Settings", 'token': token})
+ return context
+
class JiraLoginView(RedirectView):
def get_redirect_url(self, *args, **kwargs):
+ consumer = oauth.Consumer(settings.OAUTH_CONSUMER_KEY, settings.OAUTH_CONSUMER_SECRET)
client = oauth.Client(consumer)
client.set_signature_method(SignatureMethod_RSA_SHA1())
# Step 1. Get a request token from Jira.
- resp, content = client.request(settings.OAUTH_REQUEST_TOKEN_URL, "POST")
+ try:
+ resp, content = client.request(settings.OAUTH_REQUEST_TOKEN_URL, "POST")
+ except Exception as e:
+ messages.add_message(self.request, messages.ERROR,
+ 'Error: Connection to Jira failed. Please contact an Administrator')
+ return '/'
if resp['status'] != '200':
- raise Exception("Invalid response %s: %s" % (resp['status'], content))
+ messages.add_message(self.request, messages.ERROR,
+ 'Error: Connection to Jira failed. Please contact an Administrator')
+ return '/'
# Step 2. Store the request token in a session for later use.
self.request.session['request_token'] = dict(urllib.parse.parse_qsl(content.decode()))
# Step 3. Redirect the user to the authentication URL.
url = settings.OAUTH_AUTHORIZE_URL + '?oauth_token=' + \
- self.request.session['request_token']['oauth_token'] + \
+ self.request.session['request_token']['oauth_token'] + \
'&oauth_callback=' + settings.OAUTH_CALLBACK_URL
return url
@@ -75,14 +86,22 @@ class JiraLogoutView(LoginRequiredMixin, RedirectView):
class JiraAuthenticatedView(RedirectView):
def get_redirect_url(self, *args, **kwargs):
# Step 1. Use the request token in the session to build a new client.
+ consumer = oauth.Consumer(settings.OAUTH_CONSUMER_KEY, settings.OAUTH_CONSUMER_SECRET)
token = oauth.Token(self.request.session['request_token']['oauth_token'],
self.request.session['request_token']['oauth_token_secret'])
client = oauth.Client(consumer, token)
client.set_signature_method(SignatureMethod_RSA_SHA1())
# Step 2. Request the authorized access token from Jira.
- resp, content = client.request(settings.OAUTH_ACCESS_TOKEN_URL, "POST")
+ try:
+ resp, content = client.request(settings.OAUTH_ACCESS_TOKEN_URL, "POST")
+ except Exception as e:
+ messages.add_message(self.request, messages.ERROR,
+ 'Error: Connection to Jira failed. Please contact an Administrator')
+ return '/'
if resp['status'] != '200':
+ messages.add_message(self.request, messages.ERROR,
+ 'Error: Connection to Jira failed. Please contact an Administrator')
return '/'
access_token = dict(urllib.parse.parse_qsl(content.decode()))
@@ -122,6 +141,8 @@ class JiraAuthenticatedView(RedirectView):
# redirect user to settings page to complete profile
return url
+
+@method_decorator(login_required, name='dispatch')
class UserListView(TemplateView):
template_name = "account/user_list.html"