##// END OF EJS Templates
Added PULL protocol method implementation without any filters
neko259 -
r1321:055856f7 decentral
parent child Browse files
Show More
@@ -1,9 +1,9 b''
1 1 import re
2 import urllib.parse
3 import httplib2
4 2 import xml.etree.ElementTree as ET
5 3
4 import httplib2
6 5 from django.core.management import BaseCommand
6
7 7 from boards.models import GlobalId
8 8 from boards.models.post.sync import SyncManager
9 9
@@ -14,12 +14,12 b" REGEX_GLOBAL_ID = re.compile(r'(\\w+)::(["
14 14
15 15
16 16 class Command(BaseCommand):
17 help = 'Send a sync or get request to the server.' + \
18 'sync_with_server <server_url> [post_global_id]'
17 help = 'Send a sync or get request to the server.'
19 18
20 19 def add_arguments(self, parser):
21 20 parser.add_argument('url', type=str)
22 parser.add_argument('global_id', type=str)
21 parser.add_argument('--global_id', type=str, default='',
22 help='Post global ID')
23 23
24 24 def handle(self, *args, **options):
25 25 url = options.get('url')
@@ -44,7 +44,8 b' class Command(BaseCommand):'
44 44 raise Exception('Invalid global ID')
45 45 else:
46 46 h = httplib2.Http()
47 response, content = h.request(url, method="POST")
47 xml = GlobalId.objects.generate_request_pull()
48 response, content = h.request(url, method="POST", body=xml)
48 49
49 50 print(content)
50 51
@@ -53,7 +54,6 b' class Command(BaseCommand):'
53 54 if status == 'success':
54 55 models = root.findall('models')[0]
55 56 for model in models:
56 model_content = model[0]
57 print(model_content.findall('text')[0].text)
57 print(ET.tostring(model))
58 58 else:
59 59 raise Exception('Invalid response status')
@@ -150,6 +150,21 b' class SyncManager:'
150 150 pass
151 151
152 152 @staticmethod
153 def generate_response_pull():
154 response = et.Element(TAG_RESPONSE)
155
156 status = et.SubElement(response, TAG_STATUS)
157 status.text = STATUS_SUCCESS
158
159 models = et.SubElement(response, TAG_MODELS)
160
161 for post in Post.objects.all():
162 tag_id = et.SubElement(models, TAG_ID)
163 post.global_id.to_xml_element(tag_id)
164
165 return et.tostring(response, ENCODING_UNICODE)
166
167 @staticmethod
153 168 def _verify_model(tag_content, tag_model):
154 169 """
155 170 Verifies all signatures for a single model.
@@ -7,6 +7,7 b" TAG_REQUEST = 'request'"
7 7 TAG_ID = 'id'
8 8
9 9 TYPE_GET = 'get'
10 TYPE_PULL = 'pull'
10 11
11 12 ATTR_VERSION = 'version'
12 13 ATTR_TYPE = 'type'
@@ -37,6 +38,21 b' class GlobalIdManager(models.Manager):'
37 38
38 39 return et.tostring(request, 'unicode')
39 40
41 def generate_request_pull(self):
42 """
43 Form a pull request from a list of ModelId objects.
44 """
45
46 request = et.Element(TAG_REQUEST)
47 request.set(ATTR_TYPE, TYPE_PULL)
48 request.set(ATTR_VERSION, '1.0')
49
50 model = et.SubElement(request, TAG_MODEL)
51 model.set(ATTR_VERSION, '1.0')
52 model.set(ATTR_NAME, 'post')
53
54 return et.tostring(request, 'unicode')
55
40 56 def global_id_exists(self, global_id):
41 57 """
42 58 Checks if the same global id already exists in the system.
@@ -10,7 +10,7 b' from boards.views.notifications import N'
10 10 from boards.views.search import BoardSearchView
11 11 from boards.views.static import StaticPageView
12 12 from boards.views.preview import PostPreviewView
13 from boards.views.sync import get_post_sync_data, response_get
13 from boards.views.sync import get_post_sync_data, response_get, response_pull
14 14 from boards.views.random import RandomImageView
15 15
16 16
@@ -72,7 +72,7 b" urlpatterns = patterns('',"
72 72 url(r'^api/preview/$', api.api_get_preview, name='preview'),
73 73
74 74 # Sync protocol API
75 url(r'^api/sync/pull/$', api.sync_pull, name='api_sync_pull'),
75 url(r'^api/sync/pull/$', response_pull, name='api_sync_pull'),
76 76 url(r'^api/sync/get/$', response_get, name='api_sync_pull'),
77 77 # TODO 'get' request
78 78
@@ -241,18 +241,3 b' def api_get_preview(request):'
241 241
242 242 parser = Parser()
243 243 return HttpResponse(content=parser.parse(parser.preparse(raw_text)))
244
245
246 # TODO Make a separate module for sync API methods
247 def sync_pull(request):
248 """
249 Return 'pull' request response for all posts.
250 """
251 request_xml = request.get('xml')
252 if request_xml is None:
253 posts = Post.objects.all()
254 else:
255 pass # TODO Parse the XML and get filters from it
256
257 xml = SyncManager.generate_response_get(posts)
258 return HttpResponse(content=xml)
@@ -5,7 +5,14 b' from boards.models.post.sync import Sync'
5 5
6 6
7 7 def response_pull(request):
8 pass
8 request_xml = request.body
9
10 if request_xml is None:
11 return HttpResponse(content='Use the API')
12
13 response_xml = SyncManager.generate_response_pull()
14
15 return HttpResponse(content=response_xml)
9 16
10 17
11 18 def response_get(request):
General Comments 0
You need to be logged in to leave comments. Login now