def post(self, request): user = request.user data = request.data # Now, we post the data directly to OSM. try: responses = [] facilities_data = data['healthsites'] for facility_data in facilities_data: # Verify data uploader and owner/collector is_valid, message = \ verify_user(user, facility_data['osm_user']) if not is_valid: return HttpResponseForbidden(message) # Validate data validate_osm_data(facility_data) for facility_data in facilities_data: # Map Healthsites tags to OSM tags mapping_file_path = ABS_PATH('api', 'fixtures', 'mapping.yml') facility_data['tag'] = convert_to_osm_tag( mapping_file_path, facility_data['tag'], 'node') # Push data to OSM response = create_osm_node(user, facility_data) responses.append(response) return Response(responses) except Exception as e: return HttpResponseBadRequest('%s' % e)
def create_osm_node_by_data(data, user, duplication_check=True): """ Create data based on data and user""" # Now, we post the data directly to OSM. try: # Split osm and extension attribute osm_attr, locality_attr = split_osm_and_extension_attr(data['tag']) data['tag'] = osm_attr validate_osm_data(data, duplication_check=duplication_check) # Map Healthsites tags to OSM tags mapping_file_path = ABS_PATH('api', 'fixtures', 'mapping.yml') data['tag'] = convert_to_osm_tag(mapping_file_path, data['tag'], 'node') # Push data to OSM response = create_osm_node(user, data) # create pending index create_pending_update('node', response['id'], data['tag']['name'], user, response['version']) save_extensions('node', response['id'], locality_attr) return response except Exception as e: create_pending_review(user, data, '%s' % e) output = { 'error': '%s' % e, 'payload': data, } return output
def upload_to_osm(self): """Push parsed localities/facilities/healthsites data to OSM instance. """ self._upload_status['total'] = len(self._parsed_data) for row_number, data in enumerate(self._parsed_data): upload_status = {'uploaded': True, 'message': 'Uploaded'} # split osm and extension attributes osm_attr, locality_attr = split_osm_and_extension_attr(data['tag']) data['tag'] = osm_attr # Map Healthsites tags to OSM tags mapping_file_path = ABS_PATH('api', 'fixtures', 'mapping.yml') data['tag'] = convert_to_osm_tag(mapping_file_path, data['tag'], 'node') # Push data to OSM user = get_object_or_404(User, username=data['osm_user']) try: response = create_osm_node(user, data) # create pending index create_pending_update('node', response['id'], data['tag']['name'], user, response['version']) save_extensions('node', response['id'], locality_attr) except: # noqa upload_status.update({ 'uploaded': False, 'message': '{0}: {1}'.format(unicode(sys.exc_info()[0].__name__), unicode(sys.exc_info()[1])) }) self._upload_status['status'][row_number + 1] = upload_status self._upload_status['count'] = row_number + 1 self._upload_status['summary'] = ( 'There is error when uploading the data. ' 'Please see the status detail for more ' 'information.' if not self.is_uploaded() else '') # write status to progress file f = open(self.progress_file, 'w+') f.write(json.dumps(self._upload_status)) f.close() return False not in ([ status['uploaded'] for status in self._upload_status['status'].values() ])
def post(self, request): user = request.user data = copy.deepcopy(request.data) if user.username in settings.TEST_USERS: raise Exception('Create osm : {}'.format( json.dumps({ 'payload': data, 'user': user.username }))) # Now, we post the data directly to OSM. try: # Split osm and extension attribute osm_attr, locality_attr = split_osm_and_extension_attr(data['tag']) data['tag'] = osm_attr # Verify data uploader and owner/collector if the API is being used # for uploading data from other osm user. if request.user.is_staff and request.GET.get('review', None): data['osm_user'] = get_pending_review( request.GET.get('review')).uploader.username if data.get('osm_user'): is_valid, message = verify_user(user, data['osm_user']) if not is_valid: return HttpResponseForbidden(message) else: try: user = get_object_or_404(User, username=data['osm_user']) except Http404: message = 'User %s is not exist.' % data['osm_user'] return HttpResponseForbidden(message) duplication_check = request.GET.get('duplication-check', True) if duplication_check == 'false': duplication_check = False validate_osm_data(data, duplication_check=duplication_check) # Map Healthsites tags to OSM tags mapping_file_path = ABS_PATH('api', 'fixtures', 'mapping.yml') data['tag'] = convert_to_osm_tag(mapping_file_path, data['tag'], 'node') # Push data to OSM response = create_osm_node(user, data) # create pending index create_pending_update('node', response['id'], data['tag']['name'], user, response['version']) save_extensions('node', response['id'], locality_attr) if request.GET.get('review', None): delete_pending_review(request.GET.get('review', None)) return Response(response) except Exception as e: if not request.GET.get('review', None): if user != request.user: create_pending_review(user, request.data, '%s' % e) else: try: update_pending_review(request.GET.get('review', None), request.data, '%s' % e) except Exception as e: return HttpResponseBadRequest('%s' % e) output = { 'error': '%s' % e, 'payload': request.data, } return HttpResponseBadRequest('%s' % json.dumps(output))