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 assignaComentarisAAules(request): (user, l4) = tools.getImpersonateUser(request) professor = User2Professor(user) errors = [] warnings = [] infos = [] if request.method == 'POST': form = carregaComentarisAulaForm(request.POST, request.FILES) if form.is_valid(): f = request.FILES['fitxerComentaris'] reader = csv.DictReader(f) info_nAulesLlegides = 0 info_nAulesCreades = 0 info_nComentarisAfegits = 0 AulesCreades = [] ComentarisAfegits = [] f.seek(0) for row in reader: info_nAulesLlegides += 1 nom_aula = unicode(row['CODI'],'iso-8859-1') descripcio_aula = unicode(row['NOM'],'iso-8859-1') if nom_aula !='': a, created = Aula.objects.get_or_create(nom_aula=nom_aula, defaults={ 'horari_lliure': False, 'reservable': True}) if created: info_nAulesCreades += 1 AulesCreades.append(a.nom_aula) warnings.append(u'{0}: Aula creada nova'.format(a.nom_aula)) a.descripcio_aula = descripcio_aula info_nComentarisAfegits += 1 ComentarisAfegits.append(descripcio_aula) a.save() else: errors.append('S\'han trobat aules sense nom!!!') warnings.append(u'Total aules noves creades: {0}'.format(info_nAulesCreades)) infos.append(u'Total comentaris afegits: {0}'.format(info_nComentarisAfegits)) resultat = {'errors': errors, 'warnings': warnings, 'infos': infos} return render( request, 'resultat.html', {'head': 'Resultat càrrega comentaris aules', 'msgs': resultat}, ) else: form = carregaComentarisAulaForm() return render( request, 'afegirComentarisAAules.html', {'form': form}, )
def reportLlistaTutorsIndividualitzats(): tutors_ids = TutorIndividualitzat.objects.all().values_list('pk') report = [] #--sense alumnes................. taula = tools.classebuida() taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 30 capcelera.contingut = u'{0}'.format('Professor') taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 50 capcelera.contingut = u'{0}'.format('Alumnes amb tutoria individualitzada') taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 20 capcelera.contingut = u'{0}'.format('Accions') taula.capceleres.append(capcelera) taula.fileres = [] for tutor in Professor.objects.all(): filera = [] #-nom-------------------------------------------- camp = tools.classebuida() camp.enllac = '' camp.contingut = unicode(tutor) filera.append(camp) #-alumnes.................... camp = tools.classebuida() camp.multipleContingut = [] for alumne in Alumne.objects.filter( tutorindividualitzat__professor=tutor): camp.enllac = '' camp.multipleContingut.append(( unicode(alumne) + ' (' + unicode(alumne.grup) + ')', None, )) filera.append(camp) #-accions-------------------------------------------- camp = tools.classebuida() camp.enllac = '/alumnes/gestionaAlumnesTutor/{0}'.format(tutor.pk) camp.contingut = unicode(u"Gestiona Alumnes") filera.append(camp) taula.fileres.append(filera) report.append(taula) return report
def __str__(self): obsolet = u'(Obsolet:) ' if not self.es_actiu else '' aula = u" a l'aula " + self.get_nom_aula if self.get_nom_aula else '' grup = u' al grup ' + unicode(self.grup) if self.grup else '' return obsolet + u'El professor ' + unicode( self.professor) + u' imparteix ' + unicode( self.assignatura) + ' el ' + unicode( self.dia_de_la_setmana) + ' de ' + unicode( self.hora) + aula + grup
def gestionaAlumnesTutor( request , pk ): credentials = tools.getImpersonateUser(request) (user, _ ) = credentials professor = Professor.objects.get( pk = int(pk) ) head=u'Tutors Individualitzats' infoForm = [] formset = [] if request.method == 'POST': totBe = True nous_alumnes_tutor = [] for grup in Grup.objects.filter( alumne__isnull = False ).distinct().order_by('descripcio_grup'): #http://www.ibm.com/developerworks/opensource/library/os-django-models/index.html?S_TACT=105AGX44&S_CMP=EDU form=triaMultiplesAlumnesForm( request.POST, prefix=str( grup.pk ), queryset = grup.alumne_set.all() , etiqueta = unicode( grup ) ) formset.append( form ) if form.is_valid(): for alumne in form.cleaned_data['alumnes']: nous_alumnes_tutor.append( alumne ) else: totBe = False if totBe: professor.tutorindividualitzat_set.all().delete() for alumne in nous_alumnes_tutor: ti = TutorIndividualitzat( professor = professor, alumne = alumne ) ti.credentials = credentials ti.save() return HttpResponseRedirect( '/alumnes/llistaTutorsIndividualitzats/' ) else: for grup in Grup.objects.filter( alumne__isnull = False ).distinct().order_by('descripcio_grup'): #http://www.ibm.com/developerworks/opensource/library/os-django-models/index.html?S_TACT=105AGX44&S_CMP=EDU inicial= [c.pk for c in grup.alumne_set.filter( tutorindividualitzat__professor = professor ) ] form=triaMultiplesAlumnesForm( prefix=str( grup.pk ), queryset = grup.alumne_set.all() , etiqueta = unicode( grup ) , initial = {'alumnes': inicial } ) formset.append( form ) return render( request, "formset.html", {"formset": formset, "head": head, "formSetDelimited": True, } )
def report(request, pk): formset = [] totBe = True head = u"Tria alumnes" qualitativa = AvaluacioQualitativa.objects.get(pk=pk) if request.method == 'POST': form = triaQualitativaForm(request.POST, prefix='qua') formset.append(form) alumnes = [] grups = [] for grup in qualitativa.grups.all(): form = alumnesGrupForm(request.POST, prefix=str(grup.pk), queryset=grup.alumne_set.all(), etiqueta=unicode(grup)) if form.is_valid(): alumnes += form.cleaned_data['alumnes'] if form.cleaned_data['totElGrup']: grups.append(grup) else: totBe = False if totBe: from . import reports return reports.reportQualitativa(qualitativa, alumnes, grups, request) else: form = triaQualitativaForm(initial={'qualitativa': qualitativa}, prefix='qua') formset.append(form) for grup in qualitativa.grups.all(): #http://www.ibm.com/developerworks/opensource/library/os-django-models/index.html?S_TACT=105AGX44&S_CMP=EDU form = alumnesGrupForm(prefix=str(grup.pk), queryset=grup.alumne_set.all(), etiqueta=unicode(grup)) formset.append(form) return render( request, "formset.html", { "formset": formset, "head": head, "formSetDelimited": True, }, )
def comprovar_grups(f): errors = [] warnings = [] infos = [] # Carregar full de càlcul wb2 = load_workbook(f) full = wb2.active max_row = full.max_row max_column = full.max_column # iterar sobre les files colname = [u'Grup Classe'] rows = list(wb2.active.rows) col_index = { n: cell.value for n, cell in enumerate(rows[5]) if cell.value in colname } # Començar a la fila 6, les anteriors són brossa if col_index is None: errors.append(u"No trobat el grup classe al fitxer d'importació") return {'errors': errors, 'warnings': warnings, 'infos': infos} for row in rows[6:max_row - 1]: # la darrera fila també és brossa for index, cell in enumerate(row): if index in col_index: grup_classe = unicode(cell.value).strip() _, new = Grup2Aula.objects.get_or_create( grup_esfera=grup_classe) if new: errors.append( u"El grup '{grup_classe}' de l'Esfer@ no té correspondència al programa. Revisa les correspondències Esfer@-Aula" .format(grup_classe=grup_classe)) return {'errors': errors}
def comprovar_grups( f ): dialect = csv.Sniffer().sniff(f.readline()) f.seek(0) f.readline() f.seek(0) reader = csv.DictReader(f, dialect=dialect ) errors=[] warnings=[] infos=[] grup_field = next( x for x in reader.fieldnames if x.endswith("_GRUPSCLASSE") ) if grup_field is None: errors.append(u"No trobat el grup classe al fitxer d'importació") return False, { 'errors': errors, 'warnings': warnings, 'infos': infos } for row in reader: grup_classe = unicode(row[grup_field],'iso-8859-1').strip() _, new = Grup2Aula.objects.get_or_create( grup_saga = grup_classe ) if new: errors.append( u"El grup '{grup_classe}' del Saga no té correspondència al programa. Revisa les correspondències Saga-Aula".format( grup_classe=grup_classe ) ) return { 'errors': errors, 'warnings': warnings, 'infos': infos }
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) if not i.controlassistencia_set.exists(): i.pot_no_tenir_alumnes = True i.save() self.flagPrimerDiaFet = (i.dia_impartir >= self.impartir.dia_impartir) except Exception as e: errors.append(unicode(e)) finally: self.flagPrimerDiaFet = True return errors
def fusiona(request, pk): """ XXX define doc """ credentials = tools.getImpersonateUser(request) resultat = { 'errors': [], 'warnings': [], 'infos': [u'Procés realitzat correctament'] } try: fusiona_alumnes_by_pk(int(pk), credentials) except Exception as e: resultat = { 'errors': [ unicode(e), ], 'warnings': [], 'infos': [] } return render( request, 'resultat.html', { 'head': u'Error a l\'esborrar actuació.', 'msgs': resultat }, )
def nom_acompanyants(self): nom_acompanyants = u", ".join( [unicode(u) for u in self.altres_professors_acompanyants.all()]) n_acompanyants = self.altres_professors_acompanyants.count() txt_acompanyants = u"({0}) {1}".format( n_acompanyants, nom_acompanyants) if n_acompanyants else "Sense acompanyants" return txt_acompanyants
def triaAlumneCursAjax( request, id_nivell ): if request.method == 'GET': #request.is_ajax() id_nivell = int( id_nivell ) cursos = Curs.objects.filter( nivell__pk = id_nivell ) message = u'<option value="" selected>-- Tria --</option>' ; for c in cursos: message += u'<option value="%s">%s</option>'% (c.pk, unicode(c) ) return HttpResponse(message)
def triaAlumneAlumneAjax( request, id_grup ): if request.method == 'GET': #request.is_ajax() pk = int( id_grup ) tots = Alumne.objects.filter( grup__pk = pk ) message = u'<option value="" selected>-- Tria --</option>' ; for iterador in tots: message += u'<option value="%s">%s</option>'% (iterador.pk, unicode(iterador) ) return HttpResponse(message)
def configuraConnexio(request, pk): credentials = tools.getImpersonateUser(request) (user, l4) = credentials professor = User2Professor(user) alumne = Alumne.objects.get(pk=int(pk)) #seg------------------- te_permis = l4 or professor in alumne.tutorsDeLAlumne() if not te_permis: raise Http404() edatAlumne = None try: edatAlumne = alumne.edat() except: pass infoForm = [ ('Alumne', unicode(alumne)), #( 'Telèfon Alumne', alumne.telefons), ('Telèfon Alumne', alumne.rp1_telefon + u', ' + alumne.rp2_telefon + u', ' + alumne.altres_telefons), #( 'Nom tutors', alumne.tutors), ('Nom tutors', alumne.rp1_nom + u', ' + alumne.rp2_nom), #('Correu tutors (Saga)', alumne.correu_tutors), ('Correu tutors (Saga)', alumne.rp1_correu + u', ' + alumne.rp2_correu ), ('Edat alumne', edatAlumne), ] AlumneFormSet = modelform_factory( Alumne, fields=('correu_relacio_familia_pare', 'correu_relacio_familia_mare', 'periodicitat_faltes', 'periodicitat_incidencies'), ) if request.method == 'POST': form = AlumneFormSet(request.POST, instance=alumne) if form.is_valid(): form.save() url_next = '/open/dadesRelacioFamilies#{0}'.format(alumne.pk) return HttpResponseRedirect(url_next) else: form = AlumneFormSet(instance=alumne) return render( request, 'form.html', { 'form': form, 'infoForm': infoForm, 'head': u'Gestió relació familia amb empreses', 'formSetDelimited': True }, )
def triaAlumneGrupAjax(request, id_curs): """ XXX define doc """ if request.method == 'GET': #request.is_ajax() pk = int(id_curs) tots = Grup.objects.filter(curs__pk=pk) message = u'<option value="" selected>-- Tria --</option>' for iterador in tots: message += u'<option value="%s">%s</option>' % (iterador.pk, unicode(iterador)) return HttpResponse(message)
def resultats(request): (user, l4) = tools.getImpersonateUser(request) professor = User2Professor(user) report = [] taula = tools.classebuida() taula.titol = tools.classebuida() taula.titol.contingut = "" taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 35 capcelera.contingut = u'{0}'.format(u'Avaluació qualitativa') taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 65 capcelera.contingut = u'Dades' taula.capceleres.append(capcelera) taula.fileres = [] for qualitativa in AvaluacioQualitativa.objects.all(): filera = [] camp = tools.classebuida() camp.contingut = u'{0}'.format(unicode(qualitativa)) filera.append(camp) camp = tools.classebuida() obertaLaQualitativa = qualitativa.data_obrir_avaluacio <= date.today( ) <= qualitativa.data_tancar_avaluacio estat = '(Oberta)' if obertaLaQualitativa else '(Tancada)' camp.contingut = u'del {0} al {1} {2}'.format( qualitativa.data_obrir_avaluacio, qualitativa.data_tancar_avaluacio, estat) camp.enllac = '/avaluacioQualitativa/report/{0}'.format(qualitativa.pk) filera.append(camp) taula.fileres.append(filera) report.append(taula) return render( request, 'report.html', { 'report': report, 'head': u'Avaluacions Qualitatives', }, )
def canviParametres(request): credentials = tools.getImpersonateUser(request) (user, l4) = credentials alumne = Alumne.objects.get(user_associat=user) edatAlumne = None try: edatAlumne = alumne.edat() except: pass infoForm = [ ('Alumne', unicode(alumne)), # ( 'Telèfon Alumne', alumne.telefons), ('Telèfon Alumne', alumne.rp1_telefon + u', ' + alumne.rp2_telefon + u', ' + alumne.altres_telefons), # ( 'Nom tutors', alumne.tutors), ('Nom tutors', alumne.rp1_nom + u', ' + alumne.rp2_nom), # ('Correu tutors (Saga)', alumne.correu_tutors), ('Correu tutors (Saga)', alumne.rp1_correu + u', ' + alumne.rp2_correu ), ('Edat alumne', edatAlumne), ] AlumneFormSet = modelform_factory( Alumne, fields=('correu_relacio_familia_pare', 'correu_relacio_familia_mare', 'periodicitat_faltes', 'periodicitat_incidencies'), ) if request.method == 'POST': form = AlumneFormSet(request.POST, instance=alumne) if form.is_valid(): form.save() url_next = '/open/elMeuInforme/' return HttpResponseRedirect(url_next) else: form = AlumneFormSet(instance=alumne) return render( request, 'form.html', { 'form': form, 'infoForm': infoForm, 'head': u'Canvi de paràmetres', 'formSetDelimited': True }, )
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 triaAlumne( request ): if not request.user.is_authenticated: return render('/login') if request.method == 'POST': form = triaAlumneForm(request.POST) if form.is_valid(): return HttpResponse( unicode( form.cleaned_data['alumne'] ) ) else: form = triaAlumneForm() return render( request, 'form.html', {'form': form, 'head': 'Resultat importació SAGA' , }, )
def llistaAlumnescsv( request ): """ Generates an Excel spreadsheet for review by a staff member. """ llistaAlumnes = Alumne.objects.order_by('cognoms','nom') dades = [ [e.ralc, (unicode( e.grup ) + ' - ' + e.cognoms + ', ' + e.nom) , e.grup, e.user_associat.username, e.correu, e.rp1_correu, e.rp2_correu, e.correu_relacio_familia_mare, e.correu_relacio_familia_pare, e.correu_tutors ] for e in llistaAlumnes] capcelera = [ 'ralc', 'alumne', 'grup', 'username', 'correu', 'rp1_correu', 'rp2_correu', 'correu_relacio_mare', 'correu_relacio_pare', 'correu_tutors' ] template = loader.get_template("export.csv") context = { 'capcelera':capcelera, 'dades':dades, } response = HttpResponse() filename = "llistaAlumnes.csv" response['Content-Disposition'] = 'attachment; filename='+filename response['Content-Type'] = 'text/csv; charset=utf-8' #response['Content-Type'] = 'application/vnd.ms-excel; charset=utf-8' # Add UTF-8 'BOM' signature, otherwise Excel will assume the CSV file # encoding is ANSI and special characters will be mangled response.write(template.render(context)) return response
def elsProfessors(request): (user, l4) = tools.getImpersonateUser(request) report = [] taula = tools.classebuida() taula.capceleres = [] taula.titol = tools.classebuida() taula.titol.contingut = "" capcelera = tools.classebuida() capcelera.amplade = 40 capcelera.contingut = u'Professor' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 60 capcelera.contingut = u'%Passa llista' taula.capceleres.append(capcelera) taula.fileres = [] for professor in Professor.objects.all(): filera = [] #-nom-------------------------------------------- camp_nom = tools.classebuida() camp_nom.enllac = None camp_nom.contingut = unicode(professor) filera.append(camp_nom) #-incidències-------------------------------------------- camp = tools.classebuida() camp.enllac = None qProfessor = Q(horari__professor=professor) qAvui = Q(dia_impartir=datetime.today()) & Q( horari__hora__hora_fi__lt=datetime.now()) qFinsAhir = Q(dia_impartir__lt=datetime.today()) qFinsAra = qFinsAhir | qAvui qTeGrup = Q(horari__grup__isnull=False) imparticions = (Impartir.objects.filter(qProfessor & qFinsAra & qTeGrup).exclude( pot_no_tenir_alumnes=True)) nImparticios = (imparticions.values_list( 'dia_impartir', 'horari__dia_de_la_setmana_id', 'horari__hora_id').distinct().count()) nImparticionsLlistaPassada = (imparticions.filter( professor_passa_llista__isnull=False).values_list( 'dia_impartir', 'horari__dia_de_la_setmana_id', 'horari__hora_id').distinct().count()) pct = nImparticionsLlistaPassada * 100 / nImparticios if nImparticios > 0 else 0 camp.contingut = u'{0:.0f}% ({1} classes impartides, {2} controls)'.format( pct, nImparticios, nImparticionsLlistaPassada) camp.codi_ordenacio = pct filera.append(camp) #-- taula.fileres.append(filera) #fileres_ordenades = sorted( taula.fileres, key = lambda x: x.codi_ordenacio ) #taula.fileres = fileres_ordenades report.append(taula) return render(request, 'report.html', { 'report': report, 'head': 'Informació professors', })
def elsMeusAlumnesTutoratsRpt(professor=None, grup=None, dataDesDe=None, dataFinsA=date.today()): report = [] if professor: grups = [t.grup for t in Tutor.objects.filter(professor=professor)] grups.append('Altres') else: grup = get_object_or_404(Grup, pk=grup) grups = [grup] for grup in grups: taula = tools.classebuida() taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 30 capcelera.contingut = grup if grup == u'Altres' else u'{0} ({1})'.format( grup, grup.curs) capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 15 capcelera.contingut = u'Faltes.' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u'Disciplina' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 5 capcelera.contingut = u'Actuacions' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 15 capcelera.contingut = u'Familia' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u'Seguiment' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u'Històric' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 15 capcelera.contingut = u'Qualitativa' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 5 capcelera.contingut = u'Tot' taula.capceleres.append(capcelera) taula.fileres = [] if grup == 'Altres': consulta_alumnes = Q(pk__in=[ ti.alumne.pk for ti in professor.tutorindividualitzat_set.all() ]) else: consulta_alumnes = Q(grup=grup) for alumne in Alumne.objects.filter(consulta_alumnes): filera = [] #-moment-------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = unicode(alumne) camp.enllac = "/tutoria/detallTutoriaAlumne/{0}/dades".format( alumne.pk) filera.append(camp) q_hores = Q(impartir__dia_impartir__lte=dataFinsA) if dataDesDe: q_hores &= Q(impartir__dia_impartir__gte=dataDesDe) controls = alumne.controlassistencia_set.filter(q_hores) #-faltes-------------------------------------------- f = controls.filter(alumne=alumne, estat__codi_estat='F').distinct().count() r = controls.filter(alumne=alumne, estat__codi_estat='R').distinct().count() p = controls.filter(alumne=alumne, estat__codi_estat='P').distinct().count() j = controls.filter(alumne=alumne, estat__codi_estat='J').distinct().count() #ca = controls.filter(q_hores).filter(estat__codi_estat__isnull = False).filter( alumne = alumne ).distinct().count() #-%-------------------------------------------- tpc_injust = (1.0 * f) * 100.0 / (0.0 + f + r + p + j) if f > 0 else 0 tpc_assist = (0.0 + p + r) * 100.0 / (0.0 + f + r + p + j) if f > 0 else 0 camp = tools.classebuida() camp.enllac = None accio_list = [ (u'f: {0}'.format(f), "/tutoria/detallTutoriaAlumne/{0}/assistencia".format( alumne.pk) if f else None), (u'j: {0}'.format(j), "/tutoria/detallTutoriaAlumne/{0}/assistencia".format( alumne.pk) if j else None), (u'r: {0}'.format(r), "/tutoria/detallTutoriaAlumne/{0}/assistencia".format( alumne.pk) if r else None), (u'p: {0}'.format(p), None), (u'{0:.2f}%Injust'.format(tpc_injust), "/tutoria/detallTutoriaAlumne/{0}/assistencia".format( alumne.pk) if f or j or r else None), (u'{0:.2f}%Assist'.format(tpc_assist), "/tutoria/detallTutoriaAlumne/{0}/assistencia".format( alumne.pk) if tpc_assist else None), ] camp.multipleContingut = accio_list filera.append(camp) #-disciplina-------------------------------------------- nIncidencies = alumne.incidencia_set.filter( tipus__es_informativa=False).count() nIncidenciesInform = alumne.incidencia_set.filter( tipus__es_informativa=True).count() nExpulsions = alumne.expulsio_set.exclude(estat='ES').exclude( es_expulsio_per_acumulacio_incidencies=True).count() nExpulsionsAcu = alumne.expulsio_set.exclude(estat='ES').filter( es_expulsio_per_acumulacio_incidencies=True).count() camp = tools.classebuida() camp.enllac = "/tutoria/detallTutoriaAlumne/{0}/incidencies".format( alumne.pk) if (nExpulsions + nExpulsionsAcu + nIncidencies + nIncidenciesInform) > 0 else '' camp.multipleContingut = [ (u'''Exp:{0}(+{1}acu)'''.format(nExpulsions, nExpulsionsAcu), None), (u'Inc:{0}'.format(nIncidencies), None), (u'Obs:{0}'.format(nIncidenciesInform), None), ] filera.append(camp) #-Actuacions-------------------------------------------- nActuacions = alumne.actuacio_set.all().count() camp = tools.classebuida() camp.enllac = "/tutoria/detallTutoriaAlumne/{0}/actuacions".format( alumne.pk) if nActuacions > 0 else '' camp.contingut = u'Act:{0}'.format(nActuacions) filera.append(camp) #-Familia-------------------------------------------- nConnexions = 0 try: nConnexions = alumne.user_associat.LoginUsuari.filter( exitos=True).count() except: pass camp = tools.classebuida() camp.enllac = "/tutoria/detallTutoriaAlumne/{0}/families".format( alumne.pk) if nConnexions > 0 else '' camp.contingut = u'Actiu:{0} Connexions:{1}'.format( u'Sí' if alumne.esta_relacio_familia_actiu() else u'No', nConnexions) filera.append(camp) #-Seguiment-------------------------------------------- camp = tools.classebuida() anys_seguiment_tutorial = [] try: anys_seguiment_tutorial = SeguimentTutorialRespostes.objects.filter( seguiment_tutorial__alumne=alumne).values_list( 'any_curs_academic', flat=True).distinct() except: pass if anys_seguiment_tutorial: camp.enllac = "/tutoria/detallTutoriaAlumne/{0}/seguiment".format( alumne.pk) camp.contingut = u'{0}'.format(u', '.join( [unicode(x) for x in anys_seguiment_tutorial])) filera.append(camp) #-Històric-------------------------------------------- camp = tools.classebuida() anys_seguiment_tutorial = [] try: anys_historic = ResumAnualAlumne.objects.filter( seguiment_tutorial__alumne=alumne).values_list( 'curs_any_inici', flat=True).distinct() except: pass if anys_historic: camp.enllac = "/tutoria/detallTutoriaAlumne/{0}/historic".format( alumne.pk) camp.contingut = u'{0}'.format(u', '.join( [unicode(x) for x in anys_historic])) filera.append(camp) #-Qualitativa--------------- camp = tools.classebuida() teDadesDeQualitativa = alumne.respostaavaluacioqualitativa_set.count( ) > 0 if teDadesDeQualitativa: camp.enllac = "/tutoria/detallTutoriaAlumne/{0}/qualitativa".format( alumne.pk) camp.contingut = u'2010' llistaDates = [ r.qualitativa.data_tancar_avaluacio.strftime('%d/%m/%Y') for r in alumne.respostaavaluacioqualitativa_set.all() ] camp.contingut = u','.join(list(set(llistaDates))) filera.append(camp) #-All--------------- camp = tools.classebuida() camp.enllac = "/tutoria/detallTutoriaAlumne/{0}/all".format( alumne.pk) camp.contingut = u'Informe' filera.append(camp) #-- taula.fileres.append(filera) report.append(taula) return report
def elMeuInforme(request, pk=None): """Dades que veurà l'alumne""" detall = 'all' credentials = tools.getImpersonateUser(request) (user, l4) = credentials nTaula = 0 tePermis = True semiImpersonat = False if pk: professor = User2Professor(user) alumne = Alumne.objects.get(pk=pk) tePermis = professor in alumne.tutorsDeLAlumne() semiImpersonat = True else: alumne = Alumne.objects.get(user_associat=user) if not alumne or not tePermis: raise Http404 head = u'{0} ({1})'.format(alumne, unicode(alumne.grup)) ara = datetime.now() report = [] #----Assistencia -------------------------------------------------------------------- if detall in ['all', 'assistencia']: controls = alumne.controlassistencia_set.exclude( estat__codi_estat='P').filter(estat__isnull=False) controlsNous = controls.filter(relacio_familia_revisada__isnull=True) taula = tools.classebuida() taula.codi = nTaula nTaula += 1 taula.tabTitle = 'Faltes i retards {0}'.format( pintaNoves(controlsNous.count())) taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] taula.fileres = [] capcelera = tools.classebuida() capcelera.amplade = 25 capcelera.contingut = u'Dia' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 75 capcelera.contingut = u'Falta, assignatura i franja horària.' taula.capceleres.append(capcelera) tots_els_controls = list( controls.select_related('impartir', 'estat').order_by( '-impartir__dia_impartir', '-impartir__horari__hora')) assistencia_calendari = [ ] #{"date":"2016-04-02","badge":true,"title":"Example 2"} from itertools import groupby for k, g in groupby(tots_els_controls, lambda x: x.impartir.dia_impartir): gs = list(g) gs.reverse() assistencia_calendari.append({ 'date': k.strftime('%Y-%m-%d'), 'badge': any([c.estat.codi_estat == 'F' for c in gs]), 'title': u'\n'.join([ escapejs(u'{0} a {1} ({2})'.format( c.estat, c.impartir.horari.assignatura, c.impartir.horari.hora)) for c in gs ]) # Store group iterator as a list }) for control in tots_els_controls: filera = [] #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = unicode( control.impartir.dia_impartir.strftime('%d/%m/%Y')) camp.negreta = False if control.relacio_familia_revisada else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0} a {1} ({2})'.format( control.estat, control.impartir.horari.assignatura, control.impartir.horari.hora) camp.negreta = False if control.relacio_familia_revisada else True filera.append(camp) # assistencia_calendari.append( { 'date': control.impartir.dia_impartir.strftime( '%Y-%m-%d' ) , # 'badge': control.estat.codi_estat == 'F', # 'title': escapejs( camp.contingut ) # } ) #-- taula.fileres.append(filera) report.append(taula) if not semiImpersonat: controlsNous = controls.update(relacio_familia_notificada=ara, relacio_familia_revisada=ara) #----observacions -------------------------------------------------------------------- observacions = alumne.incidencia_set.filter(tipus__es_informativa=True) observacionsNoves = observacions.filter( relacio_familia_revisada__isnull=True) taula = tools.classebuida() taula.codi = nTaula nTaula += 1 taula.tabTitle = 'Observacions {0}'.format( pintaNoves(observacionsNoves.count())) taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 25 capcelera.contingut = u'Dia' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 75 capcelera.contingut = u'Professor i observació.' taula.capceleres.append(capcelera) taula.fileres = [] for incidencia in observacions.order_by('-dia_incidencia', '-franja_incidencia'): filera = [] #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0}'.format( incidencia.dia_incidencia.strftime('%d/%m/%Y')) camp.negreta = False if incidencia.relacio_familia_notificada else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.negreta = False if incidencia.relacio_familia_revisada else True camp.contingut = u'Sr(a): {0} - {1}'.format( incidencia.professional, incidencia.descripcio_incidencia) camp.negreta = False if incidencia.relacio_familia_revisada else True filera.append(camp) #-- taula.fileres.append(filera) report.append(taula) if not semiImpersonat: observacionsNoves = observacions.update( relacio_familia_notificada=ara, relacio_familia_revisada=ara) #----incidències -------------------------------------------------------------------- incidencies = alumne.incidencia_set.filter(tipus__es_informativa=False) incidenciesNoves = incidencies.filter( relacio_familia_revisada__isnull=True) taula = tools.classebuida() taula.codi = nTaula nTaula += 1 taula.tabTitle = 'Incidències {0}'.format( pintaNoves(incidenciesNoves.count())) taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 30 capcelera.contingut = u'Dia i estat' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 70 capcelera.contingut = u'Professor i Incidència' taula.capceleres.append(capcelera) taula.fileres = [] for incidencia in incidencies.order_by('-dia_incidencia', '-franja_incidencia'): filera = [] #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0} {1}'.format( incidencia.dia_incidencia.strftime('%d/%m/%Y'), 'Vigent' if incidencia.es_vigent else '') camp.negreta = False if incidencia.relacio_familia_revisada else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'Sr(a): {0} - {1}'.format( incidencia.professional, incidencia.descripcio_incidencia) camp.negreta = False if incidencia.relacio_familia_revisada else True filera.append(camp) #-- taula.fileres.append(filera) report.append(taula) if not semiImpersonat: incidenciesNoves.update(relacio_familia_notificada=ara, relacio_familia_revisada=ara) #----Expulsions -------------------------------------------------------------------- expulsions = alumne.expulsio_set.exclude(estat='ES') expulsionsNoves = expulsions.filter( relacio_familia_revisada__isnull=True) taula = tools.classebuida() taula.codi = nTaula nTaula += 1 taula.tabTitle = 'Expulsions {0}'.format( pintaNoves(expulsionsNoves.count())) taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 20 capcelera.contingut = u'Dia' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 20 capcelera.contingut = u'Data comunicació' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 60 capcelera.contingut = u'Professor i motiu' taula.capceleres.append(capcelera) taula.fileres = [] for expulsio in expulsions.order_by('-dia_expulsio', '-franja_expulsio'): filera = [] #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0} {1}'.format( expulsio.dia_expulsio.strftime('%d/%m/%Y'), u'''(per acumulació d'incidències)''' if expulsio.es_expulsio_per_acumulacio_incidencies else '') camp.negreta = False if expulsio.relacio_familia_revisada else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0}'.format( expulsio.moment_comunicacio_a_tutors.strftime('%d/%m/%Y' ) if expulsio. moment_comunicacio_a_tutors else u'Pendent de comunicar.') camp.negreta = False if expulsio.relacio_familia_revisada else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'Sr(a): {0} - {1}'.format( expulsio.professor, expulsio.motiu if expulsio.motiu else u'Pendent redactar motiu.') camp.negreta = False if expulsio.relacio_familia_revisada else True filera.append(camp) #-- taula.fileres.append(filera) report.append(taula) if not semiImpersonat: expulsionsNoves.update(relacio_familia_notificada=ara, relacio_familia_revisada=ara) #----Sancions ----------------------------------------------------------------------------- if detall in ['all', 'incidencies']: sancions = alumne.sancio_set.filter(impres=True) sancionsNoves = sancions.filter(relacio_familia_revisada__isnull=True) taula = tools.classebuida() taula.codi = nTaula nTaula += 1 taula.tabTitle = 'Sancions {0}'.format( pintaNoves(sancionsNoves.count())) taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 25 capcelera.contingut = u'Dates' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 75 capcelera.contingut = u'Detall' taula.capceleres.append(capcelera) taula.fileres = [] for sancio in sancions.order_by('-data_inici'): filera = [] #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0} a {1}'.format( sancio.data_inici.strftime('%d/%m/%Y'), sancio.data_fi.strftime('%d/%m/%Y')) camp.negreta = False if sancio.relacio_familia_revisada else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0} {1} {2}'.format( sancio.tipus, ' - ' if sancio.motiu else '', sancio.motiu) camp.negreta = False if sancio.relacio_familia_revisada else True filera.append(camp) #-- taula.fileres.append(filera) report.append(taula) if not semiImpersonat: sancionsNoves.update(relacio_familia_notificada=ara, relacio_familia_revisada=ara) #---dades alumne--------------------------------------------------------------------- if detall in ['all', 'dades']: taula = tools.classebuida() taula.tabTitle = 'Dades personals' taula.codi = nTaula nTaula += 1 taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 25 capcelera.contingut = u'Dades Alumne' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 75 capcelera.contingut = u'' taula.capceleres.append(capcelera) taula.fileres = [] #----grup------------------------------------------ filera = [] camp = tools.classebuida() camp.enllac = None camp.contingut = u'Grup' filera.append(camp) camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0}'.format(alumne.grup) filera.append(camp) taula.fileres.append(filera) #----data neix------------------------------------------ filera = [] camp = tools.classebuida() camp.enllac = None camp.contingut = u'Data Neixement' filera.append(camp) camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0}'.format(alumne.data_neixement) filera.append(camp) taula.fileres.append(filera) #----telefons------------------------------------------ filera = [] camp = tools.classebuida() camp.enllac = None camp.contingut = u'Telèfon' filera.append(camp) camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0}'.format(alumne.altres_telefons) filera.append(camp) taula.fileres.append(filera) #----Pares------------------------------------------ filera = [] camp = tools.classebuida() camp.enllac = None camp.contingut = u'Pares' filera.append(camp) camp = tools.classebuida() camp.enllac = None camp.multipleContingut = [ (u'{0} ({1} , {2})'.format(alumne.rp1_nom, alumne.rp1_telefon, alumne.rp1_mobil), None), (u'{0} ({1} , {2})'.format(alumne.rp2_nom, alumne.rp2_telefon, alumne.rp2_mobil), None), ] filera.append(camp) taula.fileres.append(filera) #----adreça------------------------------------------ filera = [] camp = tools.classebuida() camp.enllac = None camp.contingut = u'Adreça' filera.append(camp) camp = tools.classebuida() camp.enllac = None localitat_i_o_municipi = alumne.localitat if not alumne.municipi \ else (alumne.municipi if not alumne.localitat else (alumne.localitat + '-' + alumne.municipi if alumne.localitat != alumne.municipi else alumne.localitat)) camp.contingut = u'{0} - {1}'.format(alumne.adreca, localitat_i_o_municipi) filera.append(camp) taula.fileres.append(filera) report.append(taula) #----Sortides ----------------------------------------------------------------------------- if detall in ['all', 'sortides'] and settings.CUSTOM_MODUL_SORTIDES_ACTIU: sortides = alumne.notificasortida_set.all() sortidesNoves = sortides.filter(relacio_familia_revisada__isnull=True) sortides_on_no_assistira = alumne.sortides_on_ha_faltat.values_list( 'id', flat=True).distinct() sortides_justificades = alumne.sortides_falta_justificat.values_list( 'id', flat=True).distinct() taula = tools.classebuida() taula.codi = nTaula nTaula += 1 taula.tabTitle = 'Activitats/Sortides {0}'.format( pintaNoves(sortidesNoves.count())) taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 20 capcelera.contingut = u'Dates' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 35 capcelera.contingut = u' ' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 35 capcelera.contingut = u'Detall' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u' ' taula.capceleres.append(capcelera) taula.fileres = [] for sortida in sortides.order_by('-sortida__calendari_desde'): filera = [] #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = naturalday(sortida.sortida.calendari_desde) camp.negreta = False if bool( sortida.relacio_familia_revisada) else True filera.append(camp) #---------------------------------------------- # NO INSCRIT A L’ACTIVITAT. L'alumne ha d'assistir al centre excepte si són de viatge de final de curs. comentari_no_ve = u"" if sortida.sortida.pk in sortides_on_no_assistira: comentari_no_ve = u"NO INSCRIT A L’ACTIVITAT." if sortida.sortida.pk in sortides_justificades: comentari_no_ve += u"NO INSCRIT A L’ACTIVITAT. Té justificada l'absència." camp = tools.classebuida() camp.enllac = None camp.contingut = comentari_no_ve camp.negreta = False if bool( sortida.relacio_familia_revisada) else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = u'{0}'.format(sortida.sortida.titol_de_la_sortida) camp.negreta = False if sortida.relacio_familia_revisada else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.modal = {} camp.modal['id'] = sortida.id camp.modal['txtboto'] = u'Detalls' camp.modal['tittle'] = u"{0} ({1})".format( sortida.sortida.titol_de_la_sortida, naturalday(sortida.sortida.calendari_desde), ) camp.modal['body'] = u'{0} a {1} \n\n{2}\n'.format( sortida.sortida.calendari_desde.strftime('%d/%m/%Y %H:%M'), sortida.sortida.calendari_finsa.strftime('%d/%m/%Y %H:%M'), sortida.sortida.programa_de_la_sortida, ) filera.append(camp) #-- taula.fileres.append(filera) report.append(taula) if not semiImpersonat: sortidesNoves.update(relacio_familia_notificada=ara, relacio_familia_revisada=ara) #----Qualitativa ----------------------------------------------------------------------------- qualitatives_alumne = { r.qualitativa for r in alumne.respostaavaluacioqualitativa_set.all() } avui = datetime.now().date() qualitatives_en_curs = [ q for q in qualitatives_alumne if (bool(q.data_obrir_portal_families) and bool(q.data_tancar_tancar_portal_families) and q.data_obrir_portal_families <= avui <= q.data_tancar_tancar_portal_families) ] if detall in ['all', 'qualitativa'] and qualitatives_en_curs: respostes = alumne.respostaavaluacioqualitativa_set.filter( qualitativa__in=qualitatives_en_curs) respostesNoves = respostes.filter( relacio_familia_revisada__isnull=True) assignatures = list(set([r.assignatura for r in respostes])) hi_ha_tipus_assignatura = ( bool(assignatures) and assignatures[0] and assignatures[0].tipus_assignatura is not None and assignatures[0].tipus_assignatura.capcelera) asignatura_label = assignatures[ 0].tipus_assignatura.capcelera if hi_ha_tipus_assignatura else u"Matèria" taula = tools.classebuida() taula.codi = nTaula nTaula += 1 taula.tabTitle = u"Avaluació qualitativa {0}".format( u"!" if respostesNoves.exists() else "") taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 15 capcelera.contingut = u'Qualitativa' capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 20 capcelera.contingut = asignatura_label capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 65 capcelera.contingut = u'' taula.capceleres.append(capcelera) taula.fileres = [] respostes_pre = (respostes.order_by( 'qualitativa__data_obrir_avaluacio', 'assignatura')) keyf = lambda x: (x.qualitativa.nom_avaluacio + x.assignatura. nom_assignatura) respostes_sort = sorted(respostes_pre, key=keyf) from itertools import groupby for _, respostes in groupby(respostes_sort, keyf): respostes = list(respostes) filera = [] #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = respostes[0].qualitativa.nom_avaluacio camp.negreta = False if bool( respostes[0].relacio_familia_revisada) else True filera.append(camp) camp = tools.classebuida() camp.enllac = None camp.contingut = respostes[ 0].assignatura.nom_assignatura or respostes[0].assignatura camp.negreta = False if bool( respostes[0].relacio_familia_revisada) else True filera.append(camp) #---------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.multipleContingut = [] for resposta in respostes: camp.multipleContingut.append(( u'{0}'.format(resposta.get_resposta_display()), None, )) camp.negreta = False if respostes[ 0].relacio_familia_revisada else True filera.append(camp) #-- taula.fileres.append(filera) report.append(taula) if not semiImpersonat: respostesNoves.update(relacio_familia_notificada=ara, relacio_familia_revisada=ara) return render( request, 'report_detall_families.html', { 'report': report, 'head': u'Informació alumne {0}'.format(head), 'assistencia_calendari': json.dumps(assistencia_calendari), }, )
def __str__(self): return (u'És baixa: ' if self.esBaixa() else u'') + unicode( self.grup) + ' - ' + self.cognoms + ', ' + self.nom
def dadesRelacioFamilies(request): credentials = tools.getImpersonateUser(request) (user, _) = credentials professor = User2Professor(user) report = [] grups = [t.grup for t in Tutor.objects.filter(professor=professor)] grups.append('Altres') for grup in grups: taula = tools.classebuida() taula.titol = tools.classebuida() taula.titol.contingut = '' taula.titol.enllac = None taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 25 capcelera.contingut = grup if grup == 'Altres' else u'{0} ({1})'.format( unicode(grup), unicode(grup.curs)) capcelera.enllac = "" taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 35 capcelera.contingut = u'Correus Contacte' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 25 capcelera.contingut = u'Estat' taula.capceleres.append(capcelera) capcelera = tools.classebuida() capcelera.amplade = 15 capcelera.contingut = u'Acció' taula.capceleres.append(capcelera) taula.fileres = [] if grup == 'Altres': consulta_alumnes = Q(pk__in=[ ti.alumne.pk for ti in professor.tutorindividualitzat_set.all() ]) else: consulta_alumnes = Q(grup=grup) alumnes = Alumne.objects.filter(consulta_alumnes) familia_pendent_de_mirar_models = [ ( u'qualitativa', RespostaAvaluacioQualitativa, ), ( u'sortida(es)', NotificaSortida, ), ( u'incidencies o observacions', Incidencia, ), ( u'sanció(ns)', Sancio, ), ( u'expulsió(ns)', Expulsio, ), ( u'faltes assistència', ControlAssistencia, ), ] familia_pendent_de_mirar = {} for codi, model in familia_pendent_de_mirar_models: familia_pendent_de_mirar[codi] = (model.objects.filter( alumne__in=alumnes).filter( relacio_familia_revisada__isnull=True).filter( relacio_familia_notificada__isnull=False).values_list( 'alumne__pk', flat=True)) for alumne in alumnes: filera = [] #-Alumne-------------------------------------------- camp = tools.classebuida() camp.codi = alumne.pk camp.enllac = None camp.contingut = unicode(alumne) filera.append(camp) #-Correus Contacte-------------------------------------------- camp = tools.classebuida() camp.enllac = None camp.contingut = unicode(', '.join( alumne.get_correus_relacio_familia())) filera.append(camp) #-Bloquejat-------------------------------------------- camp = tools.classebuida() camp.codi = alumne.pk camp.enllac = None bloquejat_text = [ (alumne.motiu_bloqueig, None), ] if alumne.motiu_bloqueig else [] nConnexions = alumne.user_associat.LoginUsuari.filter( exitos=True).count() camp.multipleContingut = bloquejat_text + [ ( u'( {0} connexs. )'.format(nConnexions), None, ), ] if nConnexions > 0: dataDarreraConnexio = alumne.user_associat.LoginUsuari.filter( exitos=True).order_by('-moment')[0].moment camp.multipleContingut.append(( u'Darrera Connx: {0}'.format( dataDarreraConnexio.strftime('%d/%m/%Y')), None, )) for ambit in familia_pendent_de_mirar: if alumne.pk in familia_pendent_de_mirar[ambit]: camp.multipleContingut.append(( u"{} x revisar".format(ambit), None, )) filera.append(camp) #-Acció-------------------------------------------- camp = tools.classebuida() camp.enllac = None accio_list = [ (u'Configura', '/open/configuraConnexio/{0}'.format(alumne.pk)), #(u'Bloquejar' if alumne.esta_relacio_familia_actiu() else u'Desbloquejar', '/open/bloquejaDesbloqueja/{0}'.format(alumne.pk)), (u'Envia benvinguda', '/open/enviaBenvinguda/{0}'.format(alumne.pk)), (u'Veure Portal', '/open/elMeuInforme/{0}'.format(alumne.pk)), ] camp.multipleContingut = accio_list filera.append(camp) #-- taula.fileres.append(filera) report.append(taula) return render( request, 'report.html', { 'report': report, 'head': 'Els meus alumnes tutorats', }, )
def __str__(self): return unicode(self.nom)
def reportBaixaCarpeta( request, dia, professors ): import locale locale.setlocale(locale.LC_TIME, 'ca_ES.utf8') credentials = tools.getImpersonateUser(request) (user, _ ) = credentials professor = User2Professor( user ) reports = [] for professor in professors: report = tools.classebuida() report.professor = professor report.data = date( dia, "l, d M Y" ) imparticions = ( Impartir .objects.filter( dia_impartir = dia, horari__professor = professor ) .order_by( 'horari__hora__hora_inici' ) ) report.imparticions = [] for i in imparticions: Feina.objects.get_or_create( impartir = i , defaults = {'professor_darrera_modificacio':professor, } ) impartir = tools.classebuida() impartir.hora = i.horari.hora impartir.grup = i.horari.grup impartir.assignatura = i.horari.assignatura impartir.aula= i.horari.nom_aula impartir.profguard = i.feina.professor_fa_guardia impartir.comments = i.feina.comentaris_per_al_professor_guardia impartir.feina = i.feina.feina_a_fer impartir.comments2 = i.feina.comentaris_professor_guardia report.imparticions.append( impartir ) reports.append( report ) #from django.template import Context import cgi import os from django import http import time excepcio = None contingut = None try: #resultat = StringIO.StringIO( ) resultat = "/tmp/DjangoAula-temp-{0}-{1}.odt".format( time.time(), request.session.session_key ) #context = Context( {'reports' : reports, } ) path = None try: path = os.path.join( settings.PROJECT_DIR, '../customising/docs/carpetaBaixes.odt' ) except: path = os.path.join(os.path.dirname(__file__), 'templates/carpetaBaixes.odt') renderer = Renderer(path, {'reports' : reports, }, resultat) renderer.run() docFile = open(resultat, 'rb') contingut = docFile.read() docFile.close() os.remove(resultat) except Exception as e: excepcio = unicode( e ) if not excepcio: response = http.HttpResponse( contingut, content_type='application/vnd.oasis.opendocument.text') response['Content-Disposition'] = 'attachment; filename=professor-baixa.odt' else: response = http.HttpResponse('''Gremlin's ate your pdf! %s''' % cgi.escape(excepcio)) return response
def faltesAssistenciaEntreDatesProfessorRpt( professor, grup , assignatures , dataDesDe , horaDesDe , dataFinsA , horaFinsA ): q_grup = Q(impartir__horari__grup = grup) q_assignatures = Q(impartir__horari__assignatura__in = assignatures) q_professor = Q(impartir__horari__professor = professor) q_primer_dia = Q(impartir__dia_impartir = dataDesDe ) & Q(impartir__horari__hora__hora_inici__gte = horaDesDe.hora_inici) q_mig = Q(impartir__dia_impartir__gt = dataDesDe ) & Q(impartir__dia_impartir__lt = dataFinsA) q_darrer_dia = Q(impartir__dia_impartir = dataFinsA ) & Q(impartir__horari__hora__hora_fi__lte = horaFinsA.hora_fi) q_hores = q_primer_dia | q_mig | q_darrer_dia controls = ControlAssistencia.objects.filter( q_grup & q_assignatures & q_hores & q_professor ) alumnes = Alumne.objects.filter( controlassistencia__pk__in = controls.values_list('pk', flat=True) ).distinct() report = [] nTaula = 0 #RESUM------------------------------------------------------------------------------------------------- taula = tools.classebuida() taula.codi = nTaula; nTaula+=1 taula.tabTitle = 'Resum' taula.titol = tools.classebuida() taula.titol.contingut = u'Resum assistència de {0} de {1} entre {2} {3}h i {4} {5}h'.format( grup, ', '.join([ unicode(a) for a in assignatures ]), dataDesDe.strftime( '%d/%m/%Y' ) , horaDesDe.hora_inici.strftime( '%H:%M' ), dataFinsA.strftime( '%d/%m/%Y' ) , horaFinsA.hora_fi.strftime( '%H:%M' ) ) taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 25 capcelera.contingut = u'Alumne' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 18 capcelera.contingut = u'hores absent no justificat' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 12 capcelera.contingut = u'hores docència' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 5 capcelera.contingut = u'%assist.' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u'hores present' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade =15 capcelera.contingut = u'hores absènc. justif.' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u'hores retard' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 5 capcelera.contingut = u'%injustif.' taula.capceleres.append( capcelera ) taula.fileres = [] for alumne in alumnes: filera = [] #-nom-------------------------------------------- camp = tools.classebuida() camp.enllac = '' camp.contingut = unicode(alumne) + ' (' + unicode(alumne.grup) + ')' filera.append(camp) #-faltes-------------------------------------------- f = controls.filter( alumne = alumne, estat__codi_estat = 'F' ).distinct().count() j = controls.filter( alumne = alumne, estat__codi_estat = 'J' ).distinct().count() camp = tools.classebuida() camp.contingut = unicode(f) filera.append(camp) #-controls-------------------------------------------- # calcula el 'total' de dies per alumne if settings.CUSTOM_NO_CONTROL_ES_PRESENCIA: # té en compte tots els dies encara que no s'hagi passat llista ca = controls.filter( alumne = alumne).distinct().count() else: ca = controls.filter( alumne = alumne, estat__codi_estat__isnull = False ).distinct().count() camp = tools.classebuida() camp.contingut = unicode(ca) filera.append(camp) #-% assistència -------------------------------------------- tpc = 1.0 - (1.0*( f + j ) ) / (1.0*ca) if ca != 0 else 'N/A' camp = tools.classebuida() camp.contingut =u'{0:.2f}%'.format(tpc * 100) if isinstance( tpc, float ) else 'N/A' filera.append(camp) #-present-------------------------------------------- if settings.CUSTOM_NO_CONTROL_ES_PRESENCIA: # té en compte tots els dies encara que no s'hagi passat llista p = controls.filter( alumne = alumne).filter(Q(estat__codi_estat = 'P') | Q(estat__codi_estat__isnull=True) ).distinct().count() else: p = controls.filter( alumne = alumne, estat__codi_estat = 'P' ).distinct().count() camp = tools.classebuida() camp.contingut = unicode(p) filera.append(camp) #-justif-------------------------------------------- camp = tools.classebuida() camp.contingut = unicode(j) filera.append(camp) #-retard-------------------------------------------- j = controls.filter( alumne = alumne, estat__codi_estat = 'R' ).distinct().count() camp = tools.classebuida() camp.contingut = unicode(j) filera.append(camp) #-% insjustif -------------------------------------------- tpc = (1.0 * f ) / (1.0*ca) if ca != 0 else 'N/A' camp = tools.classebuida() camp.contingut =u'{0:.2f}%'.format(tpc * 100) if isinstance( tpc, float ) else 'N/A' filera.append(camp) taula.fileres.append( filera ) report.append(taula) #DETALL------------------------------------------------------------------------------------------------- taula = tools.classebuida() taula.codi = nTaula; nTaula+=1 taula.tabTitle = 'Detall' taula.titol = tools.classebuida() taula.titol.contingut = u'Detall assistència de {0} de {1} entre {2} {3}h i {4} {5}h'.format( grup, ', '.join([ unicode(a) for a in assignatures ]), dataDesDe.strftime( '%d/%m/%Y' ) , horaDesDe.hora_inici.strftime( '%H:%M' ), dataFinsA.strftime( '%d/%m/%Y' ) , horaFinsA.hora_fi.strftime( '%H:%M' ) ) taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 40 capcelera.contingut = u'Alumne' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 30 capcelera.contingut = u'hores absent no justificat' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 30 capcelera.contingut = u'hores absènc. justif.' taula.capceleres.append( capcelera ) taula.fileres = [] for alumne in alumnes: filera = [] #-nom-------------------------------------------- camp = tools.classebuida() camp.enllac = '' camp.contingut = unicode(alumne) + ' (' + unicode(alumne.grup) + ')' filera.append(camp) #-faltes-------------------------------------------- f = controls.filter( alumne = alumne, estat__codi_estat = 'F' ).distinct().select_related('impartir','impartir__horari__hora', 'impartir__horari__assignatura') camp = tools.classebuida() camp.contingut = unicode( u' | '.join( [ u'{0} {1} {2}'.format(x.impartir.dia_impartir.strftime( '%d/%m/%Y' ) , x.impartir.horari.hora, x.impartir.horari.assignatura) for x in f ] ) ) filera.append(camp) #-justif-------------------------------------------- j = controls.filter( alumne = alumne, estat__codi_estat = 'J' ).distinct() camp = tools.classebuida() contingut = [ u'{0} {1} {2}'.format(x.impartir.dia_impartir.strftime( '%d/%m/%Y' ) , x.impartir.horari.hora, x.impartir.horari.assignatura) for x in j ] camp.multipleContingut = [ ( c, None,) for c in contingut ] filera.append(camp) taula.fileres.append( filera ) report.append(taula) return report
def alertaAssitenciaReport( data_inici, data_fi, nivell, tpc ): report = [] taula = tools.classebuida() taula.titol = tools.classebuida() taula.titol.contingut = u'Ranking absència alumnes nivell {0}'.format( nivell ) taula.capceleres = [] capcelera = tools.classebuida() capcelera.amplade = 40 capcelera.contingut = u'Alumne' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 15 capcelera.contingut = u'hores absent no justificat' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u'hores docència' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u'%absència no justificada (absènc.no.justif./docència)' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 10 capcelera.contingut = u'hores present' taula.capceleres.append( capcelera ) capcelera = tools.classebuida() capcelera.amplade = 15 capcelera.contingut = u'hores absènc. justif.' taula.capceleres.append( capcelera ) taula.fileres = [] sql = u'''select TODO!!! PASSAR A QUERY API!!!!!! a.id_alumne, coalesce ( count( ca.id_control_assistencia ), 0 ) as ca, coalesce ( count( p.id_control_assistencia ), 0 ) as p, coalesce ( count( j.id_control_assistencia ), 0 ) as j, coalesce ( count( f.id_control_assistencia ), 0 ) as f, 1.0 * coalesce ( count( f.id_control_assistencia ), 0 ) / ( coalesce ( count( ca.id_control_assistencia ), 0 ) ) as tpc from alumne a inner join grup g on (g.id_grup = a.id_grup ) inner join curs c on (c.id_curs = g.id_curs) inner join nivell n on (n.id_nivell = c.id_nivell) inner join control_assistencia ca on (ca.id_estat is not null and ca.id_alumne = a.id_alumne ) inner join impartir i on ( i.id_impartir = ca.id_impartir ) left outer join control_assistencia p on ( p.id_estat in ( select id_estat from estat_control_assistencia where codi_estat in ('P','R' ) ) and p.id_control_assistencia = ca.id_control_assistencia ) left outer join control_assistencia j on ( j.id_estat = ( select id_estat from estat_control_assistencia where codi_estat = 'J' ) and j.id_control_assistencia = ca.id_control_assistencia ) left outer join control_assistencia f on ( f.id_estat = ( select id_estat from estat_control_assistencia where codi_estat = 'F' ) and f.id_control_assistencia = ca.id_control_assistencia ) where n.id_nivell = {0} and i.dia_impartir >= '{1}' and i.dia_impartir <= '{2}' group by a.id_alumne having 1.0 * coalesce ( count( f.id_control_assistencia ), 0 ) / coalesce ( count( ca.id_control_assistencia ), 0 ) > ( 1.0 * {3} / 100) order by 1.0 * coalesce ( count( f.id_control_assistencia ), 0 ) / coalesce ( count( ca.id_control_assistencia ), 0 ) desc '''.format( nivell.pk, data_inici, data_fi, tpc ) for alumne in Alumne.objects.raw( sql ): filera = [] #-nom-------------------------------------------- camp = tools.classebuida() camp.enllac = '/tutoria/detallTutoriaAlumne/{0}/all'.format(alumne.pk ) camp.contingut = unicode(alumne) + ' (' + unicode(alumne.grup) + ')' filera.append(camp) #-docència-------------------------------------------- camp = tools.classebuida() camp.contingut = unicode(alumne.f) filera.append(camp) #-present-------------------------------------------- camp = tools.classebuida() camp.contingut = unicode(alumne.ca) filera.append(camp) #-%-------------------------------------------- camp = tools.classebuida() camp.contingut =u'{0:.2f}%'.format(alumne.tpc * 100) filera.append(camp) #-absent-------------------------------------------- camp = tools.classebuida() camp.contingut = unicode(alumne.p) filera.append(camp) #-justif-------------------------------------------- camp = tools.classebuida() camp.contingut = unicode(alumne.j) filera.append(camp) taula.fileres.append( filera ) report.append(taula) return report
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}