def pledge(request, action_id): """User pledges to perform an action""" if request.method != 'POST': return HttpResponseNotAllowed(['POST']) current_user = request.user.get_profile() action = get_object_or_404(Action, pk=action_id) action.pledge(current_user) ActionView.clear_popular_cache(action.campaign) # TODO: Should be done by ge_worker action_view = ActionView(action, current_user) action_html = render_to_string( 'action/action_full_include.html', {'action': action_view, 'geuser': current_user, 'expand': True}, context_instance=RequestContext(request)) return HttpResponse(action_html, mimetype='text/html')
def create(request, campaign_slug): """Create a new Action and Pledge on it""" if request.method != 'POST': return HttpResponseNotAllowed(['POST']) geuser = request.user.get_profile() if not 'title' in request.POST or not 'description' in request.POST: return HttpResponse('ERROR: title and description are required', mimetype='text/plain') title = request.POST['title'] description = request.POST['description'] action = Action.objects.create( campaign = get_current_campaign(), title = title, description = description, created_by = geuser) action.pledge(geuser) ActionView.clear_popular_cache(action.campaign) return redirect_to_indicator(request, campaign_slug=campaign_slug)
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 save_model(self, request, action, form, change): """Clear the cache""" super(ActionAdmin, self).save_model(request, action, form, change) Action.objects.clear_dashboard_cache(action.campaign) ActionView.clear_popular_cache(action.campaign)
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))