Merge "update the huawei's lab"
[pharos.git] / tools / pharos-dashboard / account / views.py
1 ##############################################################################
2 # Copyright (c) 2016 Max Breitenfeldt and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10
11 import os
12 import urllib
13
14 import oauth2 as oauth
15 from django.contrib import messages
16 from django.contrib.auth import logout, authenticate, login
17 from django.contrib.auth.decorators import login_required
18 from django.contrib.auth.mixins import LoginRequiredMixin
19 from django.contrib.auth.models import User
20 from django.urls import reverse
21 from django.utils.decorators import method_decorator
22 from django.views.generic import RedirectView
23 from django.views.generic import TemplateView
24 from django.views.generic import UpdateView
25 from jira import JIRA
26
27 from account.forms import AccountSettingsForm
28 from account.jira_util import SignatureMethod_RSA_SHA1
29 from account.models import UserProfile
30 from django.conf import settings
31
32 consumer = oauth.Consumer(settings.OAUTH_CONSUMER_KEY, settings.OAUTH_CONSUMER_SECRET)
33
34
35 @method_decorator(login_required, name='dispatch')
36 class AccountSettingsView(UpdateView):
37     model = UserProfile
38     form_class = AccountSettingsForm
39     template_name_suffix = '_update_form'
40
41     def get_success_url(self):
42         messages.add_message(self.request, messages.INFO,
43                              'Settings saved')
44         return '/'
45
46     def get_object(self, queryset=None):
47         return self.request.user.userprofile
48
49
50 class JiraLoginView(RedirectView):
51     def get_redirect_url(self, *args, **kwargs):
52         client = oauth.Client(consumer)
53         client.set_signature_method(SignatureMethod_RSA_SHA1())
54
55         # Step 1. Get a request token from Jira.
56         resp, content = client.request(settings.OAUTH_REQUEST_TOKEN_URL, "POST")
57         if resp['status'] != '200':
58             raise Exception("Invalid response %s: %s" % (resp['status'], content))
59
60         # Step 2. Store the request token in a session for later use.
61         self.request.session['request_token'] = dict(urllib.parse.parse_qsl(content.decode()))
62         # Step 3. Redirect the user to the authentication URL.
63         url = settings.OAUTH_AUTHORIZE_URL + '?oauth_token=' + \
64                 self.request.session['request_token']['oauth_token'] + \
65               '&oauth_callback=' + settings.OAUTH_CALLBACK_URL
66         return url
67
68
69 class JiraLogoutView(LoginRequiredMixin, RedirectView):
70     def get_redirect_url(self, *args, **kwargs):
71         logout(self.request)
72         return '/'
73
74
75 class JiraAuthenticatedView(RedirectView):
76     def get_redirect_url(self, *args, **kwargs):
77         # Step 1. Use the request token in the session to build a new client.
78         token = oauth.Token(self.request.session['request_token']['oauth_token'],
79                             self.request.session['request_token']['oauth_token_secret'])
80         client = oauth.Client(consumer, token)
81         client.set_signature_method(SignatureMethod_RSA_SHA1())
82
83         # Step 2. Request the authorized access token from Jira.
84         resp, content = client.request(settings.OAUTH_ACCESS_TOKEN_URL, "POST")
85         if resp['status'] != '200':
86             return '/'
87
88         access_token = dict(urllib.parse.parse_qsl(content.decode()))
89
90         module_dir = os.path.dirname(__file__)  # get current directory
91         with open(module_dir + '/rsa.pem', 'r') as f:
92             key_cert = f.read()
93
94         oauth_dict = {
95             'access_token': access_token['oauth_token'],
96             'access_token_secret': access_token['oauth_token_secret'],
97             'consumer_key': settings.OAUTH_CONSUMER_KEY,
98             'key_cert': key_cert
99         }
100
101         jira = JIRA(server=settings.JIRA_URL, oauth=oauth_dict)
102         username = jira.current_user()
103         url = '/'
104         # Step 3. Lookup the user or create them if they don't exist.
105         try:
106             user = User.objects.get(username=username)
107         except User.DoesNotExist:
108             # Save our permanent token and secret for later.
109             user = User.objects.create_user(username=username,
110                                             password=access_token['oauth_token_secret'])
111             profile = UserProfile()
112             profile.user = user
113             profile.save()
114             url = reverse('account:settings')
115         user.userprofile.oauth_token = access_token['oauth_token']
116         user.userprofile.oauth_secret = access_token['oauth_token_secret']
117         user.userprofile.save()
118         user.set_password(access_token['oauth_token_secret'])
119         user.save()
120         user = authenticate(username=username, password=access_token['oauth_token_secret'])
121         login(self.request, user)
122         # redirect user to settings page to complete profile
123         return url
124
125 class UserListView(TemplateView):
126     template_name = "account/user_list.html"
127
128     def get_context_data(self, **kwargs):
129         users = User.objects.all()
130         context = super(UserListView, self).get_context_data(**kwargs)
131         context.update({'title': "Dashboard Users", 'users': users})
132         return context