def test_replace(self): """replace method adds function to patch object""" patch = ApiPatch() def test_function(): pass patch.replace('test-replace', test_function) self.assertEqual(len(patch._actions), 1) self.assertEqual(patch._actions[0]['op'], 'replace') self.assertEqual(patch._actions[0]['path'], 'test-replace') self.assertEqual(patch._actions[0]['handler'], test_function)
def test_replace(self): """replace method adds function to patch object""" patch = ApiPatch() def mock_function(): pass patch.replace('test-replace', mock_function) self.assertEqual(len(patch._actions), 1) self.assertEqual(patch._actions[0]['op'], 'replace') self.assertEqual(patch._actions[0]['path'], 'test-replace') self.assertEqual(patch._actions[0]['handler'], mock_function)
def test_dispatch_action(self): """dispatch_action calls specified actions""" patch = ApiPatch() mock_target = MockObject(13) def action_a(request, target, value): self.assertEqual(request, 'request') self.assertEqual(target, mock_target) return {'a': value * 2, 'b': 111} patch.replace('abc', action_a) def action_b(request, target, value): self.assertEqual(request, 'request') self.assertEqual(target, mock_target) return {'b': value * 10} patch.replace('abc', action_b) def action_fail(request, target, value): self.fail("unrequired action was called") patch.add('c', action_fail) patch.remove('c', action_fail) patch.replace('c', action_fail) patch_dict = {'id': 123} patch.dispatch_action( patch_dict, 'request', mock_target, { 'op': 'replace', 'path': 'abc', 'value': 5, } ) self.assertEqual(len(patch_dict), 3) self.assertEqual(patch_dict['id'], 123) self.assertEqual(patch_dict['a'], 10) self.assertEqual(patch_dict['b'], 50)
raise PermissionDenied(_("Invalid thread title.")) try: validate_title(value_cleaned) except ValidationError as e: raise PermissionDenied(e.args[0]) if not thread.acl.get('can_edit'): raise PermissionDenied( _("You don't have permission to edit this thread.")) moderation.change_thread_title(request, thread, value_cleaned) return {'title': thread.title} thread_patch_dispatcher.replace('title', patch_title) def patch_weight(request, thread, value): message = _("You don't have permission to change this thread's weight.") if not thread.acl.get('can_pin'): raise PermissionDenied(message) elif thread.weight > thread.acl.get('can_pin'): raise PermissionDenied(message) if value == 2: if thread.acl.get('can_pin') == 2: moderation.pin_thread_globally(request, thread) else: raise PermissionDenied( _("You don't have permission to pin this thread globally."))
return {'acl': None} post_patch_dispatcher.add('acl', patch_acl) def patch_is_protected(request, post, value): allow_protect_post(request.user, post) if value: moderation.protect_post(request.user, post) else: moderation.unprotect_post(request.user, post) return {'is_protected': post.is_protected} post_patch_dispatcher.replace('is-protected', patch_is_protected) def patch_is_unapproved(request, post, value): if value is False: allow_approve_post(request.user, post) moderation.approve_post(request.user, post) return {'is_unapproved': post.is_unapproved} post_patch_dispatcher.replace('is-unapproved', patch_is_unapproved) def patch_is_hidden(request, post, value): if value is True: allow_hide_post(request.user, post)
event_patch_dispatcher.add('acl', patch_acl) def patch_is_hidden(request, event, value): if value: allow_hide_event(request.user, event) moderation.hide_post(request.user, event) else: allow_unhide_event(request.user, event) moderation.unhide_post(request.user, event) return {'is_hidden': event.is_hidden} event_patch_dispatcher.replace('is-hidden', patch_is_hidden) def event_patch_endpoint(request, event): old_is_hidden = event.is_hidden response = event_patch_dispatcher.dispatch(request, event) if old_is_hidden != event.is_hidden: event.thread.synchronize() event.thread.save() event.category.synchronize() event.category.save() return response
def patch_is_hidden(request, event, value): if event.acl.get('can_hide'): if value: moderation.hide_post(request.user, event) else: moderation.unhide_post(request.user, event) return {'is_hidden': event.is_hidden} else: raise PermissionDenied( _("You don't have permission to hide this event.")) event_patch_dispatcher.replace('is-hidden', patch_is_hidden) def event_patch_endpoint(request, event): old_is_hidden = event.is_hidden response = event_patch_dispatcher.dispatch(request, event) if old_is_hidden != event.is_hidden: event.thread.synchronize() event.thread.save() event.category.synchronize() event.category.save() return response
if value: add_acl(request.user, post) return {'acl': post.acl} else: return {'acl': None} post_patch_dispatcher.add('acl', patch_acl) def patch_is_protected(request, post, value): allow_protect_post(request.user, post) if value: moderation.protect_post(request.user, post) else: moderation.unprotect_post(request.user, post) return {'is_protected': post.is_protected} post_patch_dispatcher.replace('is-protected', patch_is_protected) def patch_is_unapproved(request, post, value): if value is False: allow_approve_post(request.user, post) moderation.approve_post(request.user, post) return {'is_unapproved': post.is_unapproved} post_patch_dispatcher.replace('is-unapproved', patch_is_unapproved) def patch_is_hidden(request, post, value): if value is True: allow_hide_post(request.user, post) moderation.hide_post(request.user, post) elif value is False:
def test_dispatch(self): """dispatch calls actions and returns response""" patch = ApiPatch() def action_error(request, target, value): if value == '404': raise Http404() if value == 'perm': raise PermissionDenied("yo ain't doing that!") patch.replace('error', action_error) def action_mutate(request, target, value): return {'value': value * 2} patch.replace('mutate', action_mutate) # dispatch requires list as an argument response = patch.dispatch(MockRequest({}), {}) self.assertEqual(response.status_code, 400) self.assertEqual(response.data['detail'], "PATCH request should be list of operations") # valid dispatch response = patch.dispatch( MockRequest([ { 'op': 'replace', 'path': 'mutate', 'value': 2, }, { 'op': 'replace', 'path': 'mutate', 'value': 6, }, { 'op': 'replace', 'path': 'mutate', 'value': 7, }, ]), MockObject(13)) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.data['detail']), 3) self.assertEqual(response.data['detail'][0], 'ok') self.assertEqual(response.data['detail'][1], 'ok') self.assertEqual(response.data['detail'][2], 'ok') self.assertEqual(response.data['id'], 13) self.assertEqual(response.data['value'], 14) # invalid action in dispatch response = patch.dispatch( MockRequest([ { 'op': 'replace', 'path': 'mutate', 'value': 2, }, { 'op': 'replace', 'path': 'mutate', 'value': 6, }, { 'op': 'replace', }, { 'op': 'replace', 'path': 'mutate', 'value': 7, }, ]), MockObject(13)) self.assertEqual(response.status_code, 400) self.assertEqual(len(response.data['detail']), 3) self.assertEqual(response.data['detail'][0], 'ok') self.assertEqual(response.data['detail'][1], 'ok') self.assertEqual(response.data['detail'][2], '"replace" op has to specify path') self.assertEqual(response.data['id'], 13) self.assertEqual(response.data['value'], 12) # action in dispatch raised 404 response = patch.dispatch( MockRequest([ { 'op': 'replace', 'path': 'mutate', 'value': 2, }, { 'op': 'replace', 'path': 'error', 'value': '404', }, { 'op': 'replace', 'path': 'mutate', 'value': 6, }, { 'op': 'replace', 'path': 'mutate', 'value': 7, }, ]), MockObject(13)) self.assertEqual(response.status_code, 400) self.assertEqual(len(response.data['detail']), 2) self.assertEqual(response.data['detail'][0], 'ok') self.assertEqual(response.data['detail'][1], "NOT FOUND") self.assertEqual(response.data['id'], 13) self.assertEqual(response.data['value'], 4) # action in dispatch raised perm denied response = patch.dispatch( MockRequest([ { 'op': 'replace', 'path': 'mutate', 'value': 2, }, { 'op': 'replace', 'path': 'mutate', 'value': 6, }, { 'op': 'replace', 'path': 'mutate', 'value': 9, }, { 'op': 'replace', 'path': 'error', 'value': 'perm', }, ]), MockObject(13)) self.assertEqual(response.status_code, 400) self.assertEqual(len(response.data['detail']), 4) self.assertEqual(response.data['detail'][0], 'ok') self.assertEqual(response.data['detail'][1], 'ok') self.assertEqual(response.data['detail'][2], 'ok') self.assertEqual(response.data['detail'][3], "yo ain't doing that!") self.assertEqual(response.data['id'], 13) self.assertEqual(response.data['value'], 18)
elif thread.weight > thread.acl.get('can_pin'): raise PermissionDenied(message) if value == 2: if thread.acl.get('can_pin') == 2: moderation.pin_thread_globally(request.user, thread) else: raise PermissionDenied( _("You don't have permission to pin this thread globally.")) elif value == 1: moderation.pin_thread_locally(request.user, thread) elif value == 0: moderation.unpin_thread(request.user, thread) return {'weight': thread.weight} thread_patch_endpoint.replace('weight', patch_weight) def patch_move(request, thread, value): if thread.acl.get('can_move'): category_pk = get_int_or_404(value) new_category = get_object_or_404( Category.objects.all_categories().select_related('parent'), pk=category_pk ) add_acl(request.user, new_category) allow_see_category(request.user, new_category) allow_browse_category(request.user, new_category) moderation.move_thread(request.user, thread, new_category)
value_cleaned = six.text_type(value).strip() except (TypeError, ValueError): raise PermissionDenied(_("Invalid thread title.")) try: validate_title(value_cleaned) except ValidationError as e: raise PermissionDenied(e.args[0]) allow_edit_thread(request.user, thread) moderation.change_thread_title(request, thread, value_cleaned) return {'title': thread.title} thread_patch_dispatcher.replace('title', patch_title) def patch_weight(request, thread, value): allow_pin_thread(request.user, thread) if not thread.acl.get('can_pin_globally') and thread.weight == 2: raise PermissionDenied(_("You can't change globally pinned threads weights in this category.")) if value == 2: if thread.acl.get('can_pin_globally'): moderation.pin_thread_globally(request, thread) else: raise PermissionDenied(_("You can't pin threads globally in this category.")) elif value == 1: moderation.pin_thread_locally(request, thread)
def test_dispatch(self): """dispatch calls actions and returns response""" patch = ApiPatch() def action_error(request, target, value): if value == '404': raise Http404() if value == 'perm': raise PermissionDenied("yo ain't doing that!") patch.replace('error', action_error) def action_mutate(request, target, value): return {'value': value * 2} patch.replace('mutate', action_mutate) # dispatch requires list as an argument response = patch.dispatch(MockRequest({}), {}) self.assertEqual(response.status_code, 400) self.assertEqual( response.data['detail'], "PATCH request should be list of operations") # valid dispatch response = patch.dispatch(MockRequest([ {'op': 'replace', 'path': 'mutate', 'value': 2}, {'op': 'replace', 'path': 'mutate', 'value': 6}, {'op': 'replace', 'path': 'mutate', 'value': 7}, ]), MockObject(13)) self.assertEqual(response.status_code, 200) self.assertEqual(len(response.data['detail']), 3) self.assertEqual(response.data['detail'][0], 'ok') self.assertEqual(response.data['detail'][1], 'ok') self.assertEqual(response.data['detail'][2], 'ok') self.assertEqual(response.data['id'], 13) self.assertEqual(response.data['value'], 14) # invalid action in dispatch response = patch.dispatch(MockRequest([ {'op': 'replace', 'path': 'mutate', 'value': 2}, {'op': 'replace', 'path': 'mutate', 'value': 6}, {'op': 'replace'}, {'op': 'replace', 'path': 'mutate', 'value': 7}, ]), MockObject(13)) self.assertEqual(response.status_code, 400) self.assertEqual(len(response.data['detail']), 3) self.assertEqual(response.data['detail'][0], 'ok') self.assertEqual(response.data['detail'][1], 'ok') self.assertEqual( response.data['detail'][2], '"replace" op has to specify path') self.assertEqual(response.data['id'], 13) self.assertEqual(response.data['value'], 12) # action in dispatch raised 404 response = patch.dispatch(MockRequest([ {'op': 'replace', 'path': 'mutate', 'value': 2}, {'op': 'replace', 'path': 'error', 'value': '404'}, {'op': 'replace', 'path': 'mutate', 'value': 6}, {'op': 'replace', 'path': 'mutate', 'value': 7}, ]), MockObject(13)) self.assertEqual(response.status_code, 400) self.assertEqual(len(response.data['detail']), 2) self.assertEqual(response.data['detail'][0], 'ok') self.assertEqual( response.data['detail'][1], "NOT FOUND") self.assertEqual(response.data['id'], 13) self.assertEqual(response.data['value'], 4) # action in dispatch raised perm denied response = patch.dispatch(MockRequest([ {'op': 'replace', 'path': 'mutate', 'value': 2}, {'op': 'replace', 'path': 'mutate', 'value': 6}, {'op': 'replace', 'path': 'mutate', 'value': 9}, {'op': 'replace', 'path': 'error', 'value': 'perm'}, ]), MockObject(13)) self.assertEqual(response.status_code, 400) self.assertEqual(len(response.data['detail']), 4) self.assertEqual(response.data['detail'][0], 'ok') self.assertEqual(response.data['detail'][1], 'ok') self.assertEqual(response.data['detail'][2], 'ok') self.assertEqual( response.data['detail'][3], "yo ain't doing that!") self.assertEqual(response.data['id'], 13) self.assertEqual(response.data['value'], 18)