diff --git a/apps/terminal/api/applet/applet.py b/apps/terminal/api/applet/applet.py index 8cf42f75a..1ce665184 100644 --- a/apps/terminal/api/applet/applet.py +++ b/apps/terminal/api/applet/applet.py @@ -5,9 +5,10 @@ from typing import Callable import yaml import os.path -from django.core.files.storage import default_storage from rest_framework import viewsets from django.http import HttpResponse +from django.core.files.storage import default_storage +from django.db.models import Prefetch from rest_framework.decorators import action from rest_framework.request import Request from rest_framework.response import Response @@ -97,16 +98,15 @@ class AppletViewSet(DownloadUploadMixin, viewsets.ModelViewSet): 'download': 'terminal.view_applet', } - def filter_queryset(self, queryset): - queryset = list(super().filter_queryset(queryset)) + def get_queryset(self): + queryset = super().get_queryset() host = self.request.query_params.get('host') - if not host: - return queryset - publication_mapper = {p.applet: p for p in AppletPublication.objects.filter(host_id=host)} - for applet in queryset: - applet.publication = publication_mapper.get(applet) - return queryset + if not host: + return queryset.prefetch_related('publications') + else: + publications = AppletPublication.objects.filter(host_id=host) + return queryset.prefetch_related(Prefetch('publications', queryset=publications)) def perform_destroy(self, instance): if not instance.name: diff --git a/apps/terminal/models/applet/applet.py b/apps/terminal/models/applet/applet.py index 844158136..0d0b37dfc 100644 --- a/apps/terminal/models/applet/applet.py +++ b/apps/terminal/models/applet/applet.py @@ -56,7 +56,7 @@ class Applet(JMSBaseModel): @lazyproperty def publication(self): - return None + return self.publications.latest() class AppletPublication(JMSBaseModel): @@ -67,3 +67,4 @@ class AppletPublication(JMSBaseModel): class Meta: unique_together = ('applet', 'host') + get_latest_by = 'date_created' diff --git a/apps/terminal/serializers/applet.py b/apps/terminal/serializers/applet.py index 3b98b446b..efd337e29 100644 --- a/apps/terminal/serializers/applet.py +++ b/apps/terminal/serializers/applet.py @@ -2,6 +2,7 @@ from rest_framework import serializers from django.utils.translation import gettext_lazy as _ from common.drf.fields import ObjectRelatedField, LabeledChoiceField +from common.const.choices import Status from ..models import Applet, AppletPublication, AppletHost @@ -18,14 +19,13 @@ class AppletUploadSerializer(serializers.Serializer): class AppletPublicationSerializer(serializers.ModelSerializer): applet = ObjectRelatedField(queryset=Applet.objects.all()) host = ObjectRelatedField(queryset=AppletHost.objects.all()) + status = LabeledChoiceField(choices=Status.choices, label=_("Status")) class Meta: model = AppletPublication fields_mini = ['id', 'applet', 'host'] read_only_fields = ['date_created', 'date_updated'] - fields = fields_mini + [ - 'status', 'comment', - ] + read_only_fields + fields = fields_mini + ['status', 'comment'] + read_only_fields class AppletSerializer(serializers.ModelSerializer):