From 7c1260ff102569316e7110b19ce4695b500014e4 Mon Sep 17 00:00:00 2001 From: "Ernest W. Durbin III" Date: Thu, 11 Apr 2019 10:18:08 -0500 Subject: [PATCH 1/4] implement naive self-service banners for python.org --- banners/__init__.py | 0 banners/admin.py | 9 +++++++++ banners/migrations/0001_initial.py | 25 +++++++++++++++++++++++++ banners/migrations/__init__.py | 0 banners/models.py | 10 ++++++++++ banners/templatetags/__init__.py | 0 banners/templatetags/banners.py | 23 +++++++++++++++++++++++ pydotorg/settings/base.py | 1 + templates/banners/banner.html | 7 +++++++ templates/downloads/index.html | 3 +++ templates/psf/default.html | 3 +++ templates/psf/full-width.html | 3 +++ templates/psf/index.html | 3 ++- templates/python/index.html | 3 +++ 14 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 banners/__init__.py create mode 100644 banners/admin.py create mode 100644 banners/migrations/0001_initial.py create mode 100644 banners/migrations/__init__.py create mode 100644 banners/models.py create mode 100644 banners/templatetags/__init__.py create mode 100644 banners/templatetags/banners.py create mode 100644 templates/banners/banner.html diff --git a/banners/__init__.py b/banners/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/banners/admin.py b/banners/admin.py new file mode 100644 index 000000000..03173f990 --- /dev/null +++ b/banners/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin + +from banners.models import Banner + + +class BannerAdmin(admin.ModelAdmin): + list_display = ("title", "active", "psf_pages_only") + +admin.site.register(Banner, BannerAdmin) diff --git a/banners/migrations/0001_initial.py b/banners/migrations/0001_initial.py new file mode 100644 index 000000000..3a431abcd --- /dev/null +++ b/banners/migrations/0001_initial.py @@ -0,0 +1,25 @@ +# Generated by Django 2.0.9 on 2019-04-11 14:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Banner', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=1024)), + ('message', models.CharField(max_length=2048)), + ('link', models.CharField(max_length=1024)), + ('active', models.BooleanField(default=False)), + ('psf_pages_only', models.BooleanField(default=True)), + ], + ), + ] diff --git a/banners/migrations/__init__.py b/banners/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/banners/models.py b/banners/models.py new file mode 100644 index 000000000..ea4f97a7d --- /dev/null +++ b/banners/models.py @@ -0,0 +1,10 @@ +from django.db import models + + +class Banner(models.Model): + + title = models.CharField(max_length=1024) + message = models.CharField(max_length=2048) + link = models.CharField(max_length=1024) + active = models.BooleanField(null=False, default=False) + psf_pages_only = models.BooleanField(null=False, default=True) diff --git a/banners/templatetags/__init__.py b/banners/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/banners/templatetags/banners.py b/banners/templatetags/banners.py new file mode 100644 index 000000000..351fa862b --- /dev/null +++ b/banners/templatetags/banners.py @@ -0,0 +1,23 @@ +from django import template +from django.template.loader import render_to_string + +from banners.models import Banner + +register = template.Library() + + +@register.simple_tag +def render_active_banner(psf_pages_only=True): + if not psf_pages_only: + banner = Banner.objects.filter(active=True, psf_pages_only=psf_pages_only).first() + else: + banner = Banner.objects.filter(active=True).first() + if banner is not None: + tmpl = template.loader.get_template('banners/banner.html') + ctx = { + 'message': banner.message, + 'title': banner.title, + 'link': banner.link, + } + return tmpl.render(ctx) + return '' diff --git a/pydotorg/settings/base.py b/pydotorg/settings/base.py index 6d0bb2d1e..7311c20c4 100644 --- a/pydotorg/settings/base.py +++ b/pydotorg/settings/base.py @@ -167,6 +167,7 @@ 'codesamples', 'work_groups', 'nominations', + 'banners', 'allauth', 'allauth.account', diff --git a/templates/banners/banner.html b/templates/banners/banner.html new file mode 100644 index 000000000..ecc425dc6 --- /dev/null +++ b/templates/banners/banner.html @@ -0,0 +1,7 @@ +
+ + + + {{ message }}   {{ title }} + +
diff --git a/templates/downloads/index.html b/templates/downloads/index.html index 8afc91ded..ca3b00782 100644 --- a/templates/downloads/index.html +++ b/templates/downloads/index.html @@ -1,5 +1,6 @@ {% extends "base.html" %} {% load boxes %} +{% load banners %} {% block page_title %}Download Python | {{ SITE_INFO.site_name }}{% endblock %} {% block og_title %}Download Python{% endblock %} @@ -38,6 +39,8 @@

Download the latest version of Python

{% block content %}
+ {% render_active_banner False %} +

Looking for a specific release?

Python releases by version number:

diff --git a/templates/psf/default.html b/templates/psf/default.html index 67ab7d2e4..1ad3bfd36 100644 --- a/templates/psf/default.html +++ b/templates/psf/default.html @@ -2,6 +2,7 @@ {% extends "base.html" %} {% load boxes %} +{% load banners %} {# TODO: Try to deduplicate this and templates/pages/default.html. #} {% block page_title %}{{ page.title }} | Python Software Foundation{% endblock %} @@ -26,6 +27,8 @@ {% block breadcrumbs %} {% load sitetree %} + {% render_active_banner True %} + {% sitetree_breadcrumbs from "main" template "sitetree/breadcrumbs.html" %} {% endblock breadcrumbs %} diff --git a/templates/psf/full-width.html b/templates/psf/full-width.html index b220b96d3..309cb56c4 100644 --- a/templates/psf/full-width.html +++ b/templates/psf/full-width.html @@ -2,6 +2,7 @@ {% extends "base.html" %} {% load boxes %} +{% load banners %} {# TODO: Try to deduplicate this and templates/pages/default.html. #} {% block page_title %}{{ page.title }} | Python Software Foundation{% endblock %} @@ -26,6 +27,8 @@ {% block breadcrumbs %} {% load sitetree %} + {% render_active_banner True %} + {% sitetree_breadcrumbs from "main" template "sitetree/breadcrumbs.html" %} {% endblock breadcrumbs %} diff --git a/templates/psf/index.html b/templates/psf/index.html index 6feafa93d..eab6f08d2 100644 --- a/templates/psf/index.html +++ b/templates/psf/index.html @@ -1,7 +1,7 @@ {# ===== PSF LANDING PAGE ===== #} {% extends "base.html" %} -{% load boxes sponsors blogs %} +{% load boxes sponsors blogs banners %} {% block page_title %}Python Software Foundation{% endblock %} @@ -30,6 +30,7 @@ {% block content %} + {% render_active_banner True %}
diff --git a/templates/python/index.html b/templates/python/index.html index f8f349b68..56a5658ab 100644 --- a/templates/python/index.html +++ b/templates/python/index.html @@ -1,5 +1,6 @@ {% extends "base.html" %} {% load boxes %} +{% load banners %} {% block body_attributes %}class="python home" id="homepage"{% endblock %} @@ -36,6 +37,8 @@ {% block content %} + {% render_active_banner False %} +
From e0d5e6ff07c0b8eaf21fb198f742c45b082cd134 Mon Sep 17 00:00:00 2001 From: "Ernest W. Durbin III" Date: Thu, 11 Apr 2019 10:22:21 -0500 Subject: [PATCH 2/4] make better help_texts for banners django admin --- banners/migrations/0002_auto_20190411_1521.py | 38 +++++++++++++++++++ banners/models.py | 25 +++++++++--- 2 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 banners/migrations/0002_auto_20190411_1521.py diff --git a/banners/migrations/0002_auto_20190411_1521.py b/banners/migrations/0002_auto_20190411_1521.py new file mode 100644 index 000000000..4c27a8ab6 --- /dev/null +++ b/banners/migrations/0002_auto_20190411_1521.py @@ -0,0 +1,38 @@ +# Generated by Django 2.0.9 on 2019-04-11 15:21 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('banners', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='banner', + name='active', + field=models.BooleanField(default=False, help_text='Make the banner active on the site'), + ), + migrations.AlterField( + model_name='banner', + name='link', + field=models.CharField(help_text='Link the button will go to', max_length=1024), + ), + migrations.AlterField( + model_name='banner', + name='message', + field=models.CharField(help_text='Message to display in the banner', max_length=2048), + ), + migrations.AlterField( + model_name='banner', + name='psf_pages_only', + field=models.BooleanField(default=True, help_text='Display the banner on /psf pages only'), + ), + migrations.AlterField( + model_name='banner', + name='title', + field=models.CharField(help_text="Text to display in the banner's button", max_length=1024), + ), + ] diff --git a/banners/models.py b/banners/models.py index ea4f97a7d..40c076c2e 100644 --- a/banners/models.py +++ b/banners/models.py @@ -3,8 +3,23 @@ class Banner(models.Model): - title = models.CharField(max_length=1024) - message = models.CharField(max_length=2048) - link = models.CharField(max_length=1024) - active = models.BooleanField(null=False, default=False) - psf_pages_only = models.BooleanField(null=False, default=True) + title = models.CharField( + max_length=1024, + help_text="Text to display in the banner's button", + ) + message = models.CharField( + max_length=2048, + help_text="Message to display in the banner", + ) + link = models.CharField( + max_length=1024, + help_text="Link the button will go to", + ) + active = models.BooleanField( + null=False, default=False, + help_text="Make the banner active on the site", + ) + psf_pages_only = models.BooleanField( + null=False, default=True, + help_text="Display the banner on /psf pages only", + ) From 27a71e262483530536e4f7a59875c133b1f8bf8f Mon Sep 17 00:00:00 2001 From: "Ernest W. Durbin III" Date: Thu, 18 Apr 2019 13:55:12 -0500 Subject: [PATCH 3/4] address feedback from review, thank you @berkerpeksag and @jaap3! --- banners/admin.py | 3 +- banners/migrations/0001_initial.py | 12 +++--- banners/migrations/0002_auto_20190411_1521.py | 38 ------------------- banners/templatetags/banners.py | 32 +++++++++------- templates/downloads/index.html | 2 +- templates/psf/default.html | 2 +- templates/psf/full-width.html | 2 +- templates/psf/index.html | 2 +- templates/python/index.html | 2 +- 9 files changed, 31 insertions(+), 64 deletions(-) delete mode 100644 banners/migrations/0002_auto_20190411_1521.py diff --git a/banners/admin.py b/banners/admin.py index 03173f990..cfb0e1073 100644 --- a/banners/admin.py +++ b/banners/admin.py @@ -3,7 +3,6 @@ from banners.models import Banner +@admin.register(Banner) class BannerAdmin(admin.ModelAdmin): list_display = ("title", "active", "psf_pages_only") - -admin.site.register(Banner, BannerAdmin) diff --git a/banners/migrations/0001_initial.py b/banners/migrations/0001_initial.py index 3a431abcd..4b96e95f8 100644 --- a/banners/migrations/0001_initial.py +++ b/banners/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.9 on 2019-04-11 14:55 +# Generated by Django 2.0.9 on 2019-04-18 18:43 from django.db import migrations, models @@ -15,11 +15,11 @@ class Migration(migrations.Migration): name='Banner', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(max_length=1024)), - ('message', models.CharField(max_length=2048)), - ('link', models.CharField(max_length=1024)), - ('active', models.BooleanField(default=False)), - ('psf_pages_only', models.BooleanField(default=True)), + ('title', models.CharField(help_text="Text to display in the banner's button", max_length=1024)), + ('message', models.CharField(help_text='Message to display in the banner', max_length=2048)), + ('link', models.CharField(help_text='Link the button will go to', max_length=1024)), + ('active', models.BooleanField(default=False, help_text='Make the banner active on the site')), + ('psf_pages_only', models.BooleanField(default=True, help_text='Display the banner on /psf pages only')), ], ), ] diff --git a/banners/migrations/0002_auto_20190411_1521.py b/banners/migrations/0002_auto_20190411_1521.py deleted file mode 100644 index 4c27a8ab6..000000000 --- a/banners/migrations/0002_auto_20190411_1521.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 2.0.9 on 2019-04-11 15:21 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('banners', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='banner', - name='active', - field=models.BooleanField(default=False, help_text='Make the banner active on the site'), - ), - migrations.AlterField( - model_name='banner', - name='link', - field=models.CharField(help_text='Link the button will go to', max_length=1024), - ), - migrations.AlterField( - model_name='banner', - name='message', - field=models.CharField(help_text='Message to display in the banner', max_length=2048), - ), - migrations.AlterField( - model_name='banner', - name='psf_pages_only', - field=models.BooleanField(default=True, help_text='Display the banner on /psf pages only'), - ), - migrations.AlterField( - model_name='banner', - name='title', - field=models.CharField(help_text="Text to display in the banner's button", max_length=1024), - ), - ] diff --git a/banners/templatetags/banners.py b/banners/templatetags/banners.py index 351fa862b..31e9cad3e 100644 --- a/banners/templatetags/banners.py +++ b/banners/templatetags/banners.py @@ -6,18 +6,24 @@ register = template.Library() -@register.simple_tag -def render_active_banner(psf_pages_only=True): - if not psf_pages_only: - banner = Banner.objects.filter(active=True, psf_pages_only=psf_pages_only).first() - else: - banner = Banner.objects.filter(active=True).first() +def _render_banner(banner=None): if banner is not None: - tmpl = template.loader.get_template('banners/banner.html') - ctx = { - 'message': banner.message, - 'title': banner.title, - 'link': banner.link, - } - return tmpl.render(ctx) + return render_to_string( + 'banners/banner.html', + { + 'message': banner.message, + 'title': banner.title, + 'link': banner.link, + } + ) return '' + +@register.simple_tag +def render_active_banner(): + banner = Banner.objects.filter(active=True, psf_pages_only=False).first() + return _render_banner(banner=banner) + +@register.simple_tag +def render_active_psf_banner(): + banner = Banner.objects.filter(active=True).first() + return _render_banner(banner=banner) diff --git a/templates/downloads/index.html b/templates/downloads/index.html index ca3b00782..ed3ef0b6d 100644 --- a/templates/downloads/index.html +++ b/templates/downloads/index.html @@ -39,7 +39,7 @@

Download the latest version of Python

{% block content %}
- {% render_active_banner False %} + {% render_active_banner %}

Looking for a specific release?

Python releases by version number:

diff --git a/templates/psf/default.html b/templates/psf/default.html index 1ad3bfd36..9ae2fd540 100644 --- a/templates/psf/default.html +++ b/templates/psf/default.html @@ -27,7 +27,7 @@ {% block breadcrumbs %} {% load sitetree %} - {% render_active_banner True %} + {% render_active_psf_banner %} {% sitetree_breadcrumbs from "main" template "sitetree/breadcrumbs.html" %} {% endblock breadcrumbs %} diff --git a/templates/psf/full-width.html b/templates/psf/full-width.html index 309cb56c4..8a4a6ce01 100644 --- a/templates/psf/full-width.html +++ b/templates/psf/full-width.html @@ -27,7 +27,7 @@ {% block breadcrumbs %} {% load sitetree %} - {% render_active_banner True %} + {% render_active_psf_banner %} {% sitetree_breadcrumbs from "main" template "sitetree/breadcrumbs.html" %} {% endblock breadcrumbs %} diff --git a/templates/psf/index.html b/templates/psf/index.html index eab6f08d2..080e14f4d 100644 --- a/templates/psf/index.html +++ b/templates/psf/index.html @@ -30,7 +30,7 @@ {% block content %} - {% render_active_banner True %} + {% render_active_psf_banner %}
diff --git a/templates/python/index.html b/templates/python/index.html index 56a5658ab..ac8b191df 100644 --- a/templates/python/index.html +++ b/templates/python/index.html @@ -37,7 +37,7 @@ {% block content %} - {% render_active_banner False %} + {% render_active_banner %}
From 44c9dd2d3a2c83a620770284b2dcfd04f9767300 Mon Sep 17 00:00:00 2001 From: "Ernest W. Durbin III" Date: Thu, 18 Apr 2019 13:57:28 -0500 Subject: [PATCH 4/4] blackify banners app --- banners/migrations/0001_initial.py | 53 ++++++++++++++++++++++++------ banners/models.py | 17 +++------- banners/templatetags/banners.py | 13 ++++---- 3 files changed, 54 insertions(+), 29 deletions(-) diff --git a/banners/migrations/0001_initial.py b/banners/migrations/0001_initial.py index 4b96e95f8..a50adb59f 100644 --- a/banners/migrations/0001_initial.py +++ b/banners/migrations/0001_initial.py @@ -7,19 +7,52 @@ class Migration(migrations.Migration): initial = True - dependencies = [ - ] + dependencies = [] operations = [ migrations.CreateModel( - name='Banner', + name="Banner", fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(help_text="Text to display in the banner's button", max_length=1024)), - ('message', models.CharField(help_text='Message to display in the banner', max_length=2048)), - ('link', models.CharField(help_text='Link the button will go to', max_length=1024)), - ('active', models.BooleanField(default=False, help_text='Make the banner active on the site')), - ('psf_pages_only', models.BooleanField(default=True, help_text='Display the banner on /psf pages only')), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "title", + models.CharField( + help_text="Text to display in the banner's button", + max_length=1024, + ), + ), + ( + "message", + models.CharField( + help_text="Message to display in the banner", max_length=2048 + ), + ), + ( + "link", + models.CharField( + help_text="Link the button will go to", max_length=1024 + ), + ), + ( + "active", + models.BooleanField( + default=False, help_text="Make the banner active on the site" + ), + ), + ( + "psf_pages_only", + models.BooleanField( + default=True, help_text="Display the banner on /psf pages only" + ), + ), ], - ), + ) ] diff --git a/banners/models.py b/banners/models.py index 40c076c2e..87797573a 100644 --- a/banners/models.py +++ b/banners/models.py @@ -4,22 +4,15 @@ class Banner(models.Model): title = models.CharField( - max_length=1024, - help_text="Text to display in the banner's button", + max_length=1024, help_text="Text to display in the banner's button" ) message = models.CharField( - max_length=2048, - help_text="Message to display in the banner", - ) - link = models.CharField( - max_length=1024, - help_text="Link the button will go to", + max_length=2048, help_text="Message to display in the banner" ) + link = models.CharField(max_length=1024, help_text="Link the button will go to") active = models.BooleanField( - null=False, default=False, - help_text="Make the banner active on the site", + null=False, default=False, help_text="Make the banner active on the site" ) psf_pages_only = models.BooleanField( - null=False, default=True, - help_text="Display the banner on /psf pages only", + null=False, default=True, help_text="Display the banner on /psf pages only" ) diff --git a/banners/templatetags/banners.py b/banners/templatetags/banners.py index 31e9cad3e..24c62b5e8 100644 --- a/banners/templatetags/banners.py +++ b/banners/templatetags/banners.py @@ -9,20 +9,19 @@ def _render_banner(banner=None): if banner is not None: return render_to_string( - 'banners/banner.html', - { - 'message': banner.message, - 'title': banner.title, - 'link': banner.link, - } + "banners/banner.html", + {"message": banner.message, "title": banner.title, "link": banner.link}, ) - return '' + + return "" + @register.simple_tag def render_active_banner(): banner = Banner.objects.filter(active=True, psf_pages_only=False).first() return _render_banner(banner=banner) + @register.simple_tag def render_active_psf_banner(): banner = Banner.objects.filter(active=True).first()