Adds messages and balance check
This commit is contained in:
1 parent
54ec001fb1
commit
e7d499aeca
8 files changed
+123
-52
No files matched your search
+8
-1
@@ -1,9 +1,16 @@
|
||||
# coding: utf-8
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext as _
|
||||
|
||||
from models import *
|
||||
|
||||
class OrderForm(forms.ModelForm):
|
||||
# TODO : validate that the customer can afford the order
|
||||
def clean_customer(self):
|
||||
if self.cleaned_data['customer'].get_profile().balance <= 0:
|
||||
raise forms.ValidationError(_("Du har negativ saldo og kan ikke kjøpe noe."))
|
||||
|
||||
return self.cleaned_data['customer']
|
||||
|
||||
class Meta:
|
||||
model = Order
|
||||
fields = ('customer',)
|
||||
|
||||
+26
-6
@@ -31,21 +31,27 @@ def home(request):
|
||||
def register(request):
|
||||
products = Product.objects.all()
|
||||
users = User.objects.filter(userprofile__balance__gt=0)
|
||||
users_js = "[{0}]".format(
|
||||
",".join(['"'+user+'"' for user in users.values_list('username', flat=True)]))
|
||||
users_js = users_format_js(users)
|
||||
|
||||
# multiple orderlines (one per product)
|
||||
OrderLineFormSet = formset_factory(OrderLineForm)
|
||||
if request.method == "POST":
|
||||
orderform = OrderForm(request.POST)
|
||||
formset = OrderLineFormSet(request.POST)
|
||||
|
||||
if formset.is_valid() and orderform.is_valid():
|
||||
order_sum = sum([ol['amount'] * ol['unit_price'] for ol in formset.cleaned_data])
|
||||
order = orderform.save(commit=False)
|
||||
# can he afford it?
|
||||
profile = order.customer.get_profile()
|
||||
if order_sum > profile.balance:
|
||||
messages.error(request, '{0} har ikke råd, mangler {1} kr.'.format(
|
||||
order.customer,
|
||||
int(order_sum - profile.balance)))
|
||||
return HttpResponseRedirect( reverse('main.views.register') )
|
||||
order.order_sum = order_sum
|
||||
order.save()
|
||||
|
||||
profile = order.customer.get_profile()
|
||||
# substract order from balance
|
||||
profile.balance -= order.order_sum
|
||||
profile.save()
|
||||
|
||||
@@ -59,12 +65,13 @@ def register(request):
|
||||
amount=ol['amount'],
|
||||
unit_price=ol['unit_price'])
|
||||
|
||||
orderlines.append(str(ol['amount']) + " stk " + str(product))
|
||||
orderlines.append(str(ol['amount']) + " " + str(product))
|
||||
|
||||
messages.success(request, '{0} kjøpte nettopp {1}.'.format(order.customer, ",".join(orderlines)))
|
||||
messages.success(request, '{0} kjøpte {1}.'.format(order.customer, ", ".join(orderlines)))
|
||||
return HttpResponseRedirect( reverse('main.views.register') )
|
||||
else:
|
||||
# errors
|
||||
messages.error(request, 'Skjemaet er ikke gyldig.')
|
||||
orderform = OrderForm(request.POST)
|
||||
formset = OrderLineFormSet(request.POST)
|
||||
else:
|
||||
@@ -74,6 +81,7 @@ def register(request):
|
||||
|
||||
def deposit(request):
|
||||
users = User.objects.all()
|
||||
users_js = users_format_js(users)
|
||||
|
||||
if request.method == "POST":
|
||||
form = DepositForm(request.POST)
|
||||
@@ -82,8 +90,14 @@ def deposit(request):
|
||||
profile = transaction.user.get_profile()
|
||||
profile.balance += transaction.amount
|
||||
profile.save()
|
||||
|
||||
messages.success(request, '{0} satte inn {1} kr. Ny saldo er {2}'.format(
|
||||
transaction.user,
|
||||
transaction.amount,
|
||||
profile.balance))
|
||||
return HttpResponseRedirect( reverse('main.views.deposit') )
|
||||
else:
|
||||
messages.error(request, 'Skjemaet er ikke gyldig.')
|
||||
form = DepositForm(request.POST)
|
||||
else:
|
||||
form = DepositForm()
|
||||
@@ -93,3 +107,9 @@ def deposit(request):
|
||||
def logout(request):
|
||||
auth_logout(request)
|
||||
return render_to_response('registration/logout.html', locals(), context_instance=RequestContext(request))
|
||||
|
||||
def users_format_js(users):
|
||||
users = "[{0}]".format(
|
||||
",".join(['"'+user+'"' for user in users.values_list('username', flat=True)]))
|
||||
return users
|
||||
|
||||
@@ -5,26 +5,26 @@ body {
|
||||
|
||||
#header {
|
||||
}
|
||||
#customer {
|
||||
ul {
|
||||
@include inline-block-list;
|
||||
|
||||
#register {
|
||||
#customer {
|
||||
ul {
|
||||
@include inline-block-list;
|
||||
|
||||
li {
|
||||
padding: 1.5em;
|
||||
text-align: center;
|
||||
width: 100px;
|
||||
li {
|
||||
padding: 1.5em;
|
||||
text-align: center;
|
||||
width: 100px;
|
||||
|
||||
&:hover {
|
||||
background-color: #dddddd;
|
||||
}
|
||||
&.marked {
|
||||
background-color: #dddddd;
|
||||
}
|
||||
&:hover {
|
||||
background-color: #dddddd;
|
||||
}
|
||||
&.marked {
|
||||
background-color: #dddddd;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#register {
|
||||
#products {
|
||||
ul {
|
||||
@include inline-block-list;
|
||||
|
||||
@@ -4090,20 +4090,20 @@ a.thumbnail:hover {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
body #register #customer ul {
|
||||
body #customer ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border: 0;
|
||||
*zoom: 1;
|
||||
}
|
||||
body #register #customer ul:before, body #register #customer ul:after {
|
||||
body #customer ul:before, body #customer ul:after {
|
||||
display: table;
|
||||
content: "";
|
||||
}
|
||||
body #register #customer ul:after {
|
||||
body #customer ul:after {
|
||||
clear: both;
|
||||
}
|
||||
body #register #customer ul li {
|
||||
body #customer ul li {
|
||||
list-style-image: none;
|
||||
list-style-type: none;
|
||||
margin-left: 0;
|
||||
@@ -4114,18 +4114,18 @@ body #register #customer ul li {
|
||||
*vertical-align: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
body #register #customer ul li {
|
||||
body #customer ul li {
|
||||
*display: inline;
|
||||
}
|
||||
body #register #customer ul li {
|
||||
body #customer ul li {
|
||||
padding: 1.5em;
|
||||
text-align: center;
|
||||
width: 100px;
|
||||
}
|
||||
body #register #customer ul li:hover {
|
||||
body #customer ul li:hover {
|
||||
background-color: #dddddd;
|
||||
}
|
||||
body #register #customer ul li.marked {
|
||||
body #customer ul li.marked {
|
||||
background-color: #dddddd;
|
||||
}
|
||||
body #register #products ul {
|
||||
|
||||
@@ -59,10 +59,10 @@ $(document).ready(function() {
|
||||
});
|
||||
/* Hide alert messages */
|
||||
$("a[data-dismiss=alert]").click(function(){
|
||||
$(this).parent().hide()
|
||||
$(this).parent().parent().parent().slideUp();
|
||||
});
|
||||
setTimeout( function() {
|
||||
$("a[data-dismiss=alert]").parent().slideUp();
|
||||
$("a[data-dismiss=alert]").parent().parent().parent().slideUp();
|
||||
}, 5000);
|
||||
|
||||
});
|
||||
+6
-4
@@ -21,10 +21,12 @@
|
||||
<div id="container" class="container-fluid">
|
||||
{%block content%}
|
||||
{%endblock%}
|
||||
<div id="footer" class="row-fluid span12">
|
||||
{%block footer %}
|
||||
<img src="{{ STATIC_URL }}gaute/img/edb_brick.png" />
|
||||
{%endblock%}
|
||||
<div id="footer" class="row-fluid">
|
||||
<div class="span12">
|
||||
{%block footer %}
|
||||
<img src="{{ STATIC_URL }}gaute/img/edb_brick.png" />
|
||||
{%endblock%}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
+49
-12
@@ -5,17 +5,54 @@
|
||||
|
||||
{% block content %}
|
||||
<section id="deposit" class="row-fluid">
|
||||
<div class="span12">
|
||||
<form id="order" method="post" class="form-stacked" autocomplete="off">
|
||||
{% csrf_token %}
|
||||
<fieldset>
|
||||
{{form}}
|
||||
</fieldset>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-large btn-primary" name="submit_order">Sett inn</button>
|
||||
<a href="{% url register %}" class="btn">Avbryt</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% if messages %}
|
||||
<section class="row-fluid">
|
||||
<div class="span4">
|
||||
{% for message in messages %}
|
||||
<div {% if message.tags %} class="alert alert-{{ message.tags }}"{% endif %}>{{ message }}<a class="close" data-dismiss="alert">×</a></div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
<form id="order" method="post" class="form-stacked" autocomplete="off">
|
||||
{% csrf_token %}
|
||||
<fieldset>
|
||||
<section id="customer" class="row-fluid">
|
||||
<h2>Hvem skal sette inn penger?</h2>
|
||||
<!-- Typeahead customer field -->
|
||||
<input name="customer_name" id="id_customer_typeahead" value="" data-provide="typeahead" data-source="{{users_js}}" />
|
||||
<!-- Actual customer select field (hidden) -->
|
||||
<div style="display:none;">{{form.user }}</div>
|
||||
<ul class="well">
|
||||
{% for user in users %}
|
||||
<li class="customer">
|
||||
{% if user.get_profile.image %}
|
||||
<img class="profile" src="{{ user.get_profile.image.url }}" /><br />
|
||||
{% else %}
|
||||
<img class="profile" src="{{ STATIC_URL }}gaute/img/unknown.png" /><br />
|
||||
{% endif %}
|
||||
<span class="name">{{ user }}</span> ({{ user.get_profile.balance }})
|
||||
<span class="id" style="display:none;">{{ user.id }}</span>
|
||||
</li>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</section>
|
||||
<section id="amount">
|
||||
<h2>Hvor mye?</h2>
|
||||
{{form.amount}}
|
||||
{{form.amount.errors}}
|
||||
</section>
|
||||
</fieldset>
|
||||
<div class="form-actions">
|
||||
<button type="submit" class="btn btn-large btn-primary" name="submit_order">Sett inn</button>
|
||||
<a href="{% url register %}" class="btn">Avbryt</a>
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
{% endblock %}
|
||||
{% block tailinc %}
|
||||
<script src="{{ STATIC_URL }}js/bootstrap-typeahead.js"></script>
|
||||
<script src="{{ STATIC_URL }}js/deposit.js"></script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
{% block content %}
|
||||
<section id="register" class="row-fluid">
|
||||
{% if messages %}
|
||||
<section class="row-fluid">
|
||||
<div class="span4">
|
||||
{% for message in messages %}
|
||||
@@ -12,6 +13,7 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
</section>
|
||||
{% endif %}
|
||||
<form id="order" method="post" autocomplete="off">
|
||||
<fieldset>
|
||||
{% csrf_token %}
|
||||
@@ -21,13 +23,13 @@
|
||||
<input type="hidden" name="form-MAX_NUM_FORMS" id="id_form-MAX_NUM_FORMS" />
|
||||
|
||||
<section id="customer" class="row-fluid">
|
||||
{% if users %}
|
||||
<div class="span12">
|
||||
<h2>Hvem kjøper?</h2>
|
||||
<!-- Typeahead customer field -->
|
||||
<input name="customer_name" id="id_customer_typeahead" value="" data-provide="typeahead" data-source="{{users_js}}" />
|
||||
<!-- Actual customer select field (hidden) -->
|
||||
<div style="display:none;">{{orderform.customer }}</div>
|
||||
{% if users %}
|
||||
<ul class="well">
|
||||
{% for user in users %}
|
||||
<li class="customer">
|
||||
@@ -42,10 +44,13 @@
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{%else%}
|
||||
<div class="alert alert-error">Ingen har positiv saldo i BBS.</div>
|
||||
{%endif%}
|
||||
</div>
|
||||
{%else%}
|
||||
<div class="span3">
|
||||
<h2>Hvem kjøper?</h2>
|
||||
<div class="alert alert-error">Ingen har positiv saldo i BBS.</div><a href="{% url deposit %}" class="btn">Sett inn penger</a>
|
||||
</div>
|
||||
{%endif%}
|
||||
</section>
|
||||
|
||||
<section id="products" class="row-fluid">
|
||||
|
||||
Reference in new issue
Block a user