)]}'
{"keystone/notifications.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"44b9ebdcb1bd3b57338de09c5d565653d027ffed","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                # Only emit CADF notifications for public events"},{"line_number":192,"context_line":"                if CONF.notification_format \u003d\u003d \u0027cadf\u0027 and self.public:"},{"line_number":193,"context_line":"                    outcome \u003d taxonomy.OUTCOME_SUCCESS"},{"line_number":194,"context_line":"                    # NOTE(morganfainberg): The decorator form will always use"},{"line_number":195,"context_line":"                    # a \u0027None\u0027 initiator, since we do not pass context around"},{"line_number":196,"context_line":"                    # in a manner that allows the decorator to inspect context"},{"line_number":197,"context_line":"                    # and extract the needed information."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_162027ab","line":194,"updated":"2015-02-24 23:14:58.000000000","message":"Interesting. So this code doesn\u0027t actually work now or doesn\u0027t work in all cases?","commit_id":"4b4cf69c051ccd7ef2de6b46f75f28abfcef919c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3ae5809b5d47d138b23b42a094ba07b1d77c3db2","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                # Only emit CADF notifications for public events"},{"line_number":192,"context_line":"                if CONF.notification_format \u003d\u003d \u0027cadf\u0027 and self.public:"},{"line_number":193,"context_line":"                    outcome \u003d taxonomy.OUTCOME_SUCCESS"},{"line_number":194,"context_line":"                    # NOTE(morganfainberg): The decorator form will always use"},{"line_number":195,"context_line":"                    # a \u0027None\u0027 initiator, since we do not pass context around"},{"line_number":196,"context_line":"                    # in a manner that allows the decorator to inspect context"},{"line_number":197,"context_line":"                    # and extract the needed information."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_77cf9e29","line":194,"in_reply_to":"ba7be1f8_162027ab","updated":"2015-02-25 00:16:04.000000000","message":"You can use it, just you don\u0027t get any initiator (user) information today. It doesn\u0027t work unless we store the context somewhere (thread.local like pecan) or pass it through for inspection via the decorator.","commit_id":"4b4cf69c051ccd7ef2de6b46f75f28abfcef919c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"44b9ebdcb1bd3b57338de09c5d565653d027ffed","unresolved":false,"context_lines":[{"line_number":428,"context_line":"    def __call__(self, f):"},{"line_number":429,"context_line":"        def wrapper(wrapped_self, context, user_id, *args, **kwargs):"},{"line_number":430,"context_line":"            \"\"\"Always send a notification.\"\"\""},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"            initiator \u003d _get_request_audit_info(context, user_id)"},{"line_number":433,"context_line":"            target \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER)"},{"line_number":434,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_542d3894","line":431,"updated":"2015-02-24 23:14:58.000000000","message":"Is this broken as well?","commit_id":"4b4cf69c051ccd7ef2de6b46f75f28abfcef919c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b90df9a137b3fa3a4d3e658f3ee0354a48b192d5","unresolved":false,"context_lines":[{"line_number":428,"context_line":"    def __call__(self, f):"},{"line_number":429,"context_line":"        def wrapper(wrapped_self, context, user_id, *args, **kwargs):"},{"line_number":430,"context_line":"            \"\"\"Always send a notification.\"\"\""},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"            initiator \u003d _get_request_audit_info(context, user_id)"},{"line_number":433,"context_line":"            target \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER)"},{"line_number":434,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_0ffe42ae","line":431,"in_reply_to":"ba7be1f8_37f0c666","updated":"2015-02-25 08:10:50.000000000","message":"i don\u0027t think so, this is just called when authenticating a local user.","commit_id":"4b4cf69c051ccd7ef2de6b46f75f28abfcef919c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3ae5809b5d47d138b23b42a094ba07b1d77c3db2","unresolved":false,"context_lines":[{"line_number":428,"context_line":"    def __call__(self, f):"},{"line_number":429,"context_line":"        def wrapper(wrapped_self, context, user_id, *args, **kwargs):"},{"line_number":430,"context_line":"            \"\"\"Always send a notification.\"\"\""},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"            initiator \u003d _get_request_audit_info(context, user_id)"},{"line_number":433,"context_line":"            target \u003d resource.Resource(typeURI\u003dtaxonomy.ACCOUNT_USER)"},{"line_number":434,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_37f0c666","line":431,"in_reply_to":"ba7be1f8_542d3894","updated":"2015-02-25 00:16:04.000000000","message":"Perhaps. (Likely)","commit_id":"4b4cf69c051ccd7ef2de6b46f75f28abfcef919c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f879f886da92d7dbddf958824dccdd59fc8f26b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        :param resource_type: type of resource being affected"},{"line_number":101,"context_line":"        :param resource_id: ID of the resource affected"},{"line_number":102,"context_line":"        :param initiator: CADF representation of the user that created the"},{"line_number":103,"context_line":"                          request"},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        # NOTE(stevemar): the _send_notification function is"},{"line_number":106,"context_line":"        # overloaded, it\u0027s used to register callbacks and to actually"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_d9f494d1","line":103,"updated":"2015-02-27 01:39:50.000000000","message":"the \"public\" parameter is missing from the doc.","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"299fa24c64b799390048456f1dabec79ed7d6e4e","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        :param resource_type: type of resource being affected"},{"line_number":101,"context_line":"        :param resource_id: ID of the resource affected"},{"line_number":102,"context_line":"        :param initiator: CADF representation of the user that created the"},{"line_number":103,"context_line":"                          request"},{"line_number":104,"context_line":"        \"\"\""},{"line_number":105,"context_line":"        # NOTE(stevemar): the _send_notification function is"},{"line_number":106,"context_line":"        # overloaded, it\u0027s used to register callbacks and to actually"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_02fe856b","line":103,"in_reply_to":"ba7be1f8_d9f494d1","updated":"2015-02-27 22:26:26.000000000","message":"Done","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f879f886da92d7dbddf958824dccdd59fc8f26b","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            public\u003dpublic)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if CONF.notification_format \u003d\u003d \u0027cadf\u0027 and public:"},{"line_number":117,"context_line":"            outcome \u003d taxonomy.OUTCOME_SUCCESS"},{"line_number":118,"context_line":"            _create_cadf_payload(operation, resource_type, resource_id,"},{"line_number":119,"context_line":"                                 outcome, initiator)"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_191c6cc1","line":117,"updated":"2015-02-27 01:39:50.000000000","message":"coverage report shows this is untested.","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"299fa24c64b799390048456f1dabec79ed7d6e4e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"            public\u003dpublic)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        if CONF.notification_format \u003d\u003d \u0027cadf\u0027 and public:"},{"line_number":117,"context_line":"            outcome \u003d taxonomy.OUTCOME_SUCCESS"},{"line_number":118,"context_line":"            _create_cadf_payload(operation, resource_type, resource_id,"},{"line_number":119,"context_line":"                                 outcome, initiator)"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_e2089193","line":117,"in_reply_to":"ba7be1f8_191c6cc1","updated":"2015-02-27 22:26:26.000000000","message":"Done","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f879f886da92d7dbddf958824dccdd59fc8f26b","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    @classmethod"},{"line_number":134,"context_line":"    def disabled(cls, resource_type, resource_id, initiator\u003dNone,"},{"line_number":135,"context_line":"                 public\u003dTrue):"},{"line_number":136,"context_line":"        cls.emit(ACTIONS.disabled, resource_type, resource_id, initiator,"},{"line_number":137,"context_line":"                 public)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_397850f8","line":136,"updated":"2015-02-27 01:39:50.000000000","message":"coverage repor shows this is untested.","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"299fa24c64b799390048456f1dabec79ed7d6e4e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    @classmethod"},{"line_number":134,"context_line":"    def disabled(cls, resource_type, resource_id, initiator\u003dNone,"},{"line_number":135,"context_line":"                 public\u003dTrue):"},{"line_number":136,"context_line":"        cls.emit(ACTIONS.disabled, resource_type, resource_id, initiator,"},{"line_number":137,"context_line":"                 public)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_c2038d74","line":136,"in_reply_to":"ba7be1f8_397850f8","updated":"2015-02-27 22:26:26.000000000","message":"Done","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"}],"keystone/tests/unit/common/test_notifications.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"44b9ebdcb1bd3b57338de09c5d565653d027ffed","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"class AuditNotificationsTestCase(testtools.TestCase):"},{"line_number":63,"context_line":"    def test_resource_created_notification(self):"},{"line_number":64,"context_line":"        exp_resource_id, fake_ref \u003d _create_fake_ref()"},{"line_number":65,"context_line":"        callback \u003d register_callback(CREATED_OPERATION)"},{"line_number":66,"context_line":"        notifications.Audit.created(EXP_RESOURCE_TYPE, exp_resource_id)"},{"line_number":67,"context_line":"        callback.assert_called_with(\u0027identity\u0027, EXP_RESOURCE_TYPE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_d68e8fcf","line":64,"updated":"2015-02-24 23:14:58.000000000","message":"Is there any reason you don\u0027t just use uuid.uuid4().hex since you don\u0027t use the returned dict?","commit_id":"4b4cf69c051ccd7ef2de6b46f75f28abfcef919c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"3ae5809b5d47d138b23b42a094ba07b1d77c3db2","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"class AuditNotificationsTestCase(testtools.TestCase):"},{"line_number":63,"context_line":"    def test_resource_created_notification(self):"},{"line_number":64,"context_line":"        exp_resource_id, fake_ref \u003d _create_fake_ref()"},{"line_number":65,"context_line":"        callback \u003d register_callback(CREATED_OPERATION)"},{"line_number":66,"context_line":"        notifications.Audit.created(EXP_RESOURCE_TYPE, exp_resource_id)"},{"line_number":67,"context_line":"        callback.assert_called_with(\u0027identity\u0027, EXP_RESOURCE_TYPE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba7be1f8_171bc2ca","line":64,"in_reply_to":"ba7be1f8_d68e8fcf","updated":"2015-02-25 00:16:04.000000000","message":"Mostly just using the previous pattern of tests. easy to change.","commit_id":"4b4cf69c051ccd7ef2de6b46f75f28abfcef919c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f879f886da92d7dbddf958824dccdd59fc8f26b","unresolved":false,"context_lines":[{"line_number":54,"context_line":"class AuditNotificationsTestCase(testtools.TestCase):"},{"line_number":55,"context_line":"    def test_resource_created_notification(self):"},{"line_number":56,"context_line":"        exp_resource_id \u003d uuid.uuid4().hex"},{"line_number":57,"context_line":"        callback \u003d register_callback(CREATED_OPERATION)"},{"line_number":58,"context_line":"        notifications.Audit.created(EXP_RESOURCE_TYPE, exp_resource_id)"},{"line_number":59,"context_line":"        callback.assert_called_with(\u0027identity\u0027, EXP_RESOURCE_TYPE,"},{"line_number":60,"context_line":"                                    CREATED_OPERATION,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_f9495861","line":57,"updated":"2015-02-27 01:39:50.000000000","message":"these tests should be cleaning up after themselves by calling notifications.clear_subscribers().","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"299fa24c64b799390048456f1dabec79ed7d6e4e","unresolved":false,"context_lines":[{"line_number":54,"context_line":"class AuditNotificationsTestCase(testtools.TestCase):"},{"line_number":55,"context_line":"    def test_resource_created_notification(self):"},{"line_number":56,"context_line":"        exp_resource_id \u003d uuid.uuid4().hex"},{"line_number":57,"context_line":"        callback \u003d register_callback(CREATED_OPERATION)"},{"line_number":58,"context_line":"        notifications.Audit.created(EXP_RESOURCE_TYPE, exp_resource_id)"},{"line_number":59,"context_line":"        callback.assert_called_with(\u0027identity\u0027, EXP_RESOURCE_TYPE,"},{"line_number":60,"context_line":"                                    CREATED_OPERATION,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_22ec69c7","line":57,"in_reply_to":"ba7be1f8_f9495861","updated":"2015-02-27 22:26:26.000000000","message":"Done","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f879f886da92d7dbddf958824dccdd59fc8f26b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        exp_resource_id \u003d uuid.uuid4().hex"},{"line_number":57,"context_line":"        callback \u003d register_callback(CREATED_OPERATION)"},{"line_number":58,"context_line":"        notifications.Audit.created(EXP_RESOURCE_TYPE, exp_resource_id)"},{"line_number":59,"context_line":"        callback.assert_called_with(\u0027identity\u0027, EXP_RESOURCE_TYPE,"},{"line_number":60,"context_line":"                                    CREATED_OPERATION,"},{"line_number":61,"context_line":"                                    {\u0027resource_info\u0027: exp_resource_id})"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_796d68cc","line":59,"updated":"2015-02-27 01:39:50.000000000","message":"suggest use assert_called_once_with since that will be a more stringent test.","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"299fa24c64b799390048456f1dabec79ed7d6e4e","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        exp_resource_id \u003d uuid.uuid4().hex"},{"line_number":57,"context_line":"        callback \u003d register_callback(CREATED_OPERATION)"},{"line_number":58,"context_line":"        notifications.Audit.created(EXP_RESOURCE_TYPE, exp_resource_id)"},{"line_number":59,"context_line":"        callback.assert_called_with(\u0027identity\u0027, EXP_RESOURCE_TYPE,"},{"line_number":60,"context_line":"                                    CREATED_OPERATION,"},{"line_number":61,"context_line":"                                    {\u0027resource_info\u0027: exp_resource_id})"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_62cd815d","line":59,"in_reply_to":"ba7be1f8_796d68cc","updated":"2015-02-27 22:26:26.000000000","message":"Done","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4f879f886da92d7dbddf958824dccdd59fc8f26b","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        notifications.Audit.deleted(EXP_RESOURCE_TYPE, exp_resource_id)"},{"line_number":75,"context_line":"        callback.assert_called_with(\u0027identity\u0027, EXP_RESOURCE_TYPE,"},{"line_number":76,"context_line":"                                    DELETED_OPERATION,"},{"line_number":77,"context_line":"                                    {\u0027resource_info\u0027: exp_resource_id})"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class NotificationsWrapperTestCase(testtools.TestCase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_39d21035","line":77,"updated":"2015-02-27 01:39:50.000000000","message":"there should also be a test for disabled.\n\nAlso, these tests are all the same so could make a parameterized test function and call that.\n\nAlso, there could be a test for emit, too, since it\u0027s \"public\".\n\nAlso, there should be a test where CONF.notification_format is set to different values (\u0027cadf\u0027 or not).\n\nAlso, there should be tests using public\u003dFalse.","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"299fa24c64b799390048456f1dabec79ed7d6e4e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        notifications.Audit.deleted(EXP_RESOURCE_TYPE, exp_resource_id)"},{"line_number":75,"context_line":"        callback.assert_called_with(\u0027identity\u0027, EXP_RESOURCE_TYPE,"},{"line_number":76,"context_line":"                                    DELETED_OPERATION,"},{"line_number":77,"context_line":"                                    {\u0027resource_info\u0027: exp_resource_id})"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class NotificationsWrapperTestCase(testtools.TestCase):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_82da7515","line":77,"in_reply_to":"ba7be1f8_39d21035","updated":"2015-02-27 22:26:26.000000000","message":"Done","commit_id":"fe6d6dedc92d72caec1a55a8b51ad06f251c8a7f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"b44f65ee588bba81390226e7ae148b0e4da70f17","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                operation, EXP_RESOURCE_TYPE, exp_resource_id,"},{"line_number":76,"context_line":"                notifications.taxonomy.OUTCOME_SUCCESS, initiator)"},{"line_number":77,"context_line":"            notify_function(EXP_RESOURCE_TYPE, exp_resource_id, public\u003dFalse)"},{"line_number":78,"context_line":"            cadf_notify.assert_called_once_with("},{"line_number":79,"context_line":"                operation, EXP_RESOURCE_TYPE, exp_resource_id,"},{"line_number":80,"context_line":"                notifications.taxonomy.OUTCOME_SUCCESS, initiator)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_73e7f5e4","line":78,"updated":"2015-03-02 08:00:57.000000000","message":"if we are setting public to false, then cadf_notify shouldn\u0027t be called right?","commit_id":"671b0689b7d71c220a49a3bd38caab3353680dea"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"bf2a96e9475d8eab6e2c538ce8f2855b8415a36f","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                operation, EXP_RESOURCE_TYPE, exp_resource_id,"},{"line_number":76,"context_line":"                notifications.taxonomy.OUTCOME_SUCCESS, initiator)"},{"line_number":77,"context_line":"            notify_function(EXP_RESOURCE_TYPE, exp_resource_id, public\u003dFalse)"},{"line_number":78,"context_line":"            cadf_notify.assert_called_once_with("},{"line_number":79,"context_line":"                operation, EXP_RESOURCE_TYPE, exp_resource_id,"},{"line_number":80,"context_line":"                notifications.taxonomy.OUTCOME_SUCCESS, initiator)"},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ba7be1f8_19cebe83","line":78,"in_reply_to":"ba7be1f8_73e7f5e4","updated":"2015-03-02 18:08:42.000000000","message":"Correct. We already called cadf notify once, we make sure we\u0027ve still only called it once here. If cadf notify had been called a second time when public was false, this would explode.","commit_id":"671b0689b7d71c220a49a3bd38caab3353680dea"}]}
