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+limit]) # 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')