コード例 #1
0
    def test_strip_description_html(self):
        event = FauxEvent('Hacking with <script>alert(xss)</script>', '')
        result = short_desc(event)
        eq_(result, 'Hacking with <script>alert(xss)</script>')

        result = short_desc(event, strip_html=True)
        eq_(result, 'Hacking with alert(xss)')
コード例 #2
0
    def test_short_desc(self):
        event = FauxEvent('Some Long Description', 'Some Short Description')
        result = short_desc(event)
        eq_(result, 'Some Short Description')

        # no short description
        event = FauxEvent('Some Long Description', '')
        result = short_desc(event)
        eq_(result, 'Some Long Description')
コード例 #3
0
ファイル: test_helpers.py プロジェクト: Nolski/airmozilla
    def test_strip_description_html(self):
        event = FauxEvent(
            'Hacking with <script>alert(xss)</script>',
            ''
        )
        result = short_desc(event)
        eq_(result, 'Hacking with <script>alert(xss)</script>')

        result = short_desc(event, strip_html=True)
        eq_(result, 'Hacking with alert(xss)')
コード例 #4
0
ファイル: test_helpers.py プロジェクト: Nolski/airmozilla
    def test_short_desc(self):
        event = FauxEvent(
            'Some Long Description',
            'Some Short Description'
        )
        result = short_desc(event)
        eq_(result, 'Some Short Description')

        # no short description
        event = FauxEvent(
            'Some Long Description',
            ''
        )
        result = short_desc(event)
        eq_(result, 'Some Long Description')
コード例 #5
0
 def test_truncated_short_description(self):
     event = FauxEvent(
         'Word ' * 50,
         ''
     )
     result = short_desc(event, words=10)
     eq_(result, ('Word ' * 10).strip() + '...')
コード例 #6
0
ファイル: views.py プロジェクト: peterbe/airmozilla
def events_calendar(request, public=True):
    cache_key = "calendar_%s" % ("public" if public else "private")
    cached = cache.get(cache_key)
    if cached:
        return cached
    cal = vobject.iCalendar()
    cal.add("X-WR-CALNAME").value = "Air Mozilla Public Events" if public else "Air Mozilla Private Events"
    now = datetime.datetime.utcnow().replace(tzinfo=utc)
    events = list(
        Event.objects.approved()
        .filter(start_time__lt=now, public=public)
        .order_by("-start_time")[: settings.CALENDAR_SIZE]
    )
    events += list(
        Event.objects.approved()
        .filter(start_time__gte=now, public=public)
        .order_by("start_time")[: settings.CALENDAR_SIZE]
    )
    base_url = "%s://%s/" % (request.is_secure() and "https" or "http", RequestSite(request).domain)
    for event in events:
        vevent = cal.add("vevent")
        vevent.add("summary").value = event.title
        vevent.add("dtstart").value = event.start_time
        vevent.add("dtend").value = event.start_time + datetime.timedelta(hours=1)
        vevent.add("description").value = unhtml(short_desc(event))
        if event.location:
            vevent.add("location").value = event.location.name
        vevent.add("url").value = base_url + event.slug + "/"
    icalstream = cal.serialize()
    response = http.HttpResponse(icalstream, mimetype="text/calendar; charset=utf-8")
    filename = "AirMozillaEvents%s.ics" % ("Public" if public else "Private")
    response["Content-Disposition"] = "inline; filename=%s" % filename
    cache.set(cache_key, response)
    return response
コード例 #7
0
ファイル: views.py プロジェクト: imclab/airmozilla
def calendar_data(request):
    form = forms.CalendarDataForm(request.GET)
    if not form.is_valid():
        return http.HttpResponseBadRequest(str(form.errors))

    #start = datetime.datetime.fromtimestamp(form.cleaned_data['start'])
    start = form.cleaned_data['start']
    end = form.cleaned_data['end']
    #end = datetime.datetime.fromtimestamp(form.cleaned_data['end'])

    start = start.replace(tzinfo=utc)
    end = end.replace(tzinfo=utc)

    events = Event.objects.approved()

    events = events.filter(
        start_time__gte=start,
        start_time__lt=end
    )
    event_objects = []
    for event in events.select_related('location'):
        start_time = event.start_time
        # We don't need 'end' because we don't yet know how long the event
        # was or will be.
        event_objects.append({
            'title': event.title,
            'start': start_time.isoformat(),
            'url': reverse('main:event', args=(event.slug,)),
            'description': short_desc(event),
            'allDay': False,
        })

    return event_objects
コード例 #8
0
def events_calendar(request, public=True):
    cache_key = 'calendar_%s' % ('public' if public else 'private')
    cached = cache.get(cache_key)
    if cached:
        return cached
    cal = vobject.iCalendar()
    cal.add('X-WR-CALNAME').value = ('Air Mozilla Public Events' if public else
                                     'Air Mozilla Private Events')
    now = datetime.datetime.utcnow().replace(tzinfo=utc)
    events = list(Event.objects.approved().filter(
        start_time__lt=now,
        public=public).order_by('-start_time')[:settings.CALENDAR_SIZE])
    events += list(Event.objects.approved().filter(
        start_time__gte=now,
        public=public).order_by('start_time')[:settings.CALENDAR_SIZE])
    base_url = '%s://%s/' % (request.is_secure() and 'https'
                             or 'http', RequestSite(request).domain)
    for event in events:
        vevent = cal.add('vevent')
        vevent.add('summary').value = event.title
        vevent.add('dtstart').value = event.start_time
        vevent.add('dtend').value = (event.start_time +
                                     datetime.timedelta(hours=1))
        vevent.add('description').value = unhtml(short_desc(event))
        if event.location:
            vevent.add('location').value = event.location.name
        vevent.add('url').value = base_url + event.slug + '/'
    icalstream = cal.serialize()
    response = http.HttpResponse(icalstream,
                                 mimetype='text/calendar; charset=utf-8')
    filename = 'AirMozillaEvents%s.ics' % ('Public' if public else 'Private')
    response['Content-Disposition'] = ('inline; filename=%s' % filename)
    cache.set(cache_key, response)
    return response
コード例 #9
0
ファイル: events.py プロジェクト: anurag90x/airmozilla
def event_assignments_ical(request):
    cache_key = 'event_assignements_ical'
    assignee = request.GET.get('assignee')

    if assignee:
        assignee = get_object_or_404(User, email=assignee)
        cache_key += str(assignee.pk)

    cached = cache.get(cache_key)
    if cached:
        # additional response headers aren't remembered so add them again
        cached['Access-Control-Allow-Origin'] = '*'
        return cached

    cal = vobject.iCalendar()

    now = timezone.now()
    base_qs = EventAssignment.objects.all().order_by('-event__start_time')
    if assignee:
        base_qs = base_qs.filter(users=assignee)

    title = 'Airmo'
    if assignee:
        title += ' for %s' % assignee.email
    cal.add('X-WR-CALNAME').value = title
    assignments = list(
        base_qs.filter(event__start_time__lt=now)[:settings.CALENDAR_SIZE])
    assignments += list(base_qs.filter(event__start_time__gte=now))
    base_url = '%s://%s' % (request.is_secure() and 'https'
                            or 'http', RequestSite(request).domain)
    for assignment in assignments:
        event = assignment.event
        vevent = cal.add('vevent')
        vevent.add('summary').value = "[AirMo crew] %s" % event.title
        # Adjusted start times for Event Assignment iCal feeds
        # to allow staff sufficient time for event set-up.
        vevent.add('dtstart').value = (event.start_time -
                                       datetime.timedelta(minutes=30))
        vevent.add('dtend').value = (event.start_time +
                                     datetime.timedelta(hours=1))
        vevent.add('description').value = unhtml(short_desc(event))
        vevent.add('url').value = (base_url +
                                   reverse('main:event', args=(event.slug, )))
    icalstream = cal.serialize()
    # response = http.HttpResponse(icalstream,
    #                          mimetype='text/plain; charset=utf-8')
    response = http.HttpResponse(icalstream,
                                 mimetype='text/calendar; charset=utf-8')
    filename = 'AirMozillaEventAssignments'
    filename += '.ics'
    response['Content-Disposition'] = ('inline; filename=%s' % filename)
    cache.set(cache_key, response, 60 * 10)  # 10 minutes

    # https://bugzilla.mozilla.org/show_bug.cgi?id=909516
    response['Access-Control-Allow-Origin'] = '*'

    return response
コード例 #10
0
ファイル: feeds.py プロジェクト: deathping1994/airmozilla
 def item_extra_kwargs(self, event):
     return {
         'id': event.id,
         'subtitle': short_desc(event),
         'summary': event.description,
         'duration': event.duration,
         'vidly_data': event._vidly_redirect_info,
         'vidly_tag': event.template_environment['tag'],
         'tags': self.all_tags.get(event.id, []),
     }
コード例 #11
0
 def item_extra_kwargs(self, event):
     return {
         'id': event.id,
         'subtitle': short_desc(event),
         'summary': event.description,
         'duration': event.duration,
         'vidly_data': event._vidly_redirect_info,
         'vidly_tag': event.template_environment['tag'],
         'tags': self.all_tags.get(event.id, []),
     }
コード例 #12
0
ファイル: calendar.py プロジェクト: anjalymehla/airmozilla
def calendar_data(request):
    form = forms.CalendarDataForm(request.GET)
    if not form.is_valid():
        return http.HttpResponseBadRequest(str(form.errors))

    start = form.cleaned_data['start']
    end = form.cleaned_data['end']

    start = start.replace(tzinfo=utc)
    end = end.replace(tzinfo=utc)

    privacy_filter = {}
    privacy_exclude = {}
    events = Event.objects.scheduled_or_processing()
    if request.user.is_active:
        if is_contributor(request.user):
            privacy_exclude = {'privacy': Event.PRIVACY_COMPANY}
    else:
        privacy_filter = {'privacy': Event.PRIVACY_PUBLIC}
        events = events.approved()

    if privacy_filter:
        events = events.filter(**privacy_filter)
    elif privacy_exclude:
        events = events.exclude(**privacy_exclude)

    events = events.filter(
        start_time__gte=start,
        start_time__lt=end
    )
    event_objects = []
    for event in events.select_related('location'):
        start_time = event.start_time
        end_time = start_time + datetime.timedelta(
            seconds=max(event.duration or event.estimated_duration, 60 * 20)
        )
        # We don't need 'end' because we don't yet know how long the event
        # was or will be.
        event_objects.append({
            'title': event.title,
            'start': start_time.isoformat(),
            'end': end_time.isoformat(),
            'url': reverse('main:event', args=(event.slug,)),
            'description': short_desc(event),
            'allDay': False,
        })

    return event_objects
コード例 #13
0
ファイル: events.py プロジェクト: anurag90x/airmozilla
def new_event_tweet(request, id):
    data = {}
    event = get_object_or_404(Event, id=id)

    if request.method == 'POST':
        form = forms.EventTweetForm(event, data=request.POST)
        if form.is_valid():
            event_tweet = form.save(commit=False)
            if event_tweet.send_date:
                assert event.location, "event must have a location"
                tz = pytz.timezone(event.location.timezone)
                event_tweet.send_date = tz_apply(event_tweet.send_date, tz)
            else:
                now = timezone.now()
                event_tweet.send_date = now
            event_tweet.event = event
            event_tweet.creator = request.user
            event_tweet.save()
            messages.info(request, 'Tweet saved')
            url = reverse('manage:event_edit', args=(event.pk, ))
            return redirect(url)
    else:
        initial = {}
        event_url = reverse('main:event', args=(event.slug, ))
        base_url = ('%s://%s' % (request.is_secure() and 'https'
                                 or 'http', RequestSite(request).domain))
        abs_url = urlparse.urljoin(base_url, event_url)
        try:
            abs_url = shorten_url(abs_url)
            data['shortener_error'] = None
        except (ImproperlyConfigured, ValueError) as err:
            data['shortener_error'] = str(err)
        # except OtherHttpRelatedErrors?
        #    data['shortener_error'] = "Network error trying to shorten URL"

        initial['text'] = unhtml('%s\n%s' % (short_desc(event), abs_url))
        initial['include_placeholder'] = bool(event.placeholder_img)
        initial['send_date'] = ''
        form = forms.EventTweetForm(initial=initial, event=event)

    data['event'] = event
    data['form'] = form
    data['tweets'] = EventTweet.objects.filter(event=event)

    return render(request, 'manage/new_event_tweet.html', data)
コード例 #14
0
ファイル: calendar.py プロジェクト: smarshy/airmozilla
def calendar_data(request):
    form = forms.CalendarDataForm(request.GET)
    if not form.is_valid():
        return http.HttpResponseBadRequest(str(form.errors))

    start = form.cleaned_data['start']
    end = form.cleaned_data['end']

    start = start.replace(tzinfo=utc)
    end = end.replace(tzinfo=utc)

    privacy_filter = {}
    privacy_exclude = {}
    events = Event.objects.scheduled_or_processing()
    if request.user.is_active:
        if is_contributor(request.user):
            privacy_exclude = {'privacy': Event.PRIVACY_COMPANY}
    else:
        privacy_filter = {'privacy': Event.PRIVACY_PUBLIC}
        events = events.approved()

    if privacy_filter:
        events = events.filter(**privacy_filter)
    elif privacy_exclude:
        events = events.exclude(**privacy_exclude)

    events = events.filter(start_time__gte=start, start_time__lt=end)
    event_objects = []
    for event in events.select_related('location'):
        start_time = event.start_time
        end_time = start_time + datetime.timedelta(
            seconds=max(event.duration or event.estimated_duration, 60 * 20))
        # We don't need 'end' because we don't yet know how long the event
        # was or will be.
        event_objects.append({
            'title': event.title,
            'start': start_time.isoformat(),
            'end': end_time.isoformat(),
            'url': reverse('main:event', args=(event.slug, )),
            'description': short_desc(event),
            'allDay': False,
        })

    return event_objects
コード例 #15
0
ファイル: events.py プロジェクト: bugzPDX/airmozilla
def new_event_tweet(request, id):
    data = {}
    event = get_object_or_404(Event, id=id)

    if request.method == 'POST':
        form = forms.EventTweetForm(event, data=request.POST)
        if form.is_valid():
            event_tweet = form.save(commit=False)
            if event_tweet.send_date:
                assert event.location, "event must have a location"
                tz = pytz.timezone(event.location.timezone)
                event_tweet.send_date = tz_apply(event_tweet.send_date, tz)
            else:
                now = timezone.now()
                event_tweet.send_date = now
            event_tweet.event = event
            event_tweet.creator = request.user
            event_tweet.save()
            messages.info(request, 'Tweet saved')
            url = reverse('manage:event_edit', args=(event.pk,))
            return redirect(url)
    else:
        initial = {}
        event_url = reverse('main:event', args=(event.slug,))
        base_url = get_base_url(request)
        abs_url = urlparse.urljoin(base_url, event_url)
        try:
            abs_url = shorten_url(abs_url)
            data['shortener_error'] = None
        except (ImproperlyConfigured, ValueError) as err:
            data['shortener_error'] = str(err)
        # except OtherHttpRelatedErrors?
        #    data['shortener_error'] = "Network error trying to shorten URL"

        initial['text'] = unhtml('%s\n%s' % (short_desc(event), abs_url))
        initial['include_placeholder'] = bool(event.placeholder_img)
        initial['send_date'] = ''
        form = forms.EventTweetForm(initial=initial, event=event)

    data['event'] = event
    data['form'] = form
    data['tweets'] = EventTweet.objects.filter(event=event)

    return render(request, 'manage/new_event_tweet.html', data)
コード例 #16
0
ファイル: views.py プロジェクト: dailycavalier/airmozilla
def events_calendar(request, public=True):
    cache_key = 'calendar_%s' % ('public' if public else 'private')
    cached = cache.get(cache_key)
    if cached:
        return cached
    cal = vobject.iCalendar()
    cal.add('X-WR-CALNAME').value = ('Air Mozilla Public Events' if public
                                     else 'Air Mozilla Private Events')
    now = datetime.datetime.utcnow().replace(tzinfo=utc)
    base_qs = Event.objects.approved()
    if public:
        base_qs = base_qs.filter(privacy=Event.PRIVACY_PUBLIC)
    else:
        base_qs = base_qs.exclude(privacy=Event.PRIVACY_PUBLIC)
    events = list(base_qs
                  .filter(start_time__lt=now)
                  .order_by('-start_time')[:settings.CALENDAR_SIZE])
    events += list(base_qs
                   .filter(start_time__gte=now)
                   .order_by('start_time')[:settings.CALENDAR_SIZE])
    base_url = '%s://%s/' % (request.is_secure() and 'https' or 'http',
                             RequestSite(request).domain)
    for event in events:
        vevent = cal.add('vevent')
        vevent.add('summary').value = event.title
        vevent.add('dtstart').value = event.start_time
        vevent.add('dtend').value = (event.start_time +
                                     datetime.timedelta(hours=1))
        vevent.add('description').value = unhtml(short_desc(event))
        if event.location:
            vevent.add('location').value = event.location.name
        vevent.add('url').value = base_url + event.slug + '/'
    icalstream = cal.serialize()
    response = http.HttpResponse(icalstream,
                                 mimetype='text/calendar; charset=utf-8')
    filename = 'AirMozillaEvents%s.ics' % ('Public' if public else 'Private')
    response['Content-Disposition'] = (
        'inline; filename=%s' % filename)
    cache.set(cache_key, response)
    return response
コード例 #17
0
ファイル: calendar.py プロジェクト: mudithkr/airmozilla
def events_calendar_ical(request, privacy=None, channel_slug=None):
    cache_key = "calendar"
    savedsearch = None
    if privacy:
        cache_key += "_%s" % privacy
    if channel_slug:
        cache_key += "_%s" % channel_slug
    if request.GET.get("ss"):
        savedsearch = get_object_or_404(SavedSearch, id=request.GET["ss"])
        cache_key += "_%s" % savedsearch.pk
    if request.GET.get("location"):
        if request.GET.get("location").isdigit():
            location = get_object_or_404(Location, pk=request.GET.get("location"))
        else:
            location = get_object_or_404(Location, name=request.GET.get("location"))
        cache_key += str(location.pk)
        cached = None
    else:
        location = None
        cached = cache.get(cache_key)

    if cached:
        # additional response headers aren't remembered so add them again
        cached["Access-Control-Allow-Origin"] = "*"
        return cached
    cal = vobject.iCalendar()

    now = timezone.now()
    if savedsearch:
        base_qs = savedsearch.get_events()
    else:
        base_qs = Event.objects.scheduled_or_processing()
    if channel_slug:
        channel = get_object_or_404(Channel, slug__iexact=channel_slug)
        channels = Channel.objects.filter(Q(id=channel.id) | Q(parent=channel.id))
        base_qs = base_qs.filter(channels__in=channels)

    if privacy == "public":
        base_qs = base_qs.approved().filter(privacy=Event.PRIVACY_PUBLIC)
        title = "Air Mozilla Public Events"
    elif privacy == "private":
        base_qs = base_qs.exclude(privacy=Event.PRIVACY_PUBLIC)
        title = "Air Mozilla Private Events"
    else:
        title = "Air Mozilla Events"
    if savedsearch:
        if savedsearch.name:
            title += ' (from saved search "{}")'.format(savedsearch.name)
        else:
            title += " (from saved search)"
    if location:
        base_qs = base_qs.filter(location=location)

    cal.add("X-WR-CALNAME").value = title
    events = list(base_qs.filter(start_time__lt=now).order_by("-start_time")[: settings.CALENDAR_SIZE])
    events += list(base_qs.filter(start_time__gte=now).order_by("start_time"))
    base_url = get_base_url(request)
    for event in events:
        vevent = cal.add("vevent")
        vevent.add("summary").value = event.title
        vevent.add("dtstart").value = event.start_time
        vevent.add("dtend").value = event.start_time + datetime.timedelta(
            seconds=event.duration or event.estimated_duration
        )
        vevent.add("description").value = short_desc(event, strip_html=True)
        if event.location:
            vevent.add("location").value = event.location.name
        vevent.add("url").value = base_url + reverse("main:event", args=(event.slug,))
    icalstream = cal.serialize()
    # response = http.HttpResponse(
    #     icalstream,
    #     content_type='text/plain; charset=utf-8'
    # )
    response = http.HttpResponse(icalstream, content_type="text/calendar; charset=utf-8")
    filename = "AirMozillaEvents%s" % (privacy and privacy or "")
    if location:
        filename += "_%s" % slugify(location.name)
    if savedsearch:
        filename += "_ss%s" % savedsearch.id
    filename += ".ics"
    response["Content-Disposition"] = "inline; filename=%s" % filename
    if not location:
        cache.set(cache_key, response, 60 * 10)  # 10 minutes

    # https://bugzilla.mozilla.org/show_bug.cgi?id=909516
    response["Access-Control-Allow-Origin"] = "*"

    return response
コード例 #18
0
ファイル: views.py プロジェクト: imclab/airmozilla
def events_calendar_ical(request, privacy=None):
    cache_key = 'calendar'
    if privacy:
        cache_key += '_%s' % privacy
    if request.GET.get('location'):
        if request.GET.get('location').isdigit():
            location = get_object_or_404(
                Location,
                pk=request.GET.get('location')
            )
        else:
            location = get_object_or_404(
                Location,
                name=request.GET.get('location')
            )
        cache_key += str(location.pk)
        cached = None
    else:
        location = None
        cached = cache.get(cache_key)

    if cached:
        # additional response headers aren't remembered so add them again
        cached['Access-Control-Allow-Origin'] = '*'
        return cached
    cal = vobject.iCalendar()

    now = datetime.datetime.utcnow().replace(tzinfo=utc)
    base_qs = Event.objects.approved()
    if privacy == 'public':
        base_qs = base_qs.filter(privacy=Event.PRIVACY_PUBLIC)
        title = 'Air Mozilla Public Events'
    elif privacy == 'private':
        base_qs = base_qs.exclude(privacy=Event.PRIVACY_PUBLIC)
        title = 'Air Mozilla Private Events'
    else:
        title = 'Air Mozilla Events'
    if location:
        base_qs = base_qs.filter(location=location)
    cal.add('X-WR-CALNAME').value = title
    events = list(base_qs
                  .filter(start_time__lt=now)
                  .order_by('-start_time')[:settings.CALENDAR_SIZE])
    events += list(base_qs
                   .filter(start_time__gte=now)
                   .order_by('start_time'))
    base_url = '%s://%s/' % (request.is_secure() and 'https' or 'http',
                             RequestSite(request).domain)
    for event in events:
        vevent = cal.add('vevent')
        vevent.add('summary').value = event.title
        vevent.add('dtstart').value = event.start_time
        vevent.add('dtend').value = (event.start_time +
                                     datetime.timedelta(hours=1))
        vevent.add('description').value = unhtml(short_desc(event))
        if event.location:
            vevent.add('location').value = event.location.name
        vevent.add('url').value = base_url + event.slug + '/'
    icalstream = cal.serialize()
    #response = http.HttpResponse(icalstream,
    #                          mimetype='text/plain; charset=utf-8')

    response = http.HttpResponse(icalstream,
                                 mimetype='text/calendar; charset=utf-8')
    filename = 'AirMozillaEvents%s' % (privacy and privacy or '')
    if location:
        filename += '_%s' % slugify(location.name)
    filename += '.ics'
    response['Content-Disposition'] = (
        'inline; filename=%s' % filename)
    if not location:
        cache.set(cache_key, response, 60 * 10)  # 10 minutes

    # https://bugzilla.mozilla.org/show_bug.cgi?id=909516
    response['Access-Control-Allow-Origin'] = '*'

    return response
コード例 #19
0
def events_calendar_ical(request, privacy=None):
    cache_key = 'calendar'
    if privacy:
        cache_key += '_%s' % privacy
    if request.GET.get('location'):
        if request.GET.get('location').isdigit():
            location = get_object_or_404(Location,
                                         pk=request.GET.get('location'))
        else:
            location = get_object_or_404(Location,
                                         name=request.GET.get('location'))
        cache_key += str(location.pk)
        cached = None
    else:
        location = None
        cached = cache.get(cache_key)

    if cached:
        # additional response headers aren't remembered so add them again
        cached['Access-Control-Allow-Origin'] = '*'
        return cached
    cal = vobject.iCalendar()

    now = timezone.now()
    base_qs = Event.objects.approved()
    if privacy == 'public':
        base_qs = base_qs.filter(privacy=Event.PRIVACY_PUBLIC)
        title = 'Air Mozilla Public Events'
    elif privacy == 'private':
        base_qs = base_qs.exclude(privacy=Event.PRIVACY_PUBLIC)
        title = 'Air Mozilla Private Events'
    else:
        title = 'Air Mozilla Events'
    if location:
        base_qs = base_qs.filter(location=location)
    cal.add('X-WR-CALNAME').value = title
    events = list(
        base_qs.filter(start_time__lt=now).order_by('-start_time')
        [:settings.CALENDAR_SIZE])
    events += list(base_qs.filter(start_time__gte=now).order_by('start_time'))
    base_url = get_base_url(request)
    for event in events:
        vevent = cal.add('vevent')
        vevent.add('summary').value = event.title
        vevent.add('dtstart').value = event.start_time
        vevent.add('dtend').value = (
            event.start_time +
            datetime.timedelta(seconds=(event.duration or 3600)))
        vevent.add('description').value = short_desc(event, strip_html=True)
        if event.location:
            vevent.add('location').value = event.location.name
        vevent.add('url').value = base_url + event.slug + '/'
    icalstream = cal.serialize()
    # response = http.HttpResponse(
    #     icalstream,
    #     content_type='text/plain; charset=utf-8'
    # )
    response = http.HttpResponse(icalstream,
                                 content_type='text/calendar; charset=utf-8')
    filename = 'AirMozillaEvents%s' % (privacy and privacy or '')
    if location:
        filename += '_%s' % slugify(location.name)
    filename += '.ics'
    response['Content-Disposition'] = ('inline; filename=%s' % filename)
    if not location:
        cache.set(cache_key, response, 60 * 10)  # 10 minutes

    # https://bugzilla.mozilla.org/show_bug.cgi?id=909516
    response['Access-Control-Allow-Origin'] = '*'

    return response
コード例 #20
0
ファイル: calendar.py プロジェクト: smarshy/airmozilla
def events_calendar_ical(request, privacy=None, channel_slug=None):
    cache_key = 'calendar'
    if privacy:
        cache_key += '_%s' % privacy
    if channel_slug:
        cache_key += '_%s' % channel_slug
    if request.GET.get('location'):
        if request.GET.get('location').isdigit():
            location = get_object_or_404(
                Location,
                pk=request.GET.get('location')
            )
        else:
            location = get_object_or_404(
                Location,
                name=request.GET.get('location')
            )
        cache_key += str(location.pk)
        cached = None
    else:
        location = None
        cached = cache.get(cache_key)

    if cached:
        # additional response headers aren't remembered so add them again
        cached['Access-Control-Allow-Origin'] = '*'
        return cached
    cal = vobject.iCalendar()

    now = timezone.now()
    base_qs = Event.objects.scheduled_or_processing()
    if channel_slug:
        channel = get_object_or_404(
            Channel,
            slug__iexact=channel_slug
        )
        channels = Channel.objects.filter(
            Q(id=channel.id) |
            Q(parent=channel.id)
        )
        base_qs = base_qs.filter(channels__in=channels)

    if privacy == 'public':
        base_qs = base_qs.approved().filter(
            privacy=Event.PRIVACY_PUBLIC
        )
        title = 'Air Mozilla Public Events'
    elif privacy == 'private':
        base_qs = base_qs.exclude(
            privacy=Event.PRIVACY_PUBLIC
        )
        title = 'Air Mozilla Private Events'
    else:
        title = 'Air Mozilla Events'
    if location:
        base_qs = base_qs.filter(location=location)

    cal.add('X-WR-CALNAME').value = title
    events = list(base_qs
                  .filter(start_time__lt=now)
                  .order_by('-start_time')[:settings.CALENDAR_SIZE])
    events += list(base_qs
                   .filter(start_time__gte=now)
                   .order_by('start_time'))
    base_url = get_base_url(request)
    for event in events:
        vevent = cal.add('vevent')
        vevent.add('summary').value = event.title
        vevent.add('dtstart').value = event.start_time
        vevent.add('dtend').value = (
            event.start_time +
            datetime.timedelta(
                seconds=event.duration or event.estimated_duration
            )
        )
        vevent.add('description').value = short_desc(event, strip_html=True)
        if event.location:
            vevent.add('location').value = event.location.name
        vevent.add('url').value = (
            base_url + reverse('main:event', args=(event.slug,))
        )
    icalstream = cal.serialize()
    # response = http.HttpResponse(
    #     icalstream,
    #     content_type='text/plain; charset=utf-8'
    # )
    response = http.HttpResponse(
        icalstream,
        content_type='text/calendar; charset=utf-8'
    )
    filename = 'AirMozillaEvents%s' % (privacy and privacy or '')
    if location:
        filename += '_%s' % slugify(location.name)
    filename += '.ics'
    response['Content-Disposition'] = (
        'inline; filename=%s' % filename)
    if not location:
        cache.set(cache_key, response, 60 * 10)  # 10 minutes

    # https://bugzilla.mozilla.org/show_bug.cgi?id=909516
    response['Access-Control-Allow-Origin'] = '*'

    return response
コード例 #21
0
def events_calendar(request, privacy=None):
    cache_key = 'calendar'
    if privacy:
        cache_key += '_%s' % privacy
    if request.GET.get('location'):
        location = get_object_or_404(Location,
                                     name=request.GET.get('location'))
        cache_key += str(location.pk)
        cached = None
    else:
        location = None
        cached = cache.get(cache_key)

    if cached:
        return cached
    cal = vobject.iCalendar()

    now = datetime.datetime.utcnow().replace(tzinfo=utc)
    base_qs = Event.objects.approved()
    if privacy == 'public':
        base_qs = base_qs.filter(privacy=Event.PRIVACY_PUBLIC)
        title = 'Air Mozilla Public Events'
    elif privacy == 'private':
        base_qs = base_qs.exclude(privacy=Event.PRIVACY_PUBLIC)
        title = 'Air Mozilla Private Events'
    else:
        title = 'Air Mozilla Events'
    if location:
        base_qs = base_qs.filter(location=location)
    cal.add('X-WR-CALNAME').value = title
    events = list(
        base_qs.filter(start_time__lt=now).order_by('-start_time')
        [:settings.CALENDAR_SIZE])
    events += list(
        base_qs.filter(start_time__gte=now).order_by('start_time')
        [:settings.CALENDAR_SIZE])
    base_url = '%s://%s/' % (request.is_secure() and 'https'
                             or 'http', RequestSite(request).domain)
    for event in events:
        vevent = cal.add('vevent')
        vevent.add('summary').value = event.title
        vevent.add('dtstart').value = event.start_time
        vevent.add('dtend').value = (event.start_time +
                                     datetime.timedelta(hours=1))
        vevent.add('description').value = unhtml(short_desc(event))
        if event.location:
            vevent.add('location').value = event.location.name
        vevent.add('url').value = base_url + event.slug + '/'
    icalstream = cal.serialize()
    #response = http.HttpResponse(icalstream,
    #                          mimetype='text/plain; charset=utf-8')

    response = http.HttpResponse(icalstream,
                                 mimetype='text/calendar; charset=utf-8')
    filename = 'AirMozillaEvents%s' % (privacy and privacy or '')
    if location:
        filename += '_%s' % slugify(location.name)
    filename += '.ics'
    response['Content-Disposition'] = ('inline; filename=%s' % filename)
    if not location:
        cache.set(cache_key, response)
    return response