Example #1
0
def get_people_names(request,
                     enseignement='all',
                     people_type='all',
                     formatting='json',
                     check_access=False):
    people = []
    query = request.GET.get('query', '')

    if people_type == 'responsible' or people_type == 'all':
        people += People().get_responsibles_by_name(query, [enseignement])

    if people_type == 'teacher':
        people += People().get_teachers_by_name(query, [enseignement])

    if people_type == 'educator':
        people += People().get_educators_by_name(query, [enseignement])

    if people_type == 'student' or people_type == 'all':
        classe_years = get_classes([enseignement],
                                   check_access=True,
                                   user=request.user) if check_access else None
        people += People().get_students_by_name(query, [enseignement],
                                                classes=classe_years)

    if formatting == 'json':
        return format_name_to_json(people, people_type)

    return people
Example #2
0
def get_pdf(request, all_year=False, matricule=None, classe=None, infos=None, sanctions=None):
    response = None

    classe_access = get_classes(get_settings().teachings.all(), True, request.user)

    if matricule:
        # student = StudentLDAP.objects.get(matricule=matricule)
        student = People().get_student_by_id(matricule)
        # if not int(student.classe[0]) in year_access:
        if student.classe not in classe_access:
            return HttpResponse("Vous n'avez pas les accès nécessaire.", status=401)

        pdf = create_pdf(student, all_year, infos, sanctions)
        if not pdf:
            return render(request, 'dossier_eleve/no_student.html')
        pdf_name = str(matricule) + '.pdf'

        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = 'filename; filename="' + pdf_name + '"'
        response.write(pdf.read())
        return response

    if classe:
        # if not int(classe[0]) in year_access:
        classes = classe_access.filter(year=int(classe[0]), letter=classe[1].lower(), teaching__name="secondaire")
        if not classes.exists():
            return HttpResponse("Vous n'avez pas les accès nécessaire.", status=401)

        students = []
        for c in classes:
            students += People().get_students_by_classe(c.compact_str)

        merger = PdfFileMerger()
        added = False
        for s in students:
            pdf = create_pdf(s, all_year, infos, sanctions)
            if not pdf:
                continue

            merger.append(pdf)
            added = True

        if not added:
            return render(request, 'dossier_eleve/no_student.html')

        output_stream = BytesIO()
        merger.write(output_stream)
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = 'filename; filename="' + classe + '"'
        response.write(output_stream.getvalue())
        return response

    return response
Example #3
0
def get_list(request):
    # Récuparation des variables GET

    ens = request.GET.get("ens", "all").lower()
    search = request.GET.get("search", "")
    matricule = request.GET.get("mat", "")
    classe = request.GET.get("classe", "")
    people_type = request.GET.get("type", "student")

    if people_type == 'teacher' and request.user.groups.filter(name__in=[
            settings.SYSADMIN_GROUP, settings.DIRECTION_GROUP,
            settings.RECEPTION_GROUP
    ]).exists():
        return get_teacher_list(request, ens, search)

    students = []
    if matricule:
        students = [People().get_student_by_id(int(matricule), [ens])]
        # students = [student_man.get_person(int(matricule))]
    elif classe:
        an = classe[0]
        classe_letter = classe[1]
        classe = ClasseModel.objects.get(year=int(an),
                                         letter=classe_letter.lower(),
                                         teaching__name=ens)
        students = StudentModel.objects.filter(classe=classe)
    else:
        if search.isdigit() and len(search) == 4:
            # We are looking for a matricule
            students = People().get_student_by_id(int(matricule))
        elif search[0].isdigit():
            # We are looking for a class
            classes = ClasseModel.objects.filter(year=int(search[0]))
            if ens != "all":
                classes = classes.filter(teaching__name=ens)
            if len(search) > 1:
                classes = classes.filter(letter=search[1])

            students = StudentModel.objects.filters(classe=classes)
        else:
            students = People().get_students_by_name(search, [ens])
            # students = student_man.get_people_by_names(ens, search)

    context = {}
    if classe:
        context['classe'] = classe.letter
        context['year'] = classe.year
        context['enseignement'] = ens
        students = sorted(students,
                          key=lambda s: unidecode(s.last_name.lower()))

    context['eleves'] = students
    return render(request, 'annuaire/list.html', context=context)
Example #4
0
def get_pdf_retenues(request, date=None, date2=None):
    if not date2:
        date2 = date

    rows = filter_and_order(request, column="datetime_sanction", retenues=True,
                            data1=date.replace("-", "/"), data2=date2.replace("-", "/"),
                            order_by="classe")

    retenues = []
    for r in rows:
        dic = model_to_dict(r)
        # student = student_man.get_person(dic['matricule'])
        student = People().get_student_by_id(dic['matricule'])
        dic['classe'] = student.classe.compact_str
        dic['full_name'] = student.fullname
        dic['sanction_decision'] = SanctionDecisionDisciplinaire.objects.get(pk=dic['sanction_decision'])

        retenues.append(dic)

    context = {'date': date, 'list': retenues}
    t = get_template('dossier_eleve/discip_retenues.rml')
    rml_str = t.render(context)

    pdf = rml2pdf.parseString(rml_str)
    if not pdf:
        return render(request, 'dossier_eleve/no_student.html')
    pdf_name = 'retenues_' + date + '.pdf'

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'filename; filename="' + pdf_name + '"'
    response.write(pdf.read())
    return response
Example #5
0
def get_pdf_council(request, date_from=None, date_to=None):
    rows = filter_and_order(request, only_actives=True, retenues=False,
                            column='datetime_council', data1=date_from.replace("-", "/"), data2=date_to.replace("-", "/"),
                            order_by='classe')

    discip_council = []
    for r in rows:
        dic = model_to_dict(r)
        # student = student_man.get_person(dic['matricule'])
        student = People().get_student_by_id(dic['matricule'])
        dic['classe'] = student.classe.compact_str
        dic['full_name'] = student.fullname
        dic['sanction_decision'] = SanctionDecisionDisciplinaire.objects.get(pk=dic['sanction_decision'])

        discip_council.append(dic)

    context = {'date_from': date_from, 'date_to': date_to,
               'list': discip_council}
    t = get_template('dossier_eleve/discip_council.rml')
    rml_str = t.render(context)

    pdf = rml2pdf.parseString(rml_str)
    if not pdf:
        return render(request, 'dossier_eleve/no_student.html')
    pdf_name = 'council_' + date_from + '_' + date_to + '.pdf'

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'filename; filename="' + pdf_name + '"'
    response.write(pdf.read())
    return response
Example #6
0
def nouveau(request):
    form = NouvelAppelForm(request.POST)
    if form.is_valid():
        a = Appel()
        a.objet = form.cleaned_data['objet']
        a.motif = form.cleaned_data['motif']
        a.commentaire = form.cleaned_data['commentaires']
        a.datetime_motif_start = form.cleaned_data['datetime_motif_start']
        a.datetime_motif_end = form.cleaned_data['datetime_motif_end']
        a.datetime_appel = form.cleaned_data['datetime_appel']
        a.traitement = ""
        a.is_traiter = False
        a.user = request.user.username

        # Check if we have a student or someone else.
        matricule = int(form.cleaned_data['matricule'])
        if matricule > 999 and matricule < 10000:
            student = People().get_student_by_id(matricule, ['all'])
            # studentLDAP = StudentLDAP.objects.get(matricule=matricule)
            a.name = student.fullname
            a.matricule = student
        else:
            a.name = form.cleaned_data['name']
            a.is_student = False

        a.save()
        return True
    else:
        print("wrong form")
        return False
Example #7
0
def send_emails(appel):
    context = {'appel': appel}
    image = []
    name = appel.name
    if appel.is_student:
        student = People().get_student_by_id(appel.matricule.matricule)
        name = str(student)
        context['etudiant'] = student
        if check_student_photo(student, copy=False):
            image = [
                static("/photos/" + str(appel.matricule.matricule) + ".jpg")
            ]
        else:
            image = [static("/photos/unknown.jpg")]

    sent_to = list(
        filter(lambda e: e != '*****@*****.**',
               map(lambda e: e.email, appel.emails.all())))
    if appel.custom_email:
        sent_to.append(appel.custom_email)
    if not settings.DEBUG:
        email.send_email(to=sent_to,
                         subject="[Appel] %s" % name,
                         email_template="appels/email.html",
                         context=context,
                         images=image)
    else:
        print(sent_to)
        email.send_email(to=[settings.EMAIL_ADMIN],
                         subject="[Appel] %s" % name,
                         email_template="appels/email.html",
                         context=context,
                         images=image)
Example #8
0
def summary(request, matricule):
    # eleve = student_man.get_person(matricule)
    eleve = People().get_student_by_id(matricule)
    if not eleve:
        raise Http404("Matricule inexistant : " + str(matricule))

    context = {'eleve': eleve.__dict__}
    #TODO: infirmerie, appels, dossier_eleve
    if 'infirmerie' in settings.INSTALLED_APPS:
        from infirmerie.views import filter_and_order
        context['infirmerie'] = filter_and_order(request,
                                                 column="matricule",
                                                 data1=eleve.matricule,
                                                 order_by="datetime_encodage",
                                                 order_asc="desc")[:5]

    if 'appels' in settings.INSTALLED_APPS:
        from appels.views import filter_and_order
        context['appels'] = filter_and_order(request,
                                             column="matricule",
                                             data1=eleve.matricule,
                                             order_by="datetime_encodage",
                                             order_asc="desc")[:5]

    if 'dossier_eleve' in settings.INSTALLED_APPS:
        from dossier_eleve.views import filter_and_order
        context['dossier_eleve'] = filter_and_order(
            request,
            column="matricule",
            data1=eleve.matricule,
            order_by="datetime_encodage",
            order_asc="desc")[:5]

    return render(request, 'annuaire/eleve.html', context)
Example #9
0
def send_emails(passage, template, subject):
    eleve = People().get_student_by_id(passage.matricule.matricule)
    if check_student_photo(eleve, copy=False):
        image = static("/photos/" + str(passage.matricule.matricule) + ".jpg")
    else:
        image = static("/photos/unknown.jpg")

    context = {
        'eleve': eleve,
        'heure_arrive': passage.datetime_arrive,
        'commentaire': passage.motifs_admission,
        'passage': passage,
        'phone_number': get_settings().phone_number
    }
    recipients = email.get_resp_emails(eleve)
    recipients_emails = []
    for r in recipients.items():
        recipients_emails.append(r[0])

    if not settings.DEBUG:
        email.send_email(to=recipients,
                         subject="[Infirmerie] %s %s %s" %
                         (subject, eleve.fullname, eleve.classe.compact_str),
                         email_template="infirmerie/" + template + ".html",
                         context=context,
                         images=[image])
    else:
        print("Sending to: " + str(recipients_emails))
        email.send_email(to=[settings.EMAIL_ADMIN],
                         subject="[Infirmerie] %s %s %s" %
                         (subject, eleve.fullname, eleve.classe.compact_str),
                         email_template="infirmerie/" + template + ".html",
                         context=context,
                         images=[image])
Example #10
0
def traiter(request):
    # Add informations/modifications.
    is_traiter = 'traiter' in request.POST

    form = TraiterAppelForm(request.POST)
    if form.is_valid():
        a = Appel.objects.get(pk=request.POST['id'])
        a.objet = form.cleaned_data['objet']
        a.motif = form.cleaned_data['motif']
        a.commentaire = form.cleaned_data['commentaires']
        a.datetime_appel = form.cleaned_data['datetime_appel']
        a.traitement = form.cleaned_data['remarques']
        a.custom_email = form.cleaned_data['custom_email']
        if is_traiter:
            a.datetime_traitement = form.cleaned_data['datetime_traitement']
            a.is_traiter = True

        # Add emails
        a.emails.clear()
        for e in form.cleaned_data['emails']:
            a.emails.add(e)

        a.save()

        # Send emails
        if is_traiter:
            context = {'appel': a}
            image = []
            name = a.name
            if a.is_student:
                # etudiant = student_man.get_person(a.matricule.matricule)
                etudiant = People().get_student_by_id(a.matricule.matricule,
                                                      ['all'])
                name = str(etudiant)
                context['etudiant'] = etudiant
                image = [
                    static("/photos/" + str(a.matricule.matricule) + ".jpg")
                ]

            sent_to = list(
                filter(lambda e: e != '*****@*****.**',
                       map(lambda e: e.email, a.emails.all())))
            if a.custom_email:
                sent_to.append(a.custom_email)
            if not settings.DEBUG:
                email.send_email(to=sent_to,
                                 subject="[Appel] %s" % name,
                                 email_template="appels/email.html",
                                 context=context,
                                 images=image)
            else:
                print(sent_to)
                email.send_email(to=[settings.EMAIL_ADMIN],
                                 subject="[Appel] %s" % name,
                                 email_template="appels/email.html",
                                 context=context,
                                 images=image)
    else:
        print(form.errors)
Example #11
0
    def is_valid(self):
        valid = super(ArriveForm, self).is_valid()

        if not valid:
            return valid

        return not People().get_student_by_id(
            self.cleaned_data['matricule']) is None
Example #12
0
def get_teacher_list(request, ens, search):
    teachers = []
    if search != "":
        # teachers = teacher_man.get_people_by_names(ens, search)
        teachers = People().get_teachers_by_name(search, [ens])

    return render(request, 'annuaire/list_teacher.html',
                  {'teachers': teachers})
Example #13
0
def get_teachers_emails(request, enseignement='secondaire'):
    query = request.GET.get('query', '')
    if query == '':
        return JsonResponse([], safe=False)

    teachers = People().get_teachers_by_name(query, [enseignement])
    # teachers = teacher_man.get_people_by_names(enseignement, search_string=query)
    teachers = list(map(lambda t: t.gen_email, teachers))
    return JsonResponse(teachers, safe=False)
Example #14
0
def summary_teacher(request, id):
    if not request.user.groups.filter(name__in=[
            settings.SYSADMIN_GROUP, settings.DIRECTION_GROUP,
            settings.RECEPTION_GROUP
    ]).exists():
        raise Http404("ID inexistant : " + str(id))

    # teacher = teacher_man.get_person(id, ens)
    teacher = People().get_teacher_by_id(id)
    if not teacher:
        raise Http404("ID inexistant : " + str(id))

    context = {'teacher': teacher}
    return render(request, 'annuaire/professeur.html', context)
Example #15
0
def info(request, matricule, medical_info='1', user_info='1'):
    try:
        # student = student_man.get_person(matricule)
        student = People().get_student_by_id(matricule)
    except StopIteration:
        raise Http404("Matricule inexistant : " + str(matricule))

    context = {
        'student': student,
        'medical_info': medical_info,
        'user_info': user_info
    }

    return render(request, 'annuaire/eleve_info.html', context=context)
Example #16
0
def search_people(query, people_type, teachings, check_access, user):
    def serialize_people(person):
        if type(person) == StudentModel:
            return StudentSerializer(person).data
        elif type(person) == ResponsibleModel:
            return ResponsibleSensitiveSerializer(person).data

    if len(query) < 1:
        return []

    truncate_limit = 50
    people = []
    if people_type == 'responsible' or people_type == 'all':
        people += ResponsibleSensitiveSerializer(
            People().get_responsibles_by_name(query,
                                              teachings)[:truncate_limit],
            many=True).data

    if people_type == 'teacher':
        people += ResponsibleSensitiveSerializer(People().get_teachers_by_name(
            query, teachings)[:truncate_limit],
                                                 many=True).data

    if people_type == 'educator':
        people += ResponsibleSensitiveSerializer(
            People().get_educators_by_name(query, teachings)[:truncate_limit],
            many=True).data

    if people_type == 'student' or people_type == 'all':
        classe_years = get_classes(teachings, check_access=True,
                                   user=user) if check_access else None
        people += StudentSerializer(People().get_students_by_name(
            query, teachings, classes=classe_years)[:truncate_limit],
                                    many=True).data

    return people[:truncate_limit]
Example #17
0
    def get(self, request, format=None):
        if request.GET.get('matricule_id'):
            pdf = self.create_pdf(request)
            if not pdf:
                return render(request, 'dossier_eleve/no_student.html')
            pdf_name = str(request.GET['matricule_id']) + '.pdf'

            response = HttpResponse(content_type='application/pdf')
            response[
                'Content-Disposition'] = 'filename; filename="' + pdf_name + '"'
            response.write(pdf.read())
            return response

        if request.GET.get('classe'):
            classe_access = get_classes(get_settings().teachings.all(), True,
                                        request.user)
            try:
                classe = classe_access.get(id=request.GET['classe'])
            except ObjectDoesNotExist:
                return HttpResponse("Vous n'avez pas les accès nécessaire.",
                                    status=401)

            students = People().get_students_by_classe(classe)
            merger = PdfFileMerger()
            added = False
            for s in students:
                request._request.GET = request.GET.copy()
                request._request.GET['matricule_id'] = s.matricule
                pdf = self.create_pdf(request)
                if not pdf:
                    continue

                merger.append(pdf)
                added = True

            if not added:
                return render(request, 'dossier_eleve/no_student.html')

            output_stream = BytesIO()
            merger.write(output_stream)
            response = HttpResponse(content_type='application/pdf')
            response[
                'Content-Disposition'] = 'filename; filename="' + classe.compact_str + '.pdf"'
            response.write(output_stream.getvalue())
            return response

        return render(request, 'dossier_eleve/no_student.html')
Example #18
0
def info_teacher(request, matricule):
    if not request.user.groups.filter(name__in=[
            settings.SYSADMIN_GROUP, settings.DIRECTION_GROUP,
            settings.RECEPTION_GROUP
    ]).exists():
        raise Http404("ID inexistant : " + str(id))

    # teacher = teacher_man.get_person(matricule, ens)
    teacher = People().get_teacher_by_id(matricule)
    if not teacher:
        raise Http404("Matricule inexistant : " + str(matricule))
    context = {'teacher': teacher}
    if request.user.groups.filter(
            name__in=[settings.SYSADMIN_GROUP, settings.DIRECTION_GROUP
                      ]).exists():
        context['username_info'] = True

    return render(request, 'annuaire/professeur_info.html', context)
Example #19
0
def nouveau(request):
    form = ArriveForm(request.POST)
    if form.is_valid():
        student = People().get_student_by_id(form.cleaned_data['matricule'],
                                             teaching=teachings)
        if not student:
            return False
        p = Passage(matricule=student,
                    datetime_arrive=form.cleaned_data['datetime_arrive'],
                    motifs_admission=form.cleaned_data['admission'],
                    remarques_sortie="",
                    name=student.fullname)

        send_emails(p, "nouveau_email", "Arrivée de")

        p.save()
        return True
    else:
        return False
Example #20
0
def filter_and_order(request,
                     only_actives=False,
                     column=None,
                     data1=None,
                     data2=None,
                     order_by=None,
                     order_asc=False,
                     ens='all'):
    rows = Appel.objects.exclude(matricule__isnull=True, is_student=True)

    # First we filter and order at the query level
    # Filtering
    if only_actives:
        rows = rows.filter(datetime_traitement__isnull=True)
    if ens != 'all':
        rows = rows.filter(matricule__enseignement=ens, is_student=True)
    if column and data1 != '':
        if column == 'name':
            # people = People().get_people_by_name(data1, teaching=[ens])
            rows = rows.filter(name__icontains=data1)
        if column == 'matricule':
            rows = rows.filter(matricule__matricule=int(data1))
        if column == 'classe':
            students = People().get_students_by_classe(data1, [ens])
            rows = rows.filter(matricule__in=students)
        if column == 'objet':
            rows = rows.filter(objet__icontains=data1)
        if column == 'motif':
            rows = rows.filter(motif__icontains=data1)
        if column == 'commentaire':
            rows = rows.filter(commentaire__icontains=data1)
        if column == 'traitement':
            rows = rows.filter(traitement__icontains=data1)
        # if column == 'sanction_faite':
        #     rows = rows.filter(sanction_faite='oui'.startswith(data1.lower()))

        if column.startswith('datetime') and data2 != '':
            date_1 = timezone.datetime.strptime(
                data1, '%d/%m/%Y') if type(data1) == str else data1
            date_2 = timezone.datetime.strptime(
                data2, '%d/%m/%Y') if type(data2) == str else data2
            date_2 = date_2.replace(hour=23, minute=59)
            date_1 = timezone.make_aware(date_1) if timezone.is_naive(
                date_1) else date_1
            date_2 = timezone.make_aware(date_2) if timezone.is_naive(
                date_2) else date_2

            if column == 'datetime_appel':
                rows = rows.filter(datetime_appel__range=[date_1, date_2])
            if column == 'datetime_motif_start':
                rows = rows.filter(
                    datetime_motif_start__range=[date_1, date_2])
            if column == 'datetime_motif_end':
                rows = rows.filter(datetime_motif_end__range=[date_1, date_2])
            if column == 'datetime_traitement':
                rows = rows.filter(datetime_traitement__range=[date_1, date_2])

    # Check access
    if not request.user.groups.filter(name__in=[
            settings.SYSADMIN_GROUP, settings.DIRECTION_GROUP,
            settings.RECEPTION_GROUP
    ]).exists():
        auth_classes = get_classes([ens], check_access=True, user=request.user)
        rows = rows.filter(matricule__classe__in=auth_classes)

    # Ordering
    asc = ''
    if order_asc:
        asc = '-'

    if order_by in [
            'datetime_appel', 'datetime_motif_start', 'datetime_motif_end'
    ]:
        rows = rows.order_by(asc + order_by)

    if order_by in ['classe']:
        rows = rows.order_by(asc + 'matricule__' + order_by)

    if order_by in ['name']:
        rows = rows.order_by(asc + 'matricule__lastname')

    if order_by in ['datetime_traitement']:
        rows = rows.annotate(**{
            'null_' + order_by: Count(order_by)
        }).order_by('-null_' + order_by, asc + order_by)

    # Transform query into a list and thus make the actual query on the database
    return list(rows)
Example #21
0
def search_people(query,
                  people_type,
                  teachings,
                  check_access,
                  user,
                  tenure_class_only=True,
                  educ_by_years=True,
                  active=True):
    if len(query) < 1:
        return []

    truncate_limit = 50

    people = []
    if people_type == 'all':
        classe_years = get_classes(teachings, check_access=True,
                                   user=user) if check_access else None

        result = People().get_people_by_name(query,
                                             teachings,
                                             classes=classe_years,
                                             active=active)
        # Check quality.
        if result['student'][1] > result['responsible'][1]:
            people = StudentSerializer(result['student'][0][:truncate_limit],
                                       many=True).data
        elif result['responsible'][1] > result['student'][1]:
            people = ResponsibleSerializer(
                result['responsible'][0][:truncate_limit], many=True).data
        else:
            people = StudentSerializer(
                result['student'][0][:truncate_limit / 2],
                many=True).data + ResponsibleSerializer(
                    result['responsible'][0][:truncate_limit / 2],
                    many=True).data

    if people_type == 'student':
        classe_years = get_classes(
            teachings,
            check_access=True,
            user=user,
            tenure_class_only=tenure_class_only,
            educ_by_years=educ_by_years) if check_access else None
        if query == 'everybody':
            students = StudentModel.objects.all()
            if active:
                students = students.filter(inactive_from__isnull=True,
                                           classe__isnull=False)
            if classe_years:
                students = students.filter(classe__in=classe_years)
            if teachings and 'all' not in teachings:
                if type(teachings[0]) == TeachingModel:
                    students = students.filter(teaching__in=teachings)
                else:
                    students = students.filter(teaching__name__in=teachings)
            truncate_limit = len(students)
        else:
            students = People().get_students_by_name(
                query, teachings, classes=classe_years,
                active=active)[:truncate_limit]

        people = StudentSerializer(students, many=True).data

    if people_type == 'responsible':
        people = ResponsibleSerializer(People().get_responsibles_by_name(
            query, teachings, active=active)[:truncate_limit],
                                       many=True).data

    if people_type == 'teacher':
        people = ResponsibleSerializer(People().get_teachers_by_name(
            query, teachings, active=active)[:truncate_limit],
                                       many=True).data

    if people_type == 'educator':
        people = ResponsibleSerializer(People().get_educators_by_name(
            query, teachings, active=active)[:truncate_limit],
                                       many=True).data

    return people[:truncate_limit]
Example #22
0
def filter_and_order(request, only_actives=False, retenues=False, year=None,
                     column=None, data1=None, data2=None,
                     column2=None, data3=None, data4=None,
                     order_by=None, order_asc=False):
    rows = CasEleve.objects.filter(matricule__isnull=False)

    # Filter the rows from the user teaching.
    try:
        teachings = ResponsibleModel.objects.get(user=request.user).teaching.all()
    except ObjectDoesNotExist:
        # Responsible doesn't exist return null result.
        return []
    rows = rows.filter(matricule__teaching__in=teachings)

    # First we filter and order at the query level
    # Filtering
    if only_actives:
        rows = rows.filter(datetime_conseil__isnull=False)

    if year:
        date_1 = timezone.datetime.strptime(str(year) + "-08-20", '%Y-%m-%d')
        date_2 = timezone.datetime.strptime(str(year + 1) + "-08-19", '%Y-%m-%d')
        rows = rows.filter(datetime_encodage__range=[date_1, date_2])
    if retenues:
        rows = rows.filter(sanction_decision__pk__in=SANCTIONS_RETENUE)
    if column and data1 != '':
        if column == 'name':
            rows = rows.filter(name__unaccent__icontains=data1)
        if column == 'matricule':
            rows = rows.filter(matricule__matricule=int(data1))
        if column == 'classe':
            students = People().get_students_by_classe(data1, ['secondaire'])
            rows = rows.filter(matricule__in=students)
        if column == 'info':
            rows = rows.filter(info__info__icontains=data1)
        if column == 'sanction':
            # Filter sanction by id
            sanctions = list(map(lambda s: s.pk,
                                 SanctionDecisionDisciplinaire.objects.filter(sanction_decision__icontains=data1)))
            # Filter Cas by info_id
            rows = rows.filter(sanction_decision__in=sanctions)
        if column == 'demandeur':
            rows = rows.filter(demandeur__icontains=data1)
        if column == 'comment':
            rows = rows.filter(explication_commentaire__icontains=data1)
        if column == 'sanction_faite':
            rows = rows.filter(sanction_faite='oui'.startswith(data1.lower()))

        # Check if entries are valids
        if column.startswith('datetime') and data2 != '':
            date_1 = timezone.datetime.strptime(data1, '%d/%m/%Y') if type(data1) == str else data1
            date_2 = timezone.datetime.strptime(data2, '%d/%m/%Y') if type(data2) == str else data2
            date_1 = timezone.make_aware(date_1) if timezone.is_naive(date_1) else date_1
            date_2 = timezone.make_aware(date_2) if timezone.is_naive(date_2) else date_2
            date_1 = date_1.replace(hour=1)
            date_2 = date_2.replace(hour=23)

            if column == 'datetime_encodage':
                rows = rows.filter(datetime_encodage__range=[date_1, date_2])
            if column == 'datetime_council':
                rows = rows.filter(datetime_conseil__range=[date_1, date_2])
            if column == 'datetime_sanction':
                rows = rows.filter(datetime_sanction__range=[date_1, date_2])

    # Check access
    if not request.user.groups.filter(name__in=[settings.SYSADMIN_GROUP, settings.DIRECTION_GROUP]).exists():
        auth_classes = get_classes(['secondaire'], check_access=True, user=request.user)

        if request.user.groups.filter(name__istartswith='coord').exists():
            if retenues:
                rows = rows.filter(Q(matricule__classe__in=auth_classes)
                                   | Q(sanction_decision__pk__in=SANCTIONS_RETENUE))
            else:
                rows = rows.filter(matricule__classe__in=auth_classes)

        elif request.user.groups.filter(name='educateur'):
            if retenues:
                rows = rows.filter(Q(matricule__classe__in=auth_classes, visible_by_educ=True)
                                   | Q(sanction_decision__pk__in=SANCTIONS_RETENUE))
            else:
                rows = rows.filter(matricule__classe__in=auth_classes, visible_by_educ=True)

        elif request.user.groups.filter(name=settings.TEACHER_GROUP):
            # teacher = teacher_man.get_people(filters=['uid=' + request.user.username])[0]
            classes = ResponsibleModel.objects.get(user=request.user).tenure.all()
            rows = rows.filter(matricule__classe__in=classes, visible_by_tenure=True)


    # Ordering
    asc = ''
    if order_asc:
        asc = '-'

    if order_by in ['datetime_encodage', 'demandeur']:
        rows = rows.order_by(asc + order_by)

    if order_by in ['classe']:
        rows = rows.order_by(
            asc + 'matricule__' + order_by + '__year',
            asc + 'matricule__' + order_by + '__letter',
            asc + 'matricule__last_name',
        )

    if order_by in ['name']:
        rows = rows.order_by(asc + 'matricule__last_name')

    if order_by in ['datetime_sanction', 'datetime_conseil', 'sanction_faite']:
        rows = rows.annotate(**{'null_' + order_by: Count(order_by)}).order_by('-null_' + order_by,
                                                                                       asc + order_by)

    # Transform query into a list and thus make the actual query on the database
    return list(rows)
Example #23
0
def filter_and_order(request,
                     only_actives=False,
                     column=None,
                     data1=None,
                     data2=None,
                     order_by=None,
                     order_asc=False,
                     ens='all'):
    rows = Passage.objects.filter(matricule__isnull=False)

    # First we filter and order at the query level
    # Filtering
    if only_actives:
        rows = rows.filter(datetime_sortie__isnull=only_actives)
    if ens != 'all':
        rows = rows.filter(matricule__teaching__name=ens)
    if column and data1 != '':
        if column == 'name':
            students = People().get_students_by_name(data1, teaching=[ens])
            rows = rows.filter(matricule__in=students)

        if column == 'matricule':
            rows = rows.filter(matricule__matricule=int(data1))
        if column == 'classe':
            students = People().get_students_by_classe(data1, [ens])
            rows = rows.filter(matricule__in=students)
        if column == 'motif':
            rows = rows.filter(motifs_admission__icontains=data1)
        if column == 'comment':
            rows = rows.filter(remarques_sortie__icontains=data1)

        # Check if entries are valids
        if column.startswith('datetime') and data2 != '':
            date_1 = timezone.datetime.strptime(
                data1, '%d/%m/%Y') if type(data1) == str else data1
            date_2 = timezone.datetime.strptime(
                data2, '%d/%m/%Y') if type(data2) == str else data2
            date_1 = timezone.make_aware(date_1) if timezone.is_naive(
                date_1) else date_1
            date_2 = date_2.replace(hour=23, minute=59)
            date_2 = timezone.make_aware(date_2) if timezone.is_naive(
                date_2) else date_2

            if column == 'datetime_arrive':
                rows = rows.filter(datetime_arrive__range=[date_1, date_2])
            if column == 'datetime_sortie':
                rows = rows.filter(datetime_sortie__range=[date_1, date_2])

    # Check access
    if not request.user.groups.filter(name__in=[
            settings.SYSADMIN_GROUP, settings.DIRECTION_GROUP,
            settings.RECEPTION_GROUP
    ]).exists():
        auth_classes = get_classes([ens], check_access=True, user=request.user)
        rows = rows.filter(matricule__classe__in=auth_classes)

    # Ordering
    asc = ''
    if order_asc:
        asc = '-'

    if order_by in ['datetime_arrive']:
        rows = rows.order_by(asc + order_by)

    if order_by in ['classe']:
        rows = rows.order_by(asc + 'matricule__' + order_by)

    if order_by in ['name']:
        rows = rows.order_by(asc + 'matricule__last_name')

    if order_by in ['datetime_sortie']:
        rows = rows.annotate(**{
            'null_' + order_by: Count(order_by)
        }).order_by('-null_' + order_by, asc + order_by)

    return list(rows)
Example #24
0
def nouveau(request):
    form = NouveauCasForm(request.POST)
    if form.is_valid():
        explication_commentaire = demandeur = ""
        info = sanction_decision = datetime_sanction = datetime_conseil = None
        sanction_faite = False
        visible_by_educ = visible_by_tenure = True

        if form.cleaned_data['est_disciplinaire'] == 'non_disciplinaire':
            info = InfoEleve.objects.get(pk=form.cleaned_data['info'])
            explication_commentaire = form.cleaned_data['commentaire_info']
            visible_by_educ = form.cleaned_data['visible_by_educ']
            visible_by_tenure = form.cleaned_data['visible_by_tenure']
        else:
            sanction_decision = SanctionDecisionDisciplinaire.objects.get(pk=form.cleaned_data['sanction_decision'])
            datetime_sanction = form.cleaned_data['datetime_sanction']
            explication_commentaire = form.cleaned_data['explication_sanction']
            sanction_faite = form.cleaned_data['sanction_faite']
            if form.cleaned_data['conseil_discipline']:
                datetime_conseil = form.cleaned_data['datetime_conseil']

        c = None

        if int(request.POST['id']) < 0:
            # Create a new entry.
            matricule = form.cleaned_data['matricule']
            try:
                student = People().get_student_by_id(matricule, ['secondaire'])
            except ObjectDoesNotExist:
                print(ObjectDoesNotExist("Student matricule %s does not exist" % matricule))
                return

            # Check authorizations.
            classes = get_classes(teaching=['secondaire'], check_access=True, user=request.user)
            if student.classe not in classes:
                return

            c = CasEleve(matricule=student, name=student.fullname)
            c.datetime_encodage = timezone.now()
            c.user = request.user.username
        else:
            c = CasEleve.objects.get(pk=request.POST['id'])
            # Check authorizations.
            classes = get_classes(teaching=['secondaire'], check_access=True, user=request.user)
            if c.matricule.classe not in classes:
                return

        c.info = info
        c.demandeur = form.cleaned_data['demandeur']
        c.important = form.cleaned_data['important']
        c.sanction_decision = sanction_decision
        c.explication_commentaire = explication_commentaire
        c.datetime_sanction = datetime_sanction
        c.datetime_conseil = datetime_conseil
        c.sanction_faite = sanction_faite
        c.visible_by_educ = visible_by_educ
        c.visible_by_tenure = visible_by_tenure

        # Check if we need to send info to the related teachers
        if info and form.cleaned_data['send_to_teachers']:
            student = People().get_student_by_id(c.matricule.matricule)
            teachers_obj = ResponsibleModel.objects.filter(classe=student.classe)
            # student = student_man.get_person(c.matricule.matricule)
            # teachers_obj = teacher_man.get_people(filters=['classe=' + student.classe, 'enseignement=secondaire'])

            teachers = []
            for t in teachers_obj:
                if not t.email_alias:
                    send_email(to=[settings.EMAIL_ADMIN],
                               subject='ISLN : À propos de ' + student.fullname + " non envoyé à %s" % t.full_name,
                               email_template="dossier_eleve/email_info.html",
                               context={'student': student, 'info': model_to_dict(c), 'info_type': info}
                               )
                else:
                    teachers.append(t.email_alias)

            # Add coord and educs to email list
            teachers += map(lambda e: e.email, EmailModel.objects.filter(teaching=student.teaching, years=student.classe.year))
            teachers += list(map(lambda e: e.email, EmailModel.objects.filter(is_pms=True)))

            if not settings.DEBUG:
                try:
                    send_email(to=teachers,
                               subject='ISLN : À propos de ' + student.fullname,
                               email_template="dossier_eleve/email_info.html",
                               context={'student': student, 'info': model_to_dict(c), 'info_type': info}
                               )
                except Exception as err:
                    send_email(to=teachers,
                               subject='ISLN : À propos de ' + student.fullname,
                               email_template="dossier_eleve/email_info.html",
                               context={'student': student, 'info': model_to_dict(c), 'info_type': info}
                               )
            else:
                print(teachers)
                send_email(to=[settings.EMAIL_ADMIN],
                           subject='ISLN : À propos de ' + student.fullname,
                           email_template="dossier_eleve/email_info.html",
                           context={'student': student, 'info': model_to_dict(c), 'info_type': info}
                           )
                for t in teachers:
                    print("Sending email to : " + t)

        c.save()
    else:
        print("ERROR !!!!!")
        print(form.errors)