def _constructFilterForProjectSelection(self, survey, params): """Returns the filter needed for the Project selection view. Constructs a filter that returns all valid projects for which the current user is the mentor. Only for the projects in the program given by the survey's scope of course. For args see project_survey.View._constructFilterForProjectSelection(). """ from soc.logic.models.mentor import logic as mentor_logic survey_logic = params['logic'] user_entity = user_logic.getForCurrentAccount() # get the mentor entities for the current user and program fields = {'user': user_entity, 'program': survey_logic.getScope(survey), 'status': 'active'} mentor_entities = mentor_logic.getForFields(fields) # TODO: Ensure that this doesn't break when someone is a mentor for # a lot of organizations. fields = {'mentor': mentor_entities, 'status': 'accepted'} return fields
def checkIsNotParticipatingInProgramInScope(self, django_args): """Checks if the current user has no roles for the given program in django_args. Args: django_args: a dictionary with django's arguments Raises: AccessViolationResponse: if the current user has a student, mentor or org admin role for the given program. """ if not django_args.get('scope_path'): raise out_of_band.AccessViolation(message_fmt=DEF_PAGE_DENIED_MSG) program_entity = program_logic.getFromKeyNameOr404( django_args['scope_path']) user_entity = user_logic.getForCurrentAccount() filter = {'user': user_entity, 'scope': program_entity, 'status': 'active'} # check if the current user is already a student for this program student_role = student_logic.getForFields(filter, unique=True) if student_role: raise out_of_band.AccessViolation( message_fmt=DEF_ALREADY_PARTICIPATING_MSG) # fill the role_list with all the mentor and org admin roles for this user # role_list = [] filter = {'user': user_entity, 'program': program_entity, 'status': 'active'} mentor_role = mentor_logic.getForFields(filter, unique=True) if mentor_role: # the current user has a role for the given program raise out_of_band.AccessViolation( message_fmt=DEF_ALREADY_PARTICIPATING_MSG) org_admin_role = org_admin_logic.getForFields(filter, unique=True) if org_admin_role: # the current user has a role for the given program raise out_of_band.AccessViolation( message_fmt=DEF_ALREADY_PARTICIPATING_MSG) # no roles found, access granted return
def getMentorforProject(self, user, project): """Get Student Projects that are being mentored by the given User. params: user = survey taking user project = survey taker's student project """ from soc.logic.models.mentor import logic as mentor_logic import soc.models.mentor # TODO filter for accepted, midterm_passed, etc? # TODO this should be done a program basis not user user_mentors = mentor_logic.getForFields({'user': user}) if not user_mentors: return [] return set([project.mentor for project in sum( (list(mentor.student_projects.run()) for mentor in user_mentors), []) if project.key() == project.key()])
def checkRoleAndStatusForStudentProposal(self, django_args, allowed_roles, role_status, proposal_status): """Checks if the current user has access to the given proposal. Args: django_args: a dictionary with django's arguments allowed_roles: list with names for the roles allowed to pass access check role_status: list with states allowed for the role proposal_status: a list with states allowed for the proposal Raises: AccessViolationResponse: - If there is no proposal found - If the proposal is not in one of the required states. - If the user does not have any ofe the required roles """ self.checkIsUser(django_args) # bail out with 404 if no proposal is found proposal_entity = student_proposal_logic.getFromKeyFieldsOr404(django_args) if not proposal_entity.status in proposal_status: # this proposal can not be accessed at the moment raise out_of_band.AccessViolation( message_fmt=DEF_NO_ACTIVE_ENTITY_MSG) user_entity = self.user if 'proposer' in allowed_roles: # check if this proposal belongs to the current user student_entity = proposal_entity.scope if (user_entity.key() == student_entity.user.key()) and ( student_entity.status in role_status): return filter = {'user': user_entity, 'status': role_status} if 'host' in allowed_roles: # check if the current user is a host for this proposal's program filter['scope'] = proposal_entity.program if host_logic.getForFields(filter, unique=True): return if 'org_admin' in allowed_roles: # check if the current user is an admin for this proposal's org filter['scope'] = proposal_entity.org if org_admin_logic.getForFields(filter, unique=True): return if 'mentor' in allowed_roles: # check if the current user is a mentor for this proposal's org filter['scope'] = proposal_entity.org if mentor_logic.getForFields(filter, unique=True): return # no roles found, access denied raise out_of_band.AccessViolation( message_fmt=DEF_NEED_ROLE_MSG)