Ejemplo n.º 1
0
def parse_date_string(date_str, dayfirst=False, yearfirst=True):
    """
    Try hard to parse datetime string, leveraging dateutil plus some extras

    Parameters
    ----------
    arg : date string
    dayfirst : bool, 
    yearfirst : bool

    Returns
    -------
    datetime, datetime format string (for `strftime` or `strptime`)
    or None if unable parse date str
    """

    if not isinstance(date_str, basestring):
        return None

    arg = date_str.upper()

    parse_info = DEFAULTPARSER.info
    if len(arg) in (7, 8):
        mresult = _attempt_monthly(arg)
        log.debug('mresult={0}'.format(mresult))
        if mresult:
            return mresult

    parsed_datetime = DEFAULTPARSER.parse(StringIO(str(arg)), dayfirst=dayfirst,
                                          yearfirst=yearfirst, fuzzy=True)
    log.debug('parsed_datetime={0}'.format(parsed_datetime))
    if parsed_datetime:
        date_format = _guess_datetime_format(date_str, parsed_datetime,
                                             dayfirst=dayfirst)
    return parsed_datetime, date_format
Ejemplo n.º 2
0
def dateutil_parse(timestr, default, ignoretz=False, tzinfos=None, **kwargs):
    """ lifted from dateutil to get resolution"""
    from dateutil import tz
    import time
    fobj = StringIO(str(timestr))

    res = DEFAULTPARSER._parse(fobj, **kwargs)

    # dateutil 2.2 compat
    if isinstance(res, tuple):
        res, _ = res

    if res is None:
        raise ValueError("unknown string format")

    repl = {}
    reso = None
    for attr in [
            "year", "month", "day", "hour", "minute", "second", "microsecond"
    ]:
        value = getattr(res, attr)
        if value is not None:
            repl[attr] = value
            reso = attr

    if reso is None:
        raise ValueError("Cannot parse date.")

    if reso == 'microsecond':
        if repl['microsecond'] == 0:
            reso = 'second'
        elif repl['microsecond'] % 1000 == 0:
            reso = 'millisecond'

    ret = default.replace(**repl)
    if res.weekday is not None and not res.day:
        ret = ret + relativedelta.relativedelta(weekday=res.weekday)
    if not ignoretz:
        if callable(tzinfos) or tzinfos and res.tzname in tzinfos:
            if callable(tzinfos):
                tzdata = tzinfos(res.tzname, res.tzoffset)
            else:
                tzdata = tzinfos.get(res.tzname)
            if isinstance(tzdata, datetime.tzinfo):
                tzinfo = tzdata
            elif isinstance(tzdata, compat.string_types):
                tzinfo = tz.tzstr(tzdata)
            elif isinstance(tzdata, int):
                tzinfo = tz.tzoffset(res.tzname, tzdata)
            else:
                raise ValueError("offset must be tzinfo subclass, "
                                 "tz string, or int offset")
            ret = ret.replace(tzinfo=tzinfo)
        elif res.tzname and res.tzname in time.tzname:
            ret = ret.replace(tzinfo=tz.tzlocal())
        elif res.tzoffset == 0:
            ret = ret.replace(tzinfo=tz.tzutc())
        elif res.tzoffset:
            ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset))
    return ret, reso
Ejemplo n.º 3
0
def parse_date_string(date_str, dayfirst=True, yearfirst=True):
    """
    Try hard to parse datetime string, leveraging dateutil plus some extras

    Parameters
    ----------
    arg : date string
    dayfirst : bool, 
    yearfirst : bool

    Returns
    -------
    datetime, datetime format string (for `strftime` or `strptime`)
    or None if unable parse date str
    """

    if not isinstance(date_str, basestring):
        return None

    arg = date_str.upper()

    parse_info = DEFAULTPARSER.info
    if len(arg) in (7, 8):
        mresult = _attempt_monthly(arg)
        log.debug('mresult={0}'.format(mresult))
        if mresult:
            return mresult

    parsed_datetime = DEFAULTPARSER.parse(StringIO(str(arg)), dayfirst=dayfirst,
                                          yearfirst=yearfirst, fuzzy=True)
    log.debug('parsed_datetime={0}'.format(parsed_datetime))
    if parsed_datetime:
        date_format = _guess_datetime_format(date_str, parsed_datetime,
                                             dayfirst=dayfirst)
    return parsed_datetime, date_format
Ejemplo n.º 4
0
    def _clean_datetime_to_parts(self, value):
        value = DEFAULTPARSER._parse(value, dayfirst='-' not in value)
        value = value[0] if isinstance(value, tuple) else value

        if value is None:
            raise FilterValueError(ugettext('Value cannot be parsed to partial datetime'))
        else:
            return value
Ejemplo n.º 5
0
def dateutil_parse(timestr, default, ignoretz=False, tzinfos=None, **kwargs):
    """ lifted from dateutil to get resolution"""
    from dateutil import tz
    import time

    fobj = StringIO(str(timestr))

    res = DEFAULTPARSER._parse(fobj, **kwargs)

    # dateutil 2.2 compat
    if isinstance(res, tuple):
        res, _ = res

    if res is None:
        raise ValueError("unknown string format")

    repl = {}
    reso = None
    for attr in ["year", "month", "day", "hour", "minute", "second", "microsecond"]:
        value = getattr(res, attr)
        if value is not None:
            repl[attr] = value
            reso = attr

    if reso is None:
        raise ValueError("Cannot parse date.")

    if reso == "microsecond":
        if repl["microsecond"] == 0:
            reso = "second"
        elif repl["microsecond"] % 1000 == 0:
            reso = "millisecond"

    ret = default.replace(**repl)
    if res.weekday is not None and not res.day:
        ret = ret + relativedelta.relativedelta(weekday=res.weekday)
    if not ignoretz:
        if callable(tzinfos) or tzinfos and res.tzname in tzinfos:
            if callable(tzinfos):
                tzdata = tzinfos(res.tzname, res.tzoffset)
            else:
                tzdata = tzinfos.get(res.tzname)
            if isinstance(tzdata, datetime.tzinfo):
                tzinfo = tzdata
            elif isinstance(tzdata, compat.string_types):
                tzinfo = tz.tzstr(tzdata)
            elif isinstance(tzdata, int):
                tzinfo = tz.tzoffset(res.tzname, tzdata)
            else:
                raise ValueError("offset must be tzinfo subclass, " "tz string, or int offset")
            ret = ret.replace(tzinfo=tzinfo)
        elif res.tzname and res.tzname in time.tzname:
            ret = ret.replace(tzinfo=tz.tzlocal())
        elif res.tzoffset == 0:
            ret = ret.replace(tzinfo=tz.tzutc())
        elif res.tzoffset:
            ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset))
    return ret, reso
Ejemplo n.º 6
0
    def _clean_datetime_to_parts(self, value):
        value = DEFAULTPARSER._parse(value, dayfirst='-' not in value)
        value = value[0] if isinstance(value, tuple) else value

        if value is None:
            raise FilterValueError(
                ugettext('Value cannot be parsed to partial datetime'))
        else:
            return value
Ejemplo n.º 7
0
 def _clean_datetime(self, value):
     try:
         datetime_value = DEFAULTPARSER.parse(value,
                                              dayfirst='-' not in value)
         return make_aware(
             datetime_value
         ) if datetime_value.tzinfo is None else datetime_value
     except ValueError:
         raise FilterValueError(
             ugettext('Value must be in format ISO 8601.'))
Ejemplo n.º 8
0
    def get_filter_term(self, request):
        splitted_filter_key = self.filter_key.split('__')

        if len(splitted_filter_key) == 2 and splitted_filter_key[1] in self.comparators:
            if splitted_filter_key[1] in self.comparators:
                value = DEFAULTPARSER.parse(self.value, dayfirst=True)
                return {self.filter_key: value}
            else:
                return super(DateFilter, self).get_filter_term(request)

        parse = DEFAULTPARSER._parse(self.value, dayfirst=True)
        if parse is None:
            raise ValueError()
        res, _ = parse
        filter_terms = {}

        for attr in self.extra_suffixes:
            value = getattr(res, attr)
            if value:
                filter_terms['__'.join((self.filter_key, attr))] = value
        return filter_terms
Ejemplo n.º 9
0
    def get_filter_term(self, request):
        suffix = self._check_suffix()

        if suffix in self.comparators:
            value = DEFAULTPARSER.parse(self.value, dayfirst=True)
            value = make_aware(value, get_current_timezone())
            return {self.full_filter_key: value}
        elif suffix:
            return super(DateFilter, self).get_filter_term(request)
        else:
            parse = DEFAULTPARSER._parse(self.value, dayfirst=True)
            if parse is None:
                raise ValueError()
            res = parse[0] if isinstance(parse, tuple) else parse

            filter_term = {}
            for attr in self.extra_suffixes:
                value = getattr(res, attr)
                if value:
                    filter_term['__'.join((self.full_filter_key, attr))] = value
            return filter_term
Ejemplo n.º 10
0
    def get_filter_term(self, request):
        splitted_filter_key = self.filter_key.split('__')

        if len(splitted_filter_key
               ) == 2 and splitted_filter_key[1] in self.comparators:
            if splitted_filter_key[1] in self.comparators:
                value = DEFAULTPARSER.parse(self.value, dayfirst=True)
                return {self.filter_key: value}
            else:
                return super(DateFilter, self).get_filter_term(request)

        parse = DEFAULTPARSER._parse(self.value, dayfirst=True)
        if parse is None:
            raise ValueError()
        res, _ = parse
        filter_terms = {}

        for attr in self.extra_suffixes:
            value = getattr(res, attr)
            if value:
                filter_terms['__'.join((self.filter_key, attr))] = value
        return filter_terms
Ejemplo n.º 11
0
def dateutil_parse(timestr, default,
                   ignoretz=False, tzinfos=None,
                   **kwargs):
    """ lifted from dateutil to get resolution"""
    from dateutil import tz
    import time

    res = DEFAULTPARSER._parse(StringIO(timestr), **kwargs)

    if res is None:
        raise ValueError("unknown string format")

    repl = {}
    for attr in ["year", "month", "day", "hour",
                 "minute", "second", "microsecond"]:
        value = getattr(res, attr)
        if value is not None:
            repl[attr] = value
            reso = attr
    if reso == 'microsecond' and repl['microsecond'] == 0:
        reso = 'second'

    ret = default.replace(**repl)
    if res.weekday is not None and not res.day:
        ret = ret + relativedelta.relativedelta(weekday=res.weekday)
    if not ignoretz:
        if callable(tzinfos) or tzinfos and res.tzname in tzinfos:
            if callable(tzinfos):
                tzdata = tzinfos(res.tzname, res.tzoffset)
            else:
                tzdata = tzinfos.get(res.tzname)
            if isinstance(tzdata, datetime.tzinfo):
                tzinfo = tzdata
            elif isinstance(tzdata, basestring):
                tzinfo = tz.tzstr(tzdata)
            elif isinstance(tzdata, int):
                tzinfo = tz.tzoffset(res.tzname, tzdata)
            else:
                raise ValueError("offset must be tzinfo subclass, "
                                 "tz string, or int offset")
            ret = ret.replace(tzinfo=tzinfo)
        elif res.tzname and res.tzname in time.tzname:
            ret = ret.replace(tzinfo=tz.tzlocal())
        elif res.tzoffset == 0:
            ret = ret.replace(tzinfo=tz.tzutc())
        elif res.tzoffset:
            ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset))
    return ret, reso
Ejemplo n.º 12
0
def dateutil_parse(timestr, default,
                   ignoretz=False, tzinfos=None,
                   **kwargs):
    """ lifted from dateutil to get resolution"""
    res = DEFAULTPARSER._parse(StringIO(timestr), **kwargs)

    if res is None:
        raise ValueError, "unknown string format"

    repl = {}
    for attr in ["year", "month", "day", "hour",
                 "minute", "second", "microsecond"]:
        value = getattr(res, attr)
        if value is not None:
            repl[attr] = value
            reso = attr
    if reso == 'microsecond' and repl['microsecond'] == 0:
        reso = 'second'

    ret = default.replace(**repl)
    if res.weekday is not None and not res.day:
        ret = ret+relativedelta.relativedelta(weekday=res.weekday)
    if not ignoretz:
        if callable(tzinfos) or tzinfos and res.tzname in tzinfos:
            if callable(tzinfos):
                tzdata = tzinfos(res.tzname, res.tzoffset)
            else:
                tzdata = tzinfos.get(res.tzname)
            if isinstance(tzdata, datetime.tzinfo):
                tzinfo = tzdata
            elif isinstance(tzdata, basestring):
                tzinfo = tz.tzstr(tzdata)
            elif isinstance(tzdata, int):
                tzinfo = tz.tzoffset(res.tzname, tzdata)
            else:
                raise ValueError, "offset must be tzinfo subclass, " \
                                  "tz string, or int offset"
            ret = ret.replace(tzinfo=tzinfo)
        elif res.tzname and res.tzname in time.tzname:
            ret = ret.replace(tzinfo=tz.tzlocal())
        elif res.tzoffset == 0:
            ret = ret.replace(tzinfo=tz.tzutc())
        elif res.tzoffset:
            ret = ret.replace(tzinfo=tz.tzoffset(res.tzname, res.tzoffset))
    return ret, reso
Ejemplo n.º 13
0
 def _clean_datetime(self, value):
     try:
         datetime_value = DEFAULTPARSER.parse(value, dayfirst='-' not in value)
         return make_aware(datetime_value) if datetime_value.tzinfo is None else datetime_value
     except ValueError:
         raise FilterValueError(ugettext('Value must be in format ISO 8601.'))
Ejemplo n.º 14
0
 def to_python(self, value):
     return dateparser.parse(value)
Ejemplo n.º 15
0
 def to_python(self, value):
     return dateparser.parse(value)