)]}'
{"keystone/token/backends/memcache.py":[{"author":{"_account_id":5733,"name":"Kieran Spear","email":"kispear@gmail.com","username":"kspear"},"change_message_id":"98f288b19e0bff04cb70e7aade30cc12ca336b70","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        tokens \u003d []"},{"line_number":179,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":180,"context_line":"        current_time \u003d timeutils.normalize_time("},{"line_number":181,"context_line":"            timeutils.parse_isotime(timeutils.isotime()))"},{"line_number":182,"context_line":"        token_list \u003d self.client.get(user_key) or []"},{"line_number":183,"context_line":"        if not isinstance(token_list, list):"},{"line_number":184,"context_line":"            # NOTE(morganfainberg): This is for compatibility for old-format"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BH2s%3D","line":181,"updated":"2014-01-29 23:03:36.000000000","message":"Is there a reason you can\u0027t just use timeutils.utcnow() here? That would match better with how the default token expiry time is generated.\n\n    In [10]: timeutils.utcnow()\n    Out[10]: datetime.datetime(2014, 1, 29, 23, 1, 31, 957879)\n\n    In [11]: timeutils.normalize_time(timeutils.parse_isotime(timeutils.isotime()))\n    Out[11]: datetime.datetime(2014, 1, 29, 23, 1, 33)","commit_id":"2bb75b3cf9608c86a49c43def547dc56a7bc4f14"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c7cc3de6b5697ec0502975eea3d1d652044e41b1","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        tokens \u003d []"},{"line_number":179,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":180,"context_line":"        current_time \u003d timeutils.normalize_time("},{"line_number":181,"context_line":"            timeutils.parse_isotime(timeutils.isotime()))"},{"line_number":182,"context_line":"        token_list \u003d self.client.get(user_key) or []"},{"line_number":183,"context_line":"        if not isinstance(token_list, list):"},{"line_number":184,"context_line":"            # NOTE(morganfainberg): This is for compatibility for old-format"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F97E0%3D","line":181,"in_reply_to":"AAAAUH%2F%2BH2s%3D","updated":"2014-02-01 01:58:33.000000000","message":"Sure.  If this is a blocker to merging, I am fine with making this change.","commit_id":"2bb75b3cf9608c86a49c43def547dc56a7bc4f14"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f99d69e6cf5b89623768f4bf79e8ae6a62304957","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        tokens \u003d []"},{"line_number":179,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":180,"context_line":"        current_time \u003d timeutils.normalize_time("},{"line_number":181,"context_line":"            timeutils.parse_isotime(timeutils.isotime()))"},{"line_number":182,"context_line":"        token_list \u003d self.client.get(user_key) or []"},{"line_number":183,"context_line":"        if not isinstance(token_list, list):"},{"line_number":184,"context_line":"            # NOTE(morganfainberg): This is for compatibility for old-format"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9bgM%3D","line":181,"in_reply_to":"AAAAUH%2F97E0%3D","updated":"2014-02-06 23:29:21.000000000","message":"So it turns out timeutils.utcnow() is not TZ aware, and therefore cannot be compared against TZ aware timestamps.\n\nYou end up with something like this:\n\n\u003e\u003e\u003e from keystone.openstack.common import timeutils\n\u003e\u003e\u003e timeutils.utcnow()\ndatetime.datetime(2014, 2, 6, 23, 25, 57, 434113)\n\u003e\u003e\u003e a \u003d timeutils.utcnow()\n\u003e\u003e\u003e a.tzinfo\n\u003e\u003e\u003e a.tzname()\n\u003e\u003e\u003e b \u003d timeutils.parse_isotime(timeutils.isotime())\n\u003e\u003e\u003e b \u003e a\nTraceback (most recent call last):\n  File \"\u003cinput\u003e\", line 1, in \u003cmodule\u003e\nTypeError: can\u0027t compare offset-naive and offset-aware datetimes\n\nIf you look the utcnow() version has nothing in .tzinfo, the parseisotime one has the following:\n\n\u003e\u003e\u003e b.tzinfo\n\u003ciso8601.iso8601.Utc object at 0x1083f6a50\u003e","commit_id":"2bb75b3cf9608c86a49c43def547dc56a7bc4f14"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bb5a080f81c778827736f3190597d64232b50b4f","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        tokens \u003d []"},{"line_number":179,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":180,"context_line":"        current_time \u003d timeutils.normalize_time("},{"line_number":181,"context_line":"            timeutils.parse_isotime(timeutils.isotime()))"},{"line_number":182,"context_line":"        token_list \u003d self.client.get(user_key) or []"},{"line_number":183,"context_line":"        if not isinstance(token_list, list):"},{"line_number":184,"context_line":"            # NOTE(morganfainberg): This is for compatibility for old-format"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9bO0%3D","line":181,"in_reply_to":"AAAAUH%2F9bYs%3D","updated":"2014-02-07 00:14:05.000000000","message":"AHA, thanks.  it\u0027s been a crazy day brain just skipped it.  I will get that posted now.","commit_id":"2bb75b3cf9608c86a49c43def547dc56a7bc4f14"},{"author":{"_account_id":5733,"name":"Kieran Spear","email":"kispear@gmail.com","username":"kspear"},"change_message_id":"e85af8aa4ea4a8bdfa6347eea55488621dba2bd6","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        tokens \u003d []"},{"line_number":179,"context_line":"        user_key \u003d self._prefix_user_id(user_id)"},{"line_number":180,"context_line":"        current_time \u003d timeutils.normalize_time("},{"line_number":181,"context_line":"            timeutils.parse_isotime(timeutils.isotime()))"},{"line_number":182,"context_line":"        token_list \u003d self.client.get(user_key) or []"},{"line_number":183,"context_line":"        if not isinstance(token_list, list):"},{"line_number":184,"context_line":"            # NOTE(morganfainberg): This is for compatibility for old-format"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F9bYs%3D","line":181,"in_reply_to":"AAAAUH%2F9bgM%3D","updated":"2014-02-06 23:53:51.000000000","message":"Sorry for the late reply!\n\nYou missed the normalize_time() call though. The current patch already uses normalize_time() here and in the expiry check added below, so current_time is already a naive datetime.\n\n    In [3]: timeutils.normalize_time(timeutils.parse_isotime(timeutils.isotime()))\n    Out[3]: datetime.datetime(2014, 2, 6, 23, 38, 38)\n\n\nThis certainly isn\u0027t a blocker for me though, behaviour should be the same with either.","commit_id":"2bb75b3cf9608c86a49c43def547dc56a7bc4f14"}]}
