from common.models import AgentSurvey, Institute, Period, PyrosUser, SP_Period, ScienceTheme, ScientificProgram, Sequence, Plan, Album, AgentCmd from rest_framework import serializers import datetime from datetime import timezone class InstituteSerializer(serializers.ModelSerializer): class Meta: model = Institute fields = ["name"] class UserSerializer(serializers.ModelSerializer): user_level = serializers.StringRelatedField(many=True) institute = InstituteSerializer(read_only=True) class Meta: model = PyrosUser fields = ['url', 'username', 'email', 'institute', "user_level"] depth = 1 class PeriodSerializer(serializers.ModelSerializer): class Meta: model = Period fields = "__all__" class ScienceThemeSerializer(serializers.ModelSerializer): class Meta: model = ScienceTheme fields = ["name"] class ScientificProgramSerializer(serializers.ModelSerializer): sp_pi = UserSerializer(read_only=True) institute = InstituteSerializer(read_only=True) science_theme = ScienceThemeSerializer(read_only=True) class Meta: model = ScientificProgram fields = ["name", "institute", "sp_pi", "description_short", "description_long", "science_theme"] #fields = "__all__" class SPPeriodSerializer(serializers.ModelSerializer): period = PeriodSerializer(read_only=True) scientific_program = ScientificProgramSerializer(read_only=True) class Meta: model = SP_Period fields = ["id", "scientific_program","period", "quota_remaining", "over_quota_duration_remaining", "token_remaining"] class SequenceSerializer(serializers.ModelSerializer): pyros_user = UserSerializer(read_only=True) class Meta: model = Sequence fields = "__all__" class AlbumSerializer(serializers.ModelSerializer): sequence = SequenceSerializer(read_only=True) class Meta: model = Album fields = "__all__" class PlanSerializer(serializers.ModelSerializer): album = AlbumSerializer(read_only=True) class Meta: model = Plan fields = "__all__" class SimplePlanSerializer(serializers.ModelSerializer): class Meta: model = Plan exclude = ["album"] class SimpleAlbumSerializer(serializers.ModelSerializer): plans = SimplePlanSerializer(read_only=True, many=True) class Meta: model = Album fields = ["name", "desc", "plans"] class FullSequenceSerializer(serializers.ModelSerializer): pyros_user = UserSerializer(read_only=True) # here albums is the relationmodel with many to many realtion so we have to set many to True albums = SimpleAlbumSerializer(read_only=True, many=True) class Meta: model = Sequence fields = "__all__" extra_fields = ["pyros_user", "albums"] class AgentCmdSerializer(serializers.ModelSerializer): class Meta: model = AgentCmd fields = "__all__" exec_time = serializers.SerializerMethodField() def get_exec_time(self,obj): try: return round((obj.r_end_time - obj.r_start_time).total_seconds(),2) except: return "" class AgentSurveySerializer(serializers.ModelSerializer): class Meta: model = AgentSurvey fields = "__all__" is_out_of_date = serializers.SerializerMethodField() running_cmd = serializers.SerializerMethodField() def get_is_out_of_date(self, obj): datetime_now = datetime.datetime.utcnow() datetime_now_minus_thirty_sec = datetime_now - datetime.timedelta(seconds=30) datetime_now_minus_thirty_sec = datetime_now_minus_thirty_sec.replace(tzinfo=timezone.utc) if datetime_now_minus_thirty_sec >= obj.updated: return True else: return False def get_running_cmd(self,obj): try: return AgentCmd.objects.get(state="CMD_RUNNING",sender=obj.name).full_name except AgentCmd.DoesNotExist: return "None"