示例#1
0
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}
示例#5
0
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()
示例#6
0
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 }
示例#7
0
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}