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): @@ -178,9 +178,11 @@ class EditOrderSchema(CSRFSchema):
@classmethod
def as_form(cls, request, **override):
""" returns the schema as a form """
vendor_autocorrect_url = override.pop("autocorrect_url")
settings = {
"buttons": ("Save Changes", "Cancel"),
"css_class": "deform o3-col-form",
"css_class": "deform o3-col-form o3-order-form",
}
settings.update(override)
form = super().as_form(request, **settings)
@ -194,6 +196,30 @@ class EditOrderSchema(CSRFSchema): @@ -194,6 +196,30 @@ class EditOrderSchema(CSRFSchema):
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
vendor_url = request.resource_url(request.context.__parent__, "vendor")
vendor_widget = form["item"]["vendor"].widget

39
ordr3/static/script.js

@ -178,6 +178,8 @@ $(function() { @@ -178,6 +178,8 @@ $(function() {
$("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) {
// autocorrect vendor
var target = $(event.delegateTarget);
@ -185,23 +187,28 @@ $(function() { @@ -185,23 +187,28 @@ $(function() {
var url = target.attr("data-url")
$.post( url, { vendor: input_value }, function( data ) {
var corrected_name = data["name"];
if (data["found"] && (corrected_name != input_value)) {
info = $('.o3-vendor-cancel')
if( info.length) {
info.find("a").text('"' + input_value + '"')
if (data["found"]) {
if (corrected_name.toLowerCase() != input_value.toLowerCase()) {
info = $('.o3-vendor-cancel')
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 {
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;
});
var info = $('.o3-vendor-cancel');
info.remove();
}
target.val(corrected_name);
} else {

1
ordr3/static/style.css

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

2
ordr3/templates/orders/edit.jinja2

@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
{{form.render()|safe}}
<hr>
<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>
{% endif %}
{% if request.has_permission("delete", context) %}

16
ordr3/templates/orders/reorder.jinja2

@ -0,0 +1,16 @@ @@ -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): @@ -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(
context="ordr3:resources.OrderList",
permission="view",
@ -272,36 +322,14 @@ def view_order(context, request): @@ -272,36 +322,14 @@ def view_order(context, request):
renderer="ordr3:templates/orders/edit.jinja2",
)
def edit_order(context, request):
form = orders.EditOrderSchema.as_form(request)
order = context.model
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}
autocorrect_url = request.resource_url(context.__parent__, "vendor")
form = orders.EditOrderSchema.as_form(
request, autocorrect_url=autocorrect_url
)
form_data = {
"status": status,
"item": item,
"pricing": pricing,
"optional": optional,
}
form_data = get_form_data_from_order(context.model)
form.set_appstruct(form_data)
return {"form": form}
@ -314,9 +342,10 @@ def edit_order(context, request): @@ -314,9 +342,10 @@ def edit_order(context, request):
)
def do_edit_order(context, request):
""" process the edit order form """
print(request.POST)
form = orders.EditOrderSchema.as_form(request)
autocorrect_url = request.resource_url(context.__parent__, "vendor")
form = orders.EditOrderSchema.as_form(
request, autocorrect_url=autocorrect_url
)
if "Save_Changes" not in request.POST:
return HTTPFound(request.resource_url(context.__parent__))
@ -330,25 +359,10 @@ def do_edit_order(context, request): @@ -330,25 +359,10 @@ def do_edit_order(context, request):
# form validation sucessful, change order
order = context.model
form_status = appstruct["status"]
form_item = appstruct["item"]
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"]
update_order_with_form_data(order, appstruct)
form_status_section = appstruct["status"]
status = models.OrderStatus[form_status["status"]]
status = models.OrderStatus[form_status_section["status"]]
is_noteworthy = services.create_log_entry(order, status, request.user)
if is_noteworthy:
@ -364,6 +378,67 @@ def do_edit_order(context, request): @@ -364,6 +378,67 @@ def do_edit_order(context, request):
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(
context="ordr3:resources.Order",
name="delete",

Loading…
Cancel
Save