예제 #1
0
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') 
예제 #2
0
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) 
예제 #3
0
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))
예제 #4
0
 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)
예제 #5
0
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))