diff --git a/README.md b/README.md index 3c15a4c..f7f41f4 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ Here's what the details of your app registration should look like when you are d 1. Open the `.\tutorial\authhelper.py` file. 1. Replace `YOUR APP ID HERE` with the **Application Id** from the registration you just created. 1. Replace `YOUR APP PASSWORD HERE` with the password you copied earlier. +1. Install dependencies by entering `pip install -r requirements.txt` at the command prompt. +1. Run migrations by entering `python manage.py migrate` from the command prompt. 1. Run the project by entering `python manage.py runserver` from the command prompt. ## Copyright ## diff --git a/python_tutorial/settings.py b/python_tutorial/settings.py index f3dd25c..a8402ed 100644 --- a/python_tutorial/settings.py +++ b/python_tutorial/settings.py @@ -41,12 +41,11 @@ 'tutorial', ) -MIDDLEWARE_CLASSES = ( +MIDDLEWARE = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) diff --git a/python_tutorial/urls.py b/python_tutorial/urls.py index afabbf0..35a4fec 100644 --- a/python_tutorial/urls.py +++ b/python_tutorial/urls.py @@ -7,5 +7,5 @@ url(r'^$', views.home, name='home'), # Defer any URLS to the /tutorial directory to the tutorial app url(r'^tutorial/', include('tutorial.urls', namespace='tutorial')), - url(r'^admin/', include(admin.site.urls)), + url(r'^admin/', admin.site.urls), ] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f44ace2 Binary files /dev/null and b/requirements.txt differ diff --git a/tutorial/outlookservice.py b/tutorial/outlookservice.py index 2f2f57b..d5f9431 100644 --- a/tutorial/outlookservice.py +++ b/tutorial/outlookservice.py @@ -6,12 +6,11 @@ graph_endpoint = 'https://graph.microsoft.com/v1.0{0}' # Generic API Sending -def make_api_call(method, url, token, user_email, payload = None, parameters = None): +def make_api_call(method, url, token, payload = None, parameters = None): # Send these headers with all API calls headers = { 'User-Agent' : 'python_tutorial/1.0', 'Authorization' : 'Bearer {0}'.format(token), - 'Accept' : 'application/json', - 'X-AnchorMailbox' : user_email } + 'Accept' : 'application/json' } # Use these headers to instrument calls. Makes it easier # to correlate requests and responses in case of problems @@ -51,7 +50,7 @@ def get_me(access_token): else: return "{0}: {1}".format(r.status_code, r.text) -def get_my_messages(access_token, user_email): +def get_my_messages(access_token): get_messages_url = graph_endpoint.format('/me/mailfolders/inbox/messages') # Use OData query parameters to control the results @@ -62,14 +61,14 @@ def get_my_messages(access_token, user_email): '$select': 'receivedDateTime,subject,from', '$orderby': 'receivedDateTime DESC'} - r = make_api_call('GET', get_messages_url, access_token, user_email, parameters = query_parameters) + r = make_api_call('GET', get_messages_url, access_token, parameters = query_parameters) if (r.status_code == requests.codes.ok): return r.json() else: return "{0}: {1}".format(r.status_code, r.text) -def get_my_events(access_token, user_email): +def get_my_events(access_token): get_events_url = graph_endpoint.format('/me/events') # Use OData query parameters to control the results @@ -80,14 +79,14 @@ def get_my_events(access_token, user_email): '$select': 'subject,start,end', '$orderby': 'start/dateTime ASC'} - r = make_api_call('GET', get_events_url, access_token, user_email, parameters = query_parameters) + r = make_api_call('GET', get_events_url, access_token, parameters = query_parameters) if (r.status_code == requests.codes.ok): return r.json() else: return "{0}: {1}".format(r.status_code, r.text) -def get_my_contacts(access_token, user_email): +def get_my_contacts(access_token): get_contacts_url = graph_endpoint.format('/me/contacts') # Use OData query parameters to control the results @@ -98,7 +97,7 @@ def get_my_contacts(access_token, user_email): '$select': 'givenName,surname,emailAddresses', '$orderby': 'givenName ASC'} - r = make_api_call('GET', get_contacts_url, access_token, user_email, parameters = query_parameters) + r = make_api_call('GET', get_contacts_url, access_token, parameters = query_parameters) if (r.status_code == requests.codes.ok): return r.json() diff --git a/tutorial/urls.py b/tutorial/urls.py index 9551064..22cce20 100644 --- a/tutorial/urls.py +++ b/tutorial/urls.py @@ -2,6 +2,7 @@ from django.conf.urls import url from tutorial import views +app_name = 'tutorial' urlpatterns = [ # The home view ('/tutorial/') url(r'^$', views.home, name='home'), diff --git a/tutorial/views.py b/tutorial/views.py index 70e494b..7b664d6 100644 --- a/tutorial/views.py +++ b/tutorial/views.py @@ -1,7 +1,7 @@ # Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE.txt in the project root for license information. from django.shortcuts import render from django.http import HttpResponse, HttpResponseRedirect -from django.core.urlresolvers import reverse +from django.urls import reverse from tutorial.authhelper import get_signin_url, get_token_from_code, get_access_token from tutorial.outlookservice import get_me, get_my_messages, get_my_events, get_my_contacts import time @@ -33,39 +33,35 @@ def gettoken(request): request.session['access_token'] = access_token request.session['refresh_token'] = refresh_token request.session['token_expires'] = expiration - request.session['user_email'] = user['mail'] return HttpResponseRedirect(reverse('tutorial:mail')) def mail(request): access_token = get_access_token(request, request.build_absolute_uri(reverse('tutorial:gettoken'))) - user_email = request.session['user_email'] # If there is no token in the session, redirect to home if not access_token: return HttpResponseRedirect(reverse('tutorial:home')) else: - messages = get_my_messages(access_token, user_email) + messages = get_my_messages(access_token) context = { 'messages': messages['value'] } return render(request, 'tutorial/mail.html', context) def events(request): access_token = get_access_token(request, request.build_absolute_uri(reverse('tutorial:gettoken'))) - user_email = request.session['user_email'] # If there is no token in the session, redirect to home if not access_token: return HttpResponseRedirect(reverse('tutorial:home')) else: - events = get_my_events(access_token, user_email) + events = get_my_events(access_token) context = { 'events': events['value'] } return render(request, 'tutorial/events.html', context) def contacts(request): access_token = get_access_token(request, request.build_absolute_uri(reverse('tutorial:gettoken'))) - user_email = request.session['user_email'] # If there is no token in the session, redirect to home if not access_token: return HttpResponseRedirect(reverse('tutorial:home')) else: - contacts = get_my_contacts(access_token, user_email) + contacts = get_my_contacts(access_token) context = { 'contacts': contacts['value'] } return render(request, 'tutorial/contacts.html', context) \ No newline at end of file