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 @@ -55,62 +55,69 @@ class SyncManager: models = et.SubElement(response, TAG_MODELS) - # TODO Put global id's content into XML instad of manual serialization for post in model_list: model = et.SubElement(models, TAG_MODEL) model.set(ATTR_NAME, 'post') - content_tag = et.SubElement(model, TAG_CONTENT) - - tag_id = et.SubElement(content_tag, TAG_ID) - post.global_id.to_xml_element(tag_id) - - title = et.SubElement(content_tag, TAG_TITLE) - title.text = post.title + global_id = post.global_id - text = et.SubElement(content_tag, TAG_TEXT) - text.text = post.get_sync_text() - - thread = post.get_thread() - if post.is_opening(): - tag_tags = et.SubElement(content_tag, TAG_TAGS) - for tag in thread.get_tags(): - tag_tag = et.SubElement(tag_tags, TAG_TAG) - tag_tag.text = tag.name + if global_id.content: + model.append(et.fromstring(global_id.content)) else: - tag_thread = et.SubElement(content_tag, TAG_THREAD) - thread_id = et.SubElement(tag_thread, TAG_ID) - thread.get_opening_post().global_id.to_xml_element(thread_id) + content_tag = et.SubElement(model, TAG_CONTENT) + + tag_id = et.SubElement(content_tag, TAG_ID) + global_id.to_xml_element(tag_id) - pub_time = et.SubElement(content_tag, TAG_PUB_TIME) - pub_time.text = str(post.get_pub_time_str()) + title = et.SubElement(content_tag, TAG_TITLE) + title.text = post.title + + text = et.SubElement(content_tag, TAG_TEXT) + text.text = post.get_sync_text() - images = post.images.all() - attachments = post.attachments.all() - if len(images) > 0 or len(attachments) > 0: - attachments_tag = et.SubElement(content_tag, TAG_ATTACHMENTS) - attachment_refs = et.SubElement(model, TAG_ATTACHMENT_REFS) + thread = post.get_thread() + if post.is_opening(): + tag_tags = et.SubElement(content_tag, TAG_TAGS) + for tag in thread.get_tags(): + tag_tag = et.SubElement(tag_tags, TAG_TAG) + tag_tag.text = tag.name + else: + tag_thread = et.SubElement(content_tag, TAG_THREAD) + thread_id = et.SubElement(tag_thread, TAG_ID) + thread.get_opening_post().global_id.to_xml_element(thread_id) + + pub_time = et.SubElement(content_tag, TAG_PUB_TIME) + pub_time.text = str(post.get_pub_time_str()) - for image in images: - SyncManager._attachment_to_xml( - attachments_tag, attachment_refs, image.image.file, - image.hash, image.image.url) - for file in attachments: - SyncManager._attachment_to_xml( - attachments_tag, attachment_refs, file.file.file, - file.hash, file.file.url) + images = post.images.all() + attachments = post.attachments.all() + if len(images) > 0 or len(attachments) > 0: + attachments_tag = et.SubElement(content_tag, TAG_ATTACHMENTS) + attachment_refs = et.SubElement(model, TAG_ATTACHMENT_REFS) + + for image in images: + SyncManager._attachment_to_xml( + attachments_tag, attachment_refs, image.image.file, + image.hash, image.image.url) + for file in attachments: + SyncManager._attachment_to_xml( + attachments_tag, attachment_refs, file.file.file, + file.hash, file.file.url) + + global_id.content = et.tostring(content_tag, ENCODING_UNICODE) + global_id.save() signatures_tag = et.SubElement(model, TAG_SIGNATURES) - post_signatures = post.global_id.signature_set.all() + post_signatures = global_id.signature_set.all() if post_signatures: signatures = post_signatures else: - key = KeyPair.objects.get(public_key=post.global_id.key) + key = KeyPair.objects.get(public_key=global_id.key) signature = Signature( key_type=key.key_type, key=key.public_key, - signature=key.sign(et.tostring(content_tag, encoding=ENCODING_UNICODE)), - global_id=post.global_id, + signature=key.sign(global_id.content), + global_id=global_id, ) signature.save() signatures = [signature] @@ -140,8 +147,8 @@ class SyncManager: if exists: print('Post with same ID already exists') else: - global_id.content = et.to_string(tag_content, - ENCODING_UNICODE) + global_id.content = et.tostring(tag_content, + ENCODING_UNICODE) global_id.save() for signature in signatures: signature.global_id = global_id diff --git a/boards/models/signature.py b/boards/models/signature.py --- a/boards/models/signature.py +++ b/boards/models/signature.py @@ -64,6 +64,12 @@ class GlobalIdManager(models.Manager): class GlobalId(models.Model): + """ + Global model ID and cache. + Key, key type and local ID make a single global identificator of the model. + Content is an XML cache of the model that can be passed along between nodes + without manual serialization each time. + """ class Meta: app_label = 'boards' diff --git a/boards/signals.py b/boards/signals.py --- a/boards/signals.py +++ b/boards/signals.py @@ -79,3 +79,9 @@ def update_thread_on_delete(instance, ** thread = instance.get_thread() thread.last_edit_time = timezone.now() thread.save() + + +@receiver(post_delete, sender=Post) +def delete_global_id(instance, **kwargs): + if instance.global_id and instance.global_id.id: + instance.global_id.delete()