summaryrefslogtreecommitdiff
path: root/blog
diff options
context:
space:
mode:
authordjango-bot <ops@djangoproject.com>2022-11-26 16:30:44 +0530
committerPaolo Melchiorre <paolo@melchiorre.org>2022-11-30 12:54:36 +0100
commit3045b338de791118962df4db370411247413eca6 (patch)
treebb222ffb7e4b938dfe9e0386c617ad1835a3ded6 /blog
parent40b0da2c241ea471f70eb9c4fbe6da396253f363 (diff)
Refs #1184 -- Reformatted code with Black.
Diffstat (limited to 'blog')
-rw-r--r--blog/admin.py30
-rw-r--r--blog/migrations/0001_initial.py75
-rw-r--r--blog/migrations/0002_event.py56
-rw-r--r--blog/models.py74
-rw-r--r--blog/sitemaps.py6
-rw-r--r--blog/templatetags/weblog.py18
-rw-r--r--blog/tests.py110
-rw-r--r--blog/urls.py26
-rw-r--r--blog/views.py9
9 files changed, 249 insertions, 155 deletions
diff --git a/blog/admin.py b/blog/admin.py
index 4e85d942..5525017a 100644
--- a/blog/admin.py
+++ b/blog/admin.py
@@ -4,24 +4,34 @@ from .models import Entry, Event
class EntryAdmin(admin.ModelAdmin):
- list_display = ('headline', 'pub_date', 'is_active', 'is_published', 'author')
- list_filter = ('is_active',)
- exclude = ('summary_html', 'body_html')
+ list_display = ("headline", "pub_date", "is_active", "is_published", "author")
+ list_filter = ("is_active",)
+ exclude = ("summary_html", "body_html")
prepopulated_fields = {"slug": ("headline",)}
def formfield_for_dbfield(self, db_field, **kwargs):
formfield = super().formfield_for_dbfield(db_field, **kwargs)
- if db_field.name == 'body':
- formfield.widget.attrs.update({
- 'rows': 60,
- 'style': 'font-family: monospace; width: 810px;',
- })
+ if db_field.name == "body":
+ formfield.widget.attrs.update(
+ {
+ "rows": 60,
+ "style": "font-family: monospace; width: 810px;",
+ }
+ )
return formfield
class EventAdmin(admin.ModelAdmin):
- list_display = ('headline', 'external_url', 'date', 'location', 'pub_date', 'is_active', 'is_published')
- list_filter = ('is_active',)
+ list_display = (
+ "headline",
+ "external_url",
+ "date",
+ "location",
+ "pub_date",
+ "is_active",
+ "is_published",
+ )
+ list_filter = ("is_active",)
admin.site.register(Entry, EntryAdmin)
diff --git a/blog/migrations/0001_initial.py b/blog/migrations/0001_initial.py
index 0b75a0aa..525c9490 100644
--- a/blog/migrations/0001_initial.py
+++ b/blog/migrations/0001_initial.py
@@ -6,41 +6,60 @@ from django.db import migrations, models
class Migration(migrations.Migration):
- dependencies = [
- ]
+ dependencies = []
operations = [
migrations.CreateModel(
- name='Entry',
+ name="Entry",
fields=[
- ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('headline', models.CharField(max_length=200)),
- ('slug', models.SlugField(unique_for_date='pub_date')),
- ('is_active', models.BooleanField(
- default=False,
- help_text=(
- "Tick to make this entry live (see also the publication "
- "date). Note that administrators (like yourself) are "
- "allowed to preview inactive entries whereas the "
- "general public aren't."
+ (
+ "id",
+ models.AutoField(
+ verbose_name="ID",
+ serialize=False,
+ auto_created=True,
+ primary_key=True,
+ ),
+ ),
+ ("headline", models.CharField(max_length=200)),
+ ("slug", models.SlugField(unique_for_date="pub_date")),
+ (
+ "is_active",
+ models.BooleanField(
+ default=False,
+ help_text=(
+ "Tick to make this entry live (see also the publication "
+ "date). Note that administrators (like yourself) are "
+ "allowed to preview inactive entries whereas the "
+ "general public aren't."
+ ),
+ ),
+ ),
+ (
+ "pub_date",
+ models.DateTimeField(
+ help_text="For an entry to be published, it must be active and its publication date must be in the past.",
+ verbose_name="Publication date",
+ ),
+ ),
+ (
+ "content_format",
+ models.CharField(
+ max_length=50,
+ choices=[("reST", "reStructuredText"), ("html", "Raw HTML")],
),
- )),
- ('pub_date', models.DateTimeField(
- help_text='For an entry to be published, it must be active and its publication date must be in the past.',
- verbose_name='Publication date',
- )),
- ('content_format', models.CharField(max_length=50, choices=[('reST', 'reStructuredText'), ('html', 'Raw HTML')])),
- ('summary', models.TextField()),
- ('summary_html', models.TextField()),
- ('body', models.TextField()),
- ('body_html', models.TextField()),
- ('author', models.CharField(max_length=100)),
+ ),
+ ("summary", models.TextField()),
+ ("summary_html", models.TextField()),
+ ("body", models.TextField()),
+ ("body_html", models.TextField()),
+ ("author", models.CharField(max_length=100)),
],
options={
- 'ordering': ('-pub_date',),
- 'db_table': 'blog_entries',
- 'verbose_name_plural': 'entries',
- 'get_latest_by': 'pub_date',
+ "ordering": ("-pub_date",),
+ "db_table": "blog_entries",
+ "verbose_name_plural": "entries",
+ "get_latest_by": "pub_date",
},
bases=(models.Model,),
),
diff --git a/blog/migrations/0002_event.py b/blog/migrations/0002_event.py
index e30a92bd..0f8e125a 100644
--- a/blog/migrations/0002_event.py
+++ b/blog/migrations/0002_event.py
@@ -7,35 +7,49 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
- ('blog', '0001_initial'),
+ ("blog", "0001_initial"),
]
operations = [
migrations.CreateModel(
- name='Event',
+ name="Event",
fields=[
- ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
- ('headline', models.CharField(max_length=200)),
- ('external_url', models.URLField()),
- ('date', models.DateField()),
- ('location', models.CharField(max_length=100)),
- ('is_active', models.BooleanField(
- default=False,
- help_text=(
- "Tick to make this event live (see also the publication "
- "date). Note that administrators (like yourself) are "
- "allowed to preview inactive events whereas the "
- "general public aren't."
+ (
+ "id",
+ models.AutoField(
+ verbose_name="ID",
+ serialize=False,
+ auto_created=True,
+ primary_key=True,
),
- )),
- ('pub_date', models.DateTimeField(
- help_text='For an event to be published, it must be active and its publication date must be in the past.',
- verbose_name='Publication date',
- )),
+ ),
+ ("headline", models.CharField(max_length=200)),
+ ("external_url", models.URLField()),
+ ("date", models.DateField()),
+ ("location", models.CharField(max_length=100)),
+ (
+ "is_active",
+ models.BooleanField(
+ default=False,
+ help_text=(
+ "Tick to make this event live (see also the publication "
+ "date). Note that administrators (like yourself) are "
+ "allowed to preview inactive events whereas the "
+ "general public aren't."
+ ),
+ ),
+ ),
+ (
+ "pub_date",
+ models.DateTimeField(
+ help_text="For an event to be published, it must be active and its publication date must be in the past.",
+ verbose_name="Publication date",
+ ),
+ ),
],
options={
- 'ordering': ('-pub_date',),
- 'get_latest_by': 'pub_date',
+ "ordering": ("-pub_date",),
+ "get_latest_by": "pub_date",
},
bases=(models.Model,),
),
diff --git a/blog/models.py b/blog/models.py
index 72f5fa73..d33a487f 100644
--- a/blog/models.py
+++ b/blog/models.py
@@ -11,13 +11,13 @@ from django_hosts.resolvers import reverse
from docutils.core import publish_parts
BLOG_DOCUTILS_SETTINGS = {
- 'doctitle_xform': False,
- 'initial_header_level': 3,
- 'id_prefix': 's-',
- 'raw_enabled': False,
- 'file_insertion_enabled': False,
+ "doctitle_xform": False,
+ "initial_header_level": 3,
+ "id_prefix": "s-",
+ "raw_enabled": False,
+ "file_insertion_enabled": False,
}
-BLOG_DOCUTILS_SETTINGS.update(getattr(settings, 'BLOG_DOCUTILS_SETTINGS', {}))
+BLOG_DOCUTILS_SETTINGS.update(getattr(settings, "BLOG_DOCUTILS_SETTINGS", {}))
class EntryQuerySet(models.QuerySet):
@@ -29,14 +29,14 @@ class EntryQuerySet(models.QuerySet):
CONTENT_FORMAT_CHOICES = (
- ('reST', 'reStructuredText'),
- ('html', 'Raw HTML'),
+ ("reST", "reStructuredText"),
+ ("html", "Raw HTML"),
)
class Entry(models.Model):
headline = models.CharField(max_length=200)
- slug = models.SlugField(unique_for_date='pub_date')
+ slug = models.SlugField(unique_for_date="pub_date")
is_active = models.BooleanField(
help_text=_(
"Tick to make this entry live (see also the publication date). "
@@ -62,41 +62,46 @@ class Entry(models.Model):
objects = EntryQuerySet.as_manager()
class Meta:
- db_table = 'blog_entries'
- verbose_name_plural = 'entries'
- ordering = ('-pub_date',)
- get_latest_by = 'pub_date'
+ db_table = "blog_entries"
+ verbose_name_plural = "entries"
+ ordering = ("-pub_date",)
+ get_latest_by = "pub_date"
def __str__(self):
return self.headline
def get_absolute_url(self):
kwargs = {
- 'year': self.pub_date.year,
- 'month': self.pub_date.strftime('%b').lower(),
- 'day': self.pub_date.strftime('%d').lower(),
- 'slug': self.slug,
+ "year": self.pub_date.year,
+ "month": self.pub_date.strftime("%b").lower(),
+ "day": self.pub_date.strftime("%d").lower(),
+ "slug": self.slug,
}
- return reverse('weblog:entry', kwargs=kwargs)
+ return reverse("weblog:entry", kwargs=kwargs)
def is_published(self):
"""
Return True if the entry is publicly accessible.
"""
return self.is_active and self.pub_date <= timezone.now()
+
is_published.boolean = True
def save(self, *args, **kwargs):
- if self.content_format == 'html':
+ if self.content_format == "html":
self.summary_html = self.summary
self.body_html = self.body
- elif self.content_format == 'reST':
- self.summary_html = publish_parts(source=self.summary,
- writer_name="html",
- settings_overrides=BLOG_DOCUTILS_SETTINGS)['fragment']
- self.body_html = publish_parts(source=self.body,
- writer_name="html",
- settings_overrides=BLOG_DOCUTILS_SETTINGS)['fragment']
+ elif self.content_format == "reST":
+ self.summary_html = publish_parts(
+ source=self.summary,
+ writer_name="html",
+ settings_overrides=BLOG_DOCUTILS_SETTINGS,
+ )["fragment"]
+ self.body_html = publish_parts(
+ source=self.body,
+ writer_name="html",
+ settings_overrides=BLOG_DOCUTILS_SETTINGS,
+ )["fragment"]
super().save(*args, **kwargs)
self.invalidate_cached_entry()
@@ -106,20 +111,22 @@ class Entry(models.Model):
SERVER_NAME=url.netloc,
HTTP_X_FORWARDED_PROTOCOL=url.scheme,
)
- is_secure = url.scheme == 'https'
+ is_secure = url.scheme == "https"
request = rf.get(url.path, secure=is_secure)
- request.LANGUAGE_CODE = 'en'
+ request.LANGUAGE_CODE = "en"
cache = caches[settings.CACHE_MIDDLEWARE_ALIAS]
- cache_key = _generate_cache_header_key(settings.CACHE_MIDDLEWARE_KEY_PREFIX, request)
+ cache_key = _generate_cache_header_key(
+ settings.CACHE_MIDDLEWARE_KEY_PREFIX, request
+ )
cache.delete(cache_key)
class EventQuerySet(EntryQuerySet):
def past(self):
- return self.filter(date__lte=timezone.now()).order_by('-date')
+ return self.filter(date__lte=timezone.now()).order_by("-date")
def future(self):
- return self.filter(date__gte=timezone.now()).order_by('date')
+ return self.filter(date__gte=timezone.now()).order_by("date")
class Event(models.Model):
@@ -146,12 +153,13 @@ class Event(models.Model):
objects = EventQuerySet.as_manager()
class Meta:
- ordering = ('-pub_date',)
- get_latest_by = 'pub_date'
+ ordering = ("-pub_date",)
+ get_latest_by = "pub_date"
def is_published(self):
"""
Return True if the event is publicly accessible.
"""
return self.is_active and self.pub_date <= timezone.now()
+
is_published.boolean = True
diff --git a/blog/sitemaps.py b/blog/sitemaps.py
index ba2d286d..5e5862a4 100644
--- a/blog/sitemaps.py
+++ b/blog/sitemaps.py
@@ -4,7 +4,7 @@ from .models import Entry
class WeblogSitemap(Sitemap):
- changefreq = 'never'
+ changefreq = "never"
priority = 0.4
def items(self):
@@ -17,8 +17,8 @@ class WeblogSitemap(Sitemap):
for item in self.paginator.page(page).object_list:
loc = item.get_absolute_url()
url_info = {
- 'item': item,
- 'location': loc,
+ "item": item,
+ "location": loc,
}
urls.append(url_info)
return urls
diff --git a/blog/templatetags/weblog.py b/blog/templatetags/weblog.py
index de13c83d..5d79d4be 100644
--- a/blog/templatetags/weblog.py
+++ b/blog/templatetags/weblog.py
@@ -5,19 +5,21 @@ from ..models import Entry
register = template.Library()
-@register.inclusion_tag('blog/entry_snippet.html')
-def render_latest_blog_entries(num, summary_first=False, hide_readmore=False, header_tag=''):
+@register.inclusion_tag("blog/entry_snippet.html")
+def render_latest_blog_entries(
+ num, summary_first=False, hide_readmore=False, header_tag=""
+):
entries = Entry.objects.published()[:num]
return {
- 'entries': entries,
- 'summary_first': summary_first,
- 'header_tag': header_tag,
- 'hide_readmore': hide_readmore,
+ "entries": entries,
+ "summary_first": summary_first,
+ "header_tag": header_tag,
+ "hide_readmore": hide_readmore,
}
-@register.inclusion_tag('blog/month_links_snippet.html')
+@register.inclusion_tag("blog/month_links_snippet.html")
def render_month_links():
return {
- 'dates': Entry.objects.published().dates('pub_date', 'month', order='DESC'),
+ "dates": Entry.objects.published().dates("pub_date", "month", order="DESC"),
}
diff --git a/blog/tests.py b/blog/tests.py
index 457cbd50..881383ac 100644
--- a/blog/tests.py
+++ b/blog/tests.py
@@ -21,21 +21,44 @@ class EntryTestCase(DateTimeMixin, TestCase):
"""
Make sure that the Entry manager's `active` method works
"""
- Entry.objects.create(pub_date=self.now, is_active=False, headline='inactive', slug='a')
- Entry.objects.create(pub_date=self.now, is_active=True, headline='active', slug='b')
+ Entry.objects.create(
+ pub_date=self.now, is_active=False, headline="inactive", slug="a"
+ )
+ Entry.objects.create(
+ pub_date=self.now, is_active=True, headline="active", slug="b"
+ )
- self.assertQuerysetEqual(Entry.objects.published(), ['active'], transform=lambda entry: entry.headline)
+ self.assertQuerysetEqual(
+ Entry.objects.published(),
+ ["active"],
+ transform=lambda entry: entry.headline,
+ )
def test_manager_published(self):
"""
Make sure that the Entry manager's `published` method works
"""
- Entry.objects.create(pub_date=self.yesterday, is_active=False, headline='past inactive', slug='a')
- Entry.objects.create(pub_date=self.yesterday, is_active=True, headline='past active', slug='b')
- Entry.objects.create(pub_date=self.tomorrow, is_active=False, headline='future inactive', slug='c')
- Entry.objects.create(pub_date=self.tomorrow, is_active=True, headline='future active', slug='d')
+ Entry.objects.create(
+ pub_date=self.yesterday, is_active=False, headline="past inactive", slug="a"
+ )
+ Entry.objects.create(
+ pub_date=self.yesterday, is_active=True, headline="past active", slug="b"
+ )
+ Entry.objects.create(
+ pub_date=self.tomorrow,
+ is_active=False,
+ headline="future inactive",
+ slug="c",
+ )
+ Entry.objects.create(
+ pub_date=self.tomorrow, is_active=True, headline="future active", slug="d"
+ )
- self.assertQuerysetEqual(Entry.objects.published(), ['past active'], transform=lambda entry: entry.headline)
+ self.assertQuerysetEqual(
+ Entry.objects.published(),
+ ["past active"],
+ transform=lambda entry: entry.headline,
+ )
def test_docutils_safe(self):
"""
@@ -43,11 +66,15 @@ class EntryTestCase(DateTimeMixin, TestCase):
"""
with captured_stderr() as self.docutils_stderr:
entry = Entry.objects.create(
- pub_date=self.now, is_active=True, headline='active', content_format='reST',
- body='.. raw:: html\n :file: somefile\n', slug='a',
+ pub_date=self.now,
+ is_active=True,
+ headline="active",
+ content_format="reST",
+ body=".. raw:: html\n :file: somefile\n",
+ slug="a",
)
- self.assertIn('<p>&quot;raw&quot; directive disabled.</p>', entry.body_html)
- self.assertIn('.. raw:: html\n :file: somefile', entry.body_html)
+ self.assertIn("<p>&quot;raw&quot; directive disabled.</p>", entry.body_html)
+ self.assertIn(".. raw:: html\n :file: somefile", entry.body_html)
class EventTestCase(DateTimeMixin, TestCase):
@@ -55,20 +82,28 @@ class EventTestCase(DateTimeMixin, TestCase):
"""
Make sure that the Event manager's `past` and `future` methods works
"""
- Event.objects.create(date=self.yesterday, pub_date=self.now, headline='past')
- Event.objects.create(date=self.tomorrow, pub_date=self.now, headline='future')
+ Event.objects.create(date=self.yesterday, pub_date=self.now, headline="past")
+ Event.objects.create(date=self.tomorrow, pub_date=self.now, headline="future")
- self.assertQuerysetEqual(Event.objects.future(), ['future'], transform=lambda event: event.headline)
- self.assertQuerysetEqual(Event.objects.past(), ['past'], transform=lambda event: event.headline)
+ self.assertQuerysetEqual(
+ Event.objects.future(), ["future"], transform=lambda event: event.headline
+ )
+ self.assertQuerysetEqual(
+ Event.objects.past(), ["past"], transform=lambda event: event.headline
+ )
def test_manager_past_future_include_today(self):
"""
Make sure that both .future() and .past() include today's events.
"""
- Event.objects.create(date=self.now, pub_date=self.now, headline='today')
+ Event.objects.create(date=self.now, pub_date=self.now, headline="today")
- self.assertQuerysetEqual(Event.objects.future(), ['today'], transform=lambda event: event.headline)
- self.assertQuerysetEqual(Event.objects.past(), ['today'], transform=lambda event: event.headline)
+ self.assertQuerysetEqual(
+ Event.objects.future(), ["today"], transform=lambda event: event.headline
+ )
+ self.assertQuerysetEqual(
+ Event.objects.past(), ["today"], transform=lambda event: event.headline
+ )
def test_past_future_ordering(self):
"""
@@ -76,14 +111,22 @@ class EventTestCase(DateTimeMixin, TestCase):
(and not the pub_date).
"""
D = timedelta(days=1)
- Event.objects.create(date=self.yesterday - D, pub_date=self.yesterday - D, headline='a')
- Event.objects.create(date=self.yesterday, pub_date=self.yesterday, headline='b')
+ Event.objects.create(
+ date=self.yesterday - D, pub_date=self.yesterday - D, headline="a"
+ )
+ Event.objects.create(date=self.yesterday, pub_date=self.yesterday, headline="b")
- Event.objects.create(date=self.tomorrow, pub_date=self.tomorrow, headline='c')
- Event.objects.create(date=self.tomorrow + D, pub_date=self.tomorrow + D, headline='d')
+ Event.objects.create(date=self.tomorrow, pub_date=self.tomorrow, headline="c")
+ Event.objects.create(
+ date=self.tomorrow + D, pub_date=self.tomorrow + D, headline="d"
+ )
- self.assertQuerysetEqual(Event.objects.future(), ['c', 'd'], transform=lambda event: event.headline)
- self.assertQuerysetEqual(Event.objects.past(), ['b', 'a'], transform=lambda event: event.headline)
+ self.assertQuerysetEqual(
+ Event.objects.future(), ["c", "d"], transform=lambda event: event.headline
+ )
+ self.assertQuerysetEqual(
+ Event.objects.past(), ["b", "a"], transform=lambda event: event.headline
+ )
class ViewsTestCase(DateTimeMixin, TestCase):
@@ -92,19 +135,22 @@ class ViewsTestCase(DateTimeMixin, TestCase):
Make sure there are no past event in the "upcoming events" sidebar (#399)
"""
# We need a published entry on the index page so that it doesn't return a 404
- Entry.objects.create(pub_date=self.yesterday, is_active=True, slug='a')
- Event.objects.create(date=self.yesterday, pub_date=self.now, is_active=True, headline='Jezdezcon')
- response = self.client.get(reverse('weblog:index'))
+ Entry.objects.create(pub_date=self.yesterday, is_active=True, slug="a")
+ Event.objects.create(
+ date=self.yesterday, pub_date=self.now, is_active=True, headline="Jezdezcon"
+ )
+ response = self.client.get(reverse("weblog:index"))
self.assertEqual(response.status_code, 200)
- self.assertQuerysetEqual(response.context['events'], [])
+ self.assertQuerysetEqual(response.context["events"], [])
class SitemapTests(DateTimeMixin, TestCase):
-
def test_sitemap(self):
- entry = Entry.objects.create(pub_date=self.yesterday, is_active=True, headline='foo', slug='foo')
+ entry = Entry.objects.create(
+ pub_date=self.yesterday, is_active=True, headline="foo", slug="foo"
+ )
sitemap = WeblogSitemap()
urls = sitemap.get_urls()
self.assertEqual(len(urls), 1)
url_info = urls[0]
- self.assertEqual(url_info['location'], entry.get_absolute_url())
+ self.assertEqual(url_info["location"], entry.get_absolute_url())
diff --git a/blog/urls.py b/blog/urls.py
index 1f12b391..f17ab114 100644
--- a/blog/urls.py
+++ b/blog/urls.py
@@ -2,31 +2,23 @@ from django.urls import path
from . import views
-app_name = 'weblog'
+app_name = "weblog"
urlpatterns = [
path(
- '<int:year>/<str:month>/<int:day>/<slug>/',
+ "<int:year>/<str:month>/<int:day>/<slug>/",
views.BlogDateDetailView.as_view(),
- name="entry"
+ name="entry",
),
path(
- '<int:year>/<str:month>/<int:day>/',
+ "<int:year>/<str:month>/<int:day>/",
views.BlogDayArchiveView.as_view(),
- name="archive-day"
+ name="archive-day",
),
path(
- '<int:year>/<str:month>/',
+ "<int:year>/<str:month>/",
views.BlogMonthArchiveView.as_view(),
- name="archive-month"
- ),
- path(
- '<int:year>/',
- views.BlogYearArchiveView.as_view(),
- name="archive-year"
- ),
- path(
- '',
- views.BlogArchiveIndexView.as_view(),
- name="index"
+ name="archive-month",
),
+ path("<int:year>/", views.BlogYearArchiveView.as_view(), name="archive-year"),
+ path("", views.BlogArchiveIndexView.as_view(), name="index"),
]
diff --git a/blog/views.py b/blog/views.py
index 8592638a..96fb675f 100644
--- a/blog/views.py
+++ b/blog/views.py
@@ -1,5 +1,8 @@
from django.views.generic.dates import (
- ArchiveIndexView, DateDetailView, DayArchiveView, MonthArchiveView,
+ ArchiveIndexView,
+ DateDetailView,
+ DayArchiveView,
+ MonthArchiveView,
YearArchiveView,
)
@@ -8,7 +11,7 @@ from .models import Entry, Event
class BlogViewMixin:
- date_field = 'pub_date'
+ date_field = "pub_date"
paginate_by = 10
def get_allow_future(self):
@@ -27,7 +30,7 @@ class BlogViewMixin:
if not self.request.user.is_staff:
events_queryset = events_queryset.published()
- context['events'] = events_queryset[:3]
+ context["events"] = events_queryset[:3]
return context