def decorator(fn): def params(request, id, slug=None): user = get_object_or_404(User, id=id) if private and not (user == request.user or request.user.is_superuser): raise ReturnImediatelyException( HttpResponseUnauthorized(request)) if render_to and (not render_to(user)): raise ReturnImediatelyException( HttpResponseRedirect(user.get_profile_url())) return [request, user], {} decorated = decorate.params.withfn(params)(fn) def result(context, request, user): try: user.username = user.username.decode("utf8") except Exception: pass rev_page_title = user.username + " - " + tab_description context.update({ "tab": "users", "active_tab": tab_name, "tab_description": tab_description, "page_title": rev_page_title, "can_view_private": (user == request.user) or request.user.is_superuser }) return render_to_response(template, context, context_instance=RequestContext(request)) decorated = decorate.result.withfn(result, needs_params=True)(decorated) if tabbed: def url_getter(vu): try: return reverse(fn.__name__, kwargs={ 'id': vu.id, 'slug': slugify(vu.username) }) except NoReverseMatch: return reverse(fn.__name__, kwargs={'id': vu.id}) ui.register( ui.PROFILE_TABS, ui.ProfileTab(tab_name, tab_title, tab_description, url_getter, private, render_to, weight)) return decorated
def decorator(fn): def params(request, id=None, slug=None): # Get the user object by id if the id parameter has been passed if id is not None: user = get_object_or_404(User, id=id) # ...or by slug if the slug has been given elif slug is not None: try: user = User.objects.get(username__iexact=slug) except User.DoesNotExist: raise Http404 if private and not (user == request.user or request.user.is_superuser): raise ReturnImediatelyException( HttpResponseUnauthorized(request)) if render_to and (not render_to(user)): raise ReturnImediatelyException( HttpResponseRedirect(user.get_profile_url())) return [request, user], { 'slug': slug, } decorated = decorate.params.withfn(params)(fn) def result(context_or_response, request, user, **kwargs): rev_page_title = smart_unicode( user.username) + " - " + tab_description # Check whether the return type of the decorated function is a context or Http Response if isinstance(context_or_response, HttpResponse): response = context_or_response # If it is a response -- show it return response else: # ...if it is a context move forward, update it and render it to response context = context_or_response context.update({ "tab": "users", "active_tab": tab_name, "tab_description": tab_description, "page_title": rev_page_title, "can_view_private": (user == request.user) or request.user.is_superuser }) return render_to_response(template, context, context_instance=RequestContext(request)) decorated = decorate.result.withfn(result, needs_params=True)(decorated) if tabbed: def url_getter(vu): try: return reverse(fn.__name__, kwargs={ 'id': vu.id, 'slug': slugify(smart_unicode(vu.username)) }) except NoReverseMatch: try: return reverse(fn.__name__, kwargs={'id': vu.id}) except NoReverseMatch: return reverse(fn.__name__, kwargs={ 'slug': slugify(smart_unicode(vu.username)) }) ui.register( ui.PROFILE_TABS, ui.ProfileTab(tab_name, tab_title, tab_description, url_getter, private, render_to, weight)) return decorated