Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions geoinsight/core/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from django.contrib import admin

from geoinsight.core.models import (
Basemap,
Chart,
ColorConfig,
Colormap,
Expand All @@ -25,6 +26,11 @@
)


@admin.register(Basemap)
class BasemapAdmin(admin.ModelAdmin):
list_display = ['id', 'name']


@admin.register(Project)
class ProjectAdmin(admin.ModelAdmin):
list_display = ['id', 'name']
Expand Down
46 changes: 46 additions & 0 deletions geoinsight/core/migrations/0017_basemaps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Generated by Django 5.2.8 on 2025-12-10 16:19

import json
from pathlib import Path

from django.conf import settings
from django.db import migrations, models


def forwards(apps, schema_editor):
basemap_model = apps.get_model('core', 'Basemap')
default_basemaps_file = Path(settings.BASE_DIR, 'geoinsight', 'core', 'models', 'basemaps.json')
with open(default_basemaps_file) as f:
default_basemaps = json.load(f)
for default_basemap in default_basemaps:
name = default_basemap.get('name')
style = default_basemap.get('style')
if name is not None and style is not None:
basemap_model.objects.create(
name=name,
style=style,
)


class Migration(migrations.Migration):

dependencies = [
('core', '0016_dataset_owner_and_tags'),
]

operations = [
migrations.CreateModel(
name='Basemap',
fields=[
(
'id',
models.BigAutoField(
auto_created=True, primary_key=True, serialize=False, verbose_name='ID'
),
),
('name', models.CharField(max_length=100)),
('style', models.JSONField()),
],
),
migrations.RunPython(forwards, migrations.RunPython.noop),
]
2 changes: 2 additions & 0 deletions geoinsight/core/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .basemap import Basemap
from .chart import Chart
from .colormap import Colormap
from .data import RasterData, VectorData, VectorFeature
Expand All @@ -18,6 +19,7 @@
from .task_result import TaskResult

__all__ = [
'Basemap',
'TaskResult',
'Chart',
'Colormap',
Expand Down
14 changes: 14 additions & 0 deletions geoinsight/core/models/basemap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
from django.db import models


class Basemap(models.Model):
name = models.CharField(max_length=100)
style = models.JSONField()

def __str__(self):
return f'{self.name} ({self.id})'

@classmethod
def filter_queryset_by_projects(cls, queryset, projects):
# Basemap permissions are not determined by Project permissions
return queryset
84 changes: 84 additions & 0 deletions geoinsight/core/models/basemaps.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
[
{
"name": "Basic Light",
"style": "https://demo.kitware.com/vector-maps/tiles/style/openstreetmap-openmaptiles-openfreemap-positron.json"
},
{
"name": "Basic Dark",
"style": "https://demo.kitware.com/vector-maps/tiles/style/openstreetmap-openmaptiles-openmaptiles-dark-matter.json"
},
{
"name": "NAIP Imagery",
"style": {
"version": 8,
"name": "NAIP",
"sources": {
"naip": {
"type": "raster",
"tiles": [
"https://gis.apfo.usda.gov/arcgis/rest/services/NAIP/USDA_CONUS_PRIME/ImageServer/tile/{z}/{y}/{x}?blankTile=false"
],
"tileSize": 256
}
},
"layers": [
{
"id": "naip-tiles",
"type": "raster",
"source": "naip"
}
]
}
},
{
"name": "OSM",
"style": {
"version": 8,
"sources": {
"osm": {
"type": "raster",
"tiles": [
"https://a.tile.openstreetmap.org/{z}/{x}/{y}.png"
],
"tileSize": 256,
"maxzoom": 19
}
},
"layers": [
{
"id": "osm",
"type": "raster",
"source": "osm"
}
]
}
},
{
"name": "ArcGIS Hybrid",
"style": "https://raw.githubusercontent.com/go2garret/maps/main/src/assets/json/arcgis_hybrid.json"
},
{
"name": "CartoCDN Voyager",
"style": "https://basemaps.cartocdn.com/gl/voyager-gl-style/style.json"
},
{
"name": "ICGC Dark",
"style": "https://geoserveis.icgc.cat/contextmaps/icgc_mapa_base_fosc.json"
},
{
"name": "ICGC Dark Shadow",
"style": "https://geoserveis.icgc.cat/contextmaps/icgc_ombra_fosca.json"
},
{
"name": "ICGC Standard Orthophoto",
"style": "https://geoserveis.icgc.cat/contextmaps/icgc_orto_estandard.json"
},
{
"name": "ICGC Standard Orthophoto Gray",
"style": "https://geoserveis.icgc.cat/contextmaps/icgc_orto_estandard_gris.json"
},
{
"name": "ICGC Hybrid Orthophoto",
"style": "https://geoserveis.icgc.cat/contextmaps/icgc_orto_hibrida.json"
}
]
2 changes: 2 additions & 0 deletions geoinsight/core/rest/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from .analytics import AnalyticsViewSet
from .basemap import BasemapViewSet
from .chart import ChartViewSet
from .colormap import ColormapViewSet
from .data import RasterDataViewSet, VectorDataViewSet
Expand All @@ -12,6 +13,7 @@

__all__ = [
'AnalyticsViewSet',
'BasemapViewSet',
'ChartViewSet',
'ColormapViewSet',
'LayerViewSet',
Expand Down
13 changes: 13 additions & 0 deletions geoinsight/core/rest/basemap.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from rest_framework.viewsets import ModelViewSet

from geoinsight.core.models import Basemap
from geoinsight.core.rest.access_control import GuardianFilter, GuardianPermission
from geoinsight.core.rest.serializers import BasemapSerializer


class BasemapViewSet(ModelViewSet):
queryset = Basemap.objects.all()
serializer_class = BasemapSerializer
permission_classes = [GuardianPermission]
filter_backends = [GuardianFilter]
lookup_field = 'id'
7 changes: 7 additions & 0 deletions geoinsight/core/rest/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from rest_framework import serializers

from geoinsight.core.models import (
Basemap,
Chart,
Colormap,
Dataset,
Expand All @@ -29,6 +30,12 @@ class Meta:
fields = ['id', 'username', 'email', 'first_name', 'last_name', 'is_superuser']


class BasemapSerializer(serializers.ModelSerializer):
class Meta:
model = Basemap
fields = '__all__'


class ProjectPermissionsSerializer(serializers.Serializer):
owner_id = serializers.IntegerField()
collaborator_ids = serializers.ListField(child=serializers.IntegerField())
Expand Down
2 changes: 2 additions & 0 deletions geoinsight/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

from geoinsight.core.rest import (
AnalyticsViewSet,
BasemapViewSet,
ChartViewSet,
ColormapViewSet,
DatasetViewSet,
Expand Down Expand Up @@ -45,6 +46,7 @@
router.register(r'vectors', VectorDataViewSet, basename='vectors')
router.register(r'source-regions', RegionViewSet, basename='source-regions')
router.register(r'networks', NetworkViewSet, basename='networks')
router.register(r'basemaps', BasemapViewSet, basename='basemaps')
router.register(r'analytics', AnalyticsViewSet, basename='analytics')


Expand Down
9 changes: 9 additions & 0 deletions web/src/api/rest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,21 @@ import {
LayerFrame,
TaskResult,
Colormap,
Basemap,
} from "@/types";

export async function getUsers(): Promise<User[]> {
return (await apiClient.get('users/')).data.results;
}

export async function getBasemaps(): Promise<Basemap[]> {
return (await apiClient.get('basemaps/')).data.results;
}

export async function createBasemap(basemap: Basemap): Promise<Basemap> {
return (await apiClient.post('basemaps/', basemap)).data;
}

export async function getProjects(): Promise<Project[]> {
return (await apiClient.get('projects/')).data.results;
}
Expand Down
Loading