def view(request, thumbnail_id, template='campaign/photo/view.html'): try: photo_version = get_object_or_404(PhotoVersion, pk=thumbnail_id) campaign = photo_version.photo.content_object if not campaign.is_public: # Allow only campaign owner to see photos of unreleased campaign. if not (campaign.owner == request.user): raise Http404 size = PhotoSize.objects.get_medium() photos = PhotoVersion.objects.get_for_object(campaign, size=size) paginator = Paginator(photos, 1, orphans=0) # Show one medium-sized photo per page page_num = request.REQUEST.get('page', 0) if not page_num: # Find the page on which this photo falls assuming there's one photo per page. page_num = 1 # default is page #1 photo_values = photos.values('photo_id') for n, o in enumerate(photo_values): if o['photo_id'] == photo_version.photo.pk: page_num = n + 1 break page = paginator.page(page_num) index_link = reverse('list_campaign_photos', kwargs={'campaign_id':campaign.pk}) ctx = {'campaign':campaign, 'page':page, 'paginator':paginator, 'is_owner':campaign.owner == request.user, 'index_link':index_link} return render_view(request, template, ctx) except InvalidPage: raise Http404
def edit(request, event_id, template='event/photo/edit_form.html'): """Edit photos associated with a event.""" event = get_object_or_404(Event.visible_objects, Q(artist__user_profile__user=request.user) | Q(creator__user=request.user), pk=event_id) photoset = Photo.objects.get_for_object(event) photo_dict = dict([(p.pk, p) for p in photoset]) PhotoEditFormSet = modelformset_factory( Photo, form=PhotoEditForm, fields=PhotoEditForm._meta.fields, exclude=PhotoEditForm._meta.exclude, max_num=0, extra=0, can_delete=True) if request.POST: formset = PhotoEditFormSet(data=request.POST, files=request.FILES, queryset=photoset) if formset.is_valid(): edited_photos = formset.save() _log.info(u'Photos updated for event: %s', event) request.user.message_set.create(message=_("Photos updated.")) return HttpResponseRedirect( reverse('list_event_photos', kwargs={'event_id': event.pk})) else: formset = PhotoEditFormSet(queryset=photoset) ctx = {'event': event, 'formset': formset, 'photo_dict': photo_dict} return render_view(request, template, ctx)
def view(request, campaign_id, template='campaign/detail.html'): """Campaign detail view""" ctx = {} campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id) ctx['is_owner'] = request.user.is_authenticated( ) and request.user.id == campaign.artist.user_profile.user.id ctx['is_admin'] = request.user.has_perm('campaign.can_manage_campaigns') # Campaign changes, if available, are shown only to the campaign owner and the admin. ctx['changes'] = (ctx['is_owner'] or ctx['is_admin']) and campaign.changed_version if not campaign.is_approved: # Only admins and campaign owners may see unapproved campaigns. if not request.user.is_authenticated(): return HttpResponseRedirect("%s?next=%s" % (reverse('login'), request.path)) if not (ctx['is_owner'] or ctx['is_admin']): # We could return an HTTP forbidden response here but we don't want a malicious user # to know if a campaign even exists with this id. # So, we raise a 404 - Page Not Found instead. raise Http404 ctx['c'] = campaign ctx['campaign'] = campaign if request.user.is_authenticated(): ctx['comment_form'] = CommentForm(author=request.user, target_instance=campaign) if not ctx['is_owner']: stats = campaign.stats stats.num_views = stats.num_views + 1 stats.save() return render_view(request, template, ctx)
def member_upload(request, event_id, template='event/photo/upload_form.html'): event = get_object_or_404(Event.objects.public().select_related('artist__user_profile__user'), pk=event_id) user = request.user if event.owner.pk == request.user.pk: return HttpResponseRedirect(reverse('upload_event_photo', kwargs={'event_id':event.pk})) # Ensure that this user can't upload more photos than the allowed limit. photo_count = Photo.objects.get_for_object(event, user=request.user).count() limit = settings.EVENT_MAX_PHOTOS_PER_MEMBER event_url = reverse('view_event', kwargs={'event_id':event.pk}) photo_url = reverse('list_event_photos', kwargs={'event_id':event.pk}) if photo_count >= limit: user.message_set.create(message=_("You can not upload more than %s photos to this event." % limit)) return HttpResponseRedirect(reverse('view_event', kwargs={'event_id':event.pk})) if request.POST: form = forms.MemberPhotoForm(data=request.POST, files=request.FILES) if form.is_valid(): if photo_count == limit: submit = 'Add' else: submit = request.POST.get('submit', 'Add') photo = form.save(content_object=event, display_order=9999999, user=request.user_profile) _log.info('Photo uploaded: (%s) %s', photo.pk, photo.title) special_mesg = _('''<a href="%s">New photos</a> have been added to one of <a href="%s">your shows.</a>''' % (photo_url, event_url)) event.notify_attendees(special_mesg, exclude=[user.pk]) if 'Another' in submit: user.message_set.create(message=_("%s Photo uploaded. You can add another photo below.") % photo.image_preview('square_thumbnail')) return HttpResponseRedirect(reverse('upload_event_photo_member', kwargs={'event_id':event.pk})) else: user.message_set.create(message=_("Photo uploaded.")) return HttpResponseRedirect(reverse('view_event', kwargs={'event_id':event.pk})) else: form = forms.MemberPhotoForm() ctx = {'event':event, 'form':form, 'allow_another':photo_count < limit-1, 'member_mode':True} return render_view(request, template, ctx)
def delete(request, campaign_id, template='campaign/campaign_deletion_form.html'): campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id, artist__user_profile__user=request.user) ctx = {'campaign': campaign, 'c': campaign} if request.method == 'POST': form = forms.DeleteCampaignForm(data=request.POST) if form.is_valid(): if campaign.is_deletable: campaign.delete() request.user.message_set.create( message=_('Your campaign has been deleted.')) return HttpResponseRedirect(reverse('artist_admin')) else: ActionItem.objects.q_admin_action(campaign, 'delete-campaign') request.user.message_set.create(message=_( 'Your campaign deletion request has been submitted. An administrator will review it shortly.' )) email_template('Campaign deletion requested by %s' % request.user.username, 'campaign/email/request_deletion.txt', {'campaign': campaign}, to_list=settings.CAMPAIGN_APPROVERS) _log.info('Campaign deletion requested: (%s) %s', campaign.pk, campaign.short_title) return HttpResponseRedirect( reverse('view_campaign', kwargs={'campaign_id': campaign_id})) else: form = forms.DeleteCampaignForm() ctx['form'] = form return render_view(request, template, ctx)
def request_tickets(request, campaign_id, template='campaign/request_tickets_form.html'): campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id, artist__user_profile__user=request.user, is_approved=True) if not campaign.are_tickets_available: request.user.message_set.create( message=_('Tickets are not available for this campaign.')) return HttpResponseRedirect( reverse('view_campaign', kwargs={'campaign_id': campaign.pk})) if request.POST: form = forms.RequestTicketsForm(instance=campaign, data=request.POST) if form.is_valid(): form.save() request.user.message_set.create(message=_( "Your campaign ticket request has been sent to the admins. Your tickets will be mailed out shortly." )) _log.info('Campaign tickets requested: (%s) %s', campaign.pk, campaign.short_title) return HttpResponseRedirect( reverse('view_campaign', kwargs={'campaign_id': campaign.pk})) else: form = forms.RequestTicketsForm(instance=campaign) ctx = {'form': form, 'campaign': campaign} return render_view(request, template, ctx)
def qualify(request, campaign_id, template='campaign/campaign_qualification_form.html'): ticket_code = request.session.get('open_ticket_code', None) campaign = get_object_or_404(Campaign.objects.public(), pk=campaign_id) qualifies, reasons = campaign.is_user_qualified(request.user) if qualifies and ticket_code: return HttpResponseRedirect(reverse('redeem_ticket')) else: _log.debug("Qualification needed: %s", reasons) if request.POST: form = forms.QualificationForm(data=request.POST, campaign=campaign, user_profile=request.user.get_profile()) if form.is_valid(): user_profile = form.save(commit=True) request.user.message_set.create( message=_('Your profile has been updated.')) if ticket_code: return HttpResponseRedirect(reverse('redeem_ticket')) else: return HttpResponseRedirect( reverse('view_campaign', kwargs={'campaign_id': campaign_id})) else: form = forms.QualificationForm(campaign=campaign, user_profile=request.user.get_profile()) ctx = {'campaign': campaign, 'c': campaign, 'form': form} return render_view(request, template, ctx)
def list_attendees(request, event_id, template='event/attendees.html'): ctx = {} event = get_object_or_404(Event.visible_objects, pk=event_id) attendees = UserProfile.objects.select_related('user').filter(user__attendee__event__pk=event.pk).order_by("user__username") page = paginate(request, attendees, 100) # Show 100 attendees per page. ctx.update({'event':event, 'page':page}) return render_view(request, template, ctx)
def old_homepage(request, template='website/homepage.html'): ctx = {} # Merge event and campaign badges by their homepage worthiness date. key = u'ir-top3-boxes' if request.user.is_authenticated() and request.user.is_staff: # No caching for staff users top3_objects = None else: top3_objects = cache.get(key, None) if top3_objects is None: cx = list( Campaign.objects.active( is_homepage_worthy=True).order_by('-homepage_worthy_on')[:15]) ex = list( Event.objects.active( is_homepage_worthy=True).order_by('-homepage_worthy_on')[:15]) mx = ex + cx mx.sort(key=lambda x: x.homepage_worthy_on, reverse=True) top3_objects = mx[:3] cache.set(key, top3_objects, int(settings.UI_SETTINGS['UI_CACHE_TIMEOUT'])) ctx['top3'] = top3_objects # Save top3 object ids so we can exclude them from the mixed feed later top3_campaigns = [] top3_events = [] for o in top3_objects: if hasattr(o, 'venue'): top3_events.append(o.pk) else: top3_campaigns.append(o.pk) # Merge 10 event and campaign objects. key = u'ir-hp-mixedfeed' if request.user.is_authenticated() and request.user.is_staff: # No caching for staff users mixed_feed = None else: mixed_feed = cache.get(key, None) if mixed_feed is None: # Exclude campaigns and events already shown in `top3` above c2x = list(Campaign.objects.active().exclude( pk__in=top3_campaigns).order_by('end_date')[:25]) e2x = list(Event.objects.active().exclude( pk__in=top3_events).order_by('event_date')[:25]) m2x = e2x + c2x m2x.sort(key=lambda x: x.sort_date, reverse=False) mixed_feed = m2x[:10] cache.set(key, mixed_feed, int(settings.UI_SETTINGS['UI_CACHE_TIMEOUT'])) ctx['mixed_feed'] = mixed_feed size = PhotoSize.objects.get_thumbnail(cropped=True) photos = PhotoVersion.objects.select_related('photo').filter( size=size).order_by("-updated_on")[:16] ctx['photos'] = photos if request.user.is_authenticated(): ctx['special_messages'] = get_and_delete_messages(request.user, 1) return render_view(request, template, ctx)
def list_contributors(request, campaign_id, template='campaign/contributors.html'): ctx = {} campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id, artist__user_profile__user=request.user, is_approved=True) contribs = list(campaign.contribution_set.all().order_by("contributor__username")) tickets = list(campaign.ticket_set.filter(is_redeemed=True).order_by("redeemed_by__username")) contributions = contribs + tickets if request.REQUEST.get('format', 'html') == 'csv': content_type = "text/csv; charset=%s" % settings.DEFAULT_CHARSET response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename=campaign_%s_contributors.csv' % campaign.pk writer = csv.writer(response) r = writer.writerow r(['Campaign contributors']) r(['Campaign #%s' % campaign.pk, smart_str(campaign.title)]) headers = ['User', 'First name', 'Last name'] #, 'Email'] if campaign.is_free: headers.append('Joined on') def amount_fn(row, contribution): row.append(contribution.paid_on) else: headers.extend(['Type', 'Amount', 'Qty', 'Paid on']) def amount_fn(row, contribution): row.extend([contribution.contrib_type, contribution.amount, contribution.qty, contribution.paid_on]) if campaign.phone_required: headers.append('Phone') def phone_fn(row, contribution): row.append(contribution.contributor.get_profile().phone) else: def phone_fn(row, contribution): pass if campaign.address_required: headers.extend(['Address', 'Address 2', 'City', 'State Zip']) def address_fn(row, contribution): try: adr = contribution.contributor.get_profile().address row.extend([ smart_str(adr.address1), adr.address2 and smart_str(adr.address2) or '', adr.city, adr.state + ' ' + adr.postal_code ]) except ObjectDoesNotExist: row.extend(['', '', '', '']) else: def address_fn(row, contribution): pass r(headers) for c in contributions: u = c.contributor username = (u.is_active and u.username != 'anonymous') and u.username or '' row = [username, u.first_name, u.last_name] #, u.email] amount_fn(row, c) phone_fn(row, c) address_fn(row, c) r(row) return response else: page = paginate(request, contributions, 100) # Show 100 contributors per page. ctx.update({'campaign':campaign, 'page':page}) return render_view(request, template, ctx)
def recommended_events(request, limit=10, template='event/tags/recommended_events.html'): """Render event calendar for the logged in user""" try: ctx = {} if not request.user.is_authenticated: if request.is_ajax(): raise Http404 return HttpResponseRedirect("%s?next=%s" % (reverse("login"), reverse("event_recommended"))) events = Event.objects.active().filter( recommendedevent__user_profile=request.user_profile ).distinct().order_by('event_date', 'event_start_time', 'pk') if settings.RECOMMENDED_EVENTS_FILTER_BY_LOCATION: events = events.filter(location__in=('destination', request.location)) n = events.count() if not n: # fallback to user-entered events events = events.filter(location__in=('user-entered', request.location)) n = events.count() else: ctx['city'] = request.location_name ctx['recommended_count'] = n if limit: events = events[:int(limit)] ctx['events'] = events return render_view(request, template, ctx) except Exception, e: _log.exception(e) raise
def edit(request, event_id, template='event/photo/edit_form.html'): """Edit photos associated with a event.""" event = get_object_or_404(Event.visible_objects, Q(artist__user_profile__user=request.user) | Q(creator__user=request.user), pk=event_id) photoset = Photo.objects.get_for_object(event) photo_dict = dict([(p.pk, p) for p in photoset]) PhotoEditFormSet = modelformset_factory(Photo, form=PhotoEditForm, fields=PhotoEditForm._meta.fields, exclude=PhotoEditForm._meta.exclude, max_num=0, extra=0, can_delete=True) if request.POST: formset = PhotoEditFormSet(data=request.POST, files=request.FILES, queryset=photoset) if formset.is_valid(): edited_photos = formset.save() _log.info(u'Photos updated for event: %s', event) request.user.message_set.create(message=_("Photos updated.")) return HttpResponseRedirect(reverse('list_event_photos', kwargs={'event_id':event.pk})) else: formset = PhotoEditFormSet(queryset=photoset) ctx = {'event':event, 'formset':formset, 'photo_dict':photo_dict} return render_view(request, template, ctx)
def message_contributors(request, campaign_id, form_class=messageforms.ComposeForm, template_name='messages/compose.html', success_url=None): """Send a message to all contributors of the given campaign.""" campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id, artist__user_profile__user=request.user, is_approved=True) form = form_class() if request.method == "POST": form = form_class(request.POST) if form.is_valid(): form.save(sender=request.user) request.user.message_set.create( message=_(u"Message successfully sent.")) if success_url is None: success_url = reverse('view_campaign', kwargs={'campaign_id': campaign.pk}) return HttpResponseRedirect(success_url) else: form = form_class() contributions = campaign.contribution_set.members().order_by( "contributor__username") recipients = list(set([c.contributor for c in contributions])) form.fields['recipient'].initial = recipients return render_view(request, template_name, {'form': form})
def view(request, campaign_id, template='campaign/detail.html'): """Campaign detail view""" ctx = {} campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id) ctx['is_owner'] = request.user.is_authenticated() and request.user.id == campaign.artist.user_profile.user.id ctx['is_admin'] = request.user.has_perm('campaign.can_manage_campaigns') # Campaign changes, if available, are shown only to the campaign owner and the admin. ctx['changes'] = (ctx['is_owner'] or ctx['is_admin']) and campaign.changed_version if not campaign.is_approved: # Only admins and campaign owners may see unapproved campaigns. if not request.user.is_authenticated(): return HttpResponseRedirect("%s?next=%s" % (reverse('login'), request.path)) if not (ctx['is_owner'] or ctx['is_admin']): # We could return an HTTP forbidden response here but we don't want a malicious user # to know if a campaign even exists with this id. # So, we raise a 404 - Page Not Found instead. raise Http404 ctx['c'] = campaign ctx['campaign'] = campaign if request.user.is_authenticated(): ctx['comment_form'] = CommentForm(author=request.user, target_instance=campaign) if not ctx['is_owner']: stats = campaign.stats stats.num_views = stats.num_views + 1 stats.save() return render_view(request, template, ctx)
def confirm_account(request, user_id=None, code=None, template='registration/confirm_account_form.html'): ctx = {} next = request.REQUEST.get("next", reverse("list_events")) if user_id and code: # user visited the direct confirmation link activation_code = u"%s-%s" % (user_id, code) profile, mesg = UserProfile.objects.activate_user(activation_code) if profile: add_message(request, u"Thank you for confirming your email address.") if not request.user.is_authenticated(): user = profile.user backend = get_backends()[0] user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__) login(request, user) return HttpResponseRedirect(next) else: add_message(request, mesg) if request.method == 'POST': # user has typed in the confirmation code manually form = forms.ActivationForm(data=request.POST, files=request.FILES) if form.is_valid(): add_message(request, u"Thank you for confirming your email address.") if not request.user.is_authenticated(): user = form.user_profile.user backend = get_backends()[0] user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__) login(request, user) return HttpResponseRedirect(next) else: form = forms.ActivationForm() ctx['form'] = form ctx['next'] = next return render_view(request, template, ctx)
def upload(request, event_id, template='event/photo/upload_form.html'): event = get_object_or_404(Event.visible_objects, Q(artist__user_profile__user=request.user) | Q(creator__user=request.user), pk=event_id) user = request.user event_url = event.get_absolute_url() photo_url = reverse('list_event_photos', kwargs={'event_id':event.pk}) if request.POST: form = PhotoForm(data=request.POST, files=request.FILES) if form.is_valid(): photo = form.save(content_object=event) _log.info('Photo uploaded: (%s) %s', photo.pk, photo.title) special_mesg = _('''<a href="%s">New photos</a> have been added to one of <a href="%s">your shows.</a>''' % (photo_url, event_url)) event.notify_attendees(special_mesg, exclude=[user.pk]) if 'Another' in request.POST.get('submit', 'Add'): user.message_set.create(message=_("%s Photo uploaded. You can add another photo below.") % photo.image_preview('square_thumbnail')) return HttpResponseRedirect(reverse('upload_event_photo', kwargs={'event_id':event.pk})) else: user.message_set.create(message=_("Photo uploaded.")) return HttpResponseRedirect(event_url) else: form = PhotoForm() ctx = {'event':event, 'form':form, 'allow_another':True} return render_view(request, template, ctx)
def register(request, template='artist/registration_form.html', redirect_field_name='next'): """THIS ARTIST REGISTRATION VIEW IS NO LONGER USED. It's been superceded by ArtistRegistrationFormWizard instead. """ if request.user.is_authenticated(): return HttpResponseRedirect(reverse(_ARTIST_REGISTRATION_NEXT)) redirect_to = request.REQUEST.get(redirect_field_name, '') if request.POST: captcha_answer = captcha.get_answer(request) form = forms.ArtistRegistrationForm(captcha_answer=captcha_answer, data=request.POST, files=request.FILES) if form.is_valid(): user = form.save() user = authenticate(username=user.username, password=form.cleaned_data['password1']) login(request, user) user.message_set.create(message=_(u'The account for <em>%s</em> has now been registered. Welcome!' % user.get_profile().artist.name)) _log.info('Artist registered: %s', user.username) email_template('Welcome to %s!' % settings.UI_SETTINGS['UI_SITE_TITLE'], 'artist/email/welcome.txt', {'user':user}, to_list=[user.email]) if request.session.test_cookie_worked(): request.session.delete_test_cookie() if not redirect_to or '//' in redirect_to or ' ' in redirect_to: redirect_to = reverse(_ARTIST_REGISTRATION_NEXT) return HttpResponseRedirect(redirect_to) else: form = forms.ArtistRegistrationForm() request.session.set_test_cookie() ctx = {'form':form, 'auto_populate_url':True, redirect_field_name:redirect_to} return render_view(request, template, ctx)
def upload(request, event_id, template='event/photo/upload_form.html'): event = get_object_or_404(Event.visible_objects, Q(artist__user_profile__user=request.user) | Q(creator__user=request.user), pk=event_id) user = request.user event_url = event.get_absolute_url() photo_url = reverse('list_event_photos', kwargs={'event_id': event.pk}) if request.POST: form = PhotoForm(data=request.POST, files=request.FILES) if form.is_valid(): photo = form.save(content_object=event) _log.info('Photo uploaded: (%s) %s', photo.pk, photo.title) special_mesg = _( '''<a href="%s">New photos</a> have been added to one of <a href="%s">your shows.</a>''' % (photo_url, event_url)) event.notify_attendees(special_mesg, exclude=[user.pk]) if 'Another' in request.POST.get('submit', 'Add'): user.message_set.create(message=_( "%s Photo uploaded. You can add another photo below.") % photo.image_preview('square_thumbnail') ) return HttpResponseRedirect( reverse('upload_event_photo', kwargs={'event_id': event.pk})) else: user.message_set.create(message=_("Photo uploaded.")) return HttpResponseRedirect(event_url) else: form = PhotoForm() ctx = {'event': event, 'form': form, 'allow_another': True} return render_view(request, template, ctx)
def delete(request, event_id, template='event/event_deletion_form.html'): event = get_object_or_404(Event.visible_objects, Q(artist__user_profile__user=request.user) | Q(creator__user=request.user), pk=event_id) #is_submitted=False ctx = {'event':event, 'c':event} if request.method == 'POST': form = forms.DeleteEventForm(data=request.POST) if form.is_valid(): if event.is_deletable: event.delete() request.user.message_set.create(message=_('Your event has been deleted.')) return HttpResponseRedirect(reverse('artist_admin')) else: # ActionItem.objects.q_admin_action(event, 'delete-event') request.user.message_set.create(message=_('Your event deletion request has been submitted. An admin will review it shortly.')) email_template('Event deletion requested by %s' % request.user.username, 'event/email/request_deletion.txt', {'event':event}, to_list=settings.EVENT_APPROVERS) _log.info('Event deletion requested: (%s) %s', event.pk, event.short_title) return HttpResponseRedirect(reverse('view_event', kwargs={'event_id':event_id})) else: form = forms.DeleteEventForm() ctx['form'] = form return render_view(request, template, ctx)
def dynamic_badge(request, event_id, event=None, template='event/dynamic_badge.html'): """Event badge""" ctx = {} if not event: event = get_object_or_404(Event.visible_objects.select_related('creator__user', 'artist__user_profile__user', 'venue'), pk=event_id) ctx['e'] = event ctx['event'] = event return render_view(request, template, ctx)
def list_campaigns(request, template='campaign/list.html', queryset=None, extra_context=None): if queryset is None: queryset = Campaign.objects.active().order_by('-end_date') page = paginate(request, queryset, settings.CAMPAIGNS_PER_PAGE, orphans=3) ctx = {'page':page, 'title':'Current campaigns'} if extra_context: ctx.update(extra_context) return render_view(request, template, ctx)
def edit(request, campaign_id=None, template='campaign/campaign_edit_form.html'): ctx = {} approved_campaign_edit = False FormClass = forms.get_campaign_form(request) if campaign_id is not None: # We are in update mode. Get the campaign instance if it belongs to # this user and it has not yet been submitted for admin approval. campaign = get_object_or_404( Campaign.visible_objects, pk=campaign_id, artist__user_profile__user=request.user) #is_submitted=False mode = 'update' ctx['campaign'] = campaign if campaign.is_approved: # Approved campaigns use a different form to track changes FormClass = forms.get_campaign_edit_form(campaign, request) approved_campaign_edit = True else: campaign = Campaign(artist=request.user.get_profile().artist) mode = 'create' if request.POST: form = FormClass(data=request.POST, files=request.FILES, instance=campaign) if form.is_valid(): if approved_campaign_edit: campaign_change = form.save(commit=True) ActionItem.objects.q_admin_action(campaign, 'approve-campaign-edit') email_template('Campaign Edited: approval requested by %s' % request.user.username, 'campaign/email/request_approval_edit.txt', {'campaign': campaign}, to_list=settings.CAMPAIGN_APPROVERS, fail_silently=False) request.user.message_set.create(message=_( "This is what your updated campaign page will look like once an admin approves your changes." )) else: campaign = form.save(commit=False) campaign.save() request.user.message_set.create(message=_( "This is what your updated campaign page will look like. If you are happy with it, please submit it for approval." )) if campaign_id is None: _log.info('Campaign created: (%s) %s', campaign.pk, campaign.short_title) else: _log.info('Campaign updated: (%s) %s', campaign.pk, campaign.short_title) return HttpResponseRedirect(campaign.get_absolute_url()) else: form = FormClass(instance=campaign) ctx.update({'form': form, 'mode': mode}) return render_view(request, template, ctx)
def redeem_ticket(request, template='campaign/redeem_ticket.html'): """Redeem a campaign ticket. Kabir: The way I see it working is: Once they type in the redemption code, it will ask them to login or create an account. New users create an account. The system checks to see what information it needs for the redemption code they typed in and asks them to fill in the additional needed information. Then it redeems the ticket. """ ticket_code = request.session.get('open_ticket_code', None) try: del request.session['open_ticket_code'] except KeyError: pass if request.POST or ticket_code: data = request.POST.copy() if ticket_code: data[u'code'] = ticket_code form = forms.RedeemTicketForm(data=data) if form.is_valid(): if request.user.is_authenticated(): ticket = form.save(commit=False, user=request.user) qualifies, reasons = ticket.campaign.is_user_qualified( request.user) if qualifies: ticket.save() _log.info('Ticket redeemed %s', ticket) if ticket.amount: request.user.message_set.create(message=_( 'Your $%.2f ticket has been redeemed. Thank you.' % ticket.amount)) else: request.user.message_set.create(message=_( 'Your ticket has been redeemed. Thank you.')) return HttpResponseRedirect( reverse('view_campaign', kwargs={'campaign_id': ticket.campaign.pk})) else: # The logged-in user does not have all qualifying fields for # the campaign whose ticket is being redeemed. # Therefore, store the ticket code into the session and # give the user a chance to fill out the qualifying fields. request.session['open_ticket_code'] = form.cleaned_data[ 'code'] return HttpResponseRedirect( reverse('qualify_for_campaign', kwargs={'campaign_id': ticket.campaign.pk})) else: # user not logged in request.session['open_ticket_code'] = form.cleaned_data['code'] return HttpResponseRedirect( "%s?next=%s" % (reverse('login'), reverse('redeem_ticket'))) else: form = forms.RedeemTicketForm() ctx = {'form': form} return render_view(request, template, ctx)
def member_upload(request, event_id, template='event/photo/upload_form.html'): event = get_object_or_404( Event.objects.public().select_related('artist__user_profile__user'), pk=event_id) user = request.user if event.owner.pk == request.user.pk: return HttpResponseRedirect( reverse('upload_event_photo', kwargs={'event_id': event.pk})) # Ensure that this user can't upload more photos than the allowed limit. photo_count = Photo.objects.get_for_object(event, user=request.user).count() limit = settings.EVENT_MAX_PHOTOS_PER_MEMBER event_url = reverse('view_event', kwargs={'event_id': event.pk}) photo_url = reverse('list_event_photos', kwargs={'event_id': event.pk}) if photo_count >= limit: user.message_set.create( message=_("You can not upload more than %s photos to this event." % limit)) return HttpResponseRedirect( reverse('view_event', kwargs={'event_id': event.pk})) if request.POST: form = forms.MemberPhotoForm(data=request.POST, files=request.FILES) if form.is_valid(): if photo_count == limit: submit = 'Add' else: submit = request.POST.get('submit', 'Add') photo = form.save(content_object=event, display_order=9999999, user=request.user_profile) _log.info('Photo uploaded: (%s) %s', photo.pk, photo.title) special_mesg = _( '''<a href="%s">New photos</a> have been added to one of <a href="%s">your shows.</a>''' % (photo_url, event_url)) event.notify_attendees(special_mesg, exclude=[user.pk]) if 'Another' in submit: user.message_set.create(message=_( "%s Photo uploaded. You can add another photo below.") % photo.image_preview('square_thumbnail') ) return HttpResponseRedirect( reverse('upload_event_photo_member', kwargs={'event_id': event.pk})) else: user.message_set.create(message=_("Photo uploaded.")) return HttpResponseRedirect( reverse('view_event', kwargs={'event_id': event.pk})) else: form = forms.MemberPhotoForm() ctx = { 'event': event, 'form': form, 'allow_another': photo_count < limit - 1, 'member_mode': True } return render_view(request, template, ctx)
def list_sponsors(request, campaign_id, template='campaign/sponsors.html'): ctx = {} campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id) contributors = UserProfile.objects.select_related('user').filter( Q(user__contribution__campaign__pk=campaign.pk) | Q(user__ticket__campaign__pk=campaign.pk) ).distinct().order_by("user__username") page = paginate(request, contributors, 100) # Show 100 contributors per page. ctx.update({'campaign':campaign, 'page':page}) return render_view(request, template, ctx)
def view(request, thumbnail_id, template='event/photo/view.html'): try: photo_version = get_object_or_404(PhotoVersion, pk=thumbnail_id) event = photo_version.photo.content_object if not event.is_public: # Allow only event owner to see photos of unreleased event. if not (event.owner == request.user): raise Http404 size = PhotoSize.objects.get_medium() photos = PhotoVersion.objects.get_for_object(event, size=size) paginator = Paginator( photos, 1, orphans=0) # Show one medium-sized photo per page page_num = request.REQUEST.get('page', 0) if not page_num: # Find the page on which this photo falls assuming there's one photo per page. page_num = 1 # default is page #1 photo_values = photos.values('photo_id') for n, o in enumerate(photo_values): if o['photo_id'] == photo_version.photo.pk: page_num = n + 1 break try: page = paginator.page(page_num) except InvalidPage: page = paginator.page(1) index_link = reverse('list_event_photos', kwargs={'event_id': event.pk}) is_owner = request.user.is_authenticated( ) and request.user.pk == event.owner.pk ctx = { 'event': event, 'page': page, 'paginator': paginator, 'is_owner': event.owner == request.user, 'index_link': index_link, 'is_owner': is_owner } if request.is_ajax(): for photo in page.object_list: ph = photo break ctx.update({'request': request, 'photo': ph}) photo_html = loader.get_template( "photo/tags/one-photo.html").render(Context(ctx)) json = { 'success': True, 'photo_next_page': page.next_page_number(), 'photo_pk': ph.pk, 'photo_html': photo_html } return HttpResponse(simplejson.dumps(json), mimetype='application/json') return render_view(request, template, ctx) except InvalidPage: raise Http404
def list_campaigns(request, template='campaign/list.html', queryset=None, extra_context=None): if queryset is None: queryset = Campaign.objects.active().order_by('-end_date') page = paginate(request, queryset, settings.CAMPAIGNS_PER_PAGE, orphans=3) ctx = {'page': page, 'title': 'Current campaigns'} if extra_context: ctx.update(extra_context) return render_view(request, template, ctx)
def list_sponsors(request, campaign_id, template='campaign/sponsors.html'): ctx = {} campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id) contributors = UserProfile.objects.select_related('user').filter( Q(user__contribution__campaign__pk=campaign.pk) | Q(user__ticket__campaign__pk=campaign.pk)).distinct().order_by( "user__username") page = paginate(request, contributors, 100) # Show 100 contributors per page. ctx.update({'campaign': campaign, 'page': page}) return render_view(request, template, ctx)
def anon_contribute_by_payment_mode(request, campaign_id, payment_mode, template='campaign/campaign_contribution_form_%s_anon.html'): """Process a PayPal or Google Checkout based anonymous contribution.""" campaign = get_object_or_404(Campaign.objects.active(), pk=campaign_id) payment_option = campaign.artist.get_merchant_account(payment_mode) if not payment_option: raise Http404 template = template % payment_option.payment_mode ctx = {'campaign':campaign, 'c':campaign, 'payment_option':payment_option, 'is_anon':True, 'proceed_to_pay':True} if campaign.is_free: return HttpResponseRedirect(reverse('contribute_to_campaign', kwargs={'campaign_id':campaign_id})) return render_view(request, template, ctx)
def print_tickets(request, campaign_id, template='campaign/print-tickets.html'): ctx = {} campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id) ctx['c'] = campaign ctx['unprinted'] = campaign.ticket_set.unredeemed(is_printed=False) ctx['printed'] = campaign.ticket_set.unredeemed(is_printed=True) ctx['redeemed'] = campaign.ticket_set.redeemed() if request.method == 'POST': # Printing completed. Mark tickets and action items as done. ActionItem.objects.q_admin_action_done(campaign, 'print-tickets') ctx['unprinted'].update(is_printed=True) #printed_on=datetime.now()) return render_view(request, template, ctx)
def old_homepage(request, template='website/homepage.html'): ctx = {} # Merge event and campaign badges by their homepage worthiness date. key = u'ir-top3-boxes' if request.user.is_authenticated() and request.user.is_staff: # No caching for staff users top3_objects = None else: top3_objects = cache.get(key, None) if top3_objects is None: cx = list(Campaign.objects.active(is_homepage_worthy=True).order_by('-homepage_worthy_on')[:15]) ex = list(Event.objects.active(is_homepage_worthy=True).order_by('-homepage_worthy_on')[:15]) mx = ex + cx mx.sort(key=lambda x:x.homepage_worthy_on, reverse=True) top3_objects = mx[:3] cache.set(key, top3_objects, int(settings.UI_SETTINGS['UI_CACHE_TIMEOUT'])) ctx['top3'] = top3_objects # Save top3 object ids so we can exclude them from the mixed feed later top3_campaigns = [] top3_events = [] for o in top3_objects: if hasattr(o, 'venue'): top3_events.append(o.pk) else: top3_campaigns.append(o.pk) # Merge 10 event and campaign objects. key = u'ir-hp-mixedfeed' if request.user.is_authenticated() and request.user.is_staff: # No caching for staff users mixed_feed = None else: mixed_feed = cache.get(key, None) if mixed_feed is None: # Exclude campaigns and events already shown in `top3` above c2x = list(Campaign.objects.active().exclude(pk__in=top3_campaigns).order_by('end_date')[:25]) e2x = list(Event.objects.active().exclude(pk__in=top3_events).order_by('event_date')[:25]) m2x = e2x + c2x m2x.sort(key=lambda x:x.sort_date, reverse=False) mixed_feed = m2x[:10] cache.set(key, mixed_feed, int(settings.UI_SETTINGS['UI_CACHE_TIMEOUT'])) ctx['mixed_feed'] = mixed_feed size = PhotoSize.objects.get_thumbnail(cropped=True) photos = PhotoVersion.objects.select_related('photo').filter(size=size).order_by("-updated_on")[:16] ctx['photos'] = photos if request.user.is_authenticated(): ctx['special_messages'] = get_and_delete_messages(request.user, 1) return render_view(request, template, ctx)
def post_comment(request, campaign_id, template='campaign/comment_form.html'): campaign = get_object_or_404(Campaign.objects.public(), pk=campaign_id) if request.method == 'POST': form = CommentForm(author=request.user, target_instance=campaign, data=request.POST) if form.is_valid(): comment = form.save() request.user.message_set.create(message=_('Thank you for your <a href="#c%s">comment »</a>' % comment.pk)) _log.debug('Campaign comment posted: (%s)', comment.get_as_text()) cache_killer = "%s-%s"% (random.randint(0, 10000), time()) return HttpResponseRedirect(reverse('view_campaign', kwargs={'campaign_id':campaign.pk}) + "?q=%s&new_c=y" % cache_killer) else: form = CommentForm(author=request.user, target_instance=campaign) ctx = {'form':form, 'comment_form':form, 'campaign':campaign} return render_view(request, template, ctx)
def post_comment(request, event_id, template='event/comment_form.html'): event = get_object_or_404(Event.objects.public(), pk=event_id) if request.method == 'POST': form = forms.EventCommentForm(author=request.user, target_instance=event, data=request.POST) if form.is_valid(): comment = form.save() request.user.message_set.create(message=_('Thank you for your <a href="#c%s">comment »</a>' % comment.pk)) _log.debug('Event comment posted: (%s)', comment.get_as_text()) cache_killer = "%s-%s"% (random.randint(0, 10000), time()) return HttpResponseRedirect(event.get_absolute_url() + "?q=%s" % cache_killer) else: form = forms.EventCommentForm(author=request.user, target_instance=event) ctx = {'form':form, 'comment_form':form, 'event':event} return render_view(request, template, ctx)
def view(request, thumbnail_id, template='event/photo/view.html'): try: photo_version = get_object_or_404(PhotoVersion, pk=thumbnail_id) event = photo_version.photo.content_object if not event.is_public: # Allow only event owner to see photos of unreleased event. if not (event.owner == request.user): raise Http404 size = PhotoSize.objects.get_medium() photos = PhotoVersion.objects.get_for_object(event, size=size) paginator = Paginator(photos, 1, orphans=0) # Show one medium-sized photo per page page_num = request.REQUEST.get('page', 0) if not page_num: # Find the page on which this photo falls assuming there's one photo per page. page_num = 1 # default is page #1 photo_values = photos.values('photo_id') for n, o in enumerate(photo_values): if o['photo_id'] == photo_version.photo.pk: page_num = n + 1 break try: page = paginator.page(page_num) except InvalidPage: page = paginator.page(1) index_link = reverse('list_event_photos', kwargs={'event_id':event.pk}) is_owner = request.user.is_authenticated() and request.user.pk == event.owner.pk ctx = {'event':event, 'page':page, 'paginator':paginator, 'is_owner':event.owner == request.user, 'index_link':index_link, 'is_owner':is_owner} if request.is_ajax(): for photo in page.object_list: ph = photo break ctx.update({'request':request, 'photo':ph}) photo_html = loader.get_template("photo/tags/one-photo.html").render(Context(ctx)) json = { 'success':True, 'photo_next_page':page.next_page_number(), 'photo_pk':ph.pk, 'photo_html':photo_html } return HttpResponse(simplejson.dumps(json), mimetype='application/json') return render_view(request, template, ctx) except InvalidPage: raise Http404
def request_tickets(request, campaign_id, template='campaign/request_tickets_form.html'): campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id, artist__user_profile__user=request.user, is_approved=True) if not campaign.are_tickets_available: request.user.message_set.create(message=_('Tickets are not available for this campaign.')) return HttpResponseRedirect(reverse('view_campaign', kwargs={'campaign_id':campaign.pk})) if request.POST: form = forms.RequestTicketsForm(instance=campaign, data=request.POST) if form.is_valid(): form.save() request.user.message_set.create(message=_("Your campaign ticket request has been sent to the admins. Your tickets will be mailed out shortly.")) _log.info('Campaign tickets requested: (%s) %s', campaign.pk, campaign.short_title) return HttpResponseRedirect(reverse('view_campaign', kwargs={'campaign_id':campaign.pk})) else: form = forms.RequestTicketsForm(instance=campaign) ctx = {'form':form, 'campaign':campaign} return render_view(request, template, ctx)
def redeem_ticket(request, template='campaign/redeem_ticket.html'): """Redeem a campaign ticket. Kabir: The way I see it working is: Once they type in the redemption code, it will ask them to login or create an account. New users create an account. The system checks to see what information it needs for the redemption code they typed in and asks them to fill in the additional needed information. Then it redeems the ticket. """ ticket_code = request.session.get('open_ticket_code', None) try: del request.session['open_ticket_code'] except KeyError: pass if request.POST or ticket_code: data = request.POST.copy() if ticket_code: data[u'code'] = ticket_code form = forms.RedeemTicketForm(data=data) if form.is_valid(): if request.user.is_authenticated(): ticket = form.save(commit=False, user=request.user) qualifies, reasons = ticket.campaign.is_user_qualified(request.user) if qualifies: ticket.save() _log.info('Ticket redeemed %s', ticket) if ticket.amount: request.user.message_set.create(message=_('Your $%.2f ticket has been redeemed. Thank you.' % ticket.amount)) else: request.user.message_set.create(message=_('Your ticket has been redeemed. Thank you.')) return HttpResponseRedirect(reverse('view_campaign', kwargs={'campaign_id':ticket.campaign.pk})) else: # The logged-in user does not have all qualifying fields for # the campaign whose ticket is being redeemed. # Therefore, store the ticket code into the session and # give the user a chance to fill out the qualifying fields. request.session['open_ticket_code'] = form.cleaned_data['code'] return HttpResponseRedirect(reverse('qualify_for_campaign', kwargs={'campaign_id':ticket.campaign.pk})) else: # user not logged in request.session['open_ticket_code'] = form.cleaned_data['code'] return HttpResponseRedirect("%s?next=%s" % (reverse('login'), reverse('redeem_ticket'))) else: form = forms.RedeemTicketForm() ctx = {'form':form} return render_view(request, template, ctx)
def invite_friends(request, template='fb/invite_friends.html'): next = request.REQUEST.get('next', reverse("account")) user_profile = request.user_profile user = user_profile.user api_key, secret = settings.FB_API_KEY, settings.FB_SECRET_KEY fb_uid, fb_session_key, fb_session_secret = get_fb_session(request) if not fb_uid: return _logout_redirect(request, next) all_fb_friends = _get_connected_friends(api_key, secret, fb_session_key, fb_uid) fr_list = list(all_fb_friends) previous = list( user_profile.fbinviteduser_set.values_list("fb_userid", flat=True)) fr_list.extend(previous) exclude_ids = u",".join(fr_list) ctx = {'next': next, 'needs_fbml': True, 'exclude_ids': exclude_ids} return render_view(request, template, ctx)
def list_events(request, location=None, template='event/list.html', queryset=None, extra_context=None, hide_top3=False): location = location or request.location request.location = location # stick user to this location going forward request.location_name = settings.LOCATION_DATA.get(location, settings.EMPTY_LOCATION_DATA)[3] if queryset is None: today, td = today_timedelta_by_location(location) queryset = Event.objects.active_by_location(location=location, attending_user=request.user_profile, today=today).order_by('event_date', 'event_start_time', 'pk') # queryset = queryset.exclude(ext_event_source='mlb2010', location='user-entered') queryset = queryset.exclude(location='user-entered') # don't show user entered events on city pages ctx = { 'title':'Upcoming Events', 'events':queryset, 'location_name':Event.LOCATIONMAP.get(location, 'Boston, MA'), } if not hide_top3: userid = request.user.is_authenticated() and request.user.pk or 0 key = shorten_key(u"popular-ourpick-destination:%s:%s" % (location, userid)) px = cache.cache.get(key, None) if px is None: popular = Event.objects.active_by_location( location=location, attending_user=request.user_profile, event_date__lte=datetime.today() + timedelta(days=7), ).order_by('-tweet_count')[:1] ctx['popular'] = get_or_none(popular) ctx['ourpick'] = get_or_none(Event.objects.active_by_location(location=location, attending_user=request.user_profile, is_homepage_worthy=True).order_by('event_date', 'event_start_time', 'pk')[:1]) ctx['destination'] = get_or_none(Event.objects.active_by_location(location='destination', attending_user=request.user_profile).order_by('-destination_timestamp')[:1]) px = (ctx['popular'], ctx['ourpick'], ctx['destination']) cache.cache.set(key, px, 600) else: ctx['popular'], ctx['ourpick'], ctx['destination'] = px if extra_context: ctx.update(extra_context) other_cities = sorted(settings.LOCATION_DATA.keys()) other_cities.remove(location) city_list_html = [ ('<a href="http://%s.%s%s%s">%s</a>' % (settings.LOCATION_SUBDOMAIN_REVERSE_MAP[loc], settings.DISPLAY_SITE_DOMAIN, _SUBDOMAIN_PORT, reverse("list_events"), settings.LOCATION_DATA.get(loc)[3])) for loc in other_cities ] ctx['other_cities'] = ', '.join(city_list_html) if request.mobile: template = 'mobile/event/city.html' if request.user.is_authenticated(): # Get Friends' Favorites count ctx['num_ff'] = get_friends_favorites_count(request.user_profile, location) ctx['needs_fbml'] = True return render_view(request, template, ctx)
def comments(request, event_id, template='event/tags/event_comments.html'): """Event comments AJAX view""" from event.templatetags.eventtags import event_comments as fill_event_comments event = get_object_or_404(Event.visible_objects, pk=event_id) ctx = {} fill_event_comments(ctx, event) ctx['is_owner'] = request.user.is_authenticated() and \ (request.user.id == event.artist.user_profile.user.id) or \ (event.creator and request.user.id == event.creator.user.id) ctx['is_admin'] = request.user.has_perm('event.can_manage_events') ctx['c'] = event ctx['event'] = event if request.user.is_authenticated(): ctx['comment_form'] = forms.EventCommentForm(author=request.user, target_instance=event) ctx['twitter_label'] = u'Tweet this show' ctx['twitter_status'] = settings.TWITTER_EVENT_STATUS_FORMAT % {'event_name':event.short_name_for_twitter, 'event_url':event.get_short_url()} return render_view(request, template, ctx)
def list_photos(request, campaign_id, cropped=False, template='campaign/photo/list.html'): try: campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id) is_owner = request.user.is_authenticated() and campaign.owner.pk == request.user.pk if not campaign.is_public: # Allow campaign owner to see photos of unreleased campaign. # Disallow everyone else. if not is_owner: raise Http404 size = PhotoSize.objects.get_thumbnail(cropped=cropped) photos = PhotoVersion.objects.get_for_object(campaign, size=size) paginator = Paginator(photos, settings.PHOTO_THUMBNAILS_PER_PAGE, orphans=3) page = paginator.page(request.REQUEST.get('page', 1)) ctx = {'campaign':campaign, 'cropped':cropped, 'page':page, 'paginator':paginator, 'is_owner':is_owner} return render_view(request, template, ctx) except InvalidPage: raise Http404
def signup_step2(request, existing_user=False, template='registration/signup_step2.html'): """Show unified signup screen""" if request.user.is_authenticated(): return HttpResponseRedirect(reverse("account")) next = request.REQUEST.get('next', '') email = request.session.get("email", None) if not email and not existing_user: return HttpResponseRedirect(reverse("signup") + "?next=" + next) request.session.set_test_cookie() ctx = {'next':next, 'existing_user':existing_user} if request.mobile: ctx['next'] = next or u"%s?show_friends=y" % reverse("home") if existing_user: ctx['form'] = forms.MobileAuthenticationForm(request) template = "mobile/registration/login.html" else: template = "mobile/registration/signup_step2.html" return render_view(request, template, ctx)
def signup_step1(request, template='registration/signup_step1.html'): """Get email address""" if request.user.is_authenticated(): return HttpResponseRedirect(reverse("account")) next = request.REQUEST.get('next', '') if request.method == 'POST': form = forms.SignupStep1Form(data=request.POST, files=request.FILES, is_mobile=request.mobile) if form.is_valid(): request.session['email'] = form.cleaned_data['email'] request.session['has_opted_in'] = form.cleaned_data.get('has_opted_in', False) request.session['password'] = form.cleaned_data['password1'] return HttpResponseRedirect("%s?next=%s" % (reverse('signup_step2'), next)) else: form = forms.SignupStep1Form(is_mobile=request.mobile) ctx = {'form':form, 'next':next} if request.mobile: template = "mobile/registration/signup_step1.html" return render_view(request, template, ctx)
def message_contributors(request, campaign_id, form_class=messageforms.ComposeForm, template_name='messages/compose.html', success_url=None): """Send a message to all contributors of the given campaign.""" campaign = get_object_or_404(Campaign.visible_objects, pk=campaign_id, artist__user_profile__user=request.user, is_approved=True) form = form_class() if request.method == "POST": form = form_class(request.POST) if form.is_valid(): form.save(sender=request.user) request.user.message_set.create( message=_(u"Message successfully sent.")) if success_url is None: success_url = reverse('view_campaign', kwargs={'campaign_id':campaign.pk}) return HttpResponseRedirect(success_url) else: form = form_class() contributions = campaign.contribution_set.members().order_by("contributor__username") recipients = list(set([c.contributor for c in contributions])) form.fields['recipient'].initial = recipients return render_view(request, template_name, {'form':form})
def message_attendees(request, event_id, form_class=messageforms.ComposeForm, template_name='messages/compose.html', success_url=None): """Send a message to all attendees of the given event.""" event = get_object_or_404(Event.visible_objects, pk=event_id, artist__user_profile__user=request.user, is_approved=True) form = form_class() if request.method == "POST": form = form_class(request.POST) if form.is_valid(): form.save(sender=request.user) request.user.message_set.create( message=_(u"Message successfully sent.")) if success_url is None: success_url = reverse('view_event', kwargs={'event_id':event.pk}) return HttpResponseRedirect(success_url) else: form = form_class() attendees = event.attendee_set.all().order_by("attendee__username") recipients = [c.attendee for c in attendees] form.fields['recipient'].initial = recipients return render_view(request, template_name, {'form':form})
def invite_friends(request, template='fb/invite_friends.html'): next = request.REQUEST.get('next', reverse("account")) user_profile = request.user_profile user = user_profile.user api_key, secret = settings.FB_API_KEY, settings.FB_SECRET_KEY fb_uid, fb_session_key, fb_session_secret = get_fb_session(request) if not fb_uid: return _logout_redirect(request, next) all_fb_friends = _get_connected_friends(api_key, secret, fb_session_key, fb_uid) fr_list = list(all_fb_friends) previous = list(user_profile.fbinviteduser_set.values_list("fb_userid", flat=True)) fr_list.extend(previous) exclude_ids = u",".join(fr_list) ctx = { 'next':next, 'needs_fbml':True, 'exclude_ids':exclude_ids } return render_view(request, template, ctx)
def post_comment(request, campaign_id, template='campaign/comment_form.html'): campaign = get_object_or_404(Campaign.objects.public(), pk=campaign_id) if request.method == 'POST': form = CommentForm(author=request.user, target_instance=campaign, data=request.POST) if form.is_valid(): comment = form.save() request.user.message_set.create(message=_( 'Thank you for your <a href="#c%s">comment »</a>' % comment.pk)) _log.debug('Campaign comment posted: (%s)', comment.get_as_text()) cache_killer = "%s-%s" % (random.randint(0, 10000), time()) return HttpResponseRedirect( reverse('view_campaign', kwargs={'campaign_id': campaign.pk}) + "?q=%s&new_c=y" % cache_killer) else: form = CommentForm(author=request.user, target_instance=campaign) ctx = {'form': form, 'comment_form': form, 'campaign': campaign} return render_view(request, template, ctx)
def interested(request, event_id, limit=500, template='event/tags/who_is_interested.html'): """Render users interested in the given event. This view is pulled in through AJAX view. The view can also be called with `return_context` set to True. In that case, it just returns the context dictionary which can be used by the caller to merge this data into another view. """ try: ctx = {} e = get_object_or_404(Event.objects.public(), pk=event_id) ctx['e'] = e ctx['event'] = e ctx['interested'] = e.get_interested(limit=limit) return render_view(request, template, ctx) except Exception, e: _log.exception(e) raise