Ticket #2135: urlify.2.diff

File urlify.2.diff, 3.4 KB (added by greg[at]abbas.org, 13 years ago)

oops, uploaded the wrong version the first time

  • django/db/models/base.py

     
    22import django.db.models.manager
    33from django.core import validators
    44from django.core.exceptions import ObjectDoesNotExist
    5 from django.db.models.fields import AutoField, ImageField, FieldDoesNotExist
     5from django.db.models.fields import AutoField, ImageField, FieldDoesNotExist, URLify
    66from django.db.models.fields.related import OneToOneRel, ManyToOneRel
    77from django.db.models.related import RelatedObject
    88from django.db.models.query import orderlist2sql, delete_objects
     
    144144        dispatcher.send(signal=signals.class_prepared, sender=cls)
    145145
    146146    _prepare = classmethod(_prepare)
     147   
     148    def prepopulate(self):
     149        for f in self._meta.fields:
     150            if not f.prepopulate_from: continue
     151            if getattr(self, f.attname): continue
     152            value = [getattr(self, p) for p in f.prepopulate_from]
     153            value = URLify(' '.join(value), f.maxlength)
     154            setattr(self, f.attname, value)
    147155
    148156    def save(self):
    149157        dispatcher.send(signal=signals.pre_save, sender=self.__class__, instance=self)
  • django/db/models/fields/__init__.py

     
    77from django.utils.functional import curry, lazy
    88from django.utils.text import capfirst
    99from django.utils.translation import gettext, gettext_lazy, ngettext
    10 import datetime, os, time
     10import datetime, os, time, re
    1111
    1212class NOT_PROVIDED:
    1313    pass
     
    702702
    703703    def get_manipulator_field_objs(self):
    704704        return [forms.TextField]
     705   
     706def URLify(s, num_chars):
     707    '''
     708    Changes, e.g., "Petty theft" to "petty_theft".
     709    This function is the Python equivalent of the javascript function
     710    of the same name in django/contrib/admin/media/js/urlify.js.
     711    It can get invoked for any field that has a prepopulate_from
     712    attribute defined, although it only really makes sense for
     713    SlugFields.
     714   
     715    NOTE: this implementation corresponds to the Python implementation
     716          of the same algorithm in django/contrib/admin/media/js/urlify.js
     717    '''
     718    # remove all these words from the string before urlifying
     719    removelist = ["a", "an", "as", "at", "before", "but", "by", "for",
     720                  "from", "is", "in", "into", "like", "of", "off", "on",
     721                  "onto", "per", "since", "than", "the", "this", "that",
     722                  "to", "up", "via", "with"]
     723    ignore_words = '|'.join([r for r in removelist])
     724    ignore_words_pat = re.compile('\b('+ignore_words+')\b', re.I)
     725    ignore_chars_pat = re.compile(r'[^-A-Z0-9\s]', re.I)
     726    outside_space_pat = re.compile(r'^\s+|\s+$')
     727    inside_space_pat = re.compile(r'[-\s]+')
     728   
     729    s = ignore_words_pat.sub('', s)  # remove unimportant words
     730    s = ignore_chars_pat.sub('', s)  # remove unneeded chars
     731    s = outside_space_pat.sub('', s) # trim leading/trailing spaces
     732    s = inside_space_pat.sub('-', s) # convert spaces to hyphens
     733    s = s.lower()                    # convert to lowercase
     734    return s[:num_chars]             # trim to first num_chars chars
    705735
    706736class SmallIntegerField(IntegerField):
    707737    def get_manipulator_field_objs(self):
Back to Top