Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

App per importar les actuacions d’un altre curs #213

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

rafatecno1
Copy link

Introducció

Abans d’explicar l’app vull comentar-vos que a l’inici d’octubre no havia programat mai en Python i no sabia què era Django, pgAdmin ni Bootstrap. Conec els principis generals de programació i m’han servit també per capbussar-me a la BD de postgresql, tot i que molt superficialment, i m’ha ajudat a entendre, amb traç gruixut, el funcionament de tot plegat. Per últim, també he hagut d’aprendre a fer servir Git amb Github, que si no ho has vist mai, no és trivial. Moltes i moltes hores de vídeos, especialment els de Juan @pildorasinformaticas. En definitiva, que sigueu compassius si trobeu que hi ha d’altres maneres de resoldre, tècnicament, el que he fet.

Necessitat a resoldre

Aquesta app neix de la necessitat dels equips directius, especialment el meu i segurament extrapolable a d’altres, de poder consultar les actuacions fetes en cursos anteriors sobre l’alumnat, d’una manera més transparent, sense necessitat de mantenir instal·lacions passades només per aquest fet. Una altra cosa és que calgui mantenir aquestes instal·lacions per, per exemple, tenir un registre d’assistència de l’alumnat, eventualment per processos judicials.

Instal·lació

L’ús d’aquesta app és completament opcional. Si no es volen importar les actuacions passades, el DjAu funcionarà exactament igual que sempre. No ha calgut modificar cap base de dades modificant dades o afegint taules, llevat de les actuacions que s'importen, per tant no cal fer cap migrate. Per obtenir l’actualització només caldrà baixar la nova versió des del repositori.

Funcionament des del punt de vista de l’usuari admin

L’administrador haurà d’anar al menú admin -> Sincronitza i allà hi trobarà una nova entrada “Iniciar importacions d’un curs antic”

Des d’allà podrà veure tot un seguit d’informació amb instruccions de què és el que l’app farà. El resum és:

  • Proporcionar les dades de connexió a la base de dades del curs antic
  • Relacionar els docents del curs antic amb els del curs actual
  • Comprovar si les actuacions a importar són les correctes
  • Comprovar que la importació ha estat correcte (El codi està preparat per desfer la importació, però no està fet programat)

Funcionament intern

El codi està sobradament documentat per facilitar-ne el seguiment, principalment el meu seguiment. Totes les funcions es troben a views.py.

Per poder lligar les actuacions antigues de la base de dades antiga amb la base de dades atual cal trobar una dada immutable, tant per l’alumnat com pels professionals. Per l’alumnat es treballarà amb el RALC, mentre que els professionals quedaran fixats pel seu username, però atès que aquest no és universal perquè pot canviar entre les instal·lacions de diferents anys escolars, amb l’app ens assegurarem de que coincidirà.

  • Les actuacions sobre alumnat que ja no és al centre, no s’importen.
  • Les actuacions fetes pels professionals que ja no són al centre, s’importen, però s’afegeix un text descriptiu per deixar-hi constància i per facilitar-ne algun tractament posterior.

“El o la professional NOM COGNOM (USERNAME) va redactar aquesta actuació però ja no es troba al centre educatiu. No obstant, a continuació se'n mostra el text original:”

  • En el cas que un professional tingui alumnat amb actuacions antigues podrà veure-les fent click en el botó corresponent. L’equip directiu sempre pot veure les actuacions, tant les noves com les antigues.
##############################
# PROCEDIMENT D'IMPORTACIÓ #
##############################

# 1r PAS. CONNEXIÓ DB OLD. Cal connectar-se a la base de dades del curs anterior per extreure les dades. Les dades de connexió s’afegeixen al diccionari DATABASES.

# 2n PAS. SINCRONITZAR PROFESSIONALS. Els usernames dels professionals del curs anterior no tenen perquè coincidir amb els del curs actual, encara que siguin els mateixos professionals. Cal sincronitzar-los. Només es sincronitzaran els professionals que van generar actuacions en el curs antic. Si en l’actual ja no hi són, es marcaran com a professionals fora del centre.

# 3r PAS. EXTRACCIÓ DE DADES. Lectura de les dades significatives, tant de la BD antiga com de l'actual. Tenint en compte que no hi ha un  gran volum de dades molt elevat per la potència dels ordinadors actuals, es desestima paginar les dades i tractar-les per blocs, sinó que es fan totes de cop.

# 4t PAS. 1r CANVI. Amb les dades de la BD antiga:
# 4.1 Substitució de l'identificador del professional pel seu username antic i substitució dels usernames antics dels professionals pels actuals usernames.
	# 4.2 Substitució de l'identificador de l'alumne pel RALC, que és universal.
	#   POSSIBLE MILLORA: Es podria contemplar el cas que un alumne no tinguin RALC? Només en aquest cas, caldria estirar les dades del nom i cognoms, però sempre és molt més insegur i amb confirmació expressa.

# 5é PAS. 2n CANVI. Amb les dades de la BD actual:
	# 5.1 Substitució del RALC de l'alumne pel valor de l'identificador actual.
	# 5.2 Substitució de l'username del professional pel seu identificador actual.

# 6é PAS. PREPARANT LA INSERCIÓ de les dades tractades a la BD actual.

# 7é PAS. INSERCIÓ de les actuacions antigues a la BD actual.

He intentat no tocar codi fora d’aquesta app. No obstant sí que he hagut de tocar el següent:

  • template formset: per donar la possibilitat d’ocultar el botó per modificar actuacions si aquestes són antigues.
  • urls.py en app tutoria: per habilitar la pàgina si hi ha actuacions antigues.
  • views.py en app tutoria: per preparar la pàgina per visualitzar les actuacions antigues.
  • lesMevesActuacions.html en app tutoria: per eliminar el botó de nova actuació si s’estan visualitzant les actuacions antigues.

Bugs i problemes coneguts

Com a bugs ja no n’he trobat cap després de fer-hi moltes proves. El que sí que s'ha d'arreglar és el fet que no he aconseguit visualitzar convenientment les pàgines de l’app. Haurien d’estar integrades, amb el menú horitzontal superior i el lateral esquerre, però per molt que hagi repassat el codi, comparant-lo amb el que ja hi ha fet, no veig cap diferència.

Com a particularitats, no he sabut integrar ni els formularis ni les tables de Django correctament. Hi ha alguns formularis i algunes taules fetes a mà.

Per exemple, per sincronitzar els professionals, el formulari està fet a mà (amb molta feina) mentre que el formulari per demanar les dades de connexió sí que està integrat. Pel que fa a les taules amb dades, en el cos de l’app les taules estan fetes a mà, mentre que a la última pàgina sí que hi ha dues taules fetes amb tables2, però les dues paginen alhora, quan haurien de paginar cadascuna per separat.

Tampoc he sabut modificar la table que visualitza les actuacions, en tutoria, per que en el cas de l’actuació antiga no es veiés, com accions a fer, la de modificar i la d’esborrar l’actuació. Només volia un botó que digués “Veure les dades”

I fins aquí l'homilia...

rafatecno1 and others added 4 commits December 14, 2022 23:13
Per actualitzar els comentaris per descriure el procediment.
Mancava registrar l'app
Copy link
Owner

@ctrl-alt-d ctrl-alt-d left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Molt divertit això d'anar a la bd del curs passat demanant les credencials. No he provat si funciona o no, entenc que @rafatecno1 ho ha provat.

Crec recordar que @amorilla i @juaky tenen altres maneres per importar actuacions del curs anterior. Si és així, caldria un setting per 'amagar' aquesta opció del menú, per tal que no sembli la solució oficial. A no ser, clar, que en @juaky i l' @amorilla els sembli que aquesta és la solució oficial.

Personalment, m'agradaria que totes les actuacions anteriors anessin a parar a una única actuació de tipus "Resum Històric" a la que només hi tingués accés psicopedagog i direcció. Crec que simplificaria el procés: no caldria el matxing de professors, no caldria el filtre per data inici de curs, ... .El resum anual podria, fins i tot, contenir altres dades com ara % de presencialitat de cursos anteriors, si se li han enviat cartes d'absentisme, nombre d'incidències i expulsions, etc. Tot només per direcció i psicopedagog (si el tutor ha de saber alguna cosa que el psicopedagog li creï una actuació per a ell)

Podríem, més endavant, ampliar aquest procés per passar els ítems de seguiment tutorial d'un curs a l'altre amb aquest sistema de la doble bd que està molt ben pensat. Tot el que hagi de passar d'un curs per l'altre.

Molt bona feina.


<div class="collapse" id="queson"><br>
<p>Les actuacions s&oacute;n intervencions pedag&ograve;giques fetes entre un professional del centre, normalment tutors, coordinador pedag&ograve;gic o cap d'estudis, i un alumne concret. No obstant, les actuacions generades en cursos anteriors s&oacute;n inaccessibles en aquest curs per defecte. La decisi&oacute; de no incorporar-les al nou curs ve donada per raons de disseny del DjAu, que cal ser instal·lat de nou cada curs escolar.</p>
<p>Per poder consultar-les cal mantenir les instal·lacions del DjAu dels cursos anteriors actives per&ograve; inaccessibles per l'&uacute;s habitual. D'aquesta manera, determinats usuaris, eventualment els adscrits a Direcci&oacute; i/o a psicopedagogia, poden encara consultar-les si en fos menester.</p>
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Això crec que no és exactament així. Em sembla que @amorilla i @juaky ho resolen d'altres maneres i permeten consultar.

<br>

<div class="collapse" id="queson"><br>
<p>Les actuacions s&oacute;n intervencions pedag&ograve;giques fetes entre un professional del centre, normalment tutors, coordinador pedag&ograve;gic o cap d'estudis, i un alumne concret. No obstant, les actuacions generades en cursos anteriors s&oacute;n inaccessibles en aquest curs per defecte. La decisi&oacute; de no incorporar-les al nou curs ve donada per raons de disseny del DjAu, que cal ser instal·lat de nou cada curs escolar.</p>
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

També pot ser amb la família crec recordar.

<p>Les actuacions s&oacute;n intervencions pedag&ograve;giques fetes entre un professional del centre, normalment tutors, coordinador pedag&ograve;gic o cap d'estudis, i un alumne concret. No obstant, les actuacions generades en cursos anteriors s&oacute;n inaccessibles en aquest curs per defecte. La decisi&oacute; de no incorporar-les al nou curs ve donada per raons de disseny del DjAu, que cal ser instal·lat de nou cada curs escolar.</p>
<p>Per poder consultar-les cal mantenir les instal·lacions del DjAu dels cursos anteriors actives per&ograve; inaccessibles per l'&uacute;s habitual. D'aquesta manera, determinats usuaris, eventualment els adscrits a Direcci&oacute; i/o a psicopedagogia, poden encara consultar-les si en fos menester.</p>
<br>
<p><strong>Aquest m&ograve;dul del DjAu importa les actuacions dels cursos anteriors al curs actual</strong>, integrant-les igual que les actuals actuacions i permetent no haver d'accedir a instal·lacions anteriors per consultar antigues actuacions.</p>
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caldria evitar usar l'escape html &ograve; i posar simplement el caracter que toqui, en aquest cas ò.

Copy link
Author

@rafatecno1 rafatecno1 Dec 18, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah sí? veus? sóc de la vella escola.... Abans de fer la PR vaig canviar expressament tooots els accents pels seus escapes.... No en tenia ni idea de que ara ja no calia fer-ho.

Comment on lines +99 to +105
<form action="." method="post" enctype="multipart/form-data" target="{%if target %}{{target}}{%else%}_self{%endif%}">{% csrf_token %}

{% for hidden in form.hidden_fields %}
{{ hidden }}
{% endfor %}

{% for label, value in infoForm %}
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please, usar form.html de base.

Comment on lines +248 to +249
# Cal fer la cerca, perquè si n' hi ha de velles, s'habilita el botó per veure-les.
actuacions_antigues = Actuacio.objects.filter( professional = professional, moment_actuacio__lte = data_inici_curs ).distinct()
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Què passa si el psicopedagog de centre ha fet una actuació el 2 de setembre, no hauria de ser del curs actual?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Per mi, i així ho he reflectit al codi, per coherència, la data d'inici de curs ès la data d'inici que posem als cursos. Com que poden haver-hi diferents dates d'inici, he triat la més petita de totes. No se si el cas que comentes es pot donar o si es dona. No en tinc ni idea. Es pot obligar a que sigui l'1 de setembre...(veig poc probable que ens facin començar a mitjans d'agost, però qui sap...) Es pot posar una variable en settings_local.py de data d'inici de curs global independentment de les dates de cada curs....

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Com he dit abans, indicar-ho amb una opció als settings. Nosaltres sempre volem veure tot, no esborrem la base de dades.

@@ -234,30 +234,43 @@ def tutorPosaExpulsioPerAcumulacio(request, pk):

@login_required
@group_required(['professors','professional'])
def lesMevesActuacions(request):
def lesMevesActuacions(request, old_actuacions=''):
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

old_actuacions no hauria de ser un booleà tipus incloureActuacionsAntigues = True ?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cert! he canviat, en local, alguna cosa perquè quedi més clar (de fet, ara que aquesta PR està enviada, no se com es fa per anar fent els canvis que es proposin i ja quedin incorporades a la PR, mentre pugui o sàpiga fer-los, branca nova? ni idea):

En views.py de tutoria
def lesMevesActuacions(request, incloureActuacionsAntigues=False):

Més avall:
if not incloureActuacionsAntigues or incloureActuacionsAntigues != 'actuacionsAntigues': #Cas normal

En urls.py de tutoria:
re_path(r'^lesMevesActuacions/(?P<incloureActuacionsAntigues>\w+)/$', tutoria_views.lesMevesActuacions,

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No fa falta fer un altre branch.
Fes els canvis i commit-push.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pushed!

Comment on lines 445 to 456
if actuacio.professional: # Si l'actuació va ser importada, el professional ja no és al centre.
te_permis = (l4 or
actuacio.professional.pk == user.pk or
professor in actuacio.alumne.tutorsDeLAlumne() or
user.groups.filter(name__in= [u'direcció', u'psicopedagog'] ).exists()
)
else:
te_permis = (l4 or
professor in actuacio.alumne.tutorsDeLAlumne() or
user.groups.filter(name__in= [u'direcció', u'psicopedagog'] ).exists()
)

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if actuacio.professional: # Si l'actuació va ser importada, el professional ja no és al centre.
te_permis = (l4 or
actuacio.professional.pk == user.pk or
professor in actuacio.alumne.tutorsDeLAlumne() or
user.groups.filter(name__in= [u'direcció', u'psicopedagog'] ).exists()
)
else:
te_permis = (l4 or
professor in actuacio.alumne.tutorsDeLAlumne() or
user.groups.filter(name__in= [u'direcció', u'psicopedagog'] ).exists()
)
te_permis = (
l4 or
professor in actuacio.alumne.tutorsDeLAlumne() or
user.groups.filter(name__in= [u'direcció', u'psicopedagog'] ).exists()
)
if actuacio.professional: # Si l'actuació va ser importada, el professional ja no és al centre.
te_permis = (te_permis or actuacio.professional.pk == user.pk)

Copy link
Author

@rafatecno1 rafatecno1 Dec 19, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Provat, funciona i pushed!

@rafatecno1
Copy link
Author

Molt divertit això d'anar a la bd del curs passat demanant les credencials. No he provat si funciona o no, entenc que @rafatecno1 ho ha provat.

Ôbviament! Era la mare dels ous. Si no tens accès a la BD antiga i a l'actual alhora, no pots importar-les. De fet, a la pràctica, només poden importar les actuacions aquells que sàpiguen aquestes credencials (1 o 2 persones, com a màxim).

Crec recordar que @amorilla i @juaky tenen altres maneres per importar actuacions del curs anterior. Si és així, caldria un setting per 'amagar' aquesta opció del menú, per tal que no sembli la solució oficial. A no ser, clar, que en @juaky i l' @amorilla els sembli que aquesta és la solució oficial.

Quan vaig preguntar-ho al Telegram recordo que parlàven de fer un resum anual de dades, més que importar les actuacions. Potser ho vaig entendre jo malament. Es podria dir que aquesta app neix per no veure una manera fàcil de fer aquesta importació.

Personalment, m'agradaria que totes les actuacions anteriors anessin a parar a una única actuació de tipus "Resum Històric" a la que només hi tingués accés psicopedagog i direcció. Crec que simplificaria el procés: no caldria el matxing de professors, no caldria el filtre per data inici de curs, ... .El resum anual podria, fins i tot, contenir altres dades com ara % de presencialitat de cursos anteriors, si se li han enviat cartes d'absentisme, nombre d'incidències i expulsions, etc. Tot només per direcció i psicopedagog (si el tutor ha de saber alguna cosa que el psicopedagog li creï una actuació per a ell)

Doncs, encara que t'ho hagi llegit vegades, personalment no ho acabo de veure pràctic. Si sóc membre de l'equip directiu, psicopedagog o el tutor, si necessites buscar una actuació en concret sober un alumne pots acabar molt perdut buscant en una única actuació conjunta on hi hagin totes les actuacions, barrejades, de tothom. Seria un text molt llarg, massa, perquè se'n generen moltissimes actuacions al llarg de l'any. Suposo que el que vols dir és fer una única actuació per alumne, on hi hagi tot el que comentes, tot i que, continuo veient que pels alumnes que tinguin més actuacions, també pot ser farragos trobar l'agulla en el paller quan cerques alguna cosa concreta. En aquest cas, potser el que caldria seria no tant generar una actuació com a tal a la taula de les actuacions, sinó un altre "element"... element resum? taula nova? per poder integrar totes les dades que comentes, no només actuacions. De tota manera, crec que no són excluents, la importació de les actuacions i aquests resums integrats a l'aplicació.

Podríem, més endavant, ampliar aquest procés per passar els ítems de seguiment tutorial d'un curs a l'altre amb aquest sistema de la doble bd que està molt ben pensat. Tot el que hagi de passar d'un curs per l'altre.

Molt bona feina.

@amorilla
Copy link
Collaborator

Hola,
Estic fent proves i m'he trobat un problema amb Django 4. Amb Django 3 no falla.

KeyError at /importaActuacions/connexioDB/

'CONN_HEALTH_CHECKS'

Request Method: POST
Request URL: http://127.0.0.1:8000/importaActuacions/connexioDB/
Django Version: 4.1.4
Exception Type: KeyError
Exception Value:

'CONN_HEALTH_CHECKS'

Exception Location: /home/antonio/djau/djau2018/venv38/lib/python3.8/site-packages/django/db/backends/base/base.py, line 254, in connect
Raised during: aula.apps.importaActuacions.views.connexioDBold
Python Executable: /home/antonio/djau/djau2018/venv38/bin/python3.8
Python Version: 3.8.10
Python Path:

['/home/antonio/eclipse-workspace/djauforktest',
'/home/antonio/eclipse-workspace/djauforktest',
'/home/antonio/djau/djau2018/venv38/lib/python3.8/site-packages',
'/usr/lib/python3.8',
'/usr/lib/python3.8/lib-dynload',
'/home/antonio/djau/djau2018/venv38/lib/python3.8/site-packages/django_audiotracks-0.2.6-py3.8.egg',
'/home/antonio/djau/djau2018/venv38/lib/python3.8/site-packages/mutagen-1.45.1-py3.8.egg',
'/usr/lib/python38.zip']

Un altre problema és a la sincronització de professionals, surt:
Recurs no trobat
Com has arribat fins aquí?.
És possible que sigui a causa de que no tinc cap professional diferent per sincronitzar.

Salutacions.

@amorilla
Copy link
Collaborator

Hola,
Actualment tenim dues maneres de mantenir el seguiment tutorial i les actuacions.
a) Seguint els scripts de canvi de curs.
b) No esborrar la base de dades i fer inicialització des d'Admin/Inicialitza.

Aquesta proposta entenc que és una evolució de l'opció a), per automatitzar el procés.
Encara no he pogut fer una verificació completa, de moment he detectat els dos problemes que he comentat abans.

Salutacions.

@ctrl-alt-d
Copy link
Owner

KeyError at /importaActuacions/connexioDB/
'CONN_HEALTH_CHECKS'

Potser per afegir la bd cal importar des de: from django.conf import settings en comptes d'importar directament el settings_local

@rafatecno1
Copy link
Author

rafatecno1 commented Dec 21, 2022

Hola, Estic fent proves i m'he trobat un problema amb Django 4. Amb Django 3 no falla.

Caldrà investigar-ho. Jo tinc la 3.2.16

El que sí m'he trobat és que si torno a la pantalla de connexió amb la DB antiga, o bé perquè "m'he equivocat" a l'hora d'entrar les credencials o bé perquè vull provar-ne de noves, té comportaments estranys si no refresco la pàgina amb Ctrl-F5.

Per exemple, vaig comprovar, amb debug, que si "m'equivoco" posant les credencials i després les poso bé, el sistema se'n recorda de les credencials dolentes i no em deixa entrar-hi, malgrat les dades dins el diccionari DATABASES siguin ja les correctes (vist amb debug). A l'inrevès passa exactament igual. Si ja hi he entrat correctament i després vull canviar de DB o bé posar-les de nou malment, continua recordant les que tenia, malgrat el diccionari DATABASES sí que reflexteix els canvis.

Tot això "s'arregla" fent Ctrl+F5 a la pàgina de les credencials de la BD.... però és lleig, és clar.

@rafatecno1
Copy link
Author

Hola, Actualment tenim dues maneres de mantenir el seguiment tutorial i les actuacions. a) Seguint els scripts de canvi de curs. b) No esborrar la base de dades i fer inicialització des d'Admin/Inicialitza.

Aquesta proposta entenc que és una evolució de l'opció a), per automatitzar el procés. Encara no he pogut fer una verificació completa, de moment he detectat els dos problemes que he comentat abans.

Salutacions.

Sí, es pot entendre que sí, que és una evolució.

Mireu, a l'inici de curs vaig preguntar-vos per aquestes formes d'incorporar la informació o d'iniciar el curs. Malgrat hi hagi informació a les issues, no només no em va quedar clar com s'havia de fer sinó que quan realment ho vaig intentar, no vaig poder (no se si recordes la conversa al Telegram).

En definitiva, un administrador del Djau que no sigui informàtic ho ha de tenir molt fàcil, molt. De moment, no ho és pas. Amb aquest sistema que he programat, és molt fàcil incorporar aquesta informació.

Recomando fer proves amb BD reals (còpies, és clar) per poder controlar millor la informació. Jo he fet així i és molt pràctic.

</tr>
</thead>
<tbody>
{% for actuacio in actuacions_olddb_list %}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hauria de ser {% for actuacio in actuacions_a_importar %}

</tr>
</thead>
<tbody>
{% for actuacio in actuacions_olddb_list %}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{% for actuacio in actuacions_sense_alumne_curs_actual %}

</tr>
</thead>
<tbody>
{% for actuacio in actuacions_olddb_list %}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

{% for actuacio in actuacions_sense_professional %}

}

settings_local.DATABASES[dades_connexio_dbold.get('name_dbold')] = {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Podria ser que la BD no fos postgresql, proposo definir la base de dades als settings:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'djau2022',
'USER': 'djaudb',
'PASSWORD': "xxxxxxx",
'HOST': '127.0.0.1',
'PORT': '',
},
'curs2021': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'djau2021',
'USER': 'djaudb',
'PASSWORD': "xxxxxxx",
'HOST': '127.0.0.1',
'PORT': '',
}
}

Des del form només s'ha de demanar l'identificador, p.ex: curs2021

actuacions_a_importar.append(actuacio_olddb)
else:
actuacions_ja_importades.append(actuacio_olddb)

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tinc una proposta per ajuntar les fases des de la 3 a la 6, també crec que és millor fer servir els models per a que els noms dels camps no siguin diferents. Aquest canvi implica adaptar el template importacio.html.

    head = u"Llistat detallat de les actuacions que s'importaran des d'un altre curs."

    # Informació a mostrar en el template.
    from aula.apps.usuaris.models import Professional
    global actuacions_a_importar
    alumnes_desmatriculats = []                 # Alumnat que ja no hi és.
    actuacions_sense_alumne_curs_actual = []    # Actuacions especials donat que NO s'importaran a la BD del curs actual.
    professionals_foracentre = []               # Professionals que ja no hi son.
    actuacions_sense_professional = []          # actuacions especials donat se'n modificarà el seu text i SÍ que s'importaran a la BD del curs actual.
    actuacions_ja_importades = []
    actuacions_a_importar = []

    #Totes les actuacions de la BD antiga
    actuacions_olddb = Actuacio.objects.using(nom_dbold).all()
    for a in actuacions_olddb:
        # Existeix l'alumne a la BD actual ?
        alumne=Alumne.objects.filter(ralc=a.alumne.ralc, data_baixa__isnull=True)
        if alumne:
            #Prepara còpia de l'actuacio
            na=Actuacio(moment_actuacio = a.moment_actuacio, qui_fa_actuacio = a.qui_fa_actuacio, 
                        amb_qui_es_actuacio = a.amb_qui_es_actuacio, assumpte = a.assumpte, actuacio = a.actuacio)   
            #S'assigna alumne a l'actuació
            na.alumne=alumne[0]
            if (a.professional.username in usernames_oldb_to_usernames_curs_actual_dict):
                # S'agafa l'username del professional segons la sincronització
                newusername=usernames_oldb_to_usernames_curs_actual_dict.get(a.professional.username)
            else:
                newusername=a.professional.username
            p=Professional.objects.filter(username=newusername)
            if p:
                # S'assigna el professional a l'actuació
                na.professional=p[0]
            else:
                #El professional no hi és a la BD actual
                if a.professional not in professionals_foracentre: professionals_foracentre.append(a.professional)
                # S'afegeix una frase a l'inici del text de l'actuació per deixar constància de qui i quan es va fer l'actuació.
                text_actuacio  = u'El o la professional '+a.professional.first_name+' '+a.professional.last_name
                text_actuacio += ' ('+a.professional.username+')'
                text_actuacio += ' va redactar aquesta actuació, però ja no es troba al centre educatiu.'
                text_actuacio += ' No obstant, a continuació se\'n mostra el text original: \n\n'
                text_actuacio += a.actuacio
                na.actuacio = text_actuacio
                na.professional=None
                actuacions_sense_professional.append(na)
            #Comprova si l'actuació ja existeix d'una importació anterior
            check=Actuacio.objects.filter(alumne=na.alumne, professional=na.professional, moment_actuacio=na.moment_actuacio,
                                          qui_fa_actuacio=na.qui_fa_actuacio)
            if check:
                actuacions_ja_importades.append(a)
            else:
                actuacions_a_importar.append(na)
            
        else:
            # No és alumne actualment 
            if a.alumne not in alumnes_desmatriculats: alumnes_desmatriculats.append(a.alumne)
            actuacions_sense_alumne_curs_actual.append(a)
    
    return render(
        request,
        '../templates/importacio.html', 
        {
        'nom_dbold':nom_dbold,
        'head':head,
        'alumnes_desmatriculats':alumnes_desmatriculats,
        'actuacions_sense_alumne_curs_actual':actuacions_sense_alumne_curs_actual,
        'professionals_foracentre':professionals_foracentre,
        'actuacions_sense_professional':actuacions_sense_professional,
        'actuacions_olddb_list':[], # actuacions_olddb_list. No fa falta, 
        'actuacions_ja_importades': actuacions_ja_importades,
        'actuacions_a_importar': actuacions_a_importar,
        },)

connexio = check_database_connection(request)
if connexio is not None:
return connexio
if not usernames_oldb_to_usernames_curs_actual_dict: # Per evitar un accès amb url directe
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aquest "if" provoca que si no hi ha cap canvi als usuaris, aleshores surt pàgina no trobada.


head = u"Sincronització entre cursos dels professionals del centre educatiu"

usuaris_olddb_id_username_firstname_lastname_list = list(User.objects.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Millor seleccionar els usuaris segons el grup, només professor i professional.

if actuacio_olddb.get('alumne_id')!=None: # Només s'hi afegiran totes les actuacions associades a un alumne matriculat en el curs actual.

# Comprovació para no importar una actuació que ja va ser importada per algú
# la data exacta és gairebé impossible que es pugui repetir perquè haurien d'haver-hi dues actuacions creades en el mateix segon.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

La llei de Murphy indica que si passarà. Millor fer servir també alumne, professional, quifaactuacio, ...


{% if habilita_link_actuacions_antigues %}
<div class="alert alert-info" role="alert">
<p>Les <strong>actuacions dutes a terme en cursos anteriors</strong> es poden consultar <a href="/tutoria/lesMevesActuacions/actuacionsAntigues" class="alert-link">en aquest enllaç</a>.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Millor una variable al settings per decidir això. En el meu cas no esborrem la base de dades i tenim sempre a disposició totes les actuacions.

# Preparació de les dades a inserir
for actuacio in actuacions_a_importar:
act = Actuacio(
id = identificador_nova_actuacio,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Posar id=None, millor que s'adjudiqui automàticament. Podria haver-hi algú al mateix temps creant alguna actuació nova.
Per identificar les actuacions afegides, proposo fer servir el moment_actuació, guardant el més antic i el més modern.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Si es fa servir la meva proposta d'unificació de les fases 3 a 6, aleshores només fa falta afegir al bulk.

        # Preparació de les dades a inserir
        for actuacio in actuacions_a_importar:
            actuacions_pel_bulkcreate.append(actuacio)

@amorilla
Copy link
Collaborator

Aquesta nova opció serà útil per a qui vulgui crear la base de dades nova cada curs i afegir les actuacions d'altres anys.
De totes maneres recomano fer servir l'opció d'Inicialitza i no esborrar la base de dades.
Avantatges:
Es mantenen les actuacions i seguiment tutorial.
Es mantenen els usuaris, les famílies no han de canviar d'usuari cada curs.
Els profes mantenen usuari i dadesaddicionals.
Es mantenen els grups i l'usuari superuser.
Es mantenen les definicions: tipusincidencia, tipussancio, frasesincidencia, ...
Es mantenen els recursos de material.
Permet fer consulta de l'històric de pagaments i sortides.

Salutacions.

@amorilla
Copy link
Collaborator

Bon Nadal!

@rafatecno1
Copy link
Author

rafatecno1 commented Dec 25, 2022

Aquesta nova opció serà útil per a qui vulgui crear la base de dades nova cada curs i afegir les actuacions d'altres anys. De totes maneres recomano fer servir l'opció d'Inicialitza i no esborrar la base de dades. Avantatges: Es mantenen les actuacions i seguiment tutorial. Es mantenen els usuaris, les famílies no han de canviar d'usuari cada curs. Els profes mantenen usuari i dadesaddicionals. Es mantenen els grups i l'usuari superuser. Es mantenen les definicions: tipusincidencia, tipussancio, frasesincidencia, ... Es mantenen els recursos de material. Permet fer consulta de l'històric de pagaments i sortides.

Salutacions.

Abans de res, bon Nadal i gràcies per la currada d'estudiar-te la PR. Em miraré les teves suggerències tant bon punt pugui. Vaig amb la meva contestació, que sempre les faig llargues per intentar explicar-me bé.

Volia respondre especialment aquest text teu, Antonio. Sempre he observat que el DjAu està poc documentat, especialment pensant en un professor coordinador digital típic. El professor coordinador digital que vulgui instal·lar el DjAu ha de tenir un perfil tècnic fortament marcat. No només ha de conèixer conceptes generals "informàtics", sinó que ha de conèixer, relativament bé, Linux i quantes més coses millor, perquè quan instal·les el DjAu solen haver-hi "cosetes" que fan que la instal·lació no segueixi el paradigma del "one click button". No és fàcil trobar aquest perfil de professor.

Tot això ho comento perquè quan llegeixes la direcció per instal.lar el DjAu sempre es diu que està pensat per instal·lar-se de nou cada curs, per decisió de disseny, i enlloc s'explica de forma fàcil i intuïtiva què s'ha de fer quan un curs s'acaba i comença el següent. Això condiciona la visió que té aquest coordinador digital tipus i es quedarà amb la idea que curs nou, instal·lació nova, DB nova, etc. Si hi ha alguna altra manera per començar un curs nou aquesta no està documentada, i perdoneu-me però no em serveix el text d'una issue, tant la d'en Juaki pel resum anual com la teva per inicialitzar el curs. Aquestes issues no poden ser mai la documentació d'instal.lació o d'ús. Per mi, i suposo que també per un professor tipus, tot allò que hi ha allà escrit sona igual que el "conxuro da Queimada".

A més a més, pel que fa a aquesta procediments, després de comentar-ho en Telegram, sort que em vau dir que un cop el curs ha començat no es podia fer... en fin. No és fàcil de fer si no saps ni com començar.

A mi m'agradaria molt que el sistema que proposes, d'inicialitzar el curs, estigués ben documentat i fos senzill d'implementar per un professor coordinador digital tipus que no sigui programador. Realment, pel que expliques, ja ho tindríem i això és el que, segurament, molts instituts necessitem. De fet el motiu per crear aquesta PR va ser perquè no vaig poder o saber "inicialitzar" el curs després de preguntar en el Telegram.

@malbareda
Copy link
Contributor

Aquesta nova opció serà útil per a qui vulgui crear la base de dades nova cada curs i afegir les actuacions d'altres anys. De totes maneres recomano fer servir l'opció d'Inicialitza i no esborrar la base de dades. Avantatges: Es mantenen les actuacions i seguiment tutorial. Es mantenen els usuaris, les famílies no han de canviar d'usuari cada curs. Els profes mantenen usuari i dadesaddicionals. Es mantenen els grups i l'usuari superuser. Es mantenen les definicions: tipusincidencia, tipussancio, frasesincidencia, ... Es mantenen els recursos de material. Permet fer consulta de l'històric de pagaments i sortides.
Salutacions.

Abans de res, bon Nadal i gràcies per la currada d'estudiar-te la PR. Em miraré les teves suggerències tant bon punt pugui. Vaig amb la meva contestació, que sempre les faig llargues per intentar explicar-me bé.

Volia respondre especialment aquest text teu, Antonio. Sempre he observat que el DjAu està poc documentat, especialment pensant en un professor coordinador digital típic. El professor coordinador digital que vulgui instal·lar el DjAu ha de tenir un perfil tècnic fortament marcat. No només ha de conèixer conceptes generals "informàtics", sinó que ha de conèixer, relativament bé, Linux i quantes més coses millor, perquè quan instal·les el DjAu solen haver-hi "cosetes" que fan que la instal·lació no segueixi el paradigma del "one click button". No és fàcil trobar aquest perfil de professor.

Tot això ho comento perquè quan llegeixes la direcció per instal.lar el DjAu sempre es diu que està pensat per instal·lar-se de nou cada curs, per decisió de disseny, i enlloc s'explica de forma fàcil i intuïtiva què s'ha de fer quan un curs s'acaba i comença el següent. Això condiciona la visió que té aquest coordinador digital tipus i es quedarà amb la idea que curs nou, instal·lació nova, DB nova, etc. Si hi ha alguna altra manera per començar un curs nou aquesta no està documentada, i perdoneu-me però no em serveix el text d'una issue, tant la d'en Juaki pel resum anual com la teva per inicialitzar el curs. Aquestes issues no poden ser mai la documentació d'instal.lació o d'ús. Per mi, i suposo que també per un professor tipus, tot allò que hi ha allà escrit sona igual que el "conxuro da Queimada".

A més a més, pel que fa a aquesta procediments, després de comentar-ho en Telegram, sort que em vau dir que un cop el curs ha començat no es podia fer... en fin. No és fàcil de fer si no saps ni com començar.

A mi m'agradaria molt que el sistema que proposes, d'inicialitzar el curs, estigués ben documentat i fos senzill d'implementar per un professor coordinador digital tipus que no sigui programador. Realment, pel que expliques, ja ho tindríem i això és el que, segurament, molts instituts necessitem. De fet el motiu per crear aquesta PR va ser perquè no vaig poder o saber "inicialitzar" el curs després de preguntar en el Telegram.

Crec que la part de "no esborrar la BD" està aquí. No sabia pas que era la recomanada.
#109

I sí, potser sí que seria necessari refer la documentació, hi ha coses que a la mateixa documentació estan malament, com que la BD s'inicialitzi com a SQLite. No ho criticare perque jo també soc el developer d'una app educativa de django mal documentada :P

@ctrl-alt-d
Copy link
Owner

@malbareda please, on diu com que la BD s'inicialitzi com a SQLite. ? Voldria fixar-ho. Merci

@amorilla
Copy link
Collaborator

amorilla commented Dec 26, 2022 via email

@ctrl-alt-d
Copy link
Owner

Centrar-nos en una opció té avantatges clars:

  • Menys codi a mantenir.
  • Menys codi a documentar.
  • Menys issues.
  • Més claretat. Per a gent que entri nova no haver de documentar-se sobre les opcions, poder anar directament a resoldre el problema.
  • Poder-nos ajudar més fàcilment perquè tots ho fem igual.

Per ara veig avantatges a la tàctica @amorilla . Com ho veieu vosaltres?

@malbareda
Copy link
Contributor

@malbareda please, on diu com que la BD s'inicialitzi com a SQLite. ? Voldria fixar-ho. Merci

https://github.com/ctrl-alt-d/django-aula/blob/master/docs/Wiki/instalacion-2/instalacion.md

En l'exemple de settings.py proporcionat que defineix una configuració vàlida, BD que es defineix es SQLite.

És a dir, no es diu EXPLICITAMENT que s'inicii una SQLite, però podem estar d'acord que la majoria de nous usuaris que segueixin la guia de pe a pa acabaran posant accidentalment una SQLite

@ctrl-alt-d
Copy link
Owner

@malbareda el que diu explícitament és

Además instalaremos la base de datos que usará django-aula y su conector python correspondiente, se recomienda instalar la aplicación sobre postgresql pero también es posible hacerlo sobre Mysql.

A l'exemple veig que posa SQLite i confon. S'hauria de substituir per una connexió a postgres, vols fer tu mateix la PR? Merci 🙌

Respecte la documentació, us sembla bé que no acceptem més PR si no van acompanyades dels canvis a la documentació? Teniu alguna altre proposta en aquest sentit?

malbareda added a commit to malbareda/django-aula that referenced this pull request Dec 26, 2022
Esborrat path d'instal·lació de mysql seguint indicacions de: ctrl-alt-d#213 (comment)
Canviat exemple de local_settings.py a un més adient.

Aquests dies intentaré fer una instal·lació desde 0 seguint aquesta guia, documentaré les dificultats, i les afegiré al document.
@malbareda malbareda mentioned this pull request Dec 26, 2022
@malbareda
Copy link
Contributor

malbareda commented Dec 26, 2022

@malbareda el que diu explícitament és

Además instalaremos la base de datos que usará django-aula y su conector python correspondiente, se recomienda instalar la aplicación sobre postgresql pero también es posible hacerlo sobre Mysql.

A l'exemple veig que posa SQLite i confon. S'hauria de substituir per una connexió a postgres, vols fer tu mateix la PR? Merci 🙌

Respecte la documentació, us sembla bé que no acceptem més PR si no van acompanyades dels canvis a la documentació? Teniu alguna altre proposta en aquest sentit?

Crec que ara mateix el que corre més pressa és tenir guies que detallin les coses que siguin més confoses.

@amorilla
Copy link
Collaborator

Hola,

He trobat la solució al problema de Django 4.
S'ha d'afegir el paràmetre CONN_HEALTH_CHECKS a la definició de la base de dades:

DATABASES = {
  'default': {
  'ENGINE': 'django.db.backends.postgresql',
  'NAME': 'djau2022',
  .....
  },
  'curs2021': {
  'ENGINE': 'django.db.backends.postgresql',
  'NAME': 'djau2021',
   .....
  'CONN_HEALTH_CHECKS': True,
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants