diff --git a/boards/tests.py b/boards/tests.py --- a/boards/tests.py +++ b/boards/tests.py @@ -14,6 +14,7 @@ from boards import urls from boards import settings from boards.views.api import api_get_threaddiff from boards.utils import datetime_to_epoch +from boards.views.sync import ModelId, generate_request_get import neboard TEST_TAG = 'test_tag' @@ -146,7 +147,7 @@ class PagesTest(TestCase): def test_404(self): """Test receiving error 404 when opening a non-existent page""" - tag_name = u'test_tag' + tag_name = 'test_tag' tag = Tag.objects.create(name=tag_name) client = Client() @@ -156,22 +157,22 @@ class PagesTest(TestCase): response_existing = client.get(THREAD_PAGE + str(existing_post_id) + '/') self.assertEqual(HTTP_CODE_OK, response_existing.status_code, - u'Cannot open existing thread') + 'Cannot open existing thread') response_not_existing = client.get(THREAD_PAGE + str( existing_post_id + 1) + '/') self.assertEqual(PAGE_404, response_not_existing.templates[0].name, - u'Not existing thread is opened') + 'Not existing thread is opened') response_existing = client.get(TAG_PAGE + tag_name + '/') self.assertEqual(HTTP_CODE_OK, response_existing.status_code, - u'Cannot open existing tag') + 'Cannot open existing tag') - response_not_existing = client.get(TAG_PAGE + u'not_tag' + '/') + response_not_existing = client.get(TAG_PAGE + 'not_tag' + '/') self.assertEqual(PAGE_404, response_not_existing.templates[0].name, - u'Not existing tag is opened') + 'Not existing tag is opened') reply_id = Post.objects.create_post('', TEST_TEXT, thread=Post.objects.all()[0] @@ -180,15 +181,15 @@ class PagesTest(TestCase): reply_id) + '/') self.assertEqual(PAGE_404, response_not_existing.templates[0].name, - u'Reply is opened as a thread') + 'Reply is opened as a thread') class FormTest(TestCase): def test_post_validation(self): client = Client() - valid_tags = u'tag1 tag_2 тег_3' - invalid_tags = u'$%_356 ---' + valid_tags = 'tag1 tag_2 тег_3' + invalid_tags = '$%_356 ---' response = client.post(NEW_THREAD_PAGE, {'title': 'test title', 'text': TEST_TEXT, @@ -213,13 +214,13 @@ class FormTest(TestCase): response = client.post(THREAD_PAGE_ONE, {'text': TEST_TEXT, 'tags': valid_tags}) self.assertEqual(HTTP_CODE_REDIRECT, response.status_code, - msg=u'Posting new message failed: got code ' + + msg='Posting new message failed: got code ' + str(response.status_code)) # Restore posting delay neboard.settings.POSTING_DELAY = old_posting_delay self.assertEqual(2, Post.objects.count(), - msg=u'No posts were created') + msg='No posts were created') class ViewTest(TestCase): @@ -258,7 +259,7 @@ class AbstractTest(TestCase): settings_manager.set_setting('test_setting', 'test_value') self.assertEqual('test_value', settings_manager.get_setting( - 'test_setting'), u'Setting update failed.') + 'test_setting'), 'Setting update failed.') class MockRequest: @@ -292,7 +293,15 @@ class KeyTest(TestCase): ' one primary key.') except Exception: pass - + + def test_request_get(self): + model_id = ModelId('111', '222', '333') + self.assertTrue('' in + generate_request_get([model_id]), + 'Wrong XML generated for the GET request.') + class ApiTest(TestCase): def test_thread_diff(self): diff --git a/boards/views/sync.py b/boards/views/sync.py new file mode 100644 --- /dev/null +++ b/boards/views/sync.py @@ -0,0 +1,56 @@ +import xml.etree.ElementTree as et + +TAG_MODEL = 'model' +TAG_REQUEST = 'request' +TAG_ID = 'id' + +TYPE_GET = 'get' + +ATTR_VERSION = 'version' +ATTR_TYPE = 'type' +ATTR_NAME = 'name' +ATTR_KEY = 'key' +ATTR_KEY_TYPE = 'type' +ATTR_LOCAL_ID = 'local-id' + + +class ModelId: + """ + Model ID describes a global ID that consists of sender's key (with the key + type) and local ID on the sender node. + """ + + def __init__(self, key, key_type, local_id): + self.key = key + self.key_type = key_type + self.local_id = local_id + + +def respond_pull(request): + pass + + +def respond_get(request): + pass + + +def generate_request_get(id_list: list): + """ + Form a get request from a list of ModelId objects. + """ + + request = et.Element(TAG_REQUEST) + request.set(ATTR_TYPE, TYPE_GET) + request.set(ATTR_VERSION, '1.0') + + model = et.SubElement(request, TAG_MODEL) + model.set(ATTR_VERSION, '1.0') + model.set(ATTR_NAME, 'post') + + for model_id in id_list: + tag_id = et.SubElement(model, TAG_ID) + tag_id.set(ATTR_KEY, model_id.key) + tag_id.set(ATTR_KEY_TYPE, model_id.key_type) + tag_id.set(ATTR_LOCAL_ID, model_id.local_id) + + return et.tostring(request, 'unicode') \ No newline at end of file diff --git a/docs/samples/request_get.xml b/docs/samples/request_get.xml --- a/docs/samples/request_get.xml +++ b/docs/samples/request_get.xml @@ -1,7 +1,7 @@ - - + + diff --git a/docs/samples/response_pull.xml b/docs/samples/response_pull.xml --- a/docs/samples/response_pull.xml +++ b/docs/samples/response_pull.xml @@ -2,9 +2,9 @@ success - - - - + + + + diff --git a/requirements.txt b/requirements.txt --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ +simplejson south>=0.8.4 haystack pillow