Django

Code

Changeset 6638

Show
Ignore:
Timestamp:
11/02/07 21:16:27 (10 months ago)
Author:
mtredinnick
Message:

queryset-refactor: Merged from trunk up to [6635].

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/branches/queryset-refactor/django/contrib/sessions/middleware.py

    r6597 r6638  
     1import time 
     2 
    13from django.conf import settings 
    24from django.utils.cache import patch_vary_headers 
    3 from email.Utils import formatdate 
    4 import datetime 
    5 import time 
     5from django.utils.http import cookie_date 
    66 
    77TEST_COOKIE_NAME = 'testcookie' 
     
    1111 
    1212    def process_request(self, request): 
    13       engine = __import__(settings.SESSION_ENGINE, {}, {}, ['']) 
    14       request.session = engine.SessionStore(request.COOKIES.get(settings.SESSION_COOKIE_NAME, None)) 
     13        engine = __import__(settings.SESSION_ENGINE, {}, {}, ['']) 
     14        session_key = request.COOKIES.get(settings.SESSION_COOKIE_NAME, None) 
     15        request.session = engine.SessionStore(session_key) 
    1516 
    1617    def process_response(self, request, response): 
     
    3132                else: 
    3233                    max_age = settings.SESSION_COOKIE_AGE 
    33                     rfcdate = formatdate(time.time() + settings.SESSION_COOKIE_AGE) 
    34  
    35                     # Fixed length date must have '-' separation in the format 
    36                     # DD-MMM-YYYY for compliance with Netscape cookie standard 
    37                     expires = datetime.datetime.strftime(datetime.datetime.utcnow() + \ 
    38                               datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT") 
    39  
     34                    expires_time = time.time() + settings.SESSION_COOKIE_AGE 
     35                    expires = cookie_date(expires_time) 
    4036                # Save the seesion data and refresh the client cookie. 
    4137                request.session.save() 
  • django/branches/queryset-refactor/django/core/servers/basehttp.py

    r5721 r6638  
    1010from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
    1111from types import ListType, StringType 
    12 from email.Utils import formatdate 
    1312import mimetypes 
    1413import os 
    1514import re 
    1615import sys 
    17 import time 
    1816import urllib 
     17 
     18from django.utils.http import http_date 
    1919 
    2020__version__ = "0.1" 
     
    377377                if 'Date' not in self.headers: 
    378378                    self._write( 
    379                         'Date: %s\r\n' % (formatdate()[:26] + "GMT"
     379                        'Date: %s\r\n' % http_date(
    380380                    ) 
    381381                if self.server_software and 'Server' not in self.headers: 
  • django/branches/queryset-refactor/django/middleware/http.py

    r6466 r6638  
    1 from email.Utils import formatdate 
     1from django.utils.http import http_date 
    22 
    33class ConditionalGetMiddleware(object): 
     
    1212    """ 
    1313    def process_response(self, request, response): 
    14         response['Date'] = formatdate()[:26] + "GMT" 
     14        response['Date'] = http_date() 
    1515        if not response.has_header('Content-Length'): 
    1616            response['Content-Length'] = str(len(response.content)) 
     
    2424 
    2525        if response.has_header('Last-Modified'): 
    26             last_mod = response['Last-Modified'] 
    2726            if_modified_since = request.META.get('HTTP_IF_MODIFIED_SINCE', None) 
    2827            if if_modified_since == response['Last-Modified']: 
  • django/branches/queryset-refactor/django/newforms/models.py

    r5819 r6638  
    77from django.utils.encoding import smart_unicode 
    88 
    9  
    109from util import ValidationError 
    1110from forms import BaseForm, SortedDictFromList 
     
    1817) 
    1918 
    20 def save_instance(form, instance, fields=None, fail_message='saved', commit=True): 
     19def save_instance(form, instance, fields=None, fail_message='saved', 
     20                  commit=True): 
    2121    """ 
    2222    Saves bound Form ``form``'s cleaned_data into model instance ``instance``. 
     
    2828    opts = instance.__class__._meta 
    2929    if form.errors: 
    30         raise ValueError("The %s could not be %s because the data didn't validate." % (opts.object_name, fail_message)) 
     30        raise ValueError("The %s could not be %s because the data didn't" 
     31                         " validate." % (opts.object_name, fail_message)) 
    3132    cleaned_data = form.cleaned_data 
    3233    for f in opts.fields: 
    33         if not f.editable or isinstance(f, models.AutoField) or not f.name in cleaned_data: 
     34        if not f.editable or isinstance(f, models.AutoField) \ 
     35                or not f.name in cleaned_data: 
    3436            continue 
    3537        if fields and f.name not in fields: 
    3638            continue 
    37         f.save_form_data(instance, cleaned_data[f.name])         
    38     # Wrap up the saving of m2m data as a function 
     39        f.save_form_data(instance, cleaned_data[f.name]) 
     40    # Wrap up the saving of m2m data as a function. 
    3941    def save_m2m(): 
    4042        opts = instance.__class__._meta 
     
    4648                f.save_form_data(instance, cleaned_data[f.name]) 
    4749    if commit: 
    48         # If we are committing, save the instance and the m2m data immediately 
     50        # If we are committing, save the instance and the m2m data immediately. 
    4951        instance.save() 
    5052        save_m2m() 
    5153    else: 
    52         # We're not committing. Add a method to the form to allow deferred  
    53         # saving of m2m data 
     54        # We're not committing. Add a method to the form to allow deferred 
     55        # saving of m2m data. 
    5456        form.save_m2m = save_m2m 
    5557    return instance 
    5658 
    5759def make_model_save(model, fields, fail_message): 
    58     "Returns the save() method for a Form.
     60    """Returns the save() method for a Form.""
    5961    def save(self, commit=True): 
    6062        return save_instance(self, model(), fields, fail_message, commit) 
    6163    return save 
    62      
     64 
    6365def make_instance_save(instance, fields, fail_message): 
    64     "Returns the save() method for a Form.
     66    """Returns the save() method for a Form.""
    6567    def save(self, commit=True): 
    6668        return save_instance(self, instance, fields, fail_message, commit) 
    6769    return save 
    6870 
    69 def form_for_model(model, form=BaseForm, fields=None, formfield_callback=lambda f: f.formfield()): 
     71def form_for_model(model, form=BaseForm, fields=None, 
     72                   formfield_callback=lambda f: f.formfield()): 
    7073    """ 
    7174    Returns a Form class for the given Django model class. 
     
    8891            field_list.append((f.name, formfield)) 
    8992    base_fields = SortedDictFromList(field_list) 
    90     return type(opts.object_name + 'Form', (form,),  
    91         {'base_fields': base_fields, '_model': model, 'save': make_model_save(model, fields, 'created')}) 
    92  
    93 def form_for_instance(instance, form=BaseForm, fields=None, formfield_callback=lambda f, **kwargs: f.formfield(**kwargs)): 
     93    return type(opts.object_name + 'Form', (form,), 
     94        {'base_fields': base_fields, '_model': model, 
     95         'save': make_model_save(model, fields, 'created')}) 
     96 
     97def form_for_instance(instance, form=BaseForm, fields=None, 
     98                      formfield_callback=lambda f, **kwargs: f.formfield(**kwargs)): 
    9499    """ 
    95100    Returns a Form class for the given Django model instance. 
     
    116121    base_fields = SortedDictFromList(field_list) 
    117122    return type(opts.object_name + 'InstanceForm', (form,), 
    118         {'base_fields': base_fields, '_model': model, 'save': make_instance_save(instance, fields, 'changed')}) 
     123        {'base_fields': base_fields, '_model': model, 
     124         'save': make_instance_save(instance, fields, 'changed')}) 
    119125 
    120126def form_for_fields(field_list): 
    121     "Returns a Form class for the given list of Django database field instances." 
    122     fields = SortedDictFromList([(f.name, f.formfield()) for f in field_list if f.editable]) 
     127    """ 
     128    Returns a Form class for the given list of Django database field instances. 
     129    """ 
     130    fields = SortedDictFromList([(f.name, f.formfield()) 
     131                                 for f in field_list if f.editable]) 
    123132    return type('FormForFields', (BaseForm,), {'base_fields': fields}) 
    124133 
    125134class QuerySetIterator(object): 
    126135    def __init__(self, queryset, empty_label, cache_choices): 
    127         self.queryset, self.empty_label, self.cache_choices = queryset, empty_label, cache_choices 
     136        self.queryset = queryset 
     137        self.empty_label = empty_label 
     138        self.cache_choices = cache_choices 
    128139 
    129140    def __iter__(self): 
     
    137148 
    138149class ModelChoiceField(ChoiceField): 
    139     "A ChoiceField whose choices are a model QuerySet.
     150    """A ChoiceField whose choices are a model QuerySet.""
    140151    # This class is a subclass of ChoiceField for purity, but it doesn't 
    141152    # actually use any of ChoiceField's implementation. 
     153 
    142154    def __init__(self, queryset, empty_label=u"---------", cache_choices=False, 
    143             required=True, widget=Select, label=None, initial=None, help_text=None): 
     155                 required=True, widget=Select, label=None, initial=None, 
     156                 help_text=None): 
    144157        self.queryset = queryset 
    145158        self.empty_label = empty_label 
     
    161174        # self.choices is accessed) so that we can ensure the QuerySet has not 
    162175        # been consumed. 
    163         return QuerySetIterator(self.queryset, self.empty_label, self.cache_choices) 
     176        return QuerySetIterator(self.queryset, self.empty_label, 
     177                                self.cache_choices) 
    164178 
    165179    def _set_choices(self, value): 
     
    178192            value = self.queryset.model._default_manager.get(pk=value) 
    179193        except self.queryset.model.DoesNotExist: 
    180             raise ValidationError(ugettext(u'Select a valid choice. That choice is not one of the available choices.')) 
     194            raise ValidationError(ugettext(u'Select a valid choice. That' 
     195                                           u' choice is not one of the' 
     196                                           u' available choices.')) 
    181197        return value 
    182198 
    183199class ModelMultipleChoiceField(ModelChoiceField): 
    184     "A MultipleChoiceField whose choices are a model QuerySet.
     200    """A MultipleChoiceField whose choices are a model QuerySet.""
    185201    hidden_widget = MultipleHiddenInput 
     202 
    186203    def __init__(self, queryset, cache_choices=False, required=True, 
    187             widget=SelectMultiple, label=None, initial=None, help_text=None): 
    188         super(ModelMultipleChoiceField, self).__init__(queryset, None, cache_choices, 
    189             required, widget, label, initial, help_text) 
     204                 widget=SelectMultiple, label=None, initial=None, 
     205                 help_text=None): 
     206        super(ModelMultipleChoiceField, self).__init__(queryset, None, 
     207            cache_choices, required, widget, label, initial, help_text) 
    190208 
    191209    def clean(self, value): 
     
    201219                obj = self.queryset.model._default_manager.get(pk=val) 
    202220            except self.queryset.model.DoesNotExist: 
    203                 raise ValidationError(ugettext(u'Select a valid choice. %s is not one of the available choices.') % val) 
     221                raise ValidationError(ugettext(u'Select a valid choice. %s is' 
     222                                               u' not one of the available' 
     223                                               u' choices.') % val) 
    204224            else: 
    205225                final_values.append(obj) 
  • django/branches/queryset-refactor/django/utils/cache.py

    r6466 r6638  
    1414cache keys to prevent delivery of wrong content. 
    1515 
    16 A example: i18n middleware would need to distinguish caches by the 
     16An example: i18n middleware would need to distinguish caches by the 
    1717"Accept-language" header. 
    1818""" 
     
    2121import re 
    2222import time 
    23 from email.Utils import formatdate 
     23 
    2424from django.conf import settings 
    2525from django.core.cache import cache 
    2626from django.utils.encoding import smart_str, iri_to_uri 
     27from django.utils.http import http_date 
    2728 
    2829cc_delim_re = re.compile(r'\s*,\s*') 
     
    4142    """ 
    4243    def dictitem(s): 
    43         t = s.split('=',1) 
     44        t = s.split('=', 1) 
    4445        if len(t) > 1: 
    4546            return (t[0].lower(), t[1]) 
     
    6566        kwargs['max_age'] = min(cc['max-age'], kwargs['max_age']) 
    6667 
    67     for (k,v) in kwargs.items(): 
     68    for (k, v) in kwargs.items(): 
    6869        cc[k.replace('_', '-')] = v 
    6970    cc = ', '.join([dictvalue(el) for el in cc.items()]) 
     
    8990        response['ETag'] = md5.new(response.content).hexdigest() 
    9091    if not response.has_header('Last-Modified'): 
    91         response['Last-Modified'] = formatdate()[:26] + "GMT" 
     92        response['Last-Modified'] = http_date() 
    9293    if not response.has_header('Expires'): 
    93         response['Expires'] = formatdate(time.time() + cache_timeout)[:26] + "GMT" 
     94        response['Expires'] = http_date(time.time() + cache_timeout) 
    9495    patch_cache_control(response, max_age=cache_timeout) 
    9596 
    9697def add_never_cache_headers(response): 
    9798    """ 
    98     Add headers to a response to indicate that 
    99     a page should never be cached. 
     99    Adds headers to a response to indicate that a page should never be cached. 
    100100    """ 
    101101    patch_response_headers(response, cache_timeout=-1) 
     
    120120 
    121121def _generate_cache_key(request, headerlist, key_prefix): 
    122     "Returns a cache key from the headers given in the header list.
     122    """Returns a cache key from the headers given in the header list.""
    123123    ctx = md5.new() 
    124124    for header in headerlist: 
     
    126126        if value is not None: 
    127127            ctx.update(value) 
    128     return 'views.decorators.cache.cache_page.%s.%s.%s' % (key_prefix, iri_to_uri(request.path), ctx.hexdigest()) 
     128    return 'views.decorators.cache.cache_page.%s.%s.%s' % ( 
     129               key_prefix, iri_to_uri(request.path), ctx.hexdigest()) 
    129130 
    130131def get_cache_key(request, key_prefix=None): 
     
    140141    if key_prefix is None: 
    141142        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX 
    142     cache_key = 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, iri_to_uri(request.path)) 
     143    cache_key = 'views.decorators.cache.cache_header.%s.%s' % ( 
     144                    key_prefix, iri_to_uri(request.path)) 
    143145    headerlist = cache.get(cache_key, None) 
    144146    if headerlist is not None: 
     
    164166    if cache_timeout is None: 
    165167        cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS 
    166     cache_key = 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, iri_to_uri(request.path)) 
     168    cache_key = 'views.decorators.cache.cache_header.%s.%s' % ( 
     169                    key_prefix, iri_to_uri(request.path)) 
    167170    if response.has_header('Vary'): 
    168         headerlist = ['HTTP_'+header.upper().replace('-', '_') for header in vary_delim_re.split(response['Vary'])] 
     171        headerlist = ['HTTP_'+header.upper().replace('-', '_') 
     172                      for header in vary_delim_re.split(response['Vary'])] 
    169173        cache.set(cache_key, headerlist, cache_timeout) 
    170174        return _generate_cache_key(request, headerlist, key_prefix) 
  • django/branches/queryset-refactor/django/utils/http.py

    r6597 r6638  
    11import urllib 
     2from email.Utils import formatdate 
     3 
    24from django.utils.encoding import smart_str, force_unicode 
    35from django.utils.functional import allow_lazy 
     
    3840        doseq) 
    3941 
     42def cookie_date(epoch_seconds=None): 
     43    """ 
     44    Formats the time to ensure compatibility with Netscape's cookie standard. 
     45 
     46    Accepts a floating point number expressed in seconds since the epoch, in 
     47    UTC - such as that outputted by time.time(). If set to None, defaults to 
     48    the current time. 
     49 
     50    Outputs a string in the format 'Wdy, DD-Mon-YYYY HH:MM:SS GMT'. 
     51    """ 
     52    rfcdate = formatdate(epoch_seconds) 
     53    return '%s-%s-%s GMT' % (rfcdate[:7], rfcdate[8:11], rfcdate[12:25]) 
     54 
     55def http_date(epoch_seconds=None): 
     56    """ 
     57    Formats the time to match the RFC1123 date format as specified by HTTP 
     58    RFC2616 section 3.3.1. 
     59 
     60    Accepts a floating point number expressed in seconds since the epoch, in 
     61    UTC - such as that outputted by time.time(). If set to None, defaults to 
     62    the current time. 
     63 
     64    Outputs a string in the format 'Wdy, DD Mon YYYY HH:MM:SS GMT'. 
     65    """ 
     66    rfcdate = formatdate(epoch_seconds) 
     67    return '%s GMT' % rfcdate[:25] 
  • django/branches/queryset-refactor/django/views/static.py

    r6597 r6638  
    88import posixpath 
    99import re 
    10 import rfc822 
    1110import stat 
    1211import urllib 
     12from email.Utils import parsedate_tz, mktime_tz 
    1313 
    1414from django.template import loader 
    1515from django.http import Http404, HttpResponse, HttpResponseRedirect, HttpResponseNotModified 
    1616from django.template import Template, Context, TemplateDoesNotExist 
     17from django.utils.http import http_date 
    1718 
    1819def serve(request, path, document_root=None, show_indexes=False): 
     
    6162    contents = open(fullpath, 'rb').read() 
    6263    response = HttpResponse(contents, mimetype=mimetype) 
    63     response["Last-Modified"] = rfc822.formatdate(statobj[stat.ST_MTIME]) 
     64    response["Last-Modified"] = http_date(statobj[stat.ST_MTIME]) 
    6465    return response 
    6566 
     
    120121        matches = re.match(r"^([^;]+)(; length=([0-9]+))?$", header, 
    121122                           re.IGNORECASE) 
    122         header_mtime = rfc822.mktime_tz(rfc822.parsedate_tz( 
    123             matches.group(1))) 
     123        header_mtime = mktime_tz(parsedate_tz(matches.group(1))) 
    124124        header_len = matches.group(3) 
    125125        if header_len and int(header_len) != size: 
  • django/branches/queryset-refactor/docs/cache.txt

    r6597 r6638  
    292292========================= 
    293293 
     294**New in development version**. 
     295 
    294296If you're after even more control, you can also cache template fragments using 
    295 the ``cache`` template tag. To give your template access to this tag, put ``{% 
    296 load cache %}`` near the top of your template. 
     297the ``cache`` template tag. To give your template access to this tag, put 
     298``{% load cache %}`` near the top of your template. 
    297299 
    298300The ``{% cache %}`` template tag caches the contents of the block for a given 
    299 amount of time. It takes at least two arguments: the cache timeout, in 
    300 seconds, and the name to give the cache fragment. For example:: 
     301amount of time. It takes at least two arguments: the cache timeout, in seconds, 
     302and the name to give the cache fragment. For example:: 
    301303 
    302304    {% load cache %} 
  • django/branches/queryset-refactor/docs/email.txt

    r6466 r6638  
    276276 
    277277       * You can pass it a single argument that is an 
    278          ``email.MIMBase.MIMEBase`` instance. This will be inserted directly 
     278         ``email.MIMEBase.MIMEBase`` instance. This will be inserted directly 
    279279         into the resulting message. 
    280280 
  • django/branches/queryset-refactor/docs/form_preview.txt

    r6339 r6638  
    4646    2. Create a ``FormPreview`` subclass that overrides the ``done()`` method:: 
    4747 
    48            from django.contrib.formtools import FormPreview 
     48           from django.contrib.formtools.preview import FormPreview 
    4949           from myapp.models import SomeModel 
    5050 
  • django/branches/queryset-refactor/docs/modpython.txt

    r6597 r6638  
    151151        <Location "/otherthing"> 
    152152            SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings 
    153             PythonInterpreter mysite_other 
     153            PythonInterpreter othersite 
    154154        </Location> 
    155155    </VirtualHost> 
  • django/branches/queryset-refactor/docs/testing.txt

    r6340 r6638  
    722722 
    723723    from django.test import TestCase 
    724     from django.test.client import Client 
    725724 
    726725    class SimpleTest(TestCase): 
  • django/branches/queryset-refactor/tests/regressiontests/text/tests.py

    r6597 r6638  
    2828u'Paris+&+Orl%C3%A9ans' 
    2929 
     30### cookie_date, http_date ############################################### 
     31>>> from django.utils.http import cookie_date, http_date 
     32>>> t = 1167616461.0 
     33>>> cookie_date(t) 
     34'Mon, 01-Jan-2007 01:54:21 GMT' 
     35>>> http_date(t) 
     36'Mon, 01 Jan 2007 01:54:21 GMT' 
     37 
    3038### iri_to_uri ########################################################### 
    3139>>> from django.utils.encoding import iri_to_uri