πŸ—‚οΈ πŸ” Geospatial Data Management and Search API - Django Apps

Overview

logo

codecov ci PyPI

Geospatial Data API in Django

Resonant GeoData (RGD) is a series of Django applications well suited for cataloging and searching annotated geospatial imagery, shapefiles, and full motion video datasets.

A publicly deployed instance of this application is available at https://www.resonantgeodata.com - find the deployment code for this at ResonantGeoData/RD-OpenGeo

Search Interface Raster Viewer with ROI Extraction Tool
homepage roi-extraction

Highlights

  • Faceted searching of spatiotemporal data
  • Supports normal imagery and overhead raster imagery
  • Supports image annotations: polygons, bounding boxes, keypoints, and run-length-encoded masks
  • Built-in image tile server
  • 3D viewer for point clouds and mesh files
  • Extract Regions of Interest from imagery

Documentation

Each app's README file contains an overview of functionality.

Documentation is currently a work in progress.

For general questions about the project, its applications, or about software usage, please create an issue directly in this repository. You are also welcome to send us an email at [email protected] with the subject line including Resonant GeoData.

Connections

  • Resonant GeoData is built on top of Kitware's Girder 4 platform.
  • GeoJS: we leverage GeoJS for our interactive map view.
  • large_image: we leverage large_image to serve image tiles and extract thumbnails.
  • VTK.js: we use VTK.js for the client-side 3D viewer for 3D data.
  • KWIVER: we leverage KWIVER's Full Motion Video (FMV) processing capabilities to extract spatial information from FMV files.
  • KWCOCO: KWCOCO is an extension of the COCO image annotation format which we support for ingesting annotated imagery.

Contributing

Please see the adjacent DEVELOPMENT.md file for all development instructions.

Comments
  • Dev/xdoctest

    Dev/xdoctest

    Builds on #493

    Adds declaration of xdoctest as a test dependency and adds the flags to tox. I also added a second simple doctest to spatial_search_params.

    opened by Erotemic 12
  • Redesign geodata models to support non-spatial data

    Redesign geodata models to support non-spatial data

    Per team discussion, we need to support non-spatial imagery as well.

    I will brainstorm a new model hierarchy and post it here, then sync up with David about the implementation. I already have a few ideas about how we can make this work in a general fashion while keeping the SpatialEntry concept that informed our initial model design.

    opened by banesullivan 12
  • STAC Browser

    STAC Browser

    This imports version 2.0.0 of the STAC Browser. The build process was difficult to automate (a couple patches), so I made the decision to build and commit the result into the tree. STAC Browser 3.0.0 is the next release, so we can automate the build process there.

    The existing STAC-API was fleshed out a bit more to handle the browser.

    The STAC Browser is visible at /rgd_imagery/stac_browser/.

    Here is an example browsing the user's "default" collection:

    Capture

    opened by mcovalt 10
  • Allow lazy random access to files in Storage on S3

    Allow lazy random access to files in Storage on S3

    When a Django FieldFile (the object referenced by a FileField) is opened, both in development with MinIO and in production with AWS S3, the Storage layers download a whole file write it to a SpooledTemporaryFile (which is in-memory for small content and on-disk for larger content)

    • S3Boto3Storage: https://github.com/jschneier/django-storages/blob/770332b598712da27ecdba75c9e202ad6a1a8722/storages/backends/s3boto3.py#L132
    • MinioStorage: https://github.com/py-pa/django-minio-storage/blob/8ce77cd8eae0d86fa3200e74cde64144c0338f37/minio_storage/files.py#L130

    However, many operations need random access to only a small part of the file's content.

    If all that's necessary is a Python file-like object (which is the same interface that a Django FieldFile naturally provides), we could look into developing a new Storage wrapper which lazily loads the content of the file-like object, internally using HTTP Range requests to only download the required parts just-in-time to be read from. This would likely also include some caching of the parts once they are retrieved.

    If external tools (like GDAL) need access via a filesystem path (i.e. what's provided by field_file_to_local_path), then FUSE may be the most appropriate abstraction. However, FUSE could not be run on Heroku and might generally be more difficult to install for new developers.

    In either case (Python file-like object or FUSE), the underlying logic for how to fetch and cache portions of file content may be the same.

    opened by brianhelba 10
  • psycopg2.errors.UniqueViolation: duplicate key value error

    psycopg2.errors.UniqueViolation: duplicate key value error

    When running the demo data commands that I have, if the celery worker is set up to run in the background, an integretiy error for duplicate keys happens on the image_entry.save() call here:

    https://github.com/ResonantGeoData/ResonantGeoData/blob/998a6c3995b4421c3632979a249fb78d66e1108f/rgd/geodata/models/imagery/etl.py#L69

    The error:

    Traceback (most recent call last):
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
    psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "geodata_imageentry_image_file_id_key"
    DETAIL:  Key (image_file_id)=(14) already exists.
    

    This is making me think that when we create a new ImageEntry in the tasks, there is some sort of race condition between jobs for the same ImageFile... which shouldn't happen? I'm not really sure what is going on here.

    Steps to reproduce

    1. Clear the database volume
    2. Apply migrations: docker-compose run --rm django ./manage.py migrate
    3. In one session, launch the celery worker: docker-compose up celery and wait until ready
    4. In another session, run the Landsat demo data command: docker-compose run --rm django ./manage.py landsat_data -c 3
      • Use the changes from #296
    5. Observe the error

    Error Message

    Traceback (most recent call last):
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
    psycopg2.errors.UniqueViolation: duplicate key value violates unique constraint "geodata_imageentry_image_file_id_key"
    DETAIL:  Key (image_file_id)=(14) already exists.
    
    
    The above exception was the direct cause of the following exception:
    
    Traceback (most recent call last):
      File "./manage.py", line 28, in <module>
        main()
      File "./manage.py", line 24, in main
        execute_from_command_line(sys.argv)
      File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
        utility.execute()
      File "/usr/local/lib/python3.8/site-packages/django/core/management/__init__.py", line 413, in execute
        self.fetch_command(subcommand).run_from_argv(self.argv)
      File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 354, in run_from_argv
        self.execute(*args, **cmd_options)
      File "/usr/local/lib/python3.8/site-packages/django/core/management/base.py", line 398, in execute
        output = self.handle(*args, **options)
      File "/opt/django-project/rgd/geodata/management/commands/landsat_data.py", line 49, in handle
        helper.load_raster_files(_get_landsat_urls(count))
      File "/opt/django-project/rgd/geodata/management/commands/_data_helper.py", line 80, in load_raster_files
        imentries = load_image_files(
      File "/opt/django-project/rgd/geodata/management/commands/_data_helper.py", line 56, in load_image_files
        result = load_image_files(imfile)
      File "/opt/django-project/rgd/geodata/management/commands/_data_helper.py", line 60, in load_image_files
        read_image_file(entry)
      File "/opt/django-project/rgd/geodata/models/imagery/etl.py", line 129, in read_image_file
        _read_image_to_entry(image_entry, file_path)
      File "/opt/django-project/rgd/geodata/models/imagery/etl.py", line 69, in _read_image_to_entry
        image_entry.save()
      File "/opt/django-project/rgd/geodata/models/common.py", line 51, in save
        super(ModifiableEntry, self).save(*args, **kwargs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 726, in save
        self.save_base(using=using, force_insert=force_insert,
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 763, in save_base
        updated = self._save_table(
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 868, in _save_table
        results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/base.py", line 906, in _do_insert
        return manager._insert(
      File "/usr/local/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
        return getattr(self.get_queryset(), name)(*args, **kwargs)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/query.py", line 1268, in _insert
        return query.get_compiler(using=using).execute_sql(returning_fields)
      File "/usr/local/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1410, in execute_sql
        cursor.execute(sql, params)
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 98, in execute
        return super().execute(sql, params)
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 66, in execute
        return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
        return executor(sql, params, many, context)
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
      File "/usr/local/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
        raise dj_exc_value.with_traceback(traceback) from exc_value
      File "/usr/local/lib/python3.8/site-packages/django/db/backends/utils.py", line 84, in _execute
        return self.cursor.execute(sql, params)
    django.db.utils.IntegrityError: duplicate key value violates unique constraint "geodata_imageentry_image_file_id_key"
    DETAIL:  Key (image_file_id)=(14) already exists.
    
    bug 
    opened by banesullivan 9
  • Large image

    Large image

    Closes #260

    This is a simple tile server endpoint. It's not an app as was imagined. There's a πŸ’―abstractβ„’ app in 701293890f75b646d042da877289646ebac88a7f. It started feeling silly for just one endpoint, so it was reverted. It may be useful down the road.

    I didn't want to deal with the context manager to download/cleanup S3 files, so instead I'm using /vsis3/ and /vsicurl/. You can see the implementation in 8b4d2fc6f162447c128b1a4fdb17e8353853dd09. I think it's simpler and luckily results in a pretty quick tile server. It was tested with other ETL routines in ed9bd8ae57e3d9c9ff9f891847a051073280b2ce, which seemed to work fine, but that was reverted to stay on topic with this PR.

    New endpoints:

    • api/geodata/imagery/image_entry/<pk>/tiles: get an ImageEntry's metadata
    • api/geodata/imagery/image_entry/<pk>/tiles/<z>/<x>/<y>.jpg: get an ImageEntry's x, y tile at zoom-level z
    opened by mcovalt 9
  • Rgdc usability improvements

    Rgdc usability improvements

    This MR contains 3 small improvements to rgdc.Rgdc.

    1. Add 5 automatic retries on all GET requests. This is to guard against random 503 errors from rate-limiting that would be fixed by simply rerunning the command. The implementation is to bake this into the Session object; see https://www.peterbe.com/plog/best-practice-with-retries-with-requests for the approach.
    2. Add overwrite=False kwarg to download_raster_entry. This will skip files already on disk - handy for speeding up tests and making scripts idempotent.
    3. Perhaps a more controversial one: let download_raster_entry and download_raster_entry_thumbnail directly parse a dict returned by search to find the id, rather than the user having to make another request manually as in the README example or study that dict to find it. I believe this will improve usability for the current use cases, as the users of this client should need to know as little as possible about the internals of RGD's data representation (and web programming in general, for that matter) to get started. But I am open to ideas to implement this in a more principled and future-proof way.
    opened by matt-bernstein 8
  • fix thumbnails and outline geometry

    fix thumbnails and outline geometry

    Resolve #176

    For future reference, use the following example rasters to verify that the thumbnails are working.

    • LC08_L1TP_033032_20200422_20200508_01_T1_pixel_qa.tif
    • landcover_sample_2000.tif
    • vegdri_emodis_week34_082320.tif

    Summary of change:

    • new admin actions to reprocess image entries and raster entries (calls save to trigger save event and recreate the thumbnail or spatial reference)
    • added a helper method to reproject an open rasterio raster to a given ESPG
    • During image thumbnail generation routine: reproject raster to Web Mercator before extracting if the image file has a spatial reference
    • During raster outline/valid footprint calculation:
      • first, reproject the raster to the DB's spatial reference (something was off when transforming the extracted geometry)
      • use rasterio/GDAL to extract a mask and create the GeoJSON feature (as opposed to our own convex hull approach)
    • Raster detail view page now limits the view bounds on the map
    • Update centroids in the raster tests since we are extracting the geometry properly now
    opened by banesullivan 8
  • `yield_checksumfiles` function doesn't handle `ChecksumFiles` with file paths as their `name` correctly

    `yield_checksumfiles` function doesn't handle `ChecksumFiles` with file paths as their `name` correctly

    To reproduce, run this management script and then try to view the Raster that it creates. The tile requests will fail with 500 errors with errors about wrong file paths in the server log.

    I came across this bug when working on Danesfield. On that project we encode the file path of a given ChecksumFile inside the name column - for example, foo/bar/foobar.txt represents a file hierarchy of

    foo/
      bar/
        foobar.txt
    

    This line in RGD is incompatible with this approach, since it assumes the ChecksumFile name is a flat file name instead of a file path. For example, if we have a ChecksumFile with the name foo.tiff, the current code would work:

    path = '/tmp/rgd/file_cache/foo.tiff'
    with yield_checksumfiles([self], path.parent):
        yield path
    

    Note that path.parent would be /tmp/rgd/file_cache/foo.tiff, which is correct. But if the file name is a/b/c/foo.tiff:

    path = '/tmp/rgd/file_cache/a/b/c/foo.tiff'
    with yield_checksumfiles([self], path.parent):
        yield path
    

    the call to path.parent would evaluate to /tmp/rgd/file_cache/a/b/c, which is incorrect and leads to 500 errors since the server can't find the files in that location.

    bug 
    opened by mvandenburgh 7
  • Add more base maps

    Add more base maps

    Add the base maps from here: https://carto.com/help/building-maps/basemap-list/#carto-vector-basemaps

    and this one for google imagery: https://mt1.google.com/vt/lyrs=s&x={x}&y={y}&z={z}

    feature-request 
    opened by banesullivan 7
  • large_image tiling issue with specific dataset

    large_image tiling issue with specific dataset

    Recently, large_image started failing to serve tiles for this dataset: https://data.kitware.com/#item/5f9c316650a41e3d1920ef90

    We were originally using this raster for some testing of the large_image tile serving endpoint, so I know it worked at one point.

    Recently, I started seeing this numpy error when trying to serve tiles for this file:

    ...
                                      File "/usr/local/lib/python3.8/site-packages/nu
    django_1    |                     mpy/core/getlimits.py", line 523, in __init__
    django_1    |                         raise ValueError("Invalid integer data type
    django_1    |                     %r." % (self.kind,))
    django_1    |                     ValueError: Invalid integer data type 'f'.
    
    django_1    | [16:42:08] ERROR    Internal Server Error: /api/geodata/imagery/image log.py:224
    django_1    |                     _entry/159/tiles/12/830/1565.png
    django_1    |                     Traceback (most recent call last):
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/core/handlers/exception.py", line 47, in
    django_1    |                     inner
    django_1    |                         response = get_response(request)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/core/handlers/base.py", line 181, in
    django_1    |                     _get_response
    django_1    |                         response = wrapped_callback(request,
    django_1    |                     *callback_args, **callback_kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/views/decorators/csrf.py", line 54, in
    django_1    |                     wrapped_view
    django_1    |                         return view_func(*args, **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/views/generic/base.py", line 70, in view
    django_1    |                         return self.dispatch(request, *args,
    django_1    |                     **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 509, in dispatch
    django_1    |                         response = self.handle_exception(exc)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 469, in
    django_1    |                     handle_exception
    django_1    |                         self.raise_uncaught_exception(exc)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 480, in
    django_1    |                     raise_uncaught_exception
    django_1    |                         raise exc
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 506, in dispatch
    django_1    |                         response = handler(request, *args, **kwargs)
    django_1    |                       File
    django_1    |                     "/opt/django-project/rgd/geodata/api/tiles.py",
    django_1    |                     line 36, in get
    django_1    |                         tile_binary = tile_source.getTile(x, y, z)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/cache_util/cache.py", line 102, in
    django_1    |                     wrapper
    django_1    |                         v = func(self, *args, **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image_source_gdal/__init__.py", line 692, in
    django_1    |                     getTile
    django_1    |                         return self._outputTile(tile,
    django_1    |                     TILE_FORMAT_NUMPY, x, y, z,
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1486, in
    django_1    |                     _outputTile
    django_1    |                         tile, mode = self._outputTileNumpyStyle(tile,
    django_1    |                     applyStyle, x, y, z, kwargs.get('frame'))
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1444, in
    django_1    |                     _outputTileNumpyStyle
    django_1    |                         tile = self._applyStyle(tile, self.style, x,
    django_1    |                     y, z, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1406, in
    django_1    |                     _applyStyle
    django_1    |                         min = self._getMinMax('min', entry.get('min',
    django_1    |                     'auto'), image.dtype, bandidx, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1318, in
    django_1    |                     _getMinMax
    django_1    |                         self._scanForMinMax(dtype, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image_source_gdal/__init__.py", line 264, in
    django_1    |                     _scanForMinMax
    django_1    |                         self._bandRanges[frame]['max'], numpy.iinfo(s
    django_1    |                     elf._bandRanges[frame]['max'].dtype).max)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/nu
    django_1    |                     mpy/core/getlimits.py", line 523, in __init__
    django_1    |                         raise ValueError("Invalid integer data type
    django_1    |                     %r." % (self.kind,))
    django_1    |                     ValueError: Invalid integer data type 'f'.
    django_1    |            ERROR    Internal Server Error: /api/geodata/imagery/image log.py:224
    django_1    |                     _entry/159/tiles/12/831/1566.png
    django_1    |                     Traceback (most recent call last):
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/core/handlers/exception.py", line 47, in
    django_1    |                     inner
    django_1    |                         response = get_response(request)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/core/handlers/base.py", line 181, in
    django_1    |                     _get_response
    django_1    |                         response = wrapped_callback(request,
    django_1    |                     *callback_args, **callback_kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/views/decorators/csrf.py", line 54, in
    django_1    |                     wrapped_view
    django_1    |                         return view_func(*args, **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/dj
    django_1    |                     ango/views/generic/base.py", line 70, in view
    django_1    |                         return self.dispatch(request, *args,
    django_1    |                     **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 509, in dispatch
    django_1    |                         response = self.handle_exception(exc)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 469, in
    django_1    |                     handle_exception
    django_1    |                         self.raise_uncaught_exception(exc)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 480, in
    django_1    |                     raise_uncaught_exception
    django_1    |                         raise exc
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/re
    django_1    |                     st_framework/views.py", line 506, in dispatch
    django_1    |                         response = handler(request, *args, **kwargs)
    django_1    |                       File
    django_1    |                     "/opt/django-project/rgd/geodata/api/tiles.py",
    django_1    |                     line 36, in get
    django_1    |                         tile_binary = tile_source.getTile(x, y, z)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/cache_util/cache.py", line 102, in
    django_1    |                     wrapper
    django_1    |                         v = func(self, *args, **kwargs)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image_source_gdal/__init__.py", line 692, in
    django_1    |                     getTile
    django_1    |                         return self._outputTile(tile,
    django_1    |                     TILE_FORMAT_NUMPY, x, y, z,
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1486, in
    django_1    |                     _outputTile
    django_1    |                         tile, mode = self._outputTileNumpyStyle(tile,
    django_1    |                     applyStyle, x, y, z, kwargs.get('frame'))
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1444, in
    django_1    |                     _outputTileNumpyStyle
    django_1    |                         tile = self._applyStyle(tile, self.style, x,
    django_1    |                     y, z, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1407, in
    django_1    |                     _applyStyle
    django_1    |                         max = self._getMinMax('max', entry.get('max',
    django_1    |                     'auto'), image.dtype, bandidx, frame)
    django_1    |                       File "/usr/local/lib/python3.8/site-packages/la
    django_1    |                     rge_image/tilesource/base.py", line 1335, in
    django_1    |                     _getMinMax
    django_1    |                         value =
    django_1    |                     self._bandRanges[frame]['max'][bandidx]
    django_1    |                     IndexError: index 1 is out of bounds for axis 0
    django_1    |                     with size 1
    

    @manthey, any insight here?

    FYI, this raster is a part of our demo_data command.

    bug 
    opened by banesullivan 7
  • kwiver test failing

    kwiver test failing

    I cannot reproduce this error outside of the tox testing environment:

    https://github.com/ResonantGeoData/ResonantGeoData/runs/5993156571?check_suite_focus=true#step:7:60

    I added a skip for the failing test in

    https://github.com/ResonantGeoData/ResonantGeoData/commit/cd01ca20c99be4e69500d1bc1732b29a92c2214e

    The error logs are: stderr.txt

    the most likely culprit is

    terminate called after throwing an instance of 'pybind11::error_already_set'
      what():  ImportError: /usr/local/lib/python3.8/lib-dynload/_posixsubprocess.cpython-38-x86_64-linux-gnu.so: undefined symbol: PyTuple_Type
    

    I cannot figure out why this is all of a sudden failing - no obvious packages have recently been upgraded

    bug 
    opened by banesullivan 1
  • Persistent S3 test file

    Persistent S3 test file

    We need a persistent file on S3 to test our file handling.

    At present, we have the following fixture:

    https://github.com/ResonantGeoData/ResonantGeoData/blob/f41be685481d3f62457aba1001faa68012760ffc/testing-utils/rgd_testing_utils/data_fixtures.py#L51-L53

    but that is currently failing with object nor found errors.

    This is not the first time this has happened and I've updated that fixture. I will temporarily patch this with another file from that bucket, but we really need to find a file, any file on S3 that we can rely on persisting.

    opened by banesullivan 0
  • migrate collection to FileSet

    migrate collection to FileSet

    • [ ] Add concrete definitions for all models in rgd and rgd_imagery
    • [ ] Make sure no two images point to the same FileSet (ref #591)
    • [ ] Change ancillary_files field on Raster to be a manyToManyField to FileSet
      • [ ] make sure this fileset is not used for an Image
    • [ ] add annotation on Image to point to FileSet
    • [ ] Change all relationships to ChecksumFile to point to FileSet per new definitions (Image is the exception and will be well documented why)

    Other things to address/start thinking about:

    • [ ] How does a user upload data? First, create a FileSet, then add ChecksumFiles? how do we implement that in the REST endpoints and Python client cleanly? Can we add some server-rendered pages to handle make this easier for users?
    • [ ] when getting images from an ImageSet, check each Image's FileSet collection before yielding
      • think of the use case where two users privately uploaded processed imagery to that ImageSet (through the ProcessedImage models)

    initial prototyping done in #566

    opened by banesullivan 0
  • Blog: Making a Schema Crosswalk between Django Models and STAC API

    Blog: Making a Schema Crosswalk between Django Models and STAC API

    Title: Making a Schema Crosswalk between Django Models and STAC API

    Description: Kitware offers ResonantGeoData: a Django web application for visualizing and searching geospatial datasets. We added support for interacting with these datasets via the STAC API. This lightning talk will discuss how we made a schema crosswalk from our current API and data models to comply with the STAC API.

    blog 
    opened by banesullivan 0
Releases(0.2.7)
Owner
Resonant GeoData
Geospatial data cataloging with Django
Resonant GeoData
A GitHub Action for checking Django migrations

πŸ” Django migrations checker A GitHub Action for checking Django migrations About This repository contains a Github Action that checks Django migratio

Oda 5 Nov 15, 2022
Django React Flight Rezervation

Django Intro & Installation python -m venv venv source ./venv/Scripts/activate pip install Django pip install djangorestframework pip install python-d

HILMI SARIOGLU 2 May 26, 2022
This is raw connection between redis server and django python app

Django_Redis This repository contains the code for this blogpost. Running the Application Clone the repository git clone https://github.com/xxl4tomxu9

Tom Xu 1 Sep 15, 2022
A Django Online Library Management Project.

Why am I doing this? I started learning πŸ“– Django few months back, and this is a practice project from MDN Web Docs that touches the aspects of Django

1 Nov 13, 2021
This Django app will be used to host Source.Python plugins, sub-plugins, and custom packages.

Source.Python Project Manager This Django app will be used to host Source.Python plugins, sub-plugins, and custom packages. Want to help develop this

2 Sep 24, 2022
xsendfile etc wrapper

Django Sendfile This is a wrapper around web-server specific methods for sending files to web clients. This is useful when Django needs to check permi

John Montgomery 476 Dec 01, 2022
Django datatables and widgets, both AJAX and traditional. Display-only ModelForms.

Django datatables and widgets, both AJAX and traditional. Display-only ModelForms. ModelForms / inline formsets with AJAX submit and validation. Works with Django templates.

Dmitriy Sintsov 132 Dec 14, 2022
Reusable, generic mixins for Django

django-braces Mixins for Django's class-based views. Documentation Read The Docs Installation Install from PyPI with pip: pip install django-braces Bu

Brack3t 1.9k Jan 05, 2023
A Django app to accept payments from various payment processors via Pluggable backends.

Django-Merchant Django-Merchant is a django application that enables you to use multiple payment processors from a single API. Gateways Following gate

Agiliq 997 Dec 24, 2022
The best way to have DRY Django forms. The app provides a tag and filter that lets you quickly render forms in a div format while providing an enormous amount of capability to configure and control the rendered HTML.

django-crispy-forms The best way to have Django DRY forms. Build programmatic reusable layouts out of components, having full control of the rendered

4.6k Jan 07, 2023
Cached file system for online resources in Python

Minato Cache & file system for online resources in Python Features Minato enables you to: Download & cache online recsources minato supports the follo

Yasuhiro Yamaguchi 10 Jan 04, 2023
Zendesk Assignment - Django Based Ticket Viewer

Zendesk-Coding-Challenge Django Based Ticket Viewer The assignment has been made using Django. Important methods have been scripted in views.py. Excep

Akash Sampurnanand Pandey 0 Dec 23, 2021
A web app which allows user to query the weather info of any place in the world

weather-app This is a web app which allows user to get the weather info of any place in the world as soon as possible. It makes use of OpenWeatherMap

Oladipo Adesiyan 3 Sep 20, 2021
It's the assignment 1 from the Python 2 course, that requires a ToDoApp with authentication using Django

It's the assignment 1 from the Python 2 course, that requires a ToDoApp with authentication using Django

0 Jan 20, 2022
A pickled object field for Django

django-picklefield About django-picklefield provides an implementation of a pickled object field. Such fields can contain any picklable objects. The i

Gintautas Miliauskas 167 Oct 18, 2022
A UUIDField for Django

django-uuidfield Provides a UUIDField for your Django models. Installation Install it with pip (or easy_install): pip install django-uuidfield Usage

David Cramer 265 Nov 30, 2022
MAC address Model Field & Form Field for Django apps

django-macaddress MAC Address model and form fields for Django We use netaddr to parse and validate the MAC address. The tests aren't complete yet. Pa

49 Sep 04, 2022
This is a Django app that uses numerous Google APIs such as reCAPTURE, maps and waypoints

Django project that uses Googles APIs to auto populate fields, display maps and routes for multiple waypoints

Bobby Stearman 57 Dec 03, 2022
REST API with Django and SQLite3

REST API with Django and SQLite3

Luis QuiΓ±ones Requelme 1 Nov 07, 2021
A pickled object field for Django

django-picklefield About django-picklefield provides an implementation of a pickled object field. Such fields can contain any picklable objects. The i

Gintautas Miliauskas 167 Oct 18, 2022