Exemplo n.º 1
0
    def handle(self, *args, **options):

        try:
            self.stdout.write(u"Iniciant procés notificacions" )
            notifica()
            self.stdout.write(u"Fi procés notificacions" )
        except Exception, e:
            self.stdout.write(u"Error al procés notificacions: {0}".format( unicode(e) ) )
            errors = [unicode(e)]            
         
            #Deixar missatge a la base de dades (utilitzar self.user )
            from aula.apps.missatgeria.models import Missatge
            from django.contrib.auth.models import User, Group
     
            usuari_notificacions, new = User.objects.get_or_create( username = '******')
            if new:
                usuari_notificacions.is_active = False
                usuari_notificacions.first_name = u"Usuari Tasques Programades"
                usuari_notificacions.save()
            missatge = ERROR_NOTIFICACIO_FAMILIES
            tipus_de_missatge = tipusMissatge(missatge)
            msg = Missatge(
                        remitent= usuari_notificacions, 
                        text_missatge = missatge,
                        tipus_de_missatge = tipus_de_missatge)
            importancia = 'VI' 
             
            administradors, _ = Group.objects.get_or_create( name = 'administradors' )
             
            msg.envia_a_grup( administradors , importancia=importancia)
            msg.afegeix_errors( errors )
            
            
Exemplo n.º 2
0
    def handle(self, *args, **options):

        try:
            self.stdout.write(u"Iniciant procés notificacions")
            notifica()
            self.stdout.write(u"Fi procés notificacions")
        except Exception as e:
            self.stdout.write(u"Error al procés notificacions: {0}".format(
                unicode(e)))
            errors = [unicode(e)]

            #Deixar missatge a la base de dades (utilitzar self.user )
            from aula.apps.missatgeria.models import Missatge
            from django.contrib.auth.models import User, Group

            usuari_notificacions, new = User.objects.get_or_create(
                username='******')
            if new:
                usuari_notificacions.is_active = False
                usuari_notificacions.first_name = u"Usuari Tasques Programades"
                usuari_notificacions.save()
            missatge = ERROR_NOTIFICACIO_FAMILIES
            tipus_de_missatge = tipusMissatge(missatge)
            msg = Missatge(remitent=usuari_notificacions,
                           text_missatge=missatge,
                           tipus_de_missatge=tipus_de_missatge)
            importancia = 'VI'

            administradors, _ = Group.objects.get_or_create(
                name='administradors')

            msg.envia_a_grup(administradors, importancia=importancia)
            msg.afegeix_errors(errors)
Exemplo n.º 3
0
    def run(self):        
        from aula.apps.missatgeria.missatges_a_usuaris import FI_INITDB, ERROR_INITDB, tipusMissatge
        from aula.apps.missatgeria.models import Missatge

        warnings=[]
        infos=[]

        usuaris_actius=disableLogins(self.user)
        # Incialitza tota la base de dades
        errors=initComplet()
        enableLogins(usuaris_actius)

        if not bool(errors):
            infos.append(u'Inicialització finalitzada')
            missatge = FI_INITDB
        else:
            infos.append(u'Errors a la inicialització')
            missatge = ERROR_INITDB

        #Deixar missatge a la base de dades (utilitzar self.user )
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge( 
                    remitent= self.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'
        msg.envia_a_usuari(self.user, importancia=importancia)
        
        #Tanca les connexions del thread amb la base de dades
        closeDB()
Exemplo n.º 4
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')

    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 }
    infos.append(u' ')
    infos.append(u'%d línies llegides' % (nLiniesLlegides, ))
    infos.append(u'%d horaris creats o modificats' % (nHorarisModificats))
    infos.append(u'%d aules creades' % (nAulesCreades))
    infos.append(u'%d assignatures Creades' % (nAssignaturesCreades))
    infos.append(u'Recorda reprogramar classes segons el nou horari')

    # invocar refer 'imparticions'
    from aula.apps.missatgeria.models import Missatge
    missatge = RECORDA_REPROGRAMAR_CLASSES
    tipus_de_missatge = tipusMissatge(missatge)
    msg = Missatge(remitent=usuari,
                   text_missatge=RECORDA_REPROGRAMAR_CLASSES,
                   enllac="/presencia/regeneraImpartir",
                   tipus_de_missatge=tipus_de_missatge)
    msg.afegeix_errors(errors)
    msg.afegeix_warnings(warnings)
    msg.afegeix_infos(infos)
    msg.envia_a_usuari(usuari)

    return {'errors': errors.sort(), 'warnings': warnings, 'infos': infos}


def creaNivellCursGrupDesDeKronowin(file, dia_inici_curs, dia_fi_curs):
    dialect = csv.Sniffer().sniff(file.readline())
    file.seek(0)
    file.readline()
    file.seek(0)
    fieldnames = ('assignatura', 'professor', 'grup', 'mati_tarda', 'nivell',
                  'curs', 'lletra', 'aula', 'unk2', 'dia', 'franja', 'unk3')
    reader = csv.DictReader(file, fieldnames=fieldnames, dialect=dialect)
Exemplo n.º 6
0
    def run(self):
        #es tracta de renovar la taula 'impartir' classes. Es fa per grups i dies:

        tools.lowpriority()

        errors = []
        warnings = []
        infos = []

        nHorarisInsertats = 0
        #estat_pendent, created = EstatControlAssistencia.objects.get_or_create( codi_estat = u'-', defaults={ u'nom_estat' : u'-----' } )
        try:

            import aula.apps.horaris.models as horaris

            #busco primer i darrer dia de classe i primera franja horària:
            from django.db.models import Min, Max
            dates = Curs.objects.aggregate(Min('data_inici_curs'),
                                           Max('data_fi_curs'))
            dia_inici_curs = dates['data_inici_curs__min']
            data_fi_curs = dates['data_fi_curs__max']
            if not self.franja_inici:
                self.franja_inici = FranjaHoraria.objects.all()[0]
            import datetime as t

            #calculo rang de dates a refer
            self.data_inici = dia_inici_curs if (
                not self.data_inici
                or dia_inici_curs > self.data_inici) else self.data_inici
            total_dies = (data_fi_curs - self.data_inici).days

            #calculo tots els dies a refer
            delta = t.timedelta(days=+1)
            totsElsDies = []
            dia = self.data_inici
            while dia <= data_fi_curs:
                totsElsDies.append(dia)
                dia += delta

            #per tots els dies:
            for dia in totsElsDies:

                #print 'processant dia: ' + unicode( dia ) #debug

                #estatus de l'actualització
                dies_fets = (dia - self.data_inici).days
                tpc = float(dies_fets) / float(
                    total_dies) if total_dies else 1.0
                self.str_status = u'Processant dia %s (%dtpc) %d dies de %d ' % (
                    unicode(dia), int(tpc * 100), dies_fets, total_dies)

                #print self.str_status

                #esborrar els impartir d'aquell dia (d'horaris donats de baixa)
                horari_donat_de_baixa = Q(horari__es_actiu=False)
                mateix_dia = Q(dia_impartir=dia)
                condicio_esborrat = horari_donat_de_baixa & mateix_dia
                if dia == self.data_inici:
                    franja_anterior = Q(horari__hora__hora_inici__gte=self.
                                        franja_inici.hora_inici)
                    condicio_esborrat = condicio_esborrat & franja_anterior
                Impartir.objects.filter(condicio_esborrat).delete()

                #per tots els horaris d'aquell dia: crear impartir
                horari_actiu = Q(es_actiu=True)
                horari_del_dia_de_la_setmana = Q(
                    dia_de_la_setmana__n_dia_ca=dia.weekday())
                for horari in Horari.objects.filter(
                        horari_actiu & horari_del_dia_de_la_setmana):
                    fora_de_rang = (dia == self.data_inici) and (
                        horari.hora.hora_inici < self.franja_inici.hora_inici)
                    curs = horari.grup.curs if horari.grup else None
                    dia_festa = esFestiu(curs=curs, dia=dia, hora=horari.hora)
                    if not fora_de_rang:
                        if not dia_festa:
                            impartir_modificat, created = Impartir.objects.get_or_create(
                                dia_impartir=dia, horari=horari)
                            if created:
                                nHorarisInsertats += 1

                            if not created:
                                aula_horari = horari.aula.pk if horari.aula else -1
                                aula_impartir = impartir_modificat.reserva.aula.pk if impartir_modificat.reserva else -1
                                canvi_aula = (aula_horari != aula_impartir)
                                if (canvi_aula and impartir_modificat.reserva
                                        and not impartir_modificat.reserva.
                                        es_reserva_manual):
                                    fake_l4_credentials = (None, True)
                                    impartir_modificat.reserva.credentials = fake_l4_credentials
                                    impartir_modificat.reserva.delete()
                                    impartir_modificat.reserva = None
                                    impartir_modificat.reserva_id = None
                                    impartir_modificat.save()

                        else:
                            Impartir.objects.filter(dia_impartir=dia,
                                                    horari=horari).delete()
                    else:
                        pass
                        #print 'fora de rang:' + unicode( horari )  #debug

        except Exception as e:
            errors.append(traceback.format_exc())
            #errors.append(unicode(e))
            self.str_status = unicode(e)

        self.str_status = u'Finalitzat' + unicode(errors)

        infos.append(u'Regeneració finalitzada')
        infos.append(u'%d horaris insertats' % nHorarisInsertats)

        #Deixar missatge a la base de dades (utilitzar self.user )
        from aula.apps.missatgeria.models import Missatge

        msg = Missatge(remitent=self.user,
                       text_missatge="Reprogramació de classes finalitzada.")
        msg.afegeix_errors(errors)
        msg.afegeix_warnings(warnings)
        msg.afegeix_infos(infos)
        importancia = 'VI' if len(errors) > 0 else 'IN'
        msg.envia_a_usuari(self.user, importancia=importancia)
Exemplo n.º 7
0
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}
Exemplo n.º 8
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_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}
Exemplo n.º 9
0
	infos.append( u'Importació finalitzada' + ambErrors + ambAvisos  )
	infos.append( u' ' )
	infos.append( u'%d línies llegides' % (nLiniesLlegides, ) )
	infos.append( u'%d horaris creats o modificats' % (nHorarisModificats) )
	infos.append( u'%d assignatures Creades' % (nAssignaturesCreades) )
	infos.append( u'Recorda reprogramar classes segons el nou horari' )


	#invocar refer 'imparticions'
	from aula.apps.missatgeria.models import Missatge
	
	msg = Missatge( 
				remitent= usuari, 
				text_missatge = "Actualització d'horaris realitzada, recorda reprogramar les classes.",
				enllac = "/presencia/regeneraImpartir" )	
	msg.afegeix_errors( errors.sort() )
	msg.afegeix_warnings(warnings)
	msg.afegeix_infos(infos)	
	msg.envia_a_usuari(usuari)

	return { 'errors': errors.sort(), 'warnings':  warnings, 'infos':  infos }


def creaNivellCursGrupDesDeKronowin(file, dia_inici_curs, dia_fi_curs):

	
	dialect = csv.Sniffer().sniff(file.readline())
	file.seek(0)
	file.readline()
	file.seek(0)
	fieldnames=( 'assignatura', 'professor', 'grup', 'mati_tarda', 'nivell', 'curs', 'lletra', 'aula', 'unk2', 'dia', 'franja', 'unk3' )
Exemplo n.º 10
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 }
Exemplo n.º 11
0
    infos.append(u'Importació finalitzada' + ambErrors + ambAvisos)
    infos.append(u' ')
    infos.append(u'%d línies llegides' % (nLiniesLlegides, ))
    infos.append(u'%d horaris creats o modificats' % (nHorarisModificats))
    infos.append(u'%d assignatures Creades' % (nAssignaturesCreades))
    infos.append(u'Recorda reprogramar classes segons el nou horari')

    #invocar refer 'imparticions'
    from aula.apps.missatgeria.models import Missatge

    msg = Missatge(
        remitent=usuari,
        text_missatge=
        "Actualització d'horaris realitzada, recorda reprogramar les classes.",
        enllac="/presencia/regeneraImpartir")
    msg.afegeix_errors(errors.sort())
    msg.afegeix_warnings(warnings)
    msg.afegeix_infos(infos)
    msg.envia_a_usuari(usuari)

    return {'errors': errors.sort(), 'warnings': warnings, 'infos': infos}


def creaNivellCursGrupDesDeKronowin(file, dia_inici_curs, dia_fi_curs):

    dialect = csv.Sniffer().sniff(file.readline())
    file.seek(0)
    file.readline()
    file.seek(0)
    fieldnames = ('assignatura', 'professor', 'grup', 'mati_tarda', 'nivell',
                  'curs', 'lletra', 'aula', 'unk2', 'dia', 'franja', 'unk3')
Exemplo n.º 12
0
def sincronitza(xml, usuari):
    '''
    Importa dades del fitxer xml d'Untis.
    
    retorna missatges: errors, warnings, informatius
    '''

    _, _ = Group.objects.get_or_create(name=u'direcció')
    grupProfessors, _ = Group.objects.get_or_create(name='professors')
    grupProfessionals, _ = Group.objects.get_or_create(name='professional')

    errors = []
    warnings = []
    infos = []

    try:
        dades = xmltodict.parse(xml)
    except:
        errors.append('Fitxer incorrecte')
        return {'errors': errors, 'warnings': warnings, 'infos': infos}

    if not ('document' in dades) or not dades['document']:
        errors.append('Fitxer incorrecte')
        return {'errors': errors, 'warnings': warnings, 'infos': infos}

    nLiniesLlegides = 0
    nHorarisModificats = 0
    nAulesCreades = 0
    nAssignaturesCreades = 0

    #  Només en desenvolupament
    #  Utilitza el paràmetre que indica si es treballa senseGrups
    #  Si 'True' vol dir que es crean grups addicionals sense lletra, només és necessari si
    #  a principi de curs encara no s'han definit els grups al Saga i Esfera.
    senseGrups, _ = ParametreKronowin.objects.get_or_create(
        nom_parametre='senseGrups', defaults={
            'valor_parametre': 'False',
        })
    if senseGrups.valor_parametre == 'True': senseGrups = True
    else: senseGrups = False

    # Dates generals d'inici i final de curs
    inicurs = None
    ficurs = None
    if (('general' in dades['document']) and (dades['document']['general'])
            and ('schoolyearbegindate' in dades['document']['general'])
            and ('schoolyearenddate' in dades['document']['general'])):
        inicurs = dades['document']['general']['schoolyearbegindate']
        if inicurs:
            inicurs = datetime.datetime.strptime(inicurs, '%Y%m%d').date()
        ficurs = dades['document']['general']['schoolyearenddate']
        if ficurs:
            ficurs = datetime.datetime.strptime(ficurs, '%Y%m%d').date()

    # Crea els tipus i àmbits si és necessari
    tipus, nou = TipusDAssignatura.objects.get_or_create(
        tipus_assignatura='Agrupament')
    if nou:
        tipus.ambit_on_prendre_alumnes = 'A'
    tipus.save()
    tipus, nou = TipusDAssignatura.objects.get_or_create(
        tipus_assignatura='Agrupament amb nivells')
    if nou:
        tipus.ambit_on_prendre_alumnes = 'AN'
    tipus.save()
    tipus, nou = TipusDAssignatura.objects.get_or_create(
        tipus_assignatura='Regular')
    if nou:
        tipus.ambit_on_prendre_alumnes = 'G'
    tipus.save()
    tipus, nou = TipusDAssignatura.objects.get_or_create(
        tipus_assignatura='Unitat Formativa')
    if nou:
        tipus.ambit_on_prendre_alumnes = 'N'
        tipus.capcelera = 'Mòdul professional'
    tipus.save()

    #
    # Professorat
    #
    parametre_passwd, _ = ParametreKronowin.objects.get_or_create(
        nom_parametre='passwd', defaults={
            'valor_parametre': '1234',
        })
    passwd = parametre_passwd.valor_parametre

    if not (('teachers' in dades['document']) and dades['document']['teachers']
            and ('teacher' in dades['document']['teachers'])
            and dades['document']['teachers']['teacher']):
        errors.append('No s' 'ha definit el professorat')
        return {'errors': errors, 'warnings': warnings, 'infos': infos}

    for p in dades['document']['teachers']['teacher']:
        codiProfessor = p['@id'][3:]
        nom = p.get('surname', '')
        profe, nouProfessor = Professor.objects.get_or_create(
            username=codiProfessor)
        if nouProfessor:
            profe.set_password(passwd)
            profe.last_name = nom
            profe.save()
            profe.groups.add(grupProfessors)
            profe.groups.add(grupProfessionals)
            warnings.append(u'Nou usuari: \'%s\'. Passwd: \'%s\'' %
                            (codiProfessor, passwd))

    #
    # Grups
    #
    if not (('classes' in dades['document']) and dades['document']['classes']
            and ('class' in dades['document']['classes'])
            and dades['document']['classes']['class']):
        errors.append('No s' 'han definit grups')
        return {'errors': errors, 'warnings': warnings, 'infos': infos}

    for gr in dades['document']['classes']['class']:
        nomgrup = gr['@id'][3:]
        tut = gr.get('class_teacher', '')  # tutor. De moment no es fa servir

        galum, n, c, g = esGrupAlumnes(nomgrup, False)
        if (galum):
            grupc, warn = creaGrup(n, c, g, inicurs, ficurs)
            warnings.extend(warn)
            agrupament = gr.get('longname', '')
            if agrupament != '' and agrupament[0] == '*':
                # Sistema alternatiu per assignar agrupaments
                # S'indica amb un * a la descripció del grup dins del xml
                # Ex: '*CL_DAW1A CL_ASX1A'

                llista = agrupament[1:].split()
                warn = creaAgrupaments(grupc, llista, inicurs, ficurs,
                                       senseGrups)
                warnings.extend(warn)

            else:
                if senseGrups:
                    grupc, warn = creaGrup(n, c, '-', inicurs, ficurs)
                    warnings.extend(warn)
                    warn = creaAgrupaments(grupc, ['CL_' + n + c + '-'],
                                           inicurs, ficurs, senseGrups)
                    warnings.extend(warn)

    _, warn = creaGrup('ALL', '1', 'altres', inicurs, ficurs)
    warnings.extend(warn)

    #
    #  Aules
    #
    if not (('rooms' in dades['document']) and dades['document']['rooms'] and
            ('room' in dades['document']['rooms'])
            and dades['document']['rooms']['room']):
        errors.append('No s' 'han definit aules')
        return {'errors': errors, 'warnings': warnings, 'infos': infos}

    for a in dades['document']['rooms']['room']:
        codiAula = a['@id'][3:]
        descAula = a.get('longname', '')
        rAula, nouAula = Aula.objects.get_or_create(nom_aula=codiAula)
        if nouAula:
            rAula.descripcio_aula = descAula
            rAula.save()
            warnings.append(u'Nova aula: \'%s\'' % (codiAula))
            nAulesCreades += 1

    # Si detecto errors plego aquí:
    if errors: return {'errors': errors, 'warnings': warnings, 'infos': infos}

    KronowinToUntis, _ = ParametreKronowin.objects.get_or_create(
        nom_parametre='KronowinToUntis')
    assignatures_amb_professor, _ = ParametreKronowin.objects.get_or_create(
        nom_parametre='assignatures amb professor')

    #
    # lliçons
    #
    if not (('lessons' in dades['document']) and dades['document']['lessons']
            and ('lesson' in dades['document']['lessons'])
            and dades['document']['lessons']['lesson']):
        errors.append('No s' 'han definit classes')
        return {'errors': errors, 'warnings': warnings, 'infos': infos}

    Horari.objects.update(es_actiu=False)

    for l in dades['document']['lessons']['lesson']:
        mat = l.get('lesson_subject', '')
        if (mat != ''):
            mat = mat['@id'][3:]
        prof = l.get('lesson_teacher', '')
        if (prof != ''):
            prof = prof['@id'][3:]
        # Fusiona grups si n'hi ha varis
        ngrup = l.get('lesson_classes', '')
        if (ngrup != ''):
            ngrup = ngrup['@id']
            #  Crear grupo xxxxxNABCD...
            grup, tipus, warn = fusionaGrups(ngrup, inicurs, ficurs,
                                             senseGrups)
            warnings.extend(warn)
        if 'times' in l and l['times'] and 'time' in l['times'] and l['times'][
                'time']:
            cl = l.get('times').get('time')
            if type(cl) != list:
                cl = [cl]
            for h in cl:
                dia = h.get('assigned_day', '')
                hini = h.get('assigned_starttime', '')
                hfi = h.get('assigned_endtime', '')
                aula = h.get('assigned_room', '')
                if aula != '':
                    aula = aula['@id'][3:]
                canvia, warn, compAssig = creaHorari(
                    mat, prof, grup, tipus, dia, hini, hfi, aula,
                    KronowinToUntis, assignatures_amb_professor)
                warnings.extend(warn)
                nLiniesLlegides += 1
                nAssignaturesCreades += compAssig
                if canvia:
                    nHorarisModificats += 1

    if (('holidays' in dades['document']) and dades['document']['holidays']
            and ('holiday' in dades['document']['holidays'])
            and dades['document']['holidays']['holiday']):
        for l in dades['document']['holidays']['holiday']:
            desc = l.get('longname', '')
            iniPer = l.get('starttime', None)
            if iniPer:
                iniPer = datetime.datetime.strptime(iniPer, '%Y%m%d').date()
            fiPer = l.get('endtime', None)
            if fiPer:
                fiPer = datetime.datetime.strptime(fiPer, '%Y%m%d').date()

            if iniPer and fiPer:
                diafestiu = Festiu.objects.filter(data_inici_festiu=iniPer,
                                                  data_fi_festiu=fiPer)
                if diafestiu.count() == 0:
                    diafestiu = Festiu()
                    diafestiu.data_inici_festiu = iniPer
                    diafestiu.data_fi_festiu = fiPer
                    diafestiu.curs = None
                    diafestiu.franja_horaria_inici = FranjaHoraria.objects.order_by(
                        'hora_inici', 'hora_fi').first()
                    diafestiu.franja_horaria_fi = FranjaHoraria.objects.order_by(
                        'hora_inici', 'hora_fi').last()
                    diafestiu.descripcio = desc
                    diafestiu.save()
                    warnings.append(u'Nou festiu: \'%s\'' % str(diafestiu))

    ambErrors = ' amb errors' if errors else ''
    ambAvisos = ' amb avisos' if not errors and warnings else ''

    infos.append(u'Importació finalitzada' + ambErrors + ambAvisos)
    infos.append(u' ')
    infos.append(u'%d línies llegides' % (nLiniesLlegides, ))
    infos.append(u'%d horaris creats o modificats' % (nHorarisModificats))
    infos.append(u'%d aules creades' % (nAulesCreades))
    infos.append(u'%d assignatures Creades' % (nAssignaturesCreades))
    infos.append(u'Recorda reprogramar classes segons el canvia horari')

    # invocar refer 'imparticions'
    from aula.apps.missatgeria.models import Missatge
    missatge = RECORDA_REPROGRAMAR_CLASSES
    tipus_de_missatge = tipusMissatge(missatge)
    msg = Missatge(remitent=usuari,
                   text_missatge=RECORDA_REPROGRAMAR_CLASSES,
                   enllac="/presencia/regeneraImpartir",
                   tipus_de_missatge=tipus_de_missatge)
    msg.afegeix_errors(errors)
    msg.afegeix_warnings(warnings)
    msg.afegeix_infos(infos)
    msg.envia_a_usuari(usuari)

    KronowinToUntis, _ = ParametreKronowin.objects.get_or_create(
        nom_parametre='KronowinToUntis')
    KronowinToUntis.valor_parametre = 'False'
    KronowinToUntis.save()

    return {'errors': errors.sort(), 'warnings': warnings, 'infos': infos}
Exemplo n.º 13
0
def sincronitza(file, usuari):
    _, _ = Group.objects.get_or_create(name=u'direcció')
    grupProfessors, _ = Group.objects.get_or_create(name='professors')
    grupProfessionals, _ = Group.objects.get_or_create(name='professional')
    grupConsergeria, _ = Group.objects.get_or_create(name='consergeria')

    dialect = csv.Sniffer().sniff(file.readline())
    file.seek(0)
    file.readline()
    file.seek(0)
    fieldnames = (
    'assignatura', 'professor', 'grup', 'mati_tarda', 'nivell', 'curs', 'lletra', 'aula', 'unk2', 'dia', 'franja',
    'unk3')
    reader = csv.DictReader(file, fieldnames=fieldnames, dialect=dialect)

    errors = []
    warnings = []
    infos = []

    # cal comprova número de columnes
    aFranges = set([])
    aGrups = set([])
    aProfessors = set([])

    #
    #
    #  PRIMERA PART: comprovar franjes horàries, grups i professors
    #
    #


    for row in reader:

        #
        # comprovar existència franges horàries Kronowin
        #
        codiFranja = unicode(row['franja'], 'iso-8859-1')
        aFranges.add(codiFranja)
        aTotesLesFrangesKronowin = set([])
        for f2g in Franja2Aula.objects.all(): aTotesLesFrangesKronowin.add(f2g.franja_kronowin)
        # les franges pendents:
        for f2g in aFranges.difference(aTotesLesFrangesKronowin):
            errors.append(u'Cal assignar la franja horària kronowin \'%s\' a una franja horària des d\'admin' % f2g)
            Franja2Aula(franja_kronowin=f2g).save()

        #
        # comprovar existència  grups Kronowin
        #
        codiGrup = unicode(row['grup'], 'iso-8859-1')
        aGrups.add(codiGrup)
        aTotsElsGrupsKronowin = set([])
        for g2g in Grup2Aula.objects.all(): aTotsElsGrupsKronowin.add(g2g.grup_kronowin)
        aTotsElsGrupsKronowin.add('')
        # els grups pendents:
        for g2g in aGrups.difference(aTotsElsGrupsKronowin):
            errors.append(u'Cal assignar el grup kronowin \'%s\' a un grup des d\'admin' % g2g)
            Grup2Aula(grup_kronowin=g2g).save()

        #
        # comprovar existència professors Kronowin
        #
        codiProfessor = unicode(row['professor'], 'iso-8859-1')
        aProfessors.add(codiProfessor)
        aTotsElsProfessors = set([])
        for p2g in Professor.objects.all(): aTotsElsProfessors.add(p2g.username)
        # els professors pendents:
        for p2g in aProfessors.difference(aTotsElsProfessors):
            parametre_passwd, _ = ParametreKronowin.objects.get_or_create(nom_parametre='passwd',
                                                                          defaults={'valor_parametre': '1234', })
            passwd = parametre_passwd.valor_parametre
            warnings.append(u'Nou usuari: \'%s\'. Passwd: \'%s\'' % (p2g, passwd))
            nouProfessor = Professor(username=p2g)
            nouProfessor.set_password(passwd)
            nouProfessor.save()
            nouProfessor.groups.add(grupProfessors)
            nouProfessor.groups.add(grupProfessionals)

            # Si detecto errors plego aquí:
    if errors: return {'errors': errors, 'warnings': warnings, 'infos': infos}

    #
    #
    #  SEGONA PART: importar
    #
    #
    nLiniesLlegides = 0
    nHorarisModificats = 0
    nAssignaturesCreades = 0
    nAulesCreades = 0
    file.seek(0)
    reader = csv.DictReader(file, fieldnames=fieldnames, dialect=dialect)
    Horari.objects.update(es_actiu=False)
    for row in reader:

        try:
            horari = Horari()
            # hora
            franja_kronowin = unicode(row['franja'], 'iso-8859-1')
            if franja_kronowin == '0,00':
                warnings.append('Horari no importat, Hora a 0,00: ' + unicode(row))
                continue
            horari.hora = Franja2Aula.objects.get(franja_kronowin=franja_kronowin).franja_aula

            # txt_curs
            # txt_curs =  unicode(row['curs'],'iso-8859-1')

            # nivell
            # txt_nivell =  unicode(row['nivell'],'iso-8859-1')

            # grup kronowin
            grup_kronowin = unicode(row['grup'], 'iso-8859-1')

            # grup
            curs = None
            if (grup_kronowin):
                horari.grup = Grup2Aula.objects.get(grup_kronowin=grup_kronowin).Grup2Aula
                curs = horari.grup.curs
                # professor
            codi_professor = unicode(row['professor'], 'iso-8859-1')
            horari.professor = Professor.objects.get(username=codi_professor)

            # assignatura
            # ---comprovo si cal afegir el codi professor al codi assignatura:
            codi_assignatura = unicode(row['assignatura'], 'iso-8859-1')
            assignatures_amb_professor, created = ParametreKronowin.objects.get_or_create(
                nom_parametre='assignatures amb professor')
            cal_afegir_profe = False
            assignatures_amb_professor_value_list = assignatures_amb_professor.valor_parametre.split(',')
            for prefixe_assignatura in [x.strip() for x in assignatures_amb_professor_value_list if bool( x.strip() )]:
                cal_afegir_profe = cal_afegir_profe or codi_assignatura.startswith(prefixe_assignatura.replace(' ', ''))
                # ---busco l'assignatura:
            codi_assignatura = codi_assignatura + '-' + codi_professor if cal_afegir_profe else codi_assignatura
            assignatura = None
            try:
                assignatura = Assignatura.objects.get(curs=curs, codi_assignatura=codi_assignatura)
            except Assignatura.DoesNotExist:  # cal crear l'assignatura
                nAssignaturesCreades += 1
                assignatura = Assignatura()
                assignatura.codi_assignatura = codi_assignatura
                assignatura.nom_assignatura = codi_assignatura
                # miro a quin curs pertany
                if (grup_kronowin):
                    assignatura.curs = Grup2Aula.objects.get(grup_kronowin=grup_kronowin).Grup2Aula.curs
                    # i save:
                assignatura.save()
            horari.assignatura = assignatura

            #aula
            nom_aula = unicode(row['aula'], 'iso-8859-1')
            if bool(nom_aula):
                aula, create = Aula.objects.get_or_create( nom_aula=nom_aula )
                nAulesCreades += 1 if created else 0
            else:
                aula = None
            
            horari.aula = aula

            # dia_de_la_setmana
            dia_kronowin = int(unicode(row['dia'], 'iso-8859-1').split(',')[0]) - 1
            horari.dia_de_la_setmana = DiaDeLaSetmana.objects.get(n_dia_ca=dia_kronowin)

            # estat_sincronitzacio
            horari.estat_sincronitzacio = '1'

            nouHorari, created = Horari.objects.get_or_create(
                hora=horari.hora,
                grup=horari.grup,
                professor=horari.professor,
                assignatura=horari.assignatura,
                dia_de_la_setmana=horari.dia_de_la_setmana,
                defaults={'es_actiu': True, })

            nouHorari.es_actiu = True
            nouHorari.aula = horari.aula
            nouHorari.save()

            if created:
                nHorarisModificats += 1

        except Exception as e:
            warnings.append('Horari no importat, [' + unicode(e) + '] :' + unicode(row))
            warnings.append( traceback.format_exc() )

        finally:
            nLiniesLlegides += 1

    # Solucionem problema de classes que es realitzen en més d'un grup.
    # Posar les entrades anteriors dels grups B, C, etc... inactives.
    # By Joan Rodríguez (INS Vidreres)
    fussionar_assignatures, _ = ParametreKronowin.objects.get_or_create(nom_parametre='fusionar assignatures',
                                                                        defaults={'valor_parametre': 'N', })
    if fussionar_assignatures.valor_parametre == 'S':
        horaris = ( Horari
                   .objects
                   .filter(es_actiu=True, grup__isnull=False)
                   .values_list('assignatura_id', 'professor_id',
                                'dia_de_la_setmana_id',
                                'hora_id')
                   .distinct() )

        for assignatura_id, professor_id, dia_de_la_setmana_id, hora_id in horaris:
            horaris_hora = ( Horari
                            .objects
                            .filter(es_actiu=True, 
                                    assignatura_id=assignatura_id,
                                    professor_id=professor_id, 
                                    dia_de_la_setmana_id=dia_de_la_setmana_id,
                                    hora_id=hora_id, 
                                    grup__isnull=False) )
            horari_primer_grup = horaris_hora.order_by('grup')[0]
            # per a debugar:
            # horari_altres_grups = horaris_hora.exclude( pk = horari_primer_grup.pk )
            # if horari_altres_grups:
            #	print horari_primer_grup.professor, horari_primer_grup.assignatura, horari_primer_grup.dia_de_la_setmana, horari_primer_grup.hora, ",",horari_primer_grup.grup,",",horari_altres_grups.values_list('grup__nom_grup')
            horaris_hora.exclude(pk=horari_primer_grup.pk).update(es_actiu=False)


    ambErrors = ' amb errors' if errors else ''
    ambAvisos = ' amb avisos' if not errors and warnings else ''

    infos.append(u'Importació finalitzada' + ambErrors + ambAvisos)
    infos.append(u' ')
    infos.append(u'%d línies llegides' % (nLiniesLlegides,))
    infos.append(u'%d horaris creats o modificats' % (nHorarisModificats))
    infos.append(u'%d aules creades' % (nAulesCreades))
    infos.append(u'%d assignatures Creades' % (nAssignaturesCreades))
    infos.append(u'Recorda reprogramar classes segons el nou horari')

    # invocar refer 'imparticions'
    from aula.apps.missatgeria.models import Missatge
    missatge = RECORDA_REPROGRAMAR_CLASSES
    tipus_de_missatge = tipusMissatge(missatge)
    msg = Missatge(
        remitent=usuari,
        text_missatge=RECORDA_REPROGRAMAR_CLASSES,
        enllac="/presencia/regeneraImpartir",
        tipus_de_missatge = tipus_de_missatge)
    msg.afegeix_errors(errors)
    msg.afegeix_warnings(warnings)
    msg.afegeix_infos(infos)
    msg.envia_a_usuari(usuari)

    return {'errors': errors.sort(), 'warnings': warnings, 'infos': infos}
Exemplo n.º 14
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}
Exemplo n.º 15
0
    infos.append(u'%d línies llegides' % (nLiniesLlegides,))
    infos.append(u'%d horaris creats o modificats' % (nHorarisModificats))
    infos.append(u'%d aules creades' % (nAulesCreades))
    infos.append(u'%d assignatures Creades' % (nAssignaturesCreades))
    infos.append(u'Recorda reprogramar classes segons el nou horari')

    # invocar refer 'imparticions'
    from aula.apps.missatgeria.models import Missatge
    missatge = RECORDA_REPROGRAMAR_CLASSES
    tipus_de_missatge = tipusMissatge(missatge)
    msg = Missatge(
        remitent=usuari,
        text_missatge=RECORDA_REPROGRAMAR_CLASSES,
        enllac="/presencia/regeneraImpartir",
        tipus_de_missatge = tipus_de_missatge)
    msg.afegeix_errors(errors)
    msg.afegeix_warnings(warnings)
    msg.afegeix_infos(infos)
    msg.envia_a_usuari(usuari)

    return {'errors': errors.sort(), 'warnings': warnings, 'infos': infos}


def creaNivellCursGrupDesDeKronowin(file, dia_inici_curs, dia_fi_curs):
    dialect = csv.Sniffer().sniff(file.readline())
    file.seek(0)
    file.readline()
    file.seek(0)
    fieldnames = (
    'assignatura', 'professor', 'grup', 'mati_tarda', 'nivell', 'curs', 'lletra', 'aula', 'unk2', 'dia', 'franja',
    'unk3')
Exemplo n.º 16
0
    def run(self):        
        #es tracta de renovar la taula 'impartir' classes. Es fa per grups i dies:
        
        tools.lowpriority()
        
        errors=[]
        warnings=[]
        infos=[]
 
        nHorarisInsertats = 0
        #estat_pendent, created = EstatControlAssistencia.objects.get_or_create( codi_estat = u'-', defaults={ u'nom_estat' : u'-----' } )
        try:
            
            import aula.apps.horaris.models as horaris
            
            #busco primer i darrer dia de classe i primera franja horària:
            from django.db.models import Min, Max
            dates = Curs.objects.aggregate( Min( 'data_inici_curs' ), Max( 'data_fi_curs' ) )
            dia_inici_curs = dates['data_inici_curs__min']
            data_fi_curs   = dates['data_fi_curs__max']
            if not self.franja_inici:
                self.franja_inici = FranjaHoraria.objects.all()[0]
            import datetime as t

            #calculo rang de dates a refer               
            self.data_inici = dia_inici_curs if ( not self.data_inici or dia_inici_curs > self.data_inici ) else self.data_inici
            total_dies = ( data_fi_curs - self.data_inici ).days 
            
            #calculo tots els dies a refer
            delta = t.timedelta( days = +1)
            totsElsDies = []
            dia = self.data_inici
            while dia <= data_fi_curs:
                totsElsDies.append(dia)
                dia += delta
                
            #per tots els dies:
            for dia in totsElsDies:

                #print 'processant dia: ' + unicode( dia ) #debug 

                #estatus de l'actualització                
                dies_fets = ( dia - self.data_inici ).days
                tpc =  float( dies_fets ) / float( total_dies) if total_dies else 1.0 
                self.str_status = u'Processant dia %s (%dtpc) %d dies de %d ' % (  unicode(dia), int(tpc * 100), dies_fets , total_dies   ) 
                
                #print self.str_status
                
                #esborrar els impartir d'aquell dia (d'horaris donats de baixa)
                horari_donat_de_baixa = Q( horari__es_actiu = False )
                mateix_dia = Q( dia_impartir = dia )
                condicio_esborrat = horari_donat_de_baixa & mateix_dia
                if dia == self.data_inici:
                    franja_anterior = Q( horari__hora__hora_inici__gte=self.franja_inici.hora_inici )
                    condicio_esborrat = condicio_esborrat & franja_anterior
                Impartir.objects.filter( condicio_esborrat ).delete()
            
                #per tots els horaris d'aquell dia: crear impartir
                horari_actiu = Q( es_actiu = True )
                horari_del_dia_de_la_setmana = Q( dia_de_la_setmana__n_dia_ca = dia.weekday() )
                for horari in Horari.objects.filter( horari_actiu & horari_del_dia_de_la_setmana   ):
                    fora_de_rang = (dia == self.data_inici ) and  (horari.hora.hora_inici <  self.franja_inici.hora_inici )
                    curs = horari.grup.curs if horari.grup else None
                    dia_festa = esFestiu( curs=curs, dia=dia, hora=horari.hora )
                    if not fora_de_rang :
                        if not dia_festa:
                            impartir_modificat , created = Impartir.objects.get_or_create( dia_impartir = dia, 
                                                                          horari = horari ) 
                            if created: 
                                nHorarisInsertats += 1

                            if not created:
                                aula_horari = horari.aula.pk if horari.aula else -1
                                aula_impartir = impartir_modificat.reserva.aula.pk if impartir_modificat.reserva else -1
                                canvi_aula = ( aula_horari != aula_impartir )
                                if ( canvi_aula and 
                                     impartir_modificat.reserva and 
                                     not impartir_modificat.reserva.es_reserva_manual ):
                                    fake_l4_credentials = (None, True)
                                    impartir_modificat.reserva.credentials = fake_l4_credentials
                                    impartir_modificat.reserva.delete()
                                    impartir_modificat.reserva = None
                                    impartir_modificat.reserva_id = None                                    
                                    impartir_modificat.save()

                        else:
                            Impartir.objects.filter( dia_impartir = dia, horari = horari ).delete()
                    else:
                        pass
                        #print 'fora de rang:' + unicode( horari )  #debug


        except Exception as e:
            errors.append( traceback.format_exc() )
            #errors.append(unicode(e))
            self.str_status = unicode(e)
        
        self.str_status = u'Finalitzat' + unicode( errors )
        
        infos.append(u'Regeneració finalitzada')
        infos.append(u'%d horaris insertats'% nHorarisInsertats)

        #Deixar missatge a la base de dades (utilitzar self.user )
        from aula.apps.missatgeria.models import Missatge
        missatge = FI_REPROGRAMACIO_CLASSES
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge( 
                    remitent= self.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'
        msg.envia_a_usuari(self.user, importancia=importancia)