##// END OF EJS Templates
Use unicode charset for post XML preview
Use unicode charset for post XML preview

File last commit:

r1551:a596995d default
r1552:93f626a7 default
Show More
sync_with_server.py
85 lines | 3.1 KiB | text/x-python | PythonLexer
import re
import xml.etree.ElementTree as ET
import httplib2
from django.core.management import BaseCommand
from boards.models import GlobalId
from boards.models.post.sync import SyncManager
__author__ = 'neko259'
REGEX_GLOBAL_ID = re.compile(r'(\w+)::([\w\+/]+)::(\d+)')
class Command(BaseCommand):
help = 'Send a sync or get request to the server.'
def add_arguments(self, parser):
parser.add_argument('url', type=str, help='Server root url')
parser.add_argument('--global-id', type=str, default='',
help='Post global ID')
parser.add_argument('--split-query', type=int,
help='Split GET query into separate by the given'
' number of posts in one')
def handle(self, *args, **options):
url = options.get('url')
pull_url = url + 'api/sync/pull/'
get_url = url + 'api/sync/get/'
file_url = url[:-1]
global_id_str = options.get('global_id')
if global_id_str:
match = REGEX_GLOBAL_ID.match(global_id_str)
if match:
key_type = match.group(1)
key = match.group(2)
local_id = match.group(3)
global_id = GlobalId(key_type=key_type, key=key,
local_id=local_id)
xml = GlobalId.objects.generate_request_get([global_id])
# body = urllib.parse.urlencode(data)
h = httplib2.Http()
response, content = h.request(get_url, method="POST", body=xml)
SyncManager.parse_response_get(content, file_url)
else:
raise Exception('Invalid global ID')
else:
h = httplib2.Http()
xml = GlobalId.objects.generate_request_pull()
response, content = h.request(pull_url, method="POST", body=xml)
print(content.decode() + '\n')
root = ET.fromstring(content)
status = root.findall('status')[0].text
if status == 'success':
ids_to_sync = list()
models = root.findall('models')[0]
for model in models:
global_id, exists = GlobalId.from_xml_element(model)
if not exists:
print(global_id)
ids_to_sync.append(global_id)
print()
if len(ids_to_sync) > 0:
limit = options.get('split_query', len(ids_to_sync))
for offset in range(0, len(ids_to_sync), limit):
xml = GlobalId.objects.generate_request_get(ids_to_sync[offset:offset+limit0])
# body = urllib.parse.urlencode(data)
h = httplib2.Http()
response, content = h.request(get_url, method="POST", body=xml)
SyncManager.parse_response_get(content, file_url)
else:
print('Nothing to get, everything synced')
else:
raise Exception('Invalid response status')