Skip to content

Commit

Permalink
Make the repozitory optional.
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisrossi committed Aug 1, 2011
1 parent 424ce1a commit 66a7acf
Show file tree
Hide file tree
Showing 14 changed files with 95 additions and 45 deletions.
8 changes: 4 additions & 4 deletions karl/content/models/configure.zcml
Expand Up @@ -166,25 +166,25 @@

<adapter
for="karl.content.interfaces.IWikiPage"
provides="repozitory.interfaces.IObjectVersion"
provides="karl.models.interfaces.IObjectVersion"
factory=".wiki.WikiPageVersion"
/>

<adapter
for="karl.content.interfaces.IWiki"
provides="repozitory.interfaces.IContainerVersion"
provides="karl.models.interfaces.IContainerVersion"
factory=".wiki.WikiContainerVersion"
/>

<adapter
for="karl.content.interfaces.IWikiPage"
provides="repozitory.interfaces.IContainerVersion"
provides="karl.models.interfaces.IContainerVersion"
factory=".wiki.WikiPageContainerVersion"
/>

<adapter
for="karl.content.interfaces.ICommunityFile"
provides="repozitory.interfaces.IObjectVersion"
provides="karl.models.interfaces.IObjectVersion"
factory=".files.CommunityFileVersion"
/>

Expand Down
2 changes: 1 addition & 1 deletion karl/content/models/files.py
Expand Up @@ -23,13 +23,13 @@

from repoze.bfg.traversal import model_path
from repoze.lemonade.content import create_content
from repozitory.interfaces import IObjectVersion

from zope.interface import alsoProvides
from zope.interface import implements
from zope.interface import noLongerProvides

from karl.content.interfaces import IImage
from karl.models.interfaces import IObjectVersion
from karl.models.tool import ToolFactory
from karl.models.interfaces import IToolFactory

Expand Down
4 changes: 2 additions & 2 deletions karl/content/models/wiki.py
Expand Up @@ -23,8 +23,8 @@
from repoze.bfg.security import authenticated_userid
from repoze.bfg.traversal import model_path
from repoze.lemonade.content import create_content
from repozitory.interfaces import IContainerVersion
from repozitory.interfaces import IObjectVersion
from karl.models.interfaces import IContainerVersion
from karl.models.interfaces import IObjectVersion

from repoze.folder import Folder
from zope.interface import implements
Expand Down
6 changes: 4 additions & 2 deletions karl/content/views/templates/show_wikipage.pt
Expand Up @@ -21,8 +21,10 @@
<div metal:use-macro="api.snippets.macros['actions_box']"/>
<span class="contentbar-menu">
<a href="${api.here_url}.." tal:omit-tag="is_front_page">Front Page</a> |
<a href="${api.here_url}../wikitoc.html">Index</a> |
<a href="${api.here_url}../trash.html">Trash</a>
<a href="${api.here_url}../wikitoc.html">Index</a>
<tal:block condition="show_trash"> |
<a href="${api.here_url}../trash.html">Trash</a>
</tal:block>
</span>
</div>

Expand Down
35 changes: 31 additions & 4 deletions karl/content/views/tests/test_wiki.py
Expand Up @@ -40,7 +40,6 @@ def test_it(self):
response = self._callFUT(context, request)
self.assertEqual(response.location, 'http://example.com/front_page/')


class Test_redirect_to_add_form(unittest.TestCase):

def _callFUT(self, context, request):
Expand Down Expand Up @@ -191,7 +190,7 @@ def test_frontpage(self):
context.__parent__ = DummyCommunity()
request = testing.DummyRequest()
response = self._callFUT(context, request)
self.assertEqual(len(response['actions']), 3)
self.assertEqual(len(response['actions']), 2)
self.assertEqual(response['actions'][0][1], 'edit.html')
# Front page should not have backlink breadcrumb thingy
self.assert_(response['backto'] is False)
Expand All @@ -207,7 +206,25 @@ def test_otherpage(self):
from webob.multidict import MultiDict
request.params = request.POST = MultiDict()
response = self._callFUT(context, request)
self.assertEqual(len(response['actions']), 4)
self.assertEqual(len(response['actions']), 3)
self.assertEqual(response['actions'][0][1], 'edit.html')
self.assertEqual(response['actions'][1][1], 'delete.html')
# Backlink breadcrumb thingy should appear on non-front-page
self.assert_(response['backto'] is not False)

def test_otherpage_w_repo(self):
self._register()
renderer = testing.registerDummyRenderer('templates/show_wikipage.pt')
context = testing.DummyModel(title='Other Page')
context.__parent__ = testing.DummyModel(title='Front Page')
context.__parent__.__name__ = 'front_page'
context.__name__ = 'other_page'
context.repo = object()
request = testing.DummyRequest()
from webob.multidict import MultiDict
request.params = request.POST = MultiDict()
response = self._callFUT(context, request)
self.assertEqual(len(response['actions']), 3)
self.assertEqual(response['actions'][0][1], 'edit.html')
self.assertEqual(response['actions'][1][1], 'delete.html')
# Backlink breadcrumb thingy should appear on non-front-page
Expand Down Expand Up @@ -366,9 +383,16 @@ class Test_preview_wikipage_view(unittest.TestCase):
def setUp(self):
cleanUp()

from karl.content.views import wiki
self._save_transaction = wiki.transaction
wiki.transaction = DummyTransactionManager()

def tearDown(self):
cleanUp()

from karl.content.views import wiki
wiki.transaction = self._save_transaction

def _callFUT(self, context, request):
from karl.content.views.wiki import preview_wikipage_view as fut
return fut(context, request, WikiPage=DummyWikiPage)
Expand Down Expand Up @@ -475,8 +499,11 @@ def history(self, docid):
archive_time=datetime.datetime(2010, 5, 12, 2, 42),
)]


class Dummy(object):

def __init__(self, **kw):
self.__dict__.update(kw)

class DummyTransactionManager(object):
def doom(self):
pass
4 changes: 3 additions & 1 deletion karl/content/views/wiki.py
Expand Up @@ -253,7 +253,8 @@ def show_wikipage_view(context, request):
actions.append(('Edit', 'edit.html'))
if has_permission('delete', context, request) and not is_front_page:
actions.append(('Delete', 'delete.html'))
if has_permission('edit', context, request):
repo = find_repo(context)
if repo is not None and has_permission('edit', context, request):
actions.append(('History', 'history.html'))
if has_permission('administer', context, request):
actions.append(('Advanced', 'advanced.html'))
Expand All @@ -273,6 +274,7 @@ def show_wikipage_view(context, request):
feed_url=feed_url,
backto=backto,
is_front_page=is_front_page,
show_trash=repo is not None,
)


Expand Down
9 changes: 4 additions & 5 deletions karl/evolve/zodb/evolve38.py
@@ -1,9 +1,9 @@
from repoze.bfg.traversal import model_path
from repoze.folder.interfaces import IFolder
from repozitory.interfaces import IContainerVersion
from repozitory.interfaces import IObjectVersion
from zope.component import queryAdapter

from karl.models.interfaces import IContainerVersion
from karl.models.interfaces import IObjectVersion
from karl.utils import find_repo
from karl.utils import get_setting

Expand All @@ -12,9 +12,8 @@ def evolve(site):
"""
Initialize repozitory.
"""
has_repo = get_setting(site, 'repozitory_db_string') is not None
if has_repo:
repo = find_repo(site)
repo = find_repo(site)
if repo is not None:
init_repo(repo, site)


Expand Down
11 changes: 11 additions & 0 deletions karl/models/interfaces.py
Expand Up @@ -594,3 +594,14 @@ def checked(principals, created_by):
def push(**kw):
""" Append an mapping to the stack.
"""

# Reproduce repozitory interfaces here in order to be able to hedge instances
# where repozitory is not available.
try:
from repozitory.interfaces import IContainerVersion
from repozitory.interfaces import IObjectVersion
except ImportError:
class IContainerVersion(Interface):
pass
class IObjectVersion(Interface):
pass
22 changes: 16 additions & 6 deletions karl/models/site.py
Expand Up @@ -37,7 +37,6 @@
from repoze.lemonade.content import IContent
from repoze.session.manager import SessionDataManager
from repoze.who.plugins.zodb.users import Users
from repozitory.archive import Archive
from zope.interface import implements
from zope.interface import providedBy
from zope.interface.declarations import Declaration
Expand Down Expand Up @@ -70,6 +69,12 @@
from karl.utils import find_tags
from karl.utils import find_users

try:
from repozitory.archive import Archive
except ImportError:
Archive = None


class UserEvent(object):
def __init__(self, site, id, login, groups, old_groups=None):
self.site = site
Expand Down Expand Up @@ -358,14 +363,18 @@ def db_string(self):
def kwargs(self):
return {}


Uninitialized = object()


class Site(Folder):
implements(ISite, ILocation)
__name__ = None
__parent__ = None
__acl__ = [(Allow, Authenticated, 'view')]
title = 'Site'
list_aliases = None
_repo = None
_repo = Uninitialized

def __init__(self):
super(Site, self).__init__()
Expand All @@ -384,15 +393,16 @@ def __init__(self):
self.sessions = SessionDataManager(3600, 5)
self.filestore = PersistentMapping()
self.list_aliases = OOBTree()
self._repo = Archive(RepozitoryEngineParams())

@property
def repo(self):
if get_settings().get('repozitory_db_string') is None:
return None

# Create self._repo on demand.
repo = self._repo
if repo is not None:
return repo
self._repo = repo = Archive(RepozitoryEngineParams())
if repo is Uninitialized:
self._repo = repo = Archive(RepozitoryEngineParams())
return repo

def update_indexes(self):
Expand Down
4 changes: 2 additions & 2 deletions karl/models/subscribers.py
Expand Up @@ -31,9 +31,9 @@
from repoze.bfg.traversal import find_interface
from repoze.folder.interfaces import IFolder
from repoze.lemonade.content import is_content
from repozitory.interfaces import IContainerVersion
from repozitory.interfaces import IObjectVersion

from karl.models.interfaces import IContainerVersion
from karl.models.interfaces import IObjectVersion
from karl.models.interfaces import ILetterManager
from karl.models.interfaces import ICommunity
from karl.models.interfaces import IProfile
Expand Down
15 changes: 5 additions & 10 deletions karl/models/tests/test_site.py
Expand Up @@ -187,27 +187,22 @@ def test_verify_constructor(self):
self.failUnless(hasattr(site, 'catalog'))
self.failUnless('people' in site)

def test_repo(self):
from karl.models.site import RepozitoryEngineParams
testing.registerSettings({'repozitory_db_string': 'dbstring'})
def test_no_repo(self):
testing.registerSettings({})
self._registerUtilities()
site = self._makeOne()
archive = site.repo
self.assertEqual(archive.params.db_string, 'dbstring')
self.assertEqual(archive.params.kwargs, {})
self.failUnless(site.repo is archive)
self.assertEqual(site.repo, None)

def test_repo_bbb_persistence(self):
from karl.models.site import RepozitoryEngineParams
def test_repo(self):
testing.registerSettings({'repozitory_db_string': 'dbstring'})
self._registerUtilities()
site = self._makeOne()
site._repo = None
archive = site.repo
self.assertEqual(archive.params.db_string, 'dbstring')
self.assertEqual(archive.params.kwargs, {})
self.failUnless(site.repo is archive)


class TestGetTextRepr(unittest.TestCase):
def setUp(self):
cleanUp()
Expand Down
10 changes: 5 additions & 5 deletions karl/models/tests/test_subscribers.py
Expand Up @@ -321,7 +321,7 @@ def test_with_icommunity(self):
def test_content_object_w_repo(self):
from zope.interface import directlyProvides
from repoze.lemonade.interfaces import IContent
from repozitory.interfaces import IObjectVersion
from karl.models.interfaces import IObjectVersion
testing.registerAdapter(DummyAdapter, IContent, IObjectVersion)
model = testing.DummyModel()
model.repo = DummyArchive()
Expand Down Expand Up @@ -428,7 +428,7 @@ def setUp(self):
cleanUp()

from zope.interface import Interface
from repozitory.interfaces import IObjectVersion
from karl.models.interfaces import IObjectVersion
testing.registerAdapter(DummyAdapter, Interface, IObjectVersion)

def tearDown(self):
Expand All @@ -451,7 +451,7 @@ def test_new_non_container(self):
self.assertEqual(archive.archived, [model])

def test_new_container(self):
from repozitory.interfaces import IContainerVersion
from karl.models.interfaces import IContainerVersion
from zope.interface import Interface
testing.registerAdapter(DummyAdapter, Interface, IContainerVersion)
parent = testing.DummyModel()
Expand All @@ -465,7 +465,7 @@ def test_new_container(self):

def test_new_container_with_children(self):
from repoze.folder.interfaces import IFolder
from repozitory.interfaces import IContainerVersion
from karl.models.interfaces import IContainerVersion
from zope.interface import Interface
from zope.interface import directlyProvides
testing.registerAdapter(DummyAdapter, Interface, IContainerVersion)
Expand All @@ -487,7 +487,7 @@ def setUp(self):
cleanUp()

from zope.interface import Interface
from repozitory.interfaces import IContainerVersion
from karl.models.interfaces import IContainerVersion
testing.registerAdapter(DummyAdapter, Interface, IContainerVersion)

def tearDown(self):
Expand Down
9 changes: 7 additions & 2 deletions karl/views/versions.py
Expand Up @@ -4,14 +4,19 @@
from webob.exc import HTTPFound
from repoze.bfg.security import authenticated_userid
from repoze.bfg.url import model_url
from repozitory.interfaces import IContainerVersion
from sqlalchemy.orm.exc import NoResultFound
from karl.models.interfaces import IContainerVersion

from karl.models.subscribers import index_content
from karl.utils import find_repo
from karl.utils import find_profiles
from karl.views.api import TemplateAPI

try:
from sqlalchemy.orm.exc import NoResultFound
except ImportError:
class NoResultFound(Exception):
pass


def show_history(context, request):
repo = find_repo(context)
Expand Down
1 change: 0 additions & 1 deletion setup.py
Expand Up @@ -58,7 +58,6 @@
'repoze.whoplugins.zodb',
'repoze.workflow',
'repoze.zodbconn',
'repozitory',
'setuptools',
'simplejson',
'ZODB3',
Expand Down

0 comments on commit 66a7acf

Please sign in to comment.