def get_initial(self): """Default with trip creator among leaders.""" initial = super().get_initial().copy() # It's possible for WSC to create trips while not being a leader if perm_utils.is_leader(self.request.user): initial['leaders'] = [self.request.participant] return initial
def render_to_response(self, context, **response_kwargs): user_is_leader = perm_utils.is_leader(self.request.user) return JsonResponse({ 'leaders': [ leader for leader in self.describe_leaders( with_ratings=user_is_leader) ] })
def get_context_data(self, **kwargs): context = super().get_context_data() trip = self.object context['leader_on_trip'] = perm_utils.leader_on_trip( self.request.participant, trip, True) context['can_admin'] = (context['leader_on_trip'] or perm_utils.chair_or_admin( self.request.user, trip.activity)) if context['can_admin'] or perm_utils.is_leader(self.request.user): context['rentals_by_par'] = list(self.rentals_by_participant(trip)) return context
def get_context_data(self, **kwargs): context = super().get_context_data() trip = self.object context['leader_on_trip'] = perm_utils.leader_on_trip( self.request.participant, trip, True) context['can_admin'] = context[ 'leader_on_trip'] or perm_utils.chair_or_admin( self.request.user, trip.required_activity_enum()) context['can_see_rentals'] = context[ 'can_admin'] or perm_utils.is_leader(self.request.user) if context['can_admin'] or perm_utils.is_leader(self.request.user): context[ 'show_rentals_inline'] = 'show_rentals_inline' in self.request.GET if context['show_rentals_inline']: context['rentals_by_par'] = list( self.rentals_by_participant(trip)) return context
def test_totally_invalid_activity(self): perm_utils.make_chair(self.chair.user, enums.Activity.CLIMBING) resp = self.client.post( '/chair/leaders/', { 'participant': self.participant.pk, 'activity': "Curling", 'rating': "Curler", 'notes': "Drinks with the best of 'em", }, ) self.assertFalse(resp.context['form'].is_valid()) self.assertFalse(perm_utils.is_leader(self.participant.user))
def test_rating_totally_invalid_activity(self): perm_utils.make_chair(self.participant.user, enums.Activity.CLIMBING) other_par = factories.ParticipantFactory.create() resp = self.client.post( '/climbing/leaders/', # Valid activity URL { 'participant': other_par.pk, 'activity': "Curling", # Not a known activity 'rating': "Curler", 'notes': "Drinks with the best of 'em", }, ) self.assertFalse(resp.context['form'].is_valid()) self.assertFalse(perm_utils.is_leader(other_par.user))
def test_chair_for_wrong_activity(self): perm_utils.make_chair(self.chair.user, enums.Activity.CLIMBING) # Not the biking chair, so can't make biking leaders! self.assertFalse( perm_utils.is_chair(self.chair.user, enums.Activity.BIKING)) resp = self.client.post( '/chair/leaders/', { 'participant': self.participant.pk, 'activity': enums.Activity.BIKING.value, 'rating': "Leader", 'notes': "", }, ) self.assertFalse(resp.context['form'].is_valid()) self.assertFalse(perm_utils.is_leader(self.participant.user))
def test_leaders_can_view_others(self): par = factories.ParticipantFactory.create(user_id=self.user.pk) factories.FeedbackFactory.create(participant=self.participant) factories.FeedbackFactory.create( participant=self.participant, showed_up=False, comments='Slept through their alarm, did not answer phone calls', ) # Any leader may view - it doesn't matter which activity! factories.LeaderRatingFactory.create(participant=par) self.assertTrue(perm_utils.is_leader(self.user)) random.seed("Set seed, for predictable 'scrambling'") response = self.client.get(f'/participants/{self.participant.pk}/') self.assertEqual(response.status_code, 200) # When viewing, comments are initially scrambled soup = BeautifulSoup(response.content, 'html.parser') feedback = soup.find(id='feedback').find_next('table') self.assertEqual( strip_whitespace(feedback.find_next('td').text), 'Flaked! oo srephh ,twihlien lnSd rmleartpagtsal choeanrudt', ) # There's a button which enables us to view this feedback, unscrambled. reveal = soup.find( 'a', href=f'/participants/{self.participant.pk}/?show_feedback=1' ) self.assertTrue(reveal) with mock.patch.object(logger, 'info') as log_info: response = self.client.get(reveal.attrs['href']) log_info.assert_called_once_with( "%s (#%d) viewed feedback for %s (#%d)", par, par.pk, self.participant, self.participant.pk, ) soup = BeautifulSoup(response.content, 'html.parser') feedback = soup.find(id='feedback').find_next('table') self.assertEqual( strip_whitespace(feedback.find_next('td').text), 'Flaked! Slept through their alarm, did not answer phone calls', )
def test_chair_for_wrong_activity(self): perm_utils.make_chair(self.participant.user, enums.Activity.CLIMBING) # Not the biking chair, so can't make biking leaders! other_par = factories.ParticipantFactory.create() self.assertFalse( perm_utils.is_chair(self.participant.user, enums.Activity.BIKING)) resp = self.client.post( '/biking/leaders/', { 'participant': other_par.pk, 'activity': enums.Activity.BIKING.value, 'rating': "Leader", 'notes': "", }, ) self.assertEqual(resp.status_code, 403) self.assertFalse(perm_utils.is_leader(other_par.user))
def render_to_response(self, context, **response_kwargs): user_is_leader = perm_utils.is_leader(self.request.user) all_leaders = [] for leader in self.get_queryset(): json_leader = { 'id': leader.id, 'name': leader.name, # Use 200x200 for Retina display at 100x100 on mitoc.mit.edu 'gravatar': gravatar_url(leader.email, 200) } # Full roster of leaders by rating is not meant to be public if user_is_leader: active_ratings = leader.leaderrating_set.filter(active=True) select_fields = active_ratings.values("activity", "rating") json_leader['ratings'] = list(select_fields) all_leaders.append(json_leader) return JsonResponse({'leaders': all_leaders})
def test_create_ws_rating(self): perm_utils.make_chair(self.chair.user, enums.Activity.WINTER_SCHOOL) resp = self.client.post( '/chair/leaders/', { 'participant': self.participant.pk, 'activity': enums.Activity.WINTER_SCHOOL.value, 'rating': "B coC", 'notes': "", }, ) # We redirect back to the page self.assertEqual(resp.status_code, 302) self.assertEqual(resp.url, '/chair/leaders/') # The participant is now a WS leader, and we set the chair as the creator! self.assertTrue(perm_utils.is_leader(self.participant.user)) rating = models.LeaderRating.objects.get( activity=enums.Activity.WINTER_SCHOOL.value, participant=self.participant) self.assertTrue(rating.active) self.assertEqual(rating.rating, "B coC") self.assertEqual(rating.creator, self.chair)
def get_queryset(self): queryset = super().get_queryset() if not perm_utils.is_leader(self.request.user): return queryset.filter(pk=self.request.user.id) return queryset
def test_anonymous_leaders(self): """ Anonymous users are never leaders, chairs, etc.. """ anon = AnonymousUser() self.assertFalse(perm_utils.is_leader(anon), False) self.assertFalse(perm_utils.is_chair(anon, enums.Activity.CLIMBING)) self.assertFalse(perm_utils.in_any_group(anon, ['group_name']))
def test_anonymous_leaders(self): """ Anonymous users are never leaders, chairs, etc.. """ anon = AnonymousUser() self.assertFalse(perm_utils.is_leader(anon), False) self.assertFalse(perm_utils.is_chair(anon, 'climbing'), False) self.assertFalse(perm_utils.in_any_group(anon, ['group_name']), False)
def dispatch(self, request, *args, **kwargs): if not perm_utils.is_leader(request.user): return JsonResponse({}, status=403) return super().dispatch(request, *args, **kwargs)
def supply(self): if not perm_utils.is_leader(self.request.user): return self._complain_if_missing_itineraries() self._complain_if_missing_feedback()
def get_queryset(self, *args, **kwargs): queryset = super(UserView, self).get_queryset(*args, **kwargs) if not perm_utils.is_leader(self.request.user): return queryset.filter(pk=self.request.user.id) return queryset
def test_anonymous_leaders(self): """ Anonymous users are never leaders, chairs, etc.. """ anon = AnonymousUser() self.assertFalse(perm_utils.is_leader(anon), False) self.assertFalse(perm_utils.is_chair(anon, 'climbing'), False) self.assertFalse(perm_utils.in_any_group(anon, ['group_name']), False)