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:
		
							parent
							
								
									91ae3de6df
								
							
						
					
					
						commit
						b50974263c
					
				
					 2 changed files with 57 additions and 3 deletions
				
			
		|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Hiroshi Miura
						Hiroshi Miura