예제 #1
0
    def handle(self, *args, **options):

        try:
            self.stdout.write(u"Iniciant procés notificacions")
            notifica()
            self.stdout.write(u"Fi procés notificacions")
        except Exception 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)
예제 #2
0
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},
    )
예제 #3
0
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
예제 #4
0
 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
예제 #5
0
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,
                   }
                )
예제 #6
0
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,
        },
    )
예제 #7
0
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}
예제 #8
0
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 }







    
예제 #9
0
    def run(self):
        errors = []
        try:
            horaris_a_modificar = Q(horari=self.impartir.horari)
            if self.expandir:
                horaris_a_modificar = Q(
                    horari__assignatura=self.impartir.horari.assignatura)
                horaris_a_modificar &= Q(
                    horari__grup=self.impartir.horari.grup)
                horaris_a_modificar &= Q(
                    horari__professor=self.impartir.horari.professor)

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

            pks = (Impartir.objects.filter(
                horaris_a_modificar & a_partir_avui).values_list(
                    'id', flat=True).order_by('dia_impartir'))
            for pk in pks:
                i = Impartir.objects.get(pk=pk)

                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
예제 #10
0
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
        },
    )
예제 #11
0
 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
예제 #12
0
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)
예제 #13
0
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)
예제 #14
0
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
        },
    )
예제 #15
0
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)
예제 #16
0
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',
        },
    )
예제 #17
0
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
        },
    )
예제 #18
0
def impartir_despres_de_passar_llista(instance):
    #Si passa llista un professor que no és el de l'Horari cal avisar.
    if instance.professor_passa_llista != instance.horari.professor:
        remitent = instance.professor_passa_llista
        missatge = PASSAR_LLISTA_GRUP_NO_MEU
        text_missatge = missatge.format(unicode(instance),
                                        unicode(instance.horari.professor))
        Missatge = apps.get_model('missatgeria', 'Missatge')
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=remitent.getUser(),
                       text_missatge=text_missatge,
                       tipus_de_missatge=tipus_de_missatge)
        msg.envia_a_usuari(usuari=instance.professor_passa_llista.getUser(),
                           importancia='VI')

        missatge = HAN_PASSAT_LLISTA_PER_MI
        text_missatge = missatge.format(unicode(instance),
                                        unicode(instance.horari.professor))
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=remitent.getUser(),
                       text_missatge=text_missatge,
                       tipus_de_missatge=tipus_de_missatge)
        msg.envia_a_usuari(usuari=instance.horari.professor.getUser(),
                           importancia='VI')
예제 #19
0
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' ,
                    },
                )
예제 #20
0
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
예제 #21
0
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
예제 #23
0
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),
        },
    )
예제 #24
0
 def __str__(self):
     return (u'És baixa: ' if self.esBaixa() else u'') + unicode(
         self.grup) + ' - ' + self.cognoms + ', ' + self.nom
예제 #25
0
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',
        },
    )
예제 #26
0
 def __str__(self):
     return unicode(self.nom)
예제 #27
0
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
예제 #30
0
def sincronitza(f, user=None):

    errors = []

    try:
        # Carregar full de càlcul
        wb2 = load_workbook(f)
        if len(wb2.worksheets) != 1:
            # Si té més d'una pestanya --> error
            errors.append('Fitxer incorrecte')
            return {'errors': errors, 'warnings': [], 'infos': []}
        msgs = comprovar_grups(f)
        if msgs["errors"]:
            return msgs
    except:
        errors.append('Fitxer incorrecte')
        return {'errors': errors, 'warnings': [], 'infos': []}

    #Exclou els alumnes AMB esborrat i amb estat MAN (creats manualment)
    Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \
        .update( estat_sincronitzacio = 'PRC')

    errors_nAlumnesSenseGrup = 0
    info_nAlumnesLlegits = 0
    info_nAlumnesInsertats = 0
    info_nAlumnesEsborrats = 0
    info_nAlumnesCanviasDeGrup = 0
    info_nAlumnesModificats = 0
    info_nMissatgesEnviats = 0

    AlumnesCanviatsDeGrup = []
    AlumnesInsertats = []

    trobatGrupClasse = False
    trobatNom = False
    trobatDataNeixement = False
    trobatRalc = False

    # Carregar full de càlcul
    full = wb2.active
    max_row = full.max_row

    # iterar sobre les files
    colnames = [
        u'Identificador de l’alumne/a', u'Primer Cognom', u'Segon Cognom',
        u'Nom', u'Data naixement', u'Tutor 1 - 1r cognom ',
        u'Tutor 1 - 2n cognom', u'Tutor 1 - nom',
        u'Contacte 1er tutor alumne - Valor', u'Tutor 2 - 1r cognom ',
        u'Tutor 2 - 2n cognom', u'Tutor 2 - nom',
        u'Contacte 2on tutor alumne - Valor', u'Tipus de via', u'Nom via',
        u'Número', u'Bloc', u'Escala', u'Planta', u'Porta', u'Codi postal',
        u'Localitat de residència', u'Municipi de residència',
        u'Correu electrònic', u'Contacte altres alumne - Valor', u'Grup Classe'
    ]
    rows = list(wb2.active.rows)
    col_indexs = {
        n: cell.value
        for n, cell in enumerate(rows[5]) if cell.value in colnames
    }  # Començar a la fila 6, les anteriors són brossa
    nivells = set()
    for row in rows[6:max_row - 1]:  # la darrera fila també és brossa
        info_nAlumnesLlegits += 1
        a = Alumne()
        a.ralc = ''
        a.telefons = ''
        for index, cell in enumerate(row):
            if bool(cell) and bool(cell.value):
                cell.value = cell.value.strip()
            if index in col_indexs:
                if col_indexs[index].endswith(u"Identificador de l’alumne/a"):
                    a.ralc = unicode(cell.value)
                    trobatRalc = True
                if col_indexs[index].endswith(u"Primer Cognom"):
                    a.cognoms = unicode(cell.value)
                if col_indexs[index].endswith(u"Segon Cognom"):
                    a.cognoms += " " + unicode(
                        cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Nom"):
                    a.nom = unicode(cell.value)
                    trobatNom = True
                if col_indexs[index].endswith(u"Grup Classe"):
                    try:
                        unGrup = Grup2Aula.objects.get(grup_esfera=unicode(
                            cell.value),
                                                       Grup2Aula__isnull=False)
                        a.grup = unGrup.Grup2Aula
                    except:
                        return {
                            'errors': [
                                u"error carregant {0}".format(
                                    unicode(cell.value)),
                            ],
                            'warnings': [],
                            'infos': []
                        }
                    trobatGrupClasse = True
                if col_indexs[index].endswith(u"Correu electrònic"):
                    a.correu = unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Data naixement"):
                    dia = time.strptime(unicode(cell.value), '%d/%m/%Y')
                    a.data_neixement = time.strftime('%Y-%m-%d', dia)
                    trobatDataNeixement = True


#             if columnName.endswith( u"_CENTRE PROCEDÈNCIA"):
#                 a.centre_de_procedencia = unicode(value,'iso-8859-1')
                if col_indexs[index].endswith(u"Localitat de residència"):
                    a.localitat = unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Codi postal"):
                    a.cp = unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Municipi de residència"):
                    a.municipi = unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(
                        u"Contacte 1er tutor alumne - Valor"):
                    dades_tutor1 = dades_responsable(
                        unicode(cell.value) if cell.value else "")
                    a.rp1_telefon = ', '.join(dades_tutor1["fixes"])
                    a.rp1_mobil = ', '.join(dades_tutor1["mobils"])
                    a.rp1_correu = ', '.join(dades_tutor1["mails"])
                if col_indexs[index].endswith(
                        u"Contacte 2on tutor alumne - Valor"):
                    dades_tutor2 = dades_responsable(
                        unicode(cell.value) if cell.value else "")
                    a.rp2_telefon = ', '.join(dades_tutor2["fixes"])
                    a.rp2_mobil = ', '.join(dades_tutor2["mobils"])
                    a.rp2_correu = ', '.join(dades_tutor2["mails"])
                if col_indexs[index].endswith(
                        u"Contacte altres alumne - Valor"):
                    a.altres_telefons = unicode(cell.value)
                if col_indexs[index].endswith(u"Tutor 1 - 1r cognom "):
                    a.rp1_nom = unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Tutor 1 - 2n cognom"):
                    a.rp1_nom += " " + unicode(
                        cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Tutor 1 - nom"):
                    separador = ", " if (a.rp1_nom != "") else ""
                    a.rp1_nom += separador + unicode(
                        cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Tutor 2 - 1r cognom "):
                    a.rp2_nom = unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Tutor 2 - 2n cognom"):
                    a.rp2_nom += " " + unicode(
                        cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Tutor 2 - nom"):
                    separador = ", " if (a.rp2_nom != "") else ""
                    a.rp2_nom += separador + unicode(
                        cell.value) if cell.value else ""

                if col_indexs[index].endswith(u"Tipus de via"):
                    a.adreca = unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Nom via"):
                    a.adreca += " " + unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Número"):
                    a.adreca += " " + unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Bloc"):
                    a.adreca += " " + unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Escala"):
                    a.adreca += " " + unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Planta"):
                    a.adreca += " " + unicode(cell.value) if cell.value else ""
                if col_indexs[index].endswith(u"Porta"):
                    a.adreca += " " + unicode(cell.value) if cell.value else ""

        if not (trobatGrupClasse and trobatNom and trobatDataNeixement
                and trobatRalc):
            return {
                'errors': [u'Falten camps al fitxer'],
                'warnings': [],
                'infos': []
            }

        alumneDadesAnteriors = None
        try:
            q_mateix_ralc = Q(ralc=a.ralc)
            alumneDadesAnteriors = Alumne.objects.get(q_mateix_ralc)

        except Alumne.DoesNotExist:
            pass

        if alumneDadesAnteriors is None:
            a.estat_sincronitzacio = 'S-I'
            a.data_alta = date.today()
            a.motiu_bloqueig = u'No sol·licitat'
            a.tutors_volen_rebre_correu = False

            info_nAlumnesInsertats += 1
            AlumnesInsertats.append(a)

        else:
            #TODO: si canvien dades importants avisar al tutor.
            a.pk = alumneDadesAnteriors.pk
            a.estat_sincronitzacio = 'S-U'
            info_nAlumnesModificats += 1

            # En cas que l'alumne pertanyi a un dels grups parametritzat com a estàtic,
            # no se li canviarà de grup en les importacions d'Esfer@.
            grups_estatics, _ = ParametreEsfera.objects.get_or_create(
                nom_parametre='grups estatics')
            es_de_grup_estatic = False
            for prefixe_grup in grups_estatics.valor_parametre.split(','):
                prefix = prefixe_grup.replace(' ', '')
                if prefix:
                    es_de_grup_estatic = es_de_grup_estatic or alumneDadesAnteriors.grup.descripcio_grup.startswith(
                        prefix)

            if a.grup.pk != alumneDadesAnteriors.grup.pk:
                if es_de_grup_estatic:  #no canviar-li de grup
                    a.grup = alumneDadesAnteriors.grup
                else:
                    AlumnesCanviatsDeGrup.append(a)

            a.user_associat = alumneDadesAnteriors.user_associat
            #el recuperem, havia estat baixa:
            if alumneDadesAnteriors.data_baixa:
                info_nAlumnesInsertats += 1
                a.data_alta = date.today()
                a.motiu_bloqueig = u'No sol·licitat'
                a.tutors_volen_rebre_correu = False
                a.foto = alumneDadesAnteriors.foto
            else:
                a.correu_relacio_familia_pare = alumneDadesAnteriors.correu_relacio_familia_pare
                a.correu_relacio_familia_mare = alumneDadesAnteriors.correu_relacio_familia_mare
                a.motiu_bloqueig = alumneDadesAnteriors.motiu_bloqueig
                a.relacio_familia_darrera_notificacio = alumneDadesAnteriors.relacio_familia_darrera_notificacio
                a.periodicitat_faltes = alumneDadesAnteriors.periodicitat_faltes
                a.periodicitat_incidencies = alumneDadesAnteriors.periodicitat_incidencies
                a.tutors_volen_rebre_correu = alumneDadesAnteriors.tutors_volen_rebre_correu = False
                a.foto = alumneDadesAnteriors.foto

        a.save()
        nivells.add(a.grup.curs.nivell)
    #
    # Baixes:
    #
    # Els alumnes de Saga no s'han de tenir en compte per fer les baixes
    AlumnesDeSaga = Alumne.objects.exclude(grup__curs__nivell__in=nivells)
    AlumnesDeSaga.update(estat_sincronitzacio='')

    #     #Els alumnes que hagin quedat a PRC és que s'han donat de baixa:
    AlumnesDonatsDeBaixa = Alumne.objects.filter(
        estat_sincronitzacio__exact='PRC')
    AlumnesDonatsDeBaixa.update(data_baixa=date.today(),
                                estat_sincronitzacio='DEL',
                                motiu_bloqueig='Baixa')

    #Avisar als professors: Baixes
    #: enviar un missatge a tots els professors que tenen aquell alumne.
    info_nAlumnesEsborrats = len(AlumnesDonatsDeBaixa)
    professorsNotificar = {}
    for alumneDonatDeBaixa in AlumnesDonatsDeBaixa:
        for professor in Professor.objects.filter(
                horari__impartir__controlassistencia__alumne=alumneDonatDeBaixa
        ).distinct():
            professorsNotificar.setdefault(professor.pk,
                                           []).append(alumneDonatDeBaixa)
    for professorPK, alumnes in professorsNotificar.items():
        llista = []
        for alumne in alumnes:
            llista.append(u'{0} ({1})'.format(unicode(alumne),
                                              alumne.grup.descripcio_grup))
        missatge = ALUMNES_DONATS_DE_BAIXA
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=user,
                       text_missatge=missatge,
                       tipus_de_missatge=tipus_de_missatge)
        msg.afegeix_infos(llista)
        msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN')
        info_nMissatgesEnviats += 1

    #Avisar als professors: Canvi de grup
    #enviar un missatge a tots els professors que tenen aquell alumne.
    info_nAlumnesCanviasDeGrup = len(AlumnesCanviatsDeGrup)
    professorsNotificar = {}
    for alumneCanviatDeGrup in AlumnesCanviatsDeGrup:
        qElTenenALHorari = Q(
            horari__impartir__controlassistencia__alumne=alumneCanviatDeGrup)
        qImparteixDocenciaAlNouGrup = Q(horari__grup=alumneCanviatDeGrup.grup)
        for professor in Professor.objects.filter(
                qElTenenALHorari | qImparteixDocenciaAlNouGrup).distinct():
            professorsNotificar.setdefault(professor.pk,
                                           []).append(alumneCanviatDeGrup)
    for professorPK, alumnes in professorsNotificar.items():
        llista = []
        for alumne in alumnes:
            llista.append(u'{0} passa a grup {1}'.format(
                unicode(alumne), alumne.grup.descripcio_grup))
        missatge = ALUMNES_CANVIATS_DE_GRUP
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=user,
                       text_missatge=missatge,
                       tipus_de_missatge=tipus_de_missatge)
        msg.afegeix_infos(llista)
        msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN')
        info_nMissatgesEnviats += 1

    #Avisar als professors: Altes
    #enviar un missatge a tots els professors que tenen aquell alumne.
    professorsNotificar = {}
    for alumneNou in AlumnesInsertats:
        qImparteixDocenciaAlNouGrup = Q(horari__grup=alumneNou.grup)
        for professor in Professor.objects.filter(
                qImparteixDocenciaAlNouGrup).distinct():
            professorsNotificar.setdefault(professor.pk, []).append(alumneNou)
    for professorPK, alumnes in professorsNotificar.items():
        llista = []
        for alumne in alumnes:
            llista.append(u'{0} al grup {1}'.format(
                unicode(alumne), alumne.grup.descripcio_grup))
        missatge = ALUMNES_DONATS_DALTA
        tipus_de_missatge = tipusMissatge(missatge)
        msg = Missatge(remitent=user,
                       text_missatge=missatge,
                       tipus_de_missatge=tipus_de_missatge)
        msg.afegeix_infos(llista)
        msg.envia_a_usuari(Professor.objects.get(pk=professorPK), 'IN')
        info_nMissatgesEnviats += 1

    #Treure'ls de les classes: les baixes
    ControlAssistencia.objects.filter(
        impartir__dia_impartir__gte=date.today(),
        alumne__in=AlumnesDonatsDeBaixa).delete()

    #Treure'ls de les classes: els canvis de grup   #Todo: només si l'àmbit és grup.

    ambit_no_es_el_grup = Q(
        impartir__horari__assignatura__tipus_assignatura__ambit_on_prendre_alumnes__in
        =['C', 'N', 'I'])
    (ControlAssistencia.objects.filter(ambit_no_es_el_grup).filter(
        impartir__dia_impartir__gte=date.today()).filter(
            alumne__in=AlumnesCanviatsDeGrup).delete())

    #Altes: posar-ho als controls d'assistència de les classes (?????????)

    #
    # FI
    #
    # Tornem a l'estat de sincronització en blanc, excepte els alumnes esborrats DEL i els alumnes entrats manualment MAN.
    Alumne.objects.exclude( estat_sincronitzacio__exact = 'DEL' ).exclude( estat_sincronitzacio__exact = 'MAN') \
        .update( estat_sincronitzacio = '')
    errors.append(u'%d alumnes sense grup' % errors_nAlumnesSenseGrup)
    warnings = []
    infos = []
    infos.append(u'{0} alumnes llegits'.format(info_nAlumnesLlegits))
    infos.append(u'{0} alumnes insertats'.format(info_nAlumnesInsertats))
    infos.append(u'{0} alumnes esborrats'.format(info_nAlumnesEsborrats))
    infos.append(
        u'{0} alumnes canviats de grup'.format(info_nAlumnesCanviasDeGrup))
    infos.append(u'{0} alumnes en estat sincronització manual'.format( \
        len(Alumne.objects.filter(estat_sincronitzacio__exact = 'MAN'))))
    infos.append(u'{0} missatges enviats'.format(info_nMissatgesEnviats))
    missatge = IMPORTACIO_ESFERA_FINALITZADA
    tipus_de_missatge = tipusMissatge(missatge)
    msg = Missatge(remitent=user,
                   text_missatge=missatge,
                   tipus_de_missatge=tipus_de_missatge)
    msg.afegeix_errors(errors)
    msg.afegeix_warnings(warnings)
    msg.afegeix_infos(infos)
    importancia = 'VI' if len(errors) > 0 else 'IN'
    grupDireccio = Group.objects.get(name='direcció')
    msg.envia_a_grup(grupDireccio, importancia=importancia)

    return {'errors': errors, 'warnings': warnings, 'infos': infos}