Adds messages and balance check
This commit is contained in:
1 parent
54ec001fb1
commit
e7d499aeca
8 files changed
+98
-27
No files matched your search
+8
-1
@@ -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
@@ -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
|
||||||
|
|
||||||
@@ -5,8 +5,6 @@ body {
|
|||||||
|
|
||||||
#header {
|
#header {
|
||||||
}
|
}
|
||||||
|
|
||||||
#register {
|
|
||||||
#customer {
|
#customer {
|
||||||
ul {
|
ul {
|
||||||
@include inline-block-list;
|
@include inline-block-list;
|
||||||
@@ -25,6 +23,8 @@ body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#register {
|
||||||
#products {
|
#products {
|
||||||
ul {
|
ul {
|
||||||
@include inline-block-list;
|
@include inline-block-list;
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
});
|
});
|
||||||
+3
-1
@@ -21,12 +21,14 @@
|
|||||||
<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">
|
||||||
|
<div class="span12">
|
||||||
{%block footer %}
|
{%block footer %}
|
||||||
<img src="{{ STATIC_URL }}gaute/img/edb_brick.png" />
|
<img src="{{ STATIC_URL }}gaute/img/edb_brick.png" />
|
||||||
{%endblock%}
|
{%endblock%}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}js/jquery-1.7.1.min.js"></script>
|
<script type="text/javascript" src="{{ STATIC_URL }}js/jquery-1.7.1.min.js"></script>
|
||||||
<script type="text/javascript" src="{{ STATIC_URL }}js/bootstrap-collapse.js"></script>
|
<script type="text/javascript" src="{{ STATIC_URL }}js/bootstrap-collapse.js"></script>
|
||||||
|
|||||||
+40
-3
@@ -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 %}
|
||||||
|
<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">
|
<form id="order" method="post" class="form-stacked" autocomplete="off">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<fieldset>
|
<fieldset>
|
||||||
{{form}}
|
<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>
|
</fieldset>
|
||||||
<div class="form-actions">
|
<div class="form-actions">
|
||||||
<button type="submit" class="btn btn-large btn-primary" name="submit_order">Sett inn</button>
|
<button type="submit" class="btn btn-large btn-primary" name="submit_order">Sett inn</button>
|
||||||
<a href="{% url register %}" class="btn">Avbryt</a>
|
<a href="{% url register %}" class="btn">Avbryt</a>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
|
||||||
</section>
|
</section>
|
||||||
{% endblock %}
|
{% 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 %}
|
{% 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">
|
||||||
|
|||||||
Reference in new issue
Block a user