annotate gpp/bio/views.py @ 197:2baadae33f2e

Got autocomplete working for the member search. Updated django and ran into a bug where url tags with comma separated kwargs starting consuming tons of CPU throughput. The work-around is to cut over to using spaces between arguments. This is now allowed to be consistent with other tags. Did some query optimization for the news app.
author Brian Neal <bgneal@gmail.com>
date Sat, 10 Apr 2010 04:32:24 +0000
parents d51743322bb2
children b4305e18d3af
rev   line source
gremmie@1 1 """
gremmie@1 2 Views for the bio application.
gremmie@1 3 """
gremmie@1 4
gremmie@1 5 from django.shortcuts import render_to_response
gremmie@1 6 from django.shortcuts import get_object_or_404
gremmie@1 7 from django.template import RequestContext
gremmie@1 8 from django.contrib import auth
bgneal@178 9 from django.contrib import messages
bgneal@138 10 from django.http import HttpResponse
bgneal@138 11 from django.http import HttpResponseBadRequest
gremmie@1 12 from django.http import HttpResponseRedirect
bgneal@92 13 from django.core.paginator import InvalidPage
gremmie@1 14 from django.core.urlresolvers import reverse
gremmie@1 15 from django.contrib.auth.decorators import login_required
bgneal@138 16 from django.views.decorators.http import require_POST
gremmie@1 17
bgneal@29 18 from elsewhere.models import SocialNetworkForm
bgneal@29 19 from elsewhere.models import InstantMessengerForm
bgneal@29 20 from elsewhere.models import WebsiteForm
bgneal@29 21
gremmie@1 22 from bio.models import UserProfile
bgneal@138 23 from bio.models import UserProfileFlag
gremmie@1 24 from bio.forms import UploadAvatarForm
gremmie@1 25 from bio.forms import EditUserForm
gremmie@1 26 from bio.forms import EditUserProfileForm
bgneal@149 27 from bio.forms import SearchUsersForm
gremmie@1 28 from core.paginator import DiggPaginator
bgneal@138 29 from core.functions import email_admins
gremmie@1 30
gremmie@1 31 #######################################################################
gremmie@1 32
bgneal@125 33 @login_required
gremmie@1 34 def member_list(request, type='user', page=1):
bgneal@147 35 """
bgneal@147 36 This view displays the member list. Only active members are displayed.
bgneal@147 37 """
bgneal@147 38 qs = auth.models.User.objects.filter(is_active=True)
gremmie@1 39 if type == 'user':
bgneal@147 40 qs = qs.order_by('username')
gremmie@1 41 else:
bgneal@147 42 qs = qs.order_by('date_joined')
bgneal@147 43 num_members = qs.count()
gremmie@1 44
bgneal@147 45 paginator = DiggPaginator(qs, 20, body=5, tail=3, margin=3, padding=2)
gremmie@1 46 try:
gremmie@1 47 the_page = paginator.page(int(page))
gremmie@1 48 except InvalidPage:
gremmie@1 49 raise Http404
gremmie@1 50
bgneal@118 51 # Attach user profiles to each post to avoid using get_user_profile() in
bgneal@118 52 # the template.
bgneal@118 53 users = set(user.id for user in the_page.object_list)
bgneal@118 54
bgneal@118 55 profiles = UserProfile.objects.filter(user__id__in=users).select_related()
bgneal@118 56 user_profiles = dict((profile.user.id, profile) for profile in profiles)
bgneal@118 57
bgneal@118 58 for user in the_page.object_list:
bgneal@118 59 user.user_profile = user_profiles[user.id]
bgneal@118 60
gremmie@1 61 return render_to_response('bio/members.html', {
gremmie@1 62 'page': the_page,
gremmie@1 63 'type': type,
bgneal@147 64 'num_members': num_members,
gremmie@1 65 },
gremmie@1 66 context_instance = RequestContext(request))
gremmie@1 67
gremmie@1 68 #######################################################################
gremmie@1 69
gremmie@1 70 @login_required
gremmie@1 71 def my_profile(request):
bgneal@44 72 profile = request.user.get_profile()
gremmie@1 73
gremmie@1 74 return render_to_response('bio/view_profile.html', {
gremmie@1 75 'subject': request.user,
gremmie@1 76 'profile': profile,
gremmie@1 77 'hide_email': False,
gremmie@1 78 'this_is_me': True,
gremmie@1 79 },
gremmie@1 80 context_instance = RequestContext(request))
gremmie@1 81
gremmie@1 82 #######################################################################
gremmie@1 83
gremmie@1 84 @login_required
gremmie@1 85 def view_profile(request, username):
gremmie@1 86
gremmie@1 87 user = get_object_or_404(auth.models.User, username = username)
gremmie@1 88 if user == request.user:
gremmie@1 89 return HttpResponseRedirect(reverse('bio.views.my_profile'))
gremmie@1 90
bgneal@44 91 profile = user.get_profile()
gremmie@1 92
gremmie@1 93 # work around MySQL's handling of Boolean
gremmie@1 94 hide_email = bool(profile.hide_email)
gremmie@1 95
gremmie@1 96 return render_to_response('bio/view_profile.html', {
gremmie@1 97 'subject': user,
gremmie@1 98 'profile': profile,
gremmie@1 99 'hide_email': hide_email,
gremmie@1 100 'this_is_me': False,
gremmie@1 101 },
gremmie@1 102 context_instance = RequestContext(request))
gremmie@1 103
gremmie@1 104 #######################################################################
gremmie@1 105
gremmie@1 106 @login_required
gremmie@1 107 def edit_profile(request):
gremmie@1 108 if request.method == 'POST':
gremmie@1 109 if request.POST.get('submit_button', 'Cancel') == 'Cancel':
gremmie@1 110 return HttpResponseRedirect(reverse('bio.views.my_profile'))
bgneal@44 111 profile = request.user.get_profile()
gremmie@1 112 user_form = EditUserForm(request.POST, instance=request.user)
gremmie@1 113 profile_form = EditUserProfileForm(request.POST, instance=profile)
gremmie@1 114 if user_form.is_valid() and profile_form.is_valid():
gremmie@1 115 user_form.save()
gremmie@1 116 profile = profile_form.save(commit=False)
gremmie@1 117 profile.user = request.user
gremmie@1 118 profile.save()
gremmie@1 119 return HttpResponseRedirect(reverse('bio.views.my_profile'))
gremmie@1 120 else:
bgneal@44 121 profile = request.user.get_profile()
gremmie@1 122 user_form = EditUserForm(instance=request.user)
gremmie@1 123 profile_form = EditUserProfileForm(instance=profile)
gremmie@1 124
gremmie@1 125 return render_to_response('bio/edit_profile.html', {
gremmie@1 126 'user_form': user_form,
gremmie@1 127 'profile_form': profile_form,
gremmie@1 128 },
gremmie@1 129 context_instance = RequestContext(request))
gremmie@1 130
gremmie@1 131 #######################################################################
gremmie@1 132
gremmie@1 133 @login_required
gremmie@1 134 def change_avatar(request):
gremmie@1 135 if request.method == 'POST':
gremmie@1 136 form = UploadAvatarForm(request.POST, request.FILES)
gremmie@1 137 if form.is_valid():
bgneal@44 138 profile = request.user.get_profile()
gremmie@1 139 file = form.get_file()
gremmie@1 140 if profile.avatar.name != '':
gremmie@1 141 profile.avatar.delete(save=False)
gremmie@1 142 if file is not None:
gremmie@1 143 profile.avatar.save(form.get_filename(), file, save=False)
gremmie@1 144 profile.save()
gremmie@1 145
bgneal@178 146 messages.success(request, 'Avatar updated')
gremmie@1 147 return HttpResponseRedirect(reverse('bio-me'))
gremmie@1 148 else:
gremmie@1 149 form = UploadAvatarForm()
gremmie@1 150
gremmie@1 151 return render_to_response('bio/avatar.html', {
gremmie@1 152 'form': form,
gremmie@1 153 },
gremmie@1 154 context_instance = RequestContext(request))
gremmie@1 155
bgneal@29 156 #######################################################################
gremmie@1 157
bgneal@138 158 @require_POST
bgneal@138 159 def flag_profile(request, profile_id):
bgneal@138 160 """
bgneal@138 161 This function handles the flagging of profiles by users. This function should
bgneal@138 162 be the target of an AJAX post.
bgneal@138 163 """
bgneal@138 164 if not request.user.is_authenticated():
bgneal@138 165 return HttpResponse('Please login or register to flag a profile.')
bgneal@138 166
bgneal@138 167 try:
bgneal@138 168 profile = UserProfile.objects.get(pk=profile_id)
bgneal@138 169 except UserProfile.DoesNotExist:
bgneal@138 170 return HttpResponseBadRequest("That profile doesn't exist.")
bgneal@138 171
bgneal@138 172 flag = UserProfileFlag(user=request.user, profile=profile)
bgneal@138 173 flag.save()
bgneal@138 174 email_admins('A Profile Has Been Flagged', """Hello,
bgneal@138 175
bgneal@138 176 A user has flagged a profile for review.
bgneal@138 177 """)
bgneal@138 178 return HttpResponse('The profile was flagged. A moderator will review the' \
bgneal@138 179 ' profile shortly. Thanks for helping to improve the content on this ' \
bgneal@138 180 'site.')
bgneal@138 181
bgneal@138 182 #######################################################################
bgneal@138 183
bgneal@29 184 @login_required
bgneal@29 185 def edit_elsewhere(request):
bgneal@29 186 im_id = 'id_im_%s' # to prevent duplicate ID in HTML output
bgneal@29 187 if request.method == 'POST':
bgneal@29 188 new_data = request.POST.copy()
bgneal@29 189
bgneal@29 190 # Add forms
bgneal@29 191 if new_data.get('sn-form') or new_data.get('im-form') or new_data.get('w-form'):
bgneal@29 192
bgneal@29 193 if new_data.get('sn-form'):
bgneal@29 194 sn_form = SocialNetworkForm(new_data)
bgneal@29 195 im_form = InstantMessengerForm(auto_id=im_id)
bgneal@29 196 w_form = WebsiteForm()
bgneal@29 197 form = sn_form
bgneal@29 198 elif new_data.get('im-form'):
bgneal@29 199 sn_form = SocialNetworkForm()
bgneal@29 200 im_form = InstantMessengerForm(new_data, auto_id=im_id)
bgneal@29 201 w_form = WebsiteForm()
bgneal@29 202 form = im_form
bgneal@29 203 elif new_data.get('w-form'):
bgneal@29 204 sn_form = SocialNetworkForm()
bgneal@29 205 im_form = InstantMessengerForm(auto_id=im_id)
bgneal@29 206 w_form = WebsiteForm(new_data)
bgneal@29 207 form = w_form
bgneal@29 208
bgneal@29 209 if form.is_valid():
bgneal@29 210 profile = form.save(commit=False)
bgneal@29 211 profile.user = request.user
bgneal@29 212 profile.save()
bgneal@29 213 return HttpResponseRedirect(request.path)
bgneal@29 214
bgneal@29 215 # Delete forms
bgneal@29 216 elif new_data.get('delete-sn-form') or new_data.get('delete-im-form') or new_data.get('delete-w-form'):
bgneal@29 217 delete_id = request.POST['delete_id']
bgneal@29 218
bgneal@29 219 if new_data.get('delete-sn-form'):
bgneal@29 220 request.user.social_network_profiles.get(id=delete_id).delete()
bgneal@29 221 elif new_data.get('delete-im-form'):
bgneal@29 222 request.user.instant_messenger_profiles.get(id=delete_id).delete()
bgneal@29 223 elif new_data.get('delete-w-form'):
bgneal@29 224 request.user.website_profiles.get(id=delete_id).delete()
bgneal@29 225
bgneal@29 226 return HttpResponseRedirect(request.path)
bgneal@29 227
bgneal@29 228 # WTF?
bgneal@29 229 else:
bgneal@29 230 return HttpResponseServerError
bgneal@29 231
bgneal@29 232 else:
bgneal@29 233 # Create blank forms
bgneal@29 234 sn_form = SocialNetworkForm()
bgneal@29 235 im_form = InstantMessengerForm(auto_id=im_id)
bgneal@29 236 w_form = WebsiteForm()
bgneal@29 237
bgneal@29 238 return render_to_response('bio/edit_elsewhere.html', {
bgneal@29 239 'sn_form': sn_form,
bgneal@29 240 'im_form': im_form,
bgneal@29 241 'w_form': w_form,
bgneal@29 242 },
bgneal@29 243 context_instance=RequestContext(request))
bgneal@29 244
bgneal@149 245 #######################################################################
bgneal@149 246
bgneal@149 247 @login_required
bgneal@149 248 def member_search(request):
bgneal@149 249 if request.method == "POST":
bgneal@149 250 form = SearchUsersForm(request.POST)
bgneal@149 251 if form.is_valid():
bgneal@149 252 username = form.cleaned_data['username']
bgneal@149 253 return HttpResponseRedirect(reverse("bio-view_profile",
bgneal@149 254 kwargs={'username': username}))
bgneal@149 255 else:
bgneal@149 256 form = SearchUsersForm()
bgneal@149 257
bgneal@149 258 return render_to_response('bio/member_search.html', {
bgneal@149 259 'form': form,
bgneal@149 260 },
bgneal@149 261 context_instance=RequestContext(request))
bgneal@149 262