def crea_alumne(nom, cognoms, dataNaixement, grup): # Exemple d'ús: # from aula.apps.alumnes.tools import crea_alumne # crea_alumne("Cynthia", "Martínez Camps", "4-10-1996", "2CTX") #Cal fer comprovacions dels paràmetres. a=Alumne() a.nom = nom a.cognoms = cognoms a.data_neixement = datetime.datetime.strptime(dataNaixement, "%d-%m-%Y").date() descripcioGrup = str(grup) grup = Grup.objects.get(descripcio_grup=descripcioGrup) a.grup = grup a.estat_sincronitzacio = 'MAN' a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False a.save()
def sincronitza(f, user = None): msgs = comprovar_grups( f ) if msgs["errors"]: return msgs errors = [] #Exclou els alumnes AMB esborrat i amb estat MAN (creats manualment) Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \ .update( estat_sincronitzacio = 'PRC') errors_nAlumnesSenseGrup=0 info_nAlumnesLlegits=0 info_nAlumnesInsertats=0 info_nAlumnesEsborrats=0 info_nAlumnesCanviasDeGrup=0 info_nAlumnesModificats=0 info_nMissatgesEnviats = 0 AlumnesCanviatsDeGrup = [] AlumnesInsertats = [] trobatGrupClasse = False trobatNom = False trobatDataNeixement = False trobatRalc = False # Carregar full de càlcul wb2 = load_workbook(f) full = wb2.active max_row = full.max_row # iterar sobre les files colnames = [u'Identificador de l’alumne/a', u'Primer Cognom', u'Segon Cognom', u'Nom', u'Data naixement', u'Tutor 1 - 1r cognom ', u'Tutor 1 - 2n cognom', u'Tutor 1 - nom', u'Contacte 1er tutor alumne - Valor', u'Tutor 2 - 1r cognom ', u'Tutor 2 - 2n cognom', u'Tutor 2 - nom', u'Contacte 2on tutor alumne - Valor', u'Tipus de via', u'Nom via', u'Número', u'Bloc', u'Escala', u'Planta', u'Porta', u'Codi postal', u'Localitat de residència', u'Municipi de residència', u'Correu electrònic', u'Contacte altres alumne - Valor', u'Grup Classe'] rows = list(wb2.active.rows) col_indexs = {n: cell.value for n, cell in enumerate(rows[5]) if cell.value in colnames} # Començar a la fila 6, les anteriors són brossa nivells = set() for row in rows[6:max_row - 1]: # la darrera fila també és brossa info_nAlumnesLlegits += 1 a = Alumne() a.ralc = '' a.telefons = '' for index, cell in enumerate(row): if index in col_indexs: if col_indexs[index].endswith(u"Identificador de l’alumne/a"): a.ralc=unicode(cell.value) trobatRalc = True if col_indexs[index].endswith(u"Primer Cognom"): a.cognoms = unicode(cell.value) if col_indexs[index].endswith(u"Segon Cognom"): a.cognoms += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Nom"): a.nom = unicode(cell.value) trobatNom = True if col_indexs[index].endswith(u"Grup Classe"): try: unGrup = Grup2Aula.objects.get(grup_esfera = unicode(cell.value), Grup2Aula__isnull = False) a.grup = unGrup.Grup2Aula except: return { 'errors': [ u"error carregant {0}".format( unicode(cell.value) ), ], 'warnings': [], 'infos': [] } trobatGrupClasse = True if col_indexs[index].endswith(u"Correu electrònic"): a.correu = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Data naixement"): dia = time.strptime(unicode(cell.value), '%d/%m/%Y') a.data_neixement = time.strftime('%Y-%m-%d', dia) trobatDataNeixement = True # if columnName.endswith( u"_CENTRE PROCEDÈNCIA"): # a.centre_de_procedencia = unicode(value,'iso-8859-1') if col_indexs[index].endswith(u"Localitat de residència"): a.localitat = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Codi postal"): a.cp = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Municipi de residència"): a.municipi = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Contacte 1er tutor alumne - Valor"): dades_tutor1 = dades_responsable(unicode(cell.value) if cell.value else "") a.rp1_telefon = ', '.join(dades_tutor1["fixes"]); a.rp1_mobil = ', '.join(dades_tutor1["mobils"]); a.rp1_correu = ', '.join(dades_tutor1["mails"]); if col_indexs[index].endswith(u"Contacte 2on tutor alumne - Valor"): dades_tutor2 = dades_responsable(unicode(cell.value) if cell.value else "") a.rp2_telefon = ', '.join(dades_tutor2["fixes"]); a.rp2_mobil = ', '.join(dades_tutor2["mobils"]); a.rp2_correu = ', '.join(dades_tutor2["mails"]); if col_indexs[index].endswith(u"Contacte altres alumne - Valor"): a.altres_telefons = unicode(cell.value) if col_indexs[index].endswith(u"Tutor 1 - 1r cognom "): a.rp1_nom = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 1 - 2n cognom"): a.rp1_nom += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 1 - nom"): separador = ", " if (a.rp1_nom != "") else "" a.rp1_nom += separador + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 2 - 1r cognom "): a.rp2_nom = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 2 - 2n cognom"): a.rp2_nom += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 2 - nom"): separador = ", " if (a.rp2_nom != "") else "" a.rp2_nom += separador + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tipus de via"): a.adreca = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Nom via"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Número"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Bloc"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Escala"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Planta"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Porta"): a.adreca += " " + unicode(cell.value) if cell.value else "" if not (trobatGrupClasse and trobatNom and trobatDataNeixement and trobatRalc): return { 'errors': [ u'Falten camps al fitxer' ], 'warnings': [], 'infos': [] } alumneDadesAnteriors = None try: q_mateix_ralc = Q( ralc = a.ralc ) alumneDadesAnteriors =Alumne.objects.get (q_mateix_ralc) except Alumne.DoesNotExist: pass if alumneDadesAnteriors is None: a.estat_sincronitzacio = 'S-I' a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False info_nAlumnesInsertats+=1 AlumnesInsertats.append(a) else: #TODO: si canvien dades importants avisar al tutor. a.pk = alumneDadesAnteriors.pk a.estat_sincronitzacio = 'S-U' info_nAlumnesModificats+=1 # En cas que l'alumne pertanyi a un dels grups parametritzat com a estàtic, # no se li canviarà de grup en les importacions d'Esfer@. grups_estatics, _ = ParametreEsfera.objects.get_or_create( nom_parametre = 'grups estatics' ) es_de_grup_estatic = False for prefixe_grup in grups_estatics.valor_parametre.split(','): prefix = prefixe_grup.replace(' ','') if prefix: es_de_grup_estatic = es_de_grup_estatic or alumneDadesAnteriors.grup.descripcio_grup.startswith( prefix ) if a.grup.pk != alumneDadesAnteriors.grup.pk: if es_de_grup_estatic: #no canviar-li de grup a.grup = alumneDadesAnteriors.grup else: AlumnesCanviatsDeGrup.append(a) a.user_associat = alumneDadesAnteriors.user_associat #el recuperem, havia estat baixa: if alumneDadesAnteriors.data_baixa: info_nAlumnesInsertats+=1 a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False else: a.correu_relacio_familia_pare = alumneDadesAnteriors.correu_relacio_familia_pare a.correu_relacio_familia_mare = alumneDadesAnteriors.correu_relacio_familia_mare a.motiu_bloqueig = alumneDadesAnteriors.motiu_bloqueig a.relacio_familia_darrera_notificacio = alumneDadesAnteriors.relacio_familia_darrera_notificacio a.periodicitat_faltes = alumneDadesAnteriors.periodicitat_faltes a.periodicitat_incidencies = alumneDadesAnteriors.periodicitat_incidencies a.tutors_volen_rebre_correu = alumneDadesAnteriors.tutors_volen_rebre_correu = False a.save() nivells.add(a.grup.curs.nivell) # # Baixes: # # Els alumnes de Saga no s'han de tenir en compte per fer les baixes AlumnesDeSaga = Alumne.objects.exclude(grup__curs__nivell__in=nivells) AlumnesDeSaga.update(estat_sincronitzacio='') # #Els alumnes que hagin quedat a PRC és que s'han donat de baixa: AlumnesDonatsDeBaixa = Alumne.objects.filter( estat_sincronitzacio__exact = 'PRC' ) AlumnesDonatsDeBaixa.update( data_baixa = date.today(), estat_sincronitzacio = 'DEL' , motiu_bloqueig = 'Baixa' ) #Avisar als professors: Baixes #: enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesEsborrats = len( AlumnesDonatsDeBaixa ) professorsNotificar = {} for alumneDonatDeBaixa in AlumnesDonatsDeBaixa: for professor in Professor.objects.filter( horari__impartir__controlassistencia__alumne = alumneDonatDeBaixa ).distinct(): professorsNotificar.setdefault( professor.pk, [] ).append( alumneDonatDeBaixa ) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append( u'{0} ({1})'.format(unicode( alumne), alumne.grup.descripcio_grup ) ) missatge = ALUMNES_DONATS_DE_BAIXA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge( remitent = user, text_missatge = missatge, tipus_de_missatge = tipus_de_missatge ) msg.afegeix_infos( llista ) msg.envia_a_usuari( Professor.objects.get( pk = professorPK ) , 'IN') info_nMissatgesEnviats += 1 #Avisar als professors: Canvi de grup #enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesCanviasDeGrup = len( AlumnesCanviatsDeGrup ) professorsNotificar = {} for alumneCanviatDeGrup in AlumnesCanviatsDeGrup: qElTenenALHorari = Q( horari__impartir__controlassistencia__alumne = alumneCanviatDeGrup ) qImparteixDocenciaAlNouGrup = Q( horari__grup = alumneCanviatDeGrup.grup ) for professor in Professor.objects.filter( qElTenenALHorari | qImparteixDocenciaAlNouGrup ).distinct(): professorsNotificar.setdefault( professor.pk, [] ).append( alumneCanviatDeGrup ) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append( u'{0} passa a grup {1}'.format(unicode( alumne), alumne.grup.descripcio_grup ) ) missatge = ALUMNES_CANVIATS_DE_GRUP tipus_de_missatge = tipusMissatge(missatge) msg = Missatge( remitent = user, text_missatge = missatge, tipus_de_missatge = tipus_de_missatge ) msg.afegeix_infos( llista ) msg.envia_a_usuari( Professor.objects.get( pk = professorPK ) , 'IN') info_nMissatgesEnviats += 1 #Avisar als professors: Altes #enviar un missatge a tots els professors que tenen aquell alumne. professorsNotificar = {} for alumneNou in AlumnesInsertats: qImparteixDocenciaAlNouGrup = Q( horari__grup = alumneNou.grup ) for professor in Professor.objects.filter( qImparteixDocenciaAlNouGrup ).distinct(): professorsNotificar.setdefault( professor.pk, [] ).append( alumneNou ) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append( u'{0} al grup {1}'.format(unicode( alumne), alumne.grup.descripcio_grup ) ) missatge = ALUMNES_DONATS_DALTA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge( remitent = user, text_missatge = missatge, tipus_de_missatge = tipus_de_missatge ) msg.afegeix_infos( llista ) msg.envia_a_usuari( Professor.objects.get( pk = professorPK ) , 'IN') info_nMissatgesEnviats += 1 #Treure'ls de les classes: les baixes ControlAssistencia.objects.filter( impartir__dia_impartir__gte = date.today(), alumne__in = AlumnesDonatsDeBaixa ).delete() #Treure'ls de les classes: els canvis de grup #Todo: només si l'àmbit és grup. ambit_no_es_el_grup = Q( impartir__horari__assignatura__tipus_assignatura__ambit_on_prendre_alumnes__in = [ 'C', 'N', 'I' ] ) ( ControlAssistencia .objects .filter( ambit_no_es_el_grup ) .filter( impartir__dia_impartir__gte = date.today() ) .filter( alumne__in = AlumnesCanviatsDeGrup ) .delete() ) #Altes: posar-ho als controls d'assistència de les classes (?????????) # # FI # # Tornem a l'estat de sincronització en blanc, excepte els alumnes esborrats DEL i els alumnes entrats manualment MAN. Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \ .update( estat_sincronitzacio = '') errors.append( u'%d alumnes sense grup'%errors_nAlumnesSenseGrup ) warnings= [ ] infos= [ ] infos.append(u'{0} alumnes llegits'.format(info_nAlumnesLlegits) ) infos.append(u'{0} alumnes insertats'.format(info_nAlumnesInsertats) ) infos.append(u'{0} alumnes esborrats'.format(info_nAlumnesEsborrats ) ) infos.append(u'{0} alumnes canviats de grup'.format(info_nAlumnesCanviasDeGrup ) ) infos.append(u'{0} alumnes en estat sincronització manual'.format( \ len(Alumne.objects.filter(estat_sincronitzacio__exact = 'MAN')))) infos.append(u'{0} missatges enviats'.format(info_nMissatgesEnviats ) ) missatge = IMPORTACIO_ESFERA_FINALITZADA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge( remitent= user, text_missatge = missatge, tipus_de_missatge = tipus_de_missatge) msg.afegeix_errors( errors ) msg.afegeix_warnings(warnings) msg.afegeix_infos(infos) importancia = 'VI' if len( errors )> 0 else 'IN' grupDireccio = Group.objects.get( name = 'direcció' ) msg.envia_a_grup( grupDireccio , importancia=importancia) return { 'errors': errors, 'warnings': warnings, 'infos': infos }
def sincronitza(f, user=None): errors = [] try: # Carregar full de càlcul wb2 = load_workbook(f) if len(wb2.worksheets) != 1: # Si té més d'una pestanya --> error errors.append('Fitxer incorrecte') return {'errors': errors, 'warnings': [], 'infos': []} msgs = comprovar_grups(f) if msgs["errors"]: return msgs except: errors.append('Fitxer incorrecte') return {'errors': errors, 'warnings': [], 'infos': []} #Exclou els alumnes AMB esborrat i amb estat MAN (creats manualment) Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \ .update( estat_sincronitzacio = 'PRC') errors_nAlumnesSenseGrup = 0 info_nAlumnesLlegits = 0 info_nAlumnesInsertats = 0 info_nAlumnesEsborrats = 0 info_nAlumnesCanviasDeGrup = 0 info_nAlumnesModificats = 0 info_nMissatgesEnviats = 0 AlumnesCanviatsDeGrup = [] AlumnesInsertats = [] trobatGrupClasse = False trobatNom = False trobatDataNeixement = False trobatRalc = False # Carregar full de càlcul full = wb2.active max_row = full.max_row # iterar sobre les files colnames = [ u'Identificador de l’alumne/a', u'Primer Cognom', u'Segon Cognom', u'Nom', u'Data naixement', u'Tutor 1 - 1r cognom ', u'Tutor 1 - 2n cognom', u'Tutor 1 - nom', u'Contacte 1er tutor alumne - Valor', u'Tutor 2 - 1r cognom ', u'Tutor 2 - 2n cognom', u'Tutor 2 - nom', u'Contacte 2on tutor alumne - Valor', u'Tipus de via', u'Nom via', u'Número', u'Bloc', u'Escala', u'Planta', u'Porta', u'Codi postal', u'Localitat de residència', u'Municipi de residència', u'Correu electrònic', u'Contacte altres alumne - Valor', u'Grup Classe' ] rows = list(wb2.active.rows) col_indexs = { n: cell.value for n, cell in enumerate(rows[5]) if cell.value in colnames } # Començar a la fila 6, les anteriors són brossa nivells = set() for row in rows[6:max_row - 1]: # la darrera fila també és brossa info_nAlumnesLlegits += 1 a = Alumne() a.ralc = '' a.telefons = '' for index, cell in enumerate(row): if bool(cell) and bool(cell.value): cell.value = cell.value.strip() if index in col_indexs: if col_indexs[index].endswith(u"Identificador de l’alumne/a"): a.ralc = unicode(cell.value) trobatRalc = True if col_indexs[index].endswith(u"Primer Cognom"): a.cognoms = unicode(cell.value) if col_indexs[index].endswith(u"Segon Cognom"): a.cognoms += " " + unicode( cell.value) if cell.value else "" if col_indexs[index].endswith(u"Nom"): a.nom = unicode(cell.value) trobatNom = True if col_indexs[index].endswith(u"Grup Classe"): try: unGrup = Grup2Aula.objects.get(grup_esfera=unicode( cell.value), Grup2Aula__isnull=False) a.grup = unGrup.Grup2Aula except: return { 'errors': [ u"error carregant {0}".format( unicode(cell.value)), ], 'warnings': [], 'infos': [] } trobatGrupClasse = True if col_indexs[index].endswith(u"Correu electrònic"): a.correu = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Data naixement"): dia = time.strptime(unicode(cell.value), '%d/%m/%Y') a.data_neixement = time.strftime('%Y-%m-%d', dia) trobatDataNeixement = True # if columnName.endswith( u"_CENTRE PROCEDÈNCIA"): # a.centre_de_procedencia = unicode(value,'iso-8859-1') if col_indexs[index].endswith(u"Localitat de residència"): a.localitat = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Codi postal"): a.cp = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Municipi de residència"): a.municipi = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith( u"Contacte 1er tutor alumne - Valor"): dades_tutor1 = dades_responsable( unicode(cell.value) if cell.value else "") a.rp1_telefon = ', '.join(dades_tutor1["fixes"]) a.rp1_mobil = ', '.join(dades_tutor1["mobils"]) a.rp1_correu = ', '.join(dades_tutor1["mails"]) if col_indexs[index].endswith( u"Contacte 2on tutor alumne - Valor"): dades_tutor2 = dades_responsable( unicode(cell.value) if cell.value else "") a.rp2_telefon = ', '.join(dades_tutor2["fixes"]) a.rp2_mobil = ', '.join(dades_tutor2["mobils"]) a.rp2_correu = ', '.join(dades_tutor2["mails"]) if col_indexs[index].endswith( u"Contacte altres alumne - Valor"): a.altres_telefons = unicode(cell.value) if col_indexs[index].endswith(u"Tutor 1 - 1r cognom "): a.rp1_nom = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 1 - 2n cognom"): a.rp1_nom += " " + unicode( cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 1 - nom"): separador = ", " if (a.rp1_nom != "") else "" a.rp1_nom += separador + unicode( cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 2 - 1r cognom "): a.rp2_nom = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 2 - 2n cognom"): a.rp2_nom += " " + unicode( cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tutor 2 - nom"): separador = ", " if (a.rp2_nom != "") else "" a.rp2_nom += separador + unicode( cell.value) if cell.value else "" if col_indexs[index].endswith(u"Tipus de via"): a.adreca = unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Nom via"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Número"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Bloc"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Escala"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Planta"): a.adreca += " " + unicode(cell.value) if cell.value else "" if col_indexs[index].endswith(u"Porta"): a.adreca += " " + unicode(cell.value) if cell.value else "" if not (trobatGrupClasse and trobatNom and trobatDataNeixement and trobatRalc): return { 'errors': [u'Falten camps al fitxer'], 'warnings': [], 'infos': [] } alumneDadesAnteriors = None try: q_mateix_ralc = Q(ralc=a.ralc) alumneDadesAnteriors = Alumne.objects.get(q_mateix_ralc) except Alumne.DoesNotExist: pass if alumneDadesAnteriors is None: a.estat_sincronitzacio = 'S-I' a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False info_nAlumnesInsertats += 1 AlumnesInsertats.append(a) else: #TODO: si canvien dades importants avisar al tutor. a.pk = alumneDadesAnteriors.pk a.estat_sincronitzacio = 'S-U' info_nAlumnesModificats += 1 # En cas que l'alumne pertanyi a un dels grups parametritzat com a estàtic, # no se li canviarà de grup en les importacions d'Esfer@. grups_estatics, _ = ParametreEsfera.objects.get_or_create( nom_parametre='grups estatics') es_de_grup_estatic = False for prefixe_grup in grups_estatics.valor_parametre.split(','): prefix = prefixe_grup.replace(' ', '') if prefix: es_de_grup_estatic = es_de_grup_estatic or alumneDadesAnteriors.grup.descripcio_grup.startswith( prefix) if a.grup.pk != alumneDadesAnteriors.grup.pk: if es_de_grup_estatic: #no canviar-li de grup a.grup = alumneDadesAnteriors.grup else: AlumnesCanviatsDeGrup.append(a) a.user_associat = alumneDadesAnteriors.user_associat #el recuperem, havia estat baixa: if alumneDadesAnteriors.data_baixa: info_nAlumnesInsertats += 1 a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False a.foto = alumneDadesAnteriors.foto else: a.correu_relacio_familia_pare = alumneDadesAnteriors.correu_relacio_familia_pare a.correu_relacio_familia_mare = alumneDadesAnteriors.correu_relacio_familia_mare a.motiu_bloqueig = alumneDadesAnteriors.motiu_bloqueig a.relacio_familia_darrera_notificacio = alumneDadesAnteriors.relacio_familia_darrera_notificacio a.periodicitat_faltes = alumneDadesAnteriors.periodicitat_faltes a.periodicitat_incidencies = alumneDadesAnteriors.periodicitat_incidencies a.tutors_volen_rebre_correu = alumneDadesAnteriors.tutors_volen_rebre_correu = False a.foto = alumneDadesAnteriors.foto a.save() nivells.add(a.grup.curs.nivell) # # Baixes: # # Els alumnes de Saga no s'han de tenir en compte per fer les baixes AlumnesDeSaga = Alumne.objects.exclude(grup__curs__nivell__in=nivells) AlumnesDeSaga.update(estat_sincronitzacio='') # #Els alumnes que hagin quedat a PRC és que s'han donat de baixa: AlumnesDonatsDeBaixa = Alumne.objects.filter( estat_sincronitzacio__exact='PRC') AlumnesDonatsDeBaixa.update(data_baixa=date.today(), estat_sincronitzacio='DEL', motiu_bloqueig='Baixa') #Avisar als professors: Baixes #: enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesEsborrats = len(AlumnesDonatsDeBaixa) professorsNotificar = {} for alumneDonatDeBaixa in AlumnesDonatsDeBaixa: for professor in Professor.objects.filter( horari__impartir__controlassistencia__alumne=alumneDonatDeBaixa ).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneDonatDeBaixa) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u'{0} ({1})'.format(unicode(alumne), alumne.grup.descripcio_grup)) missatge = ALUMNES_DONATS_DE_BAIXA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge(remitent=user, text_missatge=missatge, tipus_de_missatge=tipus_de_missatge) msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN') info_nMissatgesEnviats += 1 #Avisar als professors: Canvi de grup #enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesCanviasDeGrup = len(AlumnesCanviatsDeGrup) professorsNotificar = {} for alumneCanviatDeGrup in AlumnesCanviatsDeGrup: qElTenenALHorari = Q( horari__impartir__controlassistencia__alumne=alumneCanviatDeGrup) qImparteixDocenciaAlNouGrup = Q(horari__grup=alumneCanviatDeGrup.grup) for professor in Professor.objects.filter( qElTenenALHorari | qImparteixDocenciaAlNouGrup).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneCanviatDeGrup) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u'{0} passa a grup {1}'.format( unicode(alumne), alumne.grup.descripcio_grup)) missatge = ALUMNES_CANVIATS_DE_GRUP tipus_de_missatge = tipusMissatge(missatge) msg = Missatge(remitent=user, text_missatge=missatge, tipus_de_missatge=tipus_de_missatge) msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN') info_nMissatgesEnviats += 1 #Avisar als professors: Altes #enviar un missatge a tots els professors que tenen aquell alumne. professorsNotificar = {} for alumneNou in AlumnesInsertats: qImparteixDocenciaAlNouGrup = Q(horari__grup=alumneNou.grup) for professor in Professor.objects.filter( qImparteixDocenciaAlNouGrup).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneNou) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u'{0} al grup {1}'.format( unicode(alumne), alumne.grup.descripcio_grup)) missatge = ALUMNES_DONATS_DALTA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge(remitent=user, text_missatge=missatge, tipus_de_missatge=tipus_de_missatge) msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN') info_nMissatgesEnviats += 1 #Treure'ls de les classes: les baixes ControlAssistencia.objects.filter( impartir__dia_impartir__gte=date.today(), alumne__in=AlumnesDonatsDeBaixa).delete() #Treure'ls de les classes: els canvis de grup #Todo: només si l'àmbit és grup. ambit_no_es_el_grup = Q( impartir__horari__assignatura__tipus_assignatura__ambit_on_prendre_alumnes__in =['C', 'N', 'I']) (ControlAssistencia.objects.filter(ambit_no_es_el_grup).filter( impartir__dia_impartir__gte=date.today()).filter( alumne__in=AlumnesCanviatsDeGrup).delete()) #Altes: posar-ho als controls d'assistència de les classes (?????????) # # FI # # Tornem a l'estat de sincronització en blanc, excepte els alumnes esborrats DEL i els alumnes entrats manualment MAN. Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \ .update( estat_sincronitzacio = '') errors.append(u'%d alumnes sense grup' % errors_nAlumnesSenseGrup) warnings = [] infos = [] infos.append(u'{0} alumnes llegits'.format(info_nAlumnesLlegits)) infos.append(u'{0} alumnes insertats'.format(info_nAlumnesInsertats)) infos.append(u'{0} alumnes esborrats'.format(info_nAlumnesEsborrats)) infos.append( u'{0} alumnes canviats de grup'.format(info_nAlumnesCanviasDeGrup)) infos.append(u'{0} alumnes en estat sincronització manual'.format( \ len(Alumne.objects.filter(estat_sincronitzacio__exact = 'MAN')))) infos.append(u'{0} missatges enviats'.format(info_nMissatgesEnviats)) missatge = IMPORTACIO_ESFERA_FINALITZADA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge(remitent=user, text_missatge=missatge, tipus_de_missatge=tipus_de_missatge) msg.afegeix_errors(errors) msg.afegeix_warnings(warnings) msg.afegeix_infos(infos) importancia = 'VI' if len(errors) > 0 else 'IN' grupDireccio = Group.objects.get(name='direcció') msg.envia_a_grup(grupDireccio, importancia=importancia) return {'errors': errors, 'warnings': warnings, 'infos': infos}
def sincronitza(f, user=None): msgs = comprovar_grups(f) if msgs["errors"]: return msgs errors = [] #Exclou els alumnes AMB esborrat i amb estat MAN (creats manualment) Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \ .update( estat_sincronitzacio = 'PRC') #,"00_IDENTIFICADOR DE L'ALUMNE/A","01_NOM","02_ADRE�A","03_CP","04_CENTRE PROCED�NCIA","05_CODI LOCALITAT","06_CORREU ELECTR�NIC","07_DATA NAIXEMENT","08_DOC. IDENTITAT","09_GRUPSCLASSE","10_NOM LOCALITAT","11_TEL�FONS","12_TUTOR(S)" reader = csv.DictReader(f) errors_nAlumnesSenseGrup = 0 info_nAlumnesLlegits = 0 info_nAlumnesInsertats = 0 info_nAlumnesEsborrats = 0 info_nAlumnesCanviasDeGrup = 0 info_nAlumnesModificats = 0 info_nMissatgesEnviats = 0 AlumnesCanviatsDeGrup = [] AlumnesInsertats = [] #,"00_IDENTIFICADOR DE L'ALUMNE/A","01_NOM","02_DATA NAIXEMENT", #"03_ADREÇA","04_CENTRE PROCEDÈNCIA","05_GRUPSCLASSE","06_CORREU ELECTRÒNIC","07_LOCALITAT", #"08_TELÈFON RESP. 1","09_TELÈFON RESP. 2","10_RESPONSABLE 2","11_RESPONSABLE 1" trobatGrupClasse = False trobatNom = False trobatDataNeixement = False trobatRalc = False f.seek(0) nivells = set() for row in reader: info_nAlumnesLlegits += 1 a = Alumne() a.ralc = '' a.telefons = '' #a.tutors = '' #a.correu_tutors = '' for columnName, value in row.iteritems(): columnName = unicode(columnName, 'iso-8859-1') #columnName = unicode( rawColumnName, 'iso-8859-1' ) uvalue = unicode(value, 'iso-8859-1') if columnName.endswith(u"_IDENTIFICADOR DE L'ALUMNE/A"): a.ralc = unicode(value, 'iso-8859-1') trobatRalc = True if columnName.endswith(u"_NOM"): a.nom = uvalue.split( ',')[1].lstrip().rstrip() #nomes fins a la coma a.cognoms = uvalue.split(',')[0] trobatNom = True if columnName.endswith(u"_GRUPSCLASSE"): try: unGrup = Grup2Aula.objects.get(grup_saga=uvalue, Grup2Aula__isnull=False) a.grup = unGrup.Grup2Aula except: return { 'errors': [ u"error carregant {0}".format(uvalue), ], 'warnings': [], 'infos': [] } trobatGrupClasse = True #if columnName.endswith( u"_CORREU ELECTRÒNIC") or columnName.find( u"_ADREÇA ELECTR. RESP.")>=0 : # a.correu_tutors += unicode(value,'iso-8859-1') + u', ' if columnName.endswith(u"_CORREU ELECTRÒNIC"): a.correu = unicode(value, 'iso-8859-1') if columnName.endswith(u"_DATA NAIXEMENT"): dia = time.strptime(unicode(value, 'iso-8859-1'), '%d/%m/%Y') a.data_neixement = time.strftime('%Y-%m-%d', dia) trobatDataNeixement = True if columnName.endswith(u"_CENTRE PROCEDÈNCIA"): a.centre_de_procedencia = unicode(value, 'iso-8859-1') if columnName.endswith(u"_LOCALITAT"): a.localitat = unicode(value, 'iso-8859-1') if columnName.endswith(u"MUNICIPI"): a.municipi = unicode(value, 'iso-8859-1') # if columnName.find( u"_TELÈFON RESP")>=0 or columnName.find( u"_MÒBIL RESP")>=0 or columnName.find( u"_ALTRES TELÈFONS")>=0 : # a.telefons += unicode(value,'iso-8859-1') + u', ' if columnName.endswith(u"_TELÈFON RESP. 1"): a.rp1_telefon = unicode(value, 'iso-8859-1') if columnName.endswith(u"_TELÈFON RESP. 2"): a.rp2_telefon = unicode(value, 'iso-8859-1') if columnName.endswith(u"_MÒBIL RESP. 1"): a.rp1_mobil = unicode(value, 'iso-8859-1') if columnName.endswith(u"_MÒBIL RESP. 2"): a.rp2_mobil = unicode(value, 'iso-8859-1') if columnName.endswith(u"_ADREÇA ELECTR. RESP. 1"): a.rp1_correu = unicode(value, 'iso-8859-1') if columnName.endswith(u"_ADREÇA ELECTR. RESP. 2"): a.rp2_correu = unicode(value, 'iso-8859-1') if columnName.endswith(u"_ALTRES TELÈFONS"): a.altres_telefons = unicode(value, 'iso-8859-1') # if columnName.find( u"_RESPONSABLE")>=0: # a.tutors = unicode(value,'iso-8859-1') + u', ' if columnName.endswith(u"_RESPONSABLE 1"): a.rp1_nom = unicode(value, 'iso-8859-1') if columnName.endswith(u"_RESPONSABLE 2"): a.rp2_nom = unicode(value, 'iso-8859-1') if columnName.endswith(u"_ADREÇA"): a.adreca = unicode(value, 'iso-8859-1') if not (trobatGrupClasse and trobatNom and trobatDataNeixement and trobatRalc): return { 'errors': [u'Falten camps al fitxer'], 'warnings': [], 'infos': [] } alumneDadesAnteriors = None try: q_mateix_ralc = Q( ralc=a.ralc) # & Q( grup__curs__nivell = a.grup.curs.nivell ) # Antic mètode de cassar alumnes: # # q_mateix_cognom = Q( # cognoms = a.cognoms ) # q_mateix_nom = Q( # nom = a.nom, # ) # q_mateix_neixement = Q( # data_neixement = a.data_neixement # ) # q_mateixa_altres = Q( # adreca = a.adreca, # telefons = a.telefons, # localitat = a.localitat, # centre_de_procedencia = a.centre_de_procedencia, # adreca__gte= u"" # ) # # condicio1 = q_mateix_nom & q_mateix_cognom & q_mateix_neixement # condicio2 = q_mateix_nom & q_mateix_cognom & q_mateixa_altres # condicio3 = q_mateix_nom & q_mateixa_altres & q_mateix_neixement # # # alumneDadesAnteriors = Alumne.objects.get( # condicio1 | condicio2 | condicio3 # ) alumneDadesAnteriors = Alumne.objects.get(q_mateix_ralc) except Alumne.DoesNotExist: pass if alumneDadesAnteriors is None: a.estat_sincronitzacio = 'S-I' a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False info_nAlumnesInsertats += 1 AlumnesInsertats.append(a) else: #TODO: si canvien dades importants avisar al tutor. a.pk = alumneDadesAnteriors.pk a.estat_sincronitzacio = 'S-U' info_nAlumnesModificats += 1 # En cas que l'alumne pertanyi a un dels grups parametritzat com a estàtic, # no se li canviarà de grup en les importacions de SAGA. grups_estatics, _ = ParametreSaga.objects.get_or_create( nom_parametre='grups estatics') es_de_grup_estatic = False for prefixe_grup in grups_estatics.valor_parametre.split(','): prefix = prefixe_grup.replace(' ', '') if prefix: es_de_grup_estatic = es_de_grup_estatic or alumneDadesAnteriors.grup.descripcio_grup.startswith( prefix) if a.grup.pk != alumneDadesAnteriors.grup.pk: if es_de_grup_estatic: #no canviar-li de grup a.grup = alumneDadesAnteriors.grup else: AlumnesCanviatsDeGrup.append(a) a.user_associat = alumneDadesAnteriors.user_associat #el recuperem, havia estat baixa: if alumneDadesAnteriors.data_baixa: info_nAlumnesInsertats += 1 a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False else: a.correu_relacio_familia_pare = alumneDadesAnteriors.correu_relacio_familia_pare a.correu_relacio_familia_mare = alumneDadesAnteriors.correu_relacio_familia_mare a.motiu_bloqueig = alumneDadesAnteriors.motiu_bloqueig a.relacio_familia_darrera_notificacio = alumneDadesAnteriors.relacio_familia_darrera_notificacio a.periodicitat_faltes = alumneDadesAnteriors.periodicitat_faltes a.periodicitat_incidencies = alumneDadesAnteriors.periodicitat_incidencies a.tutors_volen_rebre_correu = alumneDadesAnteriors.tutors_volen_rebre_correu = False a.save() nivells.add(a.grup.curs.nivell) # # Baixes: # # Els alumnes d'Esfer@ no s'han de tenir en compte per fer les baixes AlumnesDeEsfera = Alumne.objects.exclude(grup__curs__nivell__in=nivells) AlumnesDeEsfera.update(estat_sincronitzacio='') #Els alumnes que hagin quedat a PRC és que s'han donat de baixa: AlumnesDonatsDeBaixa = Alumne.objects.filter( estat_sincronitzacio__exact='PRC') AlumnesDonatsDeBaixa.update(data_baixa=date.today(), estat_sincronitzacio='DEL', motiu_bloqueig='Baixa') #Avisar als professors: Baixes #: enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesEsborrats = len(AlumnesDonatsDeBaixa) professorsNotificar = {} for alumneDonatDeBaixa in AlumnesDonatsDeBaixa: for professor in Professor.objects.filter( horari__impartir__controlassistencia__alumne=alumneDonatDeBaixa ).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneDonatDeBaixa) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u'{0} ({1})'.format(unicode(alumne), alumne.grup.descripcio_grup)) missatge = ALUMNES_DONATS_DE_BAIXA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge(remitent=user, text_missatge=missatge, tipus_de_missatge=tipus_de_missatge) msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN') info_nMissatgesEnviats += 1 #Avisar als professors: Canvi de grup #enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesCanviasDeGrup = len(AlumnesCanviatsDeGrup) professorsNotificar = {} for alumneCanviatDeGrup in AlumnesCanviatsDeGrup: qElTenenALHorari = Q( horari__impartir__controlassistencia__alumne=alumneCanviatDeGrup) qImparteixDocenciaAlNouGrup = Q(horari__grup=alumneCanviatDeGrup.grup) for professor in Professor.objects.filter( qElTenenALHorari | qImparteixDocenciaAlNouGrup).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneCanviatDeGrup) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u'{0} passa a grup {1}'.format( unicode(alumne), alumne.grup.descripcio_grup)) missatge = ALUMNES_CANVIATS_DE_GRUP tipus_de_missatge = tipusMissatge(missatge) msg = Missatge(remitent=user, text_missatge=missatge, tipus_de_missatge=tipus_de_missatge) msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN') info_nMissatgesEnviats += 1 #Avisar als professors: Altes #enviar un missatge a tots els professors que tenen aquell alumne. professorsNotificar = {} for alumneNou in AlumnesInsertats: qImparteixDocenciaAlNouGrup = Q(horari__grup=alumneNou.grup) for professor in Professor.objects.filter( qImparteixDocenciaAlNouGrup).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneNou) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u'{0} al grup {1}'.format( unicode(alumne), alumne.grup.descripcio_grup)) missatge = ALUMNES_DONATS_DALTA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge(remitent=user, text_missatge=missatge, tipus_de_missatge=tipus_de_missatge) msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN') info_nMissatgesEnviats += 1 #Treure'ls de les classes: les baixes ControlAssistencia.objects.filter( impartir__dia_impartir__gte=date.today(), alumne__in=AlumnesDonatsDeBaixa).delete() #Treure'ls de les classes: els canvis de grup #Todo: només si l'àmbit és grup. ambit_no_es_el_grup = Q( impartir__horari__assignatura__tipus_assignatura__ambit_on_prendre_alumnes__in =['C', 'N', 'I']) (ControlAssistencia.objects.filter(ambit_no_es_el_grup).filter( impartir__dia_impartir__gte=date.today()).filter( alumne__in=AlumnesCanviatsDeGrup).delete()) #Altes: posar-ho als controls d'assistència de les classes (?????????) # # FI # # Tornem a l'estat de sincronització en blanc, excepte els alumnes esborrats DEL i els alumnes entrats manualment MAN. Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \ .update( estat_sincronitzacio = '') errors.append(u'%d alumnes sense grup' % errors_nAlumnesSenseGrup) warnings = [] infos = [] infos.append(u'{0} alumnes llegits'.format(info_nAlumnesLlegits)) infos.append(u'{0} alumnes insertats'.format(info_nAlumnesInsertats)) infos.append(u'{0} alumnes esborrats'.format(info_nAlumnesEsborrats)) infos.append( u'{0} alumnes canviats de grup'.format(info_nAlumnesCanviasDeGrup)) infos.append(u'{0} alumnes en estat sincronització manual'.format( \ len(Alumne.objects.filter(estat_sincronitzacio__exact = 'MAN')))) infos.append(u'{0} missatges enviats'.format(info_nMissatgesEnviats)) missatge = IMPORTACIO_SAGA_FINALITZADA tipus_de_missatge = tipusMissatge(missatge) msg = Missatge(remitent=user, text_missatge=missatge, tipus_de_missatge=tipus_de_missatge) msg.afegeix_errors(errors) msg.afegeix_warnings(warnings) msg.afegeix_infos(infos) importancia = 'VI' if len(errors) > 0 else 'IN' grupDireccio = Group.objects.get(name='direcció') msg.envia_a_grup(grupDireccio, importancia=importancia) return {'errors': errors, 'warnings': warnings, 'infos': infos}
def sincronitza(f, user = None): msgs = comprovar_grups( f ) if msgs["errors"]: return msgs errors = [] #Exclou els alumnes AMB esborrat i amb estat MAN (creats manualment) Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \ .update( estat_sincronitzacio = 'PRC') #,"00_NOM","01_ADRE�A","02_CP","03_CENTRE PROCED�NCIA","04_CODI LOCALITAT","05_CORREU ELECTR�NIC","06_DATA NAIXEMENT","07_DOC. IDENTITAT","08_GRUPSCLASSE","09_NOM LOCALITAT","10_TEL�FONS","11_TUTOR(S)" reader = csv.DictReader(f) errors_nAlumnesSenseGrup=0 info_nAlumnesLlegits=0 info_nAlumnesInsertats=0 info_nAlumnesEsborrats=0 info_nAlumnesCanviasDeGrup=0 info_nAlumnesModificats=0 info_nMissatgesEnviats = 0 AlumnesCanviatsDeGrup = [] AlumnesInsertats = [] #,"00_NOM","01_DATA NAIXEMENT", #"02_ADREÇA","03_CENTRE PROCEDÈNCIA","04_GRUPSCLASSE","05_CORREU ELECTRÒNIC","06_LOCALITAT", #"07_TELÈFON RESP. 1","08_TELÈFON RESP. 2","09_RESPONSABLE 2","10_RESPONSABLE 1" trobatGrupClasse = False trobatNom = False trobatDataNeixement = False f.seek(0) for row in reader: info_nAlumnesLlegits+=1 a=Alumne() a.telefons = '' a.tutors = '' a.correu_tutors = '' for columnName, value in row.iteritems(): columnName = unicode(columnName,'iso-8859-1') #columnName = unicode( rawColumnName, 'iso-8859-1' ) uvalue = unicode(value,'iso-8859-1') if columnName.endswith( u"_NOM"): a.nom =uvalue.split(',')[1].lstrip().rstrip() #nomes fins a la coma a.cognoms = uvalue.split(',')[0] trobatNom = True if columnName.endswith( u"_GRUPSCLASSE"): try: unGrup = Grup2Aula.objects.get(grup_saga = uvalue, Grup2Aula__isnull = False) a.grup = unGrup.Grup2Aula except: return { 'errors': [ u"error carregant {0}".format( uvalue ), ], 'warnings': [], 'infos': [] } trobatGrupClasse = True if columnName.endswith( u"_CORREU ELECTRÒNIC") or columnName.find( u"_ADREÇA ELECTR. RESP.")>=0 : a.correu_tutors += unicode(value,'iso-8859-1') + u', ' if columnName.endswith( u"_DATA NAIXEMENT"): dia=time.strptime( unicode(value,'iso-8859-1'),'%d/%m/%Y') a.data_neixement = time.strftime('%Y-%m-%d', dia) trobatDataNeixement = True if columnName.endswith( u"_CENTRE PROCEDÈNCIA"): a.centre_de_procedencia = unicode(value,'iso-8859-1') if columnName.endswith( u"_LOCALITAT"): a.localitat = unicode(value,'iso-8859-1') if columnName.find( u"_TELÈFON RESP")>=0 or columnName.find( u"_MÒBIL RESP")>=0 or columnName.find( u"_ALTRES TELÈFONS")>=0 : a.telefons += unicode(value,'iso-8859-1') + u', ' if columnName.find( u"_RESPONSABLE")>=0: a.tutors = unicode(value,'iso-8859-1') + u', ' if columnName.endswith( u"_ADREÇA" ): a.adreca = unicode(value,'iso-8859-1') if not (trobatGrupClasse and trobatNom and trobatDataNeixement): return { 'errors': [ u'Falten camps al fitxer' ], 'warnings': [], 'infos': [] } alumneDadesAnteriors = None try: q_mateix_cognom = Q( cognoms = a.cognoms ) q_mateix_nom = Q( nom = a.nom, ) q_mateix_neixement = Q( data_neixement = a.data_neixement ) q_mateixa_altres = Q( adreca = a.adreca, telefons = a.telefons, localitat = a.localitat, centre_de_procedencia = a.centre_de_procedencia, adreca__gte= u"" ) condicio1 = q_mateix_nom & q_mateix_cognom & q_mateix_neixement condicio2 = q_mateix_nom & q_mateix_cognom & q_mateixa_altres condicio3 = q_mateix_nom & q_mateixa_altres & q_mateix_neixement alumneDadesAnteriors = Alumne.objects.get( condicio1 | condicio2 | condicio3 ) except Alumne.DoesNotExist: pass if alumneDadesAnteriors is None: a.estat_sincronitzacio = 'S-I' a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False info_nAlumnesInsertats+=1 AlumnesInsertats.append(a) else: #TODO: si canvien dades importants avisar al tutor. a.pk = alumneDadesAnteriors.pk a.estat_sincronitzacio = 'S-U' info_nAlumnesModificats+=1 # En cas que l'alumne pertanyi a un dels grups parametritzat com a estàtic, # no se li canviarà de grup en les importacions de SAGA. grups_estatics, _ = ParametreSaga.objects.get_or_create( nom_parametre = 'grups estatics' ) es_de_grup_estatic = False for prefixe_grup in grups_estatics.valor_parametre.split(','): prefix = prefixe_grup.replace(' ','') if prefix: es_de_grup_estatic = es_de_grup_estatic or alumneDadesAnteriors.grup.descripcio_grup.startswith( prefix ) if a.grup.pk != alumneDadesAnteriors.grup.pk: if es_de_grup_estatic: #no canviar-li de grup a.grup = alumneDadesAnteriors.grup else: AlumnesCanviatsDeGrup.append(a) a.user_associat = alumneDadesAnteriors.user_associat #el recuperem, havia estat baixa: if alumneDadesAnteriors.data_baixa: info_nAlumnesInsertats+=1 a.data_alta = date.today() a.motiu_bloqueig = u'No sol·licitat' a.tutors_volen_rebre_correu = False else: a.correu_relacio_familia_pare = alumneDadesAnteriors.correu_relacio_familia_pare a.correu_relacio_familia_mare = alumneDadesAnteriors.correu_relacio_familia_mare a.motiu_bloqueig = alumneDadesAnteriors.motiu_bloqueig a.relacio_familia_darrera_notificacio = alumneDadesAnteriors.relacio_familia_darrera_notificacio a.periodicitat_faltes = alumneDadesAnteriors.periodicitat_faltes a.periodicitat_incidencies = alumneDadesAnteriors.periodicitat_incidencies a.save() # # Baixes: # #Els alumnes que hagin quedat a PRC és que s'han donat de baixa: AlumnesDonatsDeBaixa = Alumne.objects.filter( estat_sincronitzacio__exact = 'PRC' ) AlumnesDonatsDeBaixa.update( data_baixa = date.today(), estat_sincronitzacio = 'DEL' , motiu_bloqueig = 'Baixa' ) #Avisar als professors: Baixes #: enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesEsborrats = len( AlumnesDonatsDeBaixa ) professorsNotificar = {} for alumneDonatDeBaixa in AlumnesDonatsDeBaixa: for professor in Professor.objects.filter( horari__impartir__controlassistencia__alumne = alumneDonatDeBaixa ).distinct(): professorsNotificar.setdefault( professor.pk, [] ).append( alumneDonatDeBaixa ) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append( u'{0} ({1})'.format(unicode( alumne), alumne.grup.descripcio_grup ) ) msg = Missatge( remitent = user, text_missatge = u'''El següents alumnes han estat donats de baixa.''' ) msg.afegeix_infos( llista ) msg.envia_a_usuari( Professor.objects.get( pk = professorPK ) , 'IN') info_nMissatgesEnviats += 1 #Avisar als professors: Canvi de grup #enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesCanviasDeGrup = len( AlumnesCanviatsDeGrup ) professorsNotificar = {} for alumneCanviatDeGrup in AlumnesCanviatsDeGrup: qElTenenALHorari = Q( horari__impartir__controlassistencia__alumne = alumneCanviatDeGrup ) qImparteixDocenciaAlNouGrup = Q( horari__grup = alumneCanviatDeGrup.grup ) for professor in Professor.objects.filter( qElTenenALHorari | qImparteixDocenciaAlNouGrup ).distinct(): professorsNotificar.setdefault( professor.pk, [] ).append( alumneCanviatDeGrup ) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append( u'{0} passa a grup {1}'.format(unicode( alumne), alumne.grup.descripcio_grup ) ) msg = Missatge( remitent = user, text_missatge = u'''El següents alumnes han estat canviats de grup.''' ) msg.afegeix_infos( llista ) msg.envia_a_usuari( Professor.objects.get( pk = professorPK ) , 'IN') info_nMissatgesEnviats += 1 #Avisar als professors: Altes #enviar un missatge a tots els professors que tenen aquell alumne. professorsNotificar = {} for alumneNou in AlumnesInsertats: qImparteixDocenciaAlNouGrup = Q( horari__grup = alumneNou.grup ) for professor in Professor.objects.filter( qImparteixDocenciaAlNouGrup ).distinct(): professorsNotificar.setdefault( professor.pk, [] ).append( alumneNou ) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append( u'{0} al grup {1}'.format(unicode( alumne), alumne.grup.descripcio_grup ) ) msg = Missatge( remitent = user, text_missatge = u'''El següents alumnes han estat donats d'alta.''' ) msg.afegeix_infos( llista ) msg.envia_a_usuari( Professor.objects.get( pk = professorPK ) , 'IN') info_nMissatgesEnviats += 1 #Treure'ls de les classes: les baixes ControlAssistencia.objects.filter( impartir__dia_impartir__gte = date.today(), alumne__in = AlumnesDonatsDeBaixa ).delete() #Treure'ls de les classes: els canvis de grup ControlAssistencia.objects.filter( impartir__dia_impartir__gte = date.today(), alumne__in = AlumnesCanviatsDeGrup ).delete() #Altes: posar-ho als controls d'assistència de les classes (?????????) # # FI # # Tornem a l'estat de sincronització en blanc, excepte els alumnes esborrats DEL i els alumnes entrats manualment MAN. Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \ .update( estat_sincronitzacio = '') errors.append( u'%d alumnes sense grup'%errors_nAlumnesSenseGrup ) warnings= [ ] infos= [ ] infos.append(u'{0} alumnes llegits'.format(info_nAlumnesLlegits) ) infos.append(u'{0} alumnes insertats'.format(info_nAlumnesInsertats) ) infos.append(u'{0} alumnes esborrats'.format(info_nAlumnesEsborrats ) ) infos.append(u'{0} alumnes canviats de grup'.format(info_nAlumnesCanviasDeGrup ) ) infos.append(u'{0} alumnes en estat sincronització manual'.format( \ len(Alumne.objects.filter(estat_sincronitzacio__exact = 'MAN')))) infos.append(u'{0} missatges enviats'.format(info_nMissatgesEnviats ) ) msg = Missatge( remitent= user, text_missatge = u"Importació Saga finalitzada.") msg.afegeix_errors( errors.sort() ) msg.afegeix_warnings(warnings) msg.afegeix_infos(infos) importancia = 'VI' if len( errors )> 0 else 'IN' grupDireccio = Group.objects.get( name = 'direcció' ) msg.envia_a_grup( grupDireccio , importancia=importancia) return { 'errors': errors, 'warnings': warnings, 'infos': infos }
def sincronitza(f, user=None): msgs = comprovar_grups(f) if msgs["errors"]: return msgs errors = [] Alumne.objects.exclude(estat_sincronitzacio__exact="DEL").update(estat_sincronitzacio="PRC") # ,"00_NOM","01_ADRE�A","02_CP","03_CENTRE PROCED�NCIA","04_CODI LOCALITAT","05_CORREU ELECTR�NIC","06_DATA NAIXEMENT","07_DOC. IDENTITAT","08_GRUPSCLASSE","09_NOM LOCALITAT","10_TEL�FONS","11_TUTOR(S)" reader = csv.DictReader(f) errors_nAlumnesSenseGrup = 0 info_nAlumnesLlegits = 0 info_nAlumnesInsertats = 0 info_nAlumnesEsborrats = 0 info_nAlumnesCanviasDeGrup = 0 info_nAlumnesModificats = 0 info_nMissatgesEnviats = 0 AlumnesCanviatsDeGrup = [] AlumnesInsertats = [] # ,"00_NOM","01_DATA NAIXEMENT", # "02_ADREÇA","03_CENTRE PROCEDÈNCIA","04_GRUPSCLASSE","05_CORREU ELECTRÒNIC","06_LOCALITAT", # "07_TELÈFON RESP. 1","08_TELÈFON RESP. 2","09_RESPONSABLE 2","10_RESPONSABLE 1" trobatGrupClasse = False trobatNom = False trobatDataNeixement = False f.seek(0) for row in reader: info_nAlumnesLlegits += 1 a = Alumne() a.telefons = "" a.tutors = "" a.correu_tutors = "" for columnName, value in row.iteritems(): columnName = unicode(columnName, "iso-8859-1") # columnName = unicode( rawColumnName, 'iso-8859-1' ) uvalue = unicode(value, "iso-8859-1") if columnName.endswith(u"_NOM"): a.nom = uvalue.split(",")[1].lstrip().rstrip() # nomes fins a la coma a.cognoms = uvalue.split(",")[0] trobatNom = True if columnName.endswith(u"_GRUPSCLASSE"): try: unGrup = Grup2Aula.objects.get(grup_saga=uvalue, Grup2Aula__isnull=False) a.grup = unGrup.Grup2Aula except: return {"errors": [u"error carregant {0}".format(uvalue)], "warnings": [], "infos": []} trobatGrupClasse = True if columnName.endswith(u"_CORREU ELECTRÒNIC") or columnName.find(u"_ADREÇA ELECTR. RESP.") >= 0: a.correu_tutors += unicode(value, "iso-8859-1") + u", " if columnName.endswith(u"_DATA NAIXEMENT"): dia = time.strptime(unicode(value, "iso-8859-1"), "%d/%m/%Y") a.data_neixement = time.strftime("%Y-%m-%d", dia) trobatDataNeixement = True if columnName.endswith(u"_CENTRE PROCEDÈNCIA"): a.centre_de_procedencia = unicode(value, "iso-8859-1") if columnName.endswith(u"_LOCALITAT"): a.localitat = unicode(value, "iso-8859-1") if ( columnName.find(u"_TELÈFON RESP") >= 0 or columnName.find(u"_MÒBIL RESP") >= 0 or columnName.find(u"_ALTRES TELÈFONS") >= 0 ): a.telefons += unicode(value, "iso-8859-1") + u", " if columnName.find(u"_RESPONSABLE") >= 0: a.tutors = unicode(value, "iso-8859-1") + u", " if columnName.endswith(u"_ADREÇA"): a.adreca = unicode(value, "iso-8859-1") if not (trobatGrupClasse and trobatNom and trobatDataNeixement): return {"errors": [u"Falten camps al fitxer"], "warnings": [], "infos": []} alumneDadesAnteriors = None try: q_mateix_cognom = Q(cognoms=a.cognoms) q_mateix_nom = Q(nom=a.nom) q_mateix_neixement = Q(data_neixement=a.data_neixement) q_mateixa_altres = Q( adreca=a.adreca, telefons=a.telefons, localitat=a.localitat, centre_de_procedencia=a.centre_de_procedencia, adreca__gte=u"", ) condicio1 = q_mateix_nom & q_mateix_cognom & q_mateix_neixement condicio2 = q_mateix_nom & q_mateix_cognom & q_mateixa_altres condicio3 = q_mateix_nom & q_mateixa_altres & q_mateix_neixement alumneDadesAnteriors = Alumne.objects.get(condicio1 | condicio2 | condicio3) except Alumne.DoesNotExist: pass if alumneDadesAnteriors is None: a.estat_sincronitzacio = "S-I" a.data_alta = date.today() a.motiu_bloqueig = u"No sol·licitat" a.tutors_volen_rebre_correu = False info_nAlumnesInsertats += 1 AlumnesInsertats.append(a) else: # TODO: si canvien dades importants avisar al tutor. a.pk = alumneDadesAnteriors.pk a.estat_sincronitzacio = "S-U" info_nAlumnesModificats += 1 if a.grup.pk != alumneDadesAnteriors.grup.pk: AlumnesCanviatsDeGrup.append(a) a.user_associat = alumneDadesAnteriors.user_associat # el recuperem, havia estat baixa: if alumneDadesAnteriors.data_baixa: info_nAlumnesInsertats += 1 a.data_alta = date.today() a.motiu_bloqueig = u"No sol·licitat" a.tutors_volen_rebre_correu = False else: a.correu_relacio_familia_pare = alumneDadesAnteriors.correu_relacio_familia_pare a.correu_relacio_familia_mare = alumneDadesAnteriors.correu_relacio_familia_mare a.motiu_bloqueig = alumneDadesAnteriors.motiu_bloqueig a.relacio_familia_darrera_notificacio = alumneDadesAnteriors.relacio_familia_darrera_notificacio a.periodicitat_faltes = alumneDadesAnteriors.periodicitat_faltes a.periodicitat_incidencies = alumneDadesAnteriors.periodicitat_incidencies a.save() # # Baixes: # # Els alumnes que hagin quedat a PRC és que s'han donat de baixa: AlumnesDonatsDeBaixa = Alumne.objects.filter(estat_sincronitzacio__exact="PRC") AlumnesDonatsDeBaixa.update(data_baixa=date.today(), estat_sincronitzacio="DEL", motiu_bloqueig="Baixa") # Avisar als professors: Baixes #: enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesEsborrats = len(AlumnesDonatsDeBaixa) professorsNotificar = {} for alumneDonatDeBaixa in AlumnesDonatsDeBaixa: for professor in Professor.objects.filter( horari__impartir__controlassistencia__alumne=alumneDonatDeBaixa ).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneDonatDeBaixa) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u"{0} ({1})".format(unicode(alumne), alumne.grup.descripcio_grup)) msg = Missatge(remitent=user, text_missatge=u"""El següents alumnes han estat donats de baixa.""") msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), "IN") info_nMissatgesEnviats += 1 # Avisar als professors: Canvi de grup # enviar un missatge a tots els professors que tenen aquell alumne. info_nAlumnesCanviasDeGrup = len(AlumnesCanviatsDeGrup) professorsNotificar = {} for alumneCanviatDeGrup in AlumnesCanviatsDeGrup: qElTenenALHorari = Q(horari__impartir__controlassistencia__alumne=alumneCanviatDeGrup) qImparteixDocenciaAlNouGrup = Q(horari__grup=alumneCanviatDeGrup.grup) for professor in Professor.objects.filter(qElTenenALHorari | qImparteixDocenciaAlNouGrup).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneCanviatDeGrup) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u"{0} passa a grup {1}".format(unicode(alumne), alumne.grup.descripcio_grup)) msg = Missatge(remitent=user, text_missatge=u"""El següents alumnes han estat canviats de grup.""") msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), "IN") info_nMissatgesEnviats += 1 # Avisar als professors: Altes # enviar un missatge a tots els professors que tenen aquell alumne. professorsNotificar = {} for alumneNou in AlumnesInsertats: qImparteixDocenciaAlNouGrup = Q(horari__grup=alumneNou.grup) for professor in Professor.objects.filter(qImparteixDocenciaAlNouGrup).distinct(): professorsNotificar.setdefault(professor.pk, []).append(alumneNou) for professorPK, alumnes in professorsNotificar.items(): llista = [] for alumne in alumnes: llista.append(u"{0} al grup {1}".format(unicode(alumne), alumne.grup.descripcio_grup)) msg = Missatge(remitent=user, text_missatge=u"""El següents alumnes han estat donats d'alta.""") msg.afegeix_infos(llista) msg.envia_a_usuari(Professor.objects.get(pk=professorPK), "IN") info_nMissatgesEnviats += 1 # Treure'ls de les classes: les baixes ControlAssistencia.objects.filter( impartir__dia_impartir__gte=date.today(), alumne__in=AlumnesDonatsDeBaixa ).delete() # Treure'ls de les classes: els canvis de grup ControlAssistencia.objects.filter( impartir__dia_impartir__gte=date.today(), alumne__in=AlumnesCanviatsDeGrup ).delete() # Altes: posar-ho als controls d'assistència de les classes (?????????) # # FI # Alumne.objects.exclude(estat_sincronitzacio__exact="DEL").update(estat_sincronitzacio="") errors.append(u"%d alumnes sense grup" % errors_nAlumnesSenseGrup) warnings = [] infos = [] infos.append(u"{0} alumnes llegits".format(info_nAlumnesLlegits)) infos.append(u"{0} alumnes insertats".format(info_nAlumnesInsertats)) infos.append(u"{0} alumnes esborrats".format(info_nAlumnesEsborrats)) infos.append(u"{0} alumnes canviats de grup".format(info_nAlumnesCanviasDeGrup)) infos.append(u"{0} missatges enviats".format(info_nMissatgesEnviats)) msg = Missatge(remitent=user, text_missatge=u"Importació Saga finalitzada.") msg.afegeix_errors(errors.sort()) msg.afegeix_warnings(warnings) msg.afegeix_infos(infos) importancia = "VI" if len(errors) > 0 else "IN" grupDireccio = Group.objects.get(name="direcció") msg.envia_a_grup(grupDireccio, importancia=importancia) return {"errors": errors, "warnings": warnings, "infos": infos}