diff --git a/app/app.py b/app/app.py index 2875171..4a502f6 100644 --- a/app/app.py +++ b/app/app.py @@ -3,6 +3,7 @@ from logging.handlers import TimedRotatingFileHandler from flask import Flask from flask.ext.bootstrap import Bootstrap, StaticCDN from flask.ext.sqlalchemy import SQLAlchemy +from flask_debugtoolbar import DebugToolbarExtension from airbrake import Airbrake, AirbrakeHandler @@ -16,6 +17,8 @@ app.extensions['bootstrap']['cdns']['bootstrap'] = StaticCDN() db = SQLAlchemy(app) +toolbar = DebugToolbarExtension(app) + class PrefixFix(object): def __init__(self, app, script_name): diff --git a/app/forms.py b/app/forms.py index 48ee503..ca6a047 100644 --- a/app/forms.py +++ b/app/forms.py @@ -30,6 +30,7 @@ class OrderForm(Form): class OrderItemForm(Form): product_id = SelectField('Item', coerce=int) + extra = StringField('Extra') submit_button = SubmitField('Submit') def populate(self, location): diff --git a/app/migrations/versions/4e94c0b08ed_.py b/app/migrations/versions/4e94c0b08ed_.py new file mode 100644 index 0000000..550e057 --- /dev/null +++ b/app/migrations/versions/4e94c0b08ed_.py @@ -0,0 +1,26 @@ +"""Add extra message + +Revision ID: 4e94c0b08ed +Revises: 42709384216 +Create Date: 2015-06-24 21:42:41.466973 + +""" + +# revision identifiers, used by Alembic. +revision = '4e94c0b08ed' +down_revision = '42709384216' + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.add_column('order_item', sa.Column('extra', sa.String(length=254), nullable=True)) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_column('order_item', 'extra') + ### end Alembic commands ### diff --git a/app/models.py b/app/models.py index b4b8d85..9bcbafb 100644 --- a/app/models.py +++ b/app/models.py @@ -102,12 +102,18 @@ class Order(db.Model): 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): - group = defaultdict(int) + group = dict() for item in self.items: - group[item.product.name] += 1 + product = group.get(item.product.name, dict()) + product['count'] = product.get("count", 0) + 1 + if item.extra: + product["extras"] = product.get("extras", []) + [item.extra] + group[item.product.name] = product + return group def can_close(self, user_id): @@ -126,8 +132,10 @@ 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) + product_id = db.Column(db.Integer, db.ForeignKey('product.id'), + nullable=False) + paid = db.Column(db.Boolean, default=False, nullable=False) + extra = db.Column(db.String(254), nullable=True) name = db.Column(db.String(120)) def configure(self, user, order, product): diff --git a/app/static/css/main.css b/app/static/css/main.css index 34bf47a..451f630 100644 --- a/app/static/css/main.css +++ b/app/static/css/main.css @@ -18,3 +18,7 @@ body { .full-width { width: 100%; } + +.product .extras { + padding-left: 20px; +} \ No newline at end of file diff --git a/app/templates/home.html b/app/templates/home.html index d5826a8..5b87aa7 100644 --- a/app/templates/home.html +++ b/app/templates/home.html @@ -27,7 +27,7 @@ {%- endif %}
- {% if orders|count > 0 -%} + {% if recently_closed|count > 0 -%}

Recently closed orders:

{% for order in recently_closed %} {{ util.render_order(order) }} diff --git a/app/templates/order.html b/app/templates/order.html index ca7f1dc..974a0c2 100644 --- a/app/templates/order.html +++ b/app/templates/order.html @@ -38,6 +38,11 @@ {{ form.product_id(class='form-control select') }} {{ util.render_form_field_errors(form.product_id) }}
+
+ {{ form.extra.label(class='control-label') }}
+ {{ form.extra(class='form-control', placeholder='Fill in extras, when applicable') }} + {{ util.render_form_field_errors(form.extra) }} +
{% if current_user.is_anonymous() %}
{{ form.name.label(class='control-label') }} @@ -63,7 +68,7 @@ {% for item in order.items -%} {{ item.get_name() }} - {{ item.product.name }} + {{ item.product.name }}{{ "*" if item.extra }} {{ item.product.price|euro }} {% if courier_or_admin %}{% if not item.paid %} Pay {% else %} {% endif %}{% endif %} {% if item.can_delete(order.id, current_user.id, session.get('anon_name', '')) -%}{%- endif %}
@@ -75,7 +80,16 @@

Ordered products:

{% for key, value in order.group_by_product().items() -%} - {{ key }} - {{ value }}
+
+ {{ key }}: {{ value["count"] }} + {% if value["extras"] -%} +
+ {% for extra in value["extras"] -%} +
{{ extra }}
+ {% endfor %} +
+ {%- endif %} +
{%- endfor %}
diff --git a/app/templates/order_edit.html b/app/templates/order_edit.html index 84a68d6..299ba11 100644 --- a/app/templates/order_edit.html +++ b/app/templates/order_edit.html @@ -35,7 +35,7 @@ {{ util.render_form_field_errors(form.starttime) }} {% endif %} -
+
{{ form.stoptime.label(class='control-label') }}
{{ form.stoptime(class='form-control datetimepicker') }} diff --git a/app/templates/orders.html b/app/templates/orders.html index 9757ca0..ed5cf63 100644 --- a/app/templates/orders.html +++ b/app/templates/orders.html @@ -50,7 +50,7 @@ {{ util.render_form_field_errors(form.starttime) }}
{% endif %} -
+
{{ form.stoptime.label(class='control-label') }}
{{ form.stoptime(class='form-control datetimepicker') }} diff --git a/requirements.txt b/requirements.txt index ed260b9..021899d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,7 @@ Flask==0.10.1 Flask-Admin==1.1.0 Flask-Bootstrap==3.3.4.1 +Flask-DebugToolbar==0.10.0 Flask-Login==0.2.11 Flask-Migrate==1.4.0 Flask-OAuthlib==0.9.1