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: 3 additions & 3 deletions uvdat/core/access_control.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,10 @@ def filter_queryset(self, request, queryset, view):
if not hasattr(queryset, "filter_by_projects"):
raise NotImplementedError

ids = request.query_params.get("project", request.query_params.get("project_id"))
if ids:
project_id = request.query_params.get("project")
if project_id:
# Return queryset filtered by objects that are within these projects
return queryset.filter_by_projects(Project.objects.filter(id__in=ids))
return queryset.filter_by_projects(Project.objects.filter(id=project_id))
Comment thread
brianhelba marked this conversation as resolved.

if request.user.is_superuser:
return queryset
Expand Down
12 changes: 12 additions & 0 deletions uvdat/core/models/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ def read_geojson_data(self) -> dict:
return json.load(f)

def get_summary(self, *, cache=True): # noqa: C901
self.check_color_props_coverage()
if cache and self.summary:
return self.summary
# Limit number of unique values to return for non-numeric fields
Expand Down Expand Up @@ -123,6 +124,17 @@ def get_summary(self, *, cache=True): # noqa: C901
self.save()
return summary

def check_color_props_coverage(self):
if self.summary is not None and self.summary.get("color_props_coverage") is None:
n_covered_features = self.features.filter(
properties__has_keys=["fill", "stroke"]
).count()
coverage = n_covered_features / self.features.count()
self.summary["color_props_coverage"] = (
"none" if coverage == 0 else "full" if coverage == 1 else "partial"
)
self.save()


class VectorFeature(models.Model):
vector_data = models.ForeignKey(
Expand Down
9 changes: 9 additions & 0 deletions uvdat/core/tasks/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from __future__ import annotations

from .chart import convert_chart
Comment thread
annehaley marked this conversation as resolved.
Comment thread
annehaley marked this conversation as resolved.
from .dataset import convert_dataset

__all__ = [
"convert_chart",
"convert_dataset",
]
2 changes: 1 addition & 1 deletion web/src/api/rest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ export async function createDataset(data: any): Promise<Dataset> {
}

export async function deleteDataset(datasetId: number): Promise<Dataset> {
return (await apiClient.delete(`datasets/${datasetId}`)).data;
return (await apiClient.delete(`datasets/${datasetId}/`)).data;
}

export async function getDatasetTags(): Promise<string[]> {
Expand Down
5 changes: 2 additions & 3 deletions web/src/components/projects/ProjectConfig.vue
Original file line number Diff line number Diff line change
Expand Up @@ -223,9 +223,8 @@ onMounted(() => {
watch(selectedProject, resetProjectEdit);

watch(() => projectStore.projectConfigMode, () => {
if (projectStore.currentProject) {
if (projectStore.projectConfigMode) selectProject(projectStore.currentProject)
else projectStore.currentProject = projectStore.availableProjects.find(
if (projectStore.currentProject && !projectStore.projectConfigMode) {
projectStore.currentProject = projectStore.availableProjects.find(
(p) => p.id === projectStore.currentProject?.id
) // trigger project reload
}
Expand Down
63 changes: 39 additions & 24 deletions web/src/components/sidebars/LegendPanel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,16 @@ function setVisibility(layer: Layer, visible = true) {
return l
})
}

function getColorPropsCoverage(layer: Layer) {
const frame_coverages = layerStore.layerFrames(layer).map(
(frame) => frame.vector?.summary?.color_props_coverage || "none"
)
if (frame_coverages.every((c) => c === 'full')) return 'full'
if (frame_coverages.every((c) => c === 'none')) return 'none'
return 'partial'

}
</script>

<template>
Expand All @@ -98,30 +108,35 @@ function setVisibility(layer: Layer, visible = true) {
{{ layer.name }}
<div v-for="colormap_preview in getColormapPreviews(layer)" class="ml-6">
<div v-if="getColormapPreviews(layer).length > 1">{{ colormap_preview.name }}</div>
<span v-if="colormap_preview.useFeatureProps">Use feature color props; default to </span>
<span v-if="colormap_preview.colorBy">color by {{ colormap_preview.colorBy }}</span>
<span v-if="!colormap_preview.colormap">Use default style</span>
<div v-else>
<colormap-preview v-if="!colormap_preview.valueColors" :colormap="colormap_preview.colormap"
:discrete="colormap_preview.discrete" :nColors="colormap_preview.nColors"
:range="colormap_preview.range" />
<v-expansion-panels v-else>
<v-expansion-panel static bg-color="transparent">
<v-expansion-panel-title class="pa-0" min-height="0">
<colormap-preview :colormap="colormap_preview.colormap"
:discrete="colormap_preview.discrete" :nColors="colormap_preview.nColors"
:range="colormap_preview.range" />
</v-expansion-panel-title>
<v-expansion-panel-text>
<div v-for="row in colormap_preview.valueColors">
<div v-if="row" class="d-flex" style="align-items: center;">
<div class="color-square" :style="{ backgroundColor: row.color }"></div>
{{ row.value }}
</div>
</div>
</v-expansion-panel-text>
</v-expansion-panel>
</v-expansion-panels>
<span v-if="colormap_preview.useFeatureProps && getColorPropsCoverage(layer) !== 'none'">
Use feature color properties
<span v-if="getColorPropsCoverage(layer) !== 'full'">; default to </span>
</span>
<div v-if="getColorPropsCoverage(layer) !== 'full'">
<span v-if="colormap_preview.colorBy">color by {{ colormap_preview.colorBy }}</span>
<span v-if="!colormap_preview.colormap">Use default style</span>
<div v-else>
<colormap-preview v-if="!colormap_preview.valueColors" :colormap="colormap_preview.colormap"
:discrete="colormap_preview.discrete" :nColors="colormap_preview.nColors"
:range="colormap_preview.range" />
<v-expansion-panels v-else>
<v-expansion-panel static bg-color="transparent">
<v-expansion-panel-title class="pa-0" min-height="0">
<colormap-preview :colormap="colormap_preview.colormap"
:discrete="colormap_preview.discrete" :nColors="colormap_preview.nColors"
:range="colormap_preview.range" />
</v-expansion-panel-title>
<v-expansion-panel-text>
<div v-for="row in colormap_preview.valueColors">
<div v-if="row" class="d-flex" style="align-items: center;">
<div class="color-square" :style="{ backgroundColor: row.color }"></div>
{{ row.value }}
</div>
</div>
</v-expansion-panel-text>
</v-expansion-panel>
</v-expansion-panels>
</div>
</div>
</div>
</v-list-item>
Expand Down
1 change: 1 addition & 0 deletions web/src/store/project.ts
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,7 @@ export const useProjectStore = defineStore('project', () => {

function clearProjectState() {
availableDatasets.value = undefined;
availableViewStates.value = [];

layerStore.selectedLayers = [];
styleStore.selectedLayerStyles = {};
Expand Down
3 changes: 2 additions & 1 deletion web/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ export interface LayerFrame {

export interface VectorSummary {
feature_types: string[];
properties: Record<string, PropertySummary>
properties: Record<string, PropertySummary>;
color_props_coverage: 'full' | 'partial' | 'none';
}

export interface PropertySummary {
Expand Down