Closed nicomagnani3 closed 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.
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.
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()
`
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.
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" },
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()
`
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.
se lo paso a lean y a nico para que le den al front.
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 } } }
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.
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" } } }
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.
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
}
)
implemente el cambio de clave de un usuario. debe hacer:
post a: localhost:8000/login_api/clave/
{ "clave_anterior": ..., "clave_nueva": ...... }
quedo resuelto.
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.