Ticket #7016: atom_rss_feed_dates_fix.4.diff

File atom_rss_feed_dates_fix.4.diff, 4.5 KB (added by ccahoon <chris.cahoon@…>, 7 years ago)

Nuked an important include fixing a typo, this is the working version

  • django/contrib/syndication/feeds.py

     
     1from datetime import datetime, timedelta
     2
    13from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
    24from django.template import loader, Template, TemplateDoesNotExist
    35from django.contrib.sites.models import Site, RequestSite
     
    24from django.utils import feedgenerator
     5from django.utils.tzinfo import FixedOffset
    36from django.utils.encoding import smart_unicode, iri_to_uri
     
    124127                author_link = self.__get_dynamic_attr('item_author_link', item)
    125128            else:
    126129                author_email = author_link = None
     130                   
     131            pubdate = self.__get_dynamic_attr('item_pubdate', item)
     132            now = datetime.now()
     133            utcnow = datetime.utcnow()   
     134
     135            # Must always subtract smaller time from larger time here.
     136            if utcnow > now:
     137                sign = -1
     138                tzDifference = (utcnow - now)
     139            else:
     140                sign = 1
     141                tzDifference = (now - utcnow)
     142           
     143            # Round the timezone offset to the nearest half hour.   
     144            tzOffsetMinutes = sign * ((tzDifference.seconds / 60 + 15) / 30) * 30
     145            tzOffset = timedelta(minutes=tzOffsetMinutes)
     146            pubdate = pubdate.replace(tzinfo=FixedOffset(tzOffset))
     147             
    127148            feed.add_item(
    128149                title = title_tmp.render(RequestContext(self.request, {'obj': item, 'site': current_site})),
    129150                link = link,
    130151                description = description_tmp.render(RequestContext(self.request, {'obj': item, 'site': current_site})),
    131152                unique_id = self.__get_dynamic_attr('item_guid', item, link),
    132153                enclosure = enc,
    133                 pubdate = self.__get_dynamic_attr('item_pubdate', item),
     154                pubdate = pubdate,
    134155                author_name = author_name,
    135156                author_email = author_email,
    136157                author_link = author_link,
  • django/utils/tzinfo.py

     
    1414class FixedOffset(tzinfo):
    1515    "Fixed offset in minutes east from UTC."
    1616    def __init__(self, offset):
    17         self.__offset = timedelta(minutes=offset)
    18         self.__name = u"%+03d%02d" % (offset // 60, offset % 60)
     17        if isinstance(offset, timedelta):
     18            self.__offset = offset
     19            offset = self.__offset.seconds // 60
     20        else:
     21            self.__offset = timedelta(minutes=offset)
     22           
     23        self.__name = u"%+03d%02d" % (offset / 60, offset % 60)
    1924
    2025    def __repr__(self):
    2126        return self.__name
     
    2833
    2934    def dst(self, dt):
    3035        return timedelta(0)
    31 
     36       
    3237class LocalTimezone(tzinfo):
    3338    "Proxy timezone information from time module."
    3439    def __init__(self, dt):
  • django/utils/feedgenerator.py

     
    2222from django.utils.xmlutils import SimplerXMLGenerator
    2323from django.utils.encoding import force_unicode, iri_to_uri
    2424import datetime, re, time
    25 import email.Utils
    2625
    2726def rfc2822_date(date):
    28     return email.Utils.formatdate(time.mktime(date.timetuple()))
     27    # We do this ourselves to be timezone aware, email.Utils is not tz aware.
     28    if date.tzinfo:
     29        time_str = date.strftime('%a, %d %b %Y %H:%M:%S ') 
     30        offset = date.tzinfo.utcoffset(date)       
     31        timezone = (offset.days * 24 * 60) + (offset.seconds / 60)
     32        hour, minute = divmod(timezone, 60)
     33        return time_str + "%+03d%02d" % (hour, minute)
     34    else:
     35        return date.strftime('%a, %d %b %Y %H:%M:%S -0000')
    2936
    3037def rfc3339_date(date):
    3138    if date.tzinfo:
    32         return date.strftime('%Y-%m-%dT%H:%M:%S%z')
     39        time_str = date.strftime('%Y-%m-%dT%H:%M:%S') 
     40        offset = date.tzinfo.utcoffset(date)       
     41        timezone = (offset.days * 24 * 60) + (offset.seconds / 60)
     42        hour, minute = divmod(timezone, 60)
     43        return time_str + "%+03d:%02d" % (hour, minute)
    3344    else:
    3445        return date.strftime('%Y-%m-%dT%H:%M:%SZ')
    3546
Back to Top