Skip to content

Commit

Permalink
Merge a9a3717 into 7f1f8b5
Browse files Browse the repository at this point in the history
  • Loading branch information
buchi committed Apr 9, 2017
2 parents 7f1f8b5 + a9a3717 commit ef2db2e
Show file tree
Hide file tree
Showing 6 changed files with 600 additions and 56 deletions.
5 changes: 3 additions & 2 deletions src/plone/restapi/deserializer/atcontent.py
Expand Up @@ -26,8 +26,9 @@ def __init__(self, context, request):
self.context = context
self.request = request

def __call__(self, validate_all=False):
data = json_body(self.request)
def __call__(self, validate_all=False, data=None):
if data is None:
data = json_body(self.request)

obj = self.context
modified = False
Expand Down
62 changes: 8 additions & 54 deletions src/plone/restapi/services/content/add.py
@@ -1,20 +1,16 @@
# -*- coding: utf-8 -*-
from DateTime import DateTime
from Products.CMFPlone.utils import base_hasattr
from plone.app.content.interfaces import INameFromTitle
from plone.restapi.deserializer import json_body
from plone.restapi.exceptions import DeserializationError
from plone.restapi.interfaces import ISerializeToJson
from plone.restapi.interfaces import IDeserializeFromJson
from plone.restapi.interfaces import ISerializeToJson
from plone.restapi.services import Service
from random import randint
from plone.restapi.services.content.utils import create
from plone.restapi.services.content.utils import rename
from zExceptions import BadRequest
from zope.component import queryMultiAdapter
from zope.container.interfaces import INameChooser
from zope.interface import alsoProvides

import plone.protect.interfaces
import transaction


class FolderPost(Service):
Expand All @@ -36,33 +32,12 @@ def reply(self):
alsoProvides(self.request,
plone.protect.interfaces.IDisableCSRFProtection)

# Generate a temporary id if the id is not given
if not id_:
now = DateTime()
new_id = '{}.{}.{}{:04d}'.format(
type_.lower().replace(' ', '_'),
now.strftime('%Y-%m-%d'),
str(now.millis())[7:],
randint(0, 9999))
else:
new_id = id_

# Create object
try:
new_id = self.context.invokeFactory(type_, new_id, title=title)
except BadRequest as e:
obj = create(self.context, type_, id_=id_, title=title)
if isinstance(obj, dict) and 'error' in obj:
self.request.response.setStatus(400)
return dict(error=dict(
type='DeserializationError',
message=str(e.message)))
except ValueError as e:
self.request.response.setStatus(400)
return dict(error=dict(
type='DeserializationError',
message=str(e.message)))
return obj

# Update fields
obj = self.context[new_id]
deserializer = queryMultiAdapter((obj, self.request),
IDeserializeFromJson)
if deserializer is None:
Expand All @@ -80,7 +55,7 @@ def reply(self):

# Rename if generated id
if not id_:
self.rename_object(obj)
rename(obj)

self.request.response.setStatus(201)
self.request.response.setHeader('Location', obj.absolute_url())
Expand All @@ -89,6 +64,7 @@ def reply(self):
(obj, self.request),
ISerializeToJson
)

serialized_obj = serializer()

# HypermediaBatch can't determine the correct canonical URL for
Expand All @@ -97,25 +73,3 @@ def reply(self):
serialized_obj['@id'] = obj.absolute_url()

return serialized_obj

def rename_object(self, obj):
# Archetypes objects may get renamed during deserialization.
# Do not rename again.
if (base_hasattr(obj, '_isIDAutoGenerated') and
not obj._isIDAutoGenerated(obj.getId())):
return

chooser = INameChooser(self.context)
# INameFromTitle adaptable objects should not get a name
# suggestion. NameChooser would prefer the given name instead of
# the one provided by the INameFromTitle adapter.
suggestion = None
name_from_title = INameFromTitle(obj, None)
if name_from_title is None:
if base_hasattr(obj, 'generateNewId'):
suggestion = obj.generateNewId()
else:
suggestion = obj.Title()
name = chooser.chooseName(suggestion, obj)
transaction.savepoint(optimistic=True)
self.context.manage_renameObject(obj.getId(), name)
39 changes: 39 additions & 0 deletions src/plone/restapi/services/content/configure.zcml
Expand Up @@ -70,6 +70,45 @@
permission="zope2.View"
/>

<plone:service
method="OPTIONS"
name="@upload"
for="Products.CMFCore.interfaces.IFolderish"
factory=".upload.UploadOptions"
permission="cmf.AddPortalContent"
/>

<plone:service
method="POST"
name="@upload"
for="Products.CMFCore.interfaces.IFolderish"
factory=".upload.UploadPost"
permission="cmf.AddPortalContent"
/>

<plone:service
method="HEAD"
name="@upload"
for="Products.CMFCore.interfaces.IFolderish"
factory=".upload.UploadHead"
permission="cmf.AddPortalContent"
/>

<plone:service
method="PATCH"
name="@upload"
for="Products.CMFCore.interfaces.IFolderish"
factory=".upload.UploadPatch"
permission="cmf.AddPortalContent"
/>

<!-- <plone:CORSPolicy
allow_origin="http://localhost"
allow_methods="DELETE,GET,OPTIONS,PATCH,POST,PUT"
allow_credentials="true"
allow_headers="Accept,Authorization,Origin,X-Requested-With,Content-Type,Upload-Length,Upload-Offset,Tus-Resumable,Upload-Metadata"
expose_headers="Upload-Offset,Location,Upload-Length,Tus-Version,Tus-Resumable,Tus-Max-Size,Tus-Extension,Upload-Metadata"
max_age="3600"
/> -->

</configure>

0 comments on commit ef2db2e

Please sign in to comment.