def test_update_template(self, client, fake_auth):
        """Authorized user can edit a template."""
        user = AuthorizedUser.find_by_uid(coe_advisor_read_write_uid)
        fake_auth.login(user.uid)

        template = DegreeProgressTemplate.create(
            advisor_dept_codes=get_dept_codes(user),
            created_by=user.id,
            degree_name='Boogie Down Productions',
        )
        for index in (1, 2, 3):
            DegreeProgressUnitRequirement.create(
                created_by=user.id,
                min_units=index,
                name=f'Unit Requirement #{index}',
                template_id=template.id,
            )

        updated_name = 'KRS One'
        api_json = self._api_clone_template(client=client,
                                            name=updated_name,
                                            template_id=template.id)
        assert api_json['id'] != template.id
        assert api_json['name'] == updated_name
        assert len(api_json['unitRequirements']) == 3
예제 #2
0
 def _get_api_json(cls, user=None):
     calnet_profile = None
     departments = []
     is_asc = False
     is_coe = False
     if user:
         calnet_profile = calnet.get_calnet_user_for_uid(
             app,
             user.uid,
             force_feed=False,
             skip_expired_users=True,
         )
         for m in user.department_memberships:
             dept_code = m.university_dept.dept_code
             departments.append({
                 'code':
                 dept_code,
                 'name':
                 BERKELEY_DEPT_CODE_TO_NAME[dept_code] or dept_code,
                 'role':
                 get_dept_role(m),
                 'isAdvisor':
                 m.is_advisor,
                 'isDirector':
                 m.is_director,
             })
         dept_codes = get_dept_codes(user) if user else []
         is_asc = 'UWASC' in dept_codes
         is_coe = 'COENG' in dept_codes
     is_active = False
     if user:
         if not calnet_profile:
             is_active = False
         elif user.is_admin:
             is_active = True
         elif len(user.department_memberships):
             for m in user.department_memberships:
                 is_active = m.is_advisor or m.is_director
                 if is_active:
                     break
     is_admin = user and user.is_admin
     return {
         **(calnet_profile or {}),
         **{
             'id': user and user.id,
             'canViewAsc': is_asc or is_admin,
             'canViewCoe': is_coe or is_admin,
             'departments': departments,
             'isActive': is_active,
             'isAdmin': is_admin,
             'isAnonymous': not is_active,
             'isAsc': is_asc,
             'isAuthenticated': is_active,
             'isCoe': is_coe,
             'inDemoMode': user and user.in_demo_mode,
             'uid': user and user.uid,
         },
     }
예제 #3
0
def _get_coe_profiles():
    users = list(
        filter(lambda user: '******' in get_dept_codes(user),
               AuthorizedUser.query.all()))
    profiles = []
    for user in authorized_users_api_feed(users):
        uid = user['uid']
        first_name = user.get('firstName')
        last_name = user.get('lastName')
        name = f'{first_name} {last_name}' if first_name or last_name else uid
        profiles.append({'name': name, 'value': uid})
    return sorted(profiles, key=lambda p: p['name'])
예제 #4
0
def is_coe_authorized():
    return current_user.is_admin or 'COENG' in get_dept_codes(current_user)
예제 #5
0
def is_asc_authorized():
    return current_user.is_admin or 'UWASC' in get_dept_codes(current_user)
예제 #6
0
    def to_api_json(
        self,
        order_by=None,
        offset=0,
        limit=50,
        include_students=True,
        include_profiles=False,
        include_alerts_for_uid=None,
    ):
        c = self.filter_criteria
        c = c if isinstance(c, dict) else json.loads(c)
        advisor_ldap_uids = util.get(c, 'advisorLdapUids')
        if not isinstance(advisor_ldap_uids, list):
            advisor_ldap_uids = [advisor_ldap_uids
                                 ] if advisor_ldap_uids else None
        cohort_name = self.label
        cohort_json = {
            'id': self.id,
            'code': self.id,
            'label': cohort_name,
            'name': cohort_name,
            'owners': [user.uid for user in self.owners],
        }
        coe_prep_statuses = c.get('coePrepStatuses')
        ethnicities = c.get('ethnicities')
        genders = c.get('genders')
        gpa_ranges = c.get('gpaRanges')
        group_codes = c.get('groupCodes')
        in_intensive_cohort = util.to_bool_or_none(c.get('inIntensiveCohort'))
        is_inactive_asc = util.to_bool_or_none(c.get('isInactiveAsc'))
        last_name_range = c.get('lastNameRange')
        levels = c.get('levels')
        majors = c.get('majors')
        team_groups = athletics.get_team_groups(
            group_codes) if group_codes else []
        underrepresented = util.to_bool_or_none(c.get('underrepresented'))
        unit_ranges = c.get('unitRanges')
        cohort_json.update({
            'filterCriteria': {
                'advisorLdapUids': advisor_ldap_uids,
                'coePrepStatuses': coe_prep_statuses,
                'ethnicities': ethnicities,
                'genders': genders,
                'gpaRanges': gpa_ranges,
                'groupCodes': group_codes,
                'inIntensiveCohort': in_intensive_cohort,
                'isInactiveAsc': is_inactive_asc,
                'lastNameRange': last_name_range,
                'levels': levels,
                'majors': majors,
                'unitRanges': unit_ranges,
                'underrepresented': underrepresented,
            },
            'teamGroups': team_groups,
        })

        if not include_students and not include_alerts_for_uid and self.student_count is not None:
            # No need for a students query; return the database-stashed student count.
            cohort_json.update({
                'totalStudentCount': self.student_count,
            })
            return cohort_json
        owner = self.owners[0] if len(self.owners) else None
        if owner and 'UWASC' in get_dept_codes(owner):
            is_active_asc = not is_inactive_asc
        else:
            is_active_asc = None if is_inactive_asc is None else not is_inactive_asc
        sids_only = not include_students
        results = query_students(
            advisor_ldap_uids=advisor_ldap_uids,
            coe_prep_statuses=coe_prep_statuses,
            ethnicities=ethnicities,
            genders=genders,
            gpa_ranges=gpa_ranges,
            group_codes=group_codes,
            in_intensive_cohort=in_intensive_cohort,
            include_profiles=(include_students and include_profiles),
            is_active_asc=is_active_asc,
            last_name_range=last_name_range,
            levels=levels,
            limit=limit,
            majors=majors,
            offset=offset,
            order_by=order_by,
            sids_only=sids_only,
            underrepresented=underrepresented,
            unit_ranges=unit_ranges,
        )
        if results:
            # If the cohort is newly created or a cache refresh is underway, store the student count in the database
            # to save future queries.
            if self.student_count is None:
                self.update_student_count(results['totalStudentCount'])
            cohort_json.update({
                'totalStudentCount':
                results['totalStudentCount'],
            })
            if include_students:
                cohort_json.update({
                    'students': results['students'],
                })
            if include_alerts_for_uid:
                alert_counts = Alert.include_alert_counts_for_students(
                    viewer_uid=include_alerts_for_uid, cohort=results)
                cohort_json.update({
                    'alerts': alert_counts,
                })
        return cohort_json
예제 #7
0
 def test_zero_dept_codes(self, admin_user, unauthorized_user):
     assert berkeley.get_dept_codes(None) is None
     assert berkeley.get_dept_codes(admin_user) == []
     assert not berkeley.get_dept_codes(unauthorized_user)
예제 #8
0
 def test_asc_dept_codes(self, asc_advisor, coe_advisor):
     assert berkeley.get_dept_codes(asc_advisor) == ['UWASC']
     assert berkeley.get_dept_codes(coe_advisor) == ['COENG']