Changeset 591

Show
Ignore:
Timestamp:
08/25/10 16:03:10 (3 years ago)
Author:
jose.brandao
Message:

Doctests on application polyglot

Location:
trunk/opentrials/polyglot
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/opentrials/polyglot/multilingual_forms.py

    r574 r591  
    107107    display_language = 'en' # FIXME: shouldn't be settings.LANGUAGE_CODE? 
    108108    instance = None 
    109     model = None 
     109    queryset = None 
    110110    label_field = None 
    111111 
     
    114114 
    115115        # Loops in the model choice objects 
    116         for item in self.model.objects.all(): 
     116        for item in self.queryset.all(): 
    117117            # If there is a translation... 
    118118            try: 
     
    127127 
    128128class 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): 
    130130        self.display_language = display_language or self.display_language 
    131         self.model = model 
     131        self.queryset = queryset 
    132132        self.label_field = label_field 
    133133 
     
    140140 
    141141class 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): 
    143143        self.display_language = display_language or self.display_language 
    144         self.model = model 
     144        self.queryset = queryset 
    145145        self.label_field = label_field 
    146146 
     
    174174class MultilingualModelChoiceField(MultilingualField): 
    175175    widget = MultilingualSelect 
    176     model = None 
     176    queryset = None 
    177177    label_field = None 
    178178 
    179179    def __init__(self, *args, **kwargs): 
    180         self.model = kwargs.pop('model') 
     180        self.queryset = kwargs.pop('queryset') 
    181181        self.label_field = kwargs.pop('label_field') 
    182182 
     
    187187            return None 
    188188        try: 
    189             value = self.model.objects.get(pk=value) 
     189            value = self.queryset.get(pk=value) 
    190190        except ObjectDoesNotExist: 
    191191            raise ValidationError(self.error_messages['invalid_choice']) 
     
    199199            return None 
    200200 
    201         return self.model.objects.filter(pk__in=value) 
     201        return self.queryset.filter(pk__in=value) 
    202202 
    203203# ---------- FORMS ----------- 
     
    212212        self.multilingual_fields = get_multilingual_fields(self._meta.model) 
    213213 
     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 
    214219        if self.multilingual_fields: 
    215             # Gets default second language from arguments, if informed. Default value is None 
    216             self.default_second_language = kwargs.pop('default_second_language', self.default_second_language) # Optional 
    217             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  
    220220            # Change field widgets replacing common TextInput and Textarea to Multilingual respective ones 
    221221            for field_name in self.multilingual_fields: 
     
    263263            if isinstance(self.fields[field_name], (MultilingualModelChoiceField,)): 
    264264                self.fields[field_name].widget.display_language = self.display_language 
    265                 self.fields[field_name].widget.model = self.fields[field_name].model 
     265                self.fields[field_name].widget.queryset = self.fields[field_name].queryset 
    266266                self.fields[field_name].widget.label_field = self.fields[field_name].label_field 
    267267 
  • trunk/opentrials/polyglot/tests/01-models.txt

    r582 r591  
    4545 
    4646    >>> from django.contrib.flatpages.models import FlatPage 
    47     >>> from polyglot.tests.test_models import FlatPageTranslation, create_flatpage_translation_table 
     47    >>> from polyglot.tests.test_models import FlatPageTranslation, create_tables 
    4848 
    4949The related class has an attribute 'translations' with a generic relation to our translation subclass 
    5050 
    51     >>> isinstance(FlatPage.translations, generic.GenericRelation) 
     51    >>> isinstance(FlatPage.translations, generic.ReverseGenericRelatedObjectsDescriptor) 
    5252    True 
    5353 
    5454Create the table in database 
    5555 
    56     >>> create_flatpage_translation_table() 
     56    >>> create_tables() 
    5757 
    5858Test table created with successful 
     
    6363Creating a flat page as the original object to be translated 
    6464 
    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.') 
    6666 
    6767Now translating the object "page1" 
     
    7070    >>> trans1.language = 'pt-br' 
    7171    >>> trans1.content_object = page1 
    72     >>> trans1.title = 'Sobre' 
     72    >>> trans1.title = 'Sobre o Teste' 
    7373    >>> trans1.content = u'Esta é uma página sobre nosso instituto.' 
    7474    >>> trans1.save() 
  • trunk/opentrials/polyglot/tests/02-forms.txt

    r585 r591  
    1212    ...     class Meta: 
    1313    ...         model = FlatPage 
     14    ...         fields = ('title','content','url','sites') 
    1415 
    1516You must inform what languages are available, what is the default second language and what 
     
    2425    ... ) 
    2526 
    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 
    2829 
    29     >>> form.multilingual_fields 
    30     ['title', 'content'] 
     30    >>> set(form.multilingual_fields) == set(['title', 'content']) 
     31    True 
    3132 
    3233The multilingual fields are collected from model class using a function... 
     
    3435    >>> from polyglot.models import get_multilingual_fields 
    3536 
    36     >>> get_multilingual_fields(FlatPage) 
    37     ['title', 'content'] 
     37    >>> set(get_multilingual_fields(FlatPage)) == set(['title', 'content']) 
     38    True 
    3839 
    3940A multilingual field is associated to a multilingual widget. 
     
    4546    True 
    4647 
     48Test 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 
    4791There 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'}] 
    48117 
    49118There are multilingual fields you can show a select with choices. 
    50119 
     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 
     147When a form is instantiated, the choices of a multilingual choice field are shown depending 
     148on 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 
    51176Multilingual formset is a formset with many multilingual forms. 
    52177 
  • trunk/opentrials/polyglot/tests/test_models.py

    r581 r591  
    33from django.contrib.flatpages.models import FlatPage 
    44from django.contrib.contenttypes import generic 
     5from django.db.models.sql.query import setup_join_cache 
    56 
    67from polyglot.models import Translation 
     
    1314    content = models.TextField(max_length=2000, blank=True) 
    1415 
     16FlatPage.translations = generic.GenericRelation(FlatPageTranslation) 
     17FlatPage.translations.contribute_to_class(FlatPage, 'translations') 
    1518 
    16 FlatPage.translations = generic.GenericRelation(FlatPageTranslation) 
     19class FlatPageRelative(models.Model): 
     20    page = models.ForeignKey(FlatPage, related_name='page_relatives') 
     21    information = models.TextField(blank=True) 
    1722 
    18 from django.db.models.sql.query import setup_join_cache 
    1923setup_join_cache(FlatPageTranslation) 
     24setup_join_cache(FlatPageRelative) 
    2025 
    21 def create_flatpage_translation_table(): 
     26def create_tables(): 
    2227    cursor = connection.cursor() 
    2328    style = no_style() 
    2429    tables = connection.introspection.table_names() 
    2530    seen_models = connection.introspection.installed_models(tables) 
     31 
    2632    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) 
    2735 
    2836    pending_references = {} 
     
    3240            sql.extend(connection.creation.sql_for_pending_references(refto, style, pending_references)) 
    3341    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)) 
    3443    for statement in sql: 
    3544        cursor.execute(statement)