def get(self, request, slug): event = self.get_event(slug, request) if isinstance(event, http.HttpResponse): return event if not self.can_view_event(event, request): return self.cant_view_event(event, request) tag = request.GET.get('tag') warning = None ok_statuses = ( Event.STATUS_SCHEDULED, Event.STATUS_PENDING, Event.STATUS_PROCESSING, ) if event.status not in ok_statuses: if not request.user.is_superuser: self.template_name = 'main/event_not_scheduled.html' else: warning = "Event is not publicly visible - not scheduled." if event.approval_set.filter(approved=False).exists(): if not request.user.is_active: return http.HttpResponse('Event not approved') else: warning = "Event is not publicly visible - not yet approved." hits = None # assume this to false to start with can_edit_chapters = False template_tagged = '' if event.template and not event.is_upcoming(): # The only acceptable way to make autoplay be on # is to send ?autoplay=true # All other attempts will switch it off. autoplay = request.GET.get('autoplay', 'false') == 'true' try: template_tagged = get_video_tagged( event, request, autoplay=autoplay, tag=tag, ) except VidlySubmission.DoesNotExist: return http.HttpResponseBadRequest( 'Tag %s does not exist for this event' % (tag, )) stats_query = (EventHitStats.objects.filter( event=event).values_list('total_hits', flat=True)) for total_hits in stats_query: hits = total_hits # if the event has a template is not upcoming if not event.is_live(): # ...and is not live, then if request.user.is_active: can_edit_chapters = True can_manage_edit_event = (request.user.is_active and request.user.is_staff and request.user.has_perm('main.change_event')) can_edit_event = request.user.is_active can_edit_discussion = ( can_edit_event and # This is a little trick to avoid waking up the # SimpleLazyObject on the user. If the .is_active is true # the ID will have already been set by the session. # So doing this comparison instead avoids causing a # select query on the auth_user table. request.user.pk == event.creator_id and Discussion.objects.filter(event=event).exists()) request.channels = event.channels.all() # needed for the open graph stuff event.url = reverse('main:event', args=(event.slug, )) context = self.get_default_context(event, request) context.update({ 'event': event, 'video': template_tagged, 'warning': warning, 'can_manage_edit_event': can_manage_edit_event, 'can_edit_event': can_edit_event, 'can_edit_discussion': can_edit_discussion, 'can_edit_chapters': can_edit_chapters, 'Event': Event, 'hits': hits, 'tags': [t.name for t in event.tags.all()], 'channels': request.channels, # needed for the _event_privacy.html template 'curated_groups': CuratedGroup.get_names(event), }) context['chapters'] = [] for chapter in Chapter.objects.filter(event=event, is_active=True): context['chapters'].append({ 'timestamp': chapter.timestamp, 'text': chapter.text, }) vidly_tag, vidly_hd = self.get_vidly_information(event, tag) if vidly_tag: context['vidly_tag'] = vidly_tag context['vidly_hd'] = vidly_hd # If the event is in the processing state (or pending), we welcome # people to view it but it'll say that the video isn't ready yet. # But we'll also try to include an estimate of how long we think # it will take until it's ready to be viewed. if ((event.is_processing() or event.is_pending()) and event.duration and event.template_environment.get('tag')): vidly_submissions = (VidlySubmission.objects.filter( event=event, tag=event.template_environment.get( 'tag')).order_by('-submission_time')) for vidly_submission in vidly_submissions: context['estimated_time_left'] = ( vidly_submission.get_estimated_time_left()) if event.pin: if (not request.user.is_authenticated() or not is_employee(request.user)): entered_pins = request.session.get('entered_pins', []) if event.pin not in entered_pins: self.template_name = 'main/event_requires_pin.html' context['pin_form'] = forms.PinForm() try: context['discussion'] = Discussion.objects.get(event=event) except Discussion.DoesNotExist: context['discussion'] = {'enabled': False} if event.recruitmentmessage and event.recruitmentmessage.active: context['recruitmentmessage'] = event.recruitmentmessage cache_key = 'event_survey_id_%s' % event.id context['survey_id'] = cache.get(cache_key, -1) if context['survey_id'] == -1: # not known in cache try: survey = Survey.objects.get(events=event, active=True) cache.set(cache_key, survey.id, 60 * 60 * 24) context['survey_id'] = survey.id except Survey.DoesNotExist: cache.set(cache_key, None, 60 * 60 * 24) context['survey_id'] = None if settings.LOG_SEARCHES: if request.session.get('logged_search'): pk, time_ago = request.session.get('logged_search') age = time.time() - time_ago if age <= 5: # the search was made less than 5 seconds ago try: logged_search = LoggedSearch.objects.get(pk=pk) logged_search.event_clicked = event logged_search.save() except LoggedSearch.DoesNotExist: pass return render(request, self.template_name, context)
def get(self, request, slug): event = self.get_event(slug, request) if isinstance(event, http.HttpResponse): return event if not self.can_view_event(event, request): return self.cant_view_event(event, request) tag = request.GET.get('tag') warning = None ok_statuses = ( Event.STATUS_SCHEDULED, Event.STATUS_PENDING, Event.STATUS_PROCESSING, ) if event.status not in ok_statuses: if not request.user.is_superuser: self.template_name = 'main/event_not_scheduled.html' else: warning = "Event is not publicly visible - not scheduled." if event.approval_set.filter(approved=False).exists(): if not request.user.is_active: return http.HttpResponse('Event not approved') else: warning = "Event is not publicly visible - not yet approved." hits = None # assume this to false to start with can_edit_chapters = False template_tagged = '' if event.template and not event.is_upcoming(): # The only acceptable way to make autoplay be on # is to send ?autoplay=true # All other attempts will switch it off. autoplay = request.GET.get('autoplay', 'false') == 'true' try: template_tagged = get_video_tagged( event, request, autoplay=autoplay, tag=tag, ) except VidlySubmission.DoesNotExist: return http.HttpResponseBadRequest( 'Tag %s does not exist for this event' % (tag,) ) stats_query = ( EventHitStats.objects.filter(event=event) .values_list('total_hits', flat=True) ) for total_hits in stats_query: hits = total_hits # if the event has a template is not upcoming if not event.is_live() and event.is_scheduled(): # ...and is not live, then if request.user.is_active: can_edit_chapters = True can_manage_edit_event = ( request.user.is_active and request.user.is_staff and request.user.has_perm('main.change_event') ) can_edit_event = request.user.is_active can_edit_discussion = ( can_edit_event and # This is a little trick to avoid waking up the # SimpleLazyObject on the user. If the .is_active is true # the ID will have already been set by the session. # So doing this comparison instead avoids causing a # select query on the auth_user table. request.user.pk == event.creator_id and Discussion.objects.filter(event=event).exists() ) request.channels = event.channels.all() # needed for the open graph stuff event.url = reverse('main:event', args=(event.slug,)) context = self.get_default_context(event, request) context.update({ 'event': event, 'video': template_tagged, 'warning': warning, 'can_manage_edit_event': can_manage_edit_event, 'can_edit_event': can_edit_event, 'can_edit_discussion': can_edit_discussion, 'can_edit_chapters': can_edit_chapters, 'Event': Event, 'hits': hits, 'tags': [t.name for t in event.tags.all()], 'channels': request.channels, # needed for the _event_privacy.html template 'curated_groups': CuratedGroup.get_names(event), }) context['chapters'] = Chapter.objects.filter( event=event, is_active=True, ) # By default, we want to hint in the DOM that this is an HD # video. context['hd'] = event.is_scheduled() and not event.is_upcoming() vidly_tag, vidly_hd = self.get_vidly_information(event, tag) if vidly_tag: context['vidly_tag'] = vidly_tag context['vidly_hd'] = vidly_hd if not vidly_hd: context['hd'] = False # If the event is in the processing state (or pending), we welcome # people to view it but it'll say that the video isn't ready yet. # But we'll also try to include an estimate of how long we think # it will take until it's ready to be viewed. context['estimated_time_left'] = None context['time_run'] = None if ( (event.is_processing() or event.is_pending()) and event.duration and event.template_environment.get('tag') ): vidly_submissions = ( VidlySubmission.objects .filter(event=event, tag=event.template_environment.get('tag')) .order_by('-submission_time') ) for vidly_submission in vidly_submissions[:1]: context['estimated_time_left'] = ( vidly_submission.get_estimated_time_left() ) context['time_run'] = ( ( timezone.now() - vidly_submission.submission_time ).seconds ) if event.pin: if ( not request.user.is_authenticated() or not is_employee(request.user) ): entered_pins = request.session.get('entered_pins', []) if event.pin not in entered_pins: self.template_name = 'main/event_requires_pin.html' context['pin_form'] = forms.PinForm() try: context['discussion'] = Discussion.objects.get(event=event) # The name of the channel we publish to fanout on when there's # changes to this events comments. context['subscription_channel_comments'] = 'comments-{}'.format( event.id ) except Discussion.DoesNotExist: context['discussion'] = {'enabled': False} context['subscription_channel_status'] = 'event-{}'.format(event.id) # amara_videos = AmaraVideo.objects.filter( # event=event, # transcript__isnull=False, # ) # context['amara_video'] = None # for amara_video in amara_videos.order_by('-modified')[:1]: # context['amara_video'] = amara_video context['closedcaptions'] = None for connection in ClosedCaptionsTranscript.objects.filter(event=event): assert connection.closedcaptions.transcript context['closedcaptions'] = connection.closedcaptions cache_key = 'event_survey_id_%s' % event.id context['survey_id'] = cache.get(cache_key, -1) if context['survey_id'] == -1: # not known in cache try: survey = Survey.objects.get( events=event, active=True ) cache.set(cache_key, survey.id, 60 * 60 * 24) context['survey_id'] = survey.id except Survey.DoesNotExist: cache.set(cache_key, None, 60 * 60 * 24) context['survey_id'] = None if settings.LOG_SEARCHES: if request.session.get('logged_search'): pk, time_ago = request.session.get('logged_search') age = time.time() - time_ago if age <= 5: # the search was made less than 5 seconds ago try: logged_search = LoggedSearch.objects.get(pk=pk) logged_search.event_clicked = event logged_search.save() except LoggedSearch.DoesNotExist: pass response = render(request, self.template_name, context) self._set_csp_update(response, event) return response