def recipients_pool(self):
        users = UserCollection(self.request.session)
        users = users.query()

        if self.state.data == ['active']:
            users = users.filter(User.active == True)
        elif self.state.data == ['inactive']:
            users = users.filter(User.active == False)
        elif self.state.data != ['active', 'inactive']:
            return set()

        return {u.username for u in users.with_entities(User.username)}
Пример #2
0
    def username_choices(self):
        assert self.request.is_admin  # safety net

        users = UserCollection(self.request.session)
        users = users.by_roles('admin', 'editor')
        users = users.with_entities(User.username, User.title)

        def choice(row):
            return row[0], row[1]

        def by_title(choice):
            return normalize_for_url(choice[1])

        return sorted([choice(r) for r in users.all()], key=by_title)
Пример #3
0
def view_occasion_bookings_table(self, request):
    layout = DefaultLayout(self, request)

    wishlist_phase = self.period.wishlist_phase
    booking_phase = self.period.booking_phase
    phase_title = wishlist_phase and _("Wishlist") or _("Bookings")

    users = UserCollection(request.session).query()
    users = users.with_entities(User.username, User.id)
    users = {u.username: u.id.hex for u in users}

    def occasion_links(oid):
        if self.period.finalized:
            yield Link(
                text=_("Signup Attendee"),
                url='#',
                traits=(
                    Block(_(
                        "The period has already been finalized. No new "
                        "attendees may be added."
                    ), no=_("Cancel")),
                )
            )
        else:
            yield Link(
                text=_("Signup Attendee"),
                url=request.return_to(
                    request.class_link(Occasion, {'id': oid}, 'book'),
                    request.class_link(MatchCollection)
                )
            )

    @lru_cache(maxsize=10)
    def bookings_link(username):
        return request.class_link(
            BookingCollection, {
                'period_id': self.period.id,
                'username': username
            }
        )

    @lru_cache(maxsize=10)
    def user_link(username):
        return request.return_here(
            request.class_link(
                User, {'id': users[username]}
            )
        )

    @lru_cache(maxsize=10)
    def attendee_link(attendee_id):
        return request.return_here(
            request.class_link(
                Attendee, {'id': attendee_id}
            )
        )

    @lru_cache(maxsize=10)
    def group_link(group_code):
        return request.class_link(
            GroupInvite, {
                'group_code': group_code
            }
        )

    def booking_links(booking):
        yield Link(_("User"), user_link(booking.attendee.username))
        yield Link(_("Attendee"), attendee_link(booking.attendee_id))
        yield Link(phase_title, bookings_link(booking.attendee.username))

        if booking.group_code:
            yield Link(_("Group"), group_link(booking.group_code))

        if wishlist_phase:
            yield Link(
                text=_("Remove Wish"),
                url=layout.csrf_protected_url(
                    request.class_link(Booking, {'id': booking.id})
                ),
                traits=(
                    Confirm(_(
                        "Do you really want to remove ${attendee}'s wish?",
                        mapping={
                            'attendee': booking.attendee.name
                        }
                    ), yes=_("Remove Wish"), no=_("Cancel")),
                    Intercooler(
                        request_method='DELETE',
                        target='#{}'.format(booking.id)
                    )
                )
            )

        elif booking_phase and booking.state != 'accepted':
            yield Link(
                text=_("Remove Booking"),
                url=layout.csrf_protected_url(
                    request.class_link(Booking, {'id': booking.id})
                ),
                traits=(
                    Confirm(_(
                        "Do you really want to delete ${attendee}'s booking?",
                        mapping={
                            'attendee': booking.attendee.name
                        }
                    ), yes=_("Remove Booking"), no=_("Cancel")),
                    Intercooler(
                        request_method='DELETE',
                        target='#{}'.format(booking.id)
                    )
                )
            )
        elif booking_phase and booking.state == 'accepted':
            yield Link(
                text=_("Cancel Booking"),
                url=layout.csrf_protected_url(
                    request.class_link(
                        Booking, {'id': booking.id}, 'cancel'
                    )
                ),
                traits=(
                    Confirm(
                        _(
                            "Do you really want to cancel ${attendee}'s "
                            "booking?",
                            mapping={
                                'attendee': booking.attendee.name
                            }
                        ),
                        _("This cannot be undone."),
                        _("Cancel Booking"),
                        _("Cancel")
                    ),
                    Intercooler(
                        request_method='POST',
                    )
                )
            )

    bookings = {'accepted': [], 'other': []}

    q = request.session.query(Booking).filter_by(occasion_id=self.id)
    q = q.options(joinedload(Booking.attendee))

    for booking in q:
        state = booking.state == 'accepted' and 'accepted' or 'other'
        bookings[state].append(booking)

    bookings['accepted'].sort(key=lambda b: normalize_for_url(b.attendee.name))
    bookings['other'].sort(key=lambda b: normalize_for_url(b.attendee.name))

    return {
        'layout': layout,
        'bookings': bookings,
        'oid': self.id,
        'occasion_links': occasion_links,
        'booking_links': booking_links,
        'period': self.period
    }
Пример #4
0
def users_for_select_element(request):
    u = UserCollection(request.session).query()
    u = u.with_entities(User.id, User.username, User.title, User.realname)
    u = u.order_by(func.lower(User.title))
    u = u.filter_by(active=True)
    return tuple(u)
Пример #5
0
def book_occasion(self, request, form):

    # for the "nth. occasion" title
    number = request.session.execute("""
        SELECT count(*) FROM occasions
        WHERE activity_id = :activity_id AND "order" <= :order
    """, {
        'activity_id': self.activity_id,
        'order': self.order
    }).scalar()

    if form.submitted(request):
        attendees = AttendeeCollection(request.session)
        user = form.user

        if form.is_new_attendee:
            attendee = attendees.add(
                user=user,
                name=form.name,
                birth_date=form.birth_date.data,
                gender=form.gender.data,
                notes=form.notes.data
            )
        else:
            attendee = attendees.by_id(form.attendee.data)
            assert attendee.username == form.username

        # should be caught by the form
        assert not (self.full and self.period.confirmed)
        assert self.activity.state == 'accepted'

        bookings = BookingCollection(request.session)

        # if there's a canceled/denied booking blocking the way, reactivate it
        booking = None

        if not form.is_new_attendee:
            booking = bookings.query()\
                .filter(Booking.occasion_id == self.id)\
                .filter(Booking.username == user.username)\
                .filter(Booking.attendee == attendee)\
                .filter(Booking.state.in_((
                    'cancelled',
                    'denied',
                    'blocked',
                )))\
                .first()

            if booking:
                booking.state = 'open'

        if booking is None:
            booking = bookings.add(
                user=user,
                attendee=attendee,
                occasion=self
            )

        # if the TOS have been accepted, record this now
        if hasattr(form, 'accept_tos') and form.accept_tos:
            if form.accept_tos.data:
                request.current_user.data['tos_accepted'] = True

        if self.period.confirmed:
            bookings.accept_booking(booking)
            request.success(
                _("The booking for ${name} was succesfull", mapping={
                    'name': attendee.name
                })
            )
        else:
            request.success(
                _("The occasion was added to ${name}'s wishlist", mapping={
                    'name': attendee.name
                }))

        return request.redirect(request.link(self.activity))

    title = _("Enroll Attendee")

    users = []

    if request.is_admin:
        u = UserCollection(request.session).query()
        u = u.with_entities(User.username, User.title)
        u = u.order_by(User.title)

        users = u

    return {
        'layout': OccasionFormLayout(self.activity, request, title),
        'title': title,
        'form': form,
        'occasion': self,
        'users': users,
        'button_text': _("Enroll"),
        'number': number,
    }