def stats_view(request):
    """
    This view lets accountants view statistics:
    how many tickets of which category, payment status, etc.
    """
    #print("who is it? %s" % request.user.login)
    _number_of_datasets = PartyTicket.get_number()
    _number_of_tickets = PartyTicket.get_num_tickets()
    _num_passengers = PartyTicket.num_passengers()
    _num_open_tickets = int(_number_of_tickets) - int(_num_passengers)
    _num_tickets_unpaid = PartyTicket.get_num_unpaid()
    #
    _num_hobos = PartyTicket.get_num_hobos()
    _num_class_2 = PartyTicket.get_num_class_2()
    _num_class_2_food = PartyTicket.get_num_class_2_food()
    _num_class_1 = PartyTicket.get_num_class_1()
    _num_class_green = PartyTicket.get_num_class_green()
    #
    _sum_tickets_total = PartyTicket.get_sum_tickets_total()
    _sum_tickets_paid = PartyTicket.get_sum_tickets_paid()
    _sum_tickets_unpaid = PartyTicket.get_sum_tickets_unpaid()

    return {
        '_number_of_datasets': _number_of_datasets,
        '_number_of_tickets': _number_of_tickets,
        '_num_passengers': _num_passengers,
        '_num_open_tickets': _num_open_tickets,
        '_num_tickets_unpaid': _num_tickets_unpaid,
        # ticket categories
        'num_hobos': _num_hobos,
        'num_class_2': _num_class_2,
        'num_class_2_food': _num_class_2_food,
        'num_class_1': _num_class_1,
        'num_class_green': _num_class_green,
        # focus on cash
        'sum_tickets_total': _sum_tickets_total,
        'sum_tickets_paid': _sum_tickets_paid,
        'sum_tickets_unpaid': _sum_tickets_unpaid,
    }
def accountants_desk(request):
    """
    This view lets accountants view applications and set their status:
    has their payment arrived?
    """
    #print("who is it? %s" % request.user.login)
    _number_of_datasets = PartyTicket.get_number()
    #print("request.matchdict['number']: %s" % request.matchdict['number'])
    try:  # check if
        # a page number was supplied with the URL
        _page_to_show = int(request.matchdict['number'])
        #print("page to show: %s" % _page_to_show)
    except:
        _page_to_show = 0
    # is it a number? yes, cast above
    #if not isinstance(_page_to_show, type(1)):
    #    _page_to_show = 0
    #print("_page_to_show: %s" % _page_to_show)

    # check for input from "find dataset by confirm code" form
    if 'code_to_show' in request.POST:
        print("found code_to_show in POST: %s" % request.POST['code_to_show'])
        try:
            _code = request.POST['code_to_show']
            #print(_code)
            _entry = PartyTicket.get_by_code(_code)
            print(_entry)
            print(_entry.id)

            return HTTPFound(
                location=request.route_url(
                    'detail',
                    ticket_id=_entry.id)
            )
        except:
            # choose default
            print("barf!")
            pass

    # how many to display on one page?
    """
    num_display determines how many items are to be shown on one page
    """
    #print request.POST
    if 'num_to_show' in request.POST:
        #print("found it in POST")
        try:
            _num = int(request.POST['num_to_show'])
            if isinstance(_num, type(1)):
                num_display = _num
        except:
            # choose default
            num_display = 20
    elif 'num_display' in request.cookies:
        #print("found it in cookie")
        num_display = int(request.cookies['num_display'])
    else:
        #print("setting default")
        num_display = request.registry.settings[
            'c3spartyticketing.dashboard_number']
    #print("num_display: %s " % num_display)

    """
    base_offset helps us to minimize impact on the database
    when querying for results.
    we can choose just those results we need for the page to show
    """
    #try:
    base_offset = int(_page_to_show) * int(num_display)
    #print("base offset: %s" % base_offset)
    #except:
    #    base_offset = 0
    #    if 'base_offset' in request.session:
    #        base_offset = request.session['base_offset']
    #    else:
    #        base_offset = request.registry.settings['speedfunding.offset']

    # get data sets from DB
    _tickets = PartyTicket.ticket_listing(
        PartyTicket.id.desc(), how_many=num_display, offset=base_offset)

    # calculate next-previous-navi
    next_page = (int(_page_to_show) + 1)
    if (int(_page_to_show) > 0):
        previous_page = int(_page_to_show) - 1
    else:
        previous_page = int(_page_to_show)

    # store info about current page in cookie
    request.response.set_cookie('on_page', value=str(_page_to_show))
    #print("num_display: %s" % num_display)
    request.response.set_cookie('num_display', value=str(num_display))

    #
    # prepare the autocomplete form for codes
    #
    # get codes from another view via subrequest, see
    # http://docs.pylonsproject.org/projects/pyramid/en/latest/narr/subrequest.html
    subreq = Request.blank('/all_codes')  # see http://0.0.0.0:6543/all_codes
    response = request.invoke_subrequest(subreq)
    #print("the subrequests response: %s" % response.body)
    #import requests
    #r = requests.get('http://0.0.0.0:6543/all_codes')
    #the_codes = json.loads(r.text)  # gotcha: json needed!
    the_codes = json.loads(response.body)  # gotcha: json needed!

    my_autoc_wid = deform.widget.AutocompleteInputWidget(
        min_length=1,
        title="widget title",
        values=the_codes,
    )

    # prepare a form for autocomplete search for codes.
    class CodeAutocompleteForm(colander.MappingSchema):
        """
        colander schema to make deform autocomplete form
        """
        code_to_show = colander.SchemaNode(
            colander.String(),
            title="Search entry (autocomplete)",
            validator=colander.Length(min=1, max=8),
            widget=my_autoc_wid,
            description='start typing. use arrows. press enter. twice.'

        )

    schema = CodeAutocompleteForm()
    form = deform.Form(
        schema,
        buttons=('go!',),
        #use_ajax=True,  # <-- whoa!
        renderer=zpt_renderer,
    )
    autoformhtml = form.render()

    return {'_number_of_datasets': _number_of_datasets,
            'tickets': _tickets,
            'num_display': num_display,
            'next': next_page,
            'previous': previous_page,
            'autoform': autoformhtml,
            }