Skip to content
Open
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
21 changes: 21 additions & 0 deletions adit/core/templates/core/admin_section.html
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,27 @@ <h5>Job Overview</h5>
{% endfor %}
</tbody>
</table>
<h5>Upload Sessions</h5>
<table class="table table-bordered">
<thead>
<tr>
<th>Created by</th>
<th>Created at</th>
<th>Upload Size</th>
<th>Uploaded Files</th>
</tr>
</thead>
<tbody>
{% for session in upload_stats %}
<tr>
<td>{{ session.owner }}</td>
<td>{{ session.time_opened }}</td>
<td>{{ session.upload_size | filesizeformat }}</td>
<td>{{ session.uploaded_file_count }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<h5>Admin Tools</h5>
<ul class="list-group">
<li class="list-group-item">
Expand Down
3 changes: 3 additions & 0 deletions adit/core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
from procrastinate.contrib.django import app

from adit.core.utils.model_utils import reset_tasks
from adit.upload.apps import collect_top_sessions

from .models import DicomJob, DicomTask
from .site import job_stats_collectors
Expand All @@ -40,12 +41,14 @@
def admin_section(request: HttpRequest) -> HttpResponse:
status_list = DicomJob.Status.choices
job_stats = [collector() for collector in job_stats_collectors]
upload_stats = collect_top_sessions()
return render(
request,
"core/admin_section.html",
{
"status_list": status_list,
"job_stats": job_stats,
"upload_stats": upload_stats,
},
)

Expand Down
28 changes: 27 additions & 1 deletion adit/upload/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,32 @@
from django.contrib import admin

# Register your models here.
from .models import UploadSettings
from .models import UploadSession, UploadSettings

admin.site.register(UploadSettings, admin.ModelAdmin)


class UploadStatisticAdmin(admin.ModelAdmin):
list_display = (
"get_owner",
"id",
"time_opened",
"get_size_in_mb",
"uploaded_file_count",
)
list_filter = ("time_opened", "owner")
search_fields = ("owner__username",)

def get_owner(self, obj):
return obj.owner.username

get_owner.admin_order_field = "owner__username"
get_owner.short_description = "Owner"

def get_size_in_mb(self, obj):
return f"{obj.upload_size / (1024 * 1024):.2f} MB"

get_size_in_mb.short_description = "Upload Size"


admin.site.register(UploadSession, UploadStatisticAdmin)
6 changes: 6 additions & 0 deletions adit/upload/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ def register_app():
)


def collect_top_sessions():
from adit.upload.models import UploadSession

return list(UploadSession.objects.order_by("-time_opened"))[:5]


def create_app_settings():
from .models import UploadSettings

Expand Down
42 changes: 42 additions & 0 deletions adit/upload/migrations/0002_uploadsession.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Generated by Django 5.2.7 on 2025-11-05 11:03

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


class Migration(migrations.Migration):

dependencies = [
("upload", "0001_initial"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]

operations = [
migrations.CreateModel(
name="UploadSession",
fields=[
(
"id",
models.UUIDField(
default=uuid.uuid4,
editable=False,
primary_key=True,
serialize=False,
),
),
("time_opened", models.DateTimeField(auto_now_add=True)),
("upload_size", models.IntegerField(default=0)),
("uploaded_file_count", models.IntegerField(default=0)),
(
"owner",
models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="%(app_label)s_jobs",
to=settings.AUTH_USER_MODEL,
),
),
],
),
]
19 changes: 19 additions & 0 deletions adit/upload/models.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
import uuid

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

from adit.core.models import DicomAppSettings


Expand All @@ -10,3 +15,17 @@ class Meta:
]


class UploadSession(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
time_opened = models.DateTimeField(auto_now_add=True)
upload_size = models.IntegerField(default=0)
uploaded_file_count = models.IntegerField(default=0)
owner_id: int
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name="%(app_label)s_jobs",
)

def __str__(self) -> str:
return f"{self.__class__.__name__} [{self.pk}]"
Loading
Loading