Exemplo n.º 1
0
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)
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
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)
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
 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)
Exemplo n.º 12
0
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
Exemplo n.º 13
0
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)
Exemplo n.º 14
0
 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)
Exemplo n.º 15
0
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')
Exemplo n.º 16
0
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')
Exemplo n.º 17
0
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)
Exemplo n.º 18
0
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)
Exemplo n.º 19
0
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)
Exemplo n.º 20
0
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')
Exemplo n.º 21
0
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')
Exemplo n.º 22
0
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)
Exemplo n.º 23
0
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
Exemplo n.º 24
0
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")
Exemplo n.º 25
0
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)
Exemplo n.º 26
0
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)
Exemplo n.º 27
0
def logoff(request):
    user = AuthService.get_current_user(request)
    auth_logout(request)
    return HttpResponseRedirect('/')
Exemplo n.º 28
0
def index(request):
    user = AuthService.get_current_user(request)
    if not user.is_authenticated:
        return HttpResponseRedirect('/Account/Login')
    else:
        return HttpResponseRedirect('/Schools')
Exemplo n.º 29
0
def schools(request):
    user = AuthService.get_current_user(request)

    context = {'user': user}
    return render(request, 'schools/index.html', context)
Exemplo n.º 30
0
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)