diff --git a/main/forms.py b/main/forms.py index 5d5604f..0871e22 100644 --- a/main/forms.py +++ b/main/forms.py @@ -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',) diff --git a/main/views.py b/main/views.py index fdf67a6..987f690 100755 --- a/main/views.py +++ b/main/views.py @@ -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 + diff --git a/static/gaute/sass/screen.scss b/static/gaute/sass/screen.scss index 34faf94..0bb3720 100644 --- a/static/gaute/sass/screen.scss +++ b/static/gaute/sass/screen.scss @@ -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; diff --git a/static/gaute/stylesheets/screen.css b/static/gaute/stylesheets/screen.css index 6803387..4c20b4b 100644 --- a/static/gaute/stylesheets/screen.css +++ b/static/gaute/stylesheets/screen.css @@ -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 { diff --git a/static/js/register.js b/static/js/register.js index 9a1e878..a823381 100644 --- a/static/js/register.js +++ b/static/js/register.js @@ -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); }); diff --git a/templates/base.html b/templates/base.html index f32ab7e..3c0d61c 100644 --- a/templates/base.html +++ b/templates/base.html @@ -21,10 +21,12 @@