forked from uncloud/uncloud
make value_in_json=True
This commit is contained in:
parent
1a76d2b5f3
commit
200a7672f2
4 changed files with 23 additions and 24 deletions
|
@ -8,7 +8,7 @@ from uncloud.common import logger
|
||||||
|
|
||||||
|
|
||||||
class EtcdEntry:
|
class EtcdEntry:
|
||||||
def __init__(self, meta_or_key, value, value_in_json=False):
|
def __init__(self, meta_or_key, value, value_in_json=True):
|
||||||
if hasattr(meta_or_key, 'key'):
|
if hasattr(meta_or_key, 'key'):
|
||||||
# if meta has attr 'key' then get it
|
# if meta has attr 'key' then get it
|
||||||
self.key = meta_or_key.key.decode('utf-8')
|
self.key = meta_or_key.key.decode('utf-8')
|
||||||
|
@ -30,8 +30,8 @@ def readable_errors(func):
|
||||||
raise UncloudException('Cannot connect to etcd: is etcd running as configured in uncloud.conf?')
|
raise UncloudException('Cannot connect to etcd: is etcd running as configured in uncloud.conf?')
|
||||||
except etcd3.exceptions.ConnectionTimeoutError as err:
|
except etcd3.exceptions.ConnectionTimeoutError as err:
|
||||||
raise etcd3.exceptions.ConnectionTimeoutError('etcd connection timeout.') from err
|
raise etcd3.exceptions.ConnectionTimeoutError('etcd connection timeout.') from err
|
||||||
except Exception:
|
except Exception as err:
|
||||||
logger.exception('Some etcd error occured. See syslog for details.')
|
logger.exception('Some etcd error occured. See syslog for details.', err)
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
@ -42,14 +42,14 @@ class EtcdWrapper:
|
||||||
self.client = etcd3.client(*args, **kwargs)
|
self.client = etcd3.client(*args, **kwargs)
|
||||||
|
|
||||||
@readable_errors
|
@readable_errors
|
||||||
def get(self, *args, value_in_json=False, **kwargs):
|
def get(self, *args, value_in_json=True, **kwargs):
|
||||||
_value, _key = self.client.get(*args, **kwargs)
|
_value, _key = self.client.get(*args, **kwargs)
|
||||||
if _key is None or _value is None:
|
if _key is None or _value is None:
|
||||||
return None
|
return None
|
||||||
return EtcdEntry(_key, _value, value_in_json=value_in_json)
|
return EtcdEntry(_key, _value, value_in_json=value_in_json)
|
||||||
|
|
||||||
@readable_errors
|
@readable_errors
|
||||||
def put(self, *args, value_in_json=False, **kwargs):
|
def put(self, *args, value_in_json=True, **kwargs):
|
||||||
_key, _value = args
|
_key, _value = args
|
||||||
if value_in_json:
|
if value_in_json:
|
||||||
_value = json.dumps(_value)
|
_value = json.dumps(_value)
|
||||||
|
@ -60,16 +60,16 @@ class EtcdWrapper:
|
||||||
return self.client.put(_key, _value, **kwargs)
|
return self.client.put(_key, _value, **kwargs)
|
||||||
|
|
||||||
@readable_errors
|
@readable_errors
|
||||||
def get_prefix(self, *args, value_in_json=False, raise_exception=True, **kwargs):
|
def get_prefix(self, *args, value_in_json=True, **kwargs):
|
||||||
event_iterator = self.client.get_prefix(*args, **kwargs)
|
event_iterator = self.client.get_prefix(*args, **kwargs)
|
||||||
for e in event_iterator:
|
for e in event_iterator:
|
||||||
yield EtcdEntry(*e[::-1], value_in_json=value_in_json)
|
yield EtcdEntry(*e[::-1], value_in_json=value_in_json)
|
||||||
|
|
||||||
@readable_errors
|
@readable_errors
|
||||||
def watch_prefix(self, key, raise_exception=True, value_in_json=False):
|
def watch_prefix(self, key, value_in_json=True):
|
||||||
event_iterator, cancel = self.client.watch_prefix(key)
|
event_iterator, cancel = self.client.watch_prefix(key)
|
||||||
for e in event_iterator:
|
for e in event_iterator:
|
||||||
if hasattr(e, '_event'):
|
if hasattr(e, '_event'):
|
||||||
e = e._event
|
e = getattr('e', '_event')
|
||||||
if e.type == e.PUT:
|
if e.type == e.PUT:
|
||||||
yield EtcdEntry(e.kv.key, e.kv.value, value_in_json=value_in_json)
|
yield EtcdEntry(e.kv.key, e.kv.value, value_in_json=value_in_json)
|
||||||
|
|
|
@ -168,6 +168,7 @@ class ProductOrderSchema(BaseSchema):
|
||||||
def product_id_validation(self):
|
def product_id_validation(self):
|
||||||
product = resolve_product(self.product_id.value, etcd_client)
|
product = resolve_product(self.product_id.value, etcd_client)
|
||||||
if product:
|
if product:
|
||||||
|
product['quantity'] = float(product['quantity'])
|
||||||
self.product_id.value = product['uuid']
|
self.product_id.value = product['uuid']
|
||||||
self.objects['product'] = product
|
self.objects['product'] = product
|
||||||
logging.debug('Got product {}'.format(product))
|
logging.debug('Got product {}'.format(product))
|
||||||
|
@ -181,7 +182,8 @@ class ProductOrderSchema(BaseSchema):
|
||||||
raise ValidationException('No such product exists.')
|
raise ValidationException('No such product exists.')
|
||||||
|
|
||||||
def validation(self):
|
def validation(self):
|
||||||
customer_previous_orders = etcd_client.get_prefix('/v1/user/{}'.format(self.username.value), value_in_json=True)
|
username = self.objects['user'].uid
|
||||||
|
customer_previous_orders = etcd_client.get_prefix('/v1/user/{}'.format(username), value_in_json=True)
|
||||||
customer_previous_orders = [o.value for o in customer_previous_orders]
|
customer_previous_orders = [o.value for o in customer_previous_orders]
|
||||||
membership = next(filter(lambda o: o['product'] == 'membership', customer_previous_orders), None)
|
membership = next(filter(lambda o: o['product'] == 'membership', customer_previous_orders), None)
|
||||||
if membership is None and self.objects['product']['usable-id'] != 'membership':
|
if membership is None and self.objects['product']['usable-id'] != 'membership':
|
||||||
|
|
|
@ -272,14 +272,14 @@ class StripeUtils(object):
|
||||||
all_stripe_plans = client.get("/v1/stripe_plans")
|
all_stripe_plans = client.get("/v1/stripe_plans")
|
||||||
all_stripe_plans_set = set()
|
all_stripe_plans_set = set()
|
||||||
if all_stripe_plans:
|
if all_stripe_plans:
|
||||||
all_stripe_plans_obj = json.loads(all_stripe_plans.value)
|
all_stripe_plans_obj = all_stripe_plans.value
|
||||||
if all_stripe_plans_obj and len(all_stripe_plans_obj['plans']) > 0:
|
if all_stripe_plans_obj and len(all_stripe_plans_obj['plans']) > 0:
|
||||||
all_stripe_plans_set = set(all_stripe_plans_obj["plans"])
|
all_stripe_plans_set = set(all_stripe_plans_obj["plans"])
|
||||||
return all_stripe_plans_set
|
return all_stripe_plans_set
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _save_all_stripe_plans(stripe_plans):
|
def _save_all_stripe_plans(stripe_plans):
|
||||||
client.put("/v1/stripe_plans", json.dumps({"plans": list(stripe_plans)}))
|
client.put("/v1/stripe_plans", {"plans": list(stripe_plans)})
|
||||||
|
|
||||||
@handle_stripe_error
|
@handle_stripe_error
|
||||||
def get_or_create_stripe_plan(self, product_name, amount, stripe_plan_id,
|
def get_or_create_stripe_plan(self, product_name, amount, stripe_plan_id,
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import json
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
@ -19,10 +18,10 @@ from helper import get_plan_id_from_product, calculate_charges
|
||||||
class ListProducts(Resource):
|
class ListProducts(Resource):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get():
|
def get():
|
||||||
products = client.get_prefix('/v1/products/', value_in_json=False)
|
products = client.get_prefix('/v1/products/')
|
||||||
products = [
|
products = [
|
||||||
product
|
product
|
||||||
for product in [json.loads(p.value) for p in products]
|
for product in [p.value for p in products]
|
||||||
if product['active']
|
if product['active']
|
||||||
]
|
]
|
||||||
prod_dict = {}
|
prod_dict = {}
|
||||||
|
@ -63,7 +62,7 @@ class AddProduct(Resource):
|
||||||
product_value['uuid'] = product_uuid
|
product_value['uuid'] = product_uuid
|
||||||
|
|
||||||
logger.debug('Adding product data: {}'.format(str(product_value)))
|
logger.debug('Adding product data: {}'.format(str(product_value)))
|
||||||
client.put(product_key, product_value, value_in_json=True)
|
client.put(product_key, product_value)
|
||||||
if not previous_product:
|
if not previous_product:
|
||||||
return make_return_message('Product created.')
|
return make_return_message('Product created.')
|
||||||
else:
|
else:
|
||||||
|
@ -201,7 +200,7 @@ class ProductOrder(Resource):
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
with client.client.lock('product-order') as lock:
|
with client.client.lock('product-order') as _:
|
||||||
# Initiate a one-time/subscription based on product type
|
# Initiate a one-time/subscription based on product type
|
||||||
if recurring_charge > 0:
|
if recurring_charge > 0:
|
||||||
logger.debug('Product {} is recurring payment'.format(product['name']))
|
logger.debug('Product {} is recurring payment'.format(product['name']))
|
||||||
|
@ -234,11 +233,10 @@ class ProductOrder(Resource):
|
||||||
client.put(
|
client.put(
|
||||||
'/v1/user/{}/orders/{}'.format(
|
'/v1/user/{}/orders/{}'.format(
|
||||||
cleaned_values['username'], order_obj['order-id']
|
cleaned_values['username'], order_obj['order-id']
|
||||||
),
|
), order_obj
|
||||||
order_obj, value_in_json=True
|
|
||||||
)
|
)
|
||||||
product['quantity'] -= 1
|
product['quantity'] -= 1
|
||||||
client.put('/v1/products/{}'.format(product['uuid']), product, value_in_json=True)
|
client.put('/v1/products/{}'.format(product['uuid']), product)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'message': 'Order Successful.',
|
'message': 'Order Successful.',
|
||||||
|
@ -246,6 +244,7 @@ class ProductOrder(Resource):
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
logger.error('Could not create plan {}'.format(plan_id))
|
logger.error('Could not create plan {}'.format(plan_id))
|
||||||
|
return make_return_message('Something wrong happened. Contact administrator', 400)
|
||||||
|
|
||||||
elif recurring_charge == 0 and one_time_charge > 0:
|
elif recurring_charge == 0 and one_time_charge > 0:
|
||||||
logger.debug('Product {} is one-time payment'.format(product['name']))
|
logger.debug('Product {} is one-time payment'.format(product['name']))
|
||||||
|
@ -268,10 +267,10 @@ class ProductOrder(Resource):
|
||||||
}
|
}
|
||||||
client.put(
|
client.put(
|
||||||
'/v1/user/{}/orders/{}'.format(cleaned_values['username'], order_obj['order-id']),
|
'/v1/user/{}/orders/{}'.format(cleaned_values['username'], order_obj['order-id']),
|
||||||
order_obj, value_in_json=True
|
order_obj
|
||||||
)
|
)
|
||||||
product['quantity'] -= 1
|
product['quantity'] -= 1
|
||||||
client.put('/v1/products/{}'.format(product['uuid']), product, value_in_json=True)
|
client.put('/v1/products/{}'.format(product['uuid']), product)
|
||||||
|
|
||||||
return {'message': 'Order successful', **order_obj}, 200
|
return {'message': 'Order successful', **order_obj}, 200
|
||||||
|
|
||||||
|
@ -288,9 +287,7 @@ class OrderList(Resource):
|
||||||
return make_return_message(err, 400)
|
return make_return_message(err, 400)
|
||||||
else:
|
else:
|
||||||
cleaned_values = validator.get_cleaned_values()
|
cleaned_values = validator.get_cleaned_values()
|
||||||
orders = client.get_prefix(
|
orders = client.get_prefix('/v1/user/{}/orders'.format(cleaned_values['username']))
|
||||||
'/v1/user/{}/orders'.format(cleaned_values['username']), value_in_json=True
|
|
||||||
)
|
|
||||||
orders_dict = {
|
orders_dict = {
|
||||||
order.value['order-id']: {
|
order.value['order-id']: {
|
||||||
**order.value
|
**order.value
|
||||||
|
|
Loading…
Reference in a new issue