def create(self): """Create a new collection resource and return it. :URL: ``POST /collections`` :request body: JSON object representing the collection to create. :returns: the newly created collection. """ try: unrestricted_users = h.get_unrestricted_users() user = session['user'] schema = CollectionSchema() values = json.loads(unicode(request.body, request.charset)) collections_referenced = get_collections_referenced( values['contents'], user, unrestricted_users) values = add_contents_unpacked_to_values(values, collections_referenced) values = add_form_ids_list_to_values(values) state = h.get_state_object(values) data = schema.to_python(values, state) collection = create_new_collection(data, collections_referenced) Session.add(collection) Session.commit() return collection.get_full_dict() except h.JSONDecodeError: response.status_int = 400 return h.JSONDecodeErrorResponse except InvalidCollectionReferenceError, e: response.status_int = 400 return { 'error': u'Invalid collection reference error: there is no collection with id %d' % e.args[0] }
def create(self): """Create a new collection resource and return it. :URL: ``POST /collections`` :request body: JSON object representing the collection to create. :returns: the newly created collection. """ try: unrestricted_users = h.get_unrestricted_users() user = session['user'] schema = CollectionSchema() values = json.loads(unicode(request.body, request.charset)) collections_referenced = get_collections_referenced(values['contents'], user, unrestricted_users) values = add_contents_unpacked_to_values(values, collections_referenced) values = add_form_ids_list_to_values(values) state = h.get_state_object(values) data = schema.to_python(values, state) collection = create_new_collection(data, collections_referenced) Session.add(collection) Session.commit() return collection.get_full_dict() except h.JSONDecodeError: response.status_int = 400 return h.JSONDecodeErrorResponse except InvalidCollectionReferenceError, e: response.status_int = 400 return {'error': u'Invalid collection reference error: there is no collection with id %d' % e.args[0]}
def update(self, id): """Update a collection and return it. :URL: ``PUT /collections/id`` :Request body: JSON object representing the collection with updated attribute values. :param str id: the ``id`` value of the collection to be updated. :returns: the updated collection model. """ collection = h.eagerload_collection(Session.query(Collection), eagerload_forms=True).get(int(id)) if collection: unrestricted_users = h.get_unrestricted_users() user = session['user'] if h.user_is_authorized_to_access_model(user, collection, unrestricted_users): try: schema = CollectionSchema() values = json.loads(unicode(request.body, request.charset)) collections_referenced = get_collections_referenced( values['contents'], user, unrestricted_users, id) values = add_contents_unpacked_to_values(values, collections_referenced) values = add_form_ids_list_to_values(values) state = h.get_state_object(values) data = schema.to_python(values, state) collection_dict = collection.get_full_dict() collection, restricted, contents_changed = update_collection( collection, data, collections_referenced) # collection will be False if there are no changes (cf. update_collection). if collection: backup_collection(collection_dict) update_collections_that_reference_this_collection(collection, self.query_builder, restricted=restricted, contents_changed=contents_changed) Session.add(collection) Session.commit() return collection.get_full_dict() else: response.status_int = 400 return {'error': u'The update request failed because the submitted data were not new.'} except h.JSONDecodeError: response.status_int = 400 return h.JSONDecodeErrorResponse except CircularCollectionReferenceError, e: response.status_int = 400 return {'error': u'Circular collection reference error: collection %d references collection %d.' % (id, e.args[0])} except InvalidCollectionReferenceError, e: response.status_int = 400 return {'error': u'Invalid collection reference error: there is no collection with id %d' % e.args[0]} except UnauthorizedCollectionReferenceError: response.status_int = 403 return {'error': u'Unauthorized collection reference error: you are not authorized to access collection %d' % e.args[0]}
def update(self, id): """Update a collection and return it. :URL: ``PUT /collections/id`` :Request body: JSON object representing the collection with updated attribute values. :param str id: the ``id`` value of the collection to be updated. :returns: the updated collection model. """ collection = h.eagerload_collection(Session.query(Collection), eagerload_forms=True).get(int(id)) if collection: unrestricted_users = h.get_unrestricted_users() user = session['user'] if h.user_is_authorized_to_access_model(user, collection, unrestricted_users): try: schema = CollectionSchema() values = json.loads(unicode(request.body, request.charset)) collections_referenced = get_collections_referenced( values['contents'], user, unrestricted_users, id) values = add_contents_unpacked_to_values( values, collections_referenced) values = add_form_ids_list_to_values(values) state = h.get_state_object(values) data = schema.to_python(values, state) collection_dict = collection.get_full_dict() collection, restricted, contents_changed = update_collection( collection, data, collections_referenced) # collection will be False if there are no changes (cf. update_collection). if collection: backup_collection(collection_dict) update_collections_that_reference_this_collection( collection, self.query_builder, restricted=restricted, contents_changed=contents_changed) Session.add(collection) Session.commit() return collection.get_full_dict() else: response.status_int = 400 return { 'error': u'The update request failed because the submitted data were not new.' } except h.JSONDecodeError: response.status_int = 400 return h.JSONDecodeErrorResponse except CircularCollectionReferenceError, e: response.status_int = 400 return { 'error': u'Circular collection reference error: collection %d references collection %d.' % (id, e.args[0]) } except InvalidCollectionReferenceError, e: response.status_int = 400 return { 'error': u'Invalid collection reference error: there is no collection with id %d' % e.args[0] } except UnauthorizedCollectionReferenceError: response.status_int = 403 return { 'error': u'Unauthorized collection reference error: you are not authorized to access collection %d' % e.args[0] }