[#7888] has_activity_access handles objects without deleted attribute
diff --git a/Allura/allura/model/timeline.py b/Allura/allura/model/timeline.py
index d5b9af8..66ecdaf 100644
--- a/Allura/allura/model/timeline.py
+++ b/Allura/allura/model/timeline.py
@@ -100,7 +100,7 @@
         """Return True if user has perm access to this object, otherwise
         return False.
         """
-        if self.project is None or self.deleted:
+        if self.project is None or getattr(self, 'deleted', False):
             return False
         return security.has_access(self, perm, user, self.project)
 
diff --git a/Allura/allura/tests/model/test_timeline.py b/Allura/allura/tests/model/test_timeline.py
new file mode 100644
index 0000000..6f7ae94
--- /dev/null
+++ b/Allura/allura/tests/model/test_timeline.py
@@ -0,0 +1,42 @@
+#       Licensed to the Apache Software Foundation (ASF) under one
+#       or more contributor license agreements.  See the NOTICE file
+#       distributed with this work for additional information
+#       regarding copyright ownership.  The ASF licenses this file
+#       to you under the Apache License, Version 2.0 (the
+#       "License"); you may not use this file except in compliance
+#       with the License.  You may obtain a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#       Unless required by applicable law or agreed to in writing,
+#       software distributed under the License is distributed on an
+#       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#       KIND, either express or implied.  See the License for the
+#       specific language governing permissions and limitations
+#       under the License.
+
+from nose.tools import assert_equal
+
+from allura import model as M
+from allura.tests import decorators as td
+from alluratest.controller import setup_basic_test, setup_global_objects
+
+
+class TestActivityObject_Functional(object):
+    # NOTE not for unit tests, this class sets up all the junk
+
+    def setUp(self):
+        setup_basic_test()
+        setup_global_objects()
+
+    @td.with_wiki
+    def test_has_activity_access_app_config(self):
+        # AppConfig inherits ActivityObject but may have different attributes
+        # than other ActivityObjects that are mostly artifacts
+
+        p = M.Project.query.get(shortname='test')
+        wiki_app = p.app_instance('wiki')
+        app_config = wiki_app.config
+
+        assert_equal(bool(app_config.has_activity_access('read', user=M.User.anonymous(), activity=None)),
+                     True)
\ No newline at end of file