Skip to content
This repository was archived by the owner on Dec 9, 2019. It is now read-only.

I added I18N support to flatblocks #10

Open
wants to merge 15 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,14 @@ local_settings.py
django_flatblocks.egg-info
dist
build
.project
.pydevproject
/parts/*
/eggs/*
/bin/*
/develop-eggs/*
/bin
/parts
/eggs
/develop-eggs
/.settings
4 changes: 3 additions & 1 deletion AUTHORS.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ Extended by
* Peter Baumgardner <http://lincolnloop.com/blog>
* Kevin Fricovsky <http://blog.howiworkdaily.com/>
* Horst Gutmann <http://zerokspot.com/>
* Nate Thelen <http://github.com/natethelen>

Contributions by

Expand All @@ -14,4 +15,5 @@ Contributions by
* James O'Donnell <http://squarefactor.com/words/>
* Mikhail Korobov <http://github.com/kmike>
* Henrik Heimbuerger <http://github.com/hheimbuerger>

* Gabe Harriman <http://github.com/mynameisgabe>

14 changes: 12 additions & 2 deletions flatblocks/admin.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
from django import forms
from django.conf import settings
from django.contrib import admin
from django.utils.translation import ugettext_lazy as _

from flatblocks.models import FlatBlock

class FlatBlockForm(forms.ModelForm):
lang_code = forms.ChoiceField(label=_("Language"), choices=settings.LANGUAGES)

class Meta:
model = FlatBlock

class FlatBlockAdmin(admin.ModelAdmin):
ordering = ['slug', ]
list_display = ('slug', 'header')
form = FlatBlockForm
ordering = ['slug',]
list_display = ('slug', 'header', 'lang_code', 'site')
search_fields = ('slug', 'header', 'content')

admin.site.register(FlatBlock, FlatBlockAdmin)
23 changes: 18 additions & 5 deletions flatblocks/management/commands/createflatblock.py
Original file line number Diff line number Diff line change
@@ -1,19 +1,32 @@
from django.core.management import BaseCommand, CommandError
from django.db import IntegrityError
from django.conf import settings
from django.contrib.sites.models import Site

from flatblocks.models import FlatBlock


class Command(BaseCommand):
help = "Create a new flatblock with the given slug"
help = "Create a new flatblock with the given slug and optional LANGUAGE_CODE and SITE_ID"

def handle(self, *args, **options):
if len(args) != 1:
raise CommandError, "This command requires the slug of the new " \
"flatblock as its first argument"
if len(args) == 0 or len(args) > 3:
raise CommandError, "arguments: slug [LANGUAGE_CODE] [SITE_ID]"

slug = args[0]

if len(args) >= 2:
lang = args[1]
else:
lang = settings.LANGUAGE_CODE

if len(args) >= 3:
site = Site.objects.get(id=args[2])
else:
site = Site.objects.get_current()

block = FlatBlock(header="[%s]"%slug, content="Empty flatblock",
slug=slug)
slug=slug, lang_code=lang, site=site)
try:
block.save()
except IntegrityError, e:
Expand Down
23 changes: 18 additions & 5 deletions flatblocks/management/commands/deleteflatblock.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,31 @@
from django.core.management import BaseCommand, CommandError
from django.conf import settings
from django.contrib.sites.models import Site

from flatblocks.models import FlatBlock


class Command(BaseCommand):
help = "Delete a flatblock with the given slug"
help = "Delete a flatblock with the given slug and optional LANGUAGE_CODE and SITE_ID"

def handle(self, *args, **options):
if len(args) != 1:
raise CommandError, "This command requires the slug of the " \
"flatblock as its first argument"
if len(args) == 0 or len(args) > 3:
raise CommandError, "arguments: slug [LANGUAGE_CODE] [SITE_ID]"

slug = args[0]

if len(args) >= 2:
lang = args[1]
else:
lang = settings.LANGUAGE_CODE

if len(args) >= 3:
site = Site.objects.get(id=args[2])
else:
site = Site.objects.get_current()

try:
FlatBlock.objects.get(slug=slug).delete()
FlatBlock.objects.get(slug=slug, lang_code=lang, site=site).delete()
except FlatBlock.DoesNotExist, e:
raise CommandError, "The requested flatblock doesn't exist"

Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# -*- coding: 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 'FlatBlock.lang_code'
db.add_column('flatblocks_flatblock', 'lang_code',
self.gf('django.db.models.fields.CharField')(default='en-us', max_length=5, blank=True),
keep_default=False)

# Adding field 'FlatBlock.site'
db.add_column('flatblocks_flatblock', 'site',
self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sites.Site'], null=True, blank=True),
keep_default=False)

# Adding unique constraint on 'FlatBlock', fields ['lang_code', 'slug', 'site']
db.create_unique('flatblocks_flatblock', ['lang_code', 'slug', 'site_id'])

def backwards(self, orm):
# Removing unique constraint on 'FlatBlock', fields ['lang_code', 'slug', 'site']
db.delete_unique('flatblocks_flatblock', ['lang_code', 'slug', 'site_id'])

# Deleting field 'FlatBlock.lang_code'
db.delete_column('flatblocks_flatblock', 'lang_code')

# Deleting field 'FlatBlock.site'
db.delete_column('flatblocks_flatblock', 'site_id')

models = {
'flatblocks.flatblock': {
'Meta': {'unique_together': "(('slug', 'lang_code', 'site'),)", 'object_name': 'FlatBlock'},
'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'header': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'lang_code': ('django.db.models.fields.CharField', [], {'default': "'en-us'", 'max_length': '5', 'blank': 'True'}),
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']", 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'})
},
'sites.site': {
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
}
}

complete_apps = ['flatblocks']
36 changes: 36 additions & 0 deletions flatblocks/migrations/0003_auto__del_unique_flatblock_slug.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
# -*- coding: 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):
# Removing unique constraint on 'FlatBlock', fields ['slug']
db.delete_unique('flatblocks_flatblock', ['slug'])

def backwards(self, orm):
# Adding unique constraint on 'FlatBlock', fields ['slug']
db.create_unique('flatblocks_flatblock', ['slug'])

models = {
'flatblocks.flatblock': {
'Meta': {'unique_together': "(('slug', 'lang_code', 'site'),)", 'object_name': 'FlatBlock'},
'content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'header': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'lang_code': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '5', 'blank': 'True'}),
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']", 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.CharField', [], {'max_length': '255'})
},
'sites.site': {
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
}
}

complete_apps = ['flatblocks']
16 changes: 10 additions & 6 deletions flatblocks/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.core.cache import cache
from django.contrib.sites.models import Site
from django.conf import settings

from flatblocks.settings import CACHE_PREFIX

Expand All @@ -11,23 +13,25 @@ class FlatBlock(models.Model):
basically a piece of content with a given name (slug) and an optional
title (header) which you can, for example, use in a sidebar of a website.
"""
slug = models.CharField(max_length=255, unique=True,
slug = models.CharField(max_length=255,
verbose_name=_('Slug'),
help_text=_("A unique name used for reference in the templates"))
header = models.CharField(blank=True, null=True, max_length=255,
verbose_name=_('Header'),
help_text=_("An optional header for this content"))
content = models.TextField(verbose_name=_('Content'), blank=True,
null=True)
content = models.TextField(verbose_name=_('Content'), blank=True, null=True)
lang_code = models.CharField(verbose_name=_(u"language"), help_text="Language code, if this chunk is translated. Same format as LANGUAGE_CODE setting, e.g. sv-se, or de-de, etc.", blank=True, max_length=5, default=settings.LANGUAGE_CODE)
site = models.ForeignKey(Site, null=True, blank=True, verbose_name=_('site'))

def __unicode__(self):
return u"%s" % (self.slug,)

return u"%s, %s, %s" % (self.slug,str(self.site),self.lang_code)
def save(self, *args, **kwargs):
super(FlatBlock, self).save(*args, **kwargs)
# Now also invalidate the cache used in the templatetag
cache.delete('%s%s' % (CACHE_PREFIX, self.slug, ))
cache.delete('%s%s_%s_%s' % (CACHE_PREFIX, self.slug, self.lang_code, str(self.site)))

class Meta:
verbose_name = _('Flat block')
verbose_name_plural = _('Flat blocks')
unique_together = (('slug', 'lang_code', 'site'),)
2 changes: 2 additions & 0 deletions flatblocks/settings.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from django.conf import settings

MIDDLEWARE_CLASSES = getattr(settings, 'MIDDLEWARE_CLASSES', {})
LANGUAGE_CODE = getattr(settings, 'LANGUAGE_CODE', 'en')
CACHE_PREFIX = getattr(settings, 'FLATBLOCKS_CACHE_PREFIX', 'flatblocks_')
AUTOCREATE_STATIC_BLOCKS = getattr(settings,
'FLATBLOCKS_AUTOCREATE_STATIC_BLOCKS', False)
1 change: 1 addition & 0 deletions flatblocks/templates/flatblocks/edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ <h1>Edit "{{ flatblock.slug }}"</h1>

<form method="post">
{{ form.as_p }}
{% csrf_token %}
<input type="submit" value="Save" />
</form>
6 changes: 3 additions & 3 deletions flatblocks/templates/flatblocks/flatblock.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<div class="flatblock block-{{ flatblock.slug }}">
{% if flatblock.header %}
<h2 class="title">{{ flatblock.header }}</h2>
<h2>{{ flatblock.header }}</h2>
{% endif %}
<div class="content">{{ flatblock.content|safe }}</div>
</div>
{{ flatblock.content|safe }}
</div>
27 changes: 23 additions & 4 deletions flatblocks/templatetags/flatblock_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
from django.template import loader
from django.db import models
from django.core.cache import cache
from django.contrib.sites.models import Site
from django.utils.translation import get_language

from flatblocks import settings

Expand Down Expand Up @@ -149,22 +151,39 @@ def render(self, context):
new_ctx.update(context)
try:
flatblock = None
lang = settings.LANGUAGE_CODE

if 'django.middleware.locale.LocaleMiddleware' not in settings.MIDDLEWARE_CLASSES:
logger.warning("For i18n support in flatblocks you must have django.middleware.locale.LocaleMiddleware in your MIDDLEWARE_CLASSES")
else:
lang = get_language()

site = Site.objects.get_current() # Django caches get_current()
cache_key = '%s%s_%s_%s' % (settings.CACHE_PREFIX, real_slug, lang, str(site))

if self.cache_time != 0:
cache_key = settings.CACHE_PREFIX + real_slug
flatblock = cache.get(cache_key)

if flatblock is None:

# if flatblock's slug is hard-coded in template then it is
# safe and convenient to auto-create block if it doesn't exist.
# This behaviour can be configured using the
# This behavior can be configured using the
# FLATBLOCKS_AUTOCREATE_STATIC_BLOCKS setting

if self.is_variable or not settings.AUTOCREATE_STATIC_BLOCKS:
flatblock = FlatBlock.objects.get(slug=real_slug)
try:
flatblock = FlatBlock.objects.get(slug=real_slug, lang_code=lang, site=site)

# this is a bit ugly, but it will allow us to fall back on un-sited flatblock
except:
flatblock = FlatBlock.objects.get(slug=real_slug, lang_code=lang)
else:
flatblock, _ = FlatBlock.objects.get_or_create(
slug=real_slug,
slug=real_slug, lang_code=lang, site=site,
defaults = {'content': real_slug}
)

if self.cache_time != 0:
if self.cache_time is None or self.cache_time == 'None':
logger.debug("Caching %s for the cache's default timeout"
Expand Down
10 changes: 7 additions & 3 deletions flatblocks/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from django.core.cache import cache
from django.contrib.auth.models import User
from django import db
from django.contrib.sites.models import Site


from flatblocks.models import FlatBlock
from flatblocks import settings
Expand All @@ -15,7 +17,8 @@ def setUp(self):
self.testblock = FlatBlock.objects.create(
slug='block',
header='HEADER',
content='CONTENT'
content='CONTENT',
site=Site.objects.get_current(),
)
self.admin = User.objects.create_superuser('admin', 'admin@localhost', 'adminpwd')

Expand All @@ -35,7 +38,7 @@ def testCacheReset(self):
"""
tpl = template.Template('{% load flatblock_tags %}{% flatblock "block" 60 %}')
tpl.render(template.Context({}))
name = '%sblock' % settings.CACHE_PREFIX
name = '%sblock_%s_%s' % (settings.CACHE_PREFIX,settings.LANGUAGE_CODE,str(Site.objects.get_current()))
self.assertNotEquals(None, cache.get(name))
block = FlatBlock.objects.get(slug='block')
block.header = 'UPDATED'
Expand All @@ -55,7 +58,8 @@ def setUp(self):
self.testblock = FlatBlock.objects.create(
slug='block',
header='HEADER',
content='CONTENT'
content='CONTENT',
site=Site.objects.get_current(),
)

def testLoadingTaglib(self):
Expand Down
3 changes: 2 additions & 1 deletion flatblocks/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ def my_perm_check(request, flatblock):
instance = form.save(commit=False)
instance.slug = flatblock.slug
instance.save()
del request.session[session_key]
if session_key in request.session:
del request.session[session_key]
redirect_to = success_url and success_url or origin
return HttpResponseRedirect(redirect_to)
else:
Expand Down
Loading