Completed
Push — master ( 9e58f4...6e6bb8 )
by Pat
01:02
created

chezbetty.shame()   A

Complexity

Conditions 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %
Metric Value
cc 1
dl 0
loc 4
rs 10
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
import transaction
37
38
import traceback
39
40
41
42
@view_config(route_name='about', renderer='templates/public/about.jinja2')
43
def about(request):
44
    return {}
45
46
47
@view_config(route_name='items', renderer='templates/public/items.jinja2')
48
def items(request):
49
    items = DBSession.query(Item)\
50
                     .filter(Item.enabled==True)\
51
                     .filter(Item.in_stock>0)\
52
                     .order_by(Item.name).all()
53
    out_of_stock_items = DBSession.query(Item)\
54
                     .filter(Item.enabled==True)\
55
                     .filter(Item.in_stock==0)\
56
                     .order_by(Item.name).all()
57
    disabled_items = DBSession.query(Item)\
58
                     .filter(Item.enabled==False)\
59
                     .order_by(Item.name).all()
60
    return {'items': items,
61
            'out_of_stock_items': out_of_stock_items,
62
            'disabled_items': disabled_items}
63
64
65
@view_config(route_name='item_request', renderer='templates/public/item_request.jinja2')
66
def item_request(request):
67
    return {}
68
69
70
@view_config(route_name='item_request_new', request_method='POST')
71
def item_request_new(request):
72
    try:
73
        request_text = request.POST['request']
74
        if len(request_text) < 5:
75
            raise ValueError()
76
77
        datalayer.new_request(None, request.POST['request'])
78
79
        request.session.flash('Request added successfully', 'success')
80
        return HTTPFound(location=request.route_url('index'))
81
82
    except ValueError:
83
        request.session.flash('If you are making a request, it should probably contain some characters.', 'error')
84
        return HTTPFound(location=request.route_url('item_request'))
85
86
    except:
87
        request.session.flash('Error adding request.', 'error')
88
        return HTTPFound(location=request.route_url('index'))
89
90
def _get_shame_users():
91
    users = DBSession.query(User)\
92
                     .filter(User.balance < -5)\
93
                     .order_by(User.balance).all()
94
    for user in users:
95
        user.days_on_shame = Transaction.get_days_in_debt_for_user(user)
96
    return users
97
98
@view_config(route_name='shame', renderer='templates/public/shame.jinja2')
99
def shame(request):
100
    users = _get_shame_users()
101
    return {'users': users}
102
103
@view_config(route_name='shame_csv', renderer='csv')
104
def shame_csv(request):
105
    users = _get_shame_users()
106
    header = ['uniqname','balance','name','days_on_shame']
107
    rows = [[user.uniqname, user.balance, user.name, user.days_on_shame] for user in users]
108
109
    return {
110
            'header': header,
111
            'rows': rows,
112
            }
113
114
115
@view_config(route_name='paydebt', renderer='templates/public/paydebt.jinja2')
116
def paydebt(request):
117
    uniqname = request.matchdict['uniqname']
118
    user = User.from_uniqname(uniqname, local_only=True)
119
    return {'user': user,
120
            'stripe_pk': request.registry.settings['stripe.publishable_key']}
121
122
123
@view_config(route_name='paydebt_submit',
124
             request_method='POST',
125
             renderer='json')
126
def paydebt_submit(request):
127
    uniqname = request.matchdict['uniqname']
128
    user = User.from_uniqname(uniqname, local_only=True)
129
130
    token = request.POST['stripeToken']
131
    amount = Decimal(request.POST['betty_amount'])
132
    total_cents = int(request.POST['betty_total_cents'])
133
134
    post_stripe_payment(
135
            datalayer,
136
            request,
137
            token,
138
            amount,
139
            total_cents,
140
            user,
141
            user)
142
143
    return {}
144