def labour_admin_signups_view(request, vars, event, format='screen'):
    meta = event.labour_event_meta
    SignupClass = SignupCertificateProxy if format == 'html' else Signup
    SignupExtra = meta.signup_extra_model
    signups = SignupClass.objects.filter(event=event)
    signups = signups.select_related('person').select_related('event')
    signups = signups.prefetch_related('job_categories').prefetch_related('job_categories_accepted')

    if format in HTML_TEMPLATES:
        num_all_signups = signups.count()

    job_categories = event.jobcategory_set.all()
    personnel_classes = event.personnelclass_set.filter(app_label='labour')

    job_category_filters = Filter(request, "job_category").add_objects("job_categories__slug", job_categories)
    signups = job_category_filters.filter_queryset(signups)
    job_category_accepted_filters = Filter(request, "job_category_accepted").add_objects("job_categories_accepted__slug", job_categories)
    signups = job_category_accepted_filters.filter_queryset(signups)
    personnel_class_filters = Filter(request, "personnel_class").add_objects("personnel_classes__slug", personnel_classes)
    signups = personnel_class_filters.filter_queryset(signups)

    state_filter = SignupStateFilter(request, "state")
    signups = state_filter.filter_queryset(signups)

    if SignupExtra.get_field('night_work'):
        night_work_path = '{prefix}{app_label}_signup_extra__night_work'.format(
            prefix='person__' if SignupExtra.schema_version >= 2 else '',
            app_label=SignupExtra._meta.app_label
        )
        night_work_filter = Filter(request, 'night_work').add_booleans(night_work_path)
        signups = night_work_filter.filter_queryset(signups)
    else:
        night_work_filter = None

    sorter = Sorter(request, "sort")
    sorter.add("name", name='Sukunimi, Etunimi', definition=('person__surname', 'person__first_name'))
    sorter.add("newest", name='Uusin ensin', definition=('-created_at',))
    sorter.add("oldest", name='Vanhin ensin', definition=('created_at',))
    signups = sorter.order_queryset(signups)

    if request.method == 'POST':
        action = request.POST.get('action', None)
        if action == 'reject':
            SignupClass.mass_reject(signups)
        elif action == 'request_confirmation':
            SignupClass.mass_request_confirmation(signups)
        elif action == 'send_shifts':
            SignupClass.mass_send_shifts(signups)
        else:
            messages.error(request, 'Ei semmosta toimintoa oo.')

        return redirect('labour_admin_signups_view', event.slug)

    elif format in HTML_TEMPLATES:
        num_would_mass_reject = signups.filter(**SignupClass.get_state_query_params('new')).count()
        num_would_mass_request_confirmation = signups.filter(**SignupClass.get_state_query_params('accepted')).count()
        num_would_send_shifts = SignupClass.filter_signups_for_mass_send_shifts(signups).count()

        mass_operations = OrderedDict([
            ('reject', MassOperation(
                'reject',
                'labour-admin-mass-reject-modal',
                'Hylkää kaikki käsittelemättömät...',
                num_would_mass_reject,
            )),
            ('request_confirmation', MassOperation(
                'request_confirmation',
                'labour-admin-mass-request-confirmation-modal',
                'Vaadi vahvistusta kaikilta hyväksytyiltä...',
                num_would_mass_request_confirmation,
            )),
            ('send_shifts', MassOperation(
                'send_shifts',
                'labour-admin-mass-send-shifts-modal',
                'Lähetä vuorot kaikille vuoroja odottaville, joille ne on määritelty...',
                num_would_send_shifts,
            )),
        ])

        vars.update(
            export_formats=EXPORT_FORMATS,
            job_category_accepted_filters=job_category_accepted_filters,
            job_category_filters=job_category_filters,
            mass_operations=mass_operations,
            night_work_filter=night_work_filter,
            num_all_signups=num_all_signups,
            num_signups=signups.count(),
            personnel_class_filters=personnel_class_filters,
            signups=signups,
            sorter=sorter,
            state_filter=state_filter,
            css_to_show_filter_panel='in' if any(f.selected_slug != f.default for f in [
                job_category_filters,
                job_category_accepted_filters,
                personnel_class_filters,
                state_filter,
                sorter,
            ]) else '',
            now=now(),
        )

        html_template = HTML_TEMPLATES[format]

        return render(request, html_template, vars)
    elif format in CSV_EXPORT_FORMATS:
        filename = "{event.slug}_signups_{timestamp}.{format}".format(
            event=event,
            timestamp=now().strftime('%Y%m%d%H%M%S'),
            format=format,
        )

        return csv_response(event, SignupClass, signups,
            dialect=CSV_EXPORT_FORMATS[format],
            filename=filename,
            m2m_mode='separate_columns',
        )
    else:
        raise NotImplementedError(format)
Exemple #2
0
def labour_admin_shifts_view(request, vars, event, format='screen'):
    shifts = (Shift.objects.filter(
        job__job_category__event=event).select_related(
            'signup__person').select_related('job__job_category').order_by(
                'start_time', 'signup__person__surname',
                'signup__person__first_name'))

    num_total_shifts = shifts.count()

    job_categories = JobCategory.objects.filter(event=event)
    job_category_filters = Filter(request, 'category').add_objects(
        'job__job_category__slug', job_categories)
    shifts = job_category_filters.filter_queryset(shifts)

    sorter = Sorter(request, "sort")
    sorter.add("name",
               name='Nimen mukaan',
               definition=(
                   'signup__person__surname',
                   'signup__person__first_name',
                   'start_time',
               ))
    sorter.add("job",
               name='Tehtävän mukaan',
               definition=(
                   'job__job_category__name',
                   'job__title',
                   'start_time',
                   'signup__person__surname',
                   'signup__person__first_name',
               ))
    sorter.add("time",
               name='Alkuajan mukaan',
               definition=(
                   'start_time',
                   'signup__person__surname',
                   'signup__person__first_name',
               ))
    shifts = sorter.order_queryset(shifts)

    t = now()
    active_filter = job_category_filters.selected_definition

    if active_filter:
        title = _('{event_name}: Shift list – {job_category_name}').format(
            event_name=event.name,
            job_category_name=active_filter.name
            if active_filter else 'Nimilista',
        )
    else:
        title = _('{event_name}: Shift list').format(event_name=event.name, )

    vars.update(
        active_filter=active_filter,
        export_formats=EXPORT_FORMATS,
        job_category_filters=job_category_filters,
        now=t,
        num_total_shifts=num_total_shifts,
        shifts=shifts,
        show_actions=(format == 'screen'),
        sorter=sorter,
        title=title,
    )

    if format in HTML_TEMPLATES:
        template = HTML_TEMPLATES[format]
        return render(request, template, vars)
    elif format in CSV_EXPORT_FORMATS:
        filename = "{event.slug}_shifts_{timestamp}.{format}".format(
            event=event,
            timestamp=t.strftime('%Y%m%d%H%M%S'),
            format=format,
        )

        return csv_response(
            event,
            Shift,
            shifts,
            dialect=CSV_EXPORT_FORMATS[format],
            filename=filename,
            m2m_mode='separate_columns',
        )
    else:
        raise NotImplementedError(format)
def labour_admin_shifts_view(request, vars, event, format='screen'):
    shifts = (
        Shift.objects.filter(job__job_category__event=event)
            .select_related('signup__person')
            .select_related('job__job_category')
            .order_by('start_time', 'signup__person__surname', 'signup__person__first_name')
    )

    num_total_shifts = shifts.count()

    job_categories = JobCategory.objects.filter(event=event)
    job_category_filters = Filter(request, 'category').add_objects('job__job_category__slug', job_categories)
    shifts = job_category_filters.filter_queryset(shifts)

    sorter = Sorter(request, "sort")
    sorter.add("name",
        name='Nimen mukaan',
        definition=(
            'signup__person__surname',
            'signup__person__first_name',
            'start_time',
        )
    )
    sorter.add("job",
        name='Tehtävän mukaan',
        definition=(
            'job__job_category__name',
            'job__title',
            'start_time',
            'signup__person__surname',
            'signup__person__first_name',
        )
    )
    sorter.add("time",
        name='Alkuajan mukaan',
        definition=(
            'start_time',
            'signup__person__surname',
            'signup__person__first_name',
        )
    )
    shifts = sorter.order_queryset(shifts)

    t = now()
    active_filter = job_category_filters.selected_definition

    if active_filter:
        title = _('{event_name}: Shift list – {job_category_name}').format(
            event_name=event.name,
            job_category_name=active_filter.name if active_filter else 'Nimilista',
        )
    else:
        title = _('{event_name}: Shift list').format(
            event_name=event.name,
        )

    vars.update(
        active_filter=active_filter,
        export_formats=EXPORT_FORMATS,
        job_category_filters=job_category_filters,
        now=t,
        num_total_shifts=num_total_shifts,
        shifts=shifts,
        show_actions=(format == 'screen'),
        sorter=sorter,
        title=title,
    )

    if format in HTML_TEMPLATES:
        template = HTML_TEMPLATES[format]
        return render(request, template, vars)
    elif format in CSV_EXPORT_FORMATS:
        filename = "{event.slug}_shifts_{timestamp}.{format}".format(
            event=event,
            timestamp=t.strftime('%Y%m%d%H%M%S'),
            format=format,
        )

        return csv_response(event, Shift, shifts,
            dialect=CSV_EXPORT_FORMATS[format],
            filename=filename,
            m2m_mode='separate_columns',
        )
    else:
        raise NotImplementedError(format)
Exemple #4
0
def admin_view(request, vars, event, format='screen'):
    programmes = (
        Programme.objects.filter(category__event=event).select_related(
            'category__event').select_related('room')

        # Does not do the needful due to formatted_organizers operating on the "through" model
        # .prefetch_related('organizers')
    )

    categories = Category.objects.filter(event=event)
    category_filters = Filter(request,
                              'category').add_objects('category__slug',
                                                      categories)
    programmes = category_filters.filter_queryset(programmes)

    rooms = event.rooms.all()
    room_filters = Filter(request, 'room').add_objects('room__slug', rooms)
    programmes = room_filters.filter_queryset(programmes)

    state_filters = Filter(request,
                           'state').add_choices('state', STATE_CHOICES)
    state_filters.filter_queryset(programmes)
    programmes = state_filters.filter_queryset(programmes)

    video_permission_filters = Filter(request, 'video_permission')
    video_permission_filters.add_choices('video_permission',
                                         VIDEO_PERMISSION_CHOICES)
    programmes = video_permission_filters.filter_queryset(programmes)

    photography_filters = Filter(request, 'photography').add_choices(
        'photography', PHOTOGRAPHY_CHOICES)
    programmes = photography_filters.filter_queryset(programmes)

    forms = AlternativeProgrammeForm.objects.filter(event=event)
    if forms.exists():
        form_filters = Filter(request,
                              'form_used').add_objects('form_used__slug',
                                                       forms)
        programmes = form_filters.filter_queryset(programmes)
    else:
        form_filters = None

    if format != 'html':
        sorter = Sorter(request, 'sort')
        sorter.add('title', name='Otsikko', definition=('title', ))
        sorter.add('start_time',
                   name='Alkuaika',
                   definition=('start_time', 'room'))
        sorter.add('room', name='Sali', definition=('room', 'start_time'))
        sorter.add('created_at',
                   name='Uusin ensin',
                   definition=('-created_at', ))
        programmes = sorter.order_queryset(programmes)

    if event.slug.startswith('ropecon'):
        miniworkshop_filters = Filter(request, 'ropecon_miniworkshop')
        miniworkshopinator = lambda is_miniworkshop: lambda programme: programme.form_used and programme.form_used.slug == 'default' and (
            programme.category.slug == 'mini') == is_miniworkshop
        miniworkshop_filters.add('1', 'Figutyöpajat', miniworkshopinator(True))
        miniworkshop_filters.add('0', 'Muu ohjelma, ei figutyöpaja',
                                 miniworkshopinator(False))
        programmes = miniworkshop_filters.filter_queryset(programmes)
    else:
        miniworkshop_filters = None

    if format == 'screen':
        vars.update(
            category_filters=category_filters,
            export_formats=EXPORT_FORMATS,
            form_filters=form_filters,
            miniworkshop_filters=miniworkshop_filters,
            photography_filters=photography_filters,
            programmes=programmes,
            room_filters=room_filters,
            sorter=sorter,
            state_filters=state_filters,
            video_permission_filters=video_permission_filters,
        )

        return render(request, 'programme_admin_view.pug', vars)
    elif format in CSV_EXPORT_FORMATS:
        filename = "{event.slug}_programmes_{timestamp}.{format}".format(
            event=event,
            timestamp=timezone.now().strftime('%Y%m%d%H%M%S'),
            format=format,
        )

        return csv_response(
            event,
            Programme,
            programmes,
            m2m_mode='comma_separated',
            dialect=CSV_EXPORT_FORMATS[format],
            filename=filename,
        )
    elif format == 'html':
        title = "{event_name}: Ohjelma".format(event_name=event.name)

        if room_filters.selected_slug is not None:
            room = Room.objects.get(event=event,
                                    slug=room_filters.selected_slug)
            title += ' – {room.name}'.format(room=room)

        if state_filters.selected_slug is not None:
            state_name = next(name for (slug, name) in STATE_CHOICES
                              if slug == state_filters.selected_slug)
            title += ' ({state_name})'.format(state_name=state_name)

        programmes_by_start_time = group_programmes_by_start_time(programmes)

        vars.update(
            title=title,
            now=timezone.now(),
            programmes=programmes,
            programmes_by_start_time=programmes_by_start_time,
        )

        return render(request, 'programme_admin_print_view.pug', vars)
    else:
        raise NotImplementedError(format)
Exemple #5
0
def programme_admin_view(request, vars, event, format='screen'):
    programmes = (
        Programme.objects.filter(category__event=event)
            .select_related('category__event')
            .select_related('room')

            # Does not do the needful due to formatted_organizers operating on the "through" model
            # .prefetch_related('organizers')
    )

    categories = Category.objects.filter(event=event)
    category_filters = Filter(request, 'category').add_objects('category__slug', categories)
    programmes = category_filters.filter_queryset(programmes)

    rooms = Room.get_rooms_for_event(event)
    room_filters = Filter(request, 'room').add_objects('room__slug', rooms)
    programmes = room_filters.filter_queryset(programmes)

    state_filters = Filter(request, 'state').add_choices('state', STATE_CHOICES)
    state_filters.filter_queryset(programmes)
    programmes = state_filters.filter_queryset(programmes)

    video_permission_filters = Filter(request, 'video_permission').add_choices('video_permission', VIDEO_PERMISSION_CHOICES)
    video_permission_filters.filter_queryset(programmes)
    programmes = video_permission_filters.filter_queryset(programmes)

    photography_filters = Filter(request, 'photography').add_choices('photography', PHOTOGRAPHY_CHOICES)
    photography_filters.filter_queryset(programmes)
    programmes = photography_filters.filter_queryset(programmes)

    forms = AlternativeProgrammeForm.objects.filter(event=event)
    if forms.exists():
        form_filters = Filter(request, 'form_used').add_objects('form_used__slug', forms)
        programmes = form_filters.filter_queryset(programmes)
    else:
        form_filters = None

    if format != 'html':
        sorter = Sorter(request, 'sort')
        sorter.add('title', name='Otsikko', definition=('title',))
        sorter.add('start_time', name='Alkuaika', definition=('start_time','room'))
        sorter.add('room', name='Sali', definition=('room','start_time'))
        sorter.add('created_at', name='Uusin ensin', definition=('-created_at',))
        programmes = sorter.order_queryset(programmes)

    if format == 'screen':
        vars.update(
            category_filters=category_filters,
            export_formats=EXPORT_FORMATS,
            form_filters=form_filters,
            photography_filters=photography_filters,
            programmes=programmes,
            room_filters=room_filters,
            sorter=sorter,
            state_filters=state_filters,
            video_permission_filters=video_permission_filters,
        )

        return render(request, 'programme_admin_view.jade', vars)
    elif format in CSV_EXPORT_FORMATS:
        filename = "{event.slug}_programmes_{timestamp}.xlsx".format(
            event=event,
            timestamp=timezone.now().strftime('%Y%m%d%H%M%S'),
        )

        return csv_response(event, Programme, programmes,
            m2m_mode='comma_separated',
            dialect='xlsx',
            filename=filename,
        )
    elif format == 'html':
        title = "{event_name}: Ohjelma".format(event_name=event.name)

        if room_filters.selected_slug != None:
            room = Room.objects.get(slug=room_filters.selected_slug)
            title += ' – {room.name}'.format(room=room)

        if state_filters.selected_slug != None:
            state_name = next(name for (slug, name) in STATE_CHOICES if slug == state_filters.selected_slug)
            title += ' ({state_name})'.format(state_name=state_name)

        programmes_by_start_time = group_programmes_by_start_time(programmes)

        vars.update(
            title=title,
            now=timezone.now(),
            programmes=programmes,
            programmes_by_start_time=programmes_by_start_time,
        )

        return render(request, 'programme_admin_print_view.jade', vars)
    else:
        raise NotImplementedError(format)
Exemple #6
0
def programme_admin_view(request, vars, event, format='screen'):
    programmes = Programme.objects.filter(category__event=event)

    categories = Category.objects.filter(event=event)
    category_filters = Filter(request, 'category').add_objects('category__slug', categories)
    programmes = category_filters.filter_queryset(programmes)

    rooms = Room.get_rooms_for_event(event)
    room_filters = Filter(request, 'room').add_objects('room__slug', rooms)
    programmes = room_filters.filter_queryset(programmes)

    state_filters = Filter(request, 'state').add_choices('state', STATE_CHOICES)
    state_filters.filter_queryset(programmes)
    programmes = state_filters.filter_queryset(programmes)

    if format != 'html':
        sorter = Sorter(request, 'sort')
        sorter.add('title', name='Otsikko', definition=('title',))
        sorter.add('start_time', name='Alkuaika', definition=('start_time','room'))
        sorter.add('room', name='Sali', definition=('room','start_time'))
        programmes = sorter.order_queryset(programmes)

    if format == 'screen':
        vars.update(
            category_filters=category_filters,
            export_formats=EXPORT_FORMATS,
            programmes=programmes,
            room_filters=room_filters,
            sorter=sorter,
            state_filters=state_filters,
        )

        return render(request, 'programme_admin_view.jade', vars)
    elif format in CSV_EXPORT_FORMATS:
        filename = "{event.slug}_programmes_{timestamp}.xlsx".format(
            event=event,
            timestamp=timezone.now().strftime('%Y%m%d%H%M%S'),
        )

        return csv_response(event, Programme, programmes,
            m2m_mode='comma_separated',
            dialect='xlsx',
            filename=filename,
        )
    elif format == 'html':
        title = u"{event_name}: Ohjelma".format(event_name=event.name)

        if room_filters.selected_slug != None:
            room = Room.objects.get(slug=room_filters.selected_slug)
            title += ' – {room.name}'.format(room=room)

        if state_filters.selected_slug != None:
            state_name = next(name for (slug, name) in STATE_CHOICES if slug == state_filters.selected_slug)
            title += ' ({state_name})'.format(state_name=state_name)

        programmes_by_start_time = group_programmes_by_start_time(programmes)

        vars.update(
            title=title,
            now=timezone.now(),
            programmes=programmes,
            programmes_by_start_time=programmes_by_start_time,
        )

        return render(request, 'programme_admin_print_view.jade', vars)
    else:
        raise NotImplementedError(format)
Exemple #7
0
def labour_admin_signups_view(request, vars, event, format='screen'):
    meta = event.labour_event_meta
    SignupClass = SignupCertificateProxy if format == 'html' else Signup
    SignupExtra = meta.signup_extra_model
    signups = SignupClass.objects.filter(event=event)
    signups = signups.select_related('person').select_related('event')
    signups = signups.prefetch_related('job_categories').prefetch_related(
        'job_categories_accepted')

    if format in HTML_TEMPLATES:
        num_all_signups = signups.count()

    job_categories = event.jobcategory_set.all()
    personnel_classes = event.personnelclass_set.filter(app_label='labour')

    job_category_filters = Filter(request, "job_category").add_objects(
        "job_categories__slug", job_categories)
    signups = job_category_filters.filter_queryset(signups)
    job_category_accepted_filters = Filter(
        request,
        "job_category_accepted").add_objects("job_categories_accepted__slug",
                                             job_categories)
    signups = job_category_accepted_filters.filter_queryset(signups)
    personnel_class_filters = Filter(request, "personnel_class").add_objects(
        "personnel_classes__slug", personnel_classes)
    signups = personnel_class_filters.filter_queryset(signups)

    state_filter = SignupStateFilter(request, "state")
    signups = state_filter.filter_queryset(signups)

    if SignupExtra.get_field('night_work'):
        night_work_path = '{prefix}{app_label}_signup_extra__night_work'.format(
            prefix='person__' if SignupExtra.schema_version >= 2 else '',
            app_label=SignupExtra._meta.app_label)
        night_work_filter = Filter(request,
                                   'night_work').add_booleans(night_work_path)
        signups = night_work_filter.filter_queryset(signups)
    else:
        night_work_filter = None

    sorter = Sorter(request, "sort")
    sorter.add("name",
               name='Sukunimi, Etunimi',
               definition=('person__surname', 'person__first_name'))
    sorter.add("newest", name='Uusin ensin', definition=('-created_at', ))
    sorter.add("oldest", name='Vanhin ensin', definition=('created_at', ))
    signups = sorter.order_queryset(signups)

    if request.method == 'POST':
        action = request.POST.get('action', None)
        if action == 'reject':
            SignupClass.mass_reject(signups)
        elif action == 'request_confirmation':
            SignupClass.mass_request_confirmation(signups)
        elif action == 'send_shifts':
            SignupClass.mass_send_shifts(signups)
        else:
            messages.error(request, 'Ei semmosta toimintoa oo.')

        return redirect('labour_admin_signups_view', event.slug)

    elif format in HTML_TEMPLATES:
        num_would_mass_reject = signups.filter(
            **SignupClass.get_state_query_params('new')).count()
        num_would_mass_request_confirmation = signups.filter(
            **SignupClass.get_state_query_params('accepted')).count()
        num_would_send_shifts = SignupClass.filter_signups_for_mass_send_shifts(
            signups).count()

        mass_operations = OrderedDict([
            ('reject',
             MassOperation(
                 'reject',
                 'labour-admin-mass-reject-modal',
                 'Hylkää kaikki käsittelemättömät...',
                 num_would_mass_reject,
             )),
            ('request_confirmation',
             MassOperation(
                 'request_confirmation',
                 'labour-admin-mass-request-confirmation-modal',
                 'Vaadi vahvistusta kaikilta hyväksytyiltä...',
                 num_would_mass_request_confirmation,
             )),
            ('send_shifts',
             MassOperation(
                 'send_shifts',
                 'labour-admin-mass-send-shifts-modal',
                 'Lähetä vuorot kaikille vuoroja odottaville, joille ne on määritelty...',
                 num_would_send_shifts,
             )),
        ])

        vars.update(
            export_formats=EXPORT_FORMATS,
            job_category_accepted_filters=job_category_accepted_filters,
            job_category_filters=job_category_filters,
            mass_operations=mass_operations,
            night_work_filter=night_work_filter,
            num_all_signups=num_all_signups,
            num_signups=signups.count(),
            personnel_class_filters=personnel_class_filters,
            signups=signups,
            sorter=sorter,
            state_filter=state_filter,
            css_to_show_filter_panel='in' if any(
                f.selected_slug != f.default for f in [
                    job_category_filters,
                    job_category_accepted_filters,
                    personnel_class_filters,
                    state_filter,
                    sorter,
                ]) else '',
            now=now(),
        )

        html_template = HTML_TEMPLATES[format]

        return render(request, html_template, vars)
    elif format in CSV_EXPORT_FORMATS:
        filename = "{event.slug}_signups_{timestamp}.{format}".format(
            event=event,
            timestamp=now().strftime('%Y%m%d%H%M%S'),
            format=format,
        )

        emit('core.person.exported', request=request, event=event)

        return csv_response(
            event,
            SignupClass,
            signups,
            dialect=CSV_EXPORT_FORMATS[format],
            filename=filename,
            m2m_mode='separate_columns',
        )
    else:
        raise NotImplementedError(format)