예제 #1
0
    def to_csv(self, target_path, target_proj4=None, **kw):
        try:
            t = concatenate_tables(
                _get_instance_for_csv(
                    x,
                    source_proj4 or LONGITUDE_LATITUDE_PROJ4,
                    target_proj4,
                ) for source_proj4, x in self.groupby('geometry_proj4'))
        except ValueError:
            t = self

        excluded_column_names = []
        unique_geometry_layers = t['geometry_layer'].unique()
        unique_geometry_proj4s = t['geometry_proj4'].unique()
        if len(unique_geometry_layers) == 1:
            excluded_column_names.append('geometry_layer')
        if len(unique_geometry_proj4s) == 1:
            excluded_column_names.append('geometry_proj4')
            geometry_proj4 = unique_geometry_proj4s[0]
            if geometry_proj4 != LONGITUDE_LATITUDE_PROJ4:
                open(replace_file_extension(target_path, '.proj4'),
                     'wt').write(geometry_proj4)
        if len(t) == 0:
            excluded_column_names.extend(
                ['geometry_layer', 'geometry_proj4', 'geometry_object'])
            t['wkt'] = ''
        t = t.drop(columns=excluded_column_names)

        with TemporaryStorage() as storage:
            temporary_path = join(storage.folder, 'geotable.csv')
            super(GeoTable, t).to_csv(temporary_path, **kw)
            if has_archive_extension(target_path):
                compress(storage.folder, target_path)
            else:
                move_path(target_path, temporary_path)
예제 #2
0
 def prepare_argument_path(
         self, argument_noun, raw_arguments, draft_folder, default_path):
     data_type = get_data_type(argument_noun)
     # If client sent direct content (x_table_csv), save it
     for file_format in data_type.formats:
         raw_argument_name = '%s_%s' % (argument_noun, file_format)
         if raw_argument_name not in raw_arguments:
             continue
         source_text = raw_arguments[raw_argument_name]
         target_name = '%s.%s' % (argument_noun, file_format)
         return copy_text(join(draft_folder, target_name), source_text)
     # Raise KeyError if client did not specify noun (x_table)
     v = raw_arguments[argument_noun]
     # If client sent multipart content, save it
     if hasattr(v, 'file'):
         target_name = argument_noun + get_file_extension(v.filename)
         return copy_file(join(draft_folder, target_name), v.file)
     # If client sent empty content, use default
     if v == '':
         if not default_path:
             raise KeyError
         target_name = argument_noun + get_file_extension(default_path)
         return link_path(join(draft_folder, target_name), default_path)
     # If client sent a relative path (x_table=11/x/y.csv), find it
     if '/' in v:
         source_path = self.get_file_path(*parse_result_relative_path(v))
         target_name = argument_noun + get_file_extension(source_path)
         return link_path(join(draft_folder, target_name), source_path)
     # If client sent an upload id (x_table=x), find it
     upload = get_upload(self, upload_id=v)
     source_path = join(upload.folder, data_type.get_file_name())
     target_name = argument_noun + get_file_extension(source_path)
     target_path = move_path(join(draft_folder, target_name), source_path)
     remove_safely(upload.folder)
     return target_path
예제 #3
0
 def prepare_argument_path(self, argument_noun, raw_arguments, draft_folder,
                           default_path):
     data_type = get_data_type(argument_noun)
     # If client sent direct content (x_table_csv), save it
     for file_format in data_type.formats:
         raw_argument_name = '%s_%s' % (argument_noun, file_format)
         if raw_argument_name not in raw_arguments:
             continue
         source_text = raw_arguments[raw_argument_name]
         target_name = '%s.%s' % (argument_noun, file_format)
         return copy_text(join(draft_folder, target_name), source_text)
     # Raise KeyError if client did not specify noun (x_table)
     v = raw_arguments[argument_noun]
     # If client sent multipart content, save it
     if hasattr(v, 'file'):
         target_name = argument_noun + get_file_extension(v.filename)
         return copy_file(join(draft_folder, target_name), v.file)
     # If client sent empty content, use default
     if v == '':
         if not default_path:
             raise KeyError
         target_name = argument_noun + get_file_extension(default_path)
         return link_path(join(draft_folder, target_name), default_path)
     # If client sent a relative path (x_table=11/x/y.csv), find it
     if '/' in v:
         source_path = self.get_file_path(*parse_result_relative_path(v))
         target_name = argument_noun + get_file_extension(source_path)
         return link_path(join(draft_folder, target_name), source_path)
     # If client sent an upload id (x_table=x), find it
     upload = get_upload(self, upload_id=v)
     source_path = realpath(join(upload.folder, data_type.get_file_name()))
     target_name = argument_noun + get_file_extension(source_path)
     target_path = move_path(join(draft_folder, target_name), source_path)
     remove_safely(upload.folder)
     return target_path
예제 #4
0
 def migrate_arguments(self, result_arguments, source_folder):
     d = OrderedDict()
     make_folder(source_folder)
     for k, v in result_arguments.items():
         if k.endswith('_path'):
             v = move_path(join(source_folder, basename(v)), v)
         d[k] = v
     return d