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
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
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
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)
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)
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)
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)
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))
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)
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"')
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)
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))
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)
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/'))
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)
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/'))
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())
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)
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())
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)
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)
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)
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)