Support soft-deleting projects.

See http://python-eve.org/features.html#soft-delete for more info.
This commit is contained in:
Sybren A. Stüvel 2016-04-25 16:13:15 +02:00
parent 5116b74d1d
commit 31e802619e
2 changed files with 39 additions and 1 deletions

View File

@ -744,7 +744,8 @@ organizations = {
projects = { projects = {
'schema': projects_schema, 'schema': projects_schema,
'public_item_methods': ['GET'], 'public_item_methods': ['GET'],
'public_methods': ['GET'] 'public_methods': ['GET'],
'soft_delete': True,
} }
activities = { activities = {

View File

@ -5,6 +5,7 @@
import functools import functools
import json import json
import logging import logging
import urllib
from bson import ObjectId from bson import ObjectId
@ -237,6 +238,42 @@ class ProjectEditTest(AbstractProjectTest):
'If-Match': project['_etag']}) 'If-Match': project['_etag']})
self.assertEqual(403, resp.status_code, resp.data) self.assertEqual(403, resp.status_code, resp.data)
def test_delete_by_admin(self):
# Create test project.
project_info = self._create_user_and_project([u'subscriber'])
project_id = project_info['_id']
project_url = '/projects/%s' % project_id
# Create test user.
self._create_user_with_token(['admin'], 'admin-token', user_id='cafef00dbeef')
# Admin user should be able to DELETE.
resp = self.client.delete(project_url,
headers={'Authorization': self.make_header('admin-token'),
'If-Match': project_info['_etag']})
self.assertEqual(204, resp.status_code, resp.data)
# Check that the project is gone.
resp = self.client.get(project_url)
self.assertEqual(404, resp.status_code, resp.data)
# ... but we should still get it in the body.
db_proj = json.loads(resp.data)
self.assertEqual(u'Prøject El Niño', db_proj['name'])
self.assertTrue(db_proj['_deleted'])
# Querying for deleted projects should include it.
# Also see http://python-eve.org/features.html#soft-delete
projection = json.dumps({'name': 1, 'permissions': 1})
where = json.dumps({'_deleted': True}) # MUST be True, 1 does not work.
resp = self.client.get('/projects?where=%s&projection=%s' %
(urllib.quote(where), urllib.quote(projection)))
self.assertEqual(200, resp.status_code, resp.data)
projlist = json.loads(resp.data)
self.assertEqual(1, projlist['_meta']['total'])
self.assertEqual(u'Prøject El Niño', projlist['_items'][0]['name'])
def _create_user_and_project(self, roles): def _create_user_and_project(self, roles):
self._create_user_with_token(roles, 'token') self._create_user_with_token(roles, 'token')
resp = self._create_project(u'Prøject El Niño', 'token') resp = self._create_project(u'Prøject El Niño', 'token')