Ejemplo n.º 1
0
def toggle_choice(request):
    campaign = get_active_campaign_or_404()
    volunteer = get_object_or_404(Volunteer, pk=request.POST.get('volunteer_id'))

    with transaction.atomic():
        cursor = connection.cursor()
        cursor.execute('LOCK TABLE %s' % VolunteerCampaign._meta.db_table)

        created = False

        try:
            obj = VolunteerCampaign.objects.get(
                Q(accepted__isnull=True) | Q(accepted=True),
                campaign=campaign, volunteer=volunteer,
            )
        except VolunteerCampaign.DoesNotExist:
            obj, created = VolunteerCampaign.objects.get_or_create(
                campaign=campaign, volunteer=volunteer,
                organisation=request.user.organisation,
            )

        if created:
            serializer = URLSafeSerializer(settings.SECRET_KEY)
            confirm_invite_url = reverse('confirm_invite', args=[serializer.dumps(obj.pk)])
            get_adapter().send_mail('emails/volunteer_invitation', volunteer.user.email, {
                'organisation': request.user.organisation,
                'confirm_invite_url': request.build_absolute_uri(confirm_invite_url),
            })

    state, label = get_volunteer_status(obj, request.user.organisation)

    return JsonResponse({
        'state': state,
        'label': label,
    })
Ejemplo n.º 2
0
def volunteers_list(request):
    campaign = get_active_campaign_or_404()
    filter_form = VolunteerFilterForm(request.GET)

    qs = Volunteer.objects.all()

    if filter_form.is_valid():
        cld = filter_form.cleaned_data

        if cld['places']:
            qs = qs.filter(places__id__in=[x.pk for x in cld['places']])

        if cld['shifts']:
            qs = qs.filter(shift__id__in=[x.pk for x in cld['shifts']])

        if cld['state'] == 'accepted':
            qs = qs.filter(
                campaigns=campaign,
                states__organisation__pk=request.user.organisation.pk,
                states__accepted=True,
            )
        elif cld['state'] == 'available':
            qs = qs.exclude(states__in=VolunteerCampaign.objects.distinct().filter(
                Q(accepted=True) |
                Q(accepted__isnull=True),
                campaign_id=campaign.pk,
            ))
        elif cld['state'] == 'invited':
            qs = qs.filter(
                campaigns=campaign,
                states__organisation=request.user.organisation,
            )

    qs = (
        qs.
        distinct().
        select_related('user').
        prefetch_related(
            'shift', 'places',
            Prefetch('campaigns', to_attr='taken', queryset=(
                VolunteerCampaign.objects.
                exclude(organisation=request.user.organisation).
                filter(campaign=campaign, accepted=True)
            )),
            Prefetch('campaigns', to_attr='state', queryset=(
                VolunteerCampaign.objects.
                filter(campaign=campaign, organisation=request.user.organisation)
            )),
        ).
        order_by('user__first_name', 'user__last_name', 'id')
    )

    rows_per_page = 25
    paginator = Paginator(qs, rows_per_page)

    try:
        volunteers = paginator.page(request.GET.get('page'))
    except PageNotAnInteger:
        volunteers = paginator.page(1)
    except EmptyPage:
        volunteers = paginator.page(paginator.num_pages)

    return render(request, 'organisations/volunteers_list.html', {
        'filter': filter_form,
        'volunteers': volunteers,
        'current_menu_item': 'organisation:volunteers',
    })