diff --git a/src/tupan/alertas/admin.py b/src/tupan/alertas/admin.py index 8a2a3ca..328b5ab 100644 --- a/src/tupan/alertas/admin.py +++ b/src/tupan/alertas/admin.py @@ -27,16 +27,20 @@ class AlertaAdmin(admin.ModelAdmin): class HistoricoAlertaAdmin(admin.ModelAdmin): list_display = [ "alerta", + "medicao", "timestamp", "timestamp_convertido", "criado", - "modificado", ] list_filter = [ "alerta", "modificado", "criado", + ] + readonly_fields = [ + "criado", "timestamp_convertido", + "modificado" ] @@ -45,12 +49,17 @@ class MedicaoAdmin(admin.ModelAdmin): list_display = [ "dados", "timestamp", + "estacao_parametro", "timestamp_convertido", "criado", - "modificado", ] list_filter = [ - "modificado", + "dados", + "timestamp_convertido", + "criado", + ] + readonly_fields = [ "criado", "timestamp_convertido", + "modificado" ] diff --git a/src/tupan/alertas/models.py b/src/tupan/alertas/models.py index 5746c7a..832f507 100644 --- a/src/tupan/alertas/models.py +++ b/src/tupan/alertas/models.py @@ -35,6 +35,9 @@ class Meta: verbose_name = "Medição" verbose_name_plural = "Medições" + def __str__(self) -> str: + return f"{self.dados} - {self.estacao_parametro}" + def save(self, *args, **kwargs): self.timestamp_convertido = datetime.fromtimestamp(self.timestamp) super(Medicao, self).save(*args, **kwargs) diff --git a/src/tupan/alertas/serializers.py b/src/tupan/alertas/serializers.py index 5ff8ba7..4fea7b4 100644 --- a/src/tupan/alertas/serializers.py +++ b/src/tupan/alertas/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers from .models import Alerta, Medicao, HistoricoAlerta -from estacoes.serializers import EstacaoParametroSerializer +from estacoes.serializers import EstacaoParametroSerializer, EstacaoSerializer class AlertaSerializer(serializers.ModelSerializer): class Meta: @@ -15,6 +15,8 @@ class Meta: fields = ('id', 'timestamp', 'timestamp_convertido', 'dados', 'estacao_parametro') class HistoricoAlertaSerializer(serializers.ModelSerializer): + estacao = EstacaoSerializer(source='alerta.estacao_parametro.estacao', read_only=True) + class Meta: model = HistoricoAlerta fields = '__all__' \ No newline at end of file diff --git a/src/tupan/alertas/views.py b/src/tupan/alertas/views.py index 17c6408..1afb03c 100644 --- a/src/tupan/alertas/views.py +++ b/src/tupan/alertas/views.py @@ -141,6 +141,8 @@ def delete(self, request, id, *args, **kwargs): class HistoricoAlertaView(APIView): @extend_schema( parameters=[ + OpenApiParameter("timestamp_inicial", description="Timestamp inicial para filtragem", required=False, type=str), + OpenApiParameter("timestamp_final", description="Timestamp final para filtragem", required=False, type=str), OpenApiParameter("timestamp", description="Timestamp para filtragem", required=False, type=str), OpenApiParameter("estacao_id", description="ID da estação para filtragem", required=False, type=int) ], @@ -151,64 +153,32 @@ class HistoricoAlertaView(APIView): ) def get(self, request, *args, **kwargs): try: + timestamp_inicial = request.query_params.get("timestamp_inicial") + timestamp_final = request.query_params.get("timestamp_final") timestamp = request.query_params.get("timestamp") estacao_id = request.query_params.get("estacao_id") historico = HistoricoAlerta.objects.select_related('alerta__estacao_parametro__estacao').all() + if timestamp_inicial and timestamp_final: + historico = historico.filter(timestamp__range=[timestamp_inicial, timestamp_final]) + elif timestamp_inicial: + historico = historico.filter(timestamp__gte=timestamp_inicial) + elif timestamp_final: + historico = historico.filter(timestamp__lte=timestamp_final) + if timestamp: historico = historico.filter(timestamp=timestamp) + if estacao_id: historico = historico.filter(alerta__estacao_parametro__estacao__id=estacao_id) - resultado = [ - { - "id_historico_alerta": h.id, - "timestamp": h.timestamp, - "estacao": h.alerta.estacao_parametro.estacao - } - for h in historico - ] + serializer = HistoricoAlertaSerializer(historico, many=True) - return JsonResponse(resultado, safe=False) + return JsonResponse(data=serializer.data, safe=False) except Exception as e: return JsonResponse({'error': f'Erro ao buscar dados: {str(e)}'}, status=500) - @extend_schema( - request=OpenApiRequest(HistoricoAlertaSerializer), - responses={ - 200: OpenApiResponse(HistoricoAlertaSerializer), - 400: OpenApiResponse(description="Campos obrigatórios: timestamp, alerta | Dados inválidos"), - 404: OpenApiResponse(description="Alerta não encontrado"), - 500: OpenApiResponse(description="Erro ao salvar histórico") - } - ) - def post(self, request, *args, **kwargs): - try: - data = json.loads(request.body) - timestamp = data.get('timestamp') - alerta_id = data.get('alerta') - - if not timestamp or not alerta_id: - return JsonResponse({'error': 'Campos obrigatórios: timestamp, alerta'}, status=400) - - alerta = Alerta.objects.get(pk=alerta_id) - hist = HistoricoAlerta(timestamp=timestamp, alerta=alerta) - hist.save() - - return JsonResponse({ - 'id': hist.pk, - 'timestamp': hist.timestamp, - 'alerta': hist.alerta.pk, - 'timestamp_convertido': hist.timestamp_convertido - }, status=201) - except Alerta.DoesNotExist: - return JsonResponse({'error': 'Alerta não encontrado'}, status=404) - except json.JSONDecodeError: - return JsonResponse({'error': 'Dados inválidos'}, status=400) - except Exception as e: - return JsonResponse({'error': f'Erro ao salvar histórico: {str(e)}'}, status=500) - class MedicaoView(APIView): @extend_schema( diff --git a/src/tupan/estacoes/admin.py b/src/tupan/estacoes/admin.py index 3d4ca1a..6c6b91f 100644 --- a/src/tupan/estacoes/admin.py +++ b/src/tupan/estacoes/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from .models import Endereco, Estacao, Parametro, Categoria +from .models import Endereco, Estacao, Parametro, Categoria, EstacaoParametro @admin.register(Parametro) class ParametroAdmin(admin.ModelAdmin): @@ -57,6 +57,11 @@ class EnderecoAdmin(admin.ModelAdmin): "modificado" ] + +class EstacaoParametroInline(admin.TabularInline): + model = EstacaoParametro + extra = 1 + @admin.register(Estacao) class EstacaoAdmin(admin.ModelAdmin): list_display = [ @@ -77,6 +82,8 @@ class EstacaoAdmin(admin.ModelAdmin): "modificado" ] + inlines = [EstacaoParametroInline] + def getParametros(self, obj): return ", ".join([parametro.nome for parametro in obj.parametros.all()]) diff --git a/src/tupan/estacoes/models.py b/src/tupan/estacoes/models.py index 39d68ce..c16cff0 100644 --- a/src/tupan/estacoes/models.py +++ b/src/tupan/estacoes/models.py @@ -76,3 +76,6 @@ class EstacaoParametro(models.Model): parametro = models.ForeignKey(Parametro, on_delete=models.CASCADE) class Meta: db_table = "estacoes_estacao_parametro" + + def __str__(self): + return f"{self.estacao.nome} - {self.parametro.nome}"