def pledge(self, geuser): """geuser pledges to perform this action. Records the Pledge, posts a message to community feed, and clears relevant caches""" _, is_created = Pledge.objects.get_or_create(action = self, user = geuser) if is_created: entry = Entry(who = geuser, msg = 'pledged to <strong>%s</strong>' % self.title, campaign = self.campaign) entry.save() EntryView.refresh_recent_activity(self.campaign) Entry.objects.clear_dashboard_cache(self.campaign) Action.objects.clear_dashboard_cache(self.campaign)
def profile_settings(request, campaign_slug): """Settings page. Ajax only""" current_user = request.user.get_profile() campaign = Campaign.objects.default(campaign_slug, get_current_organization()) if request.method == 'POST': form = SettingsForm(current_user, get_current_organization(), request.POST) if form.is_valid(): form.save() if 'survey' in request.GET: # Survey doesn't change any visible fields, so no need to reload page, # and 'Upload profile pic' bubble only shows on first load, # so redirect would clear it. return HttpResponse( JSONEncoder().encode({'close': True}), mimetype='application/json') else: # Refresh the cache cache.delete( Entry.objects.dashboard_cache_key(campaign, current_user) ) EntryView.refresh_recent_activity(campaign) campaign.users_json(force=True) campaign_url = reverse('campaign_home', kwargs={'campaign_slug': campaign_slug}) return HttpResponse( JSONEncoder().encode({'location': campaign_url}), mimetype='application/json') else: form = SettingsForm(current_user, get_current_organization()) html = render_to_string( 'profile/settings_include.html', {'form': form, 'campaign': campaign}, context_instance=RequestContext(request)) result = {'html': html, 'close': False} encoder = JSONEncoder(default = json_encoder_default) return HttpResponse(encoder.encode(result), mimetype='application/json')
def dashboard(request, campaign_slug, indicator_id): "Home page" response_map = {} try: geuser = request.user.get_profile() except Profile.DoesNotExist: return reverse('registration_logout', kwargs={'campaign_slug': campaign_slug}) campaign = get_current_campaign() campaign.add_user(geuser) if campaign.get_end_date(geuser) < datetime.date.today(): url = reverse('results', kwargs={'campaign_slug': campaign.slug}) return HttpResponseRedirect(url) indicator_list = Indicator.objects.all_regular_indicators(campaign) response_map['indicator_list'] = indicator_list response_map['one_week_ago'] = datetime.datetime.now() - datetime.timedelta(7) indicator = None try: next_indicator = Indicator.objects.next(geuser, campaign) response_map['last_answered'] = next_indicator except Indicator.DoesNotExist: next_indicator = None response_map['is_done'] = True if indicator_id: try: indicator = Indicator.objects.get_cached(campaign, long(indicator_id)) except Indicator.DoesNotExist: return HttpResponseRedirect('/') else: if next_indicator: indicator = next_indicator else : url = reverse('results', kwargs={'campaign_slug': campaign.slug}) return HttpResponseRedirect(url) yesterday = geuser.local_datetime().date() - datetime.timedelta(1) try: response_map['current_answer'] = \ Answer.objects.get( user = geuser, indicator_id = indicator.id, action_date = yesterday ) except Answer.DoesNotExist: pass try: previous = Answer.objects.\ filter( user = geuser, indicator_id = indicator.id, action_date__lt = yesterday).\ order_by('-action_date')[0] except (Answer.DoesNotExist, IndexError): previous = None response_map['next'] = indicator_form(indicator=indicator, user=geuser, previous=previous) if not indicator.image: # If no image we display a bar graph indicator_view = indicator.view(geuser, Indicator.objects.average_user()) encoder = JSONEncoder(default = json_encoder_default) response_map['indicator_json'] = encoder.encode(indicator_view) response_map['recent_activity_list'] = EntryView.recent_activity(campaign) popular_actions = ActionView.popular(campaign, geuser) response_map['popular_actions'] = popular_actions all_actions = list(popular_actions) random.shuffle(all_actions) response_map['all_actions'] = all_actions response_map['status_dashboard'] = _status_dashboard(request, response_map, campaign, geuser) response_map['action_dashboard'] = _action_dashboard(request, response_map, campaign, geuser) return render_to_response( 'dashboard.html', response_map, context_instance=RequestContext(request))
def results(request, campaign_slug, indicator_id = None): 'Display the results' response_map = {'is_done': True} try: geuser = request.user.get_profile() except Profile.DoesNotExist: return reverse('registration_logout', kwargs={'campaign_slug': campaign_slug}) organization = get_current_organization() campaign = get_current_campaign() overall_indicator = Indicator.objects.overall_indicator(campaign) response_map['overall_indicator'] = overall_indicator indicator_list = Indicator.objects.all_regular_indicators(campaign) response_map['indicator_list'] = indicator_list if not indicator_id and 'indicator_id' in request.REQUEST: indicator_id = request.REQUEST['indicator_id'] if indicator_id: indicator = Indicator.objects.get(pk=indicator_id).subclass() else: indicator = overall_indicator response_map['current_indicator'] = indicator from_user = geuser if 'from' in request.GET and request.GET['from'] != 'me': from_group_id = request.GET['from'] from_user = Group.objects.get(pk = from_group_id) response_map['from_user'] = from_user to_user = Indicator.objects.average_user() is_compare_to_all = True if 'to' in request.GET and request.GET['to'] != 'all': to_group_id = request.GET['to'] to_user = Group.objects.get(pk = to_group_id) is_compare_to_all = False response_map['to_user'] = to_user response_map['is_compare_to_all'] = is_compare_to_all indicator_view = indicator.view(from_user, to_user) encoder = JSONEncoder(default = json_encoder_default) response_map['indicator_json'] = encoder.encode(indicator_view) now = datetime.datetime.now() yesterday = now - datetime.timedelta(1) response_map['one_week_ago'] = now - datetime.timedelta(7) response_map['my_groups'] = geuser.groups.all() response_map['all_groups'] = Group.objects.filter(organization = organization) indicator_rating_list = [] for ind in indicator_list: try: (ind.user_rating, ind.user_rating_exact) = ind.compared_to_average(geuser, yesterday) ind.user_rating_exact = abs(ind.user_rating_exact) indicator_rating_list.append(ind) except Answer.DoesNotExist: # User or Avg User has no answer for that day, don't display the indicator #ind.user_rating, ind.user_rating_exact = 0, 0 pass indicator_rating_list.sort(key=lambda x: x.user_rating, reverse=True) response_map['indicator_rating_list'] = indicator_rating_list above, avg, below = [], [], [] for indicator in indicator_rating_list: if indicator.user_rating > 0: above.append(indicator) elif indicator.user_rating == 0: avg.append(indicator) else: below.append(indicator) response_map['indicator_rating_above'] = above response_map['indicator_rating_avg'] = avg response_map['indicator_rating_below'] = below if campaign.get_end_date(geuser) < datetime.date.today() or 'completed' in request.GET: response_map['completed'] = is_completed = True my_stats = campaign.stats(geuser) my_stats['completed_pledges'] = Pledge.objects.filter( is_completed=True, user=geuser, action__campaign = campaign) my_stats['pending_pledges'] = Pledge.objects.filter( is_completed=False, user=geuser, action__campaign = campaign) response_map['my_stats'] = my_stats else: response_map['completed'] = is_completed = False response_map['recent_activity_list'] = EntryView.recent_activity(campaign) popular_actions = ActionView.popular(campaign, geuser) response_map['popular_actions'] = popular_actions all_actions = list(popular_actions) if not is_completed: # Completed screen shows most popular actions first random.shuffle(all_actions) response_map['all_actions'] = all_actions response_map['status_dashboard'] = \ _status_dashboard(request, response_map, campaign, geuser) response_map['action_dashboard'] = \ _action_dashboard(request, response_map, campaign, geuser) return render_to_response( 'results.html', response_map, context_instance=RequestContext(request))