Example #1
0
def list_staff_projects(request, pk):
    """
    List all proposals of a staff member
    """
    user = get_all_staff().get(id=pk)
    projects = user.proposalsresponsible.all() | user.proposals.all()
    projects = projects.select_related('ResponsibleStaff', 'Track', 'TimeSlot'). \
        prefetch_related('Assistants', 'distributions', 'applications')

    return render(
        request, 'proposals/list_projects_custom.html', {
            "title": "Proposals from " + user.usermeta.get_nice_name(),
            "proposals": projects
        })
Example #2
0
def list_staff(request):
    """
    List all staff with a distributed projects

    :param request:
    :return:
    """
    def nint(nr):
        """
        :param <int> nr:
        :return:
        """
        if nr is None:
            return 0
        else:
            return int(nr)

    staff = get_all_staff().filter(
        Q(groups=get_grouptype("2"))
        | Q(groups=get_grouptype("1"))).prefetch_related(
            'proposalsresponsible', 'proposals')
    se = []
    for s in staff:
        p1 = s.proposalsresponsible.filter(TimeSlot=get_timeslot())
        p2 = s.proposals.filter(TimeSlot=get_timeslot())
        pt1 = p1.count()
        pt2 = p2.count()
        pts = pt1 + pt2
        dt1 = nint(
            p1.annotate(Count('distributions')).aggregate(
                Sum('distributions__count'))['distributions__count__sum'])
        dt2 = nint(
            p2.annotate(Count('distributions')).aggregate(
                Sum('distributions__count'))['distributions__count__sum'])
        dts = dt1 + dt2
        se.append({
            "user": s,
            "pt1": pt1,
            "pt2": pt2,
            "pts": pts,
            "dt1": dt1,
            "dt2": dt2,
            "dts": dts
        })
    return render(request, 'support/list_staff.html', {"staff": se})
Example #3
0
def mail_distributions(request):
    """
    Mail all distributions to affected users

    :param request:
    :return:
    """
    if get_timephase_number() < 4 or get_timephase_number() > 5:
        # mailing is possible in phase 4 or 5
        raise PermissionDenied('Mailing distributions is not possible in this timephase')

    if request.method == 'POST':
        form = ConfirmForm(request.POST)
        if form.is_valid():
            mails = []
            ts = get_timeslot()
            # iterate through projects, put students directly in the mail list
            for prop in get_all_proposals().filter(Q(distributions__isnull=False)):
                for dist in prop.distributions.filter(TimeSlot=ts):
                    mails.append({
                        'template': 'email/studentdistribution.html',
                        'email': dist.Student.email,
                        'subject': 'distribution',
                        'context': {
                            'project': prop,
                            'student': dist.Student,
                        }
                    })

            # iterate through all assistants and responsible
            for usr in get_all_staff().filter(Q(groups__name='type1staff') | Q(groups__name='type2staff')):
                if usr.proposals.filter(TimeSlot=get_timeslot()).exists():
                    mails.append({
                        'template': 'email/assistantdistribution.html',
                        'email': usr.email,
                        'subject': 'distribution',
                        'context': {
                            'supervisor': usr,
                            'projects': usr.proposals.filter(TimeSlot=get_timeslot()).distinct(),
                        }
                    })
                if usr.proposalsresponsible.filter(TimeSlot=get_timeslot()).exists():
                    mails.append({
                        'template': 'email/supervisordistribution.html',
                        'email': usr.email,
                        'subject': 'distribution',
                        'context': {
                            'supervisor': usr,
                            'projects': usr.proposalsresponsible.filter(TimeSlot=get_timeslot()).distinct(),
                        }
                    })

            # UNCOMMENT THIS TO MAIL NOT_DISTRIBUTED STUDENTS WITH 'action required'
            # for usr in get_all_students().filter(distributions__isnull=True):
            #     mails.append({
            #         'template': 'email/studentnodistribution.html',
            #         'email': usr.email,
            #         'subject': 'action required',
            #         'context': {
            #             'student': usr,
            #         }
            #     })
            EmailThreadTemplate(mails).start()

            return render(request, 'support/email_progress.html')
    else:
        form = ConfirmForm()

    return render(request, 'GenericForm.html', {
        'form': form,
        'formtitle': 'Confirm mailing distributions',
        'buttontext': 'Confirm'
    })