def _create_daklapack_order(order_dict):
    order_dict[ORDER_ID_KEY] = str(uuid.uuid4())

    with Transaction() as t:
        try:
            daklapack_order = DaklapackOrder.from_api(**order_dict)
        except ValueError as e:
            raise RepoException(e)

        # The Daklapack API wants a *list* of orders, and we are submitting one
        # at a time, so we have a list of one item :)
        post_response = post_daklapack_orders(
            [daklapack_order.order_structure])
        if post_response.status_code >= 400:
            # for now, very basic error handling--just pass on dak api error
            response_msg = {"order_address":
                            daklapack_order.order_structure[ADDR_DICT_KEY],
                            "order_success": False,
                            "daklapack_api_error_msg":
                                post_response.get_data(as_text=True),
                            "daklapack_api_error_code":
                            post_response.status_code}
            return response_msg

        # write order to db
        admin_repo = AdminRepo(t)
        order_id = admin_repo.create_daklapack_order(daklapack_order)
        t.commit()

    status_msg = {"order_address":
                  daklapack_order.order_structure[ADDR_DICT_KEY],
                  "order_success": True,
                  "order_id": order_id}
    return status_msg
Example #2
0
    def test_create_daklapack_order(self):
        with Transaction() as t:
            # need a valid submitter id from the account table to input
            with t.dict_cursor() as cur:
                cur.execute("SELECT id, first_name, last_name "
                            "FROM ag.account "
                            "WHERE account_type = 'admin' "
                            "ORDER BY id "
                            "LIMIT 1;")
                submitter_record = cur.fetchone()
                submitter_id = submitter_record[0]
                submitter_name = f"{submitter_record[1]} " \
                                 f"{submitter_record[2]}"

                # need real project ids to show can link order to project
                cur.execute("SELECT project_id "
                            "FROM barcodes.project "
                            "ORDER BY project_id "
                            "LIMIT 2;")
                project_id_records = cur.fetchall()
                project_ids = [x[0] for x in project_id_records]

            order_struct = {
                'orderId': '7ed917ef-0c4d-431a-9aa0-0a1f4f41f44b',
                'articles': [
                    {
                        'articleCode': '350102',
                        'addresses': [
                            {
                                'firstName': 'Jane',
                                'lastName': 'Doe',
                                'address1': '123 Main St',
                                'insertion': 'Apt 2',
                                'address2': '',
                                'postalCode': 92210,
                                'city': 'San Diego',
                                'state': 'CA',
                                'country': 'USA',
                                'countryCode': 'us',
                                'phone': '(858) 555-1212',
                                'creationDate': '2020-10-09T22:43:52.219328Z',
                                'companyName': submitter_name
                            },
                            {
                                'firstName': 'Tom',
                                'lastName': 'Thumb',
                                'address1': '29 Side St',
                                'insertion': '',
                                'address2': 'Kew Gardens',
                                'postalCode': 'KG7-448',
                                'city': 'Gananoque',
                                'state': 'Ontario',
                                'country': 'Canada',
                                'countryCode': 'ca',
                                'phone': '(858) 555-1212',
                                'creationDate': '2020-10-09T22:43:52.219350Z',
                                'companyName': submitter_name
                            }
                        ]
                    }
                ],
                'shippingProvider': 'FedEx',
                'shippingType': 'FEDEX_2_DAY',
                'shippingProviderMetadata': [
                    {'key': 'Reference 1',
                     'value': 'Bill Ted'}
                ]
            }

            acct_repo = AccountRepo(t)
            submitter_acct = acct_repo.get_account(submitter_id)

            input_id = '7ed917ef-0c4d-431a-9aa0-0a1f4f41f44b'
            creation_timestamp = dateutil.parser.isoparse(
                "2020-10-09T22:43:52.219328Z")
            last_polling_timestamp = dateutil.parser.isoparse(
                "2020-10-19T12:40:19.219328Z")
            desc = "a description"
            hold_msg = "hold this order"
            last_status = "accepted"

            # create dummy daklapack order object
            input = DaklapackOrder(input_id, submitter_acct, list(project_ids),
                                   order_struct, desc, hold_msg,
                                   creation_timestamp, last_polling_timestamp,
                                   last_status)

            # call create_daklapack_order
            admin_repo = AdminRepo(t)
            returned_id = admin_repo.create_daklapack_order(input)

            self.assertEqual(input_id, returned_id)

            expected_record = [input_id,
                               submitter_id,
                               desc,
                               hold_msg,
                               order_struct,
                               creation_timestamp,
                               last_polling_timestamp,
                               last_status]

            # check db to show new records exist
            with t.dict_cursor() as cur:
                # need real project ids to show can link order to project
                cur.execute("SELECT * "
                            "FROM barcodes.daklapack_order "
                            "WHERE dak_order_id =  %s",
                            (input_id, ))
                curr_records = cur.fetchall()
                self.assertEqual(len(curr_records), 1)
                self.assertEqual(expected_record, curr_records[0])

                cur.execute("SELECT project_id "
                            "FROM barcodes.daklapack_order_to_project "
                            "WHERE dak_order_id =  %s",
                            (input_id, ))
                curr_proj_records = cur.fetchall()
                self.assertEqual(len(curr_proj_records), 2)
                for curr_proj_rec in curr_proj_records:
                    self.assertTrue(curr_proj_rec[0] in project_ids)