コード例 #1
0
ファイル: models.py プロジェクト: grahamking/goodenergy
    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)
コード例 #2
0
ファイル: views.py プロジェクト: grahamking/goodenergy
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')
コード例 #3
0
ファイル: views.py プロジェクト: grahamking/goodenergy
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
ファイル: views.py プロジェクト: grahamking/goodenergy
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))