Completed
Push — master ( b61ac1...0bc03c )
by Pat
54s
created

chezbetty.index()   B

Complexity

Conditions 5

Size

Total Lines 23

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 5
dl 0
loc 23
rs 8.2508
1
from pyramid.events import subscriber
2
from pyramid.events import BeforeRender
3
from pyramid.httpexceptions import HTTPFound
4
from pyramid.renderers import render
5
from pyramid.renderers import render_to_response
6
from pyramid.response import Response
7
from pyramid.view import view_config, forbidden_view_config
8
9
from pyramid.i18n import TranslationStringFactory
10
_ = TranslationStringFactory('betty')
11
12
from sqlalchemy.sql import func
13
from sqlalchemy.exc import DBAPIError
14
from sqlalchemy.orm.exc import NoResultFound
15
16
from .models import *
17
from .models.model import *
18
from .models import user as __user
19
from .models.user import User
20
from .models.item import Item
21
from .models.box import Box
22
from .models.transaction import Transaction, BTCDeposit, PurchaseLineItem
23
from .models.account import Account, VirtualAccount, CashAccount
24
from .models.event import Event
25
from .models.announcement import Announcement
26
from .models.btcdeposit import BtcPendingDeposit
27
from .models.pool import Pool
28
29
from .utility import user_password_reset
30
from .utility import send_email
31
from .utility import post_stripe_payment
32
33
from pyramid.security import Allow, Everyone, remember, forget
34
35
import chezbetty.datalayer as datalayer
36
from .btc import Bitcoin, BTCException
37
import binascii
38
import transaction
39
40
import traceback
41
42
###
43
### Catch-all error page
44
###
45
46
@view_config(route_name='exception_view', renderer='templates/exception.jinja2')
47
def exception_view(request):
48
    return {}
49
50
@view_config(context=Exception)
51
def exception_view_handler(context, request):
52
    print('-'*80)
53
    print('An unknown error occurred:')
54
    print('\t** Some potentially useful information:')
55
    try:
56
        print('\t** request {}'.format(request))
57
        print('\t** client_addr {}'.format(request.client_addr))
58
        print('\t** authenticated_userid {}'.format(request.authenticated_userid))
59
        print('\t** GET {}'.format(request.GET))
60
        print('\t** POST {}'.format(request.POST))
61
        print('\t** url {}'.format(request.url))
62
        print('\t** user_agent {}'.format(request.user_agent))
63
        print('\t** headers.environ {}'.format(request.headers.environ))
64
        print('\t** referer {}'.format(request.referer))
65
        print('\t** body {}'.format(request.body))
66
    except:
67
        pass
68
    traceback.print_exc()
69
    print('-'*80)
70
    return HTTPFound(location=request.route_url('exception_view'))
71
72
73
###
74
### HTML Pages
75
###
76
77
### No login needed
78
79
@view_config(route_name='lang')
80
def lang(request):
81
    code = request.matchdict['code']
82
    response = Response()
83
    response.set_cookie('_LOCALE_', value=code, max_age=15*60) # reset lang after 15min
84
85
    return HTTPFound(location='/', headers=response.headers)
86
87
@view_config(route_name='index', renderer='templates/index.jinja2')
88
def index(request):
89
    announcements = Announcement.all_enabled()
90
    for announcement in announcements:
91
        request.session.flash(announcement.announcement, 'info')
92
93
    try:
94
        top_debtor = DBSession.query(User)\
95
                         .filter(User.balance < -5)\
96
                         .order_by(User.balance)\
97
                         .limit(1).one()
98
    except NoResultFound:
99
        top_debtor = None
100
101
    # For the demo mode
102
    if 'demo' in request.cookies and request.cookies['demo'] == '1':
103
        admins = User.get_admins()
104
    else:
105
        admins = []
106
107
    return {
108
            'admins': admins,
109
            'top_debtor': top_debtor,
110
            }
111
112
113
@view_config(route_name='about', renderer='templates/about.jinja2')
114
def about(request):
115
    return {}
116
117
118
@view_config(route_name='items', renderer='templates/items.jinja2')
119
def items(request):
120
    items = DBSession.query(Item)\
121
                     .filter(Item.enabled==True)\
122
                     .filter(Item.in_stock>0)\
123
                     .order_by(Item.name).all()
124
    out_of_stock_items = DBSession.query(Item)\
125
                     .filter(Item.enabled==True)\
126
                     .filter(Item.in_stock==0)\
127
                     .order_by(Item.name).all()
128
    disabled_items = DBSession.query(Item)\
129
                     .filter(Item.enabled==False)\
130
                     .order_by(Item.name).all()
131
    return {'items': items,
132
            'out_of_stock_items': out_of_stock_items,
133
            'disabled_items': disabled_items}
134
135
136
@view_config(route_name='item_request', renderer='templates/item_request.jinja2')
137
def item_request(request):
138
    return {}
139
140
141
@view_config(route_name='shame', renderer='templates/shame.jinja2')
142
def users(request):
143
    users = DBSession.query(User)\
144
                     .filter(User.balance < -5)\
145
                     .order_by(User.balance).all()
146
    return {'users': users}
147
148
149
@view_config(route_name='paydebt', renderer='templates/paydebt.jinja2')
150
def paydebt(request):
151
    uniqname = request.matchdict['uniqname']
152
    user = User.from_uniqname(uniqname, local_only=True)
153
    return {
154
            'user': user,
155
            'stripe_pk': request.registry.settings['stripe.publishable_key'],
156
            }
157
158
@view_config(route_name='paydebt_submit',
159
             request_method='POST',
160
             renderer='json',
161
             )
162
def paydebt_submit(request):
163
    uniqname = request.matchdict['uniqname']
164
    user = User.from_uniqname(uniqname, local_only=True)
165
166
    print(request.POST)
167
168
    token = request.POST['stripeToken']
169
    amount = float(request.POST['betty_amount'])
170
    total_cents = int(request.POST['betty_total_cents'])
171
172
    post_stripe_payment(
173
            datalayer,
174
            request,
175
            token,
176
            amount,
177
            total_cents,
178
            user,
179
            user,
180
            )
181
182
    return {}
183
184