def authorized_users_api_feed(users, sort_by='lastName'): if not users: return () calnet_users = calnet.get_calnet_users_for_uids(app, [u.uid for u in users]) profiles = [] for user in users: profile = calnet_users[user.uid] if not profile: continue profile['name'] = ((profile.get('firstName') or '') + ' ' + (profile.get('lastName') or '')).strip() profile.update({ 'id': user.id, 'isAdmin': user.is_admin, 'departments': {}, }) for m in user.department_memberships: profile['departments'].update({ m.university_dept.dept_code: { 'isAdvisor': m.is_advisor, 'isDirector': m.is_director, }, }) profiles.append(profile) return sorted(profiles, key=lambda p: p.get(sort_by) or '')
def user_search(): snippet = request.get_json().get('snippet', '').strip() if snippet: search_by_uid = re.match(r'\d+', snippet) if search_by_uid: users = AuthorizedUser.users_with_uid_like(snippet, include_deleted=True) else: users = AuthorizedUser.get_all_active_users(include_deleted=True) users = list( calnet.get_calnet_users_for_uids(app, [u.uid for u in users]).values()) if not search_by_uid: any_ = r'.*' pattern = re.compile(any_ + any_.join(snippet.split()) + any_, re.IGNORECASE) users = list( filter(lambda u: u.get('name') and pattern.match(u['name']), users)) else: users = [] def _label(user): name = user['name'] return f"{name} ({user['uid']})" if name else user['uid'] return tolerant_jsonify([{ 'label': _label(u), 'uid': u['uid'] } for u in users])
def refresh_calnet_attributes(): from boac.merged import calnet from boac.models.authorized_user import AuthorizedUser from boac.models import json_cache active_uids = {u.uid for u in AuthorizedUser.get_all_active_users()} json_cache.clear('calnet_user_for_uid_%') new_attrs = calnet.get_calnet_users_for_uids(app, active_uids) app.logger.info(f'Cached {len(new_attrs)} CalNet records for {len(active_uids)} active users')
def get_coe_profiles(): users = list( filter(lambda _user: '******' in _get_dept_codes(_user), AuthorizedUser.get_all_active_users())) calnet_users = get_calnet_users_for_uids(app, [u.uid for u in users]) profiles = [] for user in users: uid = user.uid calnet_user = calnet_users[uid] first_name = calnet_user.get('firstName') last_name = calnet_user.get('lastName') name = f'{first_name} {last_name}' if first_name or last_name else f'UID: {uid}' profiles.append({'name': name, 'value': uid}) return sorted(profiles, key=lambda p: p['name'])
def all_cohorts(): scope = get_query_scope(current_user) uids = AuthorizedUser.get_all_uids_in_scope(scope) cohorts_per_uid = dict((uid, []) for uid in uids) for cohort in CohortFilter.get_cohorts_owned_by_uids(uids): for uid in cohort['owners']: cohorts_per_uid[uid].append(cohort) api_json = [] for uid, user in calnet.get_calnet_users_for_uids(app, uids).items(): cohorts = cohorts_per_uid[uid] api_json.append({ 'user': user, 'cohorts': sorted(cohorts, key=lambda c: c['name']), }) api_json = sorted(api_json, key=lambda v: v['user']['name']) return tolerant_jsonify(api_json)
def all_curated_groups(): scope = get_query_scope(current_user) uids = AuthorizedUser.get_all_uids_in_scope(scope) groups_per_uid = dict((uid, []) for uid in uids) for group in CuratedGroup.get_groups_owned_by_uids(uids=uids): groups_per_uid[group['ownerUid']].append(group) api_json = [] for uid, user in calnet.get_calnet_users_for_uids(app, uids).items(): groups = groups_per_uid[uid] api_json.append({ 'user': user, 'groups': sorted(groups, key=lambda g: g['name']), }) api_json = sorted( api_json, key=lambda v: v['user']['name'] or f"UID: {v['user']['uid']}") return tolerant_jsonify(api_json)
def get_degree_checks(uid): sid = get_sid_by_uid(uid) if sid: degrees = DegreeProgressTemplate.find_by_sid(student_sid=sid) uids = list( set([d['createdByUid'] for d in degrees] + [d['updatedByUid'] for d in degrees])) calnet_users_by_uid = calnet.get_calnet_users_for_uids(app, uids) for degree in degrees: def _get_name(uid): return calnet_users_by_uid[uid][ 'name'] if uid in calnet_users_by_uid else None degree['createdByName'] = _get_name(degree['createdByUid']) degree['updatedByName'] = _get_name(degree['updatedByUid']) return tolerant_jsonify(degrees) else: raise ResourceNotFoundError('Student not found')
def all_cohorts(): scope = get_query_scope(current_user) uids = AuthorizedUser.get_all_uids_in_scope(scope) cohorts_per_uid = dict((uid, []) for uid in uids) domain = get_param(request.args, 'domain', 'default') if is_unauthorized_domain(domain): raise ForbiddenRequestError( f'You are unauthorized to query the \'{domain}\' domain') for cohort in CohortFilter.get_cohorts_owned_by_uids(uids, domain=domain): cohorts_per_uid[cohort['ownerUid']].append(cohort) api_json = [] for uid, user in calnet.get_calnet_users_for_uids(app, uids).items(): cohorts = cohorts_per_uid[uid] api_json.append({ 'user': user, 'cohorts': sorted(cohorts, key=lambda c: c['name']), }) api_json = sorted( api_json, key=lambda v: v['user']['name'] or f"UID: {v['user']['uid']}") return tolerant_jsonify(api_json)
def authorized_users_api_feed(users, sort_by=None, sort_descending=False): if not users: return () calnet_users = calnet.get_calnet_users_for_uids(app, [u.uid for u in users]) profiles = [] for user in users: profile = calnet_users[user.uid] if not profile: continue if not profile.get('name'): profile['name'] = ((profile.get('firstName') or '') + ' ' + (profile.get('lastName') or '')).strip() degree_progress_permission = user.degree_progress_permission if app.config['FEATURE_FLAG_DEGREE_CHECK'] else None profile.update({ 'id': user.id, 'isAdmin': user.is_admin, 'isBlocked': user.is_blocked, 'canAccessAdvisingData': user.can_access_advising_data, 'canAccessCanvasData': user.can_access_canvas_data, 'canEditDegreeProgress': degree_progress_permission == 'read_write' or user.is_admin, 'canReadDegreeProgress': degree_progress_permission in ['read', 'read_write'] or user.is_admin, 'degreeProgressPermission': degree_progress_permission, 'deletedAt': _isoformat(user.deleted_at), 'departments': [], }) for m in user.department_memberships: profile['departments'].append({ 'code': m.university_dept.dept_code, 'name': m.university_dept.dept_name, 'role': m.role, 'automateMembership': m.automate_membership, }) profile['dropInAdvisorStatus'] = [d.to_api_json() for d in user.drop_in_departments] profile['sameDayAdvisorStatus'] = [d.to_api_json() for d in user.same_day_departments] user_login = UserLogin.last_login(user.uid) profile['lastLogin'] = _isoformat(user_login.created_at) if user_login else None profiles.append(profile) sort_by = sort_by or 'lastName' return sorted(profiles, key=lambda p: (p.get(sort_by) is None, p.get(sort_by)), reverse=sort_descending)
def authorized_users_api_feed(users, sort_by='lastName'): if not users: return () calnet_users = calnet.get_calnet_users_for_uids(app, [u.uid for u in users]) profiles = [] for user in users: profile = calnet_users[user.uid] if not profile: continue profile['name'] = ((profile.get('firstName') or '') + ' ' + (profile.get('lastName') or '')).strip() profile.update({ 'id': user.id, 'isAdmin': user.is_admin, 'isBlocked': user.is_blocked, 'canAccessCanvasData': user.can_access_canvas_data, 'deletedAt': _isoformat(user.deleted_at), 'departments': {}, }) for m in user.department_memberships: profile['departments'].update({ m.university_dept.dept_code: { 'deptName': m.university_dept.dept_name, 'isAdvisor': m.is_advisor, 'isDirector': m.is_director, 'isScheduler': m.is_scheduler, 'automateMembership': m.automate_membership, }, }) if user.drop_in_departments: profile['dropInAdvisorStatus'] = [ d.to_api_json() for d in user.drop_in_departments ] profiles.append(profile) return sorted(profiles, key=lambda p: p.get(sort_by) or '')