From 69eb22c50625e9b12f61dffccacb2303e3ffa6d3 Mon Sep 17 00:00:00 2001 From: Feliciaan De Palmenaer Date: Thu, 4 Jun 2015 21:20:38 +0200 Subject: [PATCH] Add paid indicator, fixes #19 --- app/migrations/versions/57a00d0b7bc_.py | 26 ++++++++++++ app/models.py | 18 ++++---- app/templates/home.html | 28 +++++++++---- app/templates/order.html | 56 ++++++++++++++++++------- app/templates/orders.html | 9 ++++ app/views/order.py | 43 +++++++++++++++++-- 6 files changed, 144 insertions(+), 36 deletions(-) create mode 100644 app/migrations/versions/57a00d0b7bc_.py diff --git a/app/migrations/versions/57a00d0b7bc_.py b/app/migrations/versions/57a00d0b7bc_.py new file mode 100644 index 0000000..464d9c9 --- /dev/null +++ b/app/migrations/versions/57a00d0b7bc_.py @@ -0,0 +1,26 @@ +"""Added order paid column + +Revision ID: 57a00d0b7bc +Revises: 3243c3538fc +Create Date: 2015-06-04 19:16:47.888372 + +""" + +# revision identifiers, used by Alembic. +revision = '57a00d0b7bc' +down_revision = '3243c3538fc' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.add_column('order_item', sa.Column('paid', sa.Boolean(), nullable=True)) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_column('order_item', 'paid') + ### end Alembic commands ### diff --git a/app/models.py b/app/models.py index bc42d26..0145db4 100644 --- a/app/models.py +++ b/app/models.py @@ -65,7 +65,6 @@ class Product(db.Model): price = db.Column(db.Integer, nullable=False) orderItems = db.relationship('OrderItem', backref='product', lazy='dynamic') - def configure(self, location, name, price): self.location = location self.name = name @@ -94,15 +93,14 @@ class Order(db.Model): return 'Order %d @ %s' % (self.id, self.location.name or 'None') def group_by_user(self): - group = defaultdict(list) + group = dict() for item in self.items: - group[item.get_name()] += [item.product] - return group - - def group_by_user_pay(self): - group = defaultdict(int) - for item in self.items: - group[item.get_name()] += item.product.price + user = group.get(item.get_name(), dict()) + user["total"] = user.get("totalm", 0) + item.product.price + user["to_pay"] = user.get("to_pay", 0) + item.product.price if not item.paid else 0 + user["paid"] = user.get("paid", True) and item.paid + user["products"] = user.get("products", []) + [item.product] + group[item.get_name()] = user return group def group_by_product(self): @@ -122,11 +120,13 @@ class Order(db.Model): return True return False + class OrderItem(db.Model): id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) order_id = db.Column(db.Integer, db.ForeignKey('order.id'), nullable=False) product_id = db.Column(db.Integer, db.ForeignKey('product.id')) + paid = db.Column(db.Boolean, default=False) name = db.Column(db.String(120)) def configure(self, user, order, product): diff --git a/app/templates/home.html b/app/templates/home.html index 05f84cb..1e035bd 100644 --- a/app/templates/home.html +++ b/app/templates/home.html @@ -12,17 +12,27 @@
-

Open orders

- {% for order in orders %} - {{ util.render_order(order) }} - {% endfor %} + {% if orders|count > 0 -%} +

Open orders:

+ {% for order in orders %} + {{ util.render_order(order) }} + {% endfor %} + {% else %} +

No orders available.

+ {% if not current_user.is_anonymous() %} + To create an order, fill in the form on the right. + {% else %} + Login to create an order, or ask someone else. + {% endif %} + {%- endif %}
-

Recently closed orders

- {% for order in recently_closed %} - {{ util.render_order(order) }} - {% endfor %} - + {% if orders|count > 0 -%} +

Recently closed orders:

+ {% for order in recently_closed %} + {{ util.render_order(order) }} + {% endfor %} + {%- endif %}
{% endblock %} diff --git a/app/templates/order.html b/app/templates/order.html index 52dbbf5..852687c 100644 --- a/app/templates/order.html +++ b/app/templates/order.html @@ -1,5 +1,7 @@ {% extends "layout.html" %} {% set active_page = "orders" -%} +{% set order_items = order.group_by_user() -%} +{% set courier_or_admin = order.can_close(current_user.id) -%} {% import "utils.html" as util %} @@ -7,7 +9,7 @@

Order {{ order.id }} - {% if order.can_close(current_user.id) -%} + {% if courier_or_admin -%} Close
{%- endif %}

courier: {{ order.courrier.username }} @@ -20,7 +22,7 @@ telephone: {{ order.location.telephone }}
{% endif %} status: {% if order.stoptime %}{{ order.stoptime|countdown }}{% else %}open{% endif %}
- total price: {{ total_price|euro }} + total price: {{ total_price|euro }} {% if courier_or_admin %}- remaining debts: {{ debts|euro }}{% endif %}
{% if form -%}
@@ -47,26 +49,50 @@ {%- endif %}
-
-

Items

- {% for item in order.items %} - {{ item.get_name() }} - {{ item.product.name }} - {{ item.product.price|euro }} - {% if item.can_delete(order.id, current_user.id, session.get('anon_name', '')) -%}{%- endif %}
- {% endfor %} +
+

Items

+ + + {% if courier_or_admin %}{% endif %} + + + {% for item in order.items -%} + + + + + {% if courier_or_admin %}{% endif %} + + + {%- endfor %} + +
NameItemPricePaid?Delete
{{ item.get_name() }}{{ item.product.name }}{{ item.product.price|euro }}{% if not item.paid %} Pay {% else %} {% endif %}{% if item.can_delete(order.id, current_user.id, session.get('anon_name', '')) or courier_or_admin -%}{%- endif %}
-
+

Ordered products:

- {% for key, value in order.group_by_product().items() %} + {% for key, value in order.group_by_product().items() -%} {{ key }} - {{ value }}
- {% endfor %} + {%- endfor %}
-
+

Debts

- {% for key, value in order.group_by_user_pay().items() %} - {{ key }} - {{ value|euro }}
- {% endfor %} + + + {% if courier_or_admin %}{% endif %} + + + {% for key, value in order_items.items() -%} + + + + + {% if courier_or_admin %}{% endif %} + + {%- endfor %} + +
NameTotalTo payPaid?
{{ key }}{{ value["total"]|euro }}{{ value["to_pay"]|euro }}{% if not value["to_pay"] == 0 %} Pay {% else %} {% endif %}
{% endblock %} diff --git a/app/templates/orders.html b/app/templates/orders.html index 112684e..9757ca0 100644 --- a/app/templates/orders.html +++ b/app/templates/orders.html @@ -7,10 +7,19 @@ {% block container %}
+ {% if orders|count > 0 -%}

Open orders:

{% for order in orders %} {{ util.render_order(order) }} {% endfor %} + {% else %} +

No orders available.

+ {% if not current_user.is_anonymous() %} + To create an order, fill in the form on the right. + {% else %} + Login to create an order, or ask someone else. + {% endif %} + {%- endif %}
{% if not current_user.is_anonymous() %}
diff --git a/app/views/order.py b/app/views/order.py index b8089d0..2e9a07b 100644 --- a/app/views/order.py +++ b/app/views/order.py @@ -1,3 +1,4 @@ + __author__ = 'feliciaan' from flask import url_for, render_template, abort, redirect, Blueprint, flash, session from flask.ext.login import current_user, login_required @@ -5,7 +6,7 @@ import random from datetime import datetime from app import app, db -from models import Order, OrderItem +from models import Order, OrderItem, User from forms import OrderItemForm, OrderForm, AnonOrderItemForm order_bp = Blueprint('order_bp', 'order') @@ -46,7 +47,8 @@ def order(id, form=None): if order.stoptime and order.stoptime < datetime.now(): form = None total_price = sum([o.product.price for o in order.items]) - return render_template('order.html', order=order, form=form, total_price=total_price) + debts = sum([o.product.price for o in order.items if not o.paid]) + return render_template('order.html', order=order, form=form, total_price=total_price, debts=debts) @order_bp.route('//create', methods=['POST']) @@ -75,6 +77,41 @@ def order_item_create(id): return redirect(url_for('.order', id=id)) return order(id, form=form) + +@order_bp.route('///paid') +@login_required +def item_paid(order_id, item_id): + item = OrderItem.query.filter(OrderItem.id == item_id).first() + id = current_user.id + if item.order.courrier_id == id or current_user.admin: + item.paid = True + db.session.commit() + flash('Paid %s by %s' % (item.product.name, item.user.username), 'success') + return redirect(url_for('.order', id=order_id)) + abort(404) + + +@order_bp.route('///user_paid') +@login_required +def items_user_paid(order_id, user_name): + user = User.query.filter(User.username == user_name).first() + items = [] + if user: + items = OrderItem.query.filter((OrderItem.user_id == user.id) & (OrderItem.order_id == order_id)) + else: + items = OrderItem.query.filter((OrderItem.name == user_name) & (OrderItem.order_id == order_id)) + current_order = Order.query.filter(Order.id == order_id).first() + for item in items: + print(item) + if current_order.courrier_id == current_user.id or current_user.admin: + for item in items: + item.paid = True + db.session.commit() + flash('Paid %d items for %s' % (items.count(), item.get_name()), 'success') + return redirect(url_for('.order', id=order_id)) + abort(404) + + @order_bp.route('///delete') def delete_item(order_id, item_id): item = OrderItem.query.filter(OrderItem.id == item_id).first() @@ -85,7 +122,7 @@ def delete_item(order_id, item_id): product_name = item.product.name db.session.delete(item) db.session.commit() - flash('Deleted %s' % product_name, 'info') + flash('Deleted %s' % product_name, 'success') return redirect(url_for('.order', id=order_id)) abort(404)