def new_assignment(request): if request.method == 'POST': post=request.POST user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) dueDate = post["duedate"] + "T" + post["duetime"] + "Z" dueDateUTC=datetime.strptime(dueDate,"%m/%d/%YT%H:%M %pZ").strftime("%Y-%m-%dT%H:%M:%SZ") result = education_service.add_assignment(post["classId"],post["name"],dueDateUTC) jsonContent = result.content.decode('utf8') assignment = json.loads(jsonContent) if post['status']=="assigned": education_service.publish_assignment(post["classId"],assignment["id"]) files= request.FILES.getlist("fileUpload") if files !=None: resourceFolderURL = education_service.get_Assignment_Resource_Folder_URL(post["classId"],assignment["id"])["value"] ids = getIds(resourceFolderURL) for file in files: driveFile = uploadFileToOneDrive(resourceFolderURL,file,education_service) resourceUrl = "https://graph.microsoft.com/v1.0/drives/" + ids[0] + "/items/" + driveFile["id"] education_service.add_assignment_resources(post["classId"],assignment["id"],driveFile["name"],resourceUrl) referer = request.META.get('HTTP_REFERER') if referer.find("?")==-1: referer +="?tab=assignments" return HttpResponseRedirect(referer)
def classes_next(request, school_id): nextlink = request.GET.get('nextLink') user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) #school = education_service.get_school(school_id) my_classes = education_service.get_my_classes(school_id) all_classes, classnextlink = education_service.get_classes(school_id, top=12, nextlink=nextlink) for c in all_classes: my_class = next((mc for mc in my_classes if c.id == mc.id), None) c.custom_data['is_my'] = my_class != None if my_class != None: c.members = my_class.members # my_section_list = [m.to_dict() for m in my_classes] ajax_result = {} ajax_result['classes'] = {} ajax_result['classes']['value'] = [{ 'id': c.id, 'is_my': c.custom_data['is_my'], 'display_name': c.display_name, 'code': c.code, 'teachers': [{ 'display_name': t.display_name } for t in c.teachers], 'term_name': c.term.display_name, 'term_start_time': c.term.start_date, 'term_end_time': c.term.end_date } for c in all_classes] ajax_result['classes']['next_link'] = classnextlink # ajax_result['MyClasss'] = my_section_list return JsonResponse(ajax_result, safe=False)
def create_local(request): user = AuthService.get_current_user(request) create_local_form = CreateLocalInfo() context = {'user': user, 'create_local_form': create_local_form} # POST /Link/CreateLocal if request.method == 'POST': create_local_form = CreateLocalInfo(request.POST) data = '' if create_local_form.is_valid(): data = create_local_form.clean() try: local_user = user_service.create(user.o365_user) except: errors = [] errors.append('Name %s is already taken.' % user.o365_email) errors.append("Email '%s' is already taken." % user.o365_email) context['errors'] = errors return render(request, 'link/createlocal.html', context) link_service.link(local_user, user.o365_user) user_service.update_favorite_color(data['FavoriteColor'], local_user.id) local_user = user_service.get_user(local_user.id) # reload local user auth_login(request, local_user) request.session[ 'Message'] = 'Your local account has been successfully linked to your Office 365 account.' return HttpResponseRedirect('/') # GET /Link/CreateLocal else: return render(request, 'link/createlocal.html', context)
def login_local(request): user = AuthService.get_current_user(request) login_local_form = LoginLocalInfo() context = {'user': user, 'login_local_form': login_local_form} # POST /Link/LoginLocal if request.method == 'POST': login_local_form = LoginLocalInfo(request.POST) if login_local_form.is_valid(): data = login_local_form.clean() email = data['Email'] password = data['Password'] local_user = auth_authenticate(username=email, password=password) if local_user: link_service.link(local_user, user.o365_user) auth_login(request, local_user) request.session[ 'Message'] = 'Your local account has been successfully linked to your Office 365 account.' return HttpResponseRedirect('/') else: context['errors'] = ['Invalid login attempt.'] return render(request, 'link/loginlocal.html', context) # GET /Link/LoginLocal else: local_user = user_service.get_user_by_email(user.o365_email) if local_user: link_service.link(local_user, user.o365_user) local_user = user_service.get_user( local_user.id) # reload local user auth_login(request, local_user) request.session[ 'Message'] = 'Your local account has been successfully linked to your Office 365 account.' return HttpResponseRedirect('/') else: return render(request, 'link/loginlocal.html', context)
def classes(request, school_id): user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) me = education_service.get_me() role = get_user_role(user, me) education_service = EducationService(user.tenant_id, token) school = education_service.get_school(school_id) my_classes = education_service.get_my_classes(school_id) all_classes, classesnextlink = education_service.get_classes(school_id, 12) for c in all_classes: my_class = next((mc for mc in my_classes if c.id == mc.id), None) c.custom_data['is_my'] = my_class != None if my_class != None: c.members = my_class.members context = { 'user': user, 'school': school, 'classesnextlink': classesnextlink, 'classes': all_classes, 'myclasses': my_classes, 'school_id': school_id, 'is_in_a_school': True, 'me': me, 'role':role } return render(request, 'schools/classes.html', context)
def get_submissions(request,class_id,assignment_id): user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) submissions = education_service.get_Submissions(class_id,assignment_id) ms_graph_service = MSGraphService(token) result=[] for submission in submissions: userId = submission.submittedBy["user"]["id"]; user = ms_graph_service.get_user_info(userId) resources= education_service.get_Submission_Resources(class_id,assignment_id,submission.id) array={} array["displayName"]=user["displayName"] array["submittedDateTime"] = submission.submittedDateTime resources_array=[] for resource in resources: resources_dict={} resources_dict["displayName"] = resource.resource["displayName"] resources_array.append(resources_dict) array["resources"]= resources_array result.append(array) return JsonResponse(result, safe=False)
def update_assignment(request): if request.method == 'POST': post=request.POST files=request.FILES user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) assignment = education_service.get_assignment(post["classId"],post["assignmentId"]) if assignment.status=='draft' and post['assignmentStatus']=='assigned': education_service.publish_assignment(post['classId'], post['assignmentId']) files= request.FILES.getlist("newResource") if files !=None: resourceFolderURL = education_service.get_Assignment_Resource_Folder_URL(post["classId"],post["assignmentId"])["value"] ids = getIds(resourceFolderURL) for file in files: driveFile = uploadFileToOneDrive(resourceFolderURL,file,education_service) resourceUrl = "https://graph.microsoft.com/v1.0/drives/" + ids[0] + "/items/" + driveFile["id"] education_service.add_assignment_resources(post["classId"],post["assignmentId"],driveFile["name"],resourceUrl) referer = request.META.get('HTTP_REFERER') if referer.find("?")==-1: referer +="?tab=assignments" return HttpResponseRedirect(referer)
def aboutme(request): user = AuthService.get_current_user(request) context = { 'user': user } login_as ="" if user.local_user.is_authenticated: context['show_color'] = user.local_user.is_authenticated context['colors'] = constant.favorite_colors context['favorite_color'] = user_service.get_favorite_color(user.user_id) if user.is_admin: login_as ="Admin" if not user.is_admin and user.o365_user is not None: token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) me = education_service.get_me() my_school_id = me.schools[0].id if me.is_teacher: login_as="Teacher" if me.is_student: login_as="Student" context['me'] = me context['groups'] = education_service.get_my_classes(my_school_id) else: context['groups'] = [] context['login_as'] = login_as context['role']=login_as return render(request, 'managements/aboutme.html', context)
def get_assignment_submission_resources(request,class_id,assignment_id): user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) assignemtnResources = education_service.get_Assignment_Resources(class_id,assignment_id) submissionResources = education_service.get_Assignment_Submissions_By_User(class_id,assignment_id,user.o365_user_id) result={} resourceArray=[] submissionResourcesArray=[] for resource in assignemtnResources: obj={} obj["id"]=resource.id obj["resource"]=resource.resource["displayName"] resourceArray.append(obj) result["resources"]=resourceArray; result["submissionId"]=submissionResources[0].id for resource in submissionResources: for item in resource.resources: obj={} obj["id"]=item["id"] obj["resource"]=item["resource"]["displayName"] submissionResourcesArray.append(obj) result["submissionResources"]=submissionResourcesArray; return JsonResponse(result, safe=False)
def admin(request): user = AuthService.get_current_user(request) context = { 'user': user, 'is_admin_consented': user_service.is_tenant_consented(user.tenant_id) } return render(request, 'admin/index.html', context)
def process_exception(self, request, exception): context = { 'user': AuthService.get_current_user(request), 'reason': str(exception) } if exception.__class__.__name__ == 'RefreshTokenException': return render(request, 'login0365required.html', context)
def process_code(request): AuthService.validate_state(request) code = request.POST.get('code') id_token = AuthService.get_id_token(request) o365_user_id = id_token.get('oid') tenant_id = id_token.get('tid') if link_service.is_linked(o365_user_id): request.session[ 'Error'] = 'Failed to link accounts. The Office 365 account %s is already linked to another local account.' % id_token.get( 'upn') return HttpResponseRedirect('/Link') redirect_uri = AuthService.get_redirect_uri(request, 'Link/ProcessCode') auth_result = token_service.get_token_with_code(code, redirect_uri, constant.Resources.MSGraph) token_service.cache_tokens(auth_result, o365_user_id) ms_graph_service = MSGraphService(auth_result.get('accessToken')) o365_user = ms_graph_service.get_o365_user(tenant_id) AuthService.set_o365_user(request, o365_user) user = AuthService.get_current_user(request) link_service.link(user.local_user, o365_user) request.session[ 'Message'] = 'Your local account has been successfully linked to your Office 365 account.' response = HttpResponseRedirect('/') response.set_cookie(constant.o365_username_cookie, o365_user.display_name) response.set_cookie(constant.o365_email_cookie, o365_user.email) return response
def add_coteacher(request, class_id, user_object_id): previousURL = request.META.get('HTTP_REFERER') user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) education_service.add_member(class_id,user_object_id) education_service.add_owner(class_id,user_object_id) return HttpResponseRedirect(previousURL)
def __call__(self, request): user = AuthService.get_current_user(request) if user.are_linked: if not Profile.objects.filter(id=user.user_id, o365UserId=user.o365_user_id): auth_logout(request) AuthService.set_o365_user(request, user.o365_user) return self.get_response(request)
def photo(request, user_object_id): user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) ms_graph_service = MSGraphService(token) user_photo = ms_graph_service.get_photo(user_object_id) if not user_photo: local_photo_path = settings.STATICFILES_DIRS[0] + '/Images/DefaultUserPhoto.jpg' local_photo_file = open(local_photo_path, 'rb') user_photo = local_photo_file.read() return HttpResponse(user_photo, content_type='image/jpeg')
def index(request): user = AuthService.get_current_user(request) if not user.is_authenticated: return HttpResponseRedirect('/Account/Login') if not user.are_linked: return HttpResponseRedirect('/Link') if user.is_admin and not user_service.is_tenant_consented(user.tenant_id): return HttpResponseRedirect('/Admin') else: return HttpResponseRedirect('/Schools')
def link(request): user = AuthService.get_current_user(request) context = {'user': user} if not user.are_linked and user.is_o365: local_user = user_service.get_user_by_email(user.o365_email) if local_user: context['local_existed'] = True context[ 'local_message'] = 'There is a local account: %s matching your O365 account.' % user.o365_email else: context['local_existed'] = False return render(request, 'link/index.html', context)
def unlink_account(request, link_id): if request.method == 'POST': link_service.remove_link(link_id) return HttpResponseRedirect('/Admin/LinkedAccounts') else: user = AuthService.get_current_user(request) link = link_service.get_link(link_id) context = { 'user': user, 'email': link['email'], 'o365Email': link['o365Email'] } return render(request, 'admin/unlinkaccount.html', context)
def get_assignment_resources(request,class_id,assignment_id): user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) resources = education_service.get_Assignment_Resources(class_id,assignment_id) result=[] for resource in resources: resourceArray={} resourceArray["id"]=resource.id resourceArray["resource"]=resource.resource["displayName"] result.append(resourceArray) return JsonResponse(result, safe=False)
def unconsent(request): user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.AADGraph, user.o365_user_id) aad_graph_service = AADGraphService(user.tenant_id, token) service_principal = aad_graph_service.get_service_principal() aad_graph_service.delete_service_principal(service_principal['objectId']) user_service.update_organization(user.tenant_id, False) link_service.remove_links(user.tenant_id) request.session['Message'] = 'Admin unconsented successfully!' return HttpResponseRedirect('/Admin')
def process_code(request): AuthService.validate_state(request) id_token = AuthService.get_id_token(request) tenant_id = id_token.get('tid') user_service.update_organization(tenant_id, True) message = 'Admin consented successfully!' user = AuthService.get_current_user(request) if user.is_authenticated: request.session['Message'] = message return HttpResponseRedirect('/Admin') else: return HttpResponseRedirect('/Admin/Consent?consented=true')
def consent(request): user = AuthService.get_current_user(request) extra_params = { 'scope': 'openid+profile', 'nonce': AuthService.get_random_string(), 'prompt': 'admin_consent' } if user.o365_user: extra_params['login_hint'] = user.o365_email o365_login_url = AuthService.get_authorization_url( request, 'code+id_token', 'Admin/ProcessCode', AuthService.get_random_string(), extra_params) return HttpResponseRedirect(o365_login_url)
def logoff(request): user = AuthService.get_current_user(request) AuthService.clear_o365_user(request) auth_logout(request) if not user.are_linked: return HttpResponseRedirect('/') else: scheme = request.scheme host = request.get_host() redirect_uri = scheme + '://' + host logoff_url = constant.log_out_url % (redirect_uri, redirect_uri) response = HttpResponseRedirect(logoff_url) response.set_cookie(constant.username_cookie, '') response.set_cookie(constant.email_cookie, '') return response
def add_app_role_assignments(request): user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.AADGraph, user.o365_user_id) aad_graph_service = AADGraphService(user.tenant_id, token) service_principal = aad_graph_service.get_service_principal() if not service_principal: request.session[ 'Error'] = 'Could not found the service principal. Please provdie the admin consent.' return HttpResponseRedirect('/Admin') count = aad_graph_service.add_app_role_assignments( service_principal['objectId'], service_principal['appDisplayName']) request.session[ "Message"] = 'User access was successfully enabled for %d user(s).' % count if count > 0 else 'User access was enabled for all users.' return HttpResponseRedirect("/Admin")
def schools(request): user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) me = education_service.get_me() schools = education_service.get_schools() for school in schools: school.custom_data['is_my'] = me.is_in_school(school.id) # sort schools: my school will be put to the top schools.sort(key=lambda s:s.display_name if me.is_in_school(s.id) else 'Z_' + s.display_name) role = get_user_role(user, me) context = { 'user': user, 'me': me, 'role':role, 'schools': schools } return render(request, 'schools/index.html', context)
def newAssignmentSubmissionResource(request): if request.method == 'POST': files= request.FILES.getlist("newResource") if len(files)!=0: post=request.POST user = AuthService.get_current_user(request) token = token_service.get_access_token(constant.Resources.MSGraph, user.o365_user_id) education_service = EducationService(user.tenant_id, token) submissions = education_service.get_Assignment_Submissions_By_User(post["classId"],post["assignmentId"],user.o365_user_id) if len(submissions)!=0: resourceFolderURL = submissions[0].resourcesFolderUrl ids = getIds(resourceFolderURL) for file in files: driveFile = uploadFileToOneDrive(resourceFolderURL,file,education_service) resourceUrl = "https://graph.microsoft.com/v1.0/drives/" + ids[0] + "/items/" + driveFile["id"] education_service.add_Submission_Resource(post["classId"],post["assignmentId"],driveFile["name"],resourceUrl,post["submissionId"]) referer = request.META.get('HTTP_REFERER') if referer.find("?")==-1: referer +="?tab=assignments" return HttpResponseRedirect(referer)
def logoff(request): user = AuthService.get_current_user(request) auth_logout(request) return HttpResponseRedirect('/')
def index(request): user = AuthService.get_current_user(request) if not user.is_authenticated: return HttpResponseRedirect('/Account/Login') else: return HttpResponseRedirect('/Schools')
def schools(request): user = AuthService.get_current_user(request) context = {'user': user} return render(request, 'schools/index.html', context)
def linked_accounts(request): user = AuthService.get_current_user(request) account_links = link_service.get_links(user.tenant_id) context = {'user': user, 'account_links': account_links} return render(request, 'admin/linkedaccounts.html', context)