Skip to content
This repository has been archived by the owner on Feb 13, 2019. It is now read-only.

Commit

Permalink
updated the endpoint
Browse files Browse the repository at this point in the history
* filters by published
* takes an array of entry ids rather than a timestamp
  • Loading branch information
collin committed Sep 13, 2016
1 parent 364dc82 commit a473746
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 37 deletions.
1 change: 1 addition & 0 deletions bulbs/liveblog/tasks.py
Expand Up @@ -12,5 +12,6 @@ def firebase_update_timestamp(liveblog_id):
url = endpoint.format(liveblog_id=liveblog_id)
resp = requests.put(url, json={
'updatedAt': timezone.now().isoformat(),

})
resp.raise_for_status()
1 change: 0 additions & 1 deletion bulbs/liveblog/templates/liveblog/bulbs_liveblog.html
Expand Up @@ -6,7 +6,6 @@
firebase-url="{{ FIREBASE_URL }}"
firebase-api-key="{{ FIREBASE_API_KEY }}"
firebase-path="{{ FIREBASE_PUBLIC_ROOT }}/articles/{{ content.id }}/liveblog"
updated-at="{% now 'c' %}"
liveblog-id="{{ content.id }}"
liveblog-url="{% url 'liveblog-new-entries' slug=content.slug pk=content.pk %}"
>
Expand Down
5 changes: 3 additions & 2 deletions bulbs/liveblog/templates/liveblog/entries.html
@@ -1,12 +1,13 @@
{% load ads betty liveblog_tags %}
{% for entry in entries %}
<div
<liveblog-entry
class="
liveblog-entry
{% if request.GET.entry == entry.id %}
liveblog-entry-shared
{% endif %}
"
entry-id="{{ entry.id }}"
entry-url="{{ entry.get_absolute_url }}"
>

Expand Down Expand Up @@ -96,6 +97,6 @@ <h1 class="liveblog-entry-headline">

{% liveblog_entry_sharetools_partial %}

</div>
</liveblog-entry>
{% endfor %}

23 changes: 13 additions & 10 deletions bulbs/liveblog/views.py
@@ -1,23 +1,26 @@
from django.conf import settings
from django.db.models.loading import get_model
from django.shortcuts import get_object_or_404
from django.utils import dateparse
from django.utils import timezone
from django.views.decorators.cache import cache_control
from django.views.generic import TemplateView

from bulbs.content.views import BaseContentDetailView

LiveBlogModel = get_model(settings.BULBS_LIVEBLOG_MODEL)


class LiveblogNewEntriesView(TemplateView):
class LiveblogNewEntriesView(BaseContentDetailView):
model = LiveBlogModel
template_name = 'liveblog/new_entries.html'
redirect_correct_path = False

def get_context_data(self, slug, pk):
def get_context_data(self, object):
context = {}
liveblog = get_object_or_404(LiveBlogModel, pk=pk)
when = dateparse.parse_datetime(self.request.GET['new_as_of'])
if not when:
raise ValueError('param new_as_of must be an ISO formatted timestamp')
context['entries'] = liveblog.entries.filter(published__gte=when)
if 'entry_ids' not in self.request.GET:
raise ValueError('param "entry_ids" MUST be specified')
parsed_entry_ids = [x.strip() for x in self.request.GET['entry_ids'].split(',')]
context['entries'] = self.object.entries.filter(
pk__in=parsed_entry_ids,
published__lte=timezone.now())
return context

liveblog_new_entries = cache_control(max_age=600)(LiveblogNewEntriesView.as_view())
3 changes: 3 additions & 0 deletions example/testcontent/models.py
Expand Up @@ -110,6 +110,9 @@ def get_absolute_url(self):
class TestLiveBlog(Content, AbstractLiveBlog):
"""Example LiveBlog implementation"""

def get_absolute_url(self):
return '/liveblog/{}-{}'.format(self.slug, self.pk)

class Mapping(Content.Mapping):
class Meta:
# Exclude until actually needed, to avoid dealing with custom mappings
Expand Down
56 changes: 32 additions & 24 deletions tests/liveblog/test_liveblog_views.py
Expand Up @@ -21,48 +21,56 @@ def setUp(self):
liveblog=self.liveblog,
published=datetime.now())

def test_requires_is_new_as_of_param(self):
def test_requires_entry_ids_param(self):
view = LiveblogNewEntriesView.as_view()
with self.assertRaises(ValueError):
view(
RequestFactory().get(
'/liveblog/this-cool-liveblog-1234/new-entries?new_as_of=not-iso-format'.format(
datetime.now().isoformat())),
RequestFactory().get('/liveblog/this-cool-liveblog-{}/new-entries'.format(
self.liveblog.pk)),
slug='this-cool-live-blog',
pk=self.liveblog.pk)

def test_raises_404_if_liveblog_does_not_exist(self):
view = LiveblogNewEntriesView.as_view()
with self.assertRaises(Http404):
view(
RequestFactory().get(
'/liveblog/this-cool-liveblog-1234/new-entries?new_as_of={}'.format(
datetime.now().isoformat())),
RequestFactory().get('/liveblog/this-cool-liveblog-1234/new-entries'),
slug='this-cool-live-blog',
pk=1234)

def test_renders_new_entries(self):
self.entry2 = LiveBlogEntry.objects.create(
entry2 = LiveBlogEntry.objects.create(
liveblog=self.liveblog,
published=datetime.now() + timedelta(days=1))
self.entry3 = LiveBlogEntry.objects.create(
published=datetime.now() - timedelta(days=1))
entry3 = LiveBlogEntry.objects.create(
liveblog=self.liveblog,
published=datetime.now() - timedelta(days=1))

view = LiveblogNewEntriesView.as_view()
response = view(RequestFactory().get(
'/liveblog/this-cool-liveblog-1234/new-entries?new_as_of={}'.format(
datetime.now().isoformat())),
slug='this-cool-live-blog',
pk=self.liveblog.pk)
self.assertContains(response, '<div\n class="\n liveblog-entry', count=1)
response = view(
RequestFactory().get(
'/liveblog/this-cool-liveblog-{}/new-entries?entry_ids={}'.format(
self.liveblog.pk, ','.join([str(entry2.pk), str(entry3.pk)]))),
slug='this-cool-live-blog',
pk=self.liveblog.pk)
self.assertContains(response, '<liveblog-entry', count=2)
self.assertContains(response, 'entry-id="{}"'.format(entry2.pk))
self.assertContains(response, 'entry-id="{}"'.format(entry3.pk))

def test_only_renders_published_entries(self):
entry2 = LiveBlogEntry.objects.create(
liveblog=self.liveblog,
published=datetime.now() - timedelta(days=1))
entry3 = LiveBlogEntry.objects.create(
liveblog=self.liveblog,
published=datetime.now() + timedelta(days=1))

def test_renders_nothing_when_no_new_entries(self):
view = LiveblogNewEntriesView.as_view()
response = view(RequestFactory().get(
'/liveblog/this-cool-liveblog-1234/new-entries?new_as_of={}'.format(
datetime.now().isoformat())),
slug='this-cool-live-blog',
pk=self.liveblog.pk)
response.render()
self.assertTrue(response.content)
response = view(
RequestFactory().get(
'/liveblog/this-cool-liveblog-{}/new-entries?entry_ids={}'.format(
self.liveblog.pk, ','.join([str(entry2.pk), str(entry3.pk)]))),
slug='this-cool-live-blog',
pk=self.liveblog.pk)
self.assertContains(response, '<liveblog-entry', count=1)
self.assertContains(response, 'entry-id="{}"'.format(entry2.pk))

0 comments on commit a473746

Please sign in to comment.