Django

Code

Changeset 7946

Show
Ignore:
Timestamp:
07/17/08 22:47:27 (2 months ago)
Author:
adrian
Message:

Fixed #1443 -- Django's various bits now support dates before 1900. Thanks to SmileyChris?, Chris Green, Fredrik Lundh and others for patches and design help

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • django/trunk/django/contrib/databrowse/plugins/calendars.py

    r7131 r7946  
    99from django.utils.safestring import mark_safe 
    1010from django.views.generic import date_based 
     11from django.utils import datetime_safe 
    1112 
    1213class CalendarPlugin(DatabrowsePlugin): 
     
    3435    def urls(self, plugin_name, easy_instance_field): 
    3536        if isinstance(easy_instance_field.field, models.DateField): 
     37            d = easy_instance_field.raw_value 
    3638            return [mark_safe(u'%s%s/%s/%s/%s/%s/' % ( 
    3739                easy_instance_field.model.url(), 
    3840                plugin_name, easy_instance_field.field.name, 
    39                 easy_instance_field.raw_value.year, 
    40                 easy_instance_field.raw_value.strftime('%b').lower(), 
    41                 easy_instance_field.raw_value.day))] 
     41                d.year, 
     42                datetime_safe.new_date(d).strftime('%b').lower(), 
     43                d.day))] 
    4244 
    4345    def model_view(self, request, model_databrowse, url): 
  • django/trunk/django/core/serializers/base.py

    r7600 r7946  
    99from django.db import models 
    1010from django.utils.encoding import smart_str, smart_unicode 
     11from django.utils import datetime_safe 
    1112 
    1213class SerializationError(Exception): 
     
    6061        """ 
    6162        if isinstance(field, models.DateTimeField): 
    62             value = getattr(obj, field.name).strftime("%Y-%m-%d %H:%M:%S") 
     63            d = datetime_safe.new_datetime(getattr(obj, field.name)) 
     64            value = d.strftime("%Y-%m-%d %H:%M:%S") 
    6365        else: 
    6466            value = field.flatten_data(follow=None, obj=obj).get(field.name, "") 
  • django/trunk/django/core/serializers/json.py

    r7131 r7946  
    77from django.core.serializers.python import Serializer as PythonSerializer 
    88from django.core.serializers.python import Deserializer as PythonDeserializer 
     9from django.utils import datetime_safe 
    910try: 
    1011    from cStringIO import StringIO 
     
    2122    """ 
    2223    internal_use_only = False 
    23      
     24 
    2425    def end_serialization(self): 
    2526        self.options.pop('stream', None) 
     
    5253    def default(self, o): 
    5354        if isinstance(o, datetime.datetime): 
    54             return o.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT)) 
     55            d = datetime_safe.new_datetime(o) 
     56            return d.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT)) 
    5557        elif isinstance(o, datetime.date): 
    56             return o.strftime(self.DATE_FORMAT) 
     58            d = datetime_safe.new_date(o) 
     59            return d.strftime(self.DATE_FORMAT) 
    5760        elif isinstance(o, datetime.time): 
    5861            return o.strftime(self.TIME_FORMAT) 
  • django/trunk/django/core/validators.py

    r7837 r7946  
    142142    # produces much friendlier error messages. 
    143143    year, month, day = map(int, date_string.split('-')) 
    144     # This check is needed because strftime is used when saving the date 
    145     # value to the database, and strftime requires that the year be >=1900. 
    146     if year < 1900: 
    147         raise ValidationError, _('Year must be 1900 or later.') 
    148144    try: 
    149145        date(year, month, day) 
     
    408404    Usage: If you create an instance of the IsPowerOf validator: 
    409405        v = IsAPowerOf(2) 
    410      
     406 
    411407    The following calls will succeed: 
    412         v(4, None)  
     408        v(4, None) 
    413409        v(8, None) 
    414410        v(16, None) 
    415      
     411 
    416412    But this call: 
    417413        v(17, None) 
  • django/trunk/django/db/models/fields/__init__.py

    r7906 r7946  
    2424from django.utils.encoding import smart_unicode, force_unicode, smart_str 
    2525from django.utils.maxlength import LegacyMaxlength 
     26from django.utils import datetime_safe 
    2627 
    2728class NOT_PROVIDED: 
     
    558559            value = [smart_unicode(v) for v in value] 
    559560        elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte') and hasattr(value, 'strftime'): 
    560             value = value.strftime('%Y-%m-%d') 
     561            value = datetime_safe.new_date(value).strftime('%Y-%m-%d') 
    561562        else: 
    562563            value = smart_unicode(value) 
     
    590591        if value is not None: 
    591592            try: 
    592                 value = value.strftime('%Y-%m-%d') 
     593                value = datetime_safe.new_date(value).strftime('%Y-%m-%d') 
    593594            except AttributeError: 
    594595                # If value is already a string it won't have a strftime method, 
     
    602603    def flatten_data(self, follow, obj=None): 
    603604        val = self._get_val_from_obj(obj) 
    604         return {self.attname: (val is not None and val.strftime("%Y-%m-%d") or '')} 
     605        if val is None: 
     606            data = '' 
     607        else: 
     608            data = datetime_safe.new_date(val).strftime("%Y-%m-%d") 
     609        return {self.attname: data} 
    605610 
    606611    def formfield(self, **kwargs): 
     
    669674        val = self._get_val_from_obj(obj) 
    670675        date_field, time_field = self.get_manipulator_field_names('') 
    671         return {date_field: (val is not None and val.strftime("%Y-%m-%d") or ''), 
    672                 time_field: (val is not None and val.strftime("%H:%M:%S") or '')} 
     676        if val is None: 
     677            date_data = time_data = '' 
     678        else: 
     679            d = datetime_safe.new_datetime(val) 
     680            date_data = d.strftime('%Y-%m-%d') 
     681            time_data = d.strftime('%H:%M:%S') 
     682        return {date_field: date_data, time_field: time_data} 
    673683 
    674684    def formfield(self, **kwargs): 
  • django/trunk/django/db/models/manipulators.py

    r6277 r7946  
    1010from django.utils.encoding import smart_str 
    1111from django.utils.translation import ugettext as _ 
     12from django.utils import datetime_safe 
    1213 
    1314def add_manipulators(sender): 
     
    333334        else: 
    334335            format_string = (lookup_type == 'date') and '%B %d, %Y' or '%B %Y' 
     336            date_val = datetime_safe.new_datetime(date_val) 
    335337            raise validators.ValidationError, "Please enter a different %s. The one you entered is already being used for %s." % \ 
    336338                (from_field.verbose_name, date_val.strftime(format_string)) 
  • django/trunk/django/newforms/widgets.py

    r7693 r7946  
    1616from django.utils.encoding import StrAndUnicode, force_unicode 
    1717from django.utils.safestring import mark_safe 
     18from django.utils import datetime_safe 
    1819from util import flatatt 
    1920 
     
    171172            value = '' 
    172173        elif hasattr(value, 'strftime'): 
     174            value = datetime_safe.new_datetime(value) 
    173175            value = value.strftime(self.format) 
    174176        return super(DateTimeInput, self).render(name, value, attrs)