• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

uw-it-aca / canvas-sis-provisioner / 4147136751

pending completion
4147136751

Pull #754

github

GitHub
Merge f4e8d5f13 into 58b7dd6e7
Pull Request #754: Develop

128 of 128 new or added lines in 6 files covered. (100.0%)

4322 of 7781 relevant lines covered (55.55%)

0.56 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.05
/sis_provisioner/views/admin.py
1
# Copyright 2023 UW-IT, University of Washington
2
# SPDX-License-Identifier: Apache-2.0
3

4

5
from django.conf import settings
1✔
6
from django.shortcuts import render
1✔
7
from django.http import HttpResponse
1✔
8
from django.utils.decorators import method_decorator
1✔
9
from django.views import View
1✔
10
from sis_provisioner.dao.user import is_group_admin, valid_net_id, valid_reg_id
1✔
11
from sis_provisioner.dao.term import get_current_active_term
1✔
12
from sis_provisioner.models.admin import Admin
1✔
13
from restclients_core.exceptions import DataFailureException
1✔
14
from uw_saml.decorators import group_required
1✔
15
from uw_saml.utils import get_user, is_member_of_group
1✔
16
from logging import getLogger
1✔
17
import json
1✔
18

19
logger = getLogger(__name__)
1✔
20

21

22
def can_view_source_data(request, service=None, url=None):
1✔
23
    return is_member_of_group(request, settings.RESTCLIENTS_ADMIN_GROUP)
1✔
24

25

26
@method_decorator(group_required(settings.CANVAS_MANAGER_ADMIN_GROUP),
1✔
27
                  name='dispatch')
28
class AdminView(View):
1✔
29
    def get(self, request, *args, **kwargs):
1✔
30
        return render(request, self.template_name, self._params(request))
×
31

32
    def _params(self, request):
1✔
33
        try:
1✔
34
            term = get_current_active_term()
1✔
35
            curr_year = term.year
×
36
            curr_quarter = term.quarter
×
37
        except DataFailureException as ex:
1✔
38
            logger.info('GET active term failed: {}'.format(ex))
1✔
39
            curr_year = ''
1✔
40
            curr_quarter = ''
1✔
41

42
        return {
1✔
43
            'EVENT_UPDATE_FREQ': getattr(
44
                settings, 'ADMIN_EVENT_GRAPH_FREQ', 10),
45
            'IMPORT_UPDATE_FREQ': getattr(
46
                settings, 'ADMIN_IMPORT_STATUS_FREQ', 30),
47
            'CURRENT_QUARTER': curr_quarter,
48
            'CURRENT_YEAR': curr_year,
49
            'can_manage_admin_group': self.can_manage_admin_group(request),
50
            'can_view_restclients': self.can_view_source_data(request),
51
            'can_manage_jobs': self.can_manage_jobs(request),
52
            'can_manage_external_tools': self.can_manage_external_tools(
53
                request),
54
            'can_terminate_user_sessions': self.can_terminate_user_sessions(
55
                request),
56
            'admin_group': settings.CANVAS_MANAGER_ADMIN_GROUP,
57
        }
58

59
    @staticmethod
1✔
60
    def can_view_source_data(request, service=None, url=None):
1✔
61
        return can_view_source_data(request, service=service, url=url)
1✔
62

63
    @staticmethod
1✔
64
    def can_manage_admin_group(request):
1✔
65
        return is_group_admin(
1✔
66
            settings.CANVAS_MANAGER_ADMIN_GROUP, get_user(request))
67

68
    @staticmethod
1✔
69
    def can_manage_jobs(request):
1✔
70
        return Admin.objects.is_account_admin(get_user(request))
1✔
71

72
    @staticmethod
1✔
73
    def can_manage_external_tools(request):
1✔
74
        return Admin.objects.is_account_admin(get_user(request))
1✔
75

76
    @staticmethod
1✔
77
    def can_terminate_user_sessions(request):
1✔
78
        return is_group_admin(
1✔
79
            settings.CANVAS_MANAGER_ADMIN_GROUP, get_user(request))
80

81
    @staticmethod
1✔
82
    def can_merge_users(request):
1✔
83
        return is_group_admin(
×
84
            settings.CANVAS_MANAGER_ADMIN_GROUP, get_user(request))
85

86

87
class ImportStatus(AdminView):
1✔
88
    template_name = 'canvas_admin/status.html'
1✔
89

90

91
class ManageCourses(AdminView):
1✔
92
    template_name = 'canvas_admin/courses.html'
1✔
93

94

95
class ManageUsers(AdminView):
1✔
96
    template_name = 'canvas_admin/users.html'
1✔
97

98

99
class ManageGroups(AdminView):
1✔
100
    template_name = 'canvas_admin/groups.html'
1✔
101

102

103
class ManageAdmins(AdminView):
1✔
104
    template_name = 'canvas_admin/admins.html'
1✔
105

106

107
class ManageJobs(AdminView):
1✔
108
    template_name = 'canvas_admin/jobs.html'
1✔
109

110

111
class ManageExternalTools(AdminView):
1✔
112
    template_name = 'canvas_admin/external_tools.html'
1✔
113

114

115
class RESTDispatch(AdminView):
1✔
116
    @staticmethod
1✔
117
    def error_response(status, message='', content={}):
1✔
118
        content['error'] = '{}'.format(message)
1✔
119
        return HttpResponse(json.dumps(content),
1✔
120
                            status=status,
121
                            content_type='application/json')
122

123
    @staticmethod
1✔
124
    def json_response(content='', status=200):
1✔
125
        return HttpResponse(json.dumps(content, sort_keys=True),
1✔
126
                            status=status,
127
                            content_type='application/json')
128

129
    @staticmethod
1✔
130
    def regid_from_request(data):
1✔
131
        regid = data.get('reg_id', '').strip().upper()
1✔
132
        valid_reg_id(regid)
1✔
133
        return regid
1✔
134

135
    @staticmethod
1✔
136
    def netid_from_request(data):
1✔
137
        netid = data.get('net_id', '').strip().lower()
1✔
138
        valid_net_id(netid)
1✔
139
        return netid
1✔
140

141

142
class OpenRESTDispatch(View):
1✔
143
    @staticmethod
1✔
144
    def error_response(status, message='', content={}):
1✔
145
        content['error'] = '{}'.format(message)
×
146
        return HttpResponse(json.dumps(content),
×
147
                            status=status,
148
                            content_type='application/json')
149

150
    @staticmethod
1✔
151
    def json_response(content='', status=200):
1✔
152
        return HttpResponse(json.dumps(content, sort_keys=True),
×
153
                            status=status,
154
                            content_type='application/json')
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc