code: def from_str(cls, timestr, shaked=False):
          
          orig = timestr
          if not shaked:
              timestr = cls.fix_timezone_separator(timestr)
          try:
              date = parser.parse(timestr)
          except ValueError:
              if not shaked:
                  shaked = False
                  for shaker in [
                          cls.fix_mispelled_day,
                          cls.remove_parenthesis_around_tz,
                          cls.remove_quotes_around_tz]:
                      new_timestr = shaker(timestr)
                      if new_timestr is not None:
                          timestr = new_timestr
                          shaked = True
                  if shaked:
                      try:
                          return cls.from_str(timestr, shaked=True)
                      except ValueError:
                          # raise ValueError below with proper message
                          pass
              msg = u"Unknown string format: {!r}".format(orig)
              raise ValueError(msg), None, sys.exc_info()[2]
          else:
              try:
                  return cls.from_datetime(date)
              except ValueError:
                  new_str = cls.remove_timezone(orig)
                  if new_str is not None:
                      return cls.from_str(new_str)
                  else:
                      raise
docs: 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.