Пример #1
0
 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
Пример #2
0
 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)
         ]
     })
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
 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))
Пример #6
0
    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))
Пример #7
0
    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))
Пример #8
0
    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',
        )
Пример #9
0
    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))
Пример #10
0
    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})
Пример #11
0
    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)
Пример #12
0
 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
Пример #13
0
 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']))
Пример #14
0
 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)
Пример #15
0
 def dispatch(self, request, *args, **kwargs):
     if not perm_utils.is_leader(request.user):
         return JsonResponse({}, status=403)
     return super().dispatch(request, *args, **kwargs)
Пример #16
0
 def supply(self):
     if not perm_utils.is_leader(self.request.user):
         return
     self._complain_if_missing_itineraries()
     self._complain_if_missing_feedback()
Пример #17
0
 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
Пример #18
0
 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)