i18n sponsor fields

Feedback from PyConJP development

```
commit 5973e32ebdc231b209b5c058664e8b2b4a1dbc54
Author: MURAOKA Yusuke <yusuke@jbking.org>
Date:   Mon Mar 31 15:35:40 2014 +0900

    introduce Benefit.content_type which is used to display localized
    text
```

Signed-off-by: Hiroshi Miura <miurahr@linux.com>
This commit is contained in:
Hiroshi Miura 2015-06-21 14:48:17 +09:00
parent 91ae3de6df
commit b50974263c
2 changed files with 57 additions and 3 deletions

View file

@ -1,5 +1,6 @@
import datetime import datetime
from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db import models from django.db import models
@ -144,9 +145,17 @@ post_save.connect(_check_level_change, sender=Sponsor)
BENEFIT_TYPE_CHOICES = [ BENEFIT_TYPE_CHOICES = [
("text", "Text"), ("text", "Text"),
("richtext", "Rich Text"),
("file", "File"), ("file", "File"),
("weblogo", "Web Logo"), ("weblogo", "Web Logo"),
("simple", "Simple") ("simple", "Simple"),
("option", "Option")
]
CONTENT_TYPE_CHOICES = [
("simple", "Simple"),
] + [
("listing_text_%s" % lang, "Listing Text (%s)" % label) for lang, label in settings.LANGUAGES
] ]
@ -154,8 +163,10 @@ class Benefit(models.Model):
name = models.CharField(_("name"), max_length=100) name = models.CharField(_("name"), max_length=100)
description = models.TextField(_("description"), blank=True) description = models.TextField(_("description"), blank=True)
type = models.CharField(_("type"), choices=BENEFIT_TYPE_CHOICES, max_length=10, type = models.CharField(_("type"), choices=BENEFIT_TYPE_CHOICES,
default="simple") max_length=10, default="simple")
content_type = models.CharField(_("content type"), choices=CONTENT_TYPE_CHOICES,
max_length=20, default="simple")
def __unicode__(self): def __unicode__(self):
return self.name return self.name

View file

@ -1,4 +1,5 @@
from django import template from django import template
from django.template.defaultfilters import linebreaks, urlize
from symposion.conference.models import current_conference from symposion.conference.models import current_conference
from symposion.sponsorship.models import Sponsor, SponsorLevel from symposion.sponsorship.models import Sponsor, SponsorLevel
@ -75,3 +76,45 @@ def sponsor_levels(parser, token):
{% sponsor_levels as levels %} {% sponsor_levels as levels %}
""" """
return SponsorLevelNode.handle_token(parser, token) return SponsorLevelNode.handle_token(parser, token)
class LocalizedTextNode(template.Node):
@classmethod
def handle_token(cls, parser, token):
bits = token.split_contents()
if len(bits) == 3:
return cls(bits[2], bits[1][1:-1])
elif len(bits) == 5 and bits[-2] == "as":
return cls(bits[2], bits[1][1:-1], bits[4])
else:
raise template.TemplateSyntaxError("%r takes 'as var'" % bits[0])
def __init__(self, sponsor, content_type, context_var=None):
self.sponsor_var = template.Variable(sponsor)
self.content_type = content_type
self.content_var = context_var
def render(self, context):
s = ''
try:
sponsor = self.sponsor_var.resolve(context)
content_type = '%s_%s' % (self.content_type, context['request'].LANGUAGE_CODE)
texts = sponsor.sponsor_benefits.filter(benefit__content_type=content_type)
if texts.count() > 0:
s = linebreaks(urlize(texts[0].text, autoescape=True))
if self.content_var:
context[self.content_var] = s
s = ''
except:
pass
return s
@register.tag
def localized_text(parser, token):
"""
{% localized_text "content_type" sponsor %}
{% localized_text "content_type" sponsor as localized_text %}
"""
return LocalizedTextNode.handle_token(parser, token)