Django

Code

Changeset 5609

Show
Ignore:
Timestamp:
07/04/07 07:11:04 (1 year ago)
Author:
mtredinnick
Message:

Merged Unicode branch into trunk (r4952:5608). This should be fully
backwards compatible for all practical purposes.

Fixed #2391, #2489, #2996, #3322, #3344, #3370, #3406, #3432, #3454, #3492, #3582, #3690, #3878, #3891, #3937, #4039, #4141, #4227, #4286, #4291, #4300, #4452, #4702

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk

    • Property svnmerge-integrated set to /django/trunk:1-5600
  • django/trunk/AUTHORS

    r5593 r5609  
    114114    Owen Griffiths 
    115115    Espen Grindhaug <http://grindhaug.org/> 
     116    Thomas Güttler <hv@tbz-pariv.de> 
    116117    Brian Harring <ferringb@gmail.com> 
    117118    Brant Harris 
     
    148149    Joseph Kocherhans 
    149150    konrad@gwu.edu 
     151    kurtiss@meetro.com 
    150152    lakin.wecker@gmail.com 
    151153    Nick Lane <nick.lane.au@gmail.com> 
  • django/trunk/django/bin/make-messages.py

    r5084 r5609  
    104104                        thefile = '%s.py' % file 
    105105                    if verbose: sys.stdout.write('processing file %s in %s\n' % (file, dirpath)) 
    106                     cmd = 'xgettext %s -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % ( 
     106                    cmd = 'xgettext %s -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy:1,2 --keyword=ugettext_noop --keyword=ugettext_lazy --keyword=ungettext_lazy:1,2 --from-code UTF-8 -o - "%s"' % ( 
    107107                        os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile)) 
    108108                    (stdin, stdout, stderr) = os.popen3(cmd, 'b') 
  • django/trunk/django/conf/global_settings.py

    r5523 r5609  
    9898DEFAULT_CHARSET = 'utf-8' 
    9999 
     100# Encoding of files read from disk (template and initial SQL files). 
     101FILE_CHARSET = 'utf-8' 
     102 
    100103# E-mail address that error messages come from. 
    101104SERVER_EMAIL = 'root@localhost' 
  • django/trunk/django/contrib/admin/filterspecs.py

    r4486 r5609  
    88 
    99from django.db import models 
     10from django.utils.encoding import smart_unicode, iri_to_uri 
     11from django.utils.translation import ugettext as _ 
    1012import datetime 
    1113 
     
    3840        t = [] 
    3941        if self.has_output(): 
    40             t.append(_('<h3>By %s:</h3>\n<ul>\n') % self.title()) 
     42            t.append(_(u'<h3>By %s:</h3>\n<ul>\n') % self.title()) 
    4143 
    4244            for choice in self.choices(cl): 
    43                 t.append('<li%s><a href="%s">%s</a></li>\n' % \ 
     45                t.append(u'<li%s><a href="%s">%s</a></li>\n' % \ 
    4446                    ((choice['selected'] and ' class="selected"' or ''), 
    45                      choice['query_string']
     47                     iri_to_uri(choice['query_string'])
    4648                     choice['display'])) 
    4749            t.append('</ul>\n\n') 
     
    7173        for val in self.lookup_choices: 
    7274            pk_val = getattr(val, self.field.rel.to._meta.pk.attname) 
    73             yield {'selected': self.lookup_val == str(pk_val), 
     75            yield {'selected': self.lookup_val == smart_unicode(pk_val), 
    7476                   'query_string': cl.get_query_string({self.lookup_kwarg: pk_val}), 
    7577                   'display': val} 
     
    8890               'display': _('All')} 
    8991        for k, v in self.field.choices: 
    90             yield {'selected': str(k) == self.lookup_val, 
     92            yield {'selected': smart_unicode(k) == self.lookup_val, 
    9193                    'query_string': cl.get_query_string({self.lookup_kwarg: k}), 
    9294                    'display': v} 
     
    169171               'display': _('All')} 
    170172        for val in self.lookup_choices: 
    171             val = str(val[self.field.name]) 
     173            val = smart_unicode(val[self.field.name]) 
    172174            yield {'selected': self.lookup_val == val, 
    173175                   'query_string': cl.get_query_string({self.field.name: val}), 
  • django/trunk/django/contrib/admin/media/js/urlify.js

    r4537 r5609  
     1var LATIN_MAP = 
     2{ 
     3    'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç': 
     4    'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I', 
     5    'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': 
     6    'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ý': 'Y', 'Þ': 'TH', 
     7    'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä': 'a', 'å': 'a', 'æ': 
     8    'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', 'ì': 'i', 'í': 'i', 
     9    'î': 'i', 'ï': 'i', 'ð': 'o', 'ñ': 'n', 'ò': 'o', 'ó': 'o', 'ô': 'o', 'õ': 
     10    'o', 'ö': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', 'û': 'u', 'ü': 'u', 'ý': 'y', 
     11    'þ': 'th', 'ÿ': 'y', 
     12} 
     13var LATIN_SYMBOLS_MAP = 
     14{ 
     15    '©':'(c)', 
     16} 
     17var GREEK_MAP = 
     18{ 
     19    'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8', 
     20    'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p', 
     21    'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w', 
     22    'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s', 
     23    'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i', 
     24    'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8', 
     25    'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P', 
     26    'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W', 
     27    'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I', 
     28    'Ϋ':'Y' 
     29} 
     30var TURKISH_MAP = { 
     31    'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U', 
     32    'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G', 
     33} 
     34// var RUSSIAN_MAP = 
     35// { 
     36// } 
     37 
     38var ALL_DOWNCODE_MAPS=new Array() 
     39ALL_DOWNCODE_MAPS[0]=LATIN_MAP 
     40ALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP 
     41ALL_DOWNCODE_MAPS[2]=GREEK_MAP 
     42ALL_DOWNCODE_MAPS[3]=TURKISH_MAP 
     43//ALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP 
     44 
     45var Downcoder = new Object(); 
     46Downcoder.Initialize = function() 
     47{ 
     48    if (Downcoder.map) // already made 
     49        return ; 
     50    Downcoder.map ={} 
     51    Downcoder.chars = '' ; 
     52    for(var i in ALL_DOWNCODE_MAPS) 
     53    { 
     54        var lookup = ALL_DOWNCODE_MAPS[i] 
     55        for (var c in lookup) 
     56        { 
     57            Downcoder.map[c] = lookup[c] ; 
     58            Downcoder.chars += c ; 
     59        } 
     60     } 
     61    Downcoder.regex = new RegExp('[' + Downcoder.chars + ']|[^' + Downcoder.chars + ']+','g') ; 
     62} 
     63 
     64downcode= function( slug ) 
     65{ 
     66    Downcoder.Initialize() ; 
     67    var downcoded ="" 
     68    var pieces = slug.match(Downcoder.regex); 
     69    if(pieces) 
     70    { 
     71        for (var i = 0 ; i < pieces.length ; i++) 
     72        { 
     73            if (pieces[i].length == 1) 
     74            { 
     75                var mapped = Downcoder.map[pieces[i]] ; 
     76                if (mapped != null) 
     77                { 
     78                    downcoded+=mapped; 
     79                    continue ; 
     80                } 
     81            } 
     82            downcoded+=pieces[i]; 
     83        } 
     84    } 
     85    else 
     86    { 
     87        downcoded = slug; 
     88    } 
     89    return downcoded; 
     90} 
     91 
     92 
    193function URLify(s, num_chars) { 
    294    // changes, e.g., "Petty theft" to "petty_theft" 
    395    // remove all these words from the string before urlifying 
     96    s = downcode(s); 
    497    removelist = ["a", "an", "as", "at", "before", "but", "by", "for", "from", 
    598                  "is", "in", "into", "like", "of", "off", "on", "onto", "per", 
     
    8101    r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi'); 
    9102    s = s.replace(r, ''); 
     103    // if downcode doesn't hit, the char will be stripped here 
    10104    s = s.replace(/[^-\w\s]/g, '');  // remove unneeded chars 
    11105    s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces 
     
    14108    return s.substring(0, num_chars);// trim to first num_chars chars 
    15109} 
     110 
  • django/trunk/django/contrib/admin/models.py

    r5519 r5609  
    22from django.contrib.contenttypes.models import ContentType 
    33from django.contrib.auth.models import User 
    4 from django.utils.translation import gettext_lazy as _ 
     4from django.utils.translation import ugettext_lazy as _ 
     5from django.utils.encoding import smart_unicode 
    56 
    67ADDITION = 1 
     
    1011class LogEntryManager(models.Manager): 
    1112    def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''): 
    12         e = self.model(None, None, user_id, content_type_id, str(object_id), object_repr[:200], action_flag, change_message) 
     13        e = self.model(None, None, user_id, content_type_id, smart_unicode(object_id), object_repr[:200], action_flag, change_message) 
    1314        e.save() 
    1415 
     
    2930 
    3031    def __repr__(self): 
    31         return str(self.action_time) 
     32        return smart_unicode(self.action_time) 
    3233 
    3334    def is_addition(self): 
     
    4950        This is relative to the Django admin index page. 
    5051        """ 
    51         return "%s/%s/%s/" % (self.content_type.app_label, self.content_type.model, self.object_id) 
     52        return u"%s/%s/%s/" % (self.content_type.app_label, self.content_type.model, self.object_id) 
  • django/trunk/django/contrib/admin/templates/admin/filter.html

    r3349 r5609  
    44{% for choice in choices %} 
    55    <li{% if choice.selected %} class="selected"{% endif %}> 
    6     <a href="{{ choice.query_string }}">{{ choice.display|escape }}</a></li> 
     6    <a href="{{ choice.query_string|iriencode }}">{{ choice.display|escape }}</a></li> 
    77{% endfor %} 
    88</ul> 
  • django/trunk/django/contrib/admin/templatetags/adminapplist.py

    r5511 r5609  
    11from django import template 
    22from django.db.models import get_models 
     3from django.utils.encoding import force_unicode 
    34 
    45register = template.Library() 
     
    3738                        if True in perms.values(): 
    3839                            model_list.append({ 
    39                                 'name': capfirst(m._meta.verbose_name_plural), 
    40                                 'admin_url': '%s/%s/' % (app_label, m.__name__.lower()), 
     40                                'name': force_unicode(capfirst(m._meta.verbose_name_plural)), 
     41                                'admin_url': u'%s/%s/' % (force_unicode(app_label), m.__name__.lower()), 
    4142                                'perms': perms, 
    4243                            }) 
  • django/trunk/django/contrib/admin/templatetags/admin_list.py

    r5318 r5609  
    77from django.utils.html import escape 
    88from django.utils.text import capfirst 
    9 from django.utils.translation import get_date_formats, get_partial_date_formats 
     9from django.utils.translation import get_date_formats, get_partial_date_formats, ugettext as _ 
     10from django.utils.encoding import smart_unicode, smart_str, force_unicode 
    1011from django.template import Library 
    1112import datetime 
     
    1718def paginator_number(cl,i): 
    1819    if i == DOT: 
    19         return '... ' 
     20        return u'... ' 
    2021    elif i == cl.page_num: 
    21         return '<span class="this-page">%d</span> ' % (i+1) 
     22        return u'<span class="this-page">%d</span> ' % (i+1) 
    2223    else: 
    23         return '<a href="%s"%s>%d</a> ' % (cl.get_query_string({PAGE_VAR: i}), (i == cl.paginator.pages-1 and ' class="end"' or ''), i+1) 
     24        return u'<a href="%s"%s>%d</a> ' % (cl.get_query_string({PAGE_VAR: i}), (i == cl.paginator.pages-1 and ' class="end"' or ''), i+1) 
    2425paginator_number = register.simple_tag(paginator_number) 
    2526 
     
    7677        except models.FieldDoesNotExist: 
    7778            # For non-field list_display values, check for the function 
    78             # attribute "short_description". If that doesn't exist, fall 
    79             # back to the method name. And __str__ is a special-case. 
    80             if field_name == '__str__': 
    81                 header = lookup_opts.verbose_name 
     79            # attribute "short_description". If that doesn't exist, fall back 
     80            # to the method name. And __str__ and __unicode__ are special-cases. 
     81            if field_name == '__unicode__': 
     82                header = force_unicode(lookup_opts.verbose_name) 
     83            elif field_name == '__str__': 
     84                header = smart_str(lookup_opts.verbose_name) 
    8285            else: 
    8386                attr = getattr(cl.model, field_name) # Let AttributeErrors propagate. 
     
    115118def _boolean_icon(field_val): 
    116119    BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'} 
    117     return '<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val) 
     120    return u'<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val) 
    118121 
    119122def items_for_result(cl, result): 
     
    137140                    result_repr = _boolean_icon(attr) 
    138141                else: 
    139                     result_repr = str(attr) 
     142                    result_repr = smart_unicode(attr) 
    140143            except (AttributeError, ObjectDoesNotExist): 
    141144                result_repr = EMPTY_CHANGELIST_VALUE 
     
    180183                result_repr = dict(f.choices).get(field_val, EMPTY_CHANGELIST_VALUE) 
    181184            else: 
    182                 result_repr = escape(str(field_val)
    183         if result_repr == '': 
     185                result_repr = escape(field_val
     186        if force_unicode(result_repr) == '': 
    184187            result_repr = '&nbsp;' 
    185188        # If list_display_links not defined, add the link tag to the first field 
    186         if (first and not cl.lookup_opts.admin.list_display_links) or field_name in cl.lookup_opts.admin.list_display_links:  
     189        if (first and not cl.lookup_opts.admin.list_display_links) or field_name in cl.lookup_opts.admin.list_display_links: 
    187190            table_tag = {True:'th', False:'td'}[first] 
    188191            first = False 
    189192            url = cl.url_for_result(result) 
    190             result_id = str(getattr(result, pk)) # str() is needed in case of 23L (long ints) 
    191             yield ('<%s%s><a href="%s"%s>%s</a></%s>' % \ 
     193            result_id = smart_unicode(getattr(result, pk)) # conversion to string is needed in case of 23L (long ints) 
     194            yield (u'<%s%s><a href="%s"%s>%s</a></%s>' % \ 
    192195                (table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %r); return false;"' % result_id or ''), result_repr, table_tag)) 
    193196        else: 
    194             yield ('<td%s>%s</td>' % (row_class, result_repr)) 
     197            yield (u'<td%s>%s</td>' % (row_class, result_repr)) 
    195198 
    196199def results(cl): 
  • django/trunk/django/contrib/admin/templatetags/admin_modify.py

    r5511 r5609  
    33from django.template import loader 
    44from django.utils.text import capfirst 
     5from django.utils.encoding import force_unicode 
    56from django.db import models 
    67from django.db.models.fields import Field 
     
    1516 
    1617def class_name_to_underscored(name): 
    17     return '_'.join([s.lower() for s in word_re.findall(name)[:-1]]) 
     18    return u'_'.join([s.lower() for s in word_re.findall(name)[:-1]]) 
    1819 
    1920def include_admin_script(script_path): 
     
    3233    if not absolute_url_re.match(script_path): 
    3334        script_path = '%s%s' % (settings.ADMIN_MEDIA_PREFIX, script_path) 
    34     return '<script type="text/javascript" src="%s"></script>' % script_path 
     35    return u'<script type="text/javascript" src="%s"></script>' % script_path 
    3536include_admin_script = register.simple_tag(include_admin_script) 
    3637 
     
    6263            class_names.append('inline') 
    6364        colon = ":" 
    64     class_str = class_names and ' class="%s"' % ' '.join(class_names) or '' 
    65     return '<label for="%s"%s>%s%s</label> ' % (bound_field.element_id, class_str, \