Пример #1
0
def get_avatar_url(user, size=50):
    """Get a url pointing to user's avatar.

    The libravatar network is used for avatars. Return cached value if
    its last update was less than 24 hours before. Optional argument
    size can be provided to set the avatar size.

    """
    if not user:
        return None

    default_img_url = reduce(lambda u, x: urlparse.urljoin(u, x),
                             [settings.SITE_URL,
                              settings.STATIC_URL,
                              'base/img/remo/remo_avatar.png'])

    user_avatar, created = UserAvatar.objects.get_or_create(user=user)
    now = timezone.now()

    if (user_avatar.last_update < now - timedelta(days=7)) or created:
        user_avatar.avatar_url = libravatar_url(email=user.email, https=True)
        user_avatar.save()

    avatar_url = urlparams(user_avatar.avatar_url, default=default_img_url)
    if size != -1:
        avatar_url = urlparams(avatar_url, size=size)

    return avatar_url
Пример #2
0
def get_event_filtered_url(category=None, initiative=None):
    """Returns events list page of given category or initiative."""

    url = reverse('events_list_events')
    if category:
        return urlparams(url, '/category/%s/' % category.lower())
    elif initiative:
        return urlparams(url, '/initiative/%s/' % initiative.lower())
    else:
        return url
Пример #3
0
def get_event_filtered_url(category=None, initiative=None):
    """Returns events list page of given category or initiative."""

    url = reverse('events_list_events')
    if category:
        return urlparams(url, '/category/%s/' % category.lower())
    elif initiative:
        return urlparams(url, '/initiative/%s/' % initiative.lower())
    else:
        return url
Пример #4
0
 def test_base(self, mocked_month2number):
     user = UserFactory.create(groups="Rep")
     reports_url = reverse("list_ng_reports_rep", args=(user.userprofile.display_name,))
     reports_url = urlparams(reports_url, year="2014", month="Apri")
     response = self.client.get(reports_url, follow=True)
     mocked_month2number.assert_called_once_with(u"Apri")
     eq_(response.status_code, 404)
Пример #5
0
        def wrapper(request, *args, **kwargs):

            def _check_if_user_has_permissions():
                if (((permissions and request.user.has_perms(permissions))
                     or request.user.groups.filter(name=group).exists())):
                    return True
                return False

            def _check_if_user_owns_page():
                if owner_field and model:
                    if not kwargs.get(filter_field):
                        return True

                    obj = get_object_or_none(model, **{filter_field:
                                                       kwargs[filter_field]})
                    if obj and getattr(obj, owner_field) == request.user:
                        return True
                return False

            if request.user.is_authenticated():
                if (((not permissions and not group and not filter_field)
                     or request.user.is_superuser
                     or _check_if_user_owns_page()
                     or _check_if_user_has_permissions())):
                    return func(request, *args, **kwargs)
                else:
                    messages.error(request, 'Permission denied.')
                    return redirect('main')
            else:
                messages.warning(request, 'Please login.')
                next_url = urlparams(reverse('main'), next=request.path)
                return HttpResponseRedirect(next_url)
Пример #6
0
        def wrapper(request, *args, **kwargs):
            def _check_if_user_has_permissions():
                if (((permissions and request.user.has_perms(permissions))
                     or request.user.groups.filter(name=group).exists())):
                    return True
                return False

            def _check_if_user_owns_page():
                if owner_field and model:
                    if not kwargs.get(filter_field):
                        return True

                    obj = get_object_or_none(
                        model, **{filter_field: kwargs[filter_field]})
                    if obj and getattr(obj, owner_field) == request.user:
                        return True
                return False

            if request.user.is_authenticated():
                if (((not permissions and not group and not filter_field)
                     or request.user.is_superuser
                     or _check_if_user_owns_page()
                     or _check_if_user_has_permissions())):
                    return func(request, *args, **kwargs)
                else:
                    messages.error(request, 'Permission denied.')
                    return redirect('main')
            else:
                messages.warning(request, 'Please login.')
                next_url = urlparams(reverse('main'), next=request.path)
                return HttpResponseRedirect(next_url)
Пример #7
0
 def test_base(self, mocked_month2number):
     user = UserFactory.create(groups='Rep')
     reports_url = reverse('list_ng_reports_rep',
                           args=(user.userprofile.display_name,))
     reports_url = urlparams(reports_url, year='2014', month='Apri')
     response = self.client.get(reports_url, follow=True)
     mocked_month2number.assert_called_once_with(u'Apri')
     eq_(response.status_code, 404)
Пример #8
0
def multiple_event_ical(request, period, start=None, end=None, search=None):
    """Redirect iCal URL to API query."""

    # Create API query
    url = reverse('api_dispatch_list',
                  kwargs={
                      'api_name': 'v1',
                      'resource_name': 'event'
                  })
    if period == 'all':
        url = urlparams(url, start__gt='1970-01-01')
    elif period == 'future':
        url = urlparams(url, start__gte=now().strftime("%Y-%m-%d"))
    elif period == 'past':
        url = urlparams(url, start__lt=now().strftime("%Y-%m-%d"))
    elif period == 'custom':
        if start:
            url = urlparams(url, start__gte=start)
        if end:
            url = urlparams(url, end__lte=end)
    else:
        raise Http404

    if search:
        url = urlparams(url, query=search)

    statsd.incr('events.export_multiple_ical')
    return redirect(urlparams(url, format='ical', offset=0, limit=0))
Пример #9
0
def view_ng_report(request, display_name, year, month, day=None, id=None):
    if not day and not id:
        url = reverse('list_ng_reports_rep', kwargs={'rep': display_name})
        return redirect(urlparams(url, year=year, month=month))

    user = get_object_or_404(User, userprofile__display_name=display_name)
    report = get_object_or_404(NGReport, id=id)
    comment_form = forms.NGReportCommentForm()
    verification_form = forms.NGVerifyReportForm(instance=report)

    editable = False
    if (((request.user == user or request.user.has_perm('change_ngreport')) and
         (report.activity.name not in UNLISTED_ACTIVITIES))):
        editable = True

    ctx_data = {'pageuser': user,
                'user_profile': user.userprofile,
                'report': report,
                'editable': editable,
                'comment_form': comment_form,
                'verification_form': verification_form}
    template = 'view_ng_report.jinja'

    if request.method == 'POST':
        # Process comment form
        if 'comment' in request.POST:
            comment_form = forms.NGReportCommentForm(request.POST)
            if comment_form.is_valid():
                if not request.user.is_authenticated():
                    messages.error(request, 'Permission denied.')
                    return redirect('main')
                obj = comment_form.save(commit=False)
                obj.user = request.user
                obj.report = report
                obj.save()
                messages.success(request, 'Comment saved successfully.')
                statsd.incr('reports.create_comment')
                ctx_data['comment_form'] = forms.NGReportCommentForm()

        # Process verification form
        else:
            verification_form = forms.NGVerifyReportForm(request.POST, instance=report)
            if verification_form.is_valid():
                if ((not request.user.is_authenticated()) or
                    (not request.user.groups.filter(
                        Q(name='Council') | Q(name='Mentor')).exists())):
                    messages.error(request, 'Permission denied.')
                    return redirect('main')
                if verification_form.cleaned_data['verified_activity']:
                    messages.success(request, u'Activity verified successfully.')
                else:
                    messages.success(request, u'Activiy invalidated successfully.')
                verification_form.save()
                ctx_data['verification_form'] = forms.NGVerifyReportForm(instance=report)

    return render(request, template, ctx_data)
Пример #10
0
    def test_csv_export(self, fake_now):
        """Test for valid filename in CSV export."""
        # Act like it's March 2012.
        fake_now.return_value = datetime(year=2012, month=3, day=1)

        url = urlparams(reverse('api_dispatch_list',
                                kwargs={'api_name': 'v1',
                                        'resource_name': 'rep'}))

        response = self.client.get(url, data={'format': 'csv'})

        self.assertTrue('Content-Disposition' in response)
        eq_(response['Content-Disposition'],
            'filename="reps-export-2012-03-01.csv"')
Пример #11
0
    def test_rep_filter(self):
        """Test custom filtering with ?query= ."""
        mentor = UserFactory.create(groups=['Mentor'],
                                    userprofile__initial_council=True)
        rep = UserFactory.create(groups=['Rep'], userprofile__mentor=mentor)
        for query in [rep.email, rep.userprofile.display_name]:
            url = urlparams(reverse('api_dispatch_list',
                                    kwargs={'api_name': 'v1',
                                            'resource_name': 'rep'}),
                            query=query)
            response = self.client.get(url, follow=True)

            result = json.loads(response.content)
            eq_(len(result['objects']), 1,
                'Query "%s" did not return 1 result' % query)
Пример #12
0
def multiple_event_ical(request, period, start=None, end=None, search=None):
    """Redirect iCal URL to API query."""

    # Create API query
    url = reverse('api_dispatch_list', kwargs={'api_name': 'v1', 'resource_name': 'event'})
    if period == 'all':
        url = urlparams(url, start__gt='1970-01-01')
    elif period == 'future':
        url = urlparams(url, start__gte=now().strftime("%Y-%m-%d"))
    elif period == 'past':
        url = urlparams(url, start__lt=now().strftime("%Y-%m-%d"))
    elif period == 'custom':
        if start:
            url = urlparams(url, start__gte=start)
        if end:
            url = urlparams(url, end__lte=end)
    else:
        raise Http404

    if search:
        url = urlparams(url, query=search)

    statsd.incr('events.export_multiple_ical')
    return redirect(urlparams(url, format='ical', offset=0, limit=0))
Пример #13
0
 def setUp(self):
     self.settings_data = {'receive_email_on_add_comment': True}
     self.user_edit_settings_url = reverse('edit_settings')
     self.failed_url = urlparams(settings.LOGIN_REDIRECT_URL_FAILURE, bid_login_failed=1)
Пример #14
0
 def test_get_event_search_link(self):
     """Test event search link generation."""
     search = 'SearchTerm'
     url = reverse('events_list_events')
     eq_(get_event_search_link(search),
         urlparams(url, '/search/searchterm/'))
Пример #15
0
def redirect_list_profiles(request):
    profiles_url = reverse('profiles_list_profiles')
    extra_path = iri_to_uri('/' + request.path_info[len(profiles_url):])
    return redirect(urlparams(profiles_url, hash=extra_path), permanent=True)
Пример #16
0
 def test_get_event_search_link(self):
     """Test event search link generation."""
     search = 'SearchTerm'
     url = reverse('events_list_events')
     eq_(get_event_search_link(search), urlparams(url,
                                                  '/search/searchterm/'))
Пример #17
0
def get_event_search_link(search):
    """Returns events list page with the given search term."""

    url = reverse('events_list_events')
    return urlparams(url, '/search/%s/' % search.lower())
Пример #18
0
def fetch_bugs(components=COMPONENTS, days=None):
    """Fetch all bugs from Bugzilla.

    Loop over components and fetch bugs updated the last days. Link
    Bugzilla users with users on this website, when possible.

    """
    login_url = LOGIN_URL.format(username=settings.REMOZILLA_USERNAME,
                                 password=settings.REMOZILLA_PASSWORD)
    response = requests.get(login_url).json()
    error = response.get('error')

    # Check the server response and get the token
    if error:
        raise ValueError('Invalid response from server, {0}.'.format(response['error']))
    token = response['token']

    now = timezone.now()
    if not days:
        changed_date = get_last_updated_date()
    else:
        changed_date = now - timedelta(int(days))

    for component in components:
        offset = 0
        url = URL.format(token=token, component=quote(component),
                         fields=','.join(BUGZILLA_FIELDS),
                         timestamp=changed_date, offset=offset, limit=LIMIT)

        while True:
            bugs = requests.get(url).json()
            error = bugs.get('error')

            # Check the server response and get the token
            if error:
                raise ValueError('Invalid response from server, {0}.'.format(bugs['message']))

            remo_bugs = bugs.get('bugs', [])
            if not remo_bugs:
                break

            for bdata in remo_bugs:
                # Get comments for current bug
                comment_url = COMMENT_URL.format(id=bdata['id'], token=token)
                comments = requests.get(comment_url).json()
                error = comments.get('error')

                if error:
                    raise ValueError('Invalid response from server, {0}.'
                                     .format(comments['message']))

                bug, created = Bug.objects.get_or_create(bug_id=bdata['id'])

                bug.summary = bdata.get('summary', '')
                creator_email = bdata['creator']
                bug.creator = get_object_or_none(User, email=creator_email)
                bug.bug_creation_time = parse_bugzilla_time(bdata['creation_time'])
                bug.component = bdata['component']
                bug.whiteboard = bdata.get('whiteboard', '')

                bug.cc.clear()
                for email in bdata.get('cc', []):
                    cc_user = get_object_or_none(User, email=email)
                    if cc_user:
                        bug.cc.add(cc_user)

                bug.assigned_to = get_object_or_none(
                    User, email=bdata['assigned_to'])
                bug.status = bdata['status']
                bug.resolution = bdata.get('resolution', '')
                bug.bug_last_change_time = parse_bugzilla_time(bdata.get('last_change_time'))

                automated_voting_trigger = 0
                bug.budget_needinfo.clear()
                bug.council_member_assigned = False
                bug.pending_mentor_validation = False
                for flag in bdata.get('flags', []):
                    if flag['status'] == '?' and flag['name'] == BUG_APPROVAL:
                        automated_voting_trigger += 1
                        if BUG_WHITEBOARD in bug.whiteboard:
                            bug.council_member_assigned = True
                    if ((flag['status'] == '?' and
                         flag['name'] == 'needinfo' and 'requestee' in flag and
                         flag['requestee'] == (settings.REPS_REVIEW_ALIAS))):
                        automated_voting_trigger += 1
                    if flag['status'] == '?' and flag['name'] == BUG_REVIEW:
                        bug.pending_mentor_validation = True
                    if (flag['status'] == '?' and flag['name'] == 'needinfo' and
                            'requestee' in flag):
                        email = flag['requestee']
                        user = get_object_or_none(User, email=email)
                        if user:
                            bug.budget_needinfo.add(user)

                if automated_voting_trigger == 2 and waffle.switch_is_active('automated_polls'):
                    bug.council_vote_requested = True

                unicode_id = str(bdata['id'])
                bug_comments = comments['bugs'][unicode_id]['comments']
                if bug_comments and bug_comments[0].get('text', ''):
                    # Enforce unicode encoding.
                    bug.first_comment = bug_comments[0]['text']

                bug.save()

            offset += LIMIT
            url = urlparams(url, offset=offset)

    set_last_updated_date(now)
Пример #19
0
def get_event_search_link(search):
    """Returns events list page with the given search term."""

    url = reverse('events_list_events')
    return urlparams(url, '/search/%s/' % search.lower())
Пример #20
0
def redirect_list_events(request):
    events_url = reverse('events_list_events')
    extra_path = iri_to_uri('/' + request.path_info[len(events_url):])
    return redirect(urlparams(events_url, hash=extra_path), permanent=True)
Пример #21
0
def redirect_list_profiles(request):
    profiles_url = reverse('profiles_list_profiles')
    extra_path = iri_to_uri('/' + request.path_info[len(profiles_url):])
    return redirect(urlparams(profiles_url, hash=extra_path), permanent=True)
Пример #22
0
 def setUp(self):
     self.settings_data = {'receive_email_on_add_comment': True}
     self.user_edit_settings_url = reverse('edit_settings')
     self.failed_url = urlparams(settings.LOGIN_REDIRECT_URL_FAILURE,
                                 bid_login_failed=1)
Пример #23
0
def redirect_list_events(request):
    events_url = reverse('events_list_events')
    extra_path = iri_to_uri('/' + request.path_info[len(events_url):])
    return redirect(urlparams(events_url, hash=extra_path), permanent=True)