##// END OF EJS Templates
Moved the TODO item to the proper section
neko259 -
r1235:3ee64c6f decentral
parent child Browse files
Show More
@@ -1,128 +1,128 b''
1 import xml.etree.ElementTree as et
1 import xml.etree.ElementTree as et
2 from django.db import transaction
2 from django.db import transaction
3 from boards.models import KeyPair, GlobalId, Signature, Post
3 from boards.models import KeyPair, GlobalId, Signature, Post
4
4
5 ENCODING_UNICODE = 'unicode'
5 ENCODING_UNICODE = 'unicode'
6
6
7 TAG_MODEL = 'model'
7 TAG_MODEL = 'model'
8 TAG_REQUEST = 'request'
8 TAG_REQUEST = 'request'
9 TAG_RESPONSE = 'response'
9 TAG_RESPONSE = 'response'
10 TAG_ID = 'id'
10 TAG_ID = 'id'
11 TAG_STATUS = 'status'
11 TAG_STATUS = 'status'
12 TAG_MODELS = 'models'
12 TAG_MODELS = 'models'
13 TAG_TITLE = 'title'
13 TAG_TITLE = 'title'
14 TAG_TEXT = 'text'
14 TAG_TEXT = 'text'
15 TAG_THREAD = 'thread'
15 TAG_THREAD = 'thread'
16 TAG_PUB_TIME = 'pub-time'
16 TAG_PUB_TIME = 'pub-time'
17 TAG_SIGNATURES = 'signatures'
17 TAG_SIGNATURES = 'signatures'
18 TAG_SIGNATURE = 'signature'
18 TAG_SIGNATURE = 'signature'
19 TAG_CONTENT = 'content'
19 TAG_CONTENT = 'content'
20 TAG_ATTACHMENTS = 'attachments'
20 TAG_ATTACHMENTS = 'attachments'
21 TAG_ATTACHMENT = 'attachment'
21 TAG_ATTACHMENT = 'attachment'
22
22
23 TYPE_GET = 'get'
23 TYPE_GET = 'get'
24
24
25 ATTR_VERSION = 'version'
25 ATTR_VERSION = 'version'
26 ATTR_TYPE = 'type'
26 ATTR_TYPE = 'type'
27 ATTR_NAME = 'name'
27 ATTR_NAME = 'name'
28 ATTR_VALUE = 'value'
28 ATTR_VALUE = 'value'
29 ATTR_MIMETYPE = 'mimetype'
29 ATTR_MIMETYPE = 'mimetype'
30
30
31 STATUS_SUCCESS = 'success'
31 STATUS_SUCCESS = 'success'
32
32
33
33
34 # TODO Make this fully static
34 # TODO Make this fully static
35 class SyncManager:
35 class SyncManager:
36 def generate_response_get(self, model_list: list):
36 def generate_response_get(self, model_list: list):
37 response = et.Element(TAG_RESPONSE)
37 response = et.Element(TAG_RESPONSE)
38
38
39 status = et.SubElement(response, TAG_STATUS)
39 status = et.SubElement(response, TAG_STATUS)
40 status.text = STATUS_SUCCESS
40 status.text = STATUS_SUCCESS
41
41
42 models = et.SubElement(response, TAG_MODELS)
42 models = et.SubElement(response, TAG_MODELS)
43
43
44 for post in model_list:
44 for post in model_list:
45 model = et.SubElement(models, TAG_MODEL)
45 model = et.SubElement(models, TAG_MODEL)
46 model.set(ATTR_NAME, 'post')
46 model.set(ATTR_NAME, 'post')
47
47
48 content_tag = et.SubElement(model, TAG_CONTENT)
48 content_tag = et.SubElement(model, TAG_CONTENT)
49
49
50 tag_id = et.SubElement(content_tag, TAG_ID)
50 tag_id = et.SubElement(content_tag, TAG_ID)
51 post.global_id.to_xml_element(tag_id)
51 post.global_id.to_xml_element(tag_id)
52
52
53 title = et.SubElement(content_tag, TAG_TITLE)
53 title = et.SubElement(content_tag, TAG_TITLE)
54 title.text = post.title
54 title.text = post.title
55
55
56 text = et.SubElement(content_tag, TAG_TEXT)
56 text = et.SubElement(content_tag, TAG_TEXT)
57 text.text = post.get_sync_text()
57 text.text = post.get_sync_text()
58
58
59 if not post.is_opening():
59 if not post.is_opening():
60 thread = et.SubElement(content_tag, TAG_THREAD)
60 thread = et.SubElement(content_tag, TAG_THREAD)
61 thread_id = et.SubElement(thread, TAG_ID)
61 thread_id = et.SubElement(thread, TAG_ID)
62 post.get_thread().get_opening_post().global_id.to_xml_element(thread_id)
62 post.get_thread().get_opening_post().global_id.to_xml_element(thread_id)
63 else:
63 else:
64 # TODO Output tags here
64 # TODO Output tags here
65 pass
65 pass
66
66
67 pub_time = et.SubElement(content_tag, TAG_PUB_TIME)
67 pub_time = et.SubElement(content_tag, TAG_PUB_TIME)
68 pub_time.text = str(post.get_pub_time_str())
68 pub_time.text = str(post.get_pub_time_str())
69
69
70 signatures_tag = et.SubElement(model, TAG_SIGNATURES)
70 signatures_tag = et.SubElement(model, TAG_SIGNATURES)
71 post_signatures = post.signature.all()
71 post_signatures = post.signature.all()
72 if post_signatures:
72 if post_signatures:
73 signatures = post.signatures
73 signatures = post.signatures
74 else:
74 else:
75 # TODO Maybe the signature can be computed only once after
75 # TODO Maybe the signature can be computed only once after
76 # the post is added? Need to add some on_save signal queue
76 # the post is added? Need to add some on_save signal queue
77 # and add this there.
77 # and add this there.
78 key = KeyPair.objects.get(public_key=post.global_id.key)
78 key = KeyPair.objects.get(public_key=post.global_id.key)
79 signatures = [Signature(
79 signatures = [Signature(
80 key_type=key.key_type,
80 key_type=key.key_type,
81 key=key.public_key,
81 key=key.public_key,
82 signature=key.sign(et.tostring(model, ENCODING_UNICODE)),
82 signature=key.sign(et.tostring(model, ENCODING_UNICODE)),
83 )]
83 )]
84 for signature in signatures:
84 for signature in signatures:
85 signature_tag = et.SubElement(signatures_tag, TAG_SIGNATURE)
85 signature_tag = et.SubElement(signatures_tag, TAG_SIGNATURE)
86 signature_tag.set(ATTR_TYPE, signature.key_type)
86 signature_tag.set(ATTR_TYPE, signature.key_type)
87 signature_tag.set(ATTR_VALUE, signature.signature)
87 signature_tag.set(ATTR_VALUE, signature.signature)
88
88
89 return et.tostring(response, ENCODING_UNICODE)
89 return et.tostring(response, ENCODING_UNICODE)
90
90
91 @transaction.atomic
91 @transaction.atomic
92 def parse_response_get(self, response_xml):
92 def parse_response_get(self, response_xml):
93 tag_root = et.fromstring(response_xml)
93 tag_root = et.fromstring(response_xml)
94 tag_status = tag_root.find(TAG_STATUS)
94 tag_status = tag_root.find(TAG_STATUS)
95 if STATUS_SUCCESS == tag_status.text:
95 if STATUS_SUCCESS == tag_status.text:
96 tag_models = tag_root.find(TAG_MODELS)
96 tag_models = tag_root.find(TAG_MODELS)
97 for tag_model in tag_models:
97 for tag_model in tag_models:
98 tag_content = tag_model.find(TAG_CONTENT)
98 tag_content = tag_model.find(TAG_CONTENT)
99 tag_id = tag_content.find(TAG_ID)
99 tag_id = tag_content.find(TAG_ID)
100 global_id, exists = GlobalId.from_xml_element(tag_id)
100 global_id, exists = GlobalId.from_xml_element(tag_id)
101
101
102 if exists:
102 if exists:
103 print('Post with same ID already exists')
103 print('Post with same ID already exists')
104 else:
104 else:
105 global_id.save()
105 global_id.save()
106
106
107 title = tag_content.find(TAG_TITLE).text
107 title = tag_content.find(TAG_TITLE).text
108 text = tag_content.find(TAG_TEXT).text
108 text = tag_content.find(TAG_TEXT).text
109 pub_time = tag_content.find(TAG_PUB_TIME).text
109 pub_time = tag_content.find(TAG_PUB_TIME).text
110
110
111 thread = tag_content.find(TAG_THREAD)
111 thread = tag_content.find(TAG_THREAD)
112 if thread:
112 if thread:
113 opening_post = Post.objects.get(
113 opening_post = Post.objects.get(
114 id=thread.find(TAG_ID).text)
114 id=thread.find(TAG_ID).text)
115 # TODO Get tags here
116 else:
115 else:
117 opening_post = None
116 opening_post = None
117 # TODO Get tags here
118
118
119 # TODO Check that the replied posts are already present
119 # TODO Check that the replied posts are already present
120 # before adding new ones
120 # before adding new ones
121
121
122 post = Post.objects.import_post(
122 post = Post.objects.import_post(
123 title=title, text=text, pub_time=pub_time,
123 title=title, text=text, pub_time=pub_time,
124 opening_post=opening_post)
124 opening_post=opening_post)
125 post.global_id = global_id
125 post.global_id = global_id
126 else:
126 else:
127 # TODO Throw an exception?
127 # TODO Throw an exception?
128 pass
128 pass
General Comments 0
You need to be logged in to leave comments. Login now