示例#1
0
    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)
示例#2
0
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
示例#3
0
    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()
        ])
示例#4
0
    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))