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