Adds messages and balance check

This commit is contained in:
nikolark committed 2012-02-23 02:53:09 +01:00
1 parent 54ec001fb1
commit e7d499aeca
8 files changed
+123 -52

No files matched your search

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