Skip to content
This repository has been archived by the owner on Feb 27, 2024. It is now read-only.

Commit

Permalink
Fix date parsing with new versions of parsedatetime
Browse files Browse the repository at this point in the history
  • Loading branch information
inducer committed Dec 28, 2014
1 parent 610141d commit ee4c2ac
Showing 1 changed file with 69 additions and 41 deletions.
110 changes: 69 additions & 41 deletions synoptic/__init__.py
Expand Up @@ -6,6 +6,8 @@
import json


# {{{ static file retrieval

def get_static_file(filename):
from os.path import splitext, join, normpath

Expand Down Expand Up @@ -36,6 +38,8 @@ def get_static_file(filename):

return (data, mimetypes.get(ext, "application/octet-stream"))

# }}}


# {{{ import backup/initial content

Expand Down Expand Up @@ -70,6 +74,8 @@ def import_file(dbsession, text):
# }}}


# {{{ random usefulness

def kill_hms_in_time_struct(t_struct):
t_struct = list(t_struct)
t_struct[3:6] = (0, 0, 0)
Expand All @@ -84,6 +90,61 @@ def get_google_calendar_tag(entry_dict):
return "gcal-"+md5_obj.hexdigest()[:10]


def parse_datetime(s, rel_to=None, use_utc=False):
import parsedatetime as pdt

us_ptc = pdt.Constants("en_US")
us_cal = pdt.Calendar(us_ptc)

native_cal = pdt.Calendar()
import datetime
import time

if s:
if rel_to is not None:
rel_to = datetime.datetime.fromtimestamp(rel_to).timetuple()
else:
rel_to = None

t_struct, parsed_as = us_cal.parse(s, rel_to)

if not parsed_as:
t_struct, parsed_as = us_cal.parse(s, None)

if not parsed_as:
t_struct, parsed_as = native_cal.parse(s, rel_to)

if not parsed_as:
t_struct, parsed_as = native_cal.parse(s, None)

if parsed_as:
t_struct = list(t_struct)
if parsed_as == 1:
# only parsed as date, eliminate time part
t_struct[3:6] = (0, 0, 0)

t_struct[8] = -1 # isdst -- we don't know if that is DST

if use_utc:
from calendar import timegm
return timegm(t_struct)
else:
return time.mktime(t_struct)
else:
raise ValueError("failed to parse date/time '%s'" % s)
else:
return None


def set_with_parsed_datetime(data, name, rel_to_name=None, use_utc=False):
data[name] = parse_datetime(
data[name],
data.get(rel_to_name),
use_utc=use_utc)

# }}}


# {{{ HTTP middleware

class DBSessionInjector(object):
Expand Down Expand Up @@ -700,39 +761,6 @@ def http_get_item_history(self, request):
return request.respond(json.dumps(json),
mimetype="text/plain")

@staticmethod
def parse_datetime(data, name, rel_to_name=None, use_utc=False):
import parsedatetime as pdt
cal = pdt.Calendar()
import datetime
import time

if data[name]:
if rel_to_name is not None and data[rel_to_name] is not None:
rel_to = datetime.datetime.fromtimestamp(
data[rel_to_name]).timetuple()
else:
rel_to = None

t_struct, parsed_as = cal.parse(data[name], rel_to)
if parsed_as:
t_struct = list(t_struct)
if parsed_as == 1:
# only parsed as date, eliminate time part
t_struct[3:6] = (0, 0, 0)

t_struct[8] = -1 # isdst -- we don't know if that is DST

if use_utc:
from calendar import timegm
data[name] = timegm(t_struct)
else:
data[name] = time.mktime(t_struct)
else:
data[name] = None
else:
data[name] = None

def http_store_item(self, request):
data = json.loads(request.POST["json"])

Expand All @@ -759,12 +787,12 @@ def http_store_item(self, request):
voh = None

if not deleting:
self.parse_datetime(data, "start_date",
set_with_parsed_datetime(data, "start_date",
use_utc=data["all_day"])
self.parse_datetime(data, "end_date", "start_date",
set_with_parsed_datetime(data, "end_date", "start_date",
use_utc=data["all_day"])
self.parse_datetime(data, "hide_until", "start_date")
self.parse_datetime(data, "highlight_at", "start_date")
set_with_parsed_datetime(data, "hide_until", "start_date")
set_with_parsed_datetime(data, "highlight_at", "start_date")

if not deleting:
from synoptic.datamodel import is_valid_tag
Expand Down Expand Up @@ -792,10 +820,10 @@ def http_item_datebump(self, request):
bump_interval = data["bump_interval"]
bump_direction = data["bump_direction"]

self.parse_datetime(data, "start_date")
self.parse_datetime(data, "end_date", "start_date")
self.parse_datetime(data, "hide_until", "start_date")
self.parse_datetime(data, "highlight_at", "start_date")
set_with_parsed_datetime(data, "start_date")
set_with_parsed_datetime(data, "end_date", "start_date")
set_with_parsed_datetime(data, "hide_until", "start_date")
set_with_parsed_datetime(data, "highlight_at", "start_date")

tdelta = None
increment_func = None
Expand Down

0 comments on commit ee4c2ac

Please sign in to comment.