Ejemplo 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 )
            
            
Ejemplo n.º 2
0
def informaNoCorreus(destinataris, usuari, url):
    '''
    Envia missatges Djau per cada destinatari. Informa d'usuari sense correus.
    destinataris  query d'usuaris (User)
    usuari  a qui fa referència el missatge (Alumne)
    url string, enllaç per a fer el canvi de la configuració de l'usuari afectat
    
    '''

    if usuari is None: return
    missatge = ALUMNE_SENSE_EMAILS
    tipus_de_missatge = tipusMissatge(missatge)
    missatge = missatge.format(str(usuari))
    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()
    if not destinataris or not destinataris.exists():
        destinataris = Group.objects.get_or_create(
            name='administradors')[0].user_set.all()
        url = geturlconf('ADM', usuari)
    msg = Missatge(remitent=usuari_notificacions,
                   text_missatge=missatge,
                   tipus_de_missatge=tipus_de_missatge,
                   enllac=url)
    for d in destinataris:
        msg.envia_a_usuari(d, 'VI')
Ejemplo 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()
Ejemplo n.º 4
0
def enviaMissatgeProfessorsPas(request):
    credentials = tools.getImpersonateUser(request)
    (user, l4) = credentials

    formset = []
    msgFormF = modelform_factory(Missatge, fields=('text_missatge',))

    if request.method == 'POST':
        msg = Missatge(remitent=user)
        msg.credentials = credentials
        formProfessorConserge = triaProfessorsConsergesSelect2Form(data=request.POST)
        msgForm = msgFormF(data=request.POST, instance=msg)

        if formProfessorConserge.is_valid() and msgForm.is_valid():
            msg.tipus_de_missatge = 'MISSATGERIA'
            msg.save()
            professors_conserges = formProfessorConserge.cleaned_data['professors_conserges']
            destinataris_txt = ", ".join( unicode(pc) for pc in professors_conserges)
            for professor_conserge in professors_conserges:
                msg.envia_a_usuari(professor_conserge.getUser(), 'IN')

            # envio al que ho envia:
            missatge = ACUS_REBUT_ENVIAT_A_PROFE_O_PAS
            tipus_de_missatge = tipusMissatge(missatge)
            msg2 = Missatge(remitent=user,
                           text_missatge=missatge.format(
                               destinataris_txt,
                               msg.text_missatge),
                            tipus_de_missatge= tipus_de_missatge)
            msg2.envia_a_usuari(user, 'PI')
            msg2.destinatari_set.filter(destinatari = user).update(moment_lectura=datetime.now())

            messages.info(request, u"Missatge a {destinataris} enviat correctament".format(destinataris=destinataris_txt))

            if user.groups.filter(name="consergeria").exists():
                url = '/missatgeria/enviaMissatgeProfessorsPas/'
            else:
                url = '/missatgeria/elMeuMur/'
            return HttpResponseRedirect(url)
    else:
        formProfessorConserge = triaProfessorsConsergesSelect2Form()
        msgForm = msgFormF()

    formset.append(formProfessorConserge)
    formset.append(msgForm)

    for form in formset:
        for field in form.fields:
            form.fields[field].widget.attrs['class'] = "form-control"

    return render(
        request,
        'formset.html',
        {'formset': formset,
         'titol_formulari': u"Missatge a professors i/o PAS",
         'head': u"Missatge a membres del professorat o consergeria",
         },
        )
Ejemplo n.º 5
0
def enviaMissatgeAdministradors( request ):
    
    credentials = tools.getImpersonateUser(request) 
    (user, l4) = credentials   
    
    formset = []
    msgFormF = modelform_factory(Missatge, fields=( 'text_missatge', ) )
    
    if request.method == 'POST':        
        msg = Missatge( remitent = user )
        msg.credentials = credentials
        msgForm = msgFormF( data = request.POST, instance = msg )        
        
        if msgForm.is_valid():           
            administradors = Group.objects.get_or_create( name = 'administradors' )[0].user_set.all()
            if len( administradors ) == 0:
                msgForm._errors.setdefault(NON_FIELD_ERRORS, []).append(  u'''No estan definits els administradors, sorry.'''  )
            else:
                msg.text_missatge = u'''Avís d'error al programa: {0}'''.format(msg.text_missatge)
                msg.save()
                strAdmins = u''
                separador = ''
                for administrador in administradors:
                    msg.envia_a_usuari(administrador, 'VI')
                    strAdmins += separador + u'Sr(a)' + unicode( administrador )
                    separador = u', '
                txtMsg = msg.text_missatge
                
                #envio al que ho envia:
                msg = Missatge( remitent = user, text_missatge = u'''Avís a administradors enviat correctament. El text de l'avís és: "{0}"'''.format( txtMsg ) )
                msg.envia_a_usuari(user, 'PI')
                
                url = '/missatgeria/elMeuMur/'  
                return HttpResponseRedirect( url )  
    else:
        msgForm = msgFormF(  )
    
    formset.append( msgForm )
        
    return render_to_response(
                'formset.html',
                    {'formset': formset,
                     'head': u'''Avís a administradors. En cas d'error, sisplau, detalla clarament totes les passes per reproduir l'error.''' ,
                    },
                    context_instance=RequestContext(request))
Ejemplo n.º 6
0
def informaDSN(destinataris, usuari, emailRetornat, motiu, data, url):
    '''
    Envia missatges Djau per cada destinatari. Informa de l'error de l'adreça email de l'usuari.
    destinataris  query d'usuaris (User)
    usuari  a qui fa referència el missatge, el propietari de l'adreça errònia (User o Alumne)
    emailRetornat string, adreça que ha rebutjat el correu
    motiu string, explicació original del servidor
    data datetime, en la qual el servidor va rebre el correu
    url string, enllaç per a fer el canvi de la configuració de l'usuari afectat
    Si l'usuari (no alumne) s'ha connectat al Djau des de la data aleshores també rep el missatge
    
    '''

    enviaUsuari = False
    if usuari:
        #  Si usuari s'ha connectat des de la data aleshores també se li comunica
        connexions = usuari.LoginUsuari.filter(exitos=True).order_by('-moment')
        if connexions.exists():
            dataDarreraConnexio = connexions[0].moment
            if dataDarreraConnexio > data:
                enviaUsuari = True

    missatge = MAIL_REBUTJAT
    tipus_de_missatge = tipusMissatge(missatge)
    missatge = missatge.format(
        str(usuari) if usuari else "desconegut", emailRetornat, str(data),
        motiu)
    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()
    if not destinataris or not destinataris.exists() or not usuari:
        destinataris = Group.objects.get_or_create(
            name='administradors')[0].user_set.all()
        url = geturlconf('ADM', usuari)
    msg = Missatge(remitent=usuari_notificacions,
                   text_missatge=missatge,
                   tipus_de_missatge=tipus_de_missatge,
                   enllac=url)
    for d in destinataris:
        msg.envia_a_usuari(d, 'VI')
    if enviaUsuari:
        try:
            url = geturlconf('USU', usuari)
        except:
            url = ''
        if url != '':
            msg = Missatge(remitent=usuari_notificacions,
                           text_missatge=missatge,
                           tipus_de_missatge=tipus_de_missatge,
                           enllac=url)
            msg.envia_a_usuari(usuari, 'VI')
Ejemplo n.º 7
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)
Ejemplo n.º 8
0
def impartir_despres_de_passar_llista(instance):
    #Si passa llista un professor que no és el de l'Horari cal avisar.
    if instance.professor_passa_llista <> instance.horari.professor:
        remitent = instance.professor_passa_llista
        text_missatge = u"""Has passat llista a un grup que no és el teu: ({0}). 
                         El professor del grup {1} rebrà un missatge com aquest.
                         """.format(unicode(instance),
                                    unicode(instance.horari.professor))
        Missatge = apps.get_model('missatgeria', 'Missatge')
        msg = Missatge(remitent=remitent.getUser(),
                       text_missatge=text_missatge)
        msg.envia_a_usuari(usuari=instance.professor_passa_llista.getUser(),
                           importancia='VI')

        text_missatge = u"""Ha passat llista d'una classe on consta que la fas tú: ({0}). 
                         """.format(unicode(instance),
                                    unicode(instance.horari.professor))
        msg = Missatge(remitent=remitent.getUser(),
                       text_missatge=text_missatge)
        msg.envia_a_usuari(usuari=instance.horari.professor.getUser(),
                           importancia='VI')
Ejemplo n.º 9
0
def impartir_despres_de_passar_llista(instance):
    #Si passa llista un professor que no és el de l'Horari cal avisar.
    if instance.professor_passa_llista <> instance.horari.professor:
        remitent = instance.professor_passa_llista
        missatge = PASSAR_LLISTA_GRUP_NO_MEU
        text_missatge = missatge.format( unicode(instance),  unicode(instance.horari.professor) )
        Missatge = apps.get_model( 'missatgeria','Missatge')
        tipus_de_missatge = tipusMissatge (missatge)
        msg = Missatge( remitent = remitent.getUser(), text_missatge = text_missatge, tipus_de_missatge = tipus_de_missatge)
        msg.envia_a_usuari( usuari = instance.professor_passa_llista.getUser(), importancia = 'VI')

        missatge = HAN_PASSAT_LLISTA_PER_MI
        text_missatge = missatge.format( unicode(instance),  unicode(instance.horari.professor) )
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge( remitent = remitent.getUser(), text_missatge = text_missatge, tipus_de_missatge = tipus_de_missatge )
        msg.envia_a_usuari( usuari = instance.horari.professor.getUser(), importancia = 'VI')
Ejemplo n.º 10
0
def impartir_despres_de_passar_llista(instance):
    #Si passa llista un professor que no és el de l'Horari cal avisar.
    if instance.professor_passa_llista != instance.horari.professor:
        remitent = instance.professor_passa_llista
        missatge = PASSAR_LLISTA_GRUP_NO_MEU
        text_missatge = missatge.format(unicode(instance),
                                        unicode(instance.horari.professor))
        Missatge = apps.get_model('missatgeria', 'Missatge')
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=remitent.getUser(),
                       text_missatge=text_missatge,
                       tipus_de_missatge=tipus_de_missatge)
        msg.envia_a_usuari(usuari=instance.professor_passa_llista.getUser(),
                           importancia='VI')

        missatge = HAN_PASSAT_LLISTA_PER_MI
        text_missatge = missatge.format(unicode(instance),
                                        unicode(instance.horari.professor))
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=remitent.getUser(),
                       text_missatge=text_missatge,
                       tipus_de_missatge=tipus_de_missatge)
        msg.envia_a_usuari(usuari=instance.horari.professor.getUser(),
                           importancia='VI')
Ejemplo n.º 11
0
def sortidaEdit(request, pk=None, clonar=False, origen=False):

    credentials = tools.getImpersonateUser(request)
    (user, _) = credentials

    es_post = (request.method == "POST")

    professor = User2Professor(user)

    professors_acompanyen_abans = set()
    professors_acompanyen_despres = set()

    professors_organitzen_abans = set()
    professors_organitzen_despres = set()

    fEsDireccioOrGrupSortides = request.user.groups.filter(
        name__in=[u"direcció", u"sortides"]).exists()
    if bool(pk) and not clonar:
        instance = get_object_or_404(Sortida, pk=pk)
        potEntrar = (professor in instance.professors_responsables.all()
                     or professor
                     in instance.altres_professors_acompanyants.all()
                     or fEsDireccioOrGrupSortides)
        if not potEntrar:
            raise Http404
        professors_acompanyen_abans = set(
            instance.altres_professors_acompanyants.all())
        professors_organitzen_abans = set(
            instance.professors_responsables.all())
    elif bool(pk) and clonar:
        instance = get_object_or_404(Sortida, pk=pk)
        instance.pk = None
        instance.estat = 'E'
        instance.titol_de_la_sortida = u"**CLONADA** " + instance.titol_de_la_sortida
        instance.esta_aprovada_pel_consell_escolar = 'P'
        instance.professor_que_proposa = professor
#         instance.professors_responsables = None
#         instance.altres_professors_acompanyants = None
#         instance.tutors_alumnes_convocats = None
#         instance.alumnes_convocats = None
#         instance.alumnes_que_no_vindran = None
#         instance.alumnes_justificacio = None
#         instance.professor_que_proposa_id = None

    else:
        instance = Sortida()
        instance.professor_que_proposa = professor

    instance.credentials = credentials

    exclude = (
        'alumnes_convocats',
        'alumnes_que_no_vindran',
        'alumnes_justificacio',
    )
    formIncidenciaF = modelform_factory(Sortida, exclude=exclude)

    if request.method == "POST":
        post_mutable = request.POST.copy()
        if 'esta_aprovada_pel_consell_escolar' not in post_mutable:
            post_mutable['esta_aprovada_pel_consell_escolar'] = 'P'

        form = formIncidenciaF(post_mutable, instance=instance)

        if form.is_valid():
            form.save()

            if origen == "Meves":
                messages.warning(
                    request,
                    SafeText(u"""RECORDA: Una vegada enviades les dades, 
                                  has de seleccionar els <a href="{0}">alumnes convocats</a> i els 
                                  <a href="{1}">alumnes que no hi van</a> 
                                  des del menú desplegable ACCIONS""".format(
                        "/sortides/alumnesConvocats/{id}".format(
                            id=instance.id),
                        "/sortides/alumnesFallen/{id}".format(id=instance.id),
                    )))

            professors_acompanyen_despres = set(
                instance.altres_professors_acompanyants.all())
            professors_organitzen_despres = set(
                instance.professors_responsables.all())

            acompanyen_nous = professors_acompanyen_despres - professors_acompanyen_abans
            organitzen_nous = professors_organitzen_despres - professors_organitzen_abans

            #helper missatges:
            data_inici = u"( data activitat encara no informada )"
            if instance.data_inici is not None:
                data_inici = """del dia {dia}""".format(
                    dia=instance.data_inici.strftime('%d/%m/%Y'))

            #missatge a acompanyants:
            txt = u"""Has estat afegit com a professor acompanyant a l'activitat {sortida} 
            {dia}
            """.format(sortida=instance.titol_de_la_sortida, dia=data_inici)
            enllac = reverse('sortides__sortides__edit_by_pk',
                             kwargs={'pk': instance.id})
            msg = Missatge(remitent=user, text_missatge=txt, enllac=enllac)
            for nou in acompanyen_nous:
                importancia = 'VI'
                msg.envia_a_usuari(nou, importancia)

            #missatge a responsables:
            txt = u"""Has estat afegit com a professor responsable a l'activitat {sortida} 
            {dia}
            """.format(sortida=instance.titol_de_la_sortida, dia=data_inici)
            msg = Missatge(remitent=user, text_missatge=txt)
            for nou in organitzen_nous:
                importancia = 'VI'
                msg.envia_a_usuari(nou, importancia)

            nexturl = r"/sortides/sortides{origen}".format(origen=origen)
            return HttpResponseRedirect(nexturl)

    else:

        form = formIncidenciaF(instance=instance)

    form.fields['data_inici'].widget = DateTextImput()
    form.fields['data_fi'].widget = DateTextImput()
    #form.fields['estat'].widget = forms.RadioSelect( choices = form.fields['estat'].widget.choices )
    widgetBootStrapButtonSelect = bootStrapButtonSelect()
    widgetBootStrapButtonSelect.choices = form.fields['estat'].widget.choices
    form.fields['estat'].widget = widgetBootStrapButtonSelect

    form.fields["alumnes_a_l_aula_amb_professor_titular"].widget.attrs[
        'style'] = u"width: 3%"
    form.fields["calendari_public"].widget.attrs['style'] = u"width: 3%"
    for f in form.fields:
        form.fields[f].widget.attrs[
            'class'] = ' form-control ' + form.fields[f].widget.attrs.get(
                'class', "")

    form.fields['calendari_desde'].widget = DateTimeTextImput()
    form.fields['calendari_finsa'].widget = DateTimeTextImput()
    form.fields['termini_pagament'].widget = DateTimeTextImput()

    if not fEsDireccioOrGrupSortides:
        form.fields["esta_aprovada_pel_consell_escolar"].widget.attrs[
            'disabled'] = u"disabled"
        form.fields["codi_de_barres"].widget.attrs['disabled'] = u"disabled"
        form.fields["informacio_pagament"].widget.attrs[
            'disabled'] = u"disabled"

    #si no és propietari tot a disabled
    deshabilitat = (instance.id and
                    not (professor in instance.professors_responsables.all()
                         or fEsDireccioOrGrupSortides))

    if deshabilitat:
        for field in form.fields:
            form.fields[field].widget.attrs['disabled'] = u"disabled"
        form.fields['estat'].label += u": {0} ".format(
            instance.get_estat_display())

    return render(
        request,
        'formSortida.html',
        {
            'form': form,
            'head': 'Sortides',
            'missatge': 'Sortides',
            'deshabilitat': '1==1' if deshabilitat else '1==2',
        },
    )
Ejemplo n.º 12
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)
Ejemplo n.º 13
0
def enviaMissatgeTutors( request ):
    
    credentials = tools.getImpersonateUser(request) 
    (user, l4) = credentials   
    
    formset = []
    msgFormF = modelform_factory(Missatge, fields=( 'text_missatge', ) )
    
    if request.method == 'POST':        
        msg = Missatge( remitent = user )
        msg.credentials = credentials
        formAlumne = triaAlumneSelect2Form( data = request.POST)
        formData= dataForm( data = request.POST  )
        formData.fields['data'].required = True
        msgForm = msgFormF( data = request.POST, instance = msg )        
        
        if formAlumne.is_valid() and msgForm.is_valid() and formData.is_valid():
            alumne = formAlumne.cleaned_data['alumne']
            tutors = alumne.tutorsDeLAlumne()
            data = formData.cleaned_data['data']
            if len( tutors ) == 0:
                formAlumne._errors.setdefault(NON_FIELD_ERRORS, []).append(  u'''No trobat el tutor d'aquest alumne. Cal trucar al cap d'estudis.'''  )
            else:
                request.session['consergeria_darrera_data'] = data
                txt2 = msg.text_missatge
                txt = CONSERGERIA_A_TUTOR
                msg.text_missatge = txt
                msg.enllac = '/tutoria/justificaFaltes/{0}/{1}/{2}/{3}'.format(alumne.pk, data.year, data.month, data.day)
                tipus_de_missatge = tipusMissatge(txt)
                msg.tipus_de_missatge = tipus_de_missatge
                msg.save()
                msg.afegeix_info(u"Alumne: {alumne}".format(alumne=alumne))
                msg.afegeix_info(u"Data relativa a l'avís: {data}".format(data=data))
                msg.afegeix_info(u"Avís: {txt2}".format(txt2=txt2))
                for tutor in tutors:
                    msg.envia_a_usuari(tutor.getUser(), 'IN')
                strTutors = u", ".join(  u'Sr(a) {}'.format( tutor) for tutor in tutors )

                #envio al que ho envia:
                missatge = CONSERGERIA_A_CONSERGERIA
                tipus_de_missatge = tipusMissatge(missatge)
                msg = Missatge( remitent = user,
                                text_missatge = missatge.format( alumne, strTutors, msg.text_missatge ),
                                tipus_de_missatge = tipus_de_missatge)
                msg.envia_a_usuari(user, 'PI')
                msg.destinatari_set.filter(destinatari = user).update(moment_lectura=datetime.now())  #marco com a llegit
                
                url = '/missatgeria/enviaMissatgeTutors/'
                messages.info( request, u"Avís als tutors de {} ({}) enviat correctament".format(unicode(alumne), strTutors ) )
                return HttpResponseRedirect( url )  
    else:
        
        consergeria_darrera_data = request.session.get( 'consergeria_darrera_data' , datetime.today() )
        formAlumne = triaAlumneSelect2Form( )
        formData = dataForm(  label='Data', 
                              help_text=u'El text del missatge començarà per: Amb data ______, ' ,
                              initial = {'data': consergeria_darrera_data })        
        formData.fields['data'].required = True
        msgForm = msgFormF(  )
    
    
    
    formset.append( formAlumne )
    formset.append( formData )
    formset.append( msgForm )

    for form in formset:
        for field in form.fields:
            form.fields[field].widget.attrs['class'] = "form-control"


    return render(
                request,
                'formset.html',
                    {'formset': formset,
                     'titol_formulari': u"Missatge a professors tutors de l'alumne",                    
                     'head': 'Avís a tutors.' ,
                    },
                )
Ejemplo n.º 14
0
def enviaMissatgeAdministradors( request ):
    
    credentials = tools.getImpersonateUser(request) 
    (user, l4) = credentials   
    
    formset = []
    msgFormF = modelform_factory(Missatge, fields=( 'text_missatge', ) )
    
    if request.method == 'POST':        
        msg = Missatge( remitent = user )
        msg.credentials = credentials
        msgForm = msgFormF( data = request.POST, instance = msg )        
        
        if msgForm.is_valid():           
            administradors = Group.objects.get_or_create( name = 'administradors' )[0].user_set.all()
            if len( administradors ) == 0:
                msgForm._errors.setdefault(NON_FIELD_ERRORS, []).append(  u'''No estan definits els administradors, sorry.'''  )
            else:
                missatge = ERROR_AL_PROGRAMA
                msg.text_missatge = missatge.format(msg.text_missatge)
                tipus_de_missatge = tipusMissatge(missatge)
                msg.tipus_de_missatge = tipus_de_missatge
                msg.save()
                strAdmins = u''
                separador = ''
                for administrador in administradors:
                    msg.envia_a_usuari(administrador, 'VI')
                    strAdmins += separador + u'Sr(a)' + unicode( administrador )
                    separador = u', '
                txtMsg = msg.text_missatge
                
                #envio al que ho envia:
                missatge = ACUS_REBUT_ERROR_AL_PROGRAMA
                tipus_de_missatge = tipusMissatge(missatge)
                msg = Missatge( remitent = user, text_missatge = missatge.format( txtMsg ), tipus_de_missatge = tipus_de_missatge )
                msg.envia_a_usuari(user, 'PI')
                
                url = '/missatgeria/elMeuMur/'
                return HttpResponseRedirect( url )  
    else:
        msgForm = msgFormF(  )
    
    formset.append( msgForm )

    for form in formset:
        for field in form.fields:
            form.fields[field].widget.attrs['class'] = "form-control"

    return render(
                request,
                'formset.html',
                    {'formset': formset,
                     'head': u'''Avís a administradors. En cas d'error, sisplau, detalla clarament totes les passes per reproduir l'error.''' ,
                    },
                )
Ejemplo n.º 15
0
	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 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()
Ejemplo n.º 16
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 }
Ejemplo n.º 17
0
def tramitarReservaMassivaRecurs(request,
                                 pk_recurs=None,
                                 pk_franja=None,
                                 year_inici=None,
                                 year_fi=None,
                                 month_inici=None,
                                 month_fi=None,
                                 day_inici=None,
                                 day_fi=None):
    credentials = tools.getImpersonateUser(request)
    (user, l4) = credentials

    recurs = Recurs.objects.filter(pk=pk_recurs).first()
    franja = FranjaHoraria.objects.filter(pk=pk_franja).first()

    import datetime as t
    try:
        year_inici = int(year_inici)
        month_inici = int(month_inici)
        day_inici = int(day_inici)
        year_fi = int(year_fi)
        month_fi = int(month_fi)
        day_fi = int(day_fi)
    except:
        today = t.date.today()
        year_inici = today.year
        month_inici = today.month
        day_inici = today.day
        year_fi = today.year
        month_fi = today.month
        day_fi = today.day
    data_inici = t.date(year_inici, month_inici, day_inici)
    data_fi = t.date(year_fi, month_fi, day_fi)
    es_reservador = User.objects.filter(pk=user.pk,
                                        groups__name__in=['reservador'
                                                          ]).exists()
    if not es_reservador:
        msg = u"No tens permís per reservar un bloc de dies"
        messages.warning(request, SafeText(msg))
        return HttpResponseRedirect(r'/recursos/lesMevesReservesDeRecurs/')

    novaReserva = ReservaRecurs(recurs=recurs,
                                hora=franja,
                                dia_reserva=data_inici,
                                usuari=user,
                                es_reserva_manual=True)
    infoForm = [
        ('Data inici reserva', data_inici),
        ('Data fi reserva', data_fi),
    ]

    if request.method == 'POST':
        novaReserva = ReservaRecurs(recurs=recurs,
                                    hora=franja,
                                    dia_reserva=data_inici,
                                    usuari=user,
                                    es_reserva_manual=False)
        form = reservaMassivaRecursForm(request.POST, instance=novaReserva)

        if form.is_valid():
            try:
                reserva = form.save(commit=False)
                dates = []
                numdies = (data_fi - data_inici).days
                for x in range(0, numdies + 1, 7):
                    dates.append(data_inici + timedelta(days=x))
                for data in dates:
                    reserva.pk = None
                    reserva.dia_reserva = data
                    reserva.save()
                missatge = u"Reserva realitzada correctament"
                messages.success(request, missatge)
                # missatge al professor:
                dies_setmana = {
                    0: 'dilluns',
                    1: 'dimarts',
                    2: 'dimecres',
                    3: 'dijous',
                    4: 'divendres'
                }
                missatge = PROFESSOR_RESERVA_MASSIVA
                txt = missatge.format(novaReserva.recurs,
                                      dies_setmana[data_inici.weekday()],
                                      data_inici, data_fi, novaReserva.hora)
                tipus_de_missatge = tipusMissatge(missatge)
                msg = Missatge(remitent=user,
                               text_missatge=txt,
                               tipus_de_missatge=tipus_de_missatge)
                importancia = 'PI'
                destinatari = reserva.usuari
                msg.envia_a_usuari(destinatari, importancia)
                return HttpResponseRedirect(
                    r'/recursos/lesMevesReservesDeRecurs/')
            except ValidationError as e:
                for _, v in e.message_dict.items():
                    form._errors.setdefault(NON_FIELD_ERRORS, []).extend(v)
    else:
        form = reservaMassivaRecursForm(instance=novaReserva)

    for f in ['recurs', 'dia_reserva', 'hora', 'motiu']:
        form.fields[f].widget.attrs[
            'class'] = 'form-control ' + form.fields[f].widget.attrs.get(
                'class', "")

    return render(
        request,
        'form.html',
        {
            'form': form,
            'infoForm': infoForm,
            'head': u'Reservar material',
            'titol_formulari': u"Assistent Reserva Massiva de Material (3/3)",
        },
    )
Ejemplo n.º 18
0
def professorsAcompanyants( request, pk , origen ):

    credentials = tools.getImpersonateUser(request) 
    (user, _ ) = credentials
    
    professor = User2Professor( user )     
    
    instance = get_object_or_404( Sortida, pk = pk )
    instance.flag_clean_nomes_toco_alumnes = True
    
    professors_acompanyen_despres = set( ) 
    professors_organitzen_despres = set( )     
    
    professors_acompanyen_abans = set( instance.altres_professors_acompanyants.all() )
    professors_organitzen_abans = set( instance.professors_responsables.all() )
    estat_abans = instance.estat
    
    potEntrar = ( professor in instance.professors_responsables.all() or request.user.groups.filter(name__in=[u"direcció", u"sortides"] ).exists() )
    if not potEntrar:
        raise Http404
    
    instance.credentials = credentials    
   
    formIncidenciaF = modelform_factory(Sortida, fields=( 'altres_professors_acompanyants',  ) )

    if request.method == "POST":
        form = formIncidenciaF(request.POST, instance = instance)
        
        if form.is_valid(): 
            try:
                form.save()

                if instance.estat in ['R','G']:
                    professors_acompanyen_despres = set( instance.altres_professors_acompanyants.all() )
                    professors_organitzen_despres = set( instance.professors_responsables.all() )
                    
                    acompanyen_nous = professors_acompanyen_despres - professors_acompanyen_abans
                    organitzen_nous = professors_organitzen_despres - professors_organitzen_abans
                    
                    #missatge a acompanyants:
                    txt = u"""Has estat afegit com a professor acompanyant a la sortida {sortida} 
                    del dia {dia}
                    """.format( sortida = instance.titol_de_la_sortida, dia = instance.data_inici.strftime( '%d/%m/%Y' ) )
                    msg = Missatge( remitent = user, text_missatge = txt )
                    for nou in acompanyen_nous:                
                        importancia = 'VI'
                        msg.envia_a_usuari(nou, importancia)                
        
                    #missatge a responsables:
                    txt = u"""Has estat afegit com a professor responsable a la sortida {sortida} 
                    del dia {dia}
                    """.format( sortida = instance.titol_de_la_sortida, dia = instance.data_inici.strftime( '%d/%m/%Y' ) )
                    msg = Missatge( remitent = user, text_missatge = txt )
                    for nou in organitzen_nous:                
                        importancia = 'VI'
                        msg.envia_a_usuari(nou, importancia) 
                                    
                nexturl =  r'/sortides/sortides{origen}'.format( origen=origen )                
                return HttpResponseRedirect( nexturl )
            except ValidationError, e:
                form._errors.setdefault(NON_FIELD_ERRORS, []).extend(  e.messages )
Ejemplo n.º 19
0
def sortidaEdit( request, pk = None, origen=False ):

    credentials = tools.getImpersonateUser(request) 
    (user, _ ) = credentials
    
    professor = User2Professor( user )     
    
    professors_acompanyen_abans = set( )
    professors_acompanyen_despres = set( ) 

    professors_organitzen_abans = set( )
    professors_organitzen_despres = set( ) 
    
    fEsDireccioOrGrupSortides = request.user.groups.filter(name__in=[u"direcció", u"sortides"] ).exists()
    if bool( pk ):
        instance = get_object_or_404( Sortida, pk = pk )
        potEntrar = ( professor in instance.professors_responsables.all() or fEsDireccioOrGrupSortides )
        if not potEntrar:
            raise Http404
        professors_acompanyen_abans = set( instance.altres_professors_acompanyants.all() )
        professors_organitzen_abans = set( instance.professors_responsables.all() )
    else:
        instance = Sortida()        
        instance.professor_que_proposa = professor
    
    instance.credentials = credentials

    exclude=( 'alumnes_convocats', 'alumnes_que_no_vindran', )
    formIncidenciaF = modelform_factory(Sortida, exclude=exclude )

    if request.method == "POST":
        post_mutable = request.POST.copy()
        if 'esta_aprovada_pel_consell_escolar' not in post_mutable:
            post_mutable['esta_aprovada_pel_consell_escolar'] = 'P'
        
        form = formIncidenciaF(post_mutable, instance = instance)
            
        if form.is_valid(): 
            form.save()
            
            if origen=="Meves":
                messages.warning(request,  
                                SafeText(u"""RECORDA: Una vegada enviades les dades, 
                                  has de seleccionar els <a href="{0}">alumnes convocats</a> i els 
                                  <a href="{1}">alumnes que no hi van</a> 
                                  des del menú desplegable ACCIONS""".format(
                                        "/sortides/alumnesConvocats/{id}".format( id = instance.id),
                                        "/sortides/alumnesFallen/{id}".format( id = instance.id),
                                                                             )
                                ))

            professors_acompanyen_despres = set( instance.altres_professors_acompanyants.all() )
            professors_organitzen_despres = set( instance.professors_responsables.all() )
            
            acompanyen_nous = professors_acompanyen_despres - professors_acompanyen_abans
            organitzen_nous = professors_organitzen_despres - professors_organitzen_abans
            
            #helper missatges:
            data_inici = u"( data activitat encara no informada )"
            if instance.data_inici is not None:
                data_inici = """del dia {dia}""".format( dia = instance.data_inici.strftime( '%d/%m/%Y' ) )
            
            #missatge a acompanyants:                
            txt = u"""Has estat afegit com a professor acompanyant a la sortida {sortida} 
            {dia}
            """.format( sortida = instance.titol_de_la_sortida, dia = data_inici )
            msg = Missatge( remitent = user, text_missatge = txt )
            for nou in acompanyen_nous:                
                importancia = 'VI'
                msg.envia_a_usuari(nou, importancia)                

            #missatge a responsables:
            txt = u"""Has estat afegit com a professor responsable a la sortida {sortida} 
            {dia}
            """.format( sortida = instance.titol_de_la_sortida, dia = data_inici )
            msg = Missatge( remitent = user, text_missatge = txt )
            for nou in organitzen_nous:                
                importancia = 'VI'
                msg.envia_a_usuari(nou, importancia)                
                        
            nexturl =  r"/sortides/sortides{origen}".format( origen = origen) 
            return HttpResponseRedirect( nexturl )
            
    else:

        form = formIncidenciaF( instance = instance  )
        
    form.fields['data_inici'].widget = DateTextImput()
    form.fields['data_fi'].widget = DateTextImput()
    #form.fields['estat'].widget = forms.RadioSelect( choices = form.fields['estat'].widget.choices )
    widgetBootStrapButtonSelect= bootStrapButtonSelect( )
    widgetBootStrapButtonSelect.choices = form.fields['estat'].widget.choices 
    form.fields['estat'].widget = widgetBootStrapButtonSelect    
    
    form.fields["calendari_public"].widget.attrs['style'] = u"width: 3%"
    for f in form.fields:
        form.fields[f].widget.attrs['class'] = ' form-control' + form.fields[f].widget.attrs.get('class',"") 

    form.fields['calendari_desde'].widget = DateTimeTextImput()
    form.fields['calendari_finsa'].widget = DateTimeTextImput()
    
    if not fEsDireccioOrGrupSortides:
        form.fields["esta_aprovada_pel_consell_escolar"].widget.attrs['disabled'] = u"disabled"

    
        
    return render_to_response(
                'formSortida.html',
                    {'form': form,
                     'head': 'Sortides' ,
                     'missatge': 'Sortides'
                    },
                    context_instance=RequestContext(request))    
Ejemplo n.º 20
0
def sortidaEdit(request, pk=None, clonar=False, origen=False):
    credentials = tools.getImpersonateUser(request)
    (user, _) = credentials

    es_post = (request.method == "POST")

    professor = User2Professor(user)

    professors_acompanyen_abans = set()
    professors_acompanyen_despres = set()

    professors_organitzen_abans = set()
    professors_organitzen_despres = set()

    fEsDireccioOrGrupSortides = request.user.groups.filter(
        name__in=[u"direcció", u"sortides"]).exists()
    if bool(pk) and not clonar:
        instance = get_object_or_404(Sortida, pk=pk)
        potEntrar = (professor in instance.professors_responsables.all()
                     or professor
                     in instance.altres_professors_acompanyants.all()
                     or fEsDireccioOrGrupSortides)
        if not potEntrar:
            raise Http404
        professors_acompanyen_abans = set(
            instance.altres_professors_acompanyants.all())
        professors_organitzen_abans = set(
            instance.professors_responsables.all())
    elif bool(pk) and clonar:
        instance = get_object_or_404(Sortida, pk=pk)
        instance.pk = None
        instance.estat = 'E'
        instance.titol_de_la_sortida = u"**CLONADA** " + instance.titol_de_la_sortida
        instance.esta_aprovada_pel_consell_escolar = 'P'
        instance.professor_que_proposa = professor
    # instance.professors_responsables = None
    #         instance.altres_professors_acompanyants = None
    #         instance.tutors_alumnes_convocats = None
    #         instance.alumnes_convocats = None
    #         instance.alumnes_que_no_vindran = None
    #         instance.alumnes_justificacio = None
    #         instance.professor_que_proposa_id = None

    else:
        instance = Sortida()
        instance.professor_que_proposa = professor

    instance.credentials = credentials

    # És un formulari reduit?
    if settings.CUSTOM_FORMULARI_SORTIDES_REDUIT:
        exclude = ('alumnes_convocats', 'alumnes_que_no_vindran',
                   'alumnes_justificacio', 'data_inici', 'franja_inici',
                   'data_fi', 'franja_fi', 'codi_de_barres',
                   'empresa_de_transport', 'pagament_a_empresa_de_transport',
                   'pagament_a_altres_empreses', 'feina_per_als_alumnes_aula')
    else:
        exclude = (
            'alumnes_convocats',
            'alumnes_que_no_vindran',
            'alumnes_justificacio',
        )

    formIncidenciaF = modelform_factory(Sortida, exclude=exclude)

    if request.method == "POST":
        post_mutable = request.POST.copy()
        if 'esta_aprovada_pel_consell_escolar' not in post_mutable:
            post_mutable['esta_aprovada_pel_consell_escolar'] = 'P'

        form = formIncidenciaF(post_mutable, instance=instance)

        if form.is_valid():
            # Omplir camps de classes afectades
            if settings.CUSTOM_FORMULARI_SORTIDES_REDUIT:

                #Buscar primera impartició afectada
                primeraimparticio = Impartir.objects.filter(
                    dia_impartir__gte=instance.calendari_desde.date(),
                    horari__hora__hora_inici__gte=instance.calendari_desde.
                    time()).order_by('dia_impartir',
                                     'horari__hora__hora_inici').first()

                try:
                    instance.data_inici = primeraimparticio.dia_impartir
                    instance.franja_inici = primeraimparticio.horari.hora
                # Si no hi ha primera impartició afectada s'agafa la del primer dia lectiu posterior
                except:
                    instance.data_inici = Impartir.objects.filter(
                        dia_impartir__gt=instance.calendari_desde.date(
                        )).order_by('dia_impartir').first().dia_impartir
                    instance.franja_inici = FranjaHoraria.objects.order_by(
                        'hora_inici').first()

                # Buscar darrera impartició afectada
                darreraimparticio = Impartir.objects.filter(
                    dia_impartir__lte=instance.calendari_finsa.date(),
                    horari__hora__hora_fi__lte=instance.calendari_finsa.time()
                ).order_by('dia_impartir', 'horari__hora__hora_fi').last()

                try:
                    instance.data_fi = darreraimparticio.dia_impartir
                    instance.franja_fi = darreraimparticio.horari.hora
                # Si no hi ha darrera impartició afectada s'agafa la del primer dia lectiu anterior
                except:
                    instance.data_fi = Impartir.objects.filter(
                        dia_impartir__lt=instance.calendari_finsa.date(
                        )).order_by('dia_impartir').last().dia_impartir
                    instance.franja_fi = FranjaHoraria.objects.order_by(
                        'hora_inici').last()

                # Comprovem si la sortida en realitat no afecta cap hora d'impartició, això passa quan la data inicial > data final
                if (instance.data_fi < instance.data_inici):
                    instance.data_inici = None
                    instance.data_fi = None
                    instance.franja_inici = None
                    instance.franja_fi = None
            form.save()

            if origen == "Meves":
                messages.warning(
                    request,
                    SafeText(u"""RECORDA: Una vegada enviades les dades, 
                                  has de seleccionar els <a href="{0}">alumnes convocats</a> i els 
                                  <a href="{1}">alumnes que no hi van</a> 
                                  des del menú desplegable ACCIONS""".format(
                        "/sortides/alumnesConvocats/{id}".format(
                            id=instance.id),
                        "/sortides/alumnesFallen/{id}".format(id=instance.id),
                    )))

            professors_acompanyen_despres = set(
                instance.altres_professors_acompanyants.all())
            professors_organitzen_despres = set(
                instance.professors_responsables.all())

            acompanyen_nous = professors_acompanyen_despres - professors_acompanyen_abans
            organitzen_nous = professors_organitzen_despres - professors_organitzen_abans

            # helper missatges:
            data_inici = u"( data activitat encara no informada )"
            if instance.data_inici is not None:
                data_inici = """del dia {dia}""".format(
                    dia=instance.data_inici.strftime('%d/%m/%Y'))

                # missatge a acompanyants:
            missatge = ACOMPANYANT_A_ACTIVITAT
            txt = missatge.format(sortida=instance.titol_de_la_sortida,
                                  dia=data_inici)
            enllac = reverse('sortides__sortides__edit_by_pk',
                             kwargs={'pk': instance.id})
            tipus_de_missatge = tipusMissatge(missatge)
            msg = Missatge(remitent=user,
                           text_missatge=txt,
                           enllac=enllac,
                           tipus_de_missatge=tipus_de_missatge)
            for nou in acompanyen_nous:
                importancia = 'VI'
                msg.envia_a_usuari(nou, importancia)

                # missatge a responsables:
            missatge = RESPONSABLE_A_ACTIVITAT
            txt = missatge.format(sortida=instance.titol_de_la_sortida,
                                  dia=data_inici)
            tipus_de_missatge = tipusMissatge(missatge)
            msg = Missatge(remitent=user,
                           text_missatge=txt,
                           tipus_de_missatge=tipus_de_missatge)
            for nou in organitzen_nous:
                importancia = 'VI'
                msg.envia_a_usuari(nou, importancia)

            nexturl = r"/sortides/sortides{origen}".format(origen=origen)
            return HttpResponseRedirect(nexturl)

    else:

        form = formIncidenciaF(instance=instance)

    # form.fields['estat'].widget = forms.RadioSelect( choices = form.fields['estat'].widget.choices )
    widgetBootStrapButtonSelect = bootStrapButtonSelect()
    widgetBootStrapButtonSelect.choices = form.fields['estat'].widget.choices
    form.fields['estat'].widget = widgetBootStrapButtonSelect

    form.fields["alumnes_a_l_aula_amb_professor_titular"].widget.attrs[
        'style'] = u"width: 3%"
    form.fields["calendari_public"].widget.attrs['style'] = u"width: 3%"
    for f in form.fields:
        form.fields[f].widget.attrs[
            'class'] = ' form-control ' + form.fields[f].widget.attrs.get(
                'class', "")

    form.fields['calendari_desde'].widget = DateTimeTextImput()
    form.fields['calendari_finsa'].widget = DateTimeTextImput()
    form.fields['termini_pagament'].widget = DateTimeTextImput()

    if not fEsDireccioOrGrupSortides:
        form.fields["esta_aprovada_pel_consell_escolar"].widget.attrs[
            'disabled'] = u"disabled"
        if not settings.CUSTOM_FORMULARI_SORTIDES_REDUIT:
            form.fields["codi_de_barres"].widget.attrs[
                'disabled'] = u"disabled"
        form.fields["informacio_pagament"].widget.attrs[
            'disabled'] = u"disabled"

    # si no és propietari tot a disabled
    deshabilitat = (instance.id and
                    not (professor in instance.professors_responsables.all()
                         or fEsDireccioOrGrupSortides))

    if deshabilitat:
        for field in form.fields:
            form.fields[field].widget.attrs['disabled'] = u"disabled"
        form.fields['estat'].label += u": {0} ".format(
            instance.get_estat_display())

    return render(
        request,
        'formSortida.html',
        {
            'form': form,
            'head': 'Sortides',
            'missatge': 'Sortides',
            'deshabilitat': '1==1' if deshabilitat else '1==2',
        },
    )
Ejemplo n.º 21
0
                                ca.professor = User2Professor( self.usuari )
                            
                            ca.save()
                            alumne_afegit = True
                if i.pot_no_tenir_alumnes:
                    i.pot_no_tenir_alumnes = False
                    i.save()
                self.flagPrimerDiaFet = ( i.dia_impartir >= self.impartir.dia_impartir )
                                
        except Exception, e:                
                errors.append(unicode(e))

        finally:
            self.flagPrimerDiaFet = True                

        msg = Missatge( remitent = self.usuari, text_missatge = u'Fi procés afegir alumnes a {0}'.format( self.impartir.horari.assignatura ) )
        importancia = 'PI'

        if len(errors)>0:
            msg.afegeix_error(errors)
            importancia = 'VI'
            msg.save()
            administradors, _ = Group.objects.get_or_create( name = 'administradors' )

            msgAdmins = Missatge( remitent = self.usuari, text_missatge = u'Fi procés afegir alumnes a {0} amb errors'.format( self.impartir ) )
            msgAdmins.afegeix_error(errors)
            msgAdmins.save()
            msgAdmins.envia_a_grup(administradors, importancia)
                            
            msg.envia_a_usuari(self.usuari, importancia)
        return errors
Ejemplo n.º 22
0
def enviaMissatgeTutors(request):

    credentials = tools.getImpersonateUser(request)
    (user, l4) = credentials

    formset = []
    msgFormF = modelform_factory(Missatge, fields=('text_missatge', ))

    if request.method == 'POST':
        msg = Missatge(remitent=user)
        msg.credentials = credentials
        formAlumne = triaAlumneSelect2Form(data=request.POST)
        formData = dataForm(data=request.POST)
        formData.fields['data'].required = True
        msgForm = msgFormF(data=request.POST, instance=msg)

        if formAlumne.is_valid() and msgForm.is_valid() and formData.is_valid(
        ):
            alumne = formAlumne.cleaned_data['alumne']
            tutors = alumne.tutorsDeLAlumne()
            data = formData.cleaned_data['data']
            if len(tutors) == 0:
                formAlumne._errors.setdefault(NON_FIELD_ERRORS, []).append(
                    u'''No trobat el tutor d'aquest alumne. Cal trucar al cap d'estudis.'''
                )
            else:
                request.session['consergeria_darrera_data'] = data
                txt2 = msg.text_missatge
                txt = CONSERGERIA_A_TUTOR
                msg.text_missatge = txt
                msg.enllac = '/tutoria/justificaFaltes/{0}/{1}/{2}/{3}'.format(
                    alumne.pk, data.year, data.month, data.day)
                tipus_de_missatge = tipusMissatge(txt)
                msg.tipus_de_missatge = tipus_de_missatge
                msg.save()
                msg.afegeix_info(u"Alumne: {alumne}".format(alumne=alumne))
                msg.afegeix_info(
                    u"Data relativa a l'avís: {data}".format(data=data))
                msg.afegeix_info(u"Avís: {txt2}".format(txt2=txt2))
                for tutor in tutors:
                    msg.envia_a_usuari(tutor.getUser(), 'IN')
                strTutors = u", ".join(u'Sr(a) {}'.format(tutor)
                                       for tutor in tutors)

                #envio al que ho envia:
                missatge = CONSERGERIA_A_CONSERGERIA
                tipus_de_missatge = tipusMissatge(missatge)
                msg = Missatge(remitent=user,
                               text_missatge=missatge.format(
                                   alumne, strTutors, msg.text_missatge),
                               tipus_de_missatge=tipus_de_missatge)
                msg.envia_a_usuari(user, 'PI')
                msg.destinatari_set.filter(destinatari=user).update(
                    moment_lectura=datetime.now())  #marco com a llegit

                url = '/missatgeria/enviaMissatgeTutors/'
                messages.info(
                    request,
                    u"Avís als tutors de {} ({}) enviat correctament".format(
                        unicode(alumne), strTutors))
                return HttpResponseRedirect(url)
    else:

        consergeria_darrera_data = request.session.get(
            'consergeria_darrera_data', datetime.today())
        formAlumne = triaAlumneSelect2Form()
        formData = dataForm(
            label='Data',
            help_text=u'El text del missatge començarà per: Amb data ______, ',
            initial={'data': consergeria_darrera_data})
        formData.fields['data'].required = True
        msgForm = msgFormF()

    formset.append(formAlumne)
    formset.append(formData)
    formset.append(msgForm)

    for form in formset:
        for field in form.fields:
            form.fields[field].widget.attrs['class'] = "form-control"

    return render(
        request,
        'formset.html',
        {
            'formset': formset,
            'titol_formulari': u"Missatge a professors tutors de l'alumne",
            'head': 'Avís a tutors.',
        },
    )
Ejemplo n.º 23
0
def enviaMissatgeProfessorsPas(request):
    credentials = tools.getImpersonateUser(request)
    (user, l4) = credentials

    formset = []
    msgFormF = modelform_factory(Missatge, fields=('text_missatge', ))

    if request.method == 'POST':
        msg = Missatge(remitent=user)
        msg.credentials = credentials
        formProfessorConserge = triaProfessorsConsergesSelect2Form(
            data=request.POST)
        msgForm = msgFormF(data=request.POST, instance=msg)

        if formProfessorConserge.is_valid() and msgForm.is_valid():
            msg.tipus_de_missatge = 'MISSATGERIA'
            msg.save()
            professors_conserges = formProfessorConserge.cleaned_data[
                'professors_conserges']
            destinataris_txt = ", ".join(
                unicode(pc) for pc in professors_conserges)
            for professor_conserge in professors_conserges:
                msg.envia_a_usuari(professor_conserge.getUser(), 'IN')

            # envio al que ho envia:
            missatge = ACUS_REBUT_ENVIAT_A_PROFE_O_PAS
            tipus_de_missatge = tipusMissatge(missatge)
            msg2 = Missatge(remitent=user,
                            text_missatge=missatge.format(
                                destinataris_txt, msg.text_missatge),
                            tipus_de_missatge=tipus_de_missatge)
            msg2.envia_a_usuari(user, 'PI')
            msg2.destinatari_set.filter(destinatari=user).update(
                moment_lectura=datetime.now())

            messages.info(
                request,
                u"Missatge a {destinataris} enviat correctament".format(
                    destinataris=destinataris_txt))

            if user.groups.filter(name="consergeria").exists():
                url = '/missatgeria/enviaMissatgeProfessorsPas/'
            else:
                url = '/missatgeria/elMeuMur/'
            return HttpResponseRedirect(url)
    else:
        formProfessorConserge = triaProfessorsConsergesSelect2Form()
        msgForm = msgFormF()

    formset.append(formProfessorConserge)
    formset.append(msgForm)

    for form in formset:
        for field in form.fields:
            form.fields[field].widget.attrs['class'] = "form-control"

    return render(
        request,
        'formset.html',
        {
            'formset': formset,
            'titol_formulari': u"Missatge a professors i/o PAS",
            'head': u"Missatge a membres del professorat o consergeria",
        },
    )
Ejemplo n.º 24
0
    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}


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',
Ejemplo n.º 25
0
def enviaMissatgeAdministradors(request):

    credentials = tools.getImpersonateUser(request)
    (user, l4) = credentials

    formset = []
    msgFormF = modelform_factory(Missatge, fields=('text_missatge', ))

    if request.method == 'POST':
        msg = Missatge(remitent=user)
        msg.credentials = credentials
        msgForm = msgFormF(data=request.POST, instance=msg)

        if msgForm.is_valid():
            administradors = Group.objects.get_or_create(
                name='administradors')[0].user_set.all()
            if len(administradors) == 0:
                msgForm._errors.setdefault(NON_FIELD_ERRORS, []).append(
                    u'''No estan definits els administradors, sorry.''')
            else:
                missatge = ERROR_AL_PROGRAMA
                msg.text_missatge = missatge.format(msg.text_missatge)
                tipus_de_missatge = tipusMissatge(missatge)
                msg.tipus_de_missatge = tipus_de_missatge
                msg.save()
                strAdmins = u''
                separador = ''
                for administrador in administradors:
                    msg.envia_a_usuari(administrador, 'VI')
                    strAdmins += separador + u'Sr(a)' + unicode(administrador)
                    separador = u', '
                txtMsg = msg.text_missatge

                #envio al que ho envia:
                missatge = ACUS_REBUT_ERROR_AL_PROGRAMA
                tipus_de_missatge = tipusMissatge(missatge)
                msg = Missatge(remitent=user,
                               text_missatge=missatge.format(txtMsg),
                               tipus_de_missatge=tipus_de_missatge)
                msg.envia_a_usuari(user, 'PI')

                url = '/missatgeria/elMeuMur/'
                return HttpResponseRedirect(url)
    else:
        msgForm = msgFormF()

    formset.append(msgForm)

    for form in formset:
        for field in form.fields:
            form.fields[field].widget.attrs['class'] = "form-control"

    return render(
        request,
        'formset.html',
        {
            'formset':
            formset,
            'head':
            u'''Avís a administradors. En cas d'error, sisplau, detalla clarament totes les passes per reproduir l'error.''',
        },
    )
                if self.matmulla:
                    no_ha_passat_llista |=  Q( estat__codi_estat = 'F' )                    
                condicio = alumnes_a_esborrar & ~te_incidencies & ~te_expulsions & no_ha_passat_llista
                i.controlassistencia_set.filter( condicio ).delete()
                        
                self.flagPrimerDiaFet = ( i.dia_impartir >= self.impartir.dia_impartir )
                
        except Exception, e:
                errors.append(unicode(e))
        
        finally:
            self.flagPrimerDiaFet = True

        missatge = FI_PROCES_TREURE_ALUMNES
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge( remitent = self.usuari, text_missatge = missatge.format( self.impartir.horari.assignatura ), tipus_de_missatge = tipus_de_missatge)
        importancia = 'PI'

        if len(errors)>0:
            msg.afegeix_error(errors)
            importancia = 'VI'
            msg.save()
            administradors, _ = Group.objects.get_or_create( name = 'administradors' )
            missatge = FI_PROCES_TREURE_ALUMNES_AMB_ERRORS
            tipus_de_missatge = tipusMissatge(missatge)
            msgAdmins = Missatge( remitent = self.usuari, text_missatge = missatge.format( self.impartir ), tipus_de_missatge = tipus_de_missatge )
            msgAdmins.afegeix_error(errors)
            msgAdmins.save()
            msgAdmins.envia_a_grup(administradors, importancia)
                            
            msg.envia_a_usuari(self.usuari, importancia)
Ejemplo n.º 27
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}
    def run(self):        
        errors = []
        try:
            horaris_a_modificar = None

            if self.expandir:                
                horaris_a_modificar =  Q( horari__assignatura = self.impartir.horari.assignatura )
                horaris_a_modificar &= Q( horari__grup = self.impartir.horari.grup )
                horaris_a_modificar &= Q( horari__professor = self.impartir.horari.professor )
            else: 
                horaris_a_modificar = Q( horari = self.impartir.horari)
        
            #from presencia.models import EstatControlAssistencia
            #estat_pendent, _  = EstatControlAssistencia.objects.get_or_create( codi_estat = u'-', defaults={ u'nom_estat' : u'-----' } )
        
            #afegeixo l'alumne sempre que no hi sigui:
            a_partir_avui = Q( dia_impartir__gte = self.impartir.dia_impartir)
            
            pks = ( Impartir
                    .objects
                    .filter( horaris_a_modificar & a_partir_avui )
                    .values_list('id', flat=True)
                    .order_by( 'dia_impartir' )
                   )
            for pk in pks:
                i = Impartir.objects.get( pk = pk )
                alumnes_del_control = [ ca.alumne for ca in i.controlassistencia_set.all()]
                alumne_afegit = False
                for alumne in self.alumnes:
                    
                    if alumne not in alumnes_del_control:
    
                        if self.matmulla:
                            #esborro l'alumne de les altres imparticions de la mateixa hora:
                            mateix_alumne = Q( alumne = alumne )
                            mateixa_hora = Q( impartir__horari__hora = i.horari.hora )
                            mateix_dia = Q( impartir__dia_impartir = i.dia_impartir )
                            mateixa_imparticio = Q( impartir = i )
                            ControlAssistencia.objects.filter( mateix_alumne & mateixa_hora & mateix_dia & ~mateixa_imparticio  ).delete()
                        
                        #afegir
                        if alumne.data_baixa is None or alumne.data_baixa > i.dia_impartir:                                      
                            ca = ControlAssistencia( alumne = alumne, impartir = i)
                            #si ja han passar llista poso que falta:
                            falta = EstatControlAssistencia.objects.get( codi_estat = 'F' )
                            if i.dia_passa_llista is not None:
                                ca.estat = falta
                                ca.professor = User2Professor( self.usuari )
                            
                            ca.save()
                            alumne_afegit = True
                if i.pot_no_tenir_alumnes:
                    i.pot_no_tenir_alumnes = False
                    i.save()
                self.flagPrimerDiaFet = ( i.dia_impartir >= self.impartir.dia_impartir )


        except Exception as e:
            errors.append( traceback.format_exc() )

        finally:
            self.flagPrimerDiaFet = True
        missatge = FI_PROCES_AFEGIR_ALUMNES
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge( remitent = self.usuari, text_missatge = missatge.format( self.impartir.horari.assignatura ), tipus_de_missatge = tipus_de_missatge )
        importancia = 'PI'

        if len(errors)>0:
            missatge = FI_PROCES_AFEGIR_ALUMNES_AMB_ERRORS
            msg.afegeix_error([missatge,])
            msg.tipus_de_missatge = tipusMissatge(missatge)
            importancia = 'VI'
            msg.save()
            administradors, _ = Group.objects.get_or_create( name = 'administradors' )

            msgAdmins = Missatge( remitent = self.usuari, text_missatge = missatge.format( self.impartir ) )
            msgAdmins.afegeix_error(errors)
            msgAdmins.save()
            msgAdmins.envia_a_grup(administradors, importancia)
                            
            msg.envia_a_usuari(self.usuari, importancia)
        return errors
Ejemplo n.º 29
0
def professorsAcompanyants(request, pk, origen):

    credentials = tools.getImpersonateUser(request)
    (user, _) = credentials

    professor = User2Professor(user)

    instance = get_object_or_404(Sortida, pk=pk)
    instance.flag_clean_nomes_toco_alumnes = True

    professors_acompanyen_despres = set()
    professors_organitzen_despres = set()

    professors_acompanyen_abans = set(
        instance.altres_professors_acompanyants.all())
    professors_organitzen_abans = set(instance.professors_responsables.all())
    estat_abans = instance.estat

    fEsDireccioOrGrupSortides = request.user.groups.filter(
        name__in=[u"direcció", u"sortides"]).exists()
    potEntrar = (professor in instance.professors_responsables.all()
                 or professor in instance.altres_professors_acompanyants.all()
                 or fEsDireccioOrGrupSortides)

    if not potEntrar:
        raise Http404

    instance.credentials = credentials

    formIncidenciaF = modelform_factory(
        Sortida, fields=('altres_professors_acompanyants', ))

    if request.method == "POST":
        form = formIncidenciaF(request.POST, instance=instance)

        if form.is_valid():
            try:
                form.save()

                if instance.estat in ['R', 'G']:
                    professors_acompanyen_despres = set(
                        instance.altres_professors_acompanyants.all())
                    professors_organitzen_despres = set(
                        instance.professors_responsables.all())

                    acompanyen_nous = professors_acompanyen_despres - professors_acompanyen_abans
                    organitzen_nous = professors_organitzen_despres - professors_organitzen_abans

                    #missatge a acompanyants:
                    missatge = ACOMPANYANT_A_ACTIVITAT
                    txt = missatge.format(
                        sortida=instance.titol_de_la_sortida,
                        dia=instance.data_inici.strftime('%d/%m/%Y'))
                    tipus_de_missatge = tipusMissatge(missatge)
                    msg = Missatge(remitent=user,
                                   text_missatge=txt,
                                   tipus_de_missatge=tipus_de_missatge)
                    for nou in acompanyen_nous:
                        importancia = 'VI'
                        msg.envia_a_usuari(nou, importancia)

                    #missatge a responsables:
                    missatge = RESPONSABLE_A_ACTIVITAT
                    txt = RESPONSABLE_A_ACTIVITAT.format(
                        sortida=instance.titol_de_la_sortida,
                        dia=instance.data_inici.strftime('%d/%m/%Y'))
                    tipus_de_missatge = tipusMissatge(missatge)
                    msg = Missatge(remitent=user,
                                   text_missatge=txt,
                                   tipus_de_missatge=tipus_de_missatge)
                    for nou in organitzen_nous:
                        importancia = 'VI'
                        msg.envia_a_usuari(nou, importancia)

                nexturl = r'/sortides/sortides{origen}'.format(origen=origen)
                return HttpResponseRedirect(nexturl)
            except ValidationError as e:
                form._errors.setdefault(NON_FIELD_ERRORS,
                                        []).extend(e.messages)

    else:

        form = formIncidenciaF(instance=instance)

    for f in form.fields:
        form.fields[f].widget.attrs[
            'class'] = ' form-control ' + form.fields[f].widget.attrs.get(
                'class', "")

    #form.fields['altres_professors_acompanyants'].widget.attrs['style'] = "height: 500px;"
    #si no és propietari tot a disabled
    deshabilitat = (instance.id and
                    not (professor in instance.professors_responsables.all()
                         or fEsDireccioOrGrupSortides))

    if deshabilitat:
        for field in form.fields:
            form.fields[field].widget.attrs['disabled'] = u"disabled"

    return render(
        request,
        'formSortidaProfessorAcompanyant.html',
        {
            'form': form,
            'head': 'Sortides',
            'missatge': 'Sortides',
            'deshabilitat': '1==1' if deshabilitat else '1==2',
        },
    )
Ejemplo n.º 30
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)
Ejemplo n.º 31
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}
Ejemplo n.º 32
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}
    def run(self):
        errors = []
        try:
            horaris_a_modificar = None

            if self.expandir:
                horaris_a_modificar = Q(
                    horari__assignatura=self.impartir.horari.assignatura)
                horaris_a_modificar &= Q(
                    horari__grup=self.impartir.horari.grup)
                horaris_a_modificar &= Q(
                    horari__professor=self.impartir.horari.professor)
            else:
                horaris_a_modificar = Q(horari=self.impartir.horari)

            #from presencia.models import EstatControlAssistencia
            #estat_pendent, _  = EstatControlAssistencia.objects.get_or_create( codi_estat = u'-', defaults={ u'nom_estat' : u'-----' } )

            #afegeixo l'alumne sempre que no hi sigui:
            a_partir_avui = Q(dia_impartir__gte=self.impartir.dia_impartir)

            pks = (Impartir.objects.filter(
                horaris_a_modificar & a_partir_avui).values_list(
                    'id', flat=True).order_by('dia_impartir'))
            for pk in pks:
                i = Impartir.objects.get(pk=pk)
                alumnes_del_control = [
                    ca.alumne for ca in i.controlassistencia_set.all()
                ]
                alumne_afegit = False
                for alumne in self.alumnes:

                    if alumne not in alumnes_del_control:

                        if self.matmulla:
                            #esborro l'alumne de les altres imparticions de la mateixa hora:
                            mateix_alumne = Q(alumne=alumne)
                            mateixa_hora = Q(
                                impartir__horari__hora=i.horari.hora)
                            mateix_dia = Q(
                                impartir__dia_impartir=i.dia_impartir)
                            mateixa_imparticio = Q(impartir=i)
                            ControlAssistencia.objects.filter(
                                mateix_alumne & mateixa_hora & mateix_dia
                                & ~mateixa_imparticio).delete()

                        #afegir
                        if alumne.data_baixa is None or alumne.data_baixa > i.dia_impartir:
                            ca = ControlAssistencia(alumne=alumne, impartir=i)
                            #si ja han passar llista poso que falta:
                            falta = EstatControlAssistencia.objects.get(
                                codi_estat='F')
                            if i.dia_passa_llista is not None:
                                ca.estat = falta
                                ca.professor = User2Professor(self.usuari)

                            ca.save()
                            alumne_afegit = True
                if i.pot_no_tenir_alumnes:
                    i.pot_no_tenir_alumnes = False
                    i.save()
                self.flagPrimerDiaFet = (i.dia_impartir >=
                                         self.impartir.dia_impartir)

        except Exception as e:
            errors.append(traceback.format_exc())

        finally:
            self.flagPrimerDiaFet = True

        msg = Missatge(remitent=self.usuari,
                       text_missatge=u'Fi procés afegir alumnes a {0}'.format(
                           self.impartir.horari.assignatura))
        importancia = 'PI'

        if len(errors) > 0:
            msg.afegeix_error([
                u"Procés finalitzat amb errors. S'ha enviat incidència als administradors.",
            ])
            importancia = 'VI'
            msg.save()
            administradors, _ = Group.objects.get_or_create(
                name='administradors')

            msgAdmins = Missatge(
                remitent=self.usuari,
                text_missatge=u'Fi procés afegir alumnes a {0} amb errors'.
                format(self.impartir))
            msgAdmins.afegeix_error(errors)
            msgAdmins.save()
            msgAdmins.envia_a_grup(administradors, importancia)

            msg.envia_a_usuari(self.usuari, importancia)
        return errors
Ejemplo n.º 34
0
def enviaMissatgeTutors( request ):
    
    credentials = tools.getImpersonateUser(request) 
    (user, l4) = credentials   
    
    formset = []
    msgFormF = modelform_factory(Missatge, fields=( 'text_missatge', ) )
    
    if request.method == 'POST':        
        msg = Missatge( remitent = user )
        msg.credentials = credentials
        formAlumne = triaAlumneForm( data = request.POST)
        formData= dataForm( data = request.POST  )
        msgForm = msgFormF( data = request.POST, instance = msg )        
        
        if formAlumne.is_valid() and msgForm.is_valid() and formData.is_valid():
            alumne = formAlumne.cleaned_data['alumne']
            tutors = alumne.tutorsDeLAlumne()
            data = formData.cleaned_data['data']
            if len( tutors ) == 0:
                formAlumne._errors.setdefault(NON_FIELD_ERRORS, []).append(  u'''No trobat el tutor d'aquest alumne. Cal trucar al cap d'estudis.'''  )
            else:
                msg.save()
                strTutors = u''
                separador = ''
                for tutor in tutors:
                    txt = u'''Missatge relatiu al teu alumne tutorat {0}: Amb data {1}, {2}'''.format( unicode(alumne), unicode(data), msg.text_missatge)
                    msg.text_missatge = txt
                    msg.envia_a_usuari(tutor.getUser(), 'IN')
                    msg.enllac = '/tutoria/justificaFaltes/{0}/{1}/{2}/{3}'.format( alumne.pk, data.year, data.month, data.day )
                    msg.save()
                    strTutors += separador + u'Sr(a)' + unicode(tutor )
                    separador = u', '
                txtMsg = msg.text_missatge
                
                #envio al que ho envia:
                msg = Missatge( remitent = user, text_missatge = u'''Avís a tutors de l'alumne {0} enviat a {1}. El text de l'avís és: "{2}"'''.format( alumne, strTutors, txtMsg ) )
                msg.envia_a_usuari(user, 'PI')
                
                url = '/missatgeria/elMeuMur/'  
                return HttpResponseRedirect( url )  
    else:
        formAlumne = triaAlumneForm( )
        formData = dataForm(  label='Data', help_text=u'El text del missatge començarà per: Amb data ______, ' )        
        msgForm = msgFormF(  )
    
    formData.fields['data'].required = True
    
    formset.append( formAlumne )
    formset.append( formData )
    formset.append( msgForm )
        
    return render_to_response(
                'formset.html',
                    {'formset': formset,
                     'head': 'Avís a tutors.' ,
                    },
                    context_instance=RequestContext(request))
Ejemplo n.º 35
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}
Ejemplo n.º 36
0
                condicio = alumnes_a_esborrar & ~te_incidencies & ~te_expulsions & no_ha_passat_llista
                i.controlassistencia_set.filter(condicio).delete()

                self.flagPrimerDiaFet = (i.dia_impartir >=
                                         self.impartir.dia_impartir)

        except Exception, e:
            errors.append(unicode(e))

        finally:
            self.flagPrimerDiaFet = True

        missatge = FI_PROCES_TREURE_ALUMNES
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=self.usuari,
                       text_missatge=missatge.format(
                           self.impartir.horari.assignatura),
                       tipus_de_missatge=tipus_de_missatge)
        importancia = 'PI'

        if len(errors) > 0:
            msg.afegeix_error(errors)
            importancia = 'VI'
            msg.save()
            administradors, _ = Group.objects.get_or_create(
                name='administradors')
            missatge = FI_PROCES_TREURE_ALUMNES_AMB_ERRORS
            tipus_de_missatge = tipusMissatge(missatge)
            msgAdmins = Missatge(remitent=self.usuari,
                                 text_missatge=missatge.format(self.impartir),
                                 tipus_de_missatge=tipus_de_missatge)
            msgAdmins.afegeix_error(errors)
Ejemplo n.º 37
0
    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

    msg = Missatge(
        remitent=usuari,
        text_missatge=
        "Actualització d'horaris realitzada, recorda reprogramar les classes.",
        enllac="/presencia/regeneraImpartir")
    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)
Ejemplo n.º 38
0
def enviaMissatgeTutors(request):

    credentials = tools.getImpersonateUser(request)
    (user, l4) = credentials

    formset = []
    msgFormF = modelform_factory(Missatge, fields=('text_missatge', ))

    if request.method == 'POST':
        msg = Missatge(remitent=user)
        msg.credentials = credentials
        formAlumne = triaAlumneSelect2Form(data=request.POST)
        formData = dataForm(data=request.POST)
        formData.fields['data'].required = True
        msgForm = msgFormF(data=request.POST, instance=msg)

        if formAlumne.is_valid() and msgForm.is_valid() and formData.is_valid(
        ):
            alumne = formAlumne.cleaned_data['alumne']
            tutors = alumne.tutorsDeLAlumne()
            data = formData.cleaned_data['data']
            if len(tutors) == 0:
                formAlumne._errors.setdefault(NON_FIELD_ERRORS, []).append(
                    u'''No trobat el tutor d'aquest alumne. Cal trucar al cap d'estudis.'''
                )
            else:
                msg.save()
                request.session['consergeria_darrera_data'] = data
                strTutors = u''
                separador = ''
                for tutor in tutors:
                    txt = u'''Missatge relatiu al teu alumne tutorat {0}: Amb data {1}, {2}'''.format(
                        unicode(alumne), unicode(data), msg.text_missatge)
                    msg.text_missatge = txt
                    msg.envia_a_usuari(tutor.getUser(), 'IN')
                    msg.enllac = '/tutoria/justificaFaltes/{0}/{1}/{2}/{3}'.format(
                        alumne.pk, data.year, data.month, data.day)
                    msg.save()
                    strTutors += separador + u'Sr(a)' + unicode(tutor)
                    separador = u', '
                txtMsg = msg.text_missatge

                #envio al que ho envia:
                msg = Missatge(
                    remitent=user,
                    text_missatge=
                    u'''Avís a tutors de l'alumne {0} enviat a {1}. El text de l'avís és: "{2}"'''
                    .format(alumne, strTutors, txtMsg))
                msg.envia_a_usuari(user, 'PI')

                url = '/missatgeria/elMeuMur/'
                return HttpResponseRedirect(url)
    else:

        consergeria_darrera_data = request.session.get(
            'consergeria_darrera_data', datetime.today())
        formAlumne = triaAlumneSelect2Form()
        formData = dataForm(
            label='Data',
            help_text=u'El text del missatge començarà per: Amb data ______, ',
            initial={'data': consergeria_darrera_data})
        formData.fields['data'].required = True
        msgForm = msgFormF()

    formset.append(formAlumne)
    formset.append(formData)
    formset.append(msgForm)

    return render_to_response('formset.html', {
        'formset': formset,
        'head': 'Avís a tutors.',
    },
                              context_instance=RequestContext(request))
Ejemplo n.º 39
0
def professorsAcompanyants(request, pk, origen):

    credentials = tools.getImpersonateUser(request)
    (user, _) = credentials

    professor = User2Professor(user)

    instance = get_object_or_404(Sortida, pk=pk)
    instance.flag_clean_nomes_toco_alumnes = True

    professors_acompanyen_despres = set()
    professors_organitzen_despres = set()

    professors_acompanyen_abans = set(
        instance.altres_professors_acompanyants.all())
    professors_organitzen_abans = set(instance.professors_responsables.all())
    estat_abans = instance.estat

    fEsDireccioOrGrupSortides = request.user.groups.filter(
        name__in=[u"direcció", u"sortides"]).exists()
    potEntrar = (professor in instance.professors_responsables.all()
                 or professor in instance.altres_professors_acompanyants.all()
                 or fEsDireccioOrGrupSortides)

    if not potEntrar:
        raise Http404

    instance.credentials = credentials

    formIncidenciaF = modelform_factory(
        Sortida, fields=('altres_professors_acompanyants', ))

    if request.method == "POST":
        form = formIncidenciaF(request.POST, instance=instance)

        if form.is_valid():
            try:
                form.save()

                if instance.estat in ['R', 'G']:
                    professors_acompanyen_despres = set(
                        instance.altres_professors_acompanyants.all())
                    professors_organitzen_despres = set(
                        instance.professors_responsables.all())

                    acompanyen_nous = professors_acompanyen_despres - professors_acompanyen_abans
                    organitzen_nous = professors_organitzen_despres - professors_organitzen_abans

                    #missatge a acompanyants:
                    txt = u"""Has estat afegit com a professor acompanyant a l'activitat {sortida} 
                    del dia {dia}
                    """.format(sortida=instance.titol_de_la_sortida,
                               dia=instance.data_inici.strftime('%d/%m/%Y'))
                    msg = Missatge(remitent=user, text_missatge=txt)
                    for nou in acompanyen_nous:
                        importancia = 'VI'
                        msg.envia_a_usuari(nou, importancia)

                    #missatge a responsables:
                    txt = u"""Has estat afegit com a professor responsable a l'activitat {sortida} 
                    del dia {dia}
                    """.format(sortida=instance.titol_de_la_sortida,
                               dia=instance.data_inici.strftime('%d/%m/%Y'))
                    msg = Missatge(remitent=user, text_missatge=txt)
                    for nou in organitzen_nous:
                        importancia = 'VI'
                        msg.envia_a_usuari(nou, importancia)

                nexturl = r'/sortides/sortides{origen}'.format(origen=origen)
                return HttpResponseRedirect(nexturl)
            except ValidationError, e:
                form._errors.setdefault(NON_FIELD_ERRORS,
                                        []).extend(e.messages)
Ejemplo n.º 40
0
def enviaMissatgeAdministradors(request):

    credentials = tools.getImpersonateUser(request)
    (user, l4) = credentials

    formset = []
    msgFormF = modelform_factory(Missatge, fields=('text_missatge', ))

    if request.method == 'POST':
        msg = Missatge(remitent=user)
        msg.credentials = credentials
        msgForm = msgFormF(data=request.POST, instance=msg)

        if msgForm.is_valid():
            administradors = Group.objects.get_or_create(
                name='administradors')[0].user_set.all()
            if len(administradors) == 0:
                msgForm._errors.setdefault(NON_FIELD_ERRORS, []).append(
                    u'''No estan definits els administradors, sorry.''')
            else:
                msg.text_missatge = u'''Avís d'error al programa: {0}'''.format(
                    msg.text_missatge)
                msg.save()
                strAdmins = u''
                separador = ''
                for administrador in administradors:
                    msg.envia_a_usuari(administrador, 'VI')
                    strAdmins += separador + u'Sr(a)' + unicode(administrador)
                    separador = u', '
                txtMsg = msg.text_missatge

                #envio al que ho envia:
                msg = Missatge(
                    remitent=user,
                    text_missatge=
                    u'''Avís a administradors enviat correctament. El text de l'avís és: "{0}"'''
                    .format(txtMsg))
                msg.envia_a_usuari(user, 'PI')

                url = '/missatgeria/elMeuMur/'
                return HttpResponseRedirect(url)
    else:
        msgForm = msgFormF()

    formset.append(msgForm)

    return render_to_response('formset.html', {
        'formset':
        formset,
        'head':
        u'''Avís a administradors. En cas d'error, sisplau, detalla clarament totes les passes per reproduir l'error.''',
    },
                              context_instance=RequestContext(request))
Ejemplo n.º 41
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}
Ejemplo n.º 42
0
def sortidaEdit(request, pk=None, clonar=False, origen=False):
    credentials = tools.getImpersonateUser(request)
    (user, _) = credentials

    es_post = (request.method == "POST")

    professor = User2Professor(user)

    professors_acompanyen_abans = set()
    professors_acompanyen_despres = set()

    professors_organitzen_abans = set()
    professors_organitzen_despres = set()

    fEsDireccioOrGrupSortides = request.user.groups.filter(name__in=[u"direcció", u"sortides"]).exists()
    if bool(pk) and not clonar:
        instance = get_object_or_404(Sortida, pk=pk)
        potEntrar = (professor in instance.professors_responsables.all() or
                     professor in instance.altres_professors_acompanyants.all() or
                     fEsDireccioOrGrupSortides)
        if not potEntrar:
            raise Http404
        professors_acompanyen_abans = set(instance.altres_professors_acompanyants.all())
        professors_organitzen_abans = set(instance.professors_responsables.all())
    elif bool(pk) and clonar:
        instance = get_object_or_404(Sortida, pk=pk)
        instance.pk = None
        instance.estat = 'E'
        instance.titol_de_la_sortida = u"**CLONADA** " + instance.titol_de_la_sortida
        instance.esta_aprovada_pel_consell_escolar = 'P'
        instance.professor_que_proposa = professor
    # instance.professors_responsables = None
    #         instance.altres_professors_acompanyants = None
    #         instance.tutors_alumnes_convocats = None
    #         instance.alumnes_convocats = None
    #         instance.alumnes_que_no_vindran = None
    #         instance.alumnes_justificacio = None
    #         instance.professor_que_proposa_id = None

    else:
        instance = Sortida()
        instance.professor_que_proposa = professor

    instance.credentials = credentials

    # És un formulari reduit?
    if settings.CUSTOM_FORMULARI_SORTIDES_REDUIT:
        exclude = ('alumnes_convocats', 'alumnes_que_no_vindran', 'alumnes_justificacio', 'data_inici', 'franja_inici', 'data_fi',
                   'franja_fi', 'codi_de_barres', 'empresa_de_transport', 'pagament_a_empresa_de_transport',
                   'pagament_a_altres_empreses', 'feina_per_als_alumnes_aula')
    else:
        exclude = ('alumnes_convocats', 'alumnes_que_no_vindran', 'alumnes_justificacio',)

    formIncidenciaF = modelform_factory(Sortida, exclude=exclude)

    if request.method == "POST":
        post_mutable = request.POST.copy()
        if 'esta_aprovada_pel_consell_escolar' not in post_mutable:
            post_mutable['esta_aprovada_pel_consell_escolar'] = 'P'

        form = formIncidenciaF(post_mutable, instance=instance)

        if form.is_valid():
            # Omplir camps de classes afectades
            if settings.CUSTOM_FORMULARI_SORTIDES_REDUIT:

                #Buscar primera impartició afectada
                primeraimparticio = Impartir.objects.filter(dia_impartir__gte=instance.calendari_desde.date(),
                                                            horari__hora__hora_inici__gte=instance.calendari_desde.time()).order_by(
                                                            'dia_impartir', 'horari__hora__hora_inici').first()

                try:
                    instance.data_inici = primeraimparticio.dia_impartir
                    instance.franja_inici = primeraimparticio.horari.hora
                # Si no hi ha primera impartició afectada s'agafa la del primer dia lectiu posterior
                except:
                    instance.data_inici = Impartir.objects.filter(
                        dia_impartir__gt=instance.calendari_desde.date()).order_by(
                        'dia_impartir').first().dia_impartir
                    instance.franja_inici = FranjaHoraria.objects.order_by('hora_inici').first()

                # Buscar darrera impartició afectada
                darreraimparticio = Impartir.objects.filter(dia_impartir__lte=instance.calendari_finsa.date(),
                                                            horari__hora__hora_fi__lte=instance.calendari_finsa.time()).order_by(
                                                            'dia_impartir', 'horari__hora__hora_fi').last()

                try:
                    instance.data_fi = darreraimparticio.dia_impartir
                    instance.franja_fi = darreraimparticio.horari.hora
                # Si no hi ha darrera impartició afectada s'agafa la del primer dia lectiu anterior
                except:
                    instance.data_fi = Impartir.objects.filter(dia_impartir__lt=instance.calendari_finsa.date()).order_by(
                                                            'dia_impartir').last().dia_impartir
                    instance.franja_fi = FranjaHoraria.objects.order_by('hora_inici').last()




                # Comprovem si la sortida en realitat no afecta cap hora d'impartició, això passa quan la data inicial > data final
                if (instance.data_fi < instance.data_inici):
                    instance.data_inici = None
                    instance.data_fi = None
                    instance.franja_inici = None
                    instance.franja_fi = None
            form.save()

            if origen == "Meves":
                messages.warning(request,
                                 SafeText(u"""RECORDA: Una vegada enviades les dades, 
                                  has de seleccionar els <a href="{0}">alumnes convocats</a> i els 
                                  <a href="{1}">alumnes que no hi van</a> 
                                  des del menú desplegable ACCIONS""".format(
                                     "/sortides/alumnesConvocats/{id}".format(id=instance.id),
                                     "/sortides/alumnesFallen/{id}".format(id=instance.id),
                                 )
                                 ))

            professors_acompanyen_despres = set(instance.altres_professors_acompanyants.all())
            professors_organitzen_despres = set(instance.professors_responsables.all())

            acompanyen_nous = professors_acompanyen_despres - professors_acompanyen_abans
            organitzen_nous = professors_organitzen_despres - professors_organitzen_abans

            # helper missatges:
            data_inici = u"( data activitat encara no informada )"
            if instance.data_inici is not None:
                data_inici = """del dia {dia}""".format(dia=instance.data_inici.strftime('%d/%m/%Y'))

                # missatge a acompanyants:
            missatge = ACOMPANYANT_A_ACTIVITAT
            txt = missatge.format(sortida=instance.titol_de_la_sortida, dia=data_inici)
            enllac = reverse('sortides__sortides__edit_by_pk', kwargs={'pk': instance.id})
            tipus_de_missatge = tipusMissatge(missatge)
            msg = Missatge(remitent=user, text_missatge=txt, enllac=enllac, tipus_de_missatge=tipus_de_missatge)
            for nou in acompanyen_nous:
                importancia = 'VI'
                msg.envia_a_usuari(nou, importancia)

                # missatge a responsables:
            missatge = RESPONSABLE_A_ACTIVITAT
            txt = missatge.format(sortida=instance.titol_de_la_sortida, dia=data_inici)
            tipus_de_missatge = tipusMissatge(missatge)
            msg = Missatge(remitent=user, text_missatge=txt, tipus_de_missatge=tipus_de_missatge)
            for nou in organitzen_nous:
                importancia = 'VI'
                msg.envia_a_usuari(nou, importancia)

            nexturl = r"/sortides/sortides{origen}".format(origen=origen)
            return HttpResponseRedirect(nexturl)

    else:

        form = formIncidenciaF(instance=instance)

    # form.fields['estat'].widget = forms.RadioSelect( choices = form.fields['estat'].widget.choices )
    widgetBootStrapButtonSelect = bootStrapButtonSelect()
    widgetBootStrapButtonSelect.choices = form.fields['estat'].widget.choices
    form.fields['estat'].widget = widgetBootStrapButtonSelect

    form.fields["alumnes_a_l_aula_amb_professor_titular"].widget.attrs['style'] = u"width: 3%"
    form.fields["calendari_public"].widget.attrs['style'] = u"width: 3%"
    for f in form.fields:
        form.fields[f].widget.attrs['class'] = ' form-control ' + form.fields[f].widget.attrs.get('class', "")

    form.fields['calendari_desde'].widget = DateTimeTextImput()
    form.fields['calendari_finsa'].widget = DateTimeTextImput()
    form.fields['termini_pagament'].widget = DateTimeTextImput()

    if not fEsDireccioOrGrupSortides:
        form.fields["esta_aprovada_pel_consell_escolar"].widget.attrs['disabled'] = u"disabled"
        if not settings.CUSTOM_FORMULARI_SORTIDES_REDUIT:
            form.fields["codi_de_barres"].widget.attrs['disabled'] = u"disabled"
        form.fields["informacio_pagament"].widget.attrs['disabled'] = u"disabled"

    # si no és propietari tot a disabled
    deshabilitat = (instance.id and
                    not (professor in instance.professors_responsables.all() or
                         fEsDireccioOrGrupSortides)
                    )

    if deshabilitat:
        for field in form.fields:
            form.fields[field].widget.attrs['disabled'] = u"disabled"
        form.fields['estat'].label += u": {0} ".format(instance.get_estat_display())

    return render(
        request,
        'formSortida.html',
        {'form': form,
         'head': 'Sortides',
         'missatge': 'Sortides',
         'deshabilitat': '1==1' if deshabilitat else '1==2',
         },
    )
Ejemplo n.º 43
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 }
Ejemplo n.º 44
0
def impartir_post_save(sender, instance, created, **kwargs):

    # Mantenir reserva o assignar-li una de nova
    # Si el professor havia fet un canvi d'aula cal respectar-ho.
    aula_informada_a_l_horari = instance.horari.aula is not None and bool( instance.horari.aula )
    te_reserva = instance.reserva is not None
    es_reserva_manual = te_reserva and instance.reserva.es_reserva_manual
    cal_assignar_nova_reserva = not te_reserva and aula_informada_a_l_horari and not es_reserva_manual
    if cal_assignar_nova_reserva:
        reserves = ReservaAula.objects.filter( aula=instance.horari.aula,
                                               dia_reserva=instance.dia_impartir,
                                               hora=instance.horari.hora )

        reserves_manuals = list( reserves.filter( es_reserva_manual = True ) )
        reserves_automatiques = list( reserves.filter(es_reserva_manual=False) )
        
        usuari_notificacions, new = User.objects.get_or_create( username = '******')
        for reserva in reserves_manuals:
            impartir = reserva.impartir_set.first()
            if impartir:
                missatge = SISTEMA_ANULA_RESERVA
                msg = missatge.format(impartir)
                reserva.aula = impartir.horari.aula
                reserva.es_reserva_manual = False
                fake_l4_credentials = (None, True ) 
                reserva.credentials = fake_l4_credentials
                reserva.save()
                tipus_de_missatge = tipusMissatge(missatge)
                msg = Missatge(
                    remitent=usuari_notificacions,
                    text_missatge=msg,
                    tipus_de_missatge = tipus_de_missatge,
                    )
                msg.envia_a_usuari(reserva.usuari,'VI')                   
            else:
                reserva.delete()        
                
        #if bool(reserves_automatiques):
        #    reserva_a_assignar = reserves_automatiques[0]
        #else:
        reserva_a_assignar = ReservaAula(aula=instance.horari.aula,
                                      dia_reserva=instance.dia_impartir,
                                      hora_inici=instance.horari.hora.hora_inici,
                                      hora_fi=instance.horari.hora.hora_fi,
                                      hora=instance.horari.hora,
                                      usuari=instance.horari.professor,
                                      motiu=u"Docència",
                                      es_reserva_manual=False )
        reserva_a_assignar.save()

        instance.__class__.objects.filter(pk=instance.pk).update(reserva_id=reserva_a_assignar.pk)
        instance.refresh_from_db()

    #bussiness rule:
    #si un professor passa llista, també passa llista de 
    #totes les imparticions que no tinguin alumnes.
    if instance.professor_passa_llista is not None:
        Impartir = apps.get_model('presencia','Impartir')
        altresHores = Impartir.objects.filter( horari__hora = instance.horari.hora, 
                                               dia_impartir = instance.dia_impartir,
                                               controlassistencia__isnull = True,
                                               horari__professor = instance.horari.professor,
                                               horari__grup__isnull = False  )
        
        altresHores.update( professor_passa_llista = instance.professor_passa_llista,
                           dia_passa_llista = instance.dia_passa_llista )
    
    pass
Ejemplo n.º 45
0
def impartir_post_save(sender, instance, created, **kwargs):

    # Mantenir reserva o assignar-li una de nova
    # Si el professor havia fet un canvi d'aula cal respectar-ho.
    aula_informada_a_l_horari = instance.horari.aula is not None and bool(
        instance.horari.aula)
    te_reserva = instance.reserva is not None
    es_reserva_manual = te_reserva and instance.reserva.es_reserva_manual
    cal_assignar_nova_reserva = not te_reserva and aula_informada_a_l_horari and not es_reserva_manual
    if cal_assignar_nova_reserva:
        reserves = ReservaAula.objects.filter(
            aula=instance.horari.aula,
            dia_reserva=instance.dia_impartir,
            hora=instance.horari.hora)

        reserves_manuals = list(reserves.filter(es_reserva_manual=True))
        reserves_automatiques = list(reserves.filter(es_reserva_manual=False))

        usuari_notificacions, new = User.objects.get_or_create(username='******')
        for reserva in reserves_manuals:
            impartir = reserva.impartir_set.first()
            if impartir:
                missatge = SISTEMA_ANULA_RESERVA
                msg = missatge.format(impartir)
                reserva.aula = impartir.horari.aula
                reserva.es_reserva_manual = False
                fake_l4_credentials = (None, True)
                reserva.credentials = fake_l4_credentials
                reserva.save()
                tipus_de_missatge = tipusMissatge(missatge)
                msg = Missatge(
                    remitent=usuari_notificacions,
                    text_missatge=msg,
                    tipus_de_missatge=tipus_de_missatge,
                )
                msg.envia_a_usuari(reserva.usuari, 'VI')
            else:
                reserva.delete()

        #if bool(reserves_automatiques):
        #    reserva_a_assignar = reserves_automatiques[0]
        #else:
        reserva_a_assignar = ReservaAula(
            aula=instance.horari.aula,
            dia_reserva=instance.dia_impartir,
            hora_inici=instance.horari.hora.hora_inici,
            hora_fi=instance.horari.hora.hora_fi,
            hora=instance.horari.hora,
            usuari=instance.horari.professor,
            motiu=u"Docència",
            es_reserva_manual=False)
        reserva_a_assignar.save()

        instance.__class__.objects.filter(pk=instance.pk).update(
            reserva_id=reserva_a_assignar.pk)
        instance.refresh_from_db()

    #bussiness rule:
    #si un professor passa llista, també passa llista de
    #totes les imparticions que no tinguin alumnes.
    if instance.professor_passa_llista is not None:
        Impartir = apps.get_model('presencia', 'Impartir')
        altresHores = Impartir.objects.filter(
            horari__hora=instance.horari.hora,
            dia_impartir=instance.dia_impartir,
            controlassistencia__isnull=True,
            horari__professor=instance.horari.professor,
            horari__grup__isnull=False)

        altresHores.update(
            professor_passa_llista=instance.professor_passa_llista,
            dia_passa_llista=instance.dia_passa_llista)

    pass
Ejemplo n.º 46
0
    def run(self):
        errors = []
        try:
            horaris_a_modificar = Q(horari=self.impartir.horari)
            if self.expandir:
                horaris_a_modificar = Q(
                    horari__assignatura=self.impartir.horari.assignatura)
                horaris_a_modificar &= Q(
                    horari__grup=self.impartir.horari.grup)
                horaris_a_modificar &= Q(
                    horari__professor=self.impartir.horari.professor)

            #trec els alumnes:
            a_partir_avui = Q(dia_impartir__gte=self.impartir.dia_impartir)

            pks = (Impartir.objects.filter(
                horaris_a_modificar & a_partir_avui).values_list(
                    'id', flat=True).order_by('dia_impartir'))
            for pk in pks:
                i = Impartir.objects.get(pk=pk)
                alumnes_a_esborrar = Q(alumne__in=self.alumnes)
                te_incidencies = Q(incidencia__isnull=False)
                te_expulsions = Q(expulsio__isnull=False)
                no_ha_passat_llista = Q(estat__isnull=True)
                if self.matmulla:
                    no_ha_passat_llista |= Q(estat__codi_estat='F')
                condicio = alumnes_a_esborrar & ~te_incidencies & ~te_expulsions & no_ha_passat_llista
                i.controlassistencia_set.filter(condicio).delete()

                self.flagPrimerDiaFet = (i.dia_impartir >=
                                         self.impartir.dia_impartir)

        except Exception as e:
            errors.append(unicode(e))

        finally:
            self.flagPrimerDiaFet = True

        missatge = FI_PROCES_TREURE_ALUMNES
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=self.usuari,
                       text_missatge=missatge.format(
                           self.impartir.horari.assignatura),
                       tipus_de_missatge=tipus_de_missatge)
        importancia = 'PI'

        if len(errors) > 0:
            msg.afegeix_error(errors)
            importancia = 'VI'
            msg.save()
            administradors, _ = Group.objects.get_or_create(
                name='administradors')
            missatge = FI_PROCES_TREURE_ALUMNES_AMB_ERRORS
            tipus_de_missatge = tipusMissatge(missatge)
            msgAdmins = Missatge(remitent=self.usuari,
                                 text_missatge=missatge.format(self.impartir),
                                 tipus_de_missatge=tipus_de_missatge)
            msgAdmins.afegeix_error(errors)
            msgAdmins.save()
            msgAdmins.envia_a_grup(administradors, importancia)

            msg.envia_a_usuari(self.usuari, importancia)

        return errors