示例#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
示例#2
0
    def gen_stats(self, user_from, matricule, only_sanctions=False, all_years=False):
        all_access = get_settings().all_access.all()
        queryset = CasEleve.objects.all()
        if not user_from.groups.intersection(all_access).exists():
            teachings = ResponsibleModel.objects.get(user=user_from).teaching.all()
            classes = get_classes(list(map(lambda t: t.name, teachings)), True, user_from)
            queryset = queryset.filter(matricule__classe__in=classes)

        cas_discip = queryset.filter(info=None, matricule=matricule)\
                             .filter(Q(sanction_faite=True) | Q(sanction_faite__isnull=True))
        cas_info = queryset.filter(sanction_decision=None, matricule=matricule)

        if not all_years:
            current_scolar_year = get_scholar_year()
            limit_date = timezone.make_aware(timezone.datetime(current_scolar_year, 8, 15))
            cas_discip = cas_discip.filter(datetime_encodage__gte=limit_date)
            cas_info = cas_info.filter(datetime_encodage__gte=limit_date)

        sanctions = SanctionStatisticsModel.objects.all()

        stats = []
        for s in sanctions:
            stat = {
                'display': s.display,
                'value': len(cas_discip.filter(sanction_decision__in=s.sanctions_decisions.all()))
            }
            stats.append(stat)

        if not only_sanctions:
            stats.append({'display': 'Non disciplinaire', 'value': len(cas_info)})
            stats.append({'display': 'Total disciplinaire', 'value': len(cas_discip)})

        return stats
示例#3
0
    def get(self, request, matricule, format=None):
        all_access = get_settings().all_access.all()
        queryset = CasEleve.objects.all()
        only_sanctions = request.GET.get('only_sanctions', 1) == 1
        if not request.user.groups.intersection(all_access).exists():
            teachings = ResponsibleModel.objects.get(user=self.request.user).teaching.all()
            classes = get_classes(list(map(lambda t: t.name, teachings)), True, self.request.user)
            queryset = queryset.filter(matricule__classe__in=classes)

        current_scolar_year = get_scolar_year()
        limit_date = timezone.make_aware(timezone.datetime(current_scolar_year, 8, 15))

        cas_discip = queryset.filter(info=None, matricule=matricule).filter(Q(sanction_faite=True)
                                                                            | Q(sanction_faite__isnull=True))
        cas_info = queryset.filter(sanction_decision=None, matricule=matricule,
                                           datetime_encodage__gte=limit_date)

        sanctions = SanctionStatisticsModel.objects.all()

        stats = []
        for s in sanctions:
            stat = {
                'display': s.display,
                'value': len(cas_discip.filter(sanction_decision__in=s.sanctions_decisions.all()))
            }
            stats.append(stat)

        if not only_sanctions:
            stats.append({'display': 'Non disciplinaire', 'value': len(cas_info)})
            stats.append({'display': 'Total disciplinaire', 'value': len(cas_discip)})

        return Response(json.dumps(stats))
示例#4
0
    def get(self, request, format=None):
        teachings = ResponsibleModel.objects.get(
            user=self.request.user).teaching.all()
        classes = get_classes(list(map(lambda t: t.name, teachings)), True,
                              self.request.user)
        students = StudentModel.objects.filter(classe__in=classes)
        absences = self._filter_scholar_year(
            StudentAbsenceModel.objects.filter(
                student=OuterRef('matricule'))).values('student').annotate(
                    half_days=Sum(
                        Case(When(morning=True, afternoon=True, then=2),
                             When(Q(morning=True) | Q(afternoon=True), then=1),
                             When(morning=False, afternoon=False, then=0),
                             output_field=IntegerField()))).values('half_days')

        justif = JustificationModel.objects.filter(
            student=OuterRef('matricule')).values('student').annotate(
                total=Sum('half_days')).values('total')

        half_days = students.annotate(half_day_miss=Subquery(absences), half_day_just=Coalesce(Subquery(justif), 0))\
            .exclude(half_day_miss__isnull=True).annotate(half_day_diff=F('half_day_miss') - F('half_day_just'))\
            .values('matricule', 'half_day_miss', 'half_day_just', 'half_day_diff').order_by('-half_day_diff')

        # Keep only the first 15 students.
        half_days = list(
            map(
                lambda s: {
                    **s, 'student':
                    StudentModel.objects.get(matricule=s['matricule']).
                    fullname_classe
                }, half_days[:15]))
        return Response(half_days)
示例#5
0
    def get_queryset(self):
        filtering = get_settings().filter_students_for_educ
        force_all_access = self.request.query_params.get('forceAllAccess', "false")
        force_all_access = json.loads(force_all_access) if force_all_access else False
        if filtering == "none" or force_all_access:
            return self.queryset

        classes = get_classes(check_access=True, user=self.request.user, educ_by_years=filtering == "year")
        return self.queryset.filter(student__classe__in=classes)
示例#6
0
    def get_queryset(self):
        filtering = get_settings().filter_students_for_educ
        if filtering == "none" or self.request.query_params.get(
                'forceAllAccess', False):
            return self.queryset

        classes = get_classes(check_access=True,
                              user=self.request.user,
                              educ_by_years=filtering == "year")
        return self.queryset.filter(student__classe__in=classes)
示例#7
0
 def get_queryset(self):
     if not self.filter_access and self.request.user.groups.intersection(
             self.all_access).exists():
         return self.queryset
     else:
         teachings = ResponsibleModel.objects.get(
             user=self.request.user).teaching.all()
         classes = get_classes(list(map(lambda t: t.name, teachings)), True,
                               self.request.user)
         return self.queryset.filter(matricule__classe__in=classes)
示例#8
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
示例#9
0
def create_classes_list(request,
                        enseignement="all",
                        check_access=False,
                        annees="",
                        letters=""):
    classes = get_classes([enseignement], check_access, request.user)

    if annees:
        classes = classes.filter(year=annees)

    if letters:
        classes = classes.filter(letter=letters.lower())

    return list(map(lambda c: str(c), classes))
示例#10
0
    def classe_by(self, queryset, name, value):
        if not value[0].isdigit():
            return queryset

        all_access = get_settings().all_access.all()
        if not self.request.user.groups.intersection(all_access).exists():
            teachings = ResponsibleModel.objects.get(user=self.request.user).teaching.all()
            classes = get_classes(list(map(lambda t: t.name, teachings)), True, self.request.user)
            queryset = queryset.filter(matricule__classe__in=classes)

        if len(value) > 0:
            queryset = queryset.filter(matricule__classe__year=value[0])
            if len(value) > 1:
                queryset = queryset.filter(matricule__classe__letter=value[1].lower())
        return queryset
示例#11
0
 def get_queryset(self):
     if self.request.user.groups.intersection(self.get_group_all_access()).exists():
         return self.queryset
     else:
         try:
             teachings = ResponsibleModel.objects.get(user=self.request.user).teaching.all()
             classes = get_classes(list(map(lambda t: t.name, teachings)), True, self.request.user,
                                   tenure_class_only=self.is_only_tenure())
             try:
                 queryset = self.queryset.filter(student__classe__in=classes)
             except FieldError:
                 queryset = self.queryset.filter(matricule__classe__in=classes)
                 warnings.warn("Use *student* as field name instead of matricule", DeprecationWarning)
             return queryset
         except ObjectDoesNotExist:
             return self.queryset.none()
示例#12
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')
示例#13
0
def search_years(query, teachings, check_access, user):
    if len(query) == 0:
        return []

    if not query[0].isdigit():
        return []

    if len(query) > 1:
        if query[1] != "é" or query[1] != "e":
            return []

    years = get_classes(teaching=teachings,
                        check_access=check_access,
                        user=user).distinct('year', 'teaching')
    return YearSerializer(years.filter(year=query[0]).order_by('year'),
                          many=True,
                          show_teaching=len(teachings) > 1).data
示例#14
0
def search_classes(query, teachings, check_access, user):
    if len(query) == 0:
        return []

    if not query[0].isdigit():
        return []

    truncate = True
    classes = get_classes(teaching=teachings,
                          check_access=check_access,
                          user=user)
    classes = classes.filter(year=query[0]).order_by('year', 'letter')
    if len(query) > 1:
        classes = classes.filter(letter=query[1].lower())

    if truncate:
        classes = classes[:100]

    return ClasseSerializer(classes, many=True).data
示例#15
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]
示例#16
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]
示例#17
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)
示例#18
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)
示例#19
0
 def has_object_permission(self, request, view, obj):
     teachings = ResponsibleModel.objects.get(
         user=self.request.user).teaching.all()
     classes = get_classes(list(map(lambda t: t.name, teachings)), True,
                           self.request.user)
     return obj.matricule.classe in classes
示例#20
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)
示例#21
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)