Skip to content

Commit

Permalink
Edit and delete work, dragging and resize too
Browse files Browse the repository at this point in the history
  • Loading branch information
do3cc committed Sep 27, 2012
1 parent 2adf1be commit e029d8d
Show file tree
Hide file tree
Showing 13 changed files with 218 additions and 101 deletions.
4 changes: 2 additions & 2 deletions develop.cfg
Expand Up @@ -18,12 +18,12 @@ eggs =
# Post-mortem debugging
Products.PDBDebugMode
# Debugging on the fly
iw.debug
# iw.debug
# Information where a deadlock occurs
# z3c.deadlockdebugger

zcml =
iw.debug
# iw.debug

parts +=
# test
Expand Down
1 change: 1 addition & 0 deletions setup.py
Expand Up @@ -40,6 +40,7 @@
'Products.CMFPlone',
'collective.js.backbone',
'collective.js.underscore',
'collective.js.jqueryui',
# -*- Extra requirements: -*-
],
extras_require={'test': ['plone.app.testing']},
Expand Down
33 changes: 33 additions & 0 deletions src/collective/noticeboard/adapters.py
Expand Up @@ -3,6 +3,8 @@
from persistent.dict import PersistentDict
from zope.annotation.interfaces import IAnnotations
from zope.component import getMultiAdapter
from zope.interface import implements
from collective.noticeboard.interfaces import INote

ANNOTATION_KEY = 'collective.noticeboard'

Expand All @@ -19,6 +21,7 @@ def image_tag(object, field):


class BaseNoteAdapter(object):
implements(INote)
def __init__(self, context):
self.context = context
try:
Expand All @@ -45,6 +48,22 @@ def position_y(self):
def position_y(self, value):
self.annotations['position_y'] = int(value)

@property
def height(self):
return self.annotations.get('height', 50)

@height.setter
def height(self, value):
self.annotations['height'] = int(value)

@property
def width(self):
return self.annotations.get('width', 200)

@width.setter
def width(self, value):
self.annotations['width'] = int(value)

@property
def id_(self):
return self.context.id
Expand All @@ -53,6 +72,20 @@ def id_(self):
def url(self):
return self.context.absolute_url()

@property
def jsonable(self):
return dict(
title=self.title,
url=self.context.absolute_url() + '/xx',
id=self.id_,
description=self.description,
text=self.text,
image_tag=self.image_tag,
height=self.height,
width=self.width,
position_x=self.position_x,
position_y=self.position_y,
)

class ArchetypesNoteAdapter(BaseNoteAdapter):

Expand Down
13 changes: 3 additions & 10 deletions src/collective/noticeboard/browser/configure.zcml
Expand Up @@ -32,18 +32,11 @@
permission="zope2.View" />

<browser:page
for="collective.noticeboard.interfaces.INoteMarker"
name="PUT"
class=".noteviews.NoticePUTView"
for="*"
name="json"
class=".noteviews.NoticeJSONView"
permission="zope2.View" />

<view
for="collective.noticeboard.interfaces.INoticeboard"
type="zope.publisher.interfaces.browser.IBrowserRequest"
provides="zope.publisher.interfaces.browser.IBrowserPublisher"
factory=".traversers.BoardTraverser"
permission="zope2.View"
/>


<!-- non-displaytype views -->
Expand Down
20 changes: 19 additions & 1 deletion src/collective/noticeboard/browser/noteviews.py
@@ -1,14 +1,28 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-

from Products.Five.browser import BrowserView
import json
from logging import getLogger

from collective.noticeboard.interfaces import INote

logging = getLogger(__name__)


class NoticePUTView(BrowserView):
class NoticeJSONView(BrowserView):

def __call__(self):
actions = dict(PUT=self.put, GET=self.get)
note = INote(self.context)
return json.dumps(actions[self.request.getHeader('HTTP_X_HTTP_METHOD_OVERRIDE', "GET"
)](note))

def get(self, note):
logging.info('Object retrieved %s' % str(note.jsonable))
return note.jsonable

def put(self, note):
pos = self.request.stdin.tell()
self.request.stdin.seek(0)
try:
Expand All @@ -18,3 +32,7 @@ def __call__(self):
note = INote(self.context)
note.position_x = data['position_x']
note.position_y = data['position_y']
note.height = data['height']
note.width = data['width']
logging.info('Object updated %s' % str(data))
return True
40 changes: 23 additions & 17 deletions src/collective/noticeboard/browser/noticeboardview.py
Expand Up @@ -2,17 +2,22 @@
# -*- coding: utf-8 -*-

from Acquisition import aq_inner

# from Products.CMFPlone.utils import getToolByName

from Products.Five.browser import BrowserView
import json

from collective.noticeboard.interfaces import INote, INoteMarker
from collective.noticeboard.interfaces import INote
from collective.noticeboard.settings import NoticeboardSettings

from plone.app.collection.interfaces import ICollection
from Products.ATContentTypes.interface import IATTopic
# from plone.app.contentlisting.interfaces import IContentListing
# from zope.component.hooks import getSite
from AccessControl import getSecurityManager
from Products.CMFCore import permissions
from zope.i18nmessageid import MessageFactory

PMF = MessageFactory('plone')


class NoticeboardView(BrowserView):
Expand All @@ -27,21 +32,25 @@ class NoticeboardNotes(BrowserView):
def __call__(self):
self.request.response.setHeader('Content-Type',
'application/json; charset=utf-8')
if self.request.REQUEST_METHOD == 'POST':
return self.handle_change()

# if self.request.REQUEST_METHOD == 'POST': return self.handle_change()

retval = []
items = self.contents()
check_perm = getSecurityManager().checkPermission
for item in items:
# if INoteMarker.providedBy(item):
actions = []
if check_perm(permissions.DeleteObjects, item):
actions.append(dict(title=PMF('Delete'), class_='delete'
, url=item.absolute_url()
+ '/delete_confirmation'))
if check_perm(permissions.ModifyPortalContent, item):
actions.append(dict(title=PMF('Edit'), class_='edit',
url=item.absolute_url() + '/edit'))
note = INote(item)
retval.append(dict(
url=note.url,
title=note.title,
description=note.description,
text=note.text,
image_tag=note.image_tag,
position_x=note.position_x,
position_y=note.position_y))
notedata = note.jsonable
notedata.update(dict(actions=actions))
retval.append(notedata)
return json.dumps(retval)

def contents(self):
Expand All @@ -53,6 +62,3 @@ def contents(self):
else:
items = context.getFolderContents(full_objects=True)
return items

def handle_change(self):
pass
13 changes: 8 additions & 5 deletions src/collective/noticeboard/browser/templates/noticeboard.pt
Expand Up @@ -72,7 +72,11 @@
<div id="content">
<div class="templates">
<div id="note_template" class="hiddenStructure">
<div class="note" style="{{css}}">
<ul class="actions">
{{#actions}}
<li class="{{class_}}"><a href="{{url}}">{{title}}</a></li>
{{/actions}}
</ul>
<h3>{{title}}</h3>
{{#description}}
<p class="documentDescription">{{description}}</p>
Expand All @@ -83,14 +87,13 @@
{{/image_tag}}

{{{text}}}
<a href="{{url}}/edit">edit</a>
</div>
</div>
<span id="viewsettings"><a href="select_default_view">layout</a></span>
<span id="notesettings"><a href="noticeboard-settings">board settings</a></span>
<span id="viewsettings"><a href="createObject?type_name=News+Item">Add</a></span>
<span id="add"><a href="createObject?type_name=News+Item">Add</a></span>
<div id="noticeboardcanvas" data-href=""
tal:attributes="data-href string:${context/absolute_url}/noticeboardnotes"></div>
tal:attributes="data-href string:${context/absolute_url}/noticeboardnotes;
data-hrefitem context/absolute_url"></div>
<script type="text/javascript">
$(document).ready(function(){
noticeboard.init($("#noticeboardcanvas"), $("#note_template"));
Expand Down
29 changes: 26 additions & 3 deletions src/collective/noticeboard/browser/traversers.py
Expand Up @@ -7,7 +7,7 @@
IBrowserPublisher
from ZPublisher.BaseRequest import DefaultPublishTraverse

from collective.noticeboard.interfaces import INoticeboard
from collective.noticeboard.interfaces import INoticeboard, INote


class BoardTraverser(object):
Expand All @@ -25,10 +25,13 @@ def browserDefault(self, request):
return (self.context, ('index_html', ))

def publishTraverse(self, request, name):
if name == 'noticeboardnotes' and self.request.method \
not in ['GET']:
if name == 'noticeboardnotes':
import pdb;pdb.set_trace()
if name == 'noticeboardnotes' and not request.URL.endswith('noticeboardnotes'):
if self.request.method == 'PUT':
return PUTTraverser(self.context, self.request)
if self.request.method == 'GET':
return GETTraverser(self.context, self.request)
return DefaultPublishTraverse(self.context,
self.request).publishTraverse(self.request, name)

Expand All @@ -50,3 +53,23 @@ def browserDefault(self, request):
def publishTraverse(self, request, name):
return getMultiAdapter((self.context[name], self.request),
name='PUT')


class GETTraverser(object):

'''Injects the right browser views for GET requests '''

adapts(INoticeboard, IBrowserRequest)
implements(IBrowserPublisher)

def __init__(self, context, request):
self.context = context
self.request = request

def browserDefault(self, request):
return (self.context, ('index_html', ))

def publishTraverse(self, request, name):
return getMultiAdapter((self.context[name], self.request),
name='GET')

2 changes: 0 additions & 2 deletions src/collective/noticeboard/configure.zcml
Expand Up @@ -71,8 +71,6 @@
profile="collective.noticeboard:default"
/> -->

<interface interface=".interfaces.INoteMarker" />

<adapter for="Products.ATContentTypes.interfaces.interfaces.IATContentType"
provides=".interfaces.INote"
factory=".adapters.ArchetypesNoteAdapter" />
Expand Down
7 changes: 1 addition & 6 deletions src/collective/noticeboard/interfaces.py
Expand Up @@ -34,9 +34,4 @@ class INote(Interface):
image_tag = Attribute('The image tag')
position_x = Attribute('Position X')
position_y = Attribute('Position Y')
id_ = Attribute('An identifier to recognize an object again')


class INoteMarker(Interface):
'''
'''
id_ = Attribute('An identifier to recognize an object again')
1 change: 1 addition & 0 deletions src/collective/noticeboard/profiles/default/metadata.xml
Expand Up @@ -4,5 +4,6 @@
<dependencies>
<dependency>profile-collective.js.underscore:default</dependency>
<dependency>profile-collective.js.backbone:default</dependency>
<dependency>profile-collective.js.jqueryui:default</dependency>
</dependencies>
</metadata>
3 changes: 0 additions & 3 deletions src/collective/noticeboard/resources/noticeboard.css
@@ -1,9 +1,6 @@
.note {
border: 1px solid #ccc;
width: 350px;
padding: 0.5em;
max-height: 500px;
overflow: auto;
}

#content .note .documentDescription {
Expand Down

0 comments on commit e029d8d

Please sign in to comment.