bug fixes: make file handling work correctly

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1385 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2006-10-04 11:15:20 +00:00
parent 2467793b66
commit 4358ef9f51
4 changed files with 38 additions and 17 deletions

View file

@ -32,12 +32,14 @@ from zope.app.container.contained import NameChooser
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.formlib.form import Form, EditForm, FormFields from zope.formlib.form import Form, EditForm, FormFields
from zope.publisher.browser import FileUpload
from zope.publisher.interfaces import BadRequest from zope.publisher.interfaces import BadRequest
from cybertools.ajax import innerHtml from cybertools.ajax import innerHtml
from cybertools.browser.form import FormController from cybertools.browser.form import FormController
from cybertools.typology.interfaces import IType from cybertools.typology.interfaces import IType
from loops.interfaces import IResourceManager, INote, IDocument from loops.concept import ResourceRelation
from loops.interfaces import IConcept, IResourceManager, INote, IDocument
from loops.browser.node import NodeView from loops.browser.node import NodeView
from loops.browser.concept import ConceptRelationView from loops.browser.concept import ConceptRelationView
from loops.resource import Resource from loops.resource import Resource
@ -128,8 +130,13 @@ class CreateObjectForm(ObjectForm, Form):
self.typeInterface = ifc self.typeInterface = ifc
return FormFields(ifc) return FormFields(ifc)
@property #@property
def assignments(self): def assignments(self):
target = self.virtualTargetObject
if (IConcept.providedBy(target) and
target.conceptType != self.loopsRoot.getConceptManager().getTypeConcept()):
rv = ConceptRelationView(ResourceRelation(target, None), self.request)
return (rv,)
return () return ()
@ -167,12 +174,14 @@ class EditObject(FormController):
for k in form.keys(): for k in form.keys():
if k.startswith(self.prefix): if k.startswith(self.prefix):
fn = k[len(self.prefix):] fn = k[len(self.prefix):]
if fn in ('action', 'type',) or fn.endswith('-empty-marker'): if fn in ('action', 'type', 'data.used') or fn.endswith('-empty-marker'):
continue continue
value = form[k] value = form[k]
if fn.startswith(self.conceptPrefix) and value: if fn.startswith(self.conceptPrefix) and value:
self.collectConcepts(fn[len(self.conceptPrefix):], value) self.collectConcepts(fn[len(self.conceptPrefix):], value)
else: else:
if isinstance(value, FileUpload):
value = value.read()
setattr(adapted, fn, value) setattr(adapted, fn, value)
if self.old or self.selected: if self.old or self.selected:
self.assignConcepts(obj) self.assignConcepts(obj)

View file

@ -1,5 +1,5 @@
<metal:block define-macro="edit"> <metal:block define-macro="edit">
<form method="post"> <form method="post" action="." enctype="multipart/form-data">
<input type="hidden" name="form.action" value="edit" <input type="hidden" name="form.action" value="edit"
tal:attributes="value view/form_action" /> tal:attributes="value view/form_action" />
<table cellpadding="3" class="form"> <table cellpadding="3" class="form">
@ -32,7 +32,7 @@
<metal:block define-macro="create"> <metal:block define-macro="create">
<form method="post"> <form method="post" action="." enctype="multipart/form-data">
<input type="hidden" name="form.action" value="create" <input type="hidden" name="form.action" value="create"
tal:attributes="value view/form_action" /> tal:attributes="value view/form_action" />
<table cellpadding="3" class="form"> <table cellpadding="3" class="form">
@ -108,9 +108,10 @@
<tr tal:repeat="relation view/assignments"> <tr tal:repeat="relation view/assignments">
<td colspan="5"> <td colspan="5">
<input type="hidden" name="form.assignments.old:list" <input type="hidden" name="form.assignments.old:list"
tal:attributes="value relation/uidToken" checked /> tal:attributes="value relation/uidToken"
<input type="checkbox" name="form.assignments.selected:list" tal:condition="relation/other" />
tal:attributes="value relation/uidToken" checked /> <input type="checkbox" checked name="form.assignments.selected:list"
tal:attributes="value relation/uidToken;" />
<span tal:content="relation/title">Something</span> <span tal:content="relation/title">Something</span>
(<span tal:content="relation/typeTitle">Topic</span>) (<span tal:content="relation/typeTitle">Topic</span>)
</td> </td>

View file

@ -46,7 +46,7 @@ from zope.event import notify
from cybertools.ajax import innerHtml from cybertools.ajax import innerHtml
from cybertools.browser import configurator from cybertools.browser import configurator
from cybertools.browser.view import GenericView from cybertools.browser.view import GenericView
from cybertools.typology.interfaces import ITypeManager from cybertools.typology.interfaces import IType, ITypeManager
from loops.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode from loops.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode
from loops.interfaces import IViewConfiguratorSchema from loops.interfaces import IViewConfiguratorSchema
from loops.resource import MediaAsset from loops.resource import MediaAsset
@ -74,8 +74,8 @@ class NodeView(BaseView):
cm.register('portlet_left', 'navigation', title='Navigation', cm.register('portlet_left', 'navigation', title='Navigation',
subMacro=self.template.macros['menu']) subMacro=self.template.macros['menu'])
if not IUnauthenticatedPrincipal.providedBy(self.request.principal): if not IUnauthenticatedPrincipal.providedBy(self.request.principal):
cm.register('portlet_right', 'clipboard', title='Clipboard', #cm.register('portlet_right', 'clipboard', title='Clipboard',
subMacro=self.template.macros['clipboard']) # subMacro=self.template.macros['clipboard'])
# this belongs to loops.organize; how to register portlets # this belongs to loops.organize; how to register portlets
# from sub- (other) packages? # from sub- (other) packages?
# see controller / configurator: use multiple configurators; # see controller / configurator: use multiple configurators;
@ -246,13 +246,17 @@ class NodeView(BaseView):
def targetDefaultView(self): def targetDefaultView(self):
target = self.virtualTargetObject target = self.virtualTargetObject
#target = self.request.annotations.get('loops.view', {}).get('target')
#if target is None:
# target = self.targetObject
if target is not None: if target is not None:
ti = IType(target).typeInterface
name = zapi.getDefaultViewName(target, self.request) name = zapi.getDefaultViewName(target, self.request)
targetView = zapi.getMultiAdapter((target, self.request), targetView = None
name=name) if ti is not None:
adapted = ti(target)
targetView = component.queryMultiAdapter((adapted, self.request),
name=name)
if targetView is None:
targetView = component.getMultiAdapter((target, self.request),
name=name)
if name == 'index.html' and hasattr(targetView, 'show'): if name == 'index.html' and hasattr(targetView, 'show'):
return targetView.show() return targetView.show()
return targetView() return targetView()

View file

@ -200,13 +200,20 @@ class FileAdapter(ResourceAdapterBase):
implements(IFile) implements(IFile)
_schemas = list(IFile) + list(IBaseResource) _schemas = list(IFile) + list(IBaseResource)
# let the adapter handle the data attribute:
_attributes = ResourceAdapterBase._attributes + ('data',)
def setData(self, data): self.context.data = data
def getData(self): return self.context.data
data = property(getData, setData)
class DocumentAdapter(ResourceAdapterBase): class DocumentAdapter(ResourceAdapterBase):
""" Common base class for all resource types with a text-like """ Common base class for all resource types with a text-like
data attribute. data attribute.
""" """
# let the adapter handle the data attribute:S # let the adapter handle the data attribute:
_attributes = ResourceAdapterBase._attributes + ('data',) _attributes = ResourceAdapterBase._attributes + ('data',)
def setData(self, data): self.context._data = data.replace('\r', '') def setData(self, data): self.context._data = data.replace('\r', '')