# HG changeset patch # User Brian Neal # Date 1313546540 0 # Node ID d83296cac9409cb25be3260c9d3da276d852bddc # Parent d9b6c4ec1977a7c0d750fc28659baef9dc7693ed For #227: only enqueue user profiles if the user has changed the content we have in the search index. diff -r d9b6c4ec1977 -r d83296cac940 gpp/bio/search_indexes.py --- a/gpp/bio/search_indexes.py Wed Aug 17 01:29:27 2011 +0000 +++ b/gpp/bio/search_indexes.py Wed Aug 17 02:02:20 2011 +0000 @@ -4,6 +4,7 @@ from custom_search.indexes import CondQueuedSearchIndex from bio.models import UserProfile +from bio.signals import profile_content_update class UserProfileIndex(CondQueuedSearchIndex): @@ -16,6 +17,15 @@ def get_updated_field(self): return 'update_date' + def _setup_save(self, model): + profile_content_update.connect(self.enqueue_save) + + def _teardown_save(self, model): + profile_content_update.disconnect(self.enqueue_save) + + def enqueue_save(self, sender, **kwargs): + return self.enqueue('update', sender) + def can_index(self, instance): return instance.user.is_active diff -r d9b6c4ec1977 -r d83296cac940 gpp/bio/signals.py --- a/gpp/bio/signals.py Wed Aug 17 01:29:27 2011 +0000 +++ b/gpp/bio/signals.py Wed Aug 17 02:02:20 2011 +0000 @@ -1,8 +1,10 @@ """ -Signal handler(s) for the bio application. +Signal handlers & signals for the bio application. + """ from django.db.models.signals import post_save from django.contrib.auth.models import User +import django.dispatch import bio.badges from bio.models import UserProfile @@ -91,3 +93,19 @@ post_save.connect(on_download_save, sender=Download, dispatch_uid='bio.signals') post_save.connect(on_story_save, sender=Story, dispatch_uid='bio.signals') post_save.connect(on_photo_save, sender=Photo, dispatch_uid='bio.signals') + +# Signals for the bio application +# +# This signal is sent whenever a profile has had its textual content updated. +# The provided arguments to the receiver function are: +# - sender - the profile model instance + +profile_content_update = django.dispatch.Signal(providing_args=[]) + + +def notify_profile_content_update(profile): + """ + Convenience function to send the profile content update signal. + + """ + profile_content_update.send_robust(profile) diff -r d9b6c4ec1977 -r d83296cac940 gpp/bio/views.py --- a/gpp/bio/views.py Wed Aug 17 01:29:27 2011 +0000 +++ b/gpp/bio/views.py Wed Aug 17 02:02:20 2011 +0000 @@ -1,7 +1,7 @@ """ Views for the bio application. + """ - from django.shortcuts import render_to_response from django.shortcuts import get_object_or_404 from django.template import RequestContext @@ -27,6 +27,7 @@ from bio.forms import EditUserForm from bio.forms import EditUserProfileForm from bio.forms import SearchUsersForm +from bio.signals import notify_profile_content_update from core.paginator import DiggPaginator from core.functions import email_admins from core.functions import get_page @@ -78,12 +79,12 @@ profile=profile).select_related("badge") return render_to_response('bio/view_profile.html', { - 'subject': request.user, - 'profile': profile, + 'subject': request.user, + 'profile': profile, 'hide_email': False, 'this_is_me': True, 'badge_collection': badge_collection, - }, + }, context_instance = RequestContext(request)) ####################################################################### @@ -100,14 +101,14 @@ badge_collection = BadgeOwnership.objects.filter( profile=profile).select_related("badge") - + return render_to_response('bio/view_profile.html', { - 'subject': user, - 'profile': profile, + 'subject': user, + 'profile': profile, 'hide_email': hide_email, 'this_is_me': False, 'badge_collection': badge_collection, - }, + }, context_instance = RequestContext(request)) ####################################################################### @@ -125,6 +126,7 @@ profile = profile_form.save(commit=False) profile.user = request.user profile.save() + notify_profile_content_update(profile) return HttpResponseRedirect(reverse('bio.views.my_profile')) else: profile = request.user.get_profile() @@ -134,7 +136,7 @@ return render_to_response('bio/edit_profile.html', { 'user_form': user_form, 'profile_form': profile_form, - }, + }, context_instance = RequestContext(request)) ####################################################################### @@ -168,7 +170,7 @@ return render_to_response('bio/avatar.html', { 'form': form, - }, + }, context_instance = RequestContext(request)) ####################################################################### @@ -228,18 +230,25 @@ profile = form.save(commit=False) profile.user = request.user profile.save() + notify_profile_content_update(request.user.get_profile()) return HttpResponseRedirect(request.path) # Delete forms elif new_data.get('delete-sn-form') or new_data.get('delete-im-form') or new_data.get('delete-w-form'): delete_id = request.POST['delete_id'] + update_occurred = True if new_data.get('delete-sn-form'): request.user.social_network_profiles.get(id=delete_id).delete() elif new_data.get('delete-im-form'): request.user.instant_messenger_profiles.get(id=delete_id).delete() elif new_data.get('delete-w-form'): request.user.website_profiles.get(id=delete_id).delete() + else: + update_occurred = False + + if update_occurred: + notify_profile_content_update(request.user.get_profile()) return HttpResponseRedirect(request.path) @@ -254,10 +263,10 @@ w_form = WebsiteForm() return render_to_response('bio/edit_elsewhere.html', { - 'sn_form': sn_form, - 'im_form': im_form, + 'sn_form': sn_form, + 'im_form': im_form, 'w_form': w_form, - }, + }, context_instance=RequestContext(request)) ####################################################################### @@ -268,13 +277,13 @@ form = SearchUsersForm(request.POST) if form.is_valid(): username = form.cleaned_data['username'] - return HttpResponseRedirect(reverse("bio-view_profile", + return HttpResponseRedirect(reverse("bio-view_profile", kwargs={'username': username})) else: form = SearchUsersForm() return render_to_response('bio/member_search.html', { 'form': form, - }, + }, context_instance=RequestContext(request))