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))
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))
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)
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 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')
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))
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
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))
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() )
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')
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))
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