From 023462ec1df956b5fa48dc402bd8ec64e2122325 Mon Sep 17 00:00:00 2001 From: Oleh Korkh Date: Tue, 23 Jan 2024 16:53:17 +0200 Subject: [PATCH 1/7] session status endpoints --- mcserver/admin.py | 1 + .../migrations/0028_auto_20240123_1401.py | 24 +++++++ mcserver/models.py | 3 + mcserver/serializers.py | 17 +++++ mcserver/views.py | 67 ++++++++++++++++++- 5 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 mcserver/migrations/0028_auto_20240123_1401.py diff --git a/mcserver/admin.py b/mcserver/admin.py index 51f6824..6180399 100644 --- a/mcserver/admin.py +++ b/mcserver/admin.py @@ -53,6 +53,7 @@ class SessionAdmin(admin.ModelAdmin): 'id', 'user', 'subject', 'public', 'created_at', 'updated_at', 'server', + 'status', 'status_changed', 'trashed', 'trashed_at', ) raw_id_fields = ('user', 'subject') diff --git a/mcserver/migrations/0028_auto_20240123_1401.py b/mcserver/migrations/0028_auto_20240123_1401.py new file mode 100644 index 0000000..752d111 --- /dev/null +++ b/mcserver/migrations/0028_auto_20240123_1401.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1.14 on 2024-01-23 14:01 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcserver', '0027_auto_20240105_1542'), + ] + + operations = [ + migrations.AddField( + model_name='session', + name='status', + field=models.CharField(blank=True, db_index=True, default='init', max_length=64), + ), + migrations.AddField( + model_name='session', + name='status_changed', + field=models.DateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True), + ), + ] diff --git a/mcserver/models.py b/mcserver/models.py index 8f0406e..9cf8de8 100644 --- a/mcserver/models.py +++ b/mcserver/models.py @@ -57,6 +57,9 @@ class Session(models.Model): public = models.BooleanField(blank=False, null=False, default=False) server = models.GenericIPAddressField(null=True, blank=True) + status = models.CharField(max_length=64, default="init", blank=True, db_index=True) + status_changed = models.DateTimeField(null=True, blank=True, default=timezone.now, db_index=True) + subject = models.ForeignKey( 'Subject', blank=True, null=True, related_name='sessions', diff --git a/mcserver/serializers.py b/mcserver/serializers.py index dd5801d..b4cb5a3 100644 --- a/mcserver/serializers.py +++ b/mcserver/serializers.py @@ -179,6 +179,23 @@ class Meta: ] +class SessionStatusSerializer(serializers.ModelSerializer): + class Meta: + model = Session + fields = ['status'] + + +class SessionIdSerializer(serializers.ModelSerializer): + class Meta: + model = Session + fields = ['id'] + + +class SessionFilteringSerializer(serializers.Serializer): + status = serializers.CharField(max_length=64, required=True) + date_range = serializers.ListField(child=serializers.DateField(), required=False) + + class SubjectSerializer(serializers.ModelSerializer): class Meta: model = Subject diff --git a/mcserver/views.py b/mcserver/views.py index 299a7f1..7b724fe 100644 --- a/mcserver/views.py +++ b/mcserver/views.py @@ -1309,7 +1309,72 @@ def neutral_img(self, request, pk): raise APIException(_("neutral_image_retrieve_error") % {"uuid": str(pk)}) return Response(data) - + + + @action(detail=False, methods=['post'], permission_classes=[IsAdmin | IsBackend | IsOwner]) + def get_session_statuses(self, request): + from .serializers import SessionIdSerializer, SessionFilteringSerializer + try: + filtering_serializer = SessionFilteringSerializer(data=request.data) + serializer = SessionIdSerializer(Session.objects.none(), many=True) + if filtering_serializer.is_valid(): + status_str = filtering_serializer.validated_data.get('status') + date_range = filtering_serializer.validated_data.get('date_range') + filter_kwargs = {'status': status_str} + if date_range: + filter_kwargs['status_changed__gte'] = date_range[0] + filter_kwargs['status_changed__lte'] = date_range[1] + if not IsAdmin().has_permission(request, self) and not IsBackend().has_permission(request, self): + filter_kwargs['user'] = request.user + + sessions = Session.objects.filter(**filter_kwargs) + serializer = SessionIdSerializer(sessions, many=True) + except Http404: + if settings.DEBUG: + raise Exception(_("error") % {"error_message": str(traceback.format_exc())}) + raise NotFound(_("session_uuid_not_found") % {"uuid": str(pk)}) + except ValueError: + if settings.DEBUG: + raise Exception(_("error") % {"error_message": str(traceback.format_exc())}) + raise NotFound(_("session_uuid_not_valid") % {"uuid": str(pk)}) + except Exception: + if settings.DEBUG: + raise Exception(_("error") % {"error_message": str(traceback.format_exc())}) + raise APIException(_("session_remove_error")) + + return Response(serializer.data) + + + @action(detail=True, methods=['post'], permission_classes=[IsAdmin | IsBackend]) + def set_session_status(self, request, pk): + from .serializers import SessionStatusSerializer + try: + if pk == 'undefined': + raise ValueError(_("undefined_uuid")) + + session = get_object_or_404(Session, pk=pk) + serializer = SessionStatusSerializer(data=request.data) + if serializer.is_valid(): + session.status = serializer.validated_data['status'] + session.status_changed = timezone.now() + session.save() + + except Http404: + if settings.DEBUG: + raise Exception(_("error") % {"error_message": str(traceback.format_exc())}) + raise NotFound(_("session_uuid_not_found") % {"uuid": str(pk)}) + except ValueError: + if settings.DEBUG: + raise Exception(_("error") % {"error_message": str(traceback.format_exc())}) + raise NotFound(_("session_uuid_not_valid") % {"uuid": str(pk)}) + except Exception: + if settings.DEBUG: + raise Exception(_("error") % {"error_message": str(traceback.format_exc())}) + raise APIException(_("session_remove_error")) + + return Response(serializer.data) + + ## Processing machine: # A worker asks whether there is any trial to process From 03cb9186b8190620259953d8733405adc2d99525 Mon Sep 17 00:00:00 2001 From: Antoine Falisse Date: Mon, 5 Feb 2024 10:55:39 -0800 Subject: [PATCH 2/7] delete outdated migration file --- .../migrations/0028_auto_20240123_1401.py | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 mcserver/migrations/0028_auto_20240123_1401.py diff --git a/mcserver/migrations/0028_auto_20240123_1401.py b/mcserver/migrations/0028_auto_20240123_1401.py deleted file mode 100644 index 752d111..0000000 --- a/mcserver/migrations/0028_auto_20240123_1401.py +++ /dev/null @@ -1,24 +0,0 @@ -# Generated by Django 3.1.14 on 2024-01-23 14:01 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('mcserver', '0027_auto_20240105_1542'), - ] - - operations = [ - migrations.AddField( - model_name='session', - name='status', - field=models.CharField(blank=True, db_index=True, default='init', max_length=64), - ), - migrations.AddField( - model_name='session', - name='status_changed', - field=models.DateTimeField(blank=True, db_index=True, default=django.utils.timezone.now, null=True), - ), - ] From a075a88e11f67cc61166b25efbb683cbd18bec69 Mon Sep 17 00:00:00 2001 From: Alberto Casas Ortiz Date: Thu, 8 Feb 2024 16:21:27 -0800 Subject: [PATCH 3/7] Implemented tags for subjects. --- mcserver/admin.py | 9 ++ ...ubject_tags_alter_analysisresult_status.py | 96 +++++++++++++++++++ .../0030_rename_tags_subject_subject_tags.py | 18 ++++ ...remove_subject_subject_tags_subjecttags.py | 43 +++++++++ mcserver/models.py | 15 +++ mcserver/serializers.py | 39 ++++++++ mcserver/settings.py | 2 +- mcserver/urls.py | 7 +- mcserver/views.py | 57 ++++++++++- 9 files changed, 283 insertions(+), 3 deletions(-) create mode 100644 mcserver/migrations/0029_subject_tags_alter_analysisresult_status.py create mode 100644 mcserver/migrations/0030_rename_tags_subject_subject_tags.py create mode 100644 mcserver/migrations/0031_remove_subject_subject_tags_subjecttags.py diff --git a/mcserver/admin.py b/mcserver/admin.py index 754ee2a..6abd522 100644 --- a/mcserver/admin.py +++ b/mcserver/admin.py @@ -14,6 +14,7 @@ AnalysisResult, AnalysisDashboardTemplate, AnalysisDashboard, + SubjectTags ) from django.contrib.auth.models import Group from django.contrib.auth.admin import UserAdmin, GroupAdmin @@ -141,6 +142,14 @@ class SubjectAdmin(admin.ModelAdmin): ) raw_id_fields = ('user',) +@admin.register(SubjectTags) +class SubjectTagsAdmin(admin.ModelAdmin): + search_fields = ['tag', 'subject'] + list_display = ( + 'id', + 'tag', + 'subject', + ) @admin.register(ResetPassword) class ResetPasswordAdmin(admin.ModelAdmin): diff --git a/mcserver/migrations/0029_subject_tags_alter_analysisresult_status.py b/mcserver/migrations/0029_subject_tags_alter_analysisresult_status.py new file mode 100644 index 0000000..afee5a8 --- /dev/null +++ b/mcserver/migrations/0029_subject_tags_alter_analysisresult_status.py @@ -0,0 +1,96 @@ +# Generated by Django 4.2 on 2024-02-08 19:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("mcserver", "0028_user_institutional_use"), + ] + + operations = [ + migrations.AddField( + model_name="subject", + name="tags", + field=models.CharField( + blank=True, + choices=[("unimpaired", "Unimpaired")], + max_length=20, + null=True, + ), + ), + migrations.AlterField( + model_name="analysisresult", + name="status", + field=models.IntegerField( + choices=[ + (100, "Continue"), + (101, "Switching Protocols"), + (102, "Processing"), + (103, "Early Hints"), + (200, "OK"), + (201, "Created"), + (202, "Accepted"), + (203, "Non-Authoritative Information"), + (204, "No Content"), + (205, "Reset Content"), + (206, "Partial Content"), + (207, "Multi-Status"), + (208, "Already Reported"), + (226, "IM Used"), + (300, "Multiple Choices"), + (301, "Moved Permanently"), + (302, "Found"), + (303, "See Other"), + (304, "Not Modified"), + (305, "Use Proxy"), + (307, "Temporary Redirect"), + (308, "Permanent Redirect"), + (400, "Bad Request"), + (401, "Unauthorized"), + (402, "Payment Required"), + (403, "Forbidden"), + (404, "Not Found"), + (405, "Method Not Allowed"), + (406, "Not Acceptable"), + (407, "Proxy Authentication Required"), + (408, "Request Timeout"), + (409, "Conflict"), + (410, "Gone"), + (411, "Length Required"), + (412, "Precondition Failed"), + (413, "Request Entity Too Large"), + (414, "Request-URI Too Long"), + (415, "Unsupported Media Type"), + (416, "Requested Range Not Satisfiable"), + (417, "Expectation Failed"), + (418, "I'm a Teapot"), + (421, "Misdirected Request"), + (422, "Unprocessable Entity"), + (423, "Locked"), + (424, "Failed Dependency"), + (425, "Too Early"), + (426, "Upgrade Required"), + (428, "Precondition Required"), + (429, "Too Many Requests"), + (431, "Request Header Fields Too Large"), + (451, "Unavailable For Legal Reasons"), + (500, "Internal Server Error"), + (501, "Not Implemented"), + (502, "Bad Gateway"), + (503, "Service Unavailable"), + (504, "Gateway Timeout"), + (505, "HTTP Version Not Supported"), + (506, "Variant Also Negotiates"), + (507, "Insufficient Storage"), + (508, "Loop Detected"), + (510, "Not Extended"), + (511, "Network Authentication Required"), + ], + default=200, + help_text="Status code function responsed with.", + verbose_name="Status", + ), + ), + ] diff --git a/mcserver/migrations/0030_rename_tags_subject_subject_tags.py b/mcserver/migrations/0030_rename_tags_subject_subject_tags.py new file mode 100644 index 0000000..27b7e6b --- /dev/null +++ b/mcserver/migrations/0030_rename_tags_subject_subject_tags.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2 on 2024-02-08 19:21 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("mcserver", "0029_subject_tags_alter_analysisresult_status"), + ] + + operations = [ + migrations.RenameField( + model_name="subject", + old_name="tags", + new_name="subject_tags", + ), + ] diff --git a/mcserver/migrations/0031_remove_subject_subject_tags_subjecttags.py b/mcserver/migrations/0031_remove_subject_subject_tags_subjecttags.py new file mode 100644 index 0000000..656c961 --- /dev/null +++ b/mcserver/migrations/0031_remove_subject_subject_tags_subjecttags.py @@ -0,0 +1,43 @@ +# Generated by Django 4.2 on 2024-02-08 19:28 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("mcserver", "0030_rename_tags_subject_subject_tags"), + ] + + operations = [ + migrations.RemoveField( + model_name="subject", + name="subject_tags", + ), + migrations.CreateModel( + name="SubjectTags", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("tag", models.TextField()), + ( + "subject", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="mcserver.subject", + ), + ), + ], + options={ + "ordering": ["subject", "tag"], + }, + ), + ] diff --git a/mcserver/models.py b/mcserver/models.py index c16308d..b9e5bd5 100644 --- a/mcserver/models.py +++ b/mcserver/models.py @@ -335,6 +335,21 @@ def save(self, *args, **kwargs): self.birth_year = timezone.now().year - self.age return super().save(*args, **kwargs) + +class SubjectTags(models.Model): + tag = models.TextField(blank=False, null=False) + subject = models.ForeignKey(to=Subject, on_delete=models.CASCADE, blank=False, null=False) + + class Meta: + ordering = ['subject', 'tag'] + + def __str__(self): + return self.subject.name + " - " + self.tag + + verbose_name = 'Subject Tag' + verbose_name_plural = 'Subject Tags' + + class AnalysisFunction(models.Model): """ This model describes AWS Lambda function object. """ diff --git a/mcserver/serializers.py b/mcserver/serializers.py index d2e0b07..0499c92 100644 --- a/mcserver/serializers.py +++ b/mcserver/serializers.py @@ -11,6 +11,7 @@ AnalysisResult, AnalysisDashboardTemplate, AnalysisDashboard, + SubjectTags ) from rest_framework.validators import UniqueValidator from django.db.models import Prefetch @@ -210,8 +211,23 @@ class Meta: 'trashed_at' ] + def create(self, validated_data): + # Extract subject_tags from validated_data + subject_tags_data = validated_data.pop('subject_tags', []) + + # Create the subject instance + subject_instance = Subject.objects.create(**validated_data) + + # Create corresponding tags in SubjectTags table + for tag_data in subject_tags_data: + SubjectTags.objects.create(subject=subject_instance, tag=tag_data) + + return subject_instance + class NewSubjectSerializer(serializers.ModelSerializer): + subject_tags = serializers.ListField(write_only=True, required=False) + class Meta: model = Subject fields = [ @@ -222,12 +238,35 @@ class Meta: 'gender', 'sex_at_birth', 'characteristics', + 'subject_tags', ] def to_representation(self, instance): serializer = SubjectSerializer(instance) return serializer.data + def create(self, validated_data): + # Extract subject_tags from validated_data + subject_tags_data = validated_data.pop('subject_tags', []) + + # Create the subject instance + subject_instance = Subject.objects.create(**validated_data) + + # Insert new tags. + for tag_data in subject_tags_data: + SubjectTags.objects.create(subject=subject_instance, tag=tag_data) + + return subject_instance + + +class TagSerializer(serializers.ModelSerializer): + class Meta: + model = SubjectTags + fields = [ + 'tag', + 'subject', + ] + class AnalysisFunctionSerializer(serializers.ModelSerializer): class Meta: diff --git a/mcserver/settings.py b/mcserver/settings.py index eb4d396..12c962d 100644 --- a/mcserver/settings.py +++ b/mcserver/settings.py @@ -25,7 +25,7 @@ SECRET_KEY = 'iw8ctf3)6e-6e#$&eoou-sqawdm4p(1+*#8tsdqy+6+tx=nlt$' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = config("DEBUG", default=False, cast=bool) +DEBUG = config("DEBUG", default=True, cast=bool) HOST = config("HOST", "127.0.0.1") PROTOCOL = config("PROTOCOL", "http") diff --git a/mcserver/urls.py b/mcserver/urls.py index 72e8faa..5fed26c 100644 --- a/mcserver/urls.py +++ b/mcserver/urls.py @@ -21,6 +21,7 @@ TrialViewSet, ResultViewSet, SubjectViewSet, + SubjectTagViewSet, DownloadFileOnReadyAPIView, UserCreate, UserDelete, @@ -57,6 +58,7 @@ router.register(r'trials', TrialViewSet) router.register(r'results', ResultViewSet) router.register(r'subjects', SubjectViewSet, "subject") +router.register(r'subject-tags', SubjectTagViewSet, "subject-tags") router.register(r'users', UserViewSet) router.register(r'analysis-dashboards', AnalysisDashboardViewSet, "analysis-dashboard") @@ -114,5 +116,8 @@ AnalysisFunctionsStatesForTrialsAPIView.as_view(), name='analysis-results-statuses-for-trials' ), -# path('accounts/login/', OTPAuthenticationForm.as_view(authentication_form=OTPAuthenticationForm)), + path('subject-tags//get_tags_subject/', SubjectTagViewSet.as_view({'get': 'get_tags_subject'}), + name='get_tags_subject'), + + # path('accounts/login/', OTPAuthenticationForm.as_view(authentication_form=OTPAuthenticationForm)), ] diff --git a/mcserver/views.py b/mcserver/views.py index c599d51..f44876e 100644 --- a/mcserver/views.py +++ b/mcserver/views.py @@ -33,6 +33,7 @@ Result, ResetPassword, Subject, + SubjectTags, DownloadLog, AnalysisFunction, AnalysisResult, @@ -56,7 +57,8 @@ AnalysisDashboardTemplateSerializer, AnalysisDashboardSerializer, ProfilePictureSerializer, - UserInstitutionalUseSerializer, + UserInstitutionalUseSerializer, + TagSerializer ) from mcserver.utils import send_otp_challenge from mcserver.zipsession import downloadAndZipSession, downloadAndZipSubject @@ -1740,6 +1742,59 @@ def perform_create(self, serializer): raise Exception(_("error") % {"error_message": str(traceback.format_exc())}) raise APIException(_('subject_create_error')) + def perform_update(self, serializer): + try: + serializer.save() + + tags = serializer.context['request'].data['subject_tags'] + + # Get current subject. + subject = Subject.objects.get(id=serializer.context['request'].data['id']) + + # Remove previous tags. + SubjectTags.objects.filter(subject=subject).delete() + + # Insert new tags. + for tag in tags: + SubjectTags.objects.create(subject=subject, tag=tag) + + print(tags) + except Exception: + if settings.DEBUG: + raise Exception(_("error") % {"error_message": str(traceback.format_exc())}) + raise APIException(_('subject_update_error')) + +class SubjectTagViewSet(viewsets.ModelViewSet): + permission_classes = [IsOwner | IsAdmin | IsBackend] + serializer_class = TagSerializer + + def get_queryset(self): + """ + This view should return a list of all the subjects tags + for the currently authenticated user. + """ + user = self.request.user + # Get all subjects associated to a user. + subject = Subject.objects.filter(user=self.request.user) + + # Get tags associated to those subjects. + tags = SubjectTags.objects.filter(subject__in=list(subject)) + + return tags + + @action(detail=False, methods=['get']) + def get_tags_subject(self, request, subject_id): + # Get subject associated to that id. + subject = Subject.objects.get(id=subject_id, user=self.request.user) + + # Get tags associated to the subject. + tags = list(SubjectTags.objects.filter(subject=subject).values()) + + return Response(tags, status=200) + + + + class DownloadFileOnReadyAPIView(APIView): permission_classes = (AllowAny,) From d0618dec43e19252dda27a1d235b295236eabb77 Mon Sep 17 00:00:00 2001 From: Alberto Casas Ortiz Date: Thu, 8 Feb 2024 16:23:17 -0800 Subject: [PATCH 4/7] Reverted debug to True. --- mcserver/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mcserver/settings.py b/mcserver/settings.py index 12c962d..eb4d396 100644 --- a/mcserver/settings.py +++ b/mcserver/settings.py @@ -25,7 +25,7 @@ SECRET_KEY = 'iw8ctf3)6e-6e#$&eoou-sqawdm4p(1+*#8tsdqy+6+tx=nlt$' # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = config("DEBUG", default=True, cast=bool) +DEBUG = config("DEBUG", default=False, cast=bool) HOST = config("HOST", "127.0.0.1") PROTOCOL = config("PROTOCOL", "http") From 9a3ca4d6f7f4650ff187778ad7fbfb6daa612b8d Mon Sep 17 00:00:00 2001 From: Oleh Korkh Date: Fri, 16 Feb 2024 11:06:27 +0200 Subject: [PATCH 5/7] added optional username argument --- mcserver/serializers.py | 1 + mcserver/views.py | 3 +++ 2 files changed, 4 insertions(+) diff --git a/mcserver/serializers.py b/mcserver/serializers.py index 7368dd7..dc19ca4 100644 --- a/mcserver/serializers.py +++ b/mcserver/serializers.py @@ -205,6 +205,7 @@ class Meta: class SessionFilteringSerializer(serializers.Serializer): status = serializers.CharField(max_length=64, required=True) date_range = serializers.ListField(child=serializers.DateField(), required=False) + username = serializers.CharField(max_length=64, required=False) class SubjectSerializer(serializers.ModelSerializer): diff --git a/mcserver/views.py b/mcserver/views.py index 657bbe4..4d31b99 100644 --- a/mcserver/views.py +++ b/mcserver/views.py @@ -1327,6 +1327,9 @@ def get_session_statuses(self, request): filter_kwargs['status_changed__lte'] = date_range[1] if not IsAdmin().has_permission(request, self) and not IsBackend().has_permission(request, self): filter_kwargs['user'] = request.user + else: + if 'username' in filtering_serializer.validated_data: + filter_kwargs['user__username'] = filtering_serializer.validated_data.get('username') sessions = Session.objects.filter(**filter_kwargs) serializer = SessionIdSerializer(sessions, many=True) From 86fdd1e7a1ff74edffe7b439c3eb24511bcde790 Mon Sep 17 00:00:00 2001 From: Antoine Falisse Date: Tue, 19 Mar 2024 13:42:13 -0700 Subject: [PATCH 6/7] fix migration --- .../migrations/0032_merge_20240319_1339.py | 14 ++++++++++++++ mcserver/migrations/0033_auto_20240319_1339.py | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 mcserver/migrations/0032_merge_20240319_1339.py create mode 100644 mcserver/migrations/0033_auto_20240319_1339.py diff --git a/mcserver/migrations/0032_merge_20240319_1339.py b/mcserver/migrations/0032_merge_20240319_1339.py new file mode 100644 index 0000000..cf88bdf --- /dev/null +++ b/mcserver/migrations/0032_merge_20240319_1339.py @@ -0,0 +1,14 @@ +# Generated by Django 3.1.14 on 2024-03-19 20:39 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcserver', '0029_analysisfunction_info'), + ('mcserver', '0031_remove_subject_subject_tags_subjecttags'), + ] + + operations = [ + ] diff --git a/mcserver/migrations/0033_auto_20240319_1339.py b/mcserver/migrations/0033_auto_20240319_1339.py new file mode 100644 index 0000000..989596c --- /dev/null +++ b/mcserver/migrations/0033_auto_20240319_1339.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.14 on 2024-03-19 20:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mcserver', '0032_merge_20240319_1339'), + ] + + operations = [ + migrations.AlterField( + model_name='analysisresult', + name='status', + field=models.IntegerField(choices=[(100, 'Continue'), (101, 'Switching Protocols'), (102, 'Processing'), (200, 'OK'), (201, 'Created'), (202, 'Accepted'), (203, 'Non-Authoritative Information'), (204, 'No Content'), (205, 'Reset Content'), (206, 'Partial Content'), (207, 'Multi-Status'), (208, 'Already Reported'), (226, 'IM Used'), (300, 'Multiple Choices'), (301, 'Moved Permanently'), (302, 'Found'), (303, 'See Other'), (304, 'Not Modified'), (305, 'Use Proxy'), (307, 'Temporary Redirect'), (308, 'Permanent Redirect'), (400, 'Bad Request'), (401, 'Unauthorized'), (402, 'Payment Required'), (403, 'Forbidden'), (404, 'Not Found'), (405, 'Method Not Allowed'), (406, 'Not Acceptable'), (407, 'Proxy Authentication Required'), (408, 'Request Timeout'), (409, 'Conflict'), (410, 'Gone'), (411, 'Length Required'), (412, 'Precondition Failed'), (413, 'Request Entity Too Large'), (414, 'Request-URI Too Long'), (415, 'Unsupported Media Type'), (416, 'Requested Range Not Satisfiable'), (417, 'Expectation Failed'), (421, 'Misdirected Request'), (422, 'Unprocessable Entity'), (423, 'Locked'), (424, 'Failed Dependency'), (426, 'Upgrade Required'), (428, 'Precondition Required'), (429, 'Too Many Requests'), (431, 'Request Header Fields Too Large'), (500, 'Internal Server Error'), (501, 'Not Implemented'), (502, 'Bad Gateway'), (503, 'Service Unavailable'), (504, 'Gateway Timeout'), (505, 'HTTP Version Not Supported'), (506, 'Variant Also Negotiates'), (507, 'Insufficient Storage'), (508, 'Loop Detected'), (510, 'Not Extended'), (511, 'Network Authentication Required')], default=200, help_text='Status code function responsed with.', verbose_name='Status'), + ), + ] From 714c1f3e10a12b67b5936f61dcc30d68e701bd75 Mon Sep 17 00:00:00 2001 From: Alberto Casas Ortiz Date: Thu, 21 Mar 2024 15:16:34 -0700 Subject: [PATCH 7/7] Solved 500 error in admin panel. --- mcserver/admin.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/mcserver/admin.py b/mcserver/admin.py index 6abd522..4b6e9a2 100644 --- a/mcserver/admin.py +++ b/mcserver/admin.py @@ -58,7 +58,7 @@ class SessionAdmin(admin.ModelAdmin): 'trashed', 'trashed_at', ) raw_id_fields = ('user', 'subject') - search_fields = ['id'] + search_fields = ['id', 'user__username', "subject__name"] inlines = [TrialInline] actions = ['set_subject'] @@ -93,7 +93,7 @@ class ResultInline(admin.TabularInline): @admin.register(Trial) class TrialAdmin(admin.ModelAdmin): - search_fields = ['id', 'session_id'] + search_fields = ['id', 'name', 'session__id'] list_display = ( 'id', 'name', @@ -112,20 +112,20 @@ class ResultAdmin(admin.ModelAdmin): 'id', 'trial', 'tag', 'media', 'device_id', 'created_at', 'updated_at') - search_fields = ['trial'] + search_fields = ['id', 'trial__id'] raw_id_fields = ('trial',) @admin.register(Video) class VideoAdmin(admin.ModelAdmin): - search_fields = ['trial'] - list_display = ('trial', 'video', 'created_at', 'updated_at') + search_fields = ['id', 'trial__id'] + list_display = ('id', 'trial', 'video', 'created_at', 'updated_at') raw_id_fields = ('trial',) @admin.register(Subject) class SubjectAdmin(admin.ModelAdmin): - search_fields = ['name'] + search_fields = ['name', 'user__username'] list_display = ( 'id', 'name', @@ -144,7 +144,7 @@ class SubjectAdmin(admin.ModelAdmin): @admin.register(SubjectTags) class SubjectTagsAdmin(admin.ModelAdmin): - search_fields = ['tag', 'subject'] + search_fields = ['tag', 'subject__name'] list_display = ( 'id', 'tag', @@ -154,7 +154,7 @@ class SubjectTagsAdmin(admin.ModelAdmin): @admin.register(ResetPassword) class ResetPasswordAdmin(admin.ModelAdmin): search_field = ['email'] - list_display = ('email', 'id', 'datetime') + list_display = ['email', 'id', 'datetime'] @admin.register(LogEntry) @@ -193,10 +193,10 @@ class DownloadLogAdmin(admin.ModelAdmin): @admin.register(AnalysisFunction) class AnalysisFunctionAdmin(admin.ModelAdmin): list_display = [ - 'id', 'title', 'is_active', + 'id', 'title', 'description', 'is_active', 'only_for_users_display', 'local_run', 'created_at'] - search_fields = ['title', 'description'] + search_fields = ['title'] raw_id_fields = ['only_for_users'] def only_for_users_display(self, obj):