Skip to content
Browse files

Merge remote-tracking branch 'jphalip/master'

  • Loading branch information...
2 parents cfc2058 + 55f7a33 commit d1065f57239af892a6cef0f4fc1c01401093276c @jacobian jacobian committed May 31, 2011
Showing with 509 additions and 79 deletions.
  1. +2 −1 .gitignore
  2. +14 −3 django_website/blog/admin.py
  3. +1 −2 django_website/blog/feeds.py
  4. +43 −0 django_website/blog/migrations/0001_initial.py
  5. +35 −0 django_website/blog/migrations/0002_auto__add_field_entry_is_active.py
  6. +30 −0 django_website/blog/migrations/0003_activate_existing_entries.py
  7. +43 −0 django_website/blog/migrations/0004_auto__add_field_entry_summary_html__add_field_entry_body_html.py
  8. +35 −0 django_website/blog/migrations/0005_copy_entry_summary_and_body_to_html.py
  9. +38 −0 django_website/blog/migrations/0006_auto__add_field_entry_use_raw_html.py
  10. +35 −0 django_website/blog/migrations/0007_existing_entries_are_raw_html.py
  11. +37 −0 django_website/blog/migrations/0008_auto__del_field_entry_use_raw_html.py
  12. +38 −0 django_website/blog/migrations/0009_auto__add_field_entry_content_format.py
  13. 0 django_website/blog/migrations/__init__.py
  14. +58 −6 django_website/blog/models.py
  15. +3 −4 django_website/blog/templatetags/weblog.py
  16. +7 −11 django_website/blog/urls.py
  17. +38 −0 django_website/blog/views.py
  18. +1 −1 django_website/docs/templates/docs/doc.html
  19. +2 −2 django_website/settings/www.py
  20. +1 −1 django_website/sitemaps.py
  21. +1 −1 django_website/templates/404.html
  22. +1 −1 django_website/templates/410.html
  23. +8 −8 django_website/templates/base.html
  24. +1 −1 django_website/templates/base_code.html
  25. +4 −4 django_website/templates/base_community.html
  26. +2 −2 django_website/templates/base_foundation.html
  27. +1 −1 django_website/templates/base_weblog.html
  28. +1 −1 django_website/templates/blog/entry_archive.html
  29. +1 −1 django_website/templates/blog/entry_archive_day.html
  30. +1 −1 django_website/templates/blog/entry_archive_month.html
  31. +1 −1 django_website/templates/blog/entry_detail.html
  32. +1 −1 django_website/templates/blog/entry_snippet.html
  33. +4 −4 django_website/templates/donate_thanks.html
  34. +5 −5 django_website/templates/flatpages/docs.html
  35. +1 −1 django_website/templates/flatpages/download.html
  36. +13 −13 django_website/templates/homepage.html
  37. +2 −2 media/css/homepage.css
View
3 .gitignore
@@ -1,3 +1,4 @@
*.pyc
*.db
-local_settings.py
+local_settings.py
+
View
17 django_website/blog/admin.py
@@ -1,8 +1,19 @@
from __future__ import absolute_import
from django.contrib import admin
+
from .models import Entry
-admin.site.register(Entry,
- list_display = ('pub_date', 'headline', 'author'),
-)
+class EntryAdmin(admin.ModelAdmin):
+ 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(EntryAdmin, self).formfield_for_dbfield(db_field, **kwargs)
+ if db_field.name == 'body':
+ formfield.widget.attrs['rows'] = 25
+ return formfield
+
+admin.site.register(Entry, EntryAdmin)
View
3 django_website/blog/feeds.py
@@ -1,6 +1,5 @@
from __future__ import absolute_import
-import datetime
from django.contrib.syndication.views import Feed
from .models import Entry
@@ -10,7 +9,7 @@ class WeblogEntryFeed(Feed):
description = "Latest news about Django, the Python Web framework."
def items(self):
- return Entry.objects.filter(pub_date__lte=datetime.datetime.now())[:10]
+ return Entry.objects.published()[:10]
def item_pubdate(self, item):
return item.pub_date
View
43 django_website/blog/migrations/0001_initial.py
@@ -0,0 +1,43 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'Entry'
+ db.create_table('blog_entries', (
+ ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('pub_date', self.gf('django.db.models.fields.DateTimeField')()),
+ ('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)),
+ ('headline', self.gf('django.db.models.fields.CharField')(max_length=200)),
+ ('summary', self.gf('django.db.models.fields.TextField')()),
+ ('body', self.gf('django.db.models.fields.TextField')()),
+ ('author', self.gf('django.db.models.fields.CharField')(max_length=100)),
+ ))
+ db.send_create_signal('blog', ['Entry'])
+
+
+ def backwards(self, orm):
+
+ # Deleting model 'Entry'
+ db.delete_table('blog_entries')
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {})
+ }
+ }
+
+ complete_apps = ['blog']
View
35 django_website/blog/migrations/0002_auto__add_field_entry_is_active.py
@@ -0,0 +1,35 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Entry.is_active'
+ db.add_column('blog_entries', 'is_active', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Entry.is_active'
+ db.delete_column('blog_entries', 'is_active')
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {})
+ }
+ }
+
+ complete_apps = ['blog']
View
30 django_website/blog/migrations/0003_activate_existing_entries.py
@@ -0,0 +1,30 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import DataMigration
+from django.db import models
+
+class Migration(DataMigration):
+
+ def forwards(self, orm):
+ orm['blog.Entry'].objects.update(is_active=True)
+
+ def backwards(self, orm):
+ "Write your backwards methods here."
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {})
+ }
+ }
+
+ complete_apps = ['blog']
View
43 ...ite/blog/migrations/0004_auto__add_field_entry_summary_html__add_field_entry_body_html.py
@@ -0,0 +1,43 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Entry.summary_html'
+ db.add_column('blog_entries', 'summary_html', self.gf('django.db.models.fields.TextField')(default=''), keep_default=False)
+
+ # Adding field 'Entry.body_html'
+ db.add_column('blog_entries', 'body_html', self.gf('django.db.models.fields.TextField')(default=''), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Entry.summary_html'
+ db.delete_column('blog_entries', 'summary_html')
+
+ # Deleting field 'Entry.body_html'
+ db.delete_column('blog_entries', 'body_html')
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'body_html': ('django.db.models.fields.TextField', [], {}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {}),
+ 'summary_html': ('django.db.models.fields.TextField', [], {})
+ }
+ }
+
+ complete_apps = ['blog']
View
35 django_website/blog/migrations/0005_copy_entry_summary_and_body_to_html.py
@@ -0,0 +1,35 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import DataMigration
+from django.db import models
+
+class Migration(DataMigration):
+
+ def forwards(self, orm):
+ for entry in orm['blog.Entry'].objects.all():
+ entry.summary_html = entry.summary
+ entry.body_html = entry.body
+ entry.save()
+
+ def backwards(self, orm):
+ "Write your backwards methods here."
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'body_html': ('django.db.models.fields.TextField', [], {}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {}),
+ 'summary_html': ('django.db.models.fields.TextField', [], {})
+ }
+ }
+
+ complete_apps = ['blog']
View
38 django_website/blog/migrations/0006_auto__add_field_entry_use_raw_html.py
@@ -0,0 +1,38 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Entry.use_raw_html'
+ db.add_column('blog_entries', 'use_raw_html', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Entry.use_raw_html'
+ db.delete_column('blog_entries', 'use_raw_html')
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'body_html': ('django.db.models.fields.TextField', [], {}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {}),
+ 'summary_html': ('django.db.models.fields.TextField', [], {}),
+ 'use_raw_html': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ }
+ }
+
+ complete_apps = ['blog']
View
35 django_website/blog/migrations/0007_existing_entries_are_raw_html.py
@@ -0,0 +1,35 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import DataMigration
+from django.db import models
+
+class Migration(DataMigration):
+
+ def forwards(self, orm):
+ for entry in orm['blog.Entry'].objects.all():
+ entry.use_raw_html = True
+ entry.save()
+
+ def backwards(self, orm):
+ "Write your backwards methods here."
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'body_html': ('django.db.models.fields.TextField', [], {}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {}),
+ 'summary_html': ('django.db.models.fields.TextField', [], {}),
+ 'use_raw_html': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ }
+ }
+
+ complete_apps = ['blog']
View
37 django_website/blog/migrations/0008_auto__del_field_entry_use_raw_html.py
@@ -0,0 +1,37 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Deleting field 'Entry.use_raw_html'
+ db.delete_column('blog_entries', 'use_raw_html')
+
+
+ def backwards(self, orm):
+
+ # Adding field 'Entry.use_raw_html'
+ db.add_column('blog_entries', 'use_raw_html', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'body_html': ('django.db.models.fields.TextField', [], {}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {}),
+ 'summary_html': ('django.db.models.fields.TextField', [], {})
+ }
+ }
+
+ complete_apps = ['blog']
View
38 django_website/blog/migrations/0009_auto__add_field_entry_content_format.py
@@ -0,0 +1,38 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Entry.content_format'
+ db.add_column('blog_entries', 'content_format', self.gf('django.db.models.fields.CharField')(default='html', max_length=50), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Entry.content_format'
+ db.delete_column('blog_entries', 'content_format')
+
+
+ models = {
+ 'blog.entry': {
+ 'Meta': {'ordering': "('-pub_date',)", 'object_name': 'Entry', 'db_table': "'blog_entries'"},
+ 'author': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'body': ('django.db.models.fields.TextField', [], {}),
+ 'body_html': ('django.db.models.fields.TextField', [], {}),
+ 'content_format': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'headline': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'pub_date': ('django.db.models.fields.DateTimeField', [], {}),
+ 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {}),
+ 'summary_html': ('django.db.models.fields.TextField', [], {})
+ }
+ }
+
+ complete_apps = ['blog']
View
0 django_website/blog/migrations/__init__.py
No changes.
View
64 django_website/blog/models.py
@@ -1,19 +1,51 @@
import akismet
import datetime
+from docutils.core import publish_parts
+
from django.conf import settings
from django.db import models
from django.contrib.sites.models import Site
from django.contrib.comments.signals import comment_was_posted
from django.utils.encoding import smart_str
+from django.utils.translation import ugettext_lazy as _
+
+
+
+BLOG_DOCUTILS_SETTINGS = getattr(settings, 'BLOG_DOCUTILS_SETTINGS',
+ { 'doctitle_xform': False,
+ 'initial_header_level': 4,
+ 'id_prefix': 's-',
+ }
+)
+
+
+class EntryManager(models.Manager):
+
+ def published(self):
+ return self.active().filter(pub_date__lte=datetime.datetime.now())
+
+ def active(self):
+ return super(EntryManager, self).get_query_set().filter(is_active=True)
+CONTENT_FORMAT_CHOICES = (
+ (u'reST', u'reStructuredText'),
+ (u'html', u'Raw HTML'),
+)
+
class Entry(models.Model):
- pub_date = models.DateTimeField()
- slug = models.SlugField(unique_for_date='pub_date')
headline = models.CharField(max_length=200)
- summary = models.TextField(help_text="Use raw HTML.")
- body = models.TextField(help_text="Use raw HTML.")
+ 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). Note that administrators (like yourself) are allowed to preview inactive entries whereas the general public aren't."), default=False)
+ pub_date = models.DateTimeField(verbose_name=_("Publication date"), help_text=_("For an entry to be published, it must be active and its publication date must be in the past."))
+ content_format = models.CharField(choices=CONTENT_FORMAT_CHOICES, max_length=50)
+ summary = models.TextField()
+ summary_html = models.TextField()
+ body = models.TextField()
+ body_html = models.TextField()
author = models.CharField(max_length=100)
+ objects = EntryManager()
+
class Meta:
db_table = 'blog_entries'
verbose_name_plural = 'entries'
@@ -25,12 +57,32 @@ def __unicode__(self):
def get_absolute_url(self):
return "/weblog/%s/%s/" % (self.pub_date.strftime("%Y/%b/%d").lower(), self.slug)
-
+
+ def is_published(self):
+ """
+ Return True if the entry is publicly accessible.
+ """
+ return self.is_active and self.pub_date <= datetime.datetime.now()
+ is_published.boolean = True
+
@property
def comments_enabled(self):
delta = datetime.datetime.now() - self.pub_date
return delta.days < 60
+ def save(self, *args, **kwargs):
+ if self.content_format == u'html':
+ self.summary_html = self.summary
+ self.body_html = self.body
+ elif self.content_format == u'reST':
+ self.summary_html = publish_parts(source=smart_str(self.summary),
+ writer_name="html",
+ settings_overrides=BLOG_DOCUTILS_SETTINGS)['fragment']
+ self.body_html = publish_parts(source=smart_str(self.body),
+ writer_name="html",
+ settings_overrides=BLOG_DOCUTILS_SETTINGS)['fragment']
+ super(Entry, self).save(*args, **kwargs)
+
def moderate_comment(sender, comment, request, **kwargs):
ak = akismet.Akismet(
key = settings.AKISMET_API_KEY,
@@ -47,4 +99,4 @@ def moderate_comment(sender, comment, request, **kwargs):
comment.is_public = False
comment.save()
-comment_was_posted.connect(moderate_comment)
+comment_was_posted.connect(moderate_comment)
View
7 django_website/blog/templatetags/weblog.py
@@ -1,20 +1,19 @@
from __future__ import absolute_import
-import datetime
from django import template
from ..models import Entry
register = template.Library()
@register.inclusion_tag('blog/entry_snippet.html')
def render_latest_blog_entries(num):
- entries = Entry.objects.filter(pub_date__lte=datetime.datetime.now())[:num]
+ entries = Entry.objects.published()[:num]
return {
'entries': entries,
}
@register.inclusion_tag('blog/month_links_snippet.html')
def render_month_links():
return {
- 'dates': Entry.objects.dates('pub_date', 'month'),
- }
+ 'dates': Entry.objects.published().dates('pub_date', 'month'),
+ }
View
18 django_website/blog/urls.py
@@ -1,17 +1,13 @@
from __future__ import absolute_import
from django.conf.urls.defaults import *
-from .models import Entry
-info_dict = {
- 'queryset': Entry.objects.all(),
- 'date_field': 'pub_date',
-}
+from . import views
-urlpatterns = patterns('django.views.generic.date_based',
- (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[\w-]+)/$', 'object_detail', dict(info_dict, slug_field='slug')),
- (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/$', 'archive_day', info_dict),
- (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$', 'archive_month', info_dict),
- (r'^(?P<year>\d{4})/$', 'archive_year', info_dict),
- url(r'^/?$', 'archive_index', info_dict, name="blog-index"),
+urlpatterns = patterns('',
+ (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[\w-]+)/$', views.entry_detail),
+ (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/$', views.archive_day),
+ (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$', views.archive_month),
+ (r'^(?P<year>\d{4})/$', views.archive_year),
+ url(r'^/?$', views.archive_index, name="blog-index"),
)
View
38 django_website/blog/views.py
@@ -0,0 +1,38 @@
+import functools
+from django.views.generic import date_based
+
+from .models import Entry
+
+def prepare_arguments(view):
+ @functools.wraps(view)
+ def wrapped(request, *args, **kwargs):
+ kwargs['allow_future'] = request.user.is_staff
+ kwargs['queryset'] = Entry.objects.all() if request.user.is_staff else Entry.objects.published()
+ kwargs['date_field'] = 'pub_date'
+ return view(request, *args, **kwargs)
+ return wrapped
+
+@prepare_arguments
+def entry_detail(request, *args, **kwargs):
+ return date_based.object_detail(request, *args, **kwargs)
+
+@prepare_arguments
+def archive_day(request, *args, **kwargs):
+ return date_based.archive_day(request, *args, **kwargs)
+
+@prepare_arguments
+def archive_month(request, *args, **kwargs):
+ return date_based.archive_month(request, *args, **kwargs)
+
+@prepare_arguments
+def archive_year(request, *args, **kwargs):
+ return date_based.archive_year(request, *args, **kwargs)
+
+@prepare_arguments
+def archive_index(request, *args, **kwargs):
+ return date_based.archive_index(request, *args, **kwargs)
+
+
+
+
+
View
2 django_website/docs/templates/docs/doc.html
@@ -56,7 +56,7 @@ <h2 id="comments">Questions/Feedback</h2>
</li>
<li>
If you notice errors with this documentation, please <a
- href="http://code.djangoproject.com/simpleticket?component=Documentation">
+ href="https://code.djangoproject.com/newticket?component=Documentation">
open a ticket</a> and let us know! Please only use the ticket tracker for
criticisms and improvements on the docs. For tech support, use the
resources above.
View
4 django_website/settings/www.py
@@ -33,8 +33,8 @@
DEBUG = False
PREPEND_WWW = True
CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
- MEDIA_URL = "http://www.djangoproject.com/m/"
- ADMIN_MEDIA_PREFIX = "http://www.djangoproject.com/m/admin/"
+ MEDIA_URL = "https://www.djangoproject.com/m/"
+ ADMIN_MEDIA_PREFIX = "https://www.djangoproject.com/m/admin/"
else:
DEBUG = True
PREPEND_WWW = False
View
2 django_website/sitemaps.py
@@ -34,7 +34,7 @@ class WeblogSitemap(Sitemap):
priority = 0.4
def items(self):
- return Entry.objects.filter(pub_date__lte=datetime.datetime.now())
+ return Entry.objects.published()
# lastmod is not implemented, because weblog pages contain comments.
# We'd rather not look up the date of the latest comment -- not worth the overhead.
View
2 django_website/templates/404.html
@@ -6,7 +6,7 @@
<h2>Page not found</h2>
-<p>Looks like you followed a bad link. If you think it's our fault, please <a href="http://code.djangoproject.com/simpleticket/">let us know</a>.</p>
+<p>Looks like you followed a bad link. If you think it's our fault, please <a href="https://code.djangoproject.com/newticket/">let us know</a>.</p>
<p>Here's a link to the <a href="/">homepage</a>. You know, just in case.</p>
View
2 django_website/templates/410.html
@@ -8,7 +8,7 @@
<p>Sorry, we've removed some of parts of the site that were completely out
of date. In most cases, that content has been moved into
-<a href="http://docs.djangoproject.com/">the new documentation site</a>.</p>
+<a href="https://docs.djangoproject.com/">the new documentation site</a>.</p>
<p>Here's a link to the <a href="/">homepage</a>. You know, just in case.</p>
View
16 django_website/templates/base.html
@@ -18,14 +18,14 @@
<body id="{% block sectionid %}generic{% endblock %}" class="{% block coltype %}default{% endblock %}">
<div id="container">
<div id="header">
- <h1 id="logo"><a href="http://www.djangoproject.com/"><img src="{{ MEDIA_URL }}img/site/hdr_logo.gif" alt="Django" /></a></h1>
+ <h1 id="logo"><a href="https://www.djangoproject.com/"><img src="{{ MEDIA_URL }}img/site/hdr_logo.gif" alt="Django" /></a></h1>
<ul id="nav-global">
- <li id="nav-homepage"><a href="http://www.djangoproject.com/">Home</a></li>
- <li id="nav-download"><a href="http://www.djangoproject.com/download/">Download</a></li>
- <li id="nav-documentation"><a href="http://docs.djangoproject.com/">Documentation</a></li>
- <li id="nav-weblog"><a href="http://www.djangoproject.com/weblog/">Weblog</a></li>
- <li id="nav-community"><a href="http://www.djangoproject.com/community/">Community</a></li>
- <li id="nav-code"><a href="http://code.djangoproject.com/">Code</a></li>
+ <li id="nav-homepage"><a href="https://www.djangoproject.com/">Home</a></li>
+ <li id="nav-download"><a href="https://www.djangoproject.com/download/">Download</a></li>
+ <li id="nav-documentation"><a href="https://docs.djangoproject.com/">Documentation</a></li>
+ <li id="nav-weblog"><a href="https://www.djangoproject.com/weblog/">Weblog</a></li>
+ <li id="nav-community"><a href="https://www.djangoproject.com/community/">Community</a></li>
+ <li id="nav-code"><a href="https://code.djangoproject.com/">Code</a></li>
</ul>
</div>
<!-- END Header -->
@@ -40,7 +40,7 @@ <h1 id="logo"><a href="http://www.djangoproject.com/"><img src="{{ MEDIA_URL }}i
</div>
<!-- END #content -->
<div id="footer">
- <p>&copy; 2005-{% now "Y" %} <a href="http://www.djangoproject.com/foundation/">Django Software Foundation</a> unless otherwise noted. Django is a registered trademark of the Django Software Foundation.
+ <p>&copy; 2005-{% now "Y" %} <a href="https://www.djangoproject.com/foundation/">Django Software Foundation</a> unless otherwise noted. Django is a registered trademark of the Django Software Foundation.
Hosting graciously provided by <a href="http://mediatemple.net/">
<img style="vertical-align: middle; position: relative; top: -1px;" src="{{ MEDIA_URL }}img/site/mt.png" alt="media temple" /></a>
</p>
View
2 django_website/templates/base_code.html
@@ -4,4 +4,4 @@
{% block title %}Code{% endblock %}
-{% block billboard %}<h2><a href="http://code.djangoproject.com/"><img src="{{ MEDIA_URL }}img/site/bbd_code.gif" alt="Django source code" /></a></h2>{% endblock %}
+{% block billboard %}<h2><a href="https://code.djangoproject.com/"><img src="{{ MEDIA_URL }}img/site/bbd_code.gif" alt="Django source code" /></a></h2>{% endblock %}
View
8 django_website/templates/base_community.html
@@ -11,7 +11,7 @@
<ul>
<li><a href="irc://irc.freenode.net/django">#django IRC channel</a> -- chat with other Django users</li>
-<li><a href="http://code.djangoproject.com/simpleticket">Ticket system</a> -- report bugs and make feature requests</li>
+<li><a href="https://code.djangoproject.com/newticket">Ticket system</a> -- report bugs and make feature requests</li>
</ul>
<h2>Mailing lists</h2>
@@ -42,14 +42,14 @@
<ul>
<li><a href="http://groups.google.com/group/django-updates">django-updates mailing list</a> &mdash; get updated for each code and ticket change (for the super-obsessed)</li>
<li>Post comments on any page of this site. <a href="/comments/">View recent comments</a>.</li>
-<li><a href="http://code.djangoproject.com/wiki">Django wiki</a> &mdash; contribute tips and documentation</a></li>
+<li><a href="https://code.djangoproject.com/wiki">Django wiki</a> &mdash; contribute tips and documentation</a></li>
</ul>
<h2>Get help</h2>
<ul>
-<li><strong><a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/faq/">Check our FAQ</a> first</strong>. If you have a basic question that's not answered by the FAQ, <a href="http://code.djangoproject.com/simpleticket">file a ticket</a> to tell us you think it should be in there.</li>
+<li><strong><a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/faq/">Check our FAQ</a> first</strong>. If you have a basic question that's not answered by the FAQ, <a href="https://code.djangoproject.com/newticket">file a ticket</a> to tell us you think it should be in there.</li>
<li><strong>Chat live with other Django users</strong> in the <a href="irc://irc.freenode.net/django">#django IRC channel on irc.freenode.net</a>.</li>
-<li><strong>Ask questions</strong> on the <a href="http://groups-beta.google.com/group/django-users">django-users mailing list</a>.</li>
+<li><strong>Ask questions</strong> on the <a href="http://groups.google.com/group/django-users">django-users mailing list</a>.</li>
</ul>
{% endblock %}
View
4 django_website/templates/base_foundation.html
@@ -9,8 +9,8 @@
<input type="hidden" name="item_name" value="Django Software Foundation">
<input type="hidden" name="item_number" value="donation">
<input type="hidden" name="no_shipping" value="1">
- <input type="hidden" name="return" value="http://www.djangoproject.com/foundation/donate/thanks/">
- <input type="hidden" name="cancel_return" value="http://www.djangoproject.com/foundation/donate/">
+ <input type="hidden" name="return" value="https://www.djangoproject.com/foundation/donate/thanks/">
+ <input type="hidden" name="cancel_return" value="https://www.djangoproject.com/foundation/donate/">
<input type="hidden" name="no_note" value="1">
<input type="hidden" name="currency_code" value="USD">
<input type="hidden" name="tax" value="0">
View
2 django_website/templates/base_weblog.html
@@ -18,6 +18,6 @@
<ul class="linklist">
<li><a href="/rss/weblog/">Latest weblog entries</a></li>
<li><a href="/rss/comments/">Latest comments</a></li>
- <li><a href="http://code.djangoproject.com/timeline?daysback=90&amp;max=50&amp;wiki=on&amp;ticket=on&amp;changeset=on&amp;milestone=on&amp;format=rss">Recent code changes</a></li>
+ <li><a href="https://code.djangoproject.com/timeline?daysback=90&amp;max=50&amp;wiki=on&amp;ticket=on&amp;changeset=on&amp;milestone=on&amp;format=rss">Recent code changes</a></li>
</ul>
{% endblock %}
View
2 django_website/templates/blog/entry_archive.html
@@ -6,7 +6,7 @@
{% for object in latest %}
<h2><a href="{{ object.get_absolute_url }}">{{ object.headline|safe }}</a></h2>
- {{ object.body|safe }}
+ {{ object.body_html|safe }}
<p class="date small">Posted by <strong>{{ object.author }}</strong> on {{ object.pub_date|date:"F j, Y" }}</p>
{% endfor %}
View
2 django_website/templates/blog/entry_archive_day.html
@@ -9,7 +9,7 @@
{% for object in object_list %}
<h2><a href="{{ object.get_absolute_url }}">{{ object.headline|safe }}</a></h2>
<p class="small date">{{ object.pub_date|date:"F j, Y" }}</p>
-{{ object.body|safe }}
+{{ object.body_html|safe }}
{% endfor %}
View
2 django_website/templates/blog/entry_archive_month.html
@@ -9,7 +9,7 @@
{% for object in object_list %}
<h2><a href="{{ object.get_absolute_url }}">{{ object.headline|safe }}</a></h2>
<p class="small date">{{ object.pub_date|date:"F j, Y" }}</p>
-{{ object.body|safe }}
+{{ object.body_html|safe }}
{% endfor %}
View
2 django_website/templates/blog/entry_detail.html
@@ -4,6 +4,6 @@
{% block content %}
<h1>{{ object.headline|safe }}</h1>
-{{ object.body|safe }}
+{{ object.body_html|safe }}
<p class="date small">Posted by <strong>{{ object.author }}</strong> on {{ object.pub_date|date:"F j, Y" }}</p>
{% endblock %}
View
2 django_website/templates/blog/entry_snippet.html
@@ -1,6 +1,6 @@
{% for e in entries %}
<h3><a href="{{ e.get_absolute_url }}">{{ e.headline }}</a></h3>
<p class="date">by <strong>{{ e.author }}</strong> on {{ e.pub_date|date:"M. j, Y" }}</p>
- {{ e.summary|safe }}
+ {{ e.summary_html|safe }}
<p class="more"><a href="{{ e.get_absolute_url }}">Read more</a></p>
{% endfor %}
View
8 django_website/templates/donate_thanks.html
@@ -8,11 +8,11 @@ <h2 class="deck">Thank you for supporting Django. If you like, you can use one o
<p>Copy and paste the source below each image to link to our donation page.</p>
-<h3><a href="http://www.djangoproject.com/foundation/donate/"><img src="http://media.djangoproject.com/img/badges/djangodonated126x54.gif" border="0" alt="I donated to Django" width="126" height="54" /></a></h3>
+<h3><a href="https://www.djangoproject.com/foundation/donate/"><img src="https://www.djangoproject.com/w/img/badges/djangodonated126x54.gif" border="0" alt="I donated to Django" width="126" height="54" /></a></h3>
-<p><textarea rows="3" cols="60" class="codedump"><a href="http://www.djangoproject.com/foundation/donate/"><img src="http://media.djangoproject.com/img/badges/djangodonated126x54.gif" border="0" alt="I donated to Django" width="126" height="54" /></a></textarea><br /><strong>126x54</strong> I donated to Django (green)</p>
+<p><textarea rows="3" cols="60" class="codedump"><a href="https://www.djangoproject.com/foundation/donate/"><img src="https://www.djangoproject.com/m/img/badges/djangodonated126x54.gif" border="0" alt="I donated to Django" width="126" height="54" /></a></textarea><br /><strong>126x54</strong> I donated to Django (green)</p>
-<h3><a href="http://www.djangoproject.com/foundation/donate/"><img src="http://media.djangoproject.com/img/badges/djangodonated126x54_grey.png" border="0" alt="I donated to Django" width="126" height="54" /></a></h3>
+<h3><a href="https://www.djangoproject.com/foundation/donate/"><img src="https://www.djangoproject.com/m/img/badges/djangodonated126x54_grey.png" border="0" alt="I donated to Django" width="126" height="54" /></a></h3>
-<p><textarea rows="3" cols="60" class="codedump"><a href="http://www.djangoproject.com/foundation/donate/"><img src="http://media.djangoproject.com/img/badges/djangodonated126x54_grey.png" border="0" alt="I donated to Django" width="126" height="54" /></a></textarea><br /><strong>126x54</strong> I donated to Django (grey)</p>
+<p><textarea rows="3" cols="60" class="codedump"><a href="https://www.djangoproject.com/foundation/donate/"><img src="https://www.djangoproject.com/m/img/badges/djangodonated126x54_grey.png" border="0" alt="I donated to Django" width="126" height="54" /></a></textarea><br /><strong>126x54</strong> I donated to Django (grey)</p>
{% endblock %}
View
10 django_website/templates/flatpages/docs.html
@@ -21,11 +21,11 @@
<h2>Getting help</h2>
<ul class="toc">
<li><a href="irc://irc.freenode.net/django">#django IRC channel</a></li>
- <li><a href="http://oebfare.com/logger/django/">#django IRC logs</a></li>
- <li><a href="http://groups-beta.google.com/group/django-users">Django-users mailing list</a></li>
- <li><a href="http://groups-beta.google.com/group/django-developers">Django-developers mailing list</a></li>
- <li><a href="http://code.djangoproject.com/simpleticket">Report a bug</a></li>
- <li><a href="/comments/">Recent comments posted to djangoproject.com</a></li>
+ <li><a href="http://botland.oebfare.com/logger/django-dev/">#django IRC logs</a></li>
+ <li><a href="http://groups.google.com/group/django-users">Django-users mailing list</a></li>
+ <li><a href="http://groups.google.com/group/django-developers">Django-developers mailing list</a></li>
+ <li><a href="https://code.djangoproject.com/newticket">Report a bug</a></li>
+ {# <li><a href="/comments/">Recent comments posted to djangoproject.com</a></li> #}
</ul>
{% endblock %}
View
2 django_website/templates/flatpages/download.html
@@ -13,7 +13,7 @@
</ul>
<h2>Which version is better?</h2>
-<p>We improve Django almost every day and are pretty good about keeping the code stable. Thus, using the latest development code is a safe and easy way to get access to new features as they're added. If you choose to follow the development version, keep in mind that there will occasionally be backwards-incompatible changes. You'll want to pay close attention to the <a href="http://code.djangoproject.com/timeline">development timeline</a>.</p>
+<p>We improve Django almost every day and are pretty good about keeping the code stable. Thus, using the latest development code is a safe and easy way to get access to new features as they're added. If you choose to follow the development version, keep in mind that there will occasionally be backwards-incompatible changes. You'll want to pay close attention to the <a href="https://code.djangoproject.com/timeline">development timeline</a>.</p>
<p>If you're just looking for a stable deployment target and don't mind waiting for the next release, you'll want to stick with the latest official release (which will always include detailed notes on any changes you'll need to make while upgrading).</p>
<h2>Previous releases</h2>
View
26 django_website/templates/homepage.html
@@ -11,22 +11,22 @@
<h2 class="deck">Django is a high-level Python Web framework that encourages rapid development and clean, pragmatic design.</h2>
<p>Developed four years ago by a fast-moving online-news operation, Django was designed to handle two challenges: the intensive deadlines of a newsroom and the stringent requirements of the experienced Web developers who wrote it. It lets you build high-performing, elegant Web applications quickly.</p>
<p>Django focuses on automating as much as possible and adhering to the <a href="http://c2.com/cgi/wiki?DontRepeatYourself"><abbr title="Don't Repeat Yourself">DRY</abbr> principle</a>.</p>
-<p>Dive in by <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/overview/">reading the overview &rarr;</a></p>
-<p>When you're ready to code, read the <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/install/">installation guide</a> and <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/tutorial01/">tutorial</a>.</p>
+<p>Dive in by <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/overview/">reading the overview &rarr;</a></p>
+<p>When you're ready to code, read the <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/install/">installation guide</a> and <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/tutorial01/">tutorial</a>.</p>
<div id="content-secondary">
<h2>The Django framework</h2>
<h3>Object-relational mapper</h3>
- <p>Define your <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/db/models/">data models</a> entirely in Python. You get a rich, <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/db/queries/">dynamic database-access API</a> for free &mdash; but you can still write SQL if needed.</p>
+ <p>Define your <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/db/models/">data models</a> entirely in Python. You get a rich, <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/db/queries/">dynamic database-access API</a> for free &mdash; but you can still write SQL if needed.</p>
<h3>Automatic admin interface</h3>
- <p>Save yourself the tedious work of creating interfaces for people to add and update content. <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/tutorial02/">Django does that automatically</a>, and it's production-ready.</p>
+ <p>Save yourself the tedious work of creating interfaces for people to add and update content. <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/tutorial02/">Django does that automatically</a>, and it's production-ready.</p>
<h3>Elegant URL design</h3>
- <p>Design pretty, <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/http/urls/">cruft-free URLs</a> with no framework-specific limitations. Be as flexible as you like.</p>
+ <p>Design pretty, <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/http/urls/">cruft-free URLs</a> with no framework-specific limitations. Be as flexible as you like.</p>
<h3>Template system</h3>
- <p>Use Django's powerful, extensible and designer-friendly <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/templates/">template language</a> to separate design, content and Python code.</p>
+ <p>Use Django's powerful, extensible and designer-friendly <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/templates/">template language</a> to separate design, content and Python code.</p>
<h3>Cache system</h3>
- <p>Hook into memcached or other cache frameworks for <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/cache/">super performance</a> &mdash; caching is as granular as you need.</p>
+ <p>Hook into memcached or other cache frameworks for <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/cache/">super performance</a> &mdash; caching is as granular as you need.</p>
<h3>Internationalization</h3>
- <p>Django has full support for <a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/i18n/">multi-language applications</a>, letting you specify translation strings and providing hooks for language-specific functionality.</p>
+ <p>Django has full support for <a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/topics/i18n/">multi-language applications</a>, letting you specify translation strings and providing hooks for language-specific functionality.</p>
</div>
<!-- END #content-secondary -->
{% endblock %}
@@ -37,12 +37,12 @@ <h2 class="deck">Django is a high-level Python Web framework that encourages rap
<ul class="linklist">
<li class="button-download"><a href="/download/">Latest release: <strong>1.3</strong></a></li>
</ul>
-<p>Open source, <a href="http://code.djangoproject.com/browser/django/trunk/LICENSE">BSD license</a></p>
+<p>Open source, <a href="https://code.djangoproject.com/browser/django/trunk/LICENSE">BSD license</a></p>
<h2>Documentation</h2>
<ul class="linklist">
- <li><a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/install/">Installation guide</a></li>
- <li><a href="http://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/tutorial01/">Tutorial</a></li>
- <li><a href="http://docs.djangoproject.com/">Full index...</a></li>
+ <li><a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/install/">Installation guide</a></li>
+ <li><a href="https://docs.djangoproject.com/en/{{ RECENT_RELEASE }}/intro/tutorial01/">Tutorial</a></li>
+ <li><a href="https://docs.djangoproject.com/">Full index...</a></li>
</ul>
<h2>Sites that use Django</h2>
<dl>
@@ -59,7 +59,7 @@ <h2 class="deck">Django is a high-level Python Web framework that encourages rap
<dt><a href="http://www.torontolife.com/">Toronto Life</a></dt>
<dd>Toronto's city magazine.</dd>
</dl>
-<p><a href="http://code.djangoproject.com/wiki/DjangoPoweredSites">See more sites...</a></p>
+<p><a href="https://code.djangoproject.com/wiki/DjangoPoweredSites">See more sites...</a></p>
{% endblock %}
{% block content-extra %}
View
4 media/css/homepage.css
@@ -1,4 +1,4 @@
@import url(base.css);
-.button-download { display:block; background:url(http://media.djangoproject.com/img/site/download_bg-left.gif) no-repeat; }
-.button-download a { height:18px; color:white; display:block; white-space:nowrap; background:url(http://media.djangoproject.com/img/site/download_bg-right.gif) top right no-repeat; padding:6px 12px; }
+.button-download { display:block; background:url(https://www.djangoproject.com/m/img/site/download_bg-left.gif) no-repeat; }
+.button-download a { height:18px; color:white; display:block; white-space:nowrap; background:url(https://www.djangoproject.com/m/img/site/download_bg-right.gif) top right no-repeat; padding:6px 12px; }

0 comments on commit d1065f5

Please sign in to comment.
Something went wrong with that request. Please try again.