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:
parent
2467793b66
commit
4358ef9f51
4 changed files with 38 additions and 17 deletions
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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', '')
|
||||||
|
|
Loading…
Add table
Reference in a new issue