Skip to content

Commit

Permalink
Added versioning and trash folder for Wiki Pages using Shane's 'repoz…
Browse files Browse the repository at this point in the history
…itory'.

  Merged from 'branches/rossi_repozitory'.
  • Loading branch information
chrisrossi committed Aug 1, 2011
2 parents c1ad894 + 095fad6 commit 0619c7e
Show file tree
Hide file tree
Showing 25 changed files with 1,377 additions and 33 deletions.
24 changes: 24 additions & 0 deletions karl/content/models/configure.zcml
Expand Up @@ -164,6 +164,30 @@
factory=".adapters.TitleAndTextIndexData"
/>

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

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

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

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

<lemonade:content
factory=".wiki.Wiki"
type="karl.content.interfaces.IWiki"
Expand Down
47 changes: 45 additions & 2 deletions karl/content/models/files.py
Expand Up @@ -20,13 +20,16 @@

from persistent import Persistent
from BTrees.OOBTree import OOBTree

from repoze.bfg.traversal import model_path
from repoze.lemonade.content import create_content

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 Expand Up @@ -57,14 +60,20 @@ class CommunityFile(Persistent):
modified_by = None # Sorry, persistence
is_image = False # Sorry, persistence

def __init__(self, title, stream, mimetype, filename, creator=u''):
def __init__(self,
title=u'',
stream=None,
mimetype=u'',
filename=u'',
creator=u''):
self.title = unicode(title)
self.mimetype = mimetype
self.filename = filename
self.creator = unicode(creator)
self.modified_by = self.creator
self.blobfile = Blob()
self.upload(stream)
if stream is not None:
self.upload(stream)

def image(self):
assert self.is_image, "Not an image."
Expand Down Expand Up @@ -111,6 +120,18 @@ def _init_image(self):
self.is_image = False
noLongerProvides(self, IImage)

def revert(self, version):
# catalog document map blows up if you feed it a long int
self.docid = int(version.docid)
self.created = version.created
self.title = version.title
self.modified = version.modified
self.filename = version.attrs['filename']
self.mimetype = version.attrs['mimetype']
self.creator = version.attrs['creator']
self.modified_by = version.user
self.upload(version.blobs['blob'])


def upload_stream(stream, file):
size = 0
Expand Down Expand Up @@ -160,6 +181,28 @@ def _thumb_size(orig_size, max_size):
assert x < max_x
return x, y

class CommunityFileVersion(object):
implements(IObjectVersion)

def __init__(self, file):
self.title = file.title
self.description = None
self.created = file.created
self.modified = file.modified
self.docid = file.docid
self.path = model_path(file)
self.attrs = dict((name, getattr(file, name)) for name in [
'mimetype',
'filename',
'creator',
])
self.blobs = {'blob': file.blobfile.open()}
self.klass = type(file)
self.user = file.modified_by
if self.user is None:
self.user = file.creator
self.comment = None

class FilesToolFactory(ToolFactory):
implements(IToolFactory)
name = 'files'
Expand Down
85 changes: 85 additions & 0 deletions karl/content/models/tests/test_files.py
Expand Up @@ -150,6 +150,91 @@ def test_non_rgb_thumbnail(self):
thumb = o.thumbnail((200, 200))
self.assertEqual(thumb.image_size, (137, 200))

def test_revert(self):
from pkg_resources import resource_stream
o = self._makeOne(mimetype='image/gif')
class DummyVersion:
docid = 5l
created = 'created'
title = 'title'
modified = 'modified'
attrs = {
'filename': 'filename',
'mimetype': 'image/jpg',
'creator': 'creator'
}
user = 'user'
blobs = {'blob': resource_stream(
'karl.content.models.tests', 'test.jpg')}
self.failIf(o.is_image)
o.revert(DummyVersion)
self.assertEqual(o.docid, 5)
self.failUnless(type(o.docid) is int)
self.assertEqual(o.created, 'created')
self.assertEqual(o.title, 'title')
self.assertEqual(o.modified, 'modified')
self.assertEqual(o.filename, 'filename')
self.assertEqual(o.mimetype, 'image/jpg')
self.assertEqual(o.creator, 'creator')
self.assertEqual(o.modified_by, 'user')
self.failUnless(o.is_image)

def test_version(self):
from karl.content.models.files import CommunityFileVersion
o = self._makeOne()
o.title = 'title'
o.created = 'created'
o.modified = 'modified'
o.docid = 'docid'
o.filename = 'filename'
o.creator = 'creator'
o.mimetype = 'mimetype'
o.modified_by = 'user'
site = testing.DummyModel()
site['foo'] = o
version = CommunityFileVersion(o)
self.assertEqual(version.title, 'title')
self.assertEqual(version.description, None)
self.assertEqual(version.created, 'created')
self.assertEqual(version.modified, 'modified')
self.assertEqual(version.docid, 'docid')
self.assertEqual(version.path, '/foo')
self.assertEqual(version.attrs['filename'], 'filename')
self.assertEqual(version.attrs['creator'], 'creator')
self.assertEqual(version.attrs['mimetype'], 'mimetype')
self.assertEqual(version.blobs['blob'].read(), 'FAKECONTENT')
self.assertEqual(version.klass, type(o))
self.assertEqual(version.user, 'user')
self.assertEqual(version.comment, None)

def test_version_no_modified_by(self):
from karl.content.models.files import CommunityFileVersion
o = self._makeOne()
o.title = 'title'
o.created = 'created'
o.modified = 'modified'
o.docid = 'docid'
o.filename = 'filename'
o.creator = 'creator'
o.mimetype = 'mimetype'
o.modified_by = None
site = testing.DummyModel()
site['foo'] = o
version = CommunityFileVersion(o)
self.assertEqual(version.title, 'title')
self.assertEqual(version.description, None)
self.assertEqual(version.created, 'created')
self.assertEqual(version.modified, 'modified')
self.assertEqual(version.docid, 'docid')
self.assertEqual(version.path, '/foo')
self.assertEqual(version.attrs['filename'], 'filename')
self.assertEqual(version.attrs['creator'], 'creator')
self.assertEqual(version.attrs['mimetype'], 'mimetype')
self.assertEqual(version.blobs['blob'].read(), 'FAKECONTENT')
self.assertEqual(version.klass, type(o))
self.assertEqual(version.user, 'creator')
self.assertEqual(version.comment, None)

class TestThumbnail(unittest.TestCase):
def _getTargetClass(self):
from karl.content.models.files import Thumbnail
Expand Down
113 changes: 113 additions & 0 deletions karl/content/models/tests/test_wiki.py
Expand Up @@ -57,6 +57,25 @@ def test_delete_frontpage_makes_new_frontpage(self):
del wiki['front_page']
self.failUnless(isinstance(wiki['front_page'], DummyContent))

def test_container_version(self):
from karl.content.models.wiki import WikiContainerVersion
wiki = self._makeOne()
wiki.docid = 5
wiki['one'] = testing.DummyModel(docid=6)
wiki['two'] = testing.DummyModel(docid=7)
wiki['front_page'].docid = 8
root = testing.DummyModel()
root['foo'] = wiki
container = WikiContainerVersion(wiki)
self.assertEqual(container.container_id, 5)
self.assertEqual(container.path, '/foo')
self.assertEqual(container.map, {
'one': 6,
'two': 7,
'front_page': 8
})
self.assertEqual(container.ns_map, {})


class WikiPageTests(unittest.TestCase):

Expand Down Expand Up @@ -263,6 +282,100 @@ def test_get_attachements(self):
page = self._makeOne()
self.assertEqual(page.get_attachments(), page)

def test_revert(self):
class Version:
docid = 5l
created = 'created'
title = 'the title'
description = 'description'
modified = 'modified'
user = 'modified_by'
attrs = {
'text': 'wiki text',
'creator': 'creator'
}

page = self._makeOne()
page.revert(Version)
self.assertEqual(page.docid, 5)
self.failUnless(type(page.docid), int)
self.assertEqual(page.created, 'created')
self.assertEqual(page.title, 'the title')
self.assertEqual(page.description, 'description')
self.assertEqual(page.modified, 'modified')
self.assertEqual(page.modified_by, 'modified_by')
self.assertEqual(page.text, 'wiki text')
self.assertEqual(page.creator, 'creator')

def test_version(self):
from karl.content.models.wiki import WikiPageVersion
page = self._makeOne()
page.title = 'the title'
page.description = 'description'
page.created = 'created'
page.modified = 'modified'
page.docid = 5
page.text = 'wiki text'
page.creator = 'creator'
page.modified_by = 'modified_by'
container = testing.DummyModel()
container['foo'] = page
version = WikiPageVersion(page)
self.assertEqual(version.title, 'the title')
self.assertEqual(version.description, 'description')
self.assertEqual(version.created, 'created')
self.assertEqual(version.modified, 'modified')
self.assertEqual(version.docid, 5)
self.assertEqual(version.path, '/foo')
self.assertEqual(version.attrs['text'], 'wiki text')
self.assertEqual(version.attrs['creator'], 'creator')
self.assertEqual(version.attachments, None)
self.assertEqual(version.klass, type(page))
self.assertEqual(version.user, 'modified_by')
self.assertEqual(version.comment, None)

def test_version_no_modified_by(self):
from karl.content.models.wiki import WikiPageVersion
page = self._makeOne()
page.title = 'the title'
page.description = 'description'
page.created = 'created'
page.modified = 'modified'
page.docid = 5
page.text = 'wiki text'
page.creator = 'creator'
page.modified_by = None
container = testing.DummyModel()
container['foo'] = page
version = WikiPageVersion(page)
self.assertEqual(version.title, 'the title')
self.assertEqual(version.description, 'description')
self.assertEqual(version.created, 'created')
self.assertEqual(version.modified, 'modified')
self.assertEqual(version.docid, 5)
self.assertEqual(version.path, '/foo')
self.assertEqual(version.attrs['text'], 'wiki text')
self.assertEqual(version.attrs['creator'], 'creator')
self.assertEqual(version.attachments, None)
self.assertEqual(version.klass, type(page))
self.assertEqual(version.user, 'creator')
self.assertEqual(version.comment, None)

def test_container_version(self):
from karl.content.models.wiki import WikiPageContainerVersion
root = testing.DummyModel()
page = self._makeOne()
root['foo'] = page
page.docid = 5
page['one'] = testing.DummyModel(docid=6)
page['two'] = testing.DummyModel(docid=7)
container = WikiPageContainerVersion(page)
self.assertEqual(container.container_id, 5)
self.assertEqual(container.path, '/foo')
self.assertEqual(container.map, {'one': 6, 'two': 7})
self.assertEqual(container.ns_map, {})


class TestWikiToolFactory(unittest.TestCase):
def setUp(self):
cleanUp()
Expand Down

0 comments on commit 0619c7e

Please sign in to comment.