48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
|
import math
|
||
|
|
||
|
|
||
|
def format_product_stock_values(product, wh_id):
|
||
|
""" Format product stock values for the location selector.
|
||
|
|
||
|
:param product.product|product.template product: The product whose stock values to format.
|
||
|
:param int wh_id: The warehouse whose stock to check for the given product.
|
||
|
:return: The formatted product stock values.
|
||
|
:rtype: dict
|
||
|
"""
|
||
|
if product.is_product_variant: # Only available for `product.product` records.
|
||
|
free_qty = product.with_context(warehouse_id=wh_id).free_qty
|
||
|
return {
|
||
|
'in_stock': free_qty > 0,
|
||
|
'show_quantity': (
|
||
|
product.show_availability and product.available_threshold >= free_qty
|
||
|
),
|
||
|
'quantity': free_qty,
|
||
|
}
|
||
|
else:
|
||
|
return {}
|
||
|
|
||
|
|
||
|
def calculate_partner_distance(partner1, partner2):
|
||
|
""" Calculate the Haversine distance between two partners.
|
||
|
|
||
|
See https://en.wikipedia.org/wiki/Haversine_formula.
|
||
|
|
||
|
:param res.partner partner1: The partner to calculate distance from.
|
||
|
:param res.partner partner2: The partner to calculate distance to.
|
||
|
:return: The distance between the two partners (in kilometers).
|
||
|
:rtype: float
|
||
|
"""
|
||
|
R = 6371 # The radius of Earth.
|
||
|
lat1, long1 = partner1.partner_latitude, partner1.partner_longitude
|
||
|
lat2, long2 = partner2.partner_latitude, partner2.partner_longitude
|
||
|
dlat = math.radians(lat2 - lat1)
|
||
|
dlong = math.radians(long2 - long1)
|
||
|
arcsin = (
|
||
|
math.sin(dlat / 2) * math.sin(dlat / 2)
|
||
|
+ math.cos(math.radians(lat1)) * math.cos(math.radians(lat2))
|
||
|
* (math.sin(dlong / 2) * math.sin(dlong / 2))
|
||
|
)
|
||
|
d = 2 * R * math.atan2(math.sqrt(arcsin), math.sqrt(1 - arcsin))
|
||
|
|
||
|
return d
|