diff options
| author | django-bot <ops@djangoproject.com> | 2022-11-26 16:30:44 +0530 |
|---|---|---|
| committer | Paolo Melchiorre <paolo@melchiorre.org> | 2022-11-30 12:54:36 +0100 |
| commit | 3045b338de791118962df4db370411247413eca6 (patch) | |
| tree | bb222ffb7e4b938dfe9e0386c617ad1835a3ded6 /blog | |
| parent | 40b0da2c241ea471f70eb9c4fbe6da396253f363 (diff) | |
Refs #1184 -- Reformatted code with Black.
Diffstat (limited to 'blog')
| -rw-r--r-- | blog/admin.py | 30 | ||||
| -rw-r--r-- | blog/migrations/0001_initial.py | 75 | ||||
| -rw-r--r-- | blog/migrations/0002_event.py | 56 | ||||
| -rw-r--r-- | blog/models.py | 74 | ||||
| -rw-r--r-- | blog/sitemaps.py | 6 | ||||
| -rw-r--r-- | blog/templatetags/weblog.py | 18 | ||||
| -rw-r--r-- | blog/tests.py | 110 | ||||
| -rw-r--r-- | blog/urls.py | 26 | ||||
| -rw-r--r-- | blog/views.py | 9 |
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>"raw" directive disabled.</p>', entry.body_html) - self.assertIn('.. raw:: html\n :file: somefile', entry.body_html) + self.assertIn("<p>"raw" 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 |
