Browse Source

added reordering

funding-tag
Holger Frey 5 years ago
parent
commit
b23c905b26
  1. 28
      ordr3/schemas/orders.py
  2. 39
      ordr3/static/script.js
  3. 1
      ordr3/static/style.css
  4. 2
      ordr3/templates/orders/edit.jinja2
  5. 16
      ordr3/templates/orders/reorder.jinja2
  6. 173
      ordr3/views/orders.py

28
ordr3/schemas/orders.py

@ -178,9 +178,11 @@ class EditOrderSchema(CSRFSchema):
@classmethod @classmethod
def as_form(cls, request, **override): def as_form(cls, request, **override):
""" returns the schema as a form """ """ returns the schema as a form """
vendor_autocorrect_url = override.pop("autocorrect_url")
settings = { settings = {
"buttons": ("Save Changes", "Cancel"), "buttons": ("Save Changes", "Cancel"),
"css_class": "deform o3-col-form", "css_class": "deform o3-col-form o3-order-form",
} }
settings.update(override) settings.update(override)
form = super().as_form(request, **settings) form = super().as_form(request, **settings)
@ -194,6 +196,30 @@ class EditOrderSchema(CSRFSchema):
css_class="col-sm-9", css_class="col-sm-9",
) )
# set the url for vendor check
vendor_widget = form["item"]["vendor"].widget
vendor_widget.attributes["data-url"] = vendor_autocorrect_url
return form
class AddOrderSchema(CSRFSchema):
""" add an order """
item = OrderItem()
pricing = OrderPricing()
optional = OrderOptionals()
@classmethod
def as_form(cls, request, **override):
""" returns the schema as a form """
settings = {
"buttons": ("Place Order", "Cancel"),
"css_class": "deform o3-col-form o3-order-form",
}
settings.update(override)
form = super().as_form(request, **settings)
# set the url for vendor check # set the url for vendor check
vendor_url = request.resource_url(request.context.__parent__, "vendor") vendor_url = request.resource_url(request.context.__parent__, "vendor")
vendor_widget = form["item"]["vendor"].widget vendor_widget = form["item"]["vendor"].widget

39
ordr3/static/script.js

@ -178,6 +178,8 @@ $(function() {
$("label.o3-form-copy").attr("title", "copy to clipboard"); $("label.o3-form-copy").attr("title", "copy to clipboard");
$(".o3-order-form .invalid-feedback").addClass("col-sm-9 offset-sm-3");
$(".o3-vendor").on("blur", function(event) { $(".o3-vendor").on("blur", function(event) {
// autocorrect vendor // autocorrect vendor
var target = $(event.delegateTarget); var target = $(event.delegateTarget);
@ -185,23 +187,28 @@ $(function() {
var url = target.attr("data-url") var url = target.attr("data-url")
$.post( url, { vendor: input_value }, function( data ) { $.post( url, { vendor: input_value }, function( data ) {
var corrected_name = data["name"]; var corrected_name = data["name"];
if (data["found"] && (corrected_name != input_value)) { if (data["found"]) {
info = $('.o3-vendor-cancel') if (corrected_name.toLowerCase() != input_value.toLowerCase()) {
if( info.length) { info = $('.o3-vendor-cancel')
info.find("a").text('"' + input_value + '"') if( info.length) {
info.find("a").text('"' + input_value + '"')
} else {
info = $('<span>');
info.addClass("o3-vendor-cancel col-sm-9 offset-sm-3 small text-secondary");
info.html('Use <a href="#">"' + input_value + '"</a> instead.');
target.parent().append(info);
link = info.find("a");
link.on("click", function() {
var link_text = link.text();
var vendor = link_text.substring(1, link_text.length-1);
target.val(vendor)
info.remove()
return false;
});
}
} else { } else {
info = $('<span>'); var info = $('.o3-vendor-cancel');
info.addClass("o3-vendor-cancel col-sm-9 offset-sm-3 small text-secondary"); info.remove();
info.html('Use <a href="#">"' + input_value + '"</a> instead.');
target.parent().append(info);
link = info.find("a");
link.on("click", function() {
var link_text = link.text();
var vendor = link_text.substring(1, link_text.length-1);
target.val(vendor)
info.remove()
return false;
});
} }
target.val(corrected_name); target.val(corrected_name);
} else { } else {

1
ordr3/static/style.css

@ -244,3 +244,4 @@ label.o3-form-copy {
label.o3-form-copy:hover { label.o3-form-copy:hover {
text-decoration:underline; text-decoration:underline;
} }

2
ordr3/templates/orders/edit.jinja2

@ -9,7 +9,7 @@
{{form.render()|safe}} {{form.render()|safe}}
<hr> <hr>
<p class="mt-4"> <p class="mt-4">
{% if request.has_permission("add", context.__parent__) %} {% if request.has_permission("reorder", context) %}
<a href="{{ context|resource_url('reorder') }}" class="btn btn-outline-primary">Reorder Item</a> <a href="{{ context|resource_url('reorder') }}" class="btn btn-outline-primary">Reorder Item</a>
{% endif %} {% endif %}
{% if request.has_permission("delete", context) %} {% if request.has_permission("delete", context) %}

16
ordr3/templates/orders/reorder.jinja2

@ -0,0 +1,16 @@
{% extends "ordr3:templates/layout_full.jinja2" %}
{% block subtitle %} Reorder {{ context.model.cas_description }} {% endblock subtitle %}
{% block content %}
<div class="col-5">
<h4 class="mb-2 text-muted mb-4 text-truncate">Reorder <span class="text-dark">{{ context.model.cas_description }}</span></h4>
{{form.render()|safe}}
</div>
<div class="col-5"></div>
{% endblock content %}

173
ordr3/views/orders.py

@ -29,6 +29,56 @@ def get_multiple_orders(context, request):
) )
def get_form_data_from_order(order):
status = {"status": order.status.name}
item = {
"cas_description": order.cas_description,
"category": order.category.name,
"vendor": order.vendor,
"catalog_nr": order.catalog_nr,
"package_size": order.package_size,
}
pricing = {
"unit_price": {
"amount": "%.2f" % order.unit_price,
"currency": order.currency,
},
"quantity": order.amount,
"total_price": {
"amount": "%.2f" % order.total_price,
"currency": order.currency,
},
}
optional = {"account": order.account, "comment": order.comment}
form_data = {
"status": status,
"item": item,
"pricing": pricing,
"optional": optional,
}
return form_data
def update_order_with_form_data(order, form_data):
form_item = form_data["item"]
form_pricing = form_data["pricing"]
form_optional = form_data["optional"]
order.cas_description = form_item["cas_description"]
order.category = models.OrderCategory[form_item["category"]]
order.vendor = form_item["vendor"]
order.catalog_nr = form_item["catalog_nr"]
order.package_size = form_item["package_size"]
order.unit_price = form_pricing["unit_price"]["amount"]
order.currency = form_pricing["unit_price"]["currency"]
order.amount = form_pricing["quantity"]
order.account = form_optional["account"]
order.comment = form_optional["comment"]
@view_config( @view_config(
context="ordr3:resources.OrderList", context="ordr3:resources.OrderList",
permission="view", permission="view",
@ -272,36 +322,14 @@ def view_order(context, request):
renderer="ordr3:templates/orders/edit.jinja2", renderer="ordr3:templates/orders/edit.jinja2",
) )
def edit_order(context, request): def edit_order(context, request):
form = orders.EditOrderSchema.as_form(request) autocorrect_url = request.resource_url(context.__parent__, "vendor")
order = context.model form = orders.EditOrderSchema.as_form(
status = {"status": order.status.name} request, autocorrect_url=autocorrect_url
item = { )
"cas_description": order.cas_description,
"category": order.category.name,
"vendor": order.vendor,
"catalog_nr": order.catalog_nr,
"package_size": order.package_size,
}
pricing = {
"unit_price": {
"amount": "%.2f" % order.unit_price,
"currency": order.currency,
},
"quantity": order.amount,
"total_price": {
"amount": "%.2f" % order.total_price,
"currency": order.currency,
},
}
optional = {"account": order.account, "comment": order.comment}
form_data = { form_data = get_form_data_from_order(context.model)
"status": status,
"item": item,
"pricing": pricing,
"optional": optional,
}
form.set_appstruct(form_data) form.set_appstruct(form_data)
return {"form": form} return {"form": form}
@ -314,9 +342,10 @@ def edit_order(context, request):
) )
def do_edit_order(context, request): def do_edit_order(context, request):
""" process the edit order form """ """ process the edit order form """
print(request.POST) autocorrect_url = request.resource_url(context.__parent__, "vendor")
form = orders.EditOrderSchema.as_form(
form = orders.EditOrderSchema.as_form(request) request, autocorrect_url=autocorrect_url
)
if "Save_Changes" not in request.POST: if "Save_Changes" not in request.POST:
return HTTPFound(request.resource_url(context.__parent__)) return HTTPFound(request.resource_url(context.__parent__))
@ -330,25 +359,10 @@ def do_edit_order(context, request):
# form validation sucessful, change order # form validation sucessful, change order
order = context.model order = context.model
form_status = appstruct["status"] update_order_with_form_data(order, appstruct)
form_item = appstruct["item"] form_status_section = appstruct["status"]
form_pricing = appstruct["pricing"]
form_optional = appstruct["optional"]
order.cas_description = form_item["cas_description"]
order.category = models.OrderCategory[form_item["category"]]
order.vendor = form_item["vendor"]
order.catalog_nr = form_item["catalog_nr"]
order.package_size = form_item["package_size"]
order.unit_price = form_pricing["unit_price"]["amount"]
order.currency = form_pricing["unit_price"]["currency"]
order.amount = form_pricing["quantity"]
order.account = form_optional["account"]
order.comment = form_optional["comment"]
status = models.OrderStatus[form_status["status"]] status = models.OrderStatus[form_status_section["status"]]
is_noteworthy = services.create_log_entry(order, status, request.user) is_noteworthy = services.create_log_entry(order, status, request.user)
if is_noteworthy: if is_noteworthy:
@ -364,6 +378,67 @@ def do_edit_order(context, request):
return HTTPFound(request.resource_url(context.__parent__)) return HTTPFound(request.resource_url(context.__parent__))
@view_config(
context="ordr3:resources.Order",
name="reorder",
permission="reorder",
request_method="GET",
renderer="ordr3:templates/orders/reorder.jinja2",
)
def reorder(context, request):
autocorrect_url = request.resource_url(context.__parent__, "vendor")
form = orders.AddOrderSchema.as_form(
request, autocorrect_url=autocorrect_url
)
form_data = get_form_data_from_order(context.model)
form.set_appstruct(form_data)
return {"form": form}
@view_config(
context="ordr3:resources.Order",
name="reorder",
permission="reorder",
request_method="POST",
renderer="ordr3:templates/orders/reorder.jinja2",
)
def place_reorder(context, request):
""" process the reorder form """
autocorrect_url = request.resource_url(context.__parent__, "vendor")
form = orders.AddOrderSchema.as_form(
request, autocorrect_url=autocorrect_url
)
if "Place_Order" not in request.POST:
return HTTPFound(request.resource_url(context.__parent__))
data = request.POST.items()
try:
appstruct = form.validate(data)
except deform.ValidationFailure:
return {"form": form}
# form validation sucessful, change order
default = [None] * 8
order = models.OrderItem(*default)
update_order_with_form_data(order, appstruct)
services.create_log_entry(order, models.OrderStatus.OPEN, request.user)
request.repo.add_order(order)
request.emit(
events.FlashMessage.info(
f"The order {order.cas_description} has been placed."
)
)
return HTTPFound(request.resource_url(context.__parent__))
@view_config( @view_config(
context="ordr3:resources.Order", context="ordr3:resources.Order",
name="delete", name="delete",

Loading…
Cancel
Save