diff --git a/.github/workflows/django.yml b/.github/workflows/django.yml index c13a343..aedfc92 100644 --- a/.github/workflows/django.yml +++ b/.github/workflows/django.yml @@ -2,9 +2,9 @@ name: Django CI on: push: - branches: [ "staging", "lack0fdev" ] + branches: [ "staging", "lack0fdev", "danidev" ] pull_request: - branches: [ "staging", "lack0fdev" ] + branches: [ "staging", "lack0fdev", "danidev" ] jobs: test: diff --git a/core/forms.py b/core/forms.py index 3af0a00..6a21007 100644 --- a/core/forms.py +++ b/core/forms.py @@ -282,6 +282,6 @@ class Meta: ) widgets = { "data_admissao": forms.DateInput(attrs={"type": "date"}), - "sala": forms.NumberInput(), + "sala": forms.TextInput(), "email": forms.EmailInput(), } diff --git a/core/migrations/0007_alter_customuser_sala.py b/core/migrations/0007_alter_customuser_sala.py new file mode 100644 index 0000000..091a867 --- /dev/null +++ b/core/migrations/0007_alter_customuser_sala.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.11 on 2026-04-24 22:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0006_alter_chamada_acao"), + ] + + operations = [ + migrations.AlterField( + model_name="customuser", + name="sala", + field=models.CharField( + blank=True, + max_length=50, + null=True, + verbose_name="Sala do Profissional", + ), + ), + ] diff --git a/core/models.py b/core/models.py index 2ca4824..257e019 100644 --- a/core/models.py +++ b/core/models.py @@ -32,9 +32,9 @@ class CustomUser(AbstractUser): default="recepcionista", verbose_name="Função", ) # coloquei agora - sala = models.IntegerField( - null=True, blank=True, verbose_name="Sala do Profissional" - ) # coloquei agora + sala = models.CharField( + max_length=50, null=True, blank=True, verbose_name="Sala do Profissional" + ) # trocado para permitir nomes como 'enfermaria' failed_login_attempts = models.IntegerField( default=0, verbose_name="Tentativas de login falhadas" diff --git a/guiche/templates/guiche/painel_guiche.html b/guiche/templates/guiche/painel_guiche.html index 0770b9f..7fa440c 100644 --- a/guiche/templates/guiche/painel_guiche.html +++ b/guiche/templates/guiche/painel_guiche.html @@ -82,9 +82,20 @@

Senhas Geradas Hoje

{{ senha.senha }}
{{ senha.nome_completo|default:"—" }}
- {% if senha.tipo_senha %} -
Tipo: {{ senha.tipo_senha }}
- {% endif %} +
+ {% if senha.tipo_senha %} + Tipo: {{ senha.tipo_senha }} + {% endif %} + {% if senha.tipo_senha and senha.profissional_saude %} + · + {% endif %} + {% if senha.profissional_saude %} + + + Médico: {{ senha.profissional_saude.first_name }} {{ senha.profissional_saude.last_name }}{% if senha.profissional_saude.sala %} — Sala {{ senha.profissional_saude.sala }}{% endif %} + + {% endif %} +
diff --git a/guiche/templates/guiche/tv1.html b/guiche/templates/guiche/tv1.html index 50467dc..cf25bcd 100644 --- a/guiche/templates/guiche/tv1.html +++ b/guiche/templates/guiche/tv1.html @@ -1,160 +1,22 @@ -{% load static %} - - - - - - Painel de Chamadas - Guichê {{ guiche_numero }} - - - - - -
- - - Bem-vindos ao Instituto Lauro de Souza Lima! - - -
- - +{% block main %} +
- - -
+
-

+

{% if ultima_chamada %} {{ ultima_chamada.paciente.nome_completo }} - Guichê {{ ultima_chamada.guiche.numero }} {% else %} - Nenhuma senha chamada no momento. + Nenhuma senha chamada no momento. {% endif %}

-

Por favor, dirija-se ao guichê.

+ {% if ultima_chamada %} +

Por favor, dirija-se ao guichê.

+ {% endif %}
@@ -168,182 +30,59 @@

Histórico de Chamadas

- - -
- -
- - -
- Governo SP -
- - - - - - + }, + error: function (_, t) { console.error("Erro ao atualizar o histórico:", t); } + }); + } - - \ No newline at end of file + setInterval(atualizarTela, 5000); + setInterval(atualizarHistorico, 5000); + atualizarHistorico(); + }); + +{% endblock %} diff --git a/guiche/views.py b/guiche/views.py index 743c869..7679f36 100644 --- a/guiche/views.py +++ b/guiche/views.py @@ -415,7 +415,7 @@ def tv1_historico_api_view(request) -> JsonResponse: historico_chamadas = ( Chamada.objects.filter(acao="confirmado") .select_related("paciente", "guiche") - .order_by("-data_hora")[:8] + .order_by("-data_hora")[:5] ) historico_data: List[Dict[str, Any]] = [] diff --git a/profissional_saude/forms.py b/profissional_saude/forms.py index a16582f..93a145a 100644 --- a/profissional_saude/forms.py +++ b/profissional_saude/forms.py @@ -74,7 +74,8 @@ class SelecionarSalaForm(forms.Form): """ sala = forms.ChoiceField( - choices=[(str(i), f"Sala {i}") for i in range(1, 21)], # Salas 1 a 20 + choices=[(str(i), f"Sala {i}") for i in range(1, 21)] + + [("enfermaria", "Enfermaria")], # Salas 1 a 20 + Enfermaria label="Sala do dia", widget=forms.Select( attrs={ diff --git a/profissional_saude/templates/profissional_saude/tv2.html b/profissional_saude/templates/profissional_saude/tv2.html index 5db863c..a5fb081 100644 --- a/profissional_saude/templates/profissional_saude/tv2.html +++ b/profissional_saude/templates/profissional_saude/tv2.html @@ -1,162 +1,23 @@ -{% load static %} - - - - - - Painel de Chamadas - - - - - -
- - - Bem-vindos ao Instituto Lauro de Souza Lima! - - -
- - +{% block main %} +
- - -
+
{% if senha_chamada %} - -

+

{{ nome_completo }} - Sala: {{ sala_profissional }}

+

Por favor, dirija-se à sala.

{% else %} -
- Nenhuma senha chamada no momento. -
+

+ Nenhuma senha chamada no momento. +

{% endif %}
@@ -165,186 +26,68 @@

Histórico de Confirmações

    {% for chamada in historico_senhas %}
  • - {{ chamada.paciente.senha }} - {{ chamada.paciente.nome_completo }} - Profissional: {{ chamada.profissional_saude.first_name }} + ✓ {{ chamada.paciente.senha }} - {{ chamada.paciente.nome_completo }} - Profissional: {{ chamada.profissional_saude.first_name }}
  • {% endfor %}
- - -
- -
- - -
- Governo SP -
- - - - - - + }, + error: function (_, t) { console.error("Erro ao atualizar o histórico:", t); } + }); + } - - \ No newline at end of file + setInterval(atualizarTela, 5000); + setInterval(atualizarHistorico, 5000); + atualizarHistorico(); + }); + +{% endblock %} diff --git a/profissional_saude/views.py b/profissional_saude/views.py index dd7aac0..60b8b98 100644 --- a/profissional_saude/views.py +++ b/profissional_saude/views.py @@ -66,10 +66,15 @@ def realizar_acao_profissional(request, paciente_id, acao): # Tenta enviar mensagem via WhatsApp numero_celular_paciente = paciente.telefone_e164() if numero_celular_paciente: + sala_display = ( + f"Sala {profissional_saude.sala}" + if str(profissional_saude.sala).isdigit() + else str(profissional_saude.sala).capitalize() + ) mensagem = ( f"Olá {paciente.nome_completo.split()[0]}! " f"O(a) Dr(a). {profissional_saude.first_name}, lhe aguarda. " - f"Por favor, dirija-se à Sala {profissional_saude.sala}." + f"Por favor, dirija-se à {sala_display}." ) twilio_response = enviar_whatsapp(numero_celular_paciente, mensagem) else: @@ -94,10 +99,15 @@ def realizar_acao_profissional(request, paciente_id, acao): # Reenviar o WhatsApp no reanuncio numero_celular_paciente = paciente.telefone_e164() if numero_celular_paciente: + sala_display = ( + f"Sala {profissional_saude.sala}" + if str(profissional_saude.sala).isdigit() + else str(profissional_saude.sala).capitalize() + ) mensagem = ( f"Olá {paciente.nome_completo.split()[0]}! " f"O(A) Dr(a). {profissional_saude.first_name} está chamando novamente. " - f"Por favor, dirija-se à Sala {profissional_saude.sala}." + f"Por favor, dirija-se à {sala_display}." ) twilio_response = enviar_whatsapp(numero_celular_paciente, mensagem) else: @@ -271,7 +281,7 @@ def selecionar_sala(request): if request.method == "POST": form = SelecionarSalaForm(request.POST) if form.is_valid(): - sala_numero = int(form.cleaned_data["sala"]) + sala_numero = form.cleaned_data["sala"] # Verificar se outro profissional já está usando esta sala outro_profissional = ( diff --git a/requirements-docker.txt b/requirements-docker.txt index fe8eb98..3effe4e 100644 --- a/requirements-docker.txt +++ b/requirements-docker.txt @@ -1,4 +1,4 @@ -Django==5.2.11 +Django==5.2.13 djangorestframework==3.16.1 gunicorn==23.0.0 gTTS==2.5.4 @@ -7,4 +7,4 @@ dj-database-url==3.0.1 psycopg2-binary==2.9.11 python-decouple==3.8 twilio==9.8.5 -python-dotenv==1.2.1 +python-dotenv==1.2.2 diff --git a/requirements.txt b/requirements.txt index b2ea838..94d5a4d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Django==5.2.11 +Django==5.2.13 djangorestframework==3.16.1 gunicorn==23.0.0 gTTS==2.5.4 @@ -7,4 +7,4 @@ dj-database-url==3.0.1 psycopg2-binary==2.9.11 python-decouple==3.8 twilio==9.8.5 -python-dotenv==1.2.1 \ No newline at end of file +python-dotenv==1.2.2 \ No newline at end of file diff --git a/sga/urls.py b/sga/urls.py index 9ecbf6d..40442a3 100644 --- a/sga/urls.py +++ b/sga/urls.py @@ -1,7 +1,14 @@ from django.contrib import admin +from django.shortcuts import render from django.urls import include, path + +def tv_selecao_view(request): + return render(request, "tv.html") + + urlpatterns = [ + path("tv/", tv_selecao_view, name="tv_selecao"), path("admin/", admin.site.urls), path("", include("core.urls")), path("administrador/", include("administrador.urls")), diff --git a/templates/tv.html b/templates/tv.html new file mode 100644 index 0000000..1141dc8 --- /dev/null +++ b/templates/tv.html @@ -0,0 +1,20 @@ +{% extends "tv_base.html" %} + +{% block title %}Painel de Chamadas - Seleção{% endblock %} + +{% block main %} + + +{% endblock %} diff --git a/templates/tv_base.html b/templates/tv_base.html new file mode 100644 index 0000000..8963b97 --- /dev/null +++ b/templates/tv_base.html @@ -0,0 +1,372 @@ +{% load static %} + + + + + + {% block title %}Painel de Chamadas{% endblock %} + + + {% block extra_style %}{% endblock %} + + + +
+ + + Bem-vindos ao Instituto Lauro de Souza Lima! + + +
+ + + {% block main %}{% endblock %} + + +
+ Governo SP +
+ + + + + + + + + + + {% block scripts %}{% endblock %} + + diff --git a/tests/tests/functional/profissional_saude_tests.py b/tests/tests/functional/profissional_saude_tests.py index 1e8eada..20865c8 100644 --- a/tests/tests/functional/profissional_saude_tests.py +++ b/tests/tests/functional/profissional_saude_tests.py @@ -346,7 +346,9 @@ def test_tv2_view_with_calls(self): self.assertEqual( response.context["nome_completo"], self.paciente2.nome_completo ) - self.assertEqual(response.context["sala_profissional"], self.profissional1.sala) + self.assertEqual( + response.context["sala_profissional"], str(self.profissional1.sala) + ) self.assertEqual( len(response.context["historico_senhas"]), 1 ) # Uma chamada anterior @@ -378,7 +380,7 @@ def test_tv2_api_view_with_calls(self): self.assertEqual(data["senha"], self.paciente1.senha) self.assertEqual(data["nome_completo"], self.paciente1.nome_completo) - self.assertEqual(data["sala_profissional"], self.profissional1.sala) + self.assertEqual(data["sala_profissional"], str(self.profissional1.sala)) self.assertEqual(data["id"], chamada.id) def test_tv2_api_view_no_calls(self):