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