Beispiel #1
0
def register(request, campaign_slug, form_class=RegistrationForm):
    'Join the site and log right on in'
    org = get_current_organization()

    if request.method == 'POST':
        form = form_class(request.POST, request.FILES, organization = org)

        if form.is_valid():
            current_user = form.save_and_login(request)

            campaign = Campaign.objects.default(campaign_slug, org)
            campaign.add_user(current_user)

            if form.has_picture():
                crop_url = reverse('profile_crop', kwargs={'campaign_slug': campaign_slug})
                return HttpResponseRedirect(crop_url +'?new=1')
            else:
                home = reverse('campaign_home', kwargs={'campaign_slug': campaign_slug})
                return HttpResponseRedirect(home) 
    else:
        form = form_class(organization = org)
    
    return render_to_response('registration/registration_form.html',
                              {'form': form},
                              context_instance=RequestContext(request))
Beispiel #2
0
def detail(request, campaign_slug, username):
    """Users profile."""
    response_map = {}

    campaign = Campaign.objects.default(campaign_slug, get_current_organization())
    response_map['campaign'] = campaign

    geuser = Profile.objects.get(user__username = username)
    response_map['user'] = ProfileView(geuser)

    is_me = geuser == request.user.get_profile()
    response_map['is_me'] = is_me

    achieve = []
    achieve.append( {'msg': 'Joined the campaign', 'when': geuser.created} )
    for pledge in geuser.pledge_set.filter(action__campaign = campaign).order_by('-created'):
        achieve.append( 
            {'type': 'Pledged', 'msg': pledge.action.title, 'when': pledge.created } 
        )
    achieve.sort( key=operator.itemgetter('when'), reverse=True )
    response_map['achieve'] = achieve
    
    star_count = int(geuser.participation_points / 10)
    response_map['star_count'] = range(star_count)

    entries = []
    for entry in geuser.entry_set.filter(campaign=campaign).order_by('-when'):
        entries.append( EntryView(entry) )
    response_map['activity_list'] = entries

    return render_to_response(
            'profile/detail.html',
            response_map,
            context_instance = RequestContext(request))
Beispiel #3
0
def redirect_to_indicator(request, campaign_slug=None):
    'Redirects to the next indicator that needs an answer'

    try:
        geuser = request.user.get_profile()
    except Profile.DoesNotExist:
        # Admin user trying to access regular site
        return HttpResponseRedirect( 
                reverse('registration_logout', kwargs={'campaign_slug': campaign_slug}) )

    organization = get_current_organization()

    campaign = Campaign.objects.default(campaign_slug, organization)

    try:
        next_indicator = Indicator.objects.next(geuser, campaign)
        is_done = False
    except Indicator.DoesNotExist:
        is_done = True

    if is_done:
        url = reverse('results', kwargs={'campaign_slug': campaign.slug})
    else:
        url = reverse('indicator_home', 
                kwargs={'campaign_slug': campaign.slug, 'indicator_id': next_indicator.id})

    return HttpResponseRedirect(url)
Beispiel #4
0
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')
Beispiel #5
0
def search(request, campaign_slug):
    """Search actions"""

    campaign = Campaign.objects.default(campaign_slug, get_current_organization())

    query = request.REQUEST['q']
    query_set = Action.objects.filter(title__icontains = query, campaign=campaign)
    actions = [ActionView(action) for action in query_set]

    html = render_to_string(
            'action/action_list_include.html',
            {'action_list': actions},
            context_instance=RequestContext(request))
    return HttpResponse(html, mimetype='text/html')
Beispiel #6
0
def invite(request, campaign_slug):
    """Encourage users to invite their friends to the campaign"""

    response_map = {}
    campaign = Campaign.objects.default(campaign_slug, get_current_organization())
    response_map['campaign'] = campaign

    short_url = ShortURL.objects.make(campaign.get_refer_url())
    response_map['text'] = campaign.invite_message.replace('[url]', short_url) 

    return render_to_response(
            'profile/invite_include.html',
            response_map,
            context_instance=RequestContext(request))
Beispiel #7
0
def user_actions(request, campaign_slug, username):
    """List of actions user has pledged to do or already done"""
    org = get_current_organization()
    user = get_object_or_404(Profile, user__username=username)
    campaign = get_object_or_404(Campaign, slug=campaign_slug, organization=org)

    query_set = Pledge.objects.\
            filter(action__campaign = campaign, user = user).\
            order_by('is_completed', '-created')
    actions = [ActionView(pledge_obj.action, user) for pledge_obj in query_set]

    html = render_to_string(
            'action/action_list_include.html',
            {'action_list': actions},
            context_instance=RequestContext(request))
    return HttpResponse(html, mimetype='text/html')
def context(request):
    'Custom template_context_processor. Adds context for template pages'

    result = {}
    result['geuser'] = geuser = get_current_user()
    result['organization'] = get_current_organization()

    result['campaign'] = campaign = get_current_campaign()
    if request.user.is_authenticated() and geuser and campaign:
        campaign.add_user(geuser)
        result['campaign_start_date'] = campaign.get_start_date(geuser)
        result['campaign_end_date'] = campaign.get_end_date(geuser)

    result['MEDIA_1'] = settings.MEDIA_URL_1
    result['MEDIA_2'] = settings.MEDIA_URL_2
    return result
Beispiel #9
0
def login(request, campaign_slug, form_class=LoginForm):
    'Log a user in'
    
    form = form_class(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            form.login(request)

            current_user = form.cached_user.get_profile()
            campaign = Campaign.objects.default(campaign_slug, get_current_organization())
            campaign.add_user(current_user)

            home_url = reverse('campaign_home', kwargs={'campaign_slug': campaign_slug})
            return HttpResponseRedirect(home_url) 
        
    return render_to_response('registration/login.html',
                              {'form': form},
                              context_instance=RequestContext(request))
Beispiel #10
0
def redirect_to_default(request):
    """No campaign slug in URL. Redirect to the default campaign"""
    return HttpResponseRedirect(
            Campaign.objects.default(None, get_current_organization()).get_absolute_url()
            )
Beispiel #11
0
def users_json(request, campaign_slug):
    """JSON list of users in this campaign. ALL users, not just active ones."""

    campaign = Campaign.objects.default(campaign_slug, get_current_organization())
    result = campaign.users_json()
    return HttpResponse(result, mimetype='application/json')
Beispiel #12
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))
Beispiel #13
0
 def get_host_register_url(self):
     """Home page of the campaign with full domain name"""
     register = reverse('registration_register', kwargs={'campaign_slug': self.slug})
     return 'http://'+ get_current_organization().domain + register