Ejemplo n.º 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
Ejemplo n.º 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
Ejemplo n.º 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
Ejemplo n.º 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)
Ejemplo n.º 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)
Ejemplo n.º 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)
Ejemplo n.º 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)
Ejemplo n.º 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))
Ejemplo n.º 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)
Ejemplo n.º 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"')
Ejemplo n.º 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)
Ejemplo n.º 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))
Ejemplo n.º 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)
Ejemplo n.º 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/'))
Ejemplo n.º 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)
Ejemplo n.º 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/'))
Ejemplo n.º 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())
Ejemplo n.º 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)
Ejemplo n.º 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())
Ejemplo n.º 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)
Ejemplo n.º 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)
Ejemplo n.º 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)
Ejemplo n.º 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)