Ejemplo n.º 1
0
def enrollment_admin_view(request, vars, event):
    enrollments = (Enrollment.objects.filter(
        event=event).select_related('person').order_by('person__surname',
                                                       'person__first_name'))

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

    vars.update(
        enrollments=enrollments,
        num_enrolled=enrollments.count(),
        num_total_enrolled=enrollments.count(),
        state_filters=state_filters,
    )

    return render(request, 'enrollment_admin_view.pug', vars)
Ejemplo n.º 2
0
def enrollment_admin_view(request, vars, event):
    enrollments = (
        Enrollment.objects.filter(event=event)
        .select_related('person')
        .order_by('person__surname', 'person__first_name')
    )

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

    vars.update(
        enrollments=enrollments,
        num_enrolled=enrollments.count(),
        num_total_enrolled=enrollments.count(),
        state_filters=state_filters,
    )

    return render(request, 'enrollment_admin_view.pug', vars)
Ejemplo n.º 3
0
def actual_special_view(
    request,
    event,
    include_unpublished=False,
    template='programme_special_view.jade',
    vars=None,
    show_programme_actions=False,
):
    criteria = dict(include_unpublished=include_unpublished)

    category_slug = request.GET.get('category')
    if category_slug:
        criteria.update(category__slug=category_slug)

    programmes = event.programme_event_meta.get_special_programmes(
        **criteria).order_by('start_time')

    categories_criteria = dict(event=event)
    if not include_unpublished:
        categories_criteria.update(public=True)
    categories = Category.objects.filter(**categories_criteria)
    category_filters = Filter(request,
                              'category').add_objects('category__slug',
                                                      categories)
    programmes = category_filters.filter_queryset(programmes)

    programmes_by_start_time = group_programmes_by_start_time(programmes)

    if vars is None:
        vars = dict()

    vars.update(
        category_filters=category_filters,
        event=event,
        programmes_by_start_time=programmes_by_start_time,
        show_programme_actions=show_programme_actions,
        tabs=get_timetable_tabs(request, event),
    )

    return render(request, template, vars)
Ejemplo n.º 4
0
def actual_special_view(
    request,
    event,
    include_unpublished=False,
    template='programme_special_view.jade',
    vars=None,
    show_programme_actions=False,
):
    criteria = dict(include_unpublished=include_unpublished)

    category_slug = request.GET.get('category')
    if category_slug:
        criteria.update(category__slug=category_slug)

    programmes = event.programme_event_meta.get_special_programmes(**criteria).order_by('start_time')

    categories_criteria = dict(event=event)
    if not include_unpublished:
        categories_criteria.update(public=True)
    categories = Category.objects.filter(**categories_criteria)
    category_filters = Filter(request, 'category').add_objects('category__slug', categories)
    programmes = category_filters.filter_queryset(programmes)

    programmes_by_start_time = group_programmes_by_start_time(programmes)

    if vars is None:
        vars = dict()

    vars.update(
        category_filters=category_filters,
        event=event,
        programmes_by_start_time=programmes_by_start_time,
        show_programme_actions=show_programme_actions,
        tabs=get_timetable_tabs(request, event),
    )

    return render(request, template, vars)
Ejemplo n.º 5
0
def directory_view(request, vars, organization):
    people = organization.people
    num_total_people = people.count()

    events = organization.events.all()
    event_filters = Filter(request, 'event').add_objects('event', events)
    event_slug = event_filters.selected_slug
    if event_slug:
        event = get_object_or_404(events, slug=event_slug)
        people = event.people
    else:
        event = None

    search_form = SearchForm(request.GET)
    if search_form.is_valid():
        query = search_form.cleaned_data['query']
        if query:
            people = people.annotate(search=SearchVector(
                'first_name', 'surname', 'nick', 'email', 'phone',
                'user__username'), ).filter(search=query)

    hide_warning = None
    if request.method == 'POST':
        if request.POST.get('action') == 'hide-warning':
            hide_warning = request.session[HIDE_WARNING_SESSION_KEY] = True
        else:
            messages.error(request, _('Unknown action.'))

    if hide_warning is None:
        hide_warning = request.session.get(HIDE_WARNING_SESSION_KEY, False)

    vars.update(
        event_filters=event_filters,
        num_total_people=num_total_people,
        people=people,
        search_form=search_form,
        show_warning=not hide_warning,
    )

    if search_form.is_valid() and query:
        emit('directory.search.performed',
             search_term=query,
             request=request,
             organization=organization)
    else:
        emit('directory.viewed', request=request, organization=organization)

    return render(request, 'directory_view.pug', vars)
Ejemplo n.º 6
0
def programme_admin_organizers_view(request, vars, event, format='screen'):
    programme_roles = (
        ProgrammeRole.objects.filter(programme__category__event=event)
            .select_related('person')
            .select_related('programme')
            .select_related('role')
            .order_by('person__surname', 'person__first_name', 'programme__title')
    )

    personnel_classes = PersonnelClass.objects.filter(
        event=event,
        role__personnel_class__event=event,
    )
    personnel_class_filters = Filter(request, 'personnel_class').add_objects('role__personnel_class__slug', personnel_classes)
    programme_roles = personnel_class_filters.filter_queryset(programme_roles)

    active_filters = Filter(request, 'active').add_booleans('is_active')
    programme_roles = active_filters.filter_queryset(programme_roles)

    organizers = []
    prs_by_organizer = groupby_strict(programme_roles, lambda pr: pr.person)
    for organizer, prs in prs_by_organizer:
        organizer.current_event_programme_roles = prs
        organizers.append(organizer)

    vars.update(
        active_filters=active_filters,
        export_formats=EXPORT_FORMATS,
        num_organizers=len(organizers),
        num_total_organizers=Person.objects.filter(programme__category__event=event).distinct().count(),
        organizers=organizers,
        personnel_class_filters=personnel_class_filters,
    )

    if format == 'screen':
        return render(request, 'programme_admin_organizers_view.jade', vars)
    elif format == 'txt':
        emails = '\n'.join(programme_roles.order_by('person__email').values_list('person__email', flat=True).distinct())
        return HttpResponse(emails, content_type='text/plain')
    elif format in CSV_EXPORT_FORMATS:
        filename = "{event.slug}_programme_organizers_{timestamp}.{format}".format(
            event=event,
            timestamp=now().strftime('%Y%m%d%H%M%S'),
            format=format,
        )

        return csv_response(event, ProgrammeRole, programme_roles,
            dialect=CSV_EXPORT_FORMATS[format],
            filename=filename,
            m2m_mode='separate_columns',
        )
    else:
        raise NotImplementedError(format)
Ejemplo n.º 7
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_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)
Ejemplo n.º 9
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)
Ejemplo n.º 10
0
def membership_admin_members_view(request,
                                  vars,
                                  organization,
                                  format='screen'):
    memberships = organization.memberships.all().select_related('person')
    num_all_members = memberships.count()

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

    filter_active = any(f.selected_slug != f.default for f in [
        state_filters,
    ])

    memberships = memberships.order_by('person__surname',
                                       'person__official_first_names')

    if request.method == 'POST' and state_filters.selected_slug == 'approval':
        # PLEASE DON'T: locally cached objects do not get updated and apply_state does not do the needful
        # memberships.update(state='in_effect')

        # TODO encap in Membership
        for membership in memberships:
            membership.state = 'in_effect'
            membership.save()
            membership.apply_state()

        messages.success(
            request, 'Hyväksyntää odottavat jäsenhakemukset hyväksyttiin.')
        return redirect('membership_admin_members_view', organization.slug)

    export_type = state_filters.selected_slug or 'all'
    export_type_verbose = EXPORT_TYPE_VERBOSE[export_type]

    title = '{organization.name} – {export_type_verbose}'.format(
        organization=organization,
        export_type_verbose=export_type_verbose,
    )

    vars.update(
        show_approve_all_button=state_filters.selected_slug == 'approval',
        memberships=memberships,
        num_members=memberships.count(),
        num_all_members=num_all_members,
        state_filters=state_filters,
        filter_active=filter_active,
        css_to_show_filter_panel='in' if filter_active else '',
        export_formats=EXPORT_FORMATS,
        now=now(),
        title=title,
    )

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

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

        return csv_response(
            organization,
            Membership,
            memberships,
            dialect=format,
            filename=filename,
            m2m_mode='separate_columns',
        )
    else:
        raise NotImplementedError(format)
Ejemplo n.º 11
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)
Ejemplo n.º 12
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)
Ejemplo n.º 13
0
def membership_admin_members_view(request, vars, organization, format='screen'):
    memberships = organization.memberships.all().select_related('person')
    num_all_members = memberships.count()

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

    filter_active = any(f.selected_slug != f.default for f in [
        state_filters,
    ])

    memberships = memberships.order_by('person__surname', 'person__official_first_names')

    if request.method == 'POST' and state_filters.selected_slug == 'approval':
        memberships.update(state='in_effect')
        messages.success(request, u'Hyväksyntää odottavat jäsenhakemukset hyväksyttiin.')
        return redirect('membership_admin_members_view', organization.slug)

    export_type = state_filters.selected_slug
    if export_type == 'approval':
        export_type_verbose = u'Hyväksyntää odottavat hakemukset'
    elif export_type == 'discharged':
        export_type_verbose = u'Erotetut jäsenet'
    elif export_type == 'declined':
        export_type_verbose = u'Hylätyt jäsenhakemukset'
    elif export_type == 'in_effect':
        export_type_verbose = u'Jäsenluettelo'
    elif not export_type:
        export_type = 'all'
        export_type_verbose = u'Jäsenluettelo'

    title = u'{organization.name} – {export_type_verbose}'.format(
        organization=organization,
        export_type_verbose=export_type_verbose,
    )

    vars.update(
        show_approve_all_button=state_filters.selected_slug == 'approval',
        memberships=memberships,
        num_members=memberships.count(),
        num_all_members=num_all_members,
        state_filters=state_filters,
        filter_active=filter_active,
        css_to_show_filter_panel='in' if filter_active else '',
        export_formats=EXPORT_FORMATS,
        now=now(),
        title=title,
    )

    if format == 'screen':
        return render(request, 'membership_admin_members_view.jade', vars)
    elif format == 'html':
        return render(request, 'membership_admin_export_html_view.jade', vars)
    elif format in CSV_EXPORT_FORMATS:
        filename = "{organization.slug}_members_{timestamp}.{format}".format(
            organization=organization,
            timestamp=now().strftime('%Y%m%d%H%M%S'),
            format=format,
        )

        return csv_response(organization, Membership, memberships,
            dialect='xlsx',
            filename=filename,
            m2m_mode='separate_columns',
        )
Ejemplo n.º 14
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)
Ejemplo n.º 15
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)
Ejemplo n.º 16
0
def membership_admin_members_view(request, vars, organization, format='screen'):
    memberships = organization.memberships.all().select_related('person')
    num_all_members = memberships.count()

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

    filter_active = any(f.selected_slug != f.default for f in [
        state_filters,
    ])

    memberships = memberships.order_by('person__surname', 'person__official_first_names')

    if request.method == 'POST' and state_filters.selected_slug == 'approval':
        # PLEASE DON'T: locally cached objects do not get updated and apply_state does not do the needful
        # memberships.update(state='in_effect')

        # TODO encap in Membership
        for membership in memberships:
            membership.state = 'in_effect'
            membership.save()
            membership.apply_state()

        messages.success(request, 'Hyväksyntää odottavat jäsenhakemukset hyväksyttiin.')
        return redirect('membership_admin_members_view', organization.slug)

    export_type = state_filters.selected_slug or 'all'
    export_type_verbose = EXPORT_TYPE_VERBOSE[export_type]

    title = '{organization.name} – {export_type_verbose}'.format(
        organization=organization,
        export_type_verbose=export_type_verbose,
    )

    vars.update(
        show_approve_all_button=state_filters.selected_slug == 'approval',
        memberships=memberships,
        num_members=memberships.count(),
        num_all_members=num_all_members,
        state_filters=state_filters,
        filter_active=filter_active,
        css_to_show_filter_panel='in' if filter_active else '',
        export_formats=EXPORT_FORMATS,
        now=now(),
        title=title,
    )

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

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

        return csv_response(organization, Membership, memberships,
            dialect=format,
            filename=filename,
            m2m_mode='separate_columns',
        )
    else:
        raise NotImplementedError(format)