def do_DELETE(self):
     path = urlparse(self.path).path
     if path.startswith(
             '/datastore/'
     ) and is_testing_mode:  # Route only available for testing mode
         self.do_delete_data_store()
     elif path == '/deleteorder':
         self.do_delete_order()
     else:
         set_response(self, 404, '404', 'text/html')
 def do_GET(self):
     path = urlparse(self.path).path
     if path == '/ping':
         self.do_get_ping()
     elif path.startswith('/datastore/') and is_testing_mode:
         self.do_get_data_store()
     elif path == '/getitem':
         self.do_get_item()
     elif path == '/getorder':
         self.do_get_order()
     else:
         set_response(self, 404, '404', 'text/html')
        def do_post_add_item_to_order(self):
            post_data = get_raw_post_data(self)
            post_dict = parse_json(post_data)
            order_id = get_value(post_dict, 'order_id')
            item_identifier = get_value(post_dict, 'item_identifier')

            msg = ''
            if order_id is None or order_id == '':
                msg += 'Must provide order_id. '
            if item_identifier is None:
                msg += 'Must provide item. '

            if msg != '':
                set_response(self, 400, msg, 'text/text')
            else:
                order = datastore.get('orders:' + order_id)
                item = datastore.get('itemdetails:' + item_identifier)

                if order is None:
                    set_response(self, 400, 'Order does not exist.',
                                 'text/text')
                elif item is None:
                    set_response(self, 400, 'Item does not exist.',
                                 'text/text')
                else:
                    # If the item is a UNIT type, we only want to allow integers
                    # for the quantity since it doesn't make sense to have something
                    # like 1.25 cans of soup
                    quantity = parse_float(get_value(post_dict, 'quantity'),
                                           1.0)
                    if item.billing_method == Methods.UNIT:
                        quantity = parse_int(quantity)

                    order.add_item(item, quantity)
                    set_response(self, 200, '')
 def do_POST(self):
     path = urlparse(self.path).path
     if path == '/ping':
         self.do_post_ping()
     elif path == '/datastore' and is_testing_mode:  # Route only available for testing mode
         self.do_post_data_store()
     elif path == '/createitem':
         self.do_post_create_item()
     elif path == '/createorder':
         self.do_post_create_order()
     elif path == '/additemtoorder':
         self.do_post_add_item_to_order()
     elif path == '/removeitemfromorder':
         self.do_post_remove_item_from_order()
     else:
         set_response(self, 404, '404', 'text/html')
        def do_post_create_item(self):
            post_data = get_raw_post_data(self)
            item_dict = parse_json(post_data)

            # Pull out all of the fields we need
            identifier = get_value(item_dict, 'identifier')
            price = parse_float(get_value(item_dict, 'price', 0))
            billing_method = get_value(item_dict, 'billing_method', '')
            special = get_value(item_dict, 'special')

            # Ensure that all necessary data is present
            msg = ''
            if identifier is None or identifier == '':
                msg += 'Must provide identifier. '
            if price is None or price <= 0:
                msg += 'Must provide price and must be positive. '

            if msg != '':
                set_response(self, 400, msg, 'text/text')
            else:
                # Check to see if the provided special is valid
                if special is not None:
                    msg = validate_special(special, billing_method)
                if msg != '':
                    set_response(self, 400, msg, 'text/text')
                else:
                    # Create and store the item and tell the user everything is fine
                    item = Item(identifier, price, billing_method, special)
                    datastore.set('itemdetails:' + item.identifier, item)
                    set_response(self, 200, '')
 def do_get_order(self):
     url_query = parse_url_query(self.path)
     order_id = get_value(url_query, 'id')
     if order_id is None or order_id == '':
         set_response(self, 400, 'Must provide order id')
     else:
         order = datastore.get('orders:' + order_id)
         if order is None:
             set_response(self, 400, 'Order does not exist.')
         else:
             set_response(self, 200, order.to_json())
        def do_post_data_store(self):
            post_data = get_raw_post_data(self)
            post_dict = parse_json(post_data)
            key = get_value(post_dict, 'key')
            value = get_value(post_dict, 'value')

            if key is None:
                set_response(self, 400, 'Must provide key', 'text/text')
            elif value is None:
                set_response(self, 400, 'Must provide value', 'text/text')
            else:
                datastore.set(key, value)
                set_response(self, 200, '')
        def do_delete_order(self):
            post_data = get_raw_post_data(self)
            post_dict = parse_json(post_data)
            order_id = get_value(post_dict, 'id')

            if order_id is None:
                set_response(self, 400, 'Must provide id.', 'text/text')
            else:
                if datastore.get('orders:' + order_id) is not None:
                    datastore.delete('orders:' + order_id)
                    set_response(self, 200, '')
                else:
                    set_response(self, 400, 'Order does not exist',
                                 'text/text')
 def do_get_item(self):
     url_query = parse_url_query(self.path)
     identifier = get_value(url_query, 'identifier')
     # Ensure that the client provided an identifier to look up
     if identifier is None or identifier == '':
         set_response(self, 400, 'Must provide identifier.',
                      'text/text')
     else:
         item = datastore.get('itemdetails:' + identifier, None)
         if item is not None:
             # Return the item to the user as json
             set_response(self, 200, item.to_json())
         else:
             # If the identifier isn't an identifier from an item, tell the client there
             # was a problem
             set_response(self, 400, 'Item does not exist.',
                          'text/text')
 def do_post_create_order(self):
     post_data = get_raw_post_data(self)
     post_dict = parse_json(post_data)
     order_id = get_value(post_dict, 'id')
     # Ensure the client provided an id to create
     if order_id is None or order_id == '':
         set_response(self, 400, 'Must provide id.', 'text/text')
     else:
         # If the order already exists, we don't want to overwrite it
         # Instead, tell the user that there was a problem
         if datastore.get('orders:' + order_id) is None:
             order = MakeOrder(order_id, datastore)
             datastore.set('orders:' + order_id, order)
             set_response(self, 200, '')
         else:
             set_response(self, 400,
                          'Order with that id already exists.',
                          'text/text')
 def do_get_data_store(self):
     data_id = get_path_id(self.path)
     value = datastore.get(data_id)
     set_response(self, 200, json.dumps(value))
 def do_get_ping(self):
     set_response(self, 200, 'pong', 'text/text')
 def do_delete_data_store(self):
     data_id = get_path_id(self.path)
     datastore.delete(data_id)
     set_response(self, 200, '')
 def do_post_ping(self):
     # Read the post variables and return them to the client
     post_data = get_raw_post_data(self)
     post_dict = parse_json(post_data, dict())
     json_resp = json.dumps(post_dict)
     set_response(self, 200, json_resp)