pablodanielrey / ttps

práctica de ttps
GNU General Public License v3.0
0 stars 0 forks source link

Registrar paciente - L2V-P5 #21

Closed nicomagnani3 closed 2 years ago

nicomagnani3 commented 2 years ago

Datos: Si es mayor de 18 años, Teléfono, Dirección completa (calle, número, piso), email del paciente. Si es menor de 18 años: Nombre del tutor, Apellido del tutor, teléfono del tutor, email tutor, dirección del tutor.

pablodanielrey commented 2 years ago

ahora es necesario añadir una entidad adicional que es Tutor. el tutor puede tener mas de una persona menor de 18 años asociadas. el tutor debe poder ingresar al sistema usando el dni de la persona asociada y su clave.

pablodanielrey commented 2 years ago

para permitir que un tutor ingrese con distintos usernames, debo modificar la estructura de autenticación de django. ya que es la que esta funcionando actualmente. o pensando en otros mecansimos de login por ejemplo oauth, es necesario generar multiples identidades con la misma clave del tutor asociadas a una persona dentro del sistema. serían múltiples usuarios oauth asociados a un tutor.

pablodanielrey commented 2 years ago

por ejemplo un pseudocódigo de como generar un tutor sería.

`
def crearTutor(self, dni_pacientes:list, **kwargs): dni_paciente = kwargs.pop('dni_paciente')

    tutor = Tutor(**kwargs)
    tutor.save()

    for dni in dni_pacientes:
        u = self._generar_usuario_django(dni.lower().strip(), Tutor.NOMBRE_GRUPO, clave=tutor.dni.lower().strip())
        tutor.pacientes.add(u)
        tutor.save()

`

pablodanielrey commented 2 years ago

despues de hablar con los chicos el tema es que cada paciente tiene su usuario distinto. pero los menores tienen asociados tutores que son los que usan el sistema. igualmente aunque sea un tutor, esa persona accede con el usuario del paciente. asi que no esta correcto lo que puse arriba. ahora hago refactor.

pablodanielrey commented 2 years ago

ya implmente el refactor del código. ahora estoy por la parte de testear el upload de un paciente en el nuevo código. asumo por ahora que no tiene tutor. el get me funciona

http://localhost:8000/personas_api/pacientes

[ { "id": "c83118cc-a503-4bcb-a0ba-ce3ee83f8e83", "nombre": "Paciente 1", "apellido": "Cero 1", "dni": "1", "email": "email1@gmail.com", "fecha_nacimiento": "1946-06-04", "telefono": "221 22221", "direccion": "calle 1 la plata", "historia_clinica": "algo de historia", "obra_social": null }, { "id": "e576bd9b-b10b-4de2-bf46-78e5bed7b293", "nombre": "Paciente 2", "apellido": "Cero 2", "dni": "2", "email": "email2@gmail.com", "fecha_nacimiento": "1944-05-12", "telefono": "221 22222", "direccion": "calle 2 la plata", "historia_clinica": "algo de historia", "obra_social": { "obra_social": { "id": "8a1f2c39-b24e-43e8-a8b6-2373a8459876", "nombre": "Osde" }, "numero_afiliado": "numero-e576bd9b-b10b-4de2-bf46-78e5bed7b293" } }, { "id": "3b3966b9-be22-45cd-b56d-c30720a033dc", "nombre": "Paciente 3", "apellido": "Cero 3", "dni": "3", "email": "email3@gmail.com", "fecha_nacimiento": "1946-11-25", "telefono": "221 22223", "direccion": "calle 3 la plata", "historia_clinica": "algo de historia", "obra_social": null }, { "id": "7090dedc-f018-4dd0-9b20-b558553005f8", "nombre": "Paciente 4", "apellido": "Cero 4", "dni": "4", "email": "email4@gmail.com", "fecha_nacimiento": "1959-05-11", "telefono": "221 22224", "direccion": "calle 4 la plata", "historia_clinica": "algo de historia", "obra_social": { "obra_social": { "id": "8a1f2c39-b24e-43e8-a8b6-2373a8459876", "nombre": "Osde" },

pablodanielrey commented 2 years ago

implementé la lógica del crear un paciente dentor del serializador. por ahora esta solo los mayores a 18 años.

`class SerializadorDePaciente(serializers.ModelSerializer): historia_clinica = serializers.CharField(source='historia_clinica.historia_clinica', read_only=False, required=False) obra_social = SerializadorDeObraSocialPersona(required=False, many=False)

class Meta:
    model = models.Paciente
    fields = ['id','nombre','apellido','dni','email','fecha_nacimiento','telefono','direccion', 'historia_clinica', 'obra_social']

def __edad(self, nacimiento):
    logging.debug(f'verificando nacimiento : {nacimiento}')
    ahora = datetime.datetime.now(tz=ZoneInfo('America/Argentina/Buenos_Aires'))
    anos = ahora.year - nacimiento.year
    if datetime.date(year=nacimiento.year, month=ahora.month, day=ahora.day) < nacimiento:
        anos = anos - 1
    return anos

def create(self, validated_data):
    fecha_nacimiento = validated_data.get('fecha_nacimiento')
    if 18 < self.__edad(fecha_nacimiento):
        for v in ['telefono', 'direccion', 'email']:
            if v not in validated_data:
                raise ValidationError({v:'requerido'})

        hc = validated_data.pop('historia_clinica',None)

        paciente = models.Paciente.objects.create(**validated_data)
        if hc:
            models.HistoriaClinica.objects.create(persona=paciente, historia_clinica=hc['historia_clinica'])
        return paciente
    else:
        raise NotImplemented()

    `
pablodanielrey commented 2 years ago

bien implemente el post con los datos del tutor en el endpoint de paciente. el endpoint es: http://localhost:8000/personas_api/registro/

solo acepta POST. y el formato depende de la fecha de nacimiento que se envíe. el formato completo es:

{ "id": "7abf6d35-ff8d-4aa9-b776-31d40d2b8cde", "nombre": "Paciente 5", "apellido": "Cero 5", "dni": "103", "email": "email5@gmail.com", "fecha_nacimiento": "2010-02-13", "telefono": null, "direccion": null, "historia_clinica": "algo de historia", "obra_social": { "obra_social": { "id": "12b01ff0-800c-4b6f-b200-2f357037a806", "nombre": "IOMA" }, "numero_afiliado": "numero-13ae12b5-6f50-49bd-a303-769f8bf82232" }, "tutor": { "id": "b1069590-ec9b-4b12-af28-b690d1d132cf", "tutor": { "id": "d8922bed-4ec0-48a1-925a-c9c50d9b9245", "nombre": "Un super tutor", "apellido": "ape", "email": "tutor@gmail.com", "telefono": "1112222tutor", "direccion": "calle tutorias numero tute" } } }

los ids se pueden obviar.

pablodanielrey commented 2 years ago

se lo paso a lean y a nico para que le den al front.

nicomagnani3 commented 2 years ago

Desde el front cuando es mayor de edad se mandan asi los datos { apellido: "Magnani" calle: 1 direccion: 6 dni: "37673414" email: "nico@asd.com" fecha_nacimiento: "1995-02-20" nombre: "Nicolas" numero: 2 piso: 3 telefono: "222345123" tutor:{ tutor:{ apellido: null direccion: null email: null nombre: null telefono: null } } }

pablodanielrey commented 2 years ago

Desde el front cuando es mayor de edad se mandan asi los datos { apellido: "Magnani" calle: 1 direccion: 6 dni: "37673414" email: "nico@asd.com" fecha_nacimiento: "1995-02-20" nombre: "Nicolas" numero: 2 piso: 3 telefono: "222345123" tutor:{ tutor:{ apellido: null direccion: null email: null nombre: null telefono: null } } }

nico cuando es mayor no va tutor. o sea no hay que enviar toda la clave de tutor dentro del requerimiento. lo mismo con obra social e historia clinica. si no son necesarios no van en el requerimiento.

el error que te tira es que al enviar tutor se verifica el nombre y apellido y son null en ese requerimineto.

pablodanielrey commented 2 years ago

cuando se envía el tutor tira error de nombre y apellido requerido. { "nombre": "Pablo", "apellido": "Rey", "dni": "123213", "fecha_nacimiento": "2021-12-16", "tutor": { "tutor": { "nombre": "wdqwdqwdq", "apellido": "qwdwqd", "email": "pablodanielrey@gmail.com", "telefono": "2332323", "calle": "2132131", "numero": "12321", "piso": "123213", "direccion": "2132131 12321 123213" } } }

pablodanielrey commented 2 years ago

ese es el formato pero lo que envía la vista es:

{
  "usuario": {
    "nombre": "Pablo",
    "apellido": "Rey",
    "dni": "1232132222",
    "fecha_nacimiento": "2021-12-16",
    "tutor": {
      "tutor": {
        "nombre": "wdqwdqwdq",
        "apellido": "qwdwqd",
        "email": "pablodanielrey@gmail.com",
        "telefono": "2332323",
        "calle": "2132131",
        "numero": "12321",
        "piso": "123213",
        "direccion": "2132131 12321 123213"
      }
    }
  }
}

con usuario. habria que sacarlo.

pablodanielrey commented 2 years ago

cambiando el login agrego un campo que retorna a la vista si el usuario debería cambiar la clave.

 return Response(
            {
                'token':token.key,
                'persona': serializador.data if serializador else '', 
                'roles': grupos,
                'cambiar_clave': cambiar_clave
            }
        )
pablodanielrey commented 2 years ago

implemente el cambio de clave de un usuario. debe hacer:

post a: localhost:8000/login_api/clave/

{ "clave_anterior": ..., "clave_nueva": ...... }

pablodanielrey commented 2 years ago

quedo resuelto.