diff --git a/boards/management/commands/sync_with_server.py b/boards/management/commands/sync_with_server.py --- a/boards/management/commands/sync_with_server.py +++ b/boards/management/commands/sync_with_server.py @@ -17,12 +17,16 @@ class Command(BaseCommand): help = 'Send a sync or get request to the server.' def add_arguments(self, parser): - parser.add_argument('url', type=str) - parser.add_argument('--global_id', type=str, default='', + parser.add_argument('url', type=str, help='Server root url') + parser.add_argument('--global-id', type=str, default='', help='Post global ID') def handle(self, *args, **options): url = options.get('url') + + pull_url = url + 'api/sync/pull/' + get_url = url + 'api/sync/get/' + global_id_str = options.get('global_id') if global_id_str: match = REGEX_GLOBAL_ID.match(global_id_str) @@ -37,7 +41,7 @@ class Command(BaseCommand): xml = GlobalId.objects.generate_request_get([global_id]) # body = urllib.parse.urlencode(data) h = httplib2.Http() - response, content = h.request(url, method="POST", body=xml) + response, content = h.request(get_url, method="POST", body=xml) SyncManager.parse_response_get(content) else: @@ -45,9 +49,9 @@ class Command(BaseCommand): else: h = httplib2.Http() xml = GlobalId.objects.generate_request_pull() - response, content = h.request(url, method="POST", body=xml) + response, content = h.request(pull_url, method="POST", body=xml) - print(content) + print(content.decode() + '\n') root = ET.fromstring(content) status = root.findall('status')[0].text @@ -57,15 +61,16 @@ class Command(BaseCommand): models = root.findall('models')[0] for model in models: global_id, exists = GlobalId.from_xml_element(model) - print(global_id) if not exists: + print(global_id) ids_to_sync.append(global_id) + print() if len(ids_to_sync) > 0: xml = GlobalId.objects.generate_request_get(ids_to_sync) # body = urllib.parse.urlencode(data) h = httplib2.Http() - response, content = h.request(url, method="POST", body=xml) + response, content = h.request(get_url, method="POST", body=xml) SyncManager.parse_response_get(content) else: diff --git a/boards/models/post/manager.py b/boards/models/post/manager.py --- a/boards/models/post/manager.py +++ b/boards/models/post/manager.py @@ -142,10 +142,11 @@ class PostManager(models.Manager): pub_time=pub_time, poster_ip=NO_IP, last_edit_time=pub_time, - thread_id=thread.id, global_id=global_id, - opening=is_opening) + opening=is_opening, + thread=thread) + post.threads.add(thread) post.build_url() post.connect_replies() post.connect_notifications() diff --git a/boards/models/post/sync.py b/boards/models/post/sync.py --- a/boards/models/post/sync.py +++ b/boards/models/post/sync.py @@ -84,11 +84,14 @@ class SyncManager: # the post is added? Need to add some on_save signal queue # and add this there. key = KeyPair.objects.get(public_key=post.global_id.key) - signatures = [Signature( + signature = Signature( key_type=key.key_type, key=key.public_key, signature=key.sign(et.tostring(content_tag, ENCODING_UNICODE)), - )] + global_id=post.global_id, + ) + signature.save() + signatures = [signature] for signature in signatures: signature_tag = et.SubElement(signatures_tag, TAG_SIGNATURE) signature_tag.set(ATTR_TYPE, signature.key_type) @@ -127,13 +130,18 @@ class SyncManager: thread = tag_content.find(TAG_THREAD) tags = [] if thread: - opening_post = Post.objects.get( - id=thread.find(TAG_ID).text) + thread_id = thread.find(TAG_ID) + op_global_id, exists = GlobalId.from_xml_element(thread_id) + if exists: + opening_post = Post.objects.get(global_id=op_global_id) + else: + raise Exception('Load the OP first') else: opening_post = None tag_tags = tag_content.find(TAG_TAGS) for tag_tag in tag_tags: - tag, created = Tag.objects.get_or_create(name=tag_tag.text) + tag, created = Tag.objects.get_or_create( + name=tag_tag.text) tags.append(tag) # TODO Check that the replied posts are already present @@ -181,10 +189,13 @@ class SyncManager: signature = Signature(key_type=signature_type, key=signature_key, signature=signature_value) - signatures.append(signature) + + content = et.tostring(tag_content, ENCODING_UNICODE) if not KeyPair.objects.verify( - signature, et.tostring(tag_content, ENCODING_UNICODE)): - raise Exception('Invalid model signature') + signature, content): + raise Exception('Invalid model signature for {}'.format(content)) + + signatures.append(signature) return signatures