@classmethod<EOL><INDENT>def from_str(cls, timestr, shaked=False):<DEDENT>
orig = timestr<EOL>if not shaked:<EOL><INDENT>timestr = cls.fix_timezone_separator(timestr)<EOL><DEDENT>try:<EOL><INDENT>date = parser.parse(timestr)<EOL><DEDENT>except ValueError:<EOL><INDENT>if not shaked:<EOL><INDENT>shaked = False<EOL>for shaker in [<EOL>cls.fix_mispelled_day,<EOL>cls.remove_parenthesis_around_tz,<EOL>cls.remove_quotes_around_tz]:<EOL><INDENT>new_timestr = shaker(timestr)<EOL>if new_timestr is not None:<EOL><INDENT>timestr = new_timestr<EOL>shaked = True<EOL><DEDENT><DEDENT>if shaked:<EOL><INDENT>try:<EOL><INDENT>return cls.from_str(timestr, shaked=True)<EOL><DEDENT>except ValueError:<EOL><INDENT>pass<EOL><DEDENT><DEDENT><DEDENT>msg = "<STR_LIT>".format(orig)<EOL>raise ValueError(msg).with_traceback(sys.exc_info()[<NUM_LIT:2>])<EOL><DEDENT>else:<EOL><INDENT>try:<EOL><INDENT>return cls.from_datetime(date)<EOL><DEDENT>except ValueError:<EOL><INDENT>new_str = cls.remove_timezone(orig)<EOL>if new_str is not None:<EOL><INDENT>return cls.from_str(new_str)<EOL><DEDENT>else:<EOL><INDENT>raise<EOL><DEDENT><DEDENT><DEDENT>
Use `dateutil` module to parse the give string

        :param basestring timestr: string representing a date to parse
        :param bool shaked: whether the input parameter been already
        cleaned or not.