Sfoglia il codice sorgente

[doc2] Add an update_document endpoint

POST /desktop/api2/doc/update/

required: uuid
optional:
 name
 description

Requires attributes to be explicitly whitelisted, currently only accepts: name, description
Jenny Kim 9 anni fa
parent
commit
abf93921d0

+ 26 - 0
desktop/core/src/desktop/api2.py

@@ -195,6 +195,32 @@ def create_directory(request):
   })
 
 
+@api_error_handler
+@require_POST
+def update_document(request):
+  uuid = json.loads(request.POST.get('uuid'))
+
+  if not uuid:
+    raise PopupException(_('update_document requires uuid'))
+
+  document = Document2.objects.get_by_uuid(uuid=uuid)
+  document.can_write_or_exception(request.user)
+
+  whitelisted_attrs = ['name', 'description']
+
+  for attr in whitelisted_attrs:
+    if request.POST.get(attr):
+      setattr(document, attr, request.POST.get(attr))
+
+  document.save(update_fields=whitelisted_attrs)
+
+  return JsonResponse({
+    'status': 0,
+    'document': document.to_dict()
+  })
+
+
+
 @api_error_handler
 @require_POST
 def delete_document(request):

+ 30 - 0
desktop/core/src/desktop/tests_doc2.py

@@ -209,6 +209,36 @@ class TestDocument2(object):
     assert_equal(2, len(data['children']))
 
 
+  def test_update_document(self):
+    doc = Document2.objects.create(
+      name='initial',
+      description='initial desc',
+      type='query-hive',
+      owner=self.user,
+      data={},
+      parent_directory=self.home_dir
+    )
+
+    response = self.client.get('/desktop/api2/doc/', {'uuid': doc.uuid})
+    data = json.loads(response.content)
+    assert_equal('initial', data['document']['name'])
+    assert_equal('initial desc', data['document']['description'])
+    assert_equal('query-hive', data['document']['type'])
+
+    # Update document's name and description
+    response = self.client.post('/desktop/api2/doc/update', {'uuid': json.dumps(doc.uuid),
+                                                             'name': 'updated',
+                                                             'description': 'updated desc',
+                                                             'type': 'bogus-type'})
+    data = json.loads(response.content)
+    assert_equal(0, data['status'])
+    assert_true('document' in data, data)
+    assert_equal('updated', data['document']['name'], data)
+    assert_equal('updated desc', data['document']['description'], data)
+    # Non-whitelisted attributes should remain unchanged
+    assert_equal('query-hive', data['document']['type'], data)
+
+
   def test_document_trash(self):
     # Create document under home and directory under home with child document
     # /

+ 1 - 0
desktop/core/src/desktop/urls.py

@@ -121,6 +121,7 @@ dynamic_patterns += patterns('desktop.api2',
 
   (r'^desktop/api2/doc/move/?$', 'move_document'),
   (r'^desktop/api2/doc/mkdir/?$', 'create_directory'),
+  (r'^desktop/api2/doc/update/?$', 'update_document'),
   (r'^desktop/api2/doc/delete/?$', 'delete_document'),
   (r'^desktop/api2/doc/share/?$', 'share_document'),