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 })
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})
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' })