Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
c03e295
record select UI
cisar2218 Feb 24, 2026
9ecda27
api permission refactoring
cisar2218 Feb 24, 2026
22720cf
soft delete added to relevant tables
cisar2218 Feb 24, 2026
161bae5
paging (40) added, detectors and organization api revision
cisar2218 Feb 24, 2026
e934539
orval added for openapi interface
cisar2218 Feb 24, 2026
51cdd13
auth architecture impovement: removal of prompt drilling
cisar2218 Feb 24, 2026
ec397e8
measurements and files api revision
cisar2218 Feb 24, 2026
e9aa463
chunky frontend refactoring
cisar2218 Feb 27, 2026
607b29f
refactor: API endpoints and serializers for spectral records and meas…
cisar2218 Feb 27, 2026
5138cea
remove old api endpoints related to spectral records
cisar2218 Feb 27, 2026
423fc80
added processing mixin, measurements processing from multiple spectra…
cisar2218 Feb 27, 2026
5aafb15
formatDate frontend util
cisar2218 Mar 2, 2026
a37f1c7
orval files
cisar2218 Mar 3, 2026
aa78524
Measurement Editor, Record Selector modal & component import fixes
cisar2218 Mar 3, 2026
601f5f6
measurement details: display segments
cisar2218 Mar 3, 2026
1db3618
measurements: json (db, api, frontend: editor and view)
cisar2218 Mar 3, 2026
f2e2b18
detector image added
cisar2218 Mar 3, 2026
d5c65ea
code quality: do not submit request when no token
cisar2218 Mar 4, 2026
45b2997
typo fix
cisar2218 Mar 4, 2026
50754a5
code quality: imports
cisar2218 Mar 4, 2026
bdeb5e9
code quality: orval types
cisar2218 Mar 4, 2026
5d59877
code quality: debug print removed
cisar2218 Mar 4, 2026
0294f31
code quality: typos
cisar2218 Mar 4, 2026
3ad07e8
code quality: empty Exception comment added
cisar2218 Mar 4, 2026
484e012
Update frontend/src/features/organization/pages/UserDetailPage.tsx
cisar2218 Mar 4, 2026
7ac784e
Update frontend/src/features/organization/components/AddOrganizationM…
cisar2218 Mar 4, 2026
f50b256
fix build bugs
roman-dvorak Mar 10, 2026
0f3e90b
fix TS2769 in generated detectors.ts (formData.append with unknown type)
roman-dvorak Mar 10, 2026
882bae1
Add PR checks: pytest and Docker build verification
roman-dvorak Mar 10, 2026
bc2f6a7
mock s3 bucket config, tab icon added
cisar2218 Mar 13, 2026
af180c6
fixes: device page - detector owner displayed. Link to device page.
cisar2218 Mar 20, 2026
e632e9c
feat: update dependencies, install shadcn and integrate Tailwind CSS
cisar2218 Mar 20, 2026
989e1f3
unit test fix, logbook metadata added (db, api), shadcn toaster integ…
cisar2218 Mar 23, 2026
6f5e48b
fix backend endpoint schema
cisar2218 Mar 23, 2026
3b0c9d4
turn off lint rule for only-export-components for shadcn components
cisar2218 Mar 23, 2026
f604e52
.gitignore fix (frontend build)
cisar2218 Mar 23, 2026
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
30 changes: 30 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ on:
push:
branches:
- master
pull_request:
branches:
- master
release:
types: [published]
issue_comment:
Expand Down Expand Up @@ -50,6 +53,33 @@ jobs:
if: always()
run: docker compose -p "ci-${{ github.run_id }}" -f docker-compose.yml down -v

build-check:
runs-on: ubuntu-latest
if: github.event_name == 'pull_request'
strategy:
matrix:
include:
- component: backend
dockerfile: backend.Dockerfile
- component: frontend
dockerfile: frontend.Dockerfile
steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build Docker image (${{ matrix.component }})
uses: docker/build-push-action@v6
with:
context: .
file: ${{ matrix.dockerfile }}
push: false
build-args: |
GIT_COMMIT=${{ github.sha }}
GIT_BRANCH=${{ github.head_ref }}

# Determine deployment environment
prepare:
runs-on: ubuntu-latest
Expand Down
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ dist/
downloads/
eggs/
.eggs/
lib/
/lib/
lib64/
parts/
sdist/
Expand Down
79 changes: 60 additions & 19 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -1,23 +1,64 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Test backend (all)",
"type": "shell",
"command": "docker",
"args": ["compose", "exec", "backend", "pytest", "DOSPORTAL/tests/"],
"group": "test",
"problemMatcher": []
},
{
"label": "Test backend (path)",
"type": "shell",
"command": "docker",
"args": ["compose", "exec", "backend", "pytest", "${input:testPath}"],
"group": "test",
"problemMatcher": []
}
],
"version": "2.0.0",
"tasks": [
{
"label": "Test backend",
"type": "shell",
"command": "docker compose exec backend pytest DOSPORTAL/tests/",
"problemMatcher": []
},
{
"label": "docker compose down",
"type": "shell",
"command": "docker compose down",
"problemMatcher": []
},
{
"label": "docker compose up build",
"type": "shell",
"command": "docker compose up -d --build",
"problemMatcher": []
},
{
"label": "rebuild project",
"dependsOn": [
"docker compose down",
"docker compose up build"
],
"dependsOrder": "sequence"
},
{
"label": "makemigrations & migrate",
"dependsOn": [
"docker compose makemigrations",
"docker compose migrate"
],
"dependsOrder": "sequence"
},
{
"label": "docker compose makemigrations",
"type": "shell",
"command": "docker compose exec backend python manage.py makemigrations"
},
{
"label": "docker compose migrate",
"type": "shell",
"command": "docker compose exec backend python manage.py migrate"
},
{
"label": "orval gen api",
"type": "shell",
"command": "docker compose exec frontend npm run generate-api"
},
{
"label": "Test backend (path)",
"type": "shell",
"command": "docker",
"args": ["compose", "exec", "backend", "pytest", "${input:testPath}"],
"group": "test",
"problemMatcher": []
}
],
"inputs": [
{
"id": "testPath",
Expand Down
2 changes: 2 additions & 0 deletions backend/DOSPORTAL/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
Flight,
MeasurementDataFlight,
MeasurementCampaign,
MeasurementSegment,
Trajectory,
TrajectoryPoint,
SpectrumData,
Expand Down Expand Up @@ -95,6 +96,7 @@ class DetectorAdmin(admin.ModelAdmin):
admin.site.register(Airports, AirportsAdmin)
admin.site.register(Flight)
admin.site.register(MeasurementDataFlight)
admin.site.register(MeasurementSegment)
admin.site.register(MeasurementCampaign)


Expand Down
29 changes: 29 additions & 0 deletions backend/DOSPORTAL/migrations/0006_measurementsegment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Generated by Django 6.0.2 on 2026-02-20 14:30

import django.db.models.deletion
import uuid
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('DOSPORTAL', '0005_alter_spectralrecord_owner'),
]

operations = [
migrations.CreateModel(
name='MeasurementSegment',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('time_from', models.DateTimeField(blank=True, null=True, verbose_name='Segment start time')),
('time_to', models.DateTimeField(blank=True, null=True, verbose_name='Segment end time')),
('position', models.IntegerField(default=0, verbose_name='Position / order within measurement')),
('measurement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='segments', to='DOSPORTAL.measurement', verbose_name='Measurement')),
('spectral_record', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='segments', to='DOSPORTAL.spectralrecord', verbose_name='Spectral record')),
],
options={
'abstract': False,
},
),
]
17 changes: 17 additions & 0 deletions backend/DOSPORTAL/migrations/0007_remove_measurement_records.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 6.0.2 on 2026-02-20 14:49

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('DOSPORTAL', '0006_measurementsegment'),
]

operations = [
migrations.RemoveField(
model_name='measurement',
name='records',
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# Generated by Django 6.0.2 on 2026-02-24 12:03

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


class Migration(migrations.Migration):

dependencies = [
('DOSPORTAL', '0007_remove_measurement_records'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.AddField(
model_name='detector',
name='deleted_at',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='detector',
name='deleted_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='detector',
name='is_deleted',
field=models.BooleanField(db_index=True, default=False),
),
migrations.AddField(
model_name='detectorlogbook',
name='deleted_at',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='detectorlogbook',
name='deleted_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='detectorlogbook',
name='is_deleted',
field=models.BooleanField(db_index=True, default=False),
),
migrations.AddField(
model_name='file',
name='deleted_at',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='file',
name='deleted_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='file',
name='is_deleted',
field=models.BooleanField(db_index=True, default=False),
),
migrations.AddField(
model_name='measurement',
name='deleted_at',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='measurement',
name='deleted_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='measurement',
name='is_deleted',
field=models.BooleanField(db_index=True, default=False),
),
migrations.AddField(
model_name='organization',
name='deleted_at',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='organization',
name='deleted_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='organization',
name='is_deleted',
field=models.BooleanField(db_index=True, default=False),
),
migrations.AddField(
model_name='spectralrecord',
name='deleted_at',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='spectralrecord',
name='deleted_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='spectralrecord',
name='is_deleted',
field=models.BooleanField(db_index=True, default=False),
),
]
18 changes: 18 additions & 0 deletions backend/DOSPORTAL/migrations/0009_detector_created.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 6.0.2 on 2026-02-24 13:04

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('DOSPORTAL', '0008_detector_deleted_at_detector_deleted_by_and_more'),
]

operations = [
migrations.AddField(
model_name='detector',
name='created',
field=models.DateTimeField(auto_now_add=True, null=True),
),
]
27 changes: 27 additions & 0 deletions backend/DOSPORTAL/migrations/0010_measurementartifact.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 6.0.2 on 2026-02-27 08:40

import django.db.models.deletion
import uuid
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('DOSPORTAL', '0009_detector_created'),
]

operations = [
migrations.CreateModel(
name='MeasurementArtifact',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Creation time')),
('artifact', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='measurement_artifacts', to='DOSPORTAL.file', verbose_name='Artifact file')),
('measurement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='artifacts', to='DOSPORTAL.measurement', verbose_name='Measurement')),
],
options={
'abstract': False,
},
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 6.0.2 on 2026-02-27 10:29

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('DOSPORTAL', '0010_measurementartifact'),
]

operations = [
migrations.AddField(
model_name='measurementartifact',
name='artifact_type',
field=models.CharField(choices=[('spectral', 'Processed log file into spectral file (Parquet)')], default='spectral', max_length=50, verbose_name='Artifact type'),
),
]
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 6.0.2 on 2026-02-27 10:30

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('DOSPORTAL', '0011_measurementartifact_artifact_type'),
]

operations = [
migrations.AlterField(
model_name='measurementartifact',
name='artifact_type',
field=models.CharField(choices=[('spectral', 'Processed log file into spectral file (Parquet)'), ('measurement_file', 'Combined measurement parquet file')], default='spectral', max_length=50, verbose_name='Artifact type'),
),
]
Loading
Loading