Changeset 591
- Timestamp:
- 08/25/10 16:03:10 (3 years ago)
- Location:
- trunk/opentrials/polyglot
- Files:
-
- 4 modified
-
multilingual_forms.py (modified) (9 diffs)
-
tests/01-models.txt (modified) (3 diffs)
-
tests/02-forms.txt (modified) (4 diffs)
-
tests/test_models.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/opentrials/polyglot/multilingual_forms.py
r574 r591 107 107 display_language = 'en' # FIXME: shouldn't be settings.LANGUAGE_CODE? 108 108 instance = None 109 model= None109 queryset = None 110 110 label_field = None 111 111 … … 114 114 115 115 # Loops in the model choice objects 116 for item in self. model.objects.all():116 for item in self.queryset.all(): 117 117 # If there is a translation... 118 118 try: … … 127 127 128 128 class MultilingualSelect(forms.Select, BaseMultilingualSelect): 129 def __init__(self, display_language=None, model=None, label_field=None, attrs=None):129 def __init__(self, display_language=None, queryset=None, label_field=None, attrs=None): 130 130 self.display_language = display_language or self.display_language 131 self. model = model131 self.queryset = queryset 132 132 self.label_field = label_field 133 133 … … 140 140 141 141 class MultilingualSelectMultiple(forms.SelectMultiple, BaseMultilingualSelect): 142 def __init__(self, display_language=None, model=None, label_field=None, attrs=None):142 def __init__(self, display_language=None, queryset=None, label_field=None, attrs=None): 143 143 self.display_language = display_language or self.display_language 144 self. model = model144 self.queryset = queryset 145 145 self.label_field = label_field 146 146 … … 174 174 class MultilingualModelChoiceField(MultilingualField): 175 175 widget = MultilingualSelect 176 model= None176 queryset = None 177 177 label_field = None 178 178 179 179 def __init__(self, *args, **kwargs): 180 self. model = kwargs.pop('model')180 self.queryset = kwargs.pop('queryset') 181 181 self.label_field = kwargs.pop('label_field') 182 182 … … 187 187 return None 188 188 try: 189 value = self. model.objects.get(pk=value)189 value = self.queryset.get(pk=value) 190 190 except ObjectDoesNotExist: 191 191 raise ValidationError(self.error_messages['invalid_choice']) … … 199 199 return None 200 200 201 return self. model.objects.filter(pk__in=value)201 return self.queryset.filter(pk__in=value) 202 202 203 203 # ---------- FORMS ----------- … … 212 212 self.multilingual_fields = get_multilingual_fields(self._meta.model) 213 213 214 # Gets default second language from arguments, if informed. Default value is None 215 self.default_second_language = kwargs.pop('default_second_language', self.default_second_language) # Optional 216 self.available_languages = kwargs.pop('available_languages', [code.lower() for code in settings.MANAGED_LANGUAGES]) # Mandatory (FIXME, to remove default tuple) 217 self.display_language = kwargs.pop('display_language', self.display_language) 218 214 219 if self.multilingual_fields: 215 # Gets default second language from arguments, if informed. Default value is None216 self.default_second_language = kwargs.pop('default_second_language', self.default_second_language) # Optional217 self.available_languages = kwargs.pop('available_languages', [code.lower() for code in settings.MANAGED_LANGUAGES]) # Mandatory (FIXME, to remove default tuple)218 self.display_language = kwargs.pop('display_language', self.display_language)219 220 220 # Change field widgets replacing common TextInput and Textarea to Multilingual respective ones 221 221 for field_name in self.multilingual_fields: … … 263 263 if isinstance(self.fields[field_name], (MultilingualModelChoiceField,)): 264 264 self.fields[field_name].widget.display_language = self.display_language 265 self.fields[field_name].widget. model = self.fields[field_name].model265 self.fields[field_name].widget.queryset = self.fields[field_name].queryset 266 266 self.fields[field_name].widget.label_field = self.fields[field_name].label_field 267 267 -
trunk/opentrials/polyglot/tests/01-models.txt
r582 r591 45 45 46 46 >>> from django.contrib.flatpages.models import FlatPage 47 >>> from polyglot.tests.test_models import FlatPageTranslation, create_ flatpage_translation_table47 >>> from polyglot.tests.test_models import FlatPageTranslation, create_tables 48 48 49 49 The related class has an attribute 'translations' with a generic relation to our translation subclass 50 50 51 >>> isinstance(FlatPage.translations, generic. GenericRelation)51 >>> isinstance(FlatPage.translations, generic.ReverseGenericRelatedObjectsDescriptor) 52 52 True 53 53 54 54 Create the table in database 55 55 56 >>> create_ flatpage_translation_table()56 >>> create_tables() 57 57 58 58 Test table created with successful … … 63 63 Creating a flat page as the original object to be translated 64 64 65 >>> page1 = FlatPage.objects.create(title='About ', content='This is a page about our institute.')65 >>> page1 = FlatPage.objects.create(title='About Test', content='This is a page about our institute.') 66 66 67 67 Now translating the object "page1" … … 70 70 >>> trans1.language = 'pt-br' 71 71 >>> trans1.content_object = page1 72 >>> trans1.title = 'Sobre '72 >>> trans1.title = 'Sobre o Teste' 73 73 >>> trans1.content = u'Esta é uma página sobre nosso instituto.' 74 74 >>> trans1.save() -
trunk/opentrials/polyglot/tests/02-forms.txt
r585 r591 12 12 ... class Meta: 13 13 ... model = FlatPage 14 ... fields = ('title','content','url','sites') 14 15 15 16 You must inform what languages are available, what is the default second language and what … … 24 25 ... ) 25 26 26 >>> form.fields.keys()27 ['url', 'title', 'content', 'enable_comments', 'template_name', 'registration_required', 'sites']27 >>> set(form.fields.keys()) == set(['title','content','url','sites']) 28 True 28 29 29 >>> form.multilingual_fields30 ['title', 'content']30 >>> set(form.multilingual_fields) == set(['title', 'content']) 31 True 31 32 32 33 The multilingual fields are collected from model class using a function... … … 34 35 >>> from polyglot.models import get_multilingual_fields 35 36 36 >>> get_multilingual_fields(FlatPage)37 ['title', 'content']37 >>> set(get_multilingual_fields(FlatPage)) == set(['title', 'content']) 38 True 38 39 39 40 A multilingual field is associated to a multilingual widget. … … 45 46 True 46 47 48 Test of form saving 49 50 >>> data = { 51 ... 'title': 'This is the original title', 52 ... 'content': 'This is the original content', 53 ... 'url': '/url/', 54 ... 'sites': ['1'], 55 ... } 56 57 >>> form = FlatPageForm( 58 ... data=data, 59 ... default_second_language='pt-br', 60 ... available_languages=('en','pt-br','es'), 61 ... display_language='pt-br', 62 ... ) 63 64 >>> form.is_valid() 65 True 66 67 >>> print form.errors 68 <BLANKLINE> 69 70 >>> page = form.save() 71 72 >>> isinstance(page, FlatPage) 73 True 74 75 >>> page.translations.values('title','content') 76 [{'content': u'', 'title': u''}, {'content': u'', 'title': u''}] 77 78 >>> form = FlatPageForm( 79 ... instance=page, 80 ... default_second_language='pt-br', 81 ... available_languages=('en','pt-br','es'), 82 ... display_language='pt-br', 83 ... ) 84 85 >>> form.fields['title'].widget.render('title', page.title) 86 u'<div class="multilingual"><div class="multilingual-value en"><b>English</b><input type="text" name="title" value="This is the original title" /></div>\n<div class="multilingual-value es"><b>Espa\xf1ol</b><input type="text" name="title|es" /></div>\n<div class="multilingual-value pt-br default-second-language"><b>Portuguese</b><input type="text" name="title|pt-br" /></div></div>' 87 88 >>> form.fields['content'].widget.render('content', page.content) 89 u'<div class="multilingual"><div class="multilingual-value en"><b>English</b><textarea rows="10" cols="40" name="content">This is the original content</textarea></div>\n<div class="multilingual-value es"><b>Espa\xf1ol</b><textarea rows="10" cols="40" name="content|es"></textarea></div>\n<div class="multilingual-value pt-br default-second-language"><b>Portuguese</b><textarea rows="10" cols="40" name="content|pt-br"></textarea></div></div>' 90 47 91 There are multilingual fields you can inform the same value for many available languages. 92 93 >>> data = form.initial 94 >>> data['title|es'] = 'Titulo en español' 95 >>> data['title|pt-br'] = u'Título em português brasileiro' 96 >>> data['content|es'] = u'Conteúdo en español' 97 >>> data['content|pt-br'] = u'Conteúdo em português brasileiro' 98 99 >>> form = FlatPageForm( 100 ... data=data, 101 ... instance=page, 102 ... default_second_language='pt-br', 103 ... available_languages=('en','pt-br','es'), 104 ... display_language='pt-br', 105 ... ) 106 107 >>> form.is_valid() 108 True 109 110 >>> print form.errors 111 <BLANKLINE> 112 113 >>> page = form.save() 114 115 >>> page.translations.values('title','content') 116 [{'content': u'Conte\xc3\xbado en espa\xc3\xb1ol', 'title': u'Titulo en espa\xf1ol'}, {'content': u'Conte\xc3\xbado em portugu\xc3\xaas brasileiro', 'title': u'T\xc3\xadtulo em portugu\xc3\xaas brasileiro'}] 48 117 49 118 There are multilingual fields you can show a select with choices. 50 119 120 >>> from polyglot.multilingual_forms import MultilingualModelChoiceField, MultilingualModelMultipleChoiceField 121 >>> from polyglot.tests.test_models import FlatPageRelative 122 123 >>> page2 = FlatPage.objects.get(title='About Test') 124 125 >>> class FormFlatPageRelative(MultilingualBaseForm): 126 ... class Meta: 127 ... model = FlatPageRelative 128 ... 129 ... subpages = MultilingualModelMultipleChoiceField( 130 ... queryset=FlatPage.objects.filter(title__in=(page.title, page2.title)), 131 ... label_field='title', 132 ... required=False, 133 ... ) 134 ... 135 ... def __init__(self, *args, **kwargs): 136 ... self.base_fields['page'] = MultilingualModelChoiceField( 137 ... queryset=FlatPage.objects.filter(title__in=(page.title, page2.title)), 138 ... label_field='title', 139 ... required=False, 140 ... ) 141 ... 142 ... super(FormFlatPageRelative, self).__init__(*args, **kwargs) 143 144 >>> set(FormFlatPageRelative.base_fields.keys()) == set(['page','subpages','information']) 145 True 146 147 When a form is instantiated, the choices of a multilingual choice field are shown depending 148 on the display language informed. 149 150 >>> data = { 151 ... 'page': unicode(page.pk), 152 ... 'information': 'Nothing important here.', 153 ... } 154 155 >>> form = FormFlatPageRelative( 156 ... data=data, 157 ... default_second_language='pt-br', 158 ... available_languages=('en','pt-br','es'), 159 ... display_language='pt-br', 160 ... ) 161 162 >>> form.fields['page'].widget.render('page', unicode(page.pk)) 163 u'<select name="page">\n<option value="3">Sobre o Teste</option>\n<option value="4" selected="selected">T\xc3\xadtulo em portugu\xc3\xaas brasileiro</option>\n</select>' 164 165 >>> form.fields['subpages'].widget.render('subpages', None) 166 u'<select multiple="multiple" name="subpages">\n<option value="3">Sobre o Teste</option>\n<option value="4">T\xc3\xadtulo em portugu\xc3\xaas brasileiro</option>\n</select>' 167 168 >>> form.is_valid() 169 True 170 171 >>> print form.errors 172 <BLANKLINE> 173 174 >>> relative = form.save() 175 51 176 Multilingual formset is a formset with many multilingual forms. 52 177 -
trunk/opentrials/polyglot/tests/test_models.py
r581 r591 3 3 from django.contrib.flatpages.models import FlatPage 4 4 from django.contrib.contenttypes import generic 5 from django.db.models.sql.query import setup_join_cache 5 6 6 7 from polyglot.models import Translation … … 13 14 content = models.TextField(max_length=2000, blank=True) 14 15 16 FlatPage.translations = generic.GenericRelation(FlatPageTranslation) 17 FlatPage.translations.contribute_to_class(FlatPage, 'translations') 15 18 16 FlatPage.translations = generic.GenericRelation(FlatPageTranslation) 19 class FlatPageRelative(models.Model): 20 page = models.ForeignKey(FlatPage, related_name='page_relatives') 21 information = models.TextField(blank=True) 17 22 18 from django.db.models.sql.query import setup_join_cache19 23 setup_join_cache(FlatPageTranslation) 24 setup_join_cache(FlatPageRelative) 20 25 21 def create_ flatpage_translation_table():26 def create_tables(): 22 27 cursor = connection.cursor() 23 28 style = no_style() 24 29 tables = connection.introspection.table_names() 25 30 seen_models = connection.introspection.installed_models(tables) 31 26 32 sql, references = connection.creation.sql_create_model(FlatPageTranslation, style, seen_models) 33 new_sql, new_ref = connection.creation.sql_create_model(FlatPageRelative, style, seen_models) 34 sql.extend(new_sql); references.update(new_ref) 27 35 28 36 pending_references = {} … … 32 40 sql.extend(connection.creation.sql_for_pending_references(refto, style, pending_references)) 33 41 sql.extend(connection.creation.sql_for_pending_references(FlatPageTranslation, style, pending_references)) 42 sql.extend(connection.creation.sql_for_pending_references(FlatPageRelative, style, pending_references)) 34 43 for statement in sql: 35 44 cursor.execute(statement)
