Commit df2b19cc authored by Adrian Holovaty's avatar Adrian Holovaty
Browse files

Fixed #1443 -- Django's various bits now support dates before 1900. Thanks to...

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

git-svn-id: http://code.djangoproject.com/svn/django/trunk@7946 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent f6fafc02
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ from django.utils.translation import get_date_formats
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe
from django.views.generic import date_based
from django.utils import datetime_safe

class CalendarPlugin(DatabrowsePlugin):
    def __init__(self, field_names=None):
@@ -33,12 +34,13 @@ class CalendarPlugin(DatabrowsePlugin):

    def urls(self, plugin_name, easy_instance_field):
        if isinstance(easy_instance_field.field, models.DateField):
            d = easy_instance_field.raw_value
            return [mark_safe(u'%s%s/%s/%s/%s/%s/' % (
                easy_instance_field.model.url(),
                plugin_name, easy_instance_field.field.name,
                easy_instance_field.raw_value.year,
                easy_instance_field.raw_value.strftime('%b').lower(),
                easy_instance_field.raw_value.day))]
                d.year,
                datetime_safe.new_date(d).strftime('%b').lower(),
                d.day))]

    def model_view(self, request, model_databrowse, url):
        self.model, self.site = model_databrowse.model, model_databrowse.site
+3 −1
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@ except ImportError:
    from StringIO import StringIO
from django.db import models
from django.utils.encoding import smart_str, smart_unicode
from django.utils import datetime_safe

class SerializationError(Exception):
    """Something bad happened during serialization."""
@@ -59,7 +60,8 @@ class Serializer(object):
        Convert a field's value to a string.
        """
        if isinstance(field, models.DateTimeField):
            value = getattr(obj, field.name).strftime("%Y-%m-%d %H:%M:%S")
            d = datetime_safe.new_datetime(getattr(obj, field.name))
            value = d.strftime("%Y-%m-%d %H:%M:%S")
        else:
            value = field.flatten_data(follow=None, obj=obj).get(field.name, "")
        return smart_unicode(value)
+6 −3
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import datetime
from django.utils import simplejson
from django.core.serializers.python import Serializer as PythonSerializer
from django.core.serializers.python import Deserializer as PythonDeserializer
from django.utils import datetime_safe
try:
    from cStringIO import StringIO
except ImportError:
@@ -51,9 +52,11 @@ class DjangoJSONEncoder(simplejson.JSONEncoder):

    def default(self, o):
        if isinstance(o, datetime.datetime):
            return o.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT))
            d = datetime_safe.new_datetime(o)
            return d.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT))
        elif isinstance(o, datetime.date):
            return o.strftime(self.DATE_FORMAT)
            d = datetime_safe.new_date(o)
            return d.strftime(self.DATE_FORMAT)
        elif isinstance(o, datetime.time):
            return o.strftime(self.TIME_FORMAT)
        elif isinstance(o, decimal.Decimal):
+3 −7
Original line number Diff line number Diff line
@@ -141,10 +141,6 @@ def _isValidDate(date_string):
    # Could use time.strptime here and catch errors, but datetime.date below
    # produces much friendlier error messages.
    year, month, day = map(int, date_string.split('-'))
    # This check is needed because strftime is used when saving the date
    # value to the database, and strftime requires that the year be >=1900.
    if year < 1900:
        raise ValidationError, _('Year must be 1900 or later.')
    try:
        date(year, month, day)
    except ValueError, e:
+15 −5
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ from django.utils.text import capfirst
from django.utils.translation import ugettext_lazy, ugettext as _
from django.utils.encoding import smart_unicode, force_unicode, smart_str
from django.utils.maxlength import LegacyMaxlength
from django.utils import datetime_safe

class NOT_PROVIDED:
    pass
@@ -557,7 +558,7 @@ class DateField(Field):
        if lookup_type in ('range', 'in'):
            value = [smart_unicode(v) for v in value]
        elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte') and hasattr(value, 'strftime'):
            value = value.strftime('%Y-%m-%d')
            value = datetime_safe.new_date(value).strftime('%Y-%m-%d')
        else:
            value = smart_unicode(value)
        return Field.get_db_prep_lookup(self, lookup_type, value)
@@ -589,7 +590,7 @@ class DateField(Field):
        # Casts dates into string format for entry into database.
        if value is not None:
            try:
                value = value.strftime('%Y-%m-%d')
                value = datetime_safe.new_date(value).strftime('%Y-%m-%d')
            except AttributeError:
                # If value is already a string it won't have a strftime method,
                # so we'll just let it pass through.
@@ -601,7 +602,11 @@ class DateField(Field):

    def flatten_data(self, follow, obj=None):
        val = self._get_val_from_obj(obj)
        return {self.attname: (val is not None and val.strftime("%Y-%m-%d") or '')}
        if val is None:
            data = ''
        else:
            data = datetime_safe.new_date(val).strftime("%Y-%m-%d")
        return {self.attname: data}

    def formfield(self, **kwargs):
        defaults = {'form_class': forms.DateField}
@@ -668,8 +673,13 @@ class DateTimeField(DateField):
    def flatten_data(self,follow, obj = None):
        val = self._get_val_from_obj(obj)
        date_field, time_field = self.get_manipulator_field_names('')
        return {date_field: (val is not None and val.strftime("%Y-%m-%d") or ''),
                time_field: (val is not None and val.strftime("%H:%M:%S") or '')}
        if val is None:
            date_data = time_data = ''
        else:
            d = datetime_safe.new_datetime(val)
            date_data = d.strftime('%Y-%m-%d')
            time_data = d.strftime('%H:%M:%S')
        return {date_field: date_data, time_field: time_data}

    def formfield(self, **kwargs):
        defaults = {'form_class': forms.DateTimeField}
Loading