From f3c8e0ee36bbec5df12996b4f9f81a362e1e69da Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Wed, 20 May 2026 10:50:30 +0000 Subject: [PATCH] Autosave: 20260520-105030 --- .../__pycache__/admin.cpython-311.pyc | Bin 1169 -> 4682 bytes .../accounts/__pycache__/apps.cpython-311.pyc | Bin 485 -> 546 bytes .../__pycache__/delivery.cpython-311.pyc | Bin 0 -> 5654 bytes .../__pycache__/forms.cpython-311.pyc | Bin 0 -> 15583 bytes .../__pycache__/models.cpython-311.pyc | Bin 2120 -> 3976 bytes .../__pycache__/tests.cpython-311.pyc | Bin 0 -> 3496 bytes .../__pycache__/views.cpython-311.pyc | Bin 8226 -> 8148 bytes myproject/accounts/admin.py | 82 +- myproject/accounts/apps.py | 11 +- myproject/accounts/delivery.py | 128 + myproject/accounts/forms.py | 293 +- ...fault_address_profile_latitude_and_more.py | 48 + ..._profile_latitude_and_more.cpython-311.pyc | Bin 0 -> 1857 bytes myproject/accounts/models.py | 83 +- myproject/accounts/tests.py | 112 +- myproject/accounts/views.py | 104 +- .../cart/__pycache__/apps.cpython-311.pyc | Bin 473 -> 534 bytes .../cart/__pycache__/tests.cpython-311.pyc | Bin 0 -> 222 bytes .../cart/__pycache__/views.cpython-311.pyc | Bin 8546 -> 8761 bytes myproject/cart/apps.py | 11 +- myproject/cart/views.py | 8 +- .../context_processors.cpython-311.pyc | Bin 6357 -> 6528 bytes .../core/__pycache__/tests.cpython-311.pyc | Bin 0 -> 222 bytes .../core/__pycache__/views.cpython-311.pyc | Bin 7635 -> 11603 bytes myproject/core/context_processors.py | 12 +- myproject/core/views.py | 130 +- myproject/db.sqlite3 | Bin 225280 -> 225280 bytes myproject/media/products/checkout.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_7Tq3pK9.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_Apl5oIV.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_Fu8w9sg.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_OIU3UZr.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_UwESDAP.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_XwH82Ej.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_cHT6Jqv.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_kHc70mM.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_kXmZj1w.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_swmZZ69.gif | Bin 0 -> 43 bytes myproject/media/products/checkout_tynTK9s.gif | Bin 0 -> 43 bytes myproject/media/products/product.gif | Bin 0 -> 43 bytes myproject/media/products/product_43wNxQz.gif | Bin 0 -> 43 bytes myproject/media/products/product_6lHiVJy.gif | Bin 0 -> 43 bytes myproject/media/products/product_Ant52cM.gif | Bin 0 -> 43 bytes myproject/media/products/product_AuUXWqH.gif | Bin 0 -> 43 bytes myproject/media/products/product_ETEIG5v.gif | Bin 0 -> 43 bytes myproject/media/products/product_ElMt9Bz.gif | Bin 0 -> 43 bytes myproject/media/products/product_Jr0cyVq.gif | Bin 0 -> 43 bytes myproject/media/products/product_LLFVOs6.gif | Bin 0 -> 43 bytes myproject/media/products/product_OEdan1B.gif | Bin 0 -> 43 bytes myproject/media/products/product_P2RBysy.gif | Bin 0 -> 43 bytes myproject/media/products/product_QD5Pj7T.gif | Bin 0 -> 43 bytes myproject/media/products/product_R2JLv1Y.gif | Bin 0 -> 43 bytes myproject/media/products/product_RHmtSgn.gif | Bin 0 -> 43 bytes myproject/media/products/product_RoWLVcr.gif | Bin 0 -> 43 bytes myproject/media/products/product_SaeMYQz.gif | Bin 0 -> 43 bytes myproject/media/products/product_bbYiWAc.gif | Bin 0 -> 43 bytes myproject/media/products/product_g0hum12.gif | Bin 0 -> 43 bytes myproject/media/products/product_k2IZBN8.gif | Bin 0 -> 43 bytes myproject/media/products/product_qrGyMS2.gif | Bin 0 -> 43 bytes myproject/media/products/product_rCx1Jzm.gif | Bin 0 -> 43 bytes myproject/media/products/product_rGz8cvy.gif | Bin 0 -> 43 bytes myproject/media/products/product_tjnDy5f.gif | Bin 0 -> 43 bytes myproject/media/products/product_vcUB9za.gif | Bin 0 -> 43 bytes .../profile_pics/user_3/samanya_you.webp | Bin 0 -> 15226 bytes myproject/media/profile_pics/user_6/logo.jpg | Bin 0 -> 87570 bytes .../__pycache__/settings.cpython-311.pyc | Bin 3041 -> 6045 bytes myproject/myproject/settings.py | 44 +- .../orders/__pycache__/admin.cpython-311.pyc | Bin 1192 -> 9356 bytes .../orders/__pycache__/models.cpython-311.pyc | Bin 2881 -> 4682 bytes .../__pycache__/payments.cpython-311.pyc | Bin 0 -> 27797 bytes .../orders/__pycache__/tests.cpython-311.pyc | Bin 0 -> 16491 bytes .../orders/__pycache__/urls.cpython-311.pyc | Bin 887 -> 1201 bytes .../orders/__pycache__/views.cpython-311.pyc | Bin 12534 -> 42475 bytes myproject/orders/admin.py | 149 +- ...paid_at_order_payment_currency_and_more.py | 58 + ..._delivery_notes_order_latitude_and_more.py | 38 + ..._payment_currency_and_more.cpython-311.pyc | Bin 0 -> 2288 bytes ...es_order_latitude_and_more.cpython-311.pyc | Bin 0 -> 1551 bytes myproject/orders/models.py | 40 +- myproject/orders/payments.py | 497 + myproject/orders/tests.py | 285 +- myproject/orders/urls.py | 26 +- myproject/orders/views.py | 968 +- .../products/__pycache__/apps.cpython-311.pyc | Bin 485 -> 546 bytes .../__pycache__/models.cpython-311.pyc | Bin 4699 -> 5318 bytes .../__pycache__/tests.cpython-311.pyc | Bin 0 -> 226 bytes .../__pycache__/views.cpython-311.pyc | Bin 7004 -> 8074 bytes myproject/products/apps.py | 11 +- .../migrations/0008_alter_product_category.py | 18 + ...008_alter_product_category.cpython-311.pyc | Bin 0 -> 1209 bytes myproject/products/models.py | 9 + myproject/products/views.py | 26 +- myproject/static/css/auth.css | 397 +- myproject/static/css/home.css | 196 + myproject/static/css/navbar.css | 147 + myproject/static/css/product.css | 1091 ++ myproject/static/css/profile.css | 196 +- myproject/static/css/style.css | 217 + myproject/static/js/app.js | 227 +- .../tempelates/accounts/edit_profile.html | 150 +- myproject/tempelates/accounts/login.html | 92 +- myproject/tempelates/accounts/profile.html | 83 +- myproject/tempelates/accounts/register.html | 187 +- myproject/tempelates/base.html | 8 +- myproject/tempelates/cart/cart.html | 86 +- myproject/tempelates/core/home.html | 189 +- myproject/tempelates/core/settings.html | 59 +- myproject/tempelates/includes/navbar.html | 18 +- myproject/tempelates/order/checkout.html | 173 +- myproject/tempelates/order/my_orders.html | 83 +- myproject/tempelates/order/order_detail.html | 122 +- myproject/tempelates/order/payment.html | 177 +- .../tempelates/order/payment_redirect.html | 73 + myproject/tempelates/order/success.html | 94 +- .../tempelates/products/product_details.html | 72 +- .../tempelates/products/product_list.html | 94 +- requirements.txt | 5 +- venv/bin/normalizer | 8 + ...821__mypyc.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 429672 bytes .../typing_extensions.cpython-311.pyc | Bin 0 -> 179469 bytes .../certifi-2026.4.22.dist-info/INSTALLER | 1 + .../certifi-2026.4.22.dist-info/METADATA | 78 + .../certifi-2026.4.22.dist-info/RECORD | 14 + .../certifi-2026.4.22.dist-info/WHEEL | 5 + .../licenses/LICENSE | 20 + .../certifi-2026.4.22.dist-info/top_level.txt | 1 + .../site-packages/certifi/__init__.py | 4 + .../site-packages/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 336 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 725 bytes .../certifi/__pycache__/core.cpython-311.pyc | Bin 0 -> 2395 bytes .../site-packages/certifi/cacert.pem | 3933 +++++ .../python3.11/site-packages/certifi/core.py | 83 + .../python3.11/site-packages/certifi/py.typed | 0 .../INSTALLER | 1 + .../METADATA | 808 + .../charset_normalizer-3.4.7.dist-info/RECORD | 36 + .../charset_normalizer-3.4.7.dist-info/WHEEL | 7 + .../entry_points.txt | 2 + .../licenses/LICENSE | 21 + .../top_level.txt | 2 + .../charset_normalizer/__init__.py | 48 + .../charset_normalizer/__main__.py | 6 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1917 bytes .../__pycache__/__main__.cpython-311.pyc | Bin 0 -> 408 bytes .../__pycache__/api.cpython-311.pyc | Bin 0 -> 27085 bytes .../__pycache__/cd.cpython-311.pyc | Bin 0 -> 17159 bytes .../__pycache__/constant.cpython-311.pyc | Bin 0 -> 48903 bytes .../__pycache__/legacy.cpython-311.pyc | Bin 0 -> 3338 bytes .../__pycache__/md.cpython-311.pyc | Bin 0 -> 31590 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 18671 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 17263 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 414 bytes .../site-packages/charset_normalizer/api.py | 988 ++ .../cd.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 15912 bytes .../site-packages/charset_normalizer/cd.py | 454 + .../charset_normalizer/cli/__init__.py | 8 + .../charset_normalizer/cli/__main__.py | 362 + .../cli/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 380 bytes .../cli/__pycache__/__main__.cpython-311.pyc | Bin 0 -> 15250 bytes .../charset_normalizer/constant.py | 2050 +++ .../charset_normalizer/legacy.py | 79 + .../md.cpython-311-x86_64-linux-gnu.so | Bin 0 -> 15912 bytes .../site-packages/charset_normalizer/md.py | 936 ++ .../charset_normalizer/models.py | 369 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 422 + .../charset_normalizer/version.py | 8 + .../idna-3.15.dist-info/INSTALLER | 1 + .../idna-3.15.dist-info/METADATA | 194 + .../site-packages/idna-3.15.dist-info/RECORD | 22 + .../site-packages/idna-3.15.dist-info/WHEEL | 4 + .../idna-3.15.dist-info/licenses/LICENSE.md | 31 + .../python3.11/site-packages/idna/__init__.py | 45 + .../idna/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1098 bytes .../idna/__pycache__/codec.cpython-311.pyc | Bin 0 -> 7101 bytes .../idna/__pycache__/compat.cpython-311.pyc | Bin 0 -> 2038 bytes .../idna/__pycache__/core.cpython-311.pyc | Bin 0 -> 29365 bytes .../idna/__pycache__/idnadata.cpython-311.pyc | Bin 0 -> 104560 bytes .../__pycache__/intranges.cpython-311.pyc | Bin 0 -> 2977 bytes .../__pycache__/package_data.cpython-311.pyc | Bin 0 -> 214 bytes .../__pycache__/uts46data.cpython-311.pyc | Bin 0 -> 144142 bytes .../python3.11/site-packages/idna/codec.py | 159 + .../python3.11/site-packages/idna/compat.py | 41 + .../lib/python3.11/site-packages/idna/core.py | 620 + .../python3.11/site-packages/idna/idnadata.py | 4367 ++++++ .../site-packages/idna/intranges.py | 56 + .../site-packages/idna/package_data.py | 1 + .../python3.11/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8383 ++++++++++ .../requests-2.34.2.dist-info/INSTALLER | 1 + .../requests-2.34.2.dist-info/METADATA | 120 + .../requests-2.34.2.dist-info/RECORD | 46 + .../requests-2.34.2.dist-info/WHEEL | 5 + .../licenses/LICENSE | 175 + .../requests-2.34.2.dist-info/licenses/NOTICE | 2 + .../requests-2.34.2.dist-info/top_level.txt | 1 + .../site-packages/requests/__init__.py | 219 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 6757 bytes .../__pycache__/__version__.cpython-311.pyc | Bin 0 -> 582 bytes .../_internal_utils.cpython-311.pyc | Bin 0 -> 2260 bytes .../__pycache__/_types.cpython-311.pyc | Bin 0 -> 8722 bytes .../__pycache__/adapters.cpython-311.pyc | Bin 0 -> 31738 bytes .../requests/__pycache__/api.cpython-311.pyc | Bin 0 -> 8302 bytes .../requests/__pycache__/auth.cpython-311.pyc | Bin 0 -> 17154 bytes .../__pycache__/certs.cpython-311.pyc | Bin 0 -> 716 bytes .../__pycache__/compat.cpython-311.pyc | Bin 0 -> 2979 bytes .../__pycache__/cookies.cpython-311.pyc | Bin 0 -> 30620 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 9595 bytes .../requests/__pycache__/help.cpython-311.pyc | Bin 0 -> 4569 bytes .../__pycache__/hooks.cpython-311.pyc | Bin 0 -> 1881 bytes .../__pycache__/models.cpython-311.pyc | Bin 0 -> 45783 bytes .../__pycache__/packages.cpython-311.pyc | Bin 0 -> 1169 bytes .../__pycache__/sessions.cpython-311.pyc | Bin 0 -> 33934 bytes .../__pycache__/status_codes.cpython-311.pyc | Bin 0 -> 6448 bytes .../__pycache__/structures.cpython-311.pyc | Bin 0 -> 8201 bytes .../__pycache__/utils.cpython-311.pyc | Bin 0 -> 44879 bytes .../site-packages/requests/__version__.py | 14 + .../site-packages/requests/_internal_utils.py | 51 + .../site-packages/requests/_types.py | 183 + .../site-packages/requests/adapters.py | 748 + .../python3.11/site-packages/requests/api.py | 180 + .../python3.11/site-packages/requests/auth.py | 354 + .../site-packages/requests/certs.py | 18 + .../site-packages/requests/compat.py | 113 + .../site-packages/requests/cookies.py | 625 + .../site-packages/requests/exceptions.py | 162 + .../python3.11/site-packages/requests/help.py | 134 + .../site-packages/requests/hooks.py | 48 + .../site-packages/requests/models.py | 1180 ++ .../site-packages/requests/packages.py | 23 + .../site-packages/requests/py.typed | 0 .../site-packages/requests/sessions.py | 920 ++ .../site-packages/requests/status_codes.py | 128 + .../site-packages/requests/structures.py | 130 + .../site-packages/requests/utils.py | 1155 ++ .../stripe-12.5.1.dist-info/INSTALLER | 1 + .../stripe-12.5.1.dist-info/METADATA | 84 + .../stripe-12.5.1.dist-info/RECORD | 1157 ++ .../stripe-12.5.1.dist-info/REQUESTED | 0 .../stripe-12.5.1.dist-info/WHEEL | 6 + .../stripe-12.5.1.dist-info/licenses/LICENSE | 21 + .../stripe-12.5.1.dist-info/top_level.txt | 1 + .../site-packages/stripe/__init__.py | 576 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 24789 bytes .../__pycache__/_account.cpython-311.pyc | Bin 0 -> 155069 bytes ...account_capability_service.cpython-311.pyc | Bin 0 -> 6206 bytes ...t_external_account_service.cpython-311.pyc | Bin 0 -> 15181 bytes .../__pycache__/_account_link.cpython-311.pyc | Bin 0 -> 3905 bytes .../_account_link_service.cpython-311.pyc | Bin 0 -> 3294 bytes ...account_login_link_service.cpython-311.pyc | Bin 0 -> 2780 bytes .../_account_person_service.cpython-311.pyc | Bin 0 -> 29352 bytes .../_account_service.cpython-311.pyc | Bin 0 -> 119688 bytes .../_account_session.cpython-311.pyc | Bin 0 -> 35823 bytes .../_account_session_service.cpython-311.pyc | Bin 0 -> 22816 bytes .../__pycache__/_any_iterator.cpython-311.pyc | Bin 0 -> 1980 bytes .../__pycache__/_api_mode.cpython-311.pyc | Bin 0 -> 302 bytes .../_api_requestor.cpython-311.pyc | Bin 0 -> 29998 bytes .../__pycache__/_api_resource.cpython-311.pyc | Bin 0 -> 9021 bytes .../__pycache__/_api_version.cpython-311.pyc | Bin 0 -> 484 bytes .../__pycache__/_app_info.cpython-311.pyc | Bin 0 -> 739 bytes .../_apple_pay_domain.cpython-311.pyc | Bin 0 -> 9566 bytes .../_apple_pay_domain_service.cpython-311.pyc | Bin 0 -> 6779 bytes .../__pycache__/_application.cpython-311.pyc | Bin 0 -> 995 bytes .../_application_fee.cpython-311.pyc | Bin 0 -> 18131 bytes .../_application_fee_refund.cpython-311.pyc | Bin 0 -> 3591 bytes ...ication_fee_refund_service.cpython-311.pyc | Bin 0 -> 9014 bytes .../_application_fee_service.cpython-311.pyc | Bin 0 -> 5531 bytes .../__pycache__/_apps_service.cpython-311.pyc | Bin 0 -> 996 bytes .../__pycache__/_balance.cpython-311.pyc | Bin 0 -> 9470 bytes .../_balance_service.cpython-311.pyc | Bin 0 -> 2377 bytes .../_balance_transaction.cpython-311.pyc | Bin 0 -> 9576 bytes ...alance_transaction_service.cpython-311.pyc | Bin 0 -> 5412 bytes .../__pycache__/_bank_account.cpython-311.pyc | Bin 0 -> 14631 bytes .../__pycache__/_base_address.cpython-311.pyc | Bin 0 -> 960 bytes .../_billing_portal_service.cpython-311.pyc | Bin 0 -> 1231 bytes .../_billing_service.cpython-311.pyc | Bin 0 -> 2241 bytes .../__pycache__/_capability.cpython-311.pyc | Bin 0 -> 9495 bytes .../stripe/__pycache__/_card.cpython-311.pyc | Bin 0 -> 10257 bytes .../__pycache__/_cash_balance.cpython-311.pyc | Bin 0 -> 2598 bytes .../__pycache__/_charge.cpython-311.pyc | Bin 0 -> 82481 bytes .../_charge_service.cpython-311.pyc | Bin 0 -> 17927 bytes .../_checkout_service.cpython-311.pyc | Bin 0 -> 1015 bytes .../_client_options.cpython-311.pyc | Bin 0 -> 1050 bytes .../_climate_service.cpython-311.pyc | Bin 0 -> 1344 bytes .../_confirmation_token.cpython-311.pyc | Bin 0 -> 75167 bytes ...confirmation_token_service.cpython-311.pyc | Bin 0 -> 2628 bytes ...onnect_collection_transfer.cpython-311.pyc | Bin 0 -> 1276 bytes .../__pycache__/_country_spec.cpython-311.pyc | Bin 0 -> 6218 bytes .../_country_spec_service.cpython-311.pyc | Bin 0 -> 4168 bytes .../__pycache__/_coupon.cpython-311.pyc | Bin 0 -> 16122 bytes .../_coupon_service.cpython-311.pyc | Bin 0 -> 11559 bytes .../_createable_api_resource.cpython-311.pyc | Bin 0 -> 1190 bytes .../__pycache__/_credit_note.cpython-311.pyc | Bin 0 -> 32566 bytes .../_credit_note_line_item.cpython-311.pyc | Bin 0 -> 4416 bytes ...dit_note_line_item_service.cpython-311.pyc | Bin 0 -> 3101 bytes ...note_preview_lines_service.cpython-311.pyc | Bin 0 -> 6033 bytes .../_credit_note_service.cpython-311.pyc | Bin 0 -> 17807 bytes .../_custom_method.cpython-311.pyc | Bin 0 -> 2992 bytes .../__pycache__/_customer.cpython-311.pyc | Bin 0 -> 87163 bytes ...stomer_balance_transaction.cpython-311.pyc | Bin 0 -> 4032 bytes ...alance_transaction_service.cpython-311.pyc | Bin 0 -> 8571 bytes ...tomer_cash_balance_service.cpython-311.pyc | Bin 0 -> 4593 bytes ...r_cash_balance_transaction.cpython-311.pyc | Bin 0 -> 7153 bytes ...alance_transaction_service.cpython-311.pyc | Bin 0 -> 5041 bytes ...nding_instructions_service.cpython-311.pyc | Bin 0 -> 4321 bytes ...mer_payment_method_service.cpython-311.pyc | Bin 0 -> 5436 bytes ...mer_payment_source_service.cpython-311.pyc | Bin 0 -> 15068 bytes .../_customer_service.cpython-311.pyc | Bin 0 -> 26659 bytes .../_customer_session.cpython-311.pyc | Bin 0 -> 8544 bytes .../_customer_session_service.cpython-311.pyc | Bin 0 -> 5217 bytes .../_customer_tax_id_service.cpython-311.pyc | Bin 0 -> 8503 bytes .../_deletable_api_resource.cpython-311.pyc | Bin 0 -> 1889 bytes .../__pycache__/_discount.cpython-311.pyc | Bin 0 -> 2293 bytes .../__pycache__/_dispute.cpython-311.pyc | Bin 0 -> 29869 bytes .../_dispute_service.cpython-311.pyc | Bin 0 -> 15888 bytes .../__pycache__/_encode.cpython-311.pyc | Bin 0 -> 3404 bytes .../_entitlements_service.cpython-311.pyc | Bin 0 -> 1252 bytes .../_ephemeral_key.cpython-311.pyc | Bin 0 -> 5517 bytes .../_ephemeral_key_service.cpython-311.pyc | Bin 0 -> 4046 bytes .../stripe/__pycache__/_error.cpython-311.pyc | Bin 0 -> 8600 bytes .../__pycache__/_error_object.cpython-311.pyc | Bin 0 -> 3979 bytes .../stripe/__pycache__/_event.cpython-311.pyc | Bin 0 -> 14863 bytes .../_event_service.cpython-311.pyc | Bin 0 -> 5169 bytes .../_exchange_rate.cpython-311.pyc | Bin 0 -> 6009 bytes .../_exchange_rate_service.cpython-311.pyc | Bin 0 -> 4320 bytes .../_expandable_field.cpython-311.pyc | Bin 0 -> 372 bytes .../stripe/__pycache__/_file.cpython-311.pyc | Bin 0 -> 9342 bytes .../__pycache__/_file_link.cpython-311.pyc | Bin 0 -> 9012 bytes .../_file_link_service.cpython-311.pyc | Bin 0 -> 7735 bytes .../__pycache__/_file_service.cpython-311.pyc | Bin 0 -> 7715 bytes ...ancial_connections_service.cpython-311.pyc | Bin 0 -> 1475 bytes .../_forwarding_service.cpython-311.pyc | Bin 0 -> 1023 bytes .../_funding_instructions.cpython-311.pyc | Bin 0 -> 11604 bytes .../__pycache__/_http_client.cpython-311.pyc | Bin 0 -> 62376 bytes .../_identity_service.cpython-311.pyc | Bin 0 -> 1290 bytes .../__pycache__/_invoice.cpython-311.pyc | Bin 0 -> 161067 bytes .../__pycache__/_invoice_item.cpython-311.pyc | Bin 0 -> 21340 bytes .../_invoice_item_service.cpython-311.pyc | Bin 0 -> 14480 bytes .../_invoice_line_item.cpython-311.pyc | Bin 0 -> 15952 bytes ..._invoice_line_item_service.cpython-311.pyc | Bin 0 -> 10519 bytes .../_invoice_payment.cpython-311.pyc | Bin 0 -> 7422 bytes .../_invoice_payment_service.cpython-311.pyc | Bin 0 -> 5036 bytes ...invoice_rendering_template.cpython-311.pyc | Bin 0 -> 13217 bytes ...rendering_template_service.cpython-311.pyc | Bin 0 -> 8013 bytes .../_invoice_service.cpython-311.pyc | Bin 0 -> 105517 bytes .../_issuing_service.cpython-311.pyc | Bin 0 -> 2326 bytes .../__pycache__/_line_item.cpython-311.pyc | Bin 0 -> 2854 bytes .../__pycache__/_list_object.cpython-311.pyc | Bin 0 -> 11721 bytes .../_listable_api_resource.cpython-311.pyc | Bin 0 -> 1757 bytes .../__pycache__/_login_link.cpython-311.pyc | Bin 0 -> 1285 bytes .../__pycache__/_mandate.cpython-311.pyc | Bin 0 -> 10930 bytes .../_mandate_service.cpython-311.pyc | Bin 0 -> 2482 bytes .../_multipart_data_generator.cpython-311.pyc | Bin 0 -> 5112 bytes ...ted_resource_class_methods.cpython-311.pyc | Bin 0 -> 5443 bytes .../stripe/__pycache__/_oauth.cpython-311.pyc | Bin 0 -> 8831 bytes .../_oauth_service.cpython-311.pyc | Bin 0 -> 4687 bytes .../_object_classes.cpython-311.pyc | Bin 0 -> 12728 bytes .../_payment_intent.cpython-311.pyc | Bin 0 -> 292706 bytes .../_payment_intent_service.cpython-311.pyc | Bin 0 -> 218490 bytes .../__pycache__/_payment_link.cpython-311.pyc | Bin 0 -> 67498 bytes ...ent_link_line_item_service.cpython-311.pyc | Bin 0 -> 3106 bytes .../_payment_link_service.cpython-311.pyc | Bin 0 -> 47021 bytes .../_payment_method.cpython-311.pyc | Bin 0 -> 79212 bytes ...yment_method_configuration.cpython-311.pyc | Bin 0 -> 119719 bytes ...thod_configuration_service.cpython-311.pyc | Bin 0 -> 89454 bytes .../_payment_method_domain.cpython-311.pyc | Bin 0 -> 15970 bytes ...ment_method_domain_service.cpython-311.pyc | Bin 0 -> 9335 bytes .../_payment_method_service.cpython-311.pyc | Bin 0 -> 38699 bytes .../__pycache__/_payout.cpython-311.pyc | Bin 0 -> 20750 bytes .../_payout_service.cpython-311.pyc | Bin 0 -> 12975 bytes .../__pycache__/_person.cpython-311.pyc | Bin 0 -> 18483 bytes .../stripe/__pycache__/_plan.cpython-311.pyc | Bin 0 -> 17864 bytes .../__pycache__/_plan_service.cpython-311.pyc | Bin 0 -> 12240 bytes .../stripe/__pycache__/_price.cpython-311.pyc | Bin 0 -> 24819 bytes .../_price_service.cpython-311.pyc | Bin 0 -> 18179 bytes .../__pycache__/_product.cpython-311.pyc | Bin 0 -> 31249 bytes .../_product_feature.cpython-311.pyc | Bin 0 -> 1426 bytes .../_product_feature_service.cpython-311.pyc | Bin 0 -> 7606 bytes .../_product_service.cpython-311.pyc | Bin 0 -> 19286 bytes .../_promotion_code.cpython-311.pyc | Bin 0 -> 13201 bytes .../_promotion_code_service.cpython-311.pyc | Bin 0 -> 10550 bytes .../stripe/__pycache__/_quote.cpython-311.pyc | Bin 0 -> 55419 bytes ...upfront_line_items_service.cpython-311.pyc | Bin 0 -> 3266 bytes .../_quote_line_item_service.cpython-311.pyc | Bin 0 -> 3045 bytes .../_quote_service.cpython-311.pyc | Bin 0 -> 26650 bytes .../_radar_service.cpython-311.pyc | Bin 0 -> 1423 bytes .../__pycache__/_refund.cpython-311.pyc | Bin 0 -> 31947 bytes .../_refund_service.cpython-311.pyc | Bin 0 -> 10699 bytes .../_reporting_service.cpython-311.pyc | Bin 0 -> 1212 bytes .../_request_metrics.cpython-311.pyc | Bin 0 -> 1229 bytes .../_request_options.cpython-311.pyc | Bin 0 -> 3152 bytes .../_requestor_options.cpython-311.pyc | Bin 0 -> 4248 bytes .../_reserve_transaction.cpython-311.pyc | Bin 0 -> 1034 bytes .../__pycache__/_reversal.cpython-311.pyc | Bin 0 -> 4135 bytes .../__pycache__/_review.cpython-311.pyc | Bin 0 -> 11087 bytes .../_review_service.cpython-311.pyc | Bin 0 -> 6159 bytes .../_search_result_object.cpython-311.pyc | Bin 0 -> 9152 bytes .../_searchable_api_resource.cpython-311.pyc | Bin 0 -> 2453 bytes .../_setup_attempt.cpython-311.pyc | Bin 0 -> 24500 bytes .../_setup_attempt_service.cpython-311.pyc | Bin 0 -> 3187 bytes .../__pycache__/_setup_intent.cpython-311.pyc | Bin 0 -> 153693 bytes .../_setup_intent_service.cpython-311.pyc | Bin 0 -> 128244 bytes .../_shipping_rate.cpython-311.pyc | Bin 0 -> 14876 bytes .../_shipping_rate_service.cpython-311.pyc | Bin 0 -> 11641 bytes .../_sigma_service.cpython-311.pyc | Bin 0 -> 1059 bytes .../_singleton_api_resource.cpython-311.pyc | Bin 0 -> 1866 bytes .../__pycache__/_source.cpython-311.pyc | Bin 0 -> 47758 bytes ...ource_mandate_notification.cpython-311.pyc | Bin 0 -> 2807 bytes .../_source_service.cpython-311.pyc | Bin 0 -> 21890 bytes .../_source_transaction.cpython-311.pyc | Bin 0 -> 4439 bytes ...source_transaction_service.cpython-311.pyc | Bin 0 -> 2948 bytes .../_stripe_client.cpython-311.pyc | Bin 0 -> 56347 bytes .../_stripe_object.cpython-311.pyc | Bin 0 -> 26747 bytes .../_stripe_response.cpython-311.pyc | Bin 0 -> 4653 bytes .../_stripe_service.cpython-311.pyc | Bin 0 -> 3308 bytes .../__pycache__/_subscription.cpython-311.pyc | Bin 0 -> 91723 bytes .../_subscription_item.cpython-311.pyc | Bin 0 -> 18232 bytes ..._subscription_item_service.cpython-311.pyc | Bin 0 -> 14094 bytes .../_subscription_schedule.cpython-311.pyc | Bin 0 -> 61344 bytes ...scription_schedule_service.cpython-311.pyc | Bin 0 -> 43213 bytes .../_subscription_service.cpython-311.pyc | Bin 0 -> 65892 bytes .../__pycache__/_tax_code.cpython-311.pyc | Bin 0 -> 4557 bytes .../_tax_code_service.cpython-311.pyc | Bin 0 -> 4270 bytes .../_tax_deducted_at_source.cpython-311.pyc | Bin 0 -> 1032 bytes .../__pycache__/_tax_id.cpython-311.pyc | Bin 0 -> 13891 bytes .../_tax_id_service.cpython-311.pyc | Bin 0 -> 8524 bytes .../__pycache__/_tax_rate.cpython-311.pyc | Bin 0 -> 10961 bytes .../_tax_rate_service.cpython-311.pyc | Bin 0 -> 8752 bytes .../__pycache__/_tax_service.cpython-311.pyc | Bin 0 -> 1552 bytes .../_terminal_service.cpython-311.pyc | Bin 0 -> 1568 bytes .../__pycache__/_test_helpers.cpython-311.pyc | Bin 0 -> 3752 bytes .../_test_helpers_service.cpython-311.pyc | Bin 0 -> 2127 bytes .../stripe/__pycache__/_token.cpython-311.pyc | Bin 0 -> 32860 bytes .../_token_service.cpython-311.pyc | Bin 0 -> 31734 bytes .../stripe/__pycache__/_topup.cpython-311.pyc | Bin 0 -> 13987 bytes .../_topup_service.cpython-311.pyc | Bin 0 -> 9850 bytes .../__pycache__/_transfer.cpython-311.pyc | Bin 0 -> 18848 bytes ..._transfer_reversal_service.cpython-311.pyc | Bin 0 -> 8897 bytes .../_transfer_service.cpython-311.pyc | Bin 0 -> 9279 bytes .../_treasury_service.cpython-311.pyc | Bin 0 -> 2805 bytes .../_updateable_api_resource.cpython-311.pyc | Bin 0 -> 2285 bytes .../stripe/__pycache__/_util.cpython-311.pyc | Bin 0 -> 18974 bytes .../__pycache__/_v1_services.cpython-311.pyc | Bin 0 -> 12693 bytes .../__pycache__/_v2_services.cpython-311.pyc | Bin 0 -> 1146 bytes .../__pycache__/_verify_mixin.cpython-311.pyc | Bin 0 -> 1643 bytes .../__pycache__/_version.cpython-311.pyc | Bin 0 -> 210 bytes .../__pycache__/_webhook.cpython-311.pyc | Bin 0 -> 5386 bytes .../_webhook_endpoint.cpython-311.pyc | Bin 0 -> 21748 bytes .../_webhook_endpoint_service.cpython-311.pyc | Bin 0 -> 18242 bytes .../__pycache__/api_version.cpython-311.pyc | Bin 0 -> 603 bytes .../__pycache__/app_info.cpython-311.pyc | Bin 0 -> 577 bytes .../stripe/__pycache__/error.cpython-311.pyc | Bin 0 -> 1291 bytes .../__pycache__/http_client.cpython-311.pyc | Bin 0 -> 719 bytes .../multipart_data_generator.cpython-311.pyc | Bin 0 -> 653 bytes .../stripe/__pycache__/oauth.cpython-311.pyc | Bin 0 -> 720 bytes .../__pycache__/oauth_error.cpython-311.pyc | Bin 0 -> 2666 bytes .../request_metrics.cpython-311.pyc | Bin 0 -> 618 bytes .../request_options.cpython-311.pyc | Bin 0 -> 775 bytes .../__pycache__/stripe_object.cpython-311.pyc | Bin 0 -> 773 bytes .../stripe_response.cpython-311.pyc | Bin 0 -> 856 bytes .../stripe/__pycache__/util.cpython-311.pyc | Bin 0 -> 719 bytes .../__pycache__/version.cpython-311.pyc | Bin 0 -> 638 bytes .../__pycache__/webhook.cpython-311.pyc | Bin 0 -> 771 bytes .../site-packages/stripe/_account.py | 5682 +++++++ .../stripe/_account_capability_service.py | 175 + .../_account_external_account_service.py | 449 + .../site-packages/stripe/_account_link.py | 110 + .../stripe/_account_link_service.py | 91 + .../stripe/_account_login_link_service.py | 64 + .../stripe/_account_person_service.py | 1228 ++ .../site-packages/stripe/_account_service.py | 4174 +++++ .../site-packages/stripe/_account_session.py | 1167 ++ .../stripe/_account_session_service.py | 684 + .../site-packages/stripe/_any_iterator.py | 34 + .../site-packages/stripe/_api_mode.py | 4 + .../site-packages/stripe/_api_requestor.py | 904 ++ .../site-packages/stripe/_api_resource.py | 232 + .../site-packages/stripe/_api_version.py | 5 + .../site-packages/stripe/_app_info.py | 9 + .../site-packages/stripe/_apple_pay_domain.py | 271 + .../stripe/_apple_pay_domain_service.py | 210 + .../site-packages/stripe/_application.py | 25 + .../site-packages/stripe/_application_fee.py | 618 + .../stripe/_application_fee_refund.py | 80 + .../stripe/_application_fee_refund_service.py | 255 + .../stripe/_application_fee_service.py | 144 + .../site-packages/stripe/_apps_service.py | 10 + .../site-packages/stripe/_balance.py | 321 + .../site-packages/stripe/_balance_service.py | 55 + .../stripe/_balance_transaction.py | 337 + .../stripe/_balance_transaction_service.py | 159 + .../site-packages/stripe/_bank_account.py | 534 + .../site-packages/stripe/_base_address.py | 12 + .../stripe/_billing_portal_service.py | 12 + .../site-packages/stripe/_billing_service.py | 34 + .../site-packages/stripe/_capability.py | 411 + .../python3.11/site-packages/stripe/_card.py | 327 + .../site-packages/stripe/_cash_balance.py | 58 + .../site-packages/stripe/_charge.py | 3110 ++++ .../site-packages/stripe/_charge_service.py | 626 + .../site-packages/stripe/_checkout_service.py | 10 + .../site-packages/stripe/_client_options.py | 17 + .../site-packages/stripe/_climate_service.py | 14 + .../stripe/_confirmation_token.py | 2630 ++++ .../stripe/_confirmation_token_service.py | 60 + .../stripe/_connect_collection_transfer.py | 39 + .../site-packages/stripe/_country_spec.py | 164 + .../stripe/_country_spec_service.py | 117 + .../site-packages/stripe/_coupon.py | 481 + .../site-packages/stripe/_coupon_service.py | 354 + .../stripe/_createable_api_resource.py | 14 + .../site-packages/stripe/_credit_note.py | 1209 ++ .../stripe/_credit_note_line_item.py | 166 + .../stripe/_credit_note_line_item_service.py | 73 + .../_credit_note_preview_lines_service.py | 201 + .../stripe/_credit_note_service.py | 626 + .../site-packages/stripe/_custom_method.py | 71 + .../site-packages/stripe/_customer.py | 3107 ++++ .../stripe/_customer_balance_transaction.py | 114 + .../_customer_balance_transaction_service.py | 255 + .../stripe/_customer_cash_balance_service.py | 124 + .../_customer_cash_balance_transaction.py | 202 + ...stomer_cash_balance_transaction_service.py | 129 + .../_customer_funding_instructions_service.py | 110 + .../_customer_payment_method_service.py | 188 + .../_customer_payment_source_service.py | 462 + .../site-packages/stripe/_customer_service.py | 988 ++ .../site-packages/stripe/_customer_session.py | 271 + .../stripe/_customer_session_service.py | 143 + .../stripe/_customer_tax_id_service.py | 347 + .../stripe/_deletable_api_resource.py | 23 + .../site-packages/stripe/_discount.py | 76 + .../site-packages/stripe/_dispute.py | 1081 ++ .../site-packages/stripe/_dispute_service.py | 547 + .../site-packages/stripe/_encode.py | 56 + .../stripe/_entitlements_service.py | 14 + .../site-packages/stripe/_ephemeral_key.py | 159 + .../stripe/_ephemeral_key_service.py | 116 + .../python3.11/site-packages/stripe/_error.py | 195 + .../site-packages/stripe/_error_object.py | 136 + .../python3.11/site-packages/stripe/_event.py | 465 + .../site-packages/stripe/_event_service.py | 147 + .../site-packages/stripe/_exchange_rate.py | 139 + .../stripe/_exchange_rate_service.py | 117 + .../site-packages/stripe/_expandable_field.py | 4 + .../python3.11/site-packages/stripe/_file.py | 325 + .../site-packages/stripe/_file_link.py | 283 + .../stripe/_file_link_service.py | 253 + .../site-packages/stripe/_file_service.py | 245 + .../stripe/_financial_connections_service.py | 16 + .../stripe/_forwarding_service.py | 10 + .../stripe/_funding_instructions.py | 582 + .../site-packages/stripe/_http_client.py | 1543 ++ .../site-packages/stripe/_identity_service.py | 18 + .../site-packages/stripe/_invoice.py | 5978 ++++++++ .../site-packages/stripe/_invoice_item.py | 718 + .../stripe/_invoice_item_service.py | 528 + .../stripe/_invoice_line_item.py | 584 + .../stripe/_invoice_line_item_service.py | 362 + .../site-packages/stripe/_invoice_payment.py | 215 + .../stripe/_invoice_payment_service.py | 139 + .../stripe/_invoice_rendering_template.py | 390 + .../_invoice_rendering_template_service.py | 219 + .../site-packages/stripe/_invoice_service.py | 3790 +++++ .../site-packages/stripe/_issuing_service.py | 28 + .../site-packages/stripe/_line_item.py | 119 + .../site-packages/stripe/_list_object.py | 257 + .../stripe/_listable_api_resource.py | 31 + .../site-packages/stripe/_login_link.py | 26 + .../site-packages/stripe/_mandate.py | 274 + .../site-packages/stripe/_mandate_service.py | 56 + .../stripe/_multipart_data_generator.py | 87 + .../stripe/_nested_resource_class_methods.py | 118 + .../python3.11/site-packages/stripe/_oauth.py | 355 + .../site-packages/stripe/_oauth_service.py | 99 + .../site-packages/stripe/_object_classes.py | 158 + .../site-packages/stripe/_payment_intent.py | 12759 ++++++++++++++++ .../stripe/_payment_intent_service.py | 9275 +++++++++++ .../site-packages/stripe/_payment_link.py | 2981 ++++ .../stripe/_payment_link_line_item_service.py | 73 + .../stripe/_payment_link_service.py | 2029 +++ .../site-packages/stripe/_payment_method.py | 2955 ++++ .../stripe/_payment_method_configuration.py | 3458 +++++ .../_payment_method_configuration_service.py | 2267 +++ .../stripe/_payment_method_domain.py | 534 + .../stripe/_payment_method_domain_service.py | 291 + .../stripe/_payment_method_service.py | 1263 ++ .../site-packages/stripe/_payout.py | 678 + .../site-packages/stripe/_payout_service.py | 411 + .../site-packages/stripe/_person.py | 791 + .../python3.11/site-packages/stripe/_plan.py | 595 + .../site-packages/stripe/_plan_service.py | 421 + .../python3.11/site-packages/stripe/_price.py | 899 ++ .../site-packages/stripe/_price_service.py | 670 + .../site-packages/stripe/_product.py | 1033 ++ .../site-packages/stripe/_product_feature.py | 38 + .../stripe/_product_feature_service.py | 232 + .../site-packages/stripe/_product_service.py | 677 + .../site-packages/stripe/_promotion_code.py | 406 + .../stripe/_promotion_code_service.py | 345 + .../python3.11/site-packages/stripe/_quote.py | 1951 +++ ...ote_computed_upfront_line_items_service.py | 73 + .../stripe/_quote_line_item_service.py | 73 + .../site-packages/stripe/_quote_service.py | 942 ++ .../site-packages/stripe/_radar_service.py | 14 + .../site-packages/stripe/_refund.py | 965 ++ .../site-packages/stripe/_refund_service.py | 360 + .../stripe/_reporting_service.py | 12 + .../site-packages/stripe/_request_metrics.py | 23 + .../site-packages/stripe/_request_options.py | 78 + .../stripe/_requestor_options.py | 91 + .../stripe/_reserve_transaction.py | 28 + .../site-packages/stripe/_reversal.py | 98 + .../site-packages/stripe/_review.py | 364 + .../site-packages/stripe/_review_service.py | 185 + .../stripe/_search_result_object.py | 178 + .../stripe/_searchable_api_resource.py | 49 + .../site-packages/stripe/_setup_attempt.py | 889 ++ .../stripe/_setup_attempt_service.py | 95 + .../site-packages/stripe/_setup_intent.py | 5555 +++++++ .../stripe/_setup_intent_service.py | 4635 ++++++ .../site-packages/stripe/_shipping_rate.py | 468 + .../stripe/_shipping_rate_service.py | 383 + .../site-packages/stripe/_sigma_service.py | 10 + .../stripe/_singleton_api_resource.py | 29 + .../site-packages/stripe/_source.py | 1477 ++ .../stripe/_source_mandate_notification.py | 100 + .../site-packages/stripe/_source_service.py | 752 + .../stripe/_source_transaction.py | 176 + .../stripe/_source_transaction_service.py | 73 + .../site-packages/stripe/_stripe_client.py | 990 ++ .../site-packages/stripe/_stripe_object.py | 612 + .../site-packages/stripe/_stripe_response.py | 65 + .../site-packages/stripe/_stripe_service.py | 91 + .../site-packages/stripe/_subscription.py | 3096 ++++ .../stripe/_subscription_item.py | 648 + .../stripe/_subscription_item_service.py | 517 + .../stripe/_subscription_schedule.py | 2204 +++ .../stripe/_subscription_schedule_service.py | 1553 ++ .../stripe/_subscription_service.py | 2196 +++ .../site-packages/stripe/_tax_code.py | 118 + .../site-packages/stripe/_tax_code_service.py | 113 + .../stripe/_tax_deducted_at_source.py | 31 + .../site-packages/stripe/_tax_id.py | 601 + .../site-packages/stripe/_tax_id_service.py | 351 + .../site-packages/stripe/_tax_rate.py | 429 + .../site-packages/stripe/_tax_rate_service.py | 347 + .../site-packages/stripe/_tax_service.py | 16 + .../site-packages/stripe/_terminal_service.py | 16 + .../site-packages/stripe/_test_helpers.py | 65 + .../stripe/_test_helpers_service.py | 24 + .../python3.11/site-packages/stripe/_token.py | 1299 ++ .../site-packages/stripe/_token_service.py | 1259 ++ .../python3.11/site-packages/stripe/_topup.py | 456 + .../site-packages/stripe/_topup_service.py | 331 + .../site-packages/stripe/_transfer.py | 567 + .../stripe/_transfer_reversal_service.py | 255 + .../site-packages/stripe/_transfer_service.py | 290 + .../site-packages/stripe/_treasury_service.py | 28 + .../stripe/_updateable_api_resource.py | 31 + .../python3.11/site-packages/stripe/_util.py | 460 + .../site-packages/stripe/_v1_services.py | 160 + .../site-packages/stripe/_v2_services.py | 12 + .../site-packages/stripe/_verify_mixin.py | 21 + .../site-packages/stripe/_version.py | 1 + .../site-packages/stripe/_webhook.py | 96 + .../site-packages/stripe/_webhook_endpoint.py | 1018 ++ .../stripe/_webhook_endpoint_service.py | 928 ++ .../stripe/api_resources/__init__.py | 144 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 8272 bytes .../__pycache__/account.cpython-311.pyc | Bin 0 -> 778 bytes .../__pycache__/account_link.cpython-311.pyc | Bin 0 -> 810 bytes .../account_session.cpython-311.pyc | Bin 0 -> 834 bytes .../apple_pay_domain.cpython-311.pyc | Bin 0 -> 838 bytes .../__pycache__/application.cpython-311.pyc | Bin 0 -> 806 bytes .../application_fee.cpython-311.pyc | Bin 0 -> 834 bytes .../application_fee_refund.cpython-311.pyc | Bin 0 -> 880 bytes .../__pycache__/balance.cpython-311.pyc | Bin 0 -> 778 bytes .../balance_transaction.cpython-311.pyc | Bin 0 -> 862 bytes .../__pycache__/bank_account.cpython-311.pyc | Bin 0 -> 810 bytes .../__pycache__/capability.cpython-311.pyc | Bin 0 -> 799 bytes .../__pycache__/card.cpython-311.pyc | Bin 0 -> 757 bytes .../__pycache__/cash_balance.cpython-311.pyc | Bin 0 -> 810 bytes .../__pycache__/charge.cpython-311.pyc | Bin 0 -> 771 bytes .../confirmation_token.cpython-311.pyc | Bin 0 -> 855 bytes ...onnect_collection_transfer.cpython-311.pyc | Bin 0 -> 915 bytes .../__pycache__/country_spec.cpython-311.pyc | Bin 0 -> 810 bytes .../__pycache__/coupon.cpython-311.pyc | Bin 0 -> 771 bytes .../__pycache__/credit_note.cpython-311.pyc | Bin 0 -> 803 bytes .../credit_note_line_item.cpython-311.pyc | Bin 0 -> 870 bytes .../__pycache__/customer.cpython-311.pyc | Bin 0 -> 785 bytes ...stomer_balance_transaction.cpython-311.pyc | Bin 0 -> 922 bytes ...r_cash_balance_transaction.cpython-311.pyc | Bin 0 -> 954 bytes .../customer_session.cpython-311.pyc | Bin 0 -> 841 bytes .../__pycache__/discount.cpython-311.pyc | Bin 0 -> 785 bytes .../__pycache__/dispute.cpython-311.pyc | Bin 0 -> 778 bytes .../__pycache__/ephemeral_key.cpython-311.pyc | Bin 0 -> 820 bytes .../__pycache__/error_object.cpython-311.pyc | Bin 0 -> 814 bytes .../__pycache__/event.cpython-311.pyc | Bin 0 -> 764 bytes .../__pycache__/exchange_rate.cpython-311.pyc | Bin 0 -> 820 bytes .../__pycache__/file.cpython-311.pyc | Bin 0 -> 757 bytes .../__pycache__/file_link.cpython-311.pyc | Bin 0 -> 789 bytes .../funding_instructions.cpython-311.pyc | Bin 0 -> 869 bytes .../__pycache__/invoice.cpython-311.pyc | Bin 0 -> 778 bytes .../__pycache__/invoice_item.cpython-311.pyc | Bin 0 -> 810 bytes .../invoice_line_item.cpython-311.pyc | Bin 0 -> 845 bytes .../invoice_payment.cpython-311.pyc | Bin 0 -> 834 bytes ...invoice_rendering_template.cpython-311.pyc | Bin 0 -> 908 bytes .../__pycache__/line_item.cpython-311.pyc | Bin 0 -> 789 bytes .../__pycache__/list_object.cpython-311.pyc | Bin 0 -> 803 bytes .../__pycache__/login_link.cpython-311.pyc | Bin 0 -> 796 bytes .../__pycache__/mandate.cpython-311.pyc | Bin 0 -> 778 bytes .../payment_intent.cpython-311.pyc | Bin 0 -> 827 bytes .../__pycache__/payment_link.cpython-311.pyc | Bin 0 -> 810 bytes .../payment_method.cpython-311.pyc | Bin 0 -> 827 bytes ...yment_method_configuration.cpython-311.pyc | Bin 0 -> 922 bytes .../payment_method_domain.cpython-311.pyc | Bin 0 -> 873 bytes .../__pycache__/payout.cpython-311.pyc | Bin 0 -> 771 bytes .../__pycache__/person.cpython-311.pyc | Bin 0 -> 771 bytes .../__pycache__/plan.cpython-311.pyc | Bin 0 -> 757 bytes .../__pycache__/price.cpython-311.pyc | Bin 0 -> 764 bytes .../__pycache__/product.cpython-311.pyc | Bin 0 -> 778 bytes .../product_feature.cpython-311.pyc | Bin 0 -> 834 bytes .../promotion_code.cpython-311.pyc | Bin 0 -> 827 bytes .../__pycache__/quote.cpython-311.pyc | Bin 0 -> 764 bytes .../recipient_transfer.cpython-311.pyc | Bin 0 -> 811 bytes .../__pycache__/refund.cpython-311.pyc | Bin 0 -> 771 bytes .../reserve_transaction.cpython-311.pyc | Bin 0 -> 862 bytes .../__pycache__/reversal.cpython-311.pyc | Bin 0 -> 785 bytes .../__pycache__/review.cpython-311.pyc | Bin 0 -> 771 bytes .../search_result_object.cpython-311.pyc | Bin 0 -> 866 bytes .../__pycache__/setup_attempt.cpython-311.pyc | Bin 0 -> 820 bytes .../__pycache__/setup_intent.cpython-311.pyc | Bin 0 -> 810 bytes .../__pycache__/shipping_rate.cpython-311.pyc | Bin 0 -> 820 bytes .../__pycache__/source.cpython-311.pyc | Bin 0 -> 771 bytes ...ource_mandate_notification.cpython-311.pyc | Bin 0 -> 915 bytes .../source_transaction.cpython-311.pyc | Bin 0 -> 855 bytes .../__pycache__/subscription.cpython-311.pyc | Bin 0 -> 813 bytes .../subscription_item.cpython-311.pyc | Bin 0 -> 848 bytes .../subscription_schedule.cpython-311.pyc | Bin 0 -> 876 bytes .../__pycache__/tax_code.cpython-311.pyc | Bin 0 -> 782 bytes .../tax_deducted_at_source.cpython-311.pyc | Bin 0 -> 877 bytes .../__pycache__/tax_id.cpython-311.pyc | Bin 0 -> 768 bytes .../__pycache__/tax_rate.cpython-311.pyc | Bin 0 -> 782 bytes .../__pycache__/token.cpython-311.pyc | Bin 0 -> 764 bytes .../__pycache__/topup.cpython-311.pyc | Bin 0 -> 764 bytes .../__pycache__/transfer.cpython-311.pyc | Bin 0 -> 785 bytes .../webhook_endpoint.cpython-311.pyc | Bin 0 -> 841 bytes .../stripe/api_resources/abstract/__init__.py | 45 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2009 bytes .../__pycache__/api_resource.cpython-311.pyc | Bin 0 -> 819 bytes .../createable_api_resource.cpython-311.pyc | Bin 0 -> 896 bytes .../__pycache__/custom_method.cpython-311.pyc | Bin 0 -> 832 bytes .../deletable_api_resource.cpython-311.pyc | Bin 0 -> 889 bytes .../listable_api_resource.cpython-311.pyc | Bin 0 -> 882 bytes ...ted_resource_class_methods.cpython-311.pyc | Bin 0 -> 944 bytes .../searchable_api_resource.cpython-311.pyc | Bin 0 -> 896 bytes .../singleton_api_resource.cpython-311.pyc | Bin 0 -> 889 bytes .../__pycache__/test_helpers.cpython-311.pyc | Bin 0 -> 855 bytes .../updateable_api_resource.cpython-311.pyc | Bin 0 -> 896 bytes .../__pycache__/verify_mixin.cpython-311.pyc | Bin 0 -> 819 bytes .../api_resources/abstract/api_resource.py | 21 + .../abstract/createable_api_resource.py | 21 + .../api_resources/abstract/custom_method.py | 21 + .../abstract/deletable_api_resource.py | 21 + .../abstract/listable_api_resource.py | 21 + .../abstract/nested_resource_class_methods.py | 21 + .../abstract/searchable_api_resource.py | 21 + .../abstract/singleton_api_resource.py | 21 + .../api_resources/abstract/test_helpers.py | 21 + .../abstract/updateable_api_resource.py | 21 + .../api_resources/abstract/verify_mixin.py | 21 + .../stripe/api_resources/account.py | 21 + .../stripe/api_resources/account_link.py | 21 + .../stripe/api_resources/account_session.py | 21 + .../stripe/api_resources/apple_pay_domain.py | 21 + .../stripe/api_resources/application.py | 21 + .../stripe/api_resources/application_fee.py | 21 + .../api_resources/application_fee_refund.py | 21 + .../stripe/api_resources/apps/__init__.py | 19 + .../apps/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 780 bytes .../apps/__pycache__/secret.cpython-311.pyc | Bin 0 -> 801 bytes .../stripe/api_resources/apps/secret.py | 21 + .../stripe/api_resources/balance.py | 21 + .../api_resources/balance_transaction.py | 21 + .../stripe/api_resources/bank_account.py | 21 + .../stripe/api_resources/billing/__init__.py | 35 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1664 bytes .../billing/__pycache__/alert.cpython-311.pyc | Bin 0 -> 815 bytes .../alert_triggered.cpython-311.pyc | Bin 0 -> 882 bytes .../credit_balance_summary.cpython-311.pyc | Bin 0 -> 928 bytes ...credit_balance_transaction.cpython-311.pyc | Bin 0 -> 956 bytes .../__pycache__/credit_grant.cpython-311.pyc | Bin 0 -> 861 bytes .../billing/__pycache__/meter.cpython-311.pyc | Bin 0 -> 815 bytes .../__pycache__/meter_event.cpython-311.pyc | Bin 0 -> 854 bytes .../meter_event_adjustment.cpython-311.pyc | Bin 0 -> 928 bytes .../meter_event_summary.cpython-311.pyc | Bin 0 -> 907 bytes .../stripe/api_resources/billing/alert.py | 21 + .../api_resources/billing/alert_triggered.py | 21 + .../billing/credit_balance_summary.py | 21 + .../billing/credit_balance_transaction.py | 21 + .../api_resources/billing/credit_grant.py | 21 + .../stripe/api_resources/billing/meter.py | 21 + .../api_resources/billing/meter_event.py | 21 + .../billing/meter_event_adjustment.py | 21 + .../billing/meter_event_summary.py | 21 + .../api_resources/billing_portal/__init__.py | 20 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 951 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 913 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 871 bytes .../billing_portal/configuration.py | 21 + .../api_resources/billing_portal/session.py | 21 + .../stripe/api_resources/capability.py | 21 + .../stripe/api_resources/card.py | 21 + .../stripe/api_resources/cash_balance.py | 21 + .../stripe/api_resources/charge.py | 21 + .../stripe/api_resources/checkout/__init__.py | 19 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 806 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 835 bytes .../stripe/api_resources/checkout/session.py | 21 + .../stripe/api_resources/climate/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 966 bytes .../climate/__pycache__/order.cpython-311.pyc | Bin 0 -> 815 bytes .../__pycache__/product.cpython-311.pyc | Bin 0 -> 829 bytes .../__pycache__/supplier.cpython-311.pyc | Bin 0 -> 836 bytes .../stripe/api_resources/climate/order.py | 21 + .../stripe/api_resources/climate/product.py | 21 + .../stripe/api_resources/climate/supplier.py | 21 + .../api_resources/confirmation_token.py | 21 + .../connect_collection_transfer.py | 21 + .../stripe/api_resources/country_spec.py | 21 + .../stripe/api_resources/coupon.py | 21 + .../stripe/api_resources/credit_note.py | 21 + .../api_resources/credit_note_line_item.py | 21 + .../stripe/api_resources/customer.py | 21 + .../customer_balance_transaction.py | 21 + .../customer_cash_balance_transaction.py | 21 + .../stripe/api_resources/customer_session.py | 21 + .../stripe/api_resources/discount.py | 21 + .../stripe/api_resources/dispute.py | 21 + .../api_resources/entitlements/__init__.py | 25 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1098 bytes .../active_entitlement.cpython-311.pyc | Bin 0 -> 933 bytes ...active_entitlement_summary.cpython-311.pyc | Bin 0 -> 986 bytes .../__pycache__/feature.cpython-311.pyc | Bin 0 -> 859 bytes .../entitlements/active_entitlement.py | 21 + .../active_entitlement_summary.py | 21 + .../api_resources/entitlements/feature.py | 21 + .../stripe/api_resources/ephemeral_key.py | 21 + .../stripe/api_resources/error_object.py | 20 + .../stripe/api_resources/event.py | 21 + .../stripe/api_resources/exchange_rate.py | 21 + .../stripe/api_resources/file.py | 21 + .../stripe/api_resources/file_link.py | 21 + .../financial_connections/__init__.py | 29 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1360 bytes .../__pycache__/account.cpython-311.pyc | Bin 0 -> 913 bytes .../__pycache__/account_owner.cpython-311.pyc | Bin 0 -> 952 bytes .../account_ownership.cpython-311.pyc | Bin 0 -> 980 bytes .../__pycache__/session.cpython-311.pyc | Bin 0 -> 913 bytes .../__pycache__/transaction.cpython-311.pyc | Bin 0 -> 941 bytes .../financial_connections/account.py | 21 + .../financial_connections/account_owner.py | 21 + .../account_ownership.py | 21 + .../financial_connections/session.py | 21 + .../financial_connections/transaction.py | 21 + .../api_resources/forwarding/__init__.py | 19 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 821 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 847 bytes .../api_resources/forwarding/request.py | 21 + .../api_resources/funding_instructions.py | 21 + .../stripe/api_resources/identity/__init__.py | 24 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 967 bytes .../verification_report.cpython-311.pyc | Bin 0 -> 916 bytes .../verification_session.cpython-311.pyc | Bin 0 -> 923 bytes .../identity/verification_report.py | 21 + .../identity/verification_session.py | 21 + .../stripe/api_resources/invoice.py | 21 + .../stripe/api_resources/invoice_item.py | 21 + .../stripe/api_resources/invoice_line_item.py | 21 + .../stripe/api_resources/invoice_payment.py | 21 + .../invoice_rendering_template.py | 21 + .../stripe/api_resources/issuing/__init__.py | 28 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1466 bytes .../__pycache__/authorization.cpython-311.pyc | Bin 0 -> 871 bytes .../issuing/__pycache__/card.cpython-311.pyc | Bin 0 -> 805 bytes .../__pycache__/cardholder.cpython-311.pyc | Bin 0 -> 850 bytes .../__pycache__/dispute.cpython-311.pyc | Bin 0 -> 829 bytes .../personalization_design.cpython-311.pyc | Bin 0 -> 931 bytes .../physical_bundle.cpython-311.pyc | Bin 0 -> 882 bytes .../issuing/__pycache__/token.cpython-311.pyc | Bin 0 -> 815 bytes .../__pycache__/transaction.cpython-311.pyc | Bin 0 -> 857 bytes .../api_resources/issuing/authorization.py | 21 + .../stripe/api_resources/issuing/card.py | 21 + .../api_resources/issuing/cardholder.py | 21 + .../stripe/api_resources/issuing/dispute.py | 21 + .../issuing/personalization_design.py | 21 + .../api_resources/issuing/physical_bundle.py | 21 + .../stripe/api_resources/issuing/token.py | 21 + .../api_resources/issuing/transaction.py | 21 + .../stripe/api_resources/line_item.py | 21 + .../stripe/api_resources/list_object.py | 21 + .../stripe/api_resources/login_link.py | 21 + .../stripe/api_resources/mandate.py | 21 + .../stripe/api_resources/payment_intent.py | 21 + .../stripe/api_resources/payment_link.py | 21 + .../stripe/api_resources/payment_method.py | 21 + .../payment_method_configuration.py | 21 + .../api_resources/payment_method_domain.py | 21 + .../stripe/api_resources/payout.py | 21 + .../stripe/api_resources/person.py | 21 + .../stripe/api_resources/plan.py | 21 + .../stripe/api_resources/price.py | 21 + .../stripe/api_resources/product.py | 21 + .../stripe/api_resources/product_feature.py | 21 + .../stripe/api_resources/promotion_code.py | 21 + .../stripe/api_resources/quote.py | 21 + .../stripe/api_resources/radar/__init__.py | 23 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1011 bytes .../early_fraud_warning.cpython-311.pyc | Bin 0 -> 895 bytes .../__pycache__/value_list.cpython-311.pyc | Bin 0 -> 835 bytes .../value_list_item.cpython-311.pyc | Bin 0 -> 867 bytes .../radar/early_fraud_warning.py | 21 + .../stripe/api_resources/radar/value_list.py | 21 + .../api_resources/radar/value_list_item.py | 21 + .../api_resources/recipient_transfer.py | 15 + .../stripe/api_resources/refund.py | 21 + .../api_resources/reporting/__init__.py | 20 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 913 bytes .../__pycache__/report_run.cpython-311.pyc | Bin 0 -> 859 bytes .../__pycache__/report_type.cpython-311.pyc | Bin 0 -> 866 bytes .../api_resources/reporting/report_run.py | 21 + .../api_resources/reporting/report_type.py | 21 + .../api_resources/reserve_transaction.py | 21 + .../stripe/api_resources/reversal.py | 21 + .../stripe/api_resources/review.py | 21 + .../api_resources/search_result_object.py | 21 + .../stripe/api_resources/setup_attempt.py | 21 + .../stripe/api_resources/setup_intent.py | 21 + .../stripe/api_resources/shipping_rate.py | 21 + .../stripe/api_resources/sigma/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 826 bytes .../scheduled_query_run.cpython-311.pyc | Bin 0 -> 895 bytes .../sigma/scheduled_query_run.py | 21 + .../stripe/api_resources/source.py | 21 + .../source_mandate_notification.py | 21 + .../api_resources/source_transaction.py | 21 + .../stripe/api_resources/subscription.py | 21 + .../stripe/api_resources/subscription_item.py | 21 + .../api_resources/subscription_schedule.py | 21 + .../stripe/api_resources/tax/__init__.py | 28 + .../tax/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1287 bytes .../__pycache__/calculation.cpython-311.pyc | Bin 0 -> 833 bytes .../calculation_line_item.cpython-311.pyc | Bin 0 -> 897 bytes .../__pycache__/registration.cpython-311.pyc | Bin 0 -> 840 bytes .../tax/__pycache__/settings.cpython-311.pyc | Bin 0 -> 809 bytes .../__pycache__/transaction.cpython-311.pyc | Bin 0 -> 833 bytes .../transaction_line_item.cpython-311.pyc | Bin 0 -> 897 bytes .../stripe/api_resources/tax/calculation.py | 21 + .../tax/calculation_line_item.py | 21 + .../stripe/api_resources/tax/registration.py | 21 + .../stripe/api_resources/tax/settings.py | 21 + .../stripe/api_resources/tax/transaction.py | 21 + .../tax/transaction_line_item.py | 21 + .../stripe/api_resources/tax_code.py | 21 + .../api_resources/tax_deducted_at_source.py | 21 + .../stripe/api_resources/tax_id.py | 21 + .../stripe/api_resources/tax_rate.py | 21 + .../stripe/api_resources/terminal/__init__.py | 22 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1090 bytes .../__pycache__/configuration.cpython-311.pyc | Bin 0 -> 877 bytes .../connection_token.cpython-311.pyc | Bin 0 -> 895 bytes .../__pycache__/location.cpython-311.pyc | Bin 0 -> 842 bytes .../__pycache__/reader.cpython-311.pyc | Bin 0 -> 828 bytes .../api_resources/terminal/configuration.py | 21 + .../terminal/connection_token.py | 21 + .../stripe/api_resources/terminal/location.py | 21 + .../stripe/api_resources/terminal/reader.py | 21 + .../api_resources/test_helpers/__init__.py | 19 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 841 bytes .../__pycache__/test_clock.cpython-311.pyc | Bin 0 -> 877 bytes .../api_resources/test_helpers/test_clock.py | 21 + .../stripe/api_resources/token.py | 21 + .../stripe/api_resources/topup.py | 21 + .../stripe/api_resources/transfer.py | 21 + .../stripe/api_resources/treasury/__init__.py | 37 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1905 bytes .../credit_reversal.cpython-311.pyc | Bin 0 -> 888 bytes .../debit_reversal.cpython-311.pyc | Bin 0 -> 881 bytes .../financial_account.cpython-311.pyc | Bin 0 -> 902 bytes ...financial_account_features.cpython-311.pyc | Bin 0 -> 962 bytes .../inbound_transfer.cpython-311.pyc | Bin 0 -> 895 bytes .../outbound_payment.cpython-311.pyc | Bin 0 -> 895 bytes .../outbound_transfer.cpython-311.pyc | Bin 0 -> 902 bytes .../received_credit.cpython-311.pyc | Bin 0 -> 888 bytes .../received_debit.cpython-311.pyc | Bin 0 -> 881 bytes .../__pycache__/transaction.cpython-311.pyc | Bin 0 -> 863 bytes .../transaction_entry.cpython-311.pyc | Bin 0 -> 902 bytes .../api_resources/treasury/credit_reversal.py | 21 + .../api_resources/treasury/debit_reversal.py | 21 + .../treasury/financial_account.py | 21 + .../treasury/financial_account_features.py | 21 + .../treasury/inbound_transfer.py | 21 + .../treasury/outbound_payment.py | 21 + .../treasury/outbound_transfer.py | 21 + .../api_resources/treasury/received_credit.py | 21 + .../api_resources/treasury/received_debit.py | 21 + .../api_resources/treasury/transaction.py | 21 + .../treasury/transaction_entry.py | 21 + .../stripe/api_resources/webhook_endpoint.py | 21 + .../site-packages/stripe/api_version.py | 15 + .../site-packages/stripe/app_info.py | 21 + .../site-packages/stripe/apps/__init__.py | 4 + .../apps/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 345 bytes .../apps/__pycache__/_secret.cpython-311.pyc | Bin 0 -> 10077 bytes .../_secret_service.cpython-311.pyc | Bin 0 -> 7808 bytes .../site-packages/stripe/apps/_secret.py | 315 + .../stripe/apps/_secret_service.py | 266 + .../site-packages/stripe/billing/__init__.py | 39 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1915 bytes .../__pycache__/_alert.cpython-311.pyc | Bin 0 -> 19136 bytes .../_alert_service.cpython-311.pyc | Bin 0 -> 10733 bytes .../_alert_triggered.cpython-311.pyc | Bin 0 -> 1154 bytes .../_credit_balance_summary.cpython-311.pyc | Bin 0 -> 6308 bytes ...it_balance_summary_service.cpython-311.pyc | Bin 0 -> 3918 bytes ...credit_balance_transaction.cpython-311.pyc | Bin 0 -> 8461 bytes ...alance_transaction_service.cpython-311.pyc | Bin 0 -> 4434 bytes .../__pycache__/_credit_grant.cpython-311.pyc | Bin 0 -> 20230 bytes .../_credit_grant_service.cpython-311.pyc | Bin 0 -> 12381 bytes .../__pycache__/_meter.cpython-311.pyc | Bin 0 -> 19889 bytes .../__pycache__/_meter_event.cpython-311.pyc | Bin 0 -> 3204 bytes .../_meter_event_adjustment.cpython-311.pyc | Bin 0 -> 3989 bytes ...r_event_adjustment_service.cpython-311.pyc | Bin 0 -> 2829 bytes .../_meter_event_service.cpython-311.pyc | Bin 0 -> 2429 bytes .../_meter_event_summary.cpython-311.pyc | Bin 0 -> 1493 bytes ...eter_event_summary_service.cpython-311.pyc | Bin 0 -> 3209 bytes .../_meter_service.cpython-311.pyc | Bin 0 -> 11591 bytes .../site-packages/stripe/billing/_alert.py | 586 + .../stripe/billing/_alert_service.py | 345 + .../stripe/billing/_alert_triggered.py | 38 + .../stripe/billing/_credit_balance_summary.py | 172 + .../_credit_balance_summary_service.py | 97 + .../billing/_credit_balance_transaction.py | 261 + .../_credit_balance_transaction_service.py | 125 + .../stripe/billing/_credit_grant.py | 632 + .../stripe/billing/_credit_grant_service.py | 399 + .../site-packages/stripe/billing/_meter.py | 628 + .../stripe/billing/_meter_event.py | 99 + .../stripe/billing/_meter_event_adjustment.py | 106 + .../_meter_event_adjustment_service.py | 71 + .../stripe/billing/_meter_event_service.py | 69 + .../stripe/billing/_meter_event_summary.py | 46 + .../billing/_meter_event_summary_service.py | 89 + .../stripe/billing/_meter_service.py | 362 + .../stripe/billing_portal/__init__.py | 10 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 605 bytes .../_configuration.cpython-311.pyc | Bin 0 -> 27740 bytes .../_configuration_service.cpython-311.pyc | Bin 0 -> 21424 bytes .../__pycache__/_session.cpython-311.pyc | Bin 0 -> 14210 bytes .../_session_service.cpython-311.pyc | Bin 0 -> 8283 bytes .../stripe/billing_portal/_configuration.py | 884 ++ .../billing_portal/_configuration_service.py | 667 + .../stripe/billing_portal/_session.py | 525 + .../stripe/billing_portal/_session_service.py | 272 + .../site-packages/stripe/checkout/__init__.py | 7 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 481 bytes .../__pycache__/_session.cpython-311.pyc | Bin 0 -> 128714 bytes ..._session_line_item_service.cpython-311.pyc | Bin 0 -> 3092 bytes .../_session_service.cpython-311.pyc | Bin 0 -> 77616 bytes .../site-packages/stripe/checkout/_session.py | 5410 +++++++ .../checkout/_session_line_item_service.py | 73 + .../stripe/checkout/_session_service.py | 3096 ++++ .../site-packages/stripe/climate/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 668 bytes .../__pycache__/_order.cpython-311.pyc | Bin 0 -> 15779 bytes .../_order_service.cpython-311.pyc | Bin 0 -> 9993 bytes .../__pycache__/_product.cpython-311.pyc | Bin 0 -> 5452 bytes .../_product_service.cpython-311.pyc | Bin 0 -> 4153 bytes .../__pycache__/_supplier.cpython-311.pyc | Bin 0 -> 5207 bytes .../_supplier_service.cpython-311.pyc | Bin 0 -> 4143 bytes .../site-packages/stripe/climate/_order.py | 525 + .../stripe/climate/_order_service.py | 305 + .../site-packages/stripe/climate/_product.py | 163 + .../stripe/climate/_product_service.py | 117 + .../site-packages/stripe/climate/_supplier.py | 159 + .../stripe/climate/_supplier_service.py | 117 + .../stripe/data/ca-certificates.crt | 3347 ++++ .../stripe/entitlements/__init__.py | 15 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 746 bytes .../_active_entitlement.cpython-311.pyc | Bin 0 -> 4763 bytes ...active_entitlement_service.cpython-311.pyc | Bin 0 -> 4295 bytes ...active_entitlement_summary.cpython-311.pyc | Bin 0 -> 1339 bytes .../__pycache__/_feature.cpython-311.pyc | Bin 0 -> 8102 bytes .../_feature_service.cpython-311.pyc | Bin 0 -> 7188 bytes .../entitlements/_active_entitlement.py | 132 + .../_active_entitlement_service.py | 121 + .../_active_entitlement_summary.py | 35 + .../stripe/entitlements/_feature.py | 248 + .../stripe/entitlements/_feature_service.py | 235 + .../python3.11/site-packages/stripe/error.py | 28 + .../site-packages/stripe/events/__init__.py | 11 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 625 bytes .../_event_classes.cpython-311.pyc | Bin 0 -> 743 bytes ...ror_report_triggered_event.cpython-311.pyc | Bin 0 -> 5832 bytes ...meter_no_meter_found_event.cpython-311.pyc | Bin 0 -> 4631 bytes ...ent_destination_ping_event.cpython-311.pyc | Bin 0 -> 1966 bytes .../stripe/events/_event_classes.py | 18 + ...ling_meter_error_report_triggered_event.py | 149 + .../_v1_billing_meter_no_meter_found_event.py | 115 + .../_v2_core_event_destination_ping_event.py | 45 + .../stripe/financial_connections/__init__.py | 25 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1189 bytes .../__pycache__/_account.cpython-311.pyc | Bin 0 -> 28728 bytes .../_account_owner.cpython-311.pyc | Bin 0 -> 1307 bytes .../_account_owner_service.cpython-311.pyc | Bin 0 -> 2996 bytes .../_account_ownership.cpython-311.pyc | Bin 0 -> 1348 bytes .../_account_service.cpython-311.pyc | Bin 0 -> 11560 bytes .../__pycache__/_session.cpython-311.pyc | Bin 0 -> 7399 bytes .../_session_service.cpython-311.pyc | Bin 0 -> 5475 bytes .../__pycache__/_transaction.cpython-311.pyc | Bin 0 -> 6428 bytes .../_transaction_service.cpython-311.pyc | Bin 0 -> 5350 bytes .../stripe/financial_connections/_account.py | 956 ++ .../financial_connections/_account_owner.py | 47 + .../_account_owner_service.py | 77 + .../_account_ownership.py | 35 + .../financial_connections/_account_service.py | 354 + .../stripe/financial_connections/_session.py | 232 + .../financial_connections/_session_service.py | 164 + .../financial_connections/_transaction.py | 200 + .../_transaction_service.py | 157 + .../stripe/forwarding/__init__.py | 4 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 367 bytes .../__pycache__/_request.cpython-311.pyc | Bin 0 -> 10820 bytes .../_request_service.cpython-311.pyc | Bin 0 -> 7085 bytes .../stripe/forwarding/_request.py | 345 + .../stripe/forwarding/_request_service.py | 227 + .../site-packages/stripe/http_client.py | 19 + .../site-packages/stripe/identity/__init__.py | 14 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 666 bytes .../_verification_report.cpython-311.pyc | Bin 0 -> 15399 bytes ...erification_report_service.cpython-311.pyc | Bin 0 -> 5113 bytes .../_verification_session.cpython-311.pyc | Bin 0 -> 29970 bytes ...rification_session_service.cpython-311.pyc | Bin 0 -> 16952 bytes .../stripe/identity/_verification_report.py | 547 + .../identity/_verification_report_service.py | 151 + .../stripe/identity/_verification_session.py | 1089 ++ .../identity/_verification_session_service.py | 554 + .../site-packages/stripe/issuing/__init__.py | 30 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1663 bytes .../_authorization.cpython-311.pyc | Bin 0 -> 77900 bytes .../_authorization_service.cpython-311.pyc | Bin 0 -> 10440 bytes .../issuing/__pycache__/_card.cpython-311.pyc | Bin 0 -> 50334 bytes .../__pycache__/_card_service.cpython-311.pyc | Bin 0 -> 24442 bytes .../__pycache__/_cardholder.cpython-311.pyc | Bin 0 -> 34710 bytes .../_cardholder_service.cpython-311.pyc | Bin 0 -> 27509 bytes .../__pycache__/_dispute.cpython-311.pyc | Bin 0 -> 31255 bytes .../_dispute_service.cpython-311.pyc | Bin 0 -> 21260 bytes .../_personalization_design.cpython-311.pyc | Bin 0 -> 26741 bytes ...onalization_design_service.cpython-311.pyc | Bin 0 -> 10660 bytes .../_physical_bundle.cpython-311.pyc | Bin 0 -> 5545 bytes .../_physical_bundle_service.cpython-311.pyc | Bin 0 -> 4570 bytes .../__pycache__/_token.cpython-311.pyc | Bin 0 -> 12172 bytes .../_token_service.cpython-311.pyc | Bin 0 -> 6319 bytes .../__pycache__/_transaction.cpython-311.pyc | Bin 0 -> 48493 bytes .../_transaction_service.cpython-311.pyc | Bin 0 -> 6733 bytes .../stripe/issuing/_authorization.py | 2798 ++++ .../stripe/issuing/_authorization_service.py | 323 + .../site-packages/stripe/issuing/_card.py | 4210 +++++ .../stripe/issuing/_card_service.py | 2391 +++ .../stripe/issuing/_cardholder.py | 3623 +++++ .../stripe/issuing/_cardholder_service.py | 2473 +++ .../site-packages/stripe/issuing/_dispute.py | 1179 ++ .../stripe/issuing/_dispute_service.py | 837 + .../stripe/issuing/_personalization_design.py | 901 ++ .../_personalization_design_service.py | 357 + .../stripe/issuing/_physical_bundle.py | 154 + .../issuing/_physical_bundle_service.py | 125 + .../site-packages/stripe/issuing/_token.py | 403 + .../stripe/issuing/_token_service.py | 191 + .../stripe/issuing/_transaction.py | 2023 +++ .../stripe/issuing/_transaction_service.py | 205 + .../stripe/multipart_data_generator.py | 15 + .../python3.11/site-packages/stripe/oauth.py | 21 + .../site-packages/stripe/oauth_error.py | 52 + .../python3.11/site-packages/stripe/py.typed | 0 .../site-packages/stripe/radar/__init__.py | 16 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 792 bytes .../_early_fraud_warning.cpython-311.pyc | Bin 0 -> 6032 bytes ...arly_fraud_warning_service.cpython-311.pyc | Bin 0 -> 5165 bytes .../__pycache__/_value_list.cpython-311.pyc | Bin 0 -> 13090 bytes .../_value_list_item.cpython-311.pyc | Bin 0 -> 10574 bytes .../_value_list_item_service.cpython-311.pyc | Bin 0 -> 7636 bytes .../_value_list_service.cpython-311.pyc | Bin 0 -> 9796 bytes .../stripe/radar/_early_fraud_warning.py | 184 + .../radar/_early_fraud_warning_service.py | 151 + .../site-packages/stripe/radar/_value_list.py | 425 + .../stripe/radar/_value_list_item.py | 322 + .../stripe/radar/_value_list_item_service.py | 246 + .../stripe/radar/_value_list_service.py | 329 + .../stripe/reporting/__init__.py | 10 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 581 bytes .../__pycache__/_report_run.cpython-311.pyc | Bin 0 -> 19619 bytes .../_report_run_service.cpython-311.pyc | Bin 0 -> 17478 bytes .../__pycache__/_report_type.cpython-311.pyc | Bin 0 -> 5048 bytes .../_report_type_service.cpython-311.pyc | Bin 0 -> 4019 bytes .../stripe/reporting/_report_run.py | 945 ++ .../stripe/reporting/_report_run_service.py | 867 ++ .../stripe/reporting/_report_type.py | 135 + .../stripe/reporting/_report_type_service.py | 105 + .../site-packages/stripe/request_metrics.py | 15 + .../site-packages/stripe/request_options.py | 18 + .../site-packages/stripe/sigma/__init__.py | 8 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 422 bytes .../_scheduled_query_run.cpython-311.pyc | Bin 0 -> 5693 bytes ...cheduled_query_run_service.cpython-311.pyc | Bin 0 -> 4287 bytes .../stripe/sigma/_scheduled_query_run.py | 164 + .../sigma/_scheduled_query_run_service.py | 117 + .../site-packages/stripe/stripe_object.py | 21 + .../site-packages/stripe/stripe_response.py | 20 + .../site-packages/stripe/tax/__init__.py | 28 + .../tax/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1344 bytes .../__pycache__/_calculation.cpython-311.pyc | Bin 0 -> 21650 bytes .../_calculation_line_item.cpython-311.pyc | Bin 0 -> 3581 bytes ...culation_line_item_service.cpython-311.pyc | Bin 0 -> 3035 bytes .../_calculation_service.cpython-311.pyc | Bin 0 -> 9914 bytes .../__pycache__/_registration.cpython-311.pyc | Bin 0 -> 110095 bytes .../_registration_service.cpython-311.pyc | Bin 0 -> 70639 bytes .../tax/__pycache__/_settings.cpython-311.pyc | Bin 0 -> 8212 bytes .../_settings_service.cpython-311.pyc | Bin 0 -> 5094 bytes .../__pycache__/_transaction.cpython-311.pyc | Bin 0 -> 18656 bytes .../_transaction_line_item.cpython-311.pyc | Bin 0 -> 1880 bytes ...nsaction_line_item_service.cpython-311.pyc | Bin 0 -> 3017 bytes .../_transaction_service.cpython-311.pyc | Bin 0 -> 7617 bytes .../site-packages/stripe/tax/_calculation.py | 989 ++ .../stripe/tax/_calculation_line_item.py | 151 + .../tax/_calculation_line_item_service.py | 73 + .../stripe/tax/_calculation_service.py | 401 + .../site-packages/stripe/tax/_registration.py | 3313 ++++ .../stripe/tax/_registration_service.py | 2103 +++ .../site-packages/stripe/tax/_settings.py | 222 + .../stripe/tax/_settings_service.py | 149 + .../site-packages/stripe/tax/_transaction.py | 745 + .../stripe/tax/_transaction_line_item.py | 71 + .../tax/_transaction_line_item_service.py | 73 + .../stripe/tax/_transaction_service.py | 239 + .../site-packages/stripe/terminal/__init__.py | 18 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 949 bytes .../_configuration.cpython-311.pyc | Bin 0 -> 48841 bytes .../_configuration_service.cpython-311.pyc | Bin 0 -> 35055 bytes .../_connection_token.cpython-311.pyc | Bin 0 -> 2987 bytes .../_connection_token_service.cpython-311.pyc | Bin 0 -> 2471 bytes .../__pycache__/_location.cpython-311.pyc | Bin 0 -> 13622 bytes .../_location_service.cpython-311.pyc | Bin 0 -> 10058 bytes .../__pycache__/_reader.cpython-311.pyc | Bin 0 -> 74233 bytes .../_reader_service.cpython-311.pyc | Bin 0 -> 28439 bytes .../stripe/terminal/_configuration.py | 1837 +++ .../stripe/terminal/_configuration_service.py | 1328 ++ .../stripe/terminal/_connection_token.py | 73 + .../terminal/_connection_token_service.py | 57 + .../stripe/terminal/_location.py | 432 + .../stripe/terminal/_location_service.py | 344 + .../site-packages/stripe/terminal/_reader.py | 2493 +++ .../stripe/terminal/_reader_service.py | 990 ++ .../stripe/test_helpers/__init__.py | 27 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1171 bytes ...confirmation_token_service.cpython-311.pyc | Bin 0 -> 31383 bytes .../_customer_service.cpython-311.pyc | Bin 0 -> 2808 bytes .../_issuing_service.cpython-311.pyc | Bin 0 -> 1706 bytes .../_refund_service.cpython-311.pyc | Bin 0 -> 2536 bytes .../_terminal_service.cpython-311.pyc | Bin 0 -> 1038 bytes .../__pycache__/_test_clock.cpython-311.pyc | Bin 0 -> 14545 bytes .../_test_clock_service.cpython-311.pyc | Bin 0 -> 8368 bytes .../_treasury_service.cpython-311.pyc | Bin 0 -> 1979 bytes .../_confirmation_token_service.py | 939 ++ .../stripe/test_helpers/_customer_service.py | 74 + .../stripe/test_helpers/_issuing_service.py | 22 + .../stripe/test_helpers/_refund_service.py | 60 + .../stripe/test_helpers/_terminal_service.py | 10 + .../stripe/test_helpers/_test_clock.py | 428 + .../test_helpers/_test_clock_service.py | 270 + .../stripe/test_helpers/_treasury_service.py | 28 + .../stripe/test_helpers/issuing/__init__.py | 14 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 703 bytes .../_authorization_service.cpython-311.pyc | Bin 0 -> 38744 bytes .../__pycache__/_card_service.cpython-311.pyc | Bin 0 -> 8017 bytes ...onalization_design_service.cpython-311.pyc | Bin 0 -> 6709 bytes .../_transaction_service.cpython-311.pyc | Bin 0 -> 30070 bytes .../issuing/_authorization_service.py | 1376 ++ .../test_helpers/issuing/_card_service.py | 260 + .../_personalization_design_service.py | 201 + .../issuing/_transaction_service.py | 1372 ++ .../stripe/test_helpers/terminal/__init__.py | 5 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 327 bytes .../_reader_service.cpython-311.pyc | Bin 0 -> 7553 bytes .../test_helpers/terminal/_reader_service.py | 218 + .../stripe/test_helpers/treasury/__init__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 858 bytes .../_inbound_transfer_service.cpython-311.pyc | Bin 0 -> 6707 bytes .../_outbound_payment_service.cpython-311.pyc | Bin 0 -> 9455 bytes ..._outbound_transfer_service.cpython-311.pyc | Bin 0 -> 9593 bytes .../_received_credit_service.cpython-311.pyc | Bin 0 -> 3904 bytes .../_received_debit_service.cpython-311.pyc | Bin 0 -> 3868 bytes .../treasury/_inbound_transfer_service.py | 188 + .../treasury/_outbound_payment_service.py | 277 + .../treasury/_outbound_transfer_service.py | 277 + .../treasury/_received_credit_service.py | 105 + .../treasury/_received_debit_service.py | 105 + .../site-packages/stripe/treasury/__init__.py | 58 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2554 bytes .../_credit_reversal.cpython-311.pyc | Bin 0 -> 7719 bytes .../_credit_reversal_service.cpython-311.pyc | Bin 0 -> 5976 bytes .../_debit_reversal.cpython-311.pyc | Bin 0 -> 8078 bytes .../_debit_reversal_service.cpython-311.pyc | Bin 0 -> 5920 bytes .../_financial_account.cpython-311.pyc | Bin 0 -> 41906 bytes ...financial_account_features.cpython-311.pyc | Bin 0 -> 9592 bytes ...l_account_features_service.cpython-311.pyc | Bin 0 -> 9706 bytes ..._financial_account_service.cpython-311.pyc | Bin 0 -> 23474 bytes .../_inbound_transfer.cpython-311.pyc | Bin 0 -> 28656 bytes .../_inbound_transfer_service.cpython-311.pyc | Bin 0 -> 7527 bytes .../_outbound_payment.cpython-311.pyc | Bin 0 -> 40548 bytes .../_outbound_payment_service.cpython-311.pyc | Bin 0 -> 12977 bytes .../_outbound_transfer.cpython-311.pyc | Bin 0 -> 37021 bytes ..._outbound_transfer_service.cpython-311.pyc | Bin 0 -> 9418 bytes .../_received_credit.cpython-311.pyc | Bin 0 -> 14746 bytes .../_received_credit_service.cpython-311.pyc | Bin 0 -> 4977 bytes .../_received_debit.cpython-311.pyc | Bin 0 -> 13142 bytes .../_received_debit_service.cpython-311.pyc | Bin 0 -> 4410 bytes .../__pycache__/_transaction.cpython-311.pyc | Bin 0 -> 9401 bytes .../_transaction_entry.cpython-311.pyc | Bin 0 -> 9204 bytes ..._transaction_entry_service.cpython-311.pyc | Bin 0 -> 5500 bytes .../_transaction_service.cpython-311.pyc | Bin 0 -> 5882 bytes .../stripe/treasury/_credit_reversal.py | 232 + .../treasury/_credit_reversal_service.py | 181 + .../stripe/treasury/_debit_reversal.py | 249 + .../treasury/_debit_reversal_service.py | 185 + .../stripe/treasury/_financial_account.py | 1316 ++ .../treasury/_financial_account_features.py | 511 + .../_financial_account_features_service.py | 252 + .../treasury/_financial_account_service.py | 678 + .../stripe/treasury/_inbound_transfer.py | 922 ++ .../treasury/_inbound_transfer_service.py | 249 + .../stripe/treasury/_outbound_payment.py | 1305 ++ .../treasury/_outbound_payment_service.py | 417 + .../stripe/treasury/_outbound_transfer.py | 1173 ++ .../treasury/_outbound_transfer_service.py | 285 + .../stripe/treasury/_received_credit.py | 494 + .../treasury/_received_credit_service.py | 143 + .../stripe/treasury/_received_debit.py | 427 + .../treasury/_received_debit_service.py | 121 + .../stripe/treasury/_transaction.py | 347 + .../stripe/treasury/_transaction_entry.py | 344 + .../treasury/_transaction_entry_service.py | 172 + .../stripe/treasury/_transaction_service.py | 179 + .../python3.11/site-packages/stripe/util.py | 19 + .../site-packages/stripe/v2/__init__.py | 11 + .../v2/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 742 bytes .../v2/__pycache__/_amount.cpython-311.pyc | Bin 0 -> 860 bytes .../_billing_service.cpython-311.pyc | Bin 0 -> 1718 bytes .../__pycache__/_core_service.cpython-311.pyc | Bin 0 -> 1218 bytes .../v2/__pycache__/_event.cpython-311.pyc | Bin 0 -> 6575 bytes .../_event_destination.cpython-311.pyc | Bin 0 -> 3961 bytes .../__pycache__/_list_object.cpython-311.pyc | Bin 0 -> 3184 bytes .../site-packages/stripe/v2/_amount.py | 14 + .../stripe/v2/_billing_service.py | 24 + .../site-packages/stripe/v2/_core_service.py | 12 + .../site-packages/stripe/v2/_event.py | 151 + .../stripe/v2/_event_destination.py | 128 + .../site-packages/stripe/v2/_list_object.py | 59 + .../stripe/v2/billing/__init__.py | 21 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 993 bytes .../__pycache__/_meter_event.cpython-311.pyc | Bin 0 -> 1191 bytes .../_meter_event_adjustment.cpython-311.pyc | Bin 0 -> 1518 bytes ...r_event_adjustment_service.cpython-311.pyc | Bin 0 -> 2693 bytes .../_meter_event_service.cpython-311.pyc | Bin 0 -> 2510 bytes .../_meter_event_session.cpython-311.pyc | Bin 0 -> 1069 bytes ...eter_event_session_service.cpython-311.pyc | Bin 0 -> 2283 bytes ...meter_event_stream_service.cpython-311.pyc | Bin 0 -> 2731 bytes .../stripe/v2/billing/_meter_event.py | 46 + .../v2/billing/_meter_event_adjustment.py | 51 + .../_meter_event_adjustment_service.py | 67 + .../stripe/v2/billing/_meter_event_service.py | 72 + .../stripe/v2/billing/_meter_event_session.py | 36 + .../billing/_meter_event_session_service.py | 50 + .../v2/billing/_meter_event_stream_service.py | 71 + .../site-packages/stripe/v2/core/__init__.py | 6 + .../core/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 401 bytes ..._event_destination_service.cpython-311.pyc | Bin 0 -> 14622 bytes .../_event_service.cpython-311.pyc | Bin 0 -> 3767 bytes .../v2/core/_event_destination_service.py | 474 + .../stripe/v2/core/_event_service.py | 98 + .../site-packages/stripe/version.py | 16 + .../site-packages/stripe/webhook.py | 22 + .../INSTALLER | 1 + .../METADATA | 72 + .../typing_extensions-4.15.0.dist-info/RECORD | 7 + .../typing_extensions-4.15.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../site-packages/typing_extensions.py | 4317 ++++++ .../urllib3-2.7.0.dist-info/INSTALLER | 1 + .../urllib3-2.7.0.dist-info/METADATA | 163 + .../urllib3-2.7.0.dist-info/RECORD | 79 + .../urllib3-2.7.0.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 21 + .../site-packages/urllib3/__init__.py | 211 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 7677 bytes .../_base_connection.cpython-311.pyc | Bin 0 -> 7123 bytes .../__pycache__/_collections.cpython-311.pyc | Bin 0 -> 26351 bytes .../_request_methods.cpython-311.pyc | Bin 0 -> 10724 bytes .../__pycache__/_version.cpython-311.pyc | Bin 0 -> 704 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 41028 bytes .../connectionpool.cpython-311.pyc | Bin 0 -> 41673 bytes .../__pycache__/exceptions.cpython-311.pyc | Bin 0 -> 20096 bytes .../__pycache__/fields.cpython-311.pyc | Bin 0 -> 12710 bytes .../__pycache__/filepost.cpython-311.pyc | Bin 0 -> 3880 bytes .../__pycache__/poolmanager.cpython-311.pyc | Bin 0 -> 25906 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 61895 bytes .../site-packages/urllib3/_base_connection.py | 167 + .../site-packages/urllib3/_collections.py | 486 + .../site-packages/urllib3/_request_methods.py | 278 + .../site-packages/urllib3/_version.py | 24 + .../site-packages/urllib3/connection.py | 1099 ++ .../site-packages/urllib3/connectionpool.py | 1191 ++ .../site-packages/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 202 bytes .../__pycache__/pyopenssl.cpython-311.pyc | Bin 0 -> 29491 bytes .../contrib/__pycache__/socks.cpython-311.pyc | Bin 0 -> 8739 bytes .../urllib3/contrib/emscripten/__init__.py | 17 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1084 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 10761 bytes .../__pycache__/fetch.cpython-311.pyc | Bin 0 -> 31300 bytes .../__pycache__/request.cpython-311.pyc | Bin 0 -> 1660 bytes .../__pycache__/response.cpython-311.pyc | Bin 0 -> 13107 bytes .../urllib3/contrib/emscripten/connection.py | 260 + .../emscripten/emscripten_fetch_worker.js | 110 + .../urllib3/contrib/emscripten/fetch.py | 726 + .../urllib3/contrib/emscripten/request.py | 22 + .../urllib3/contrib/emscripten/response.py | 281 + .../urllib3/contrib/pyopenssl.py | 563 + .../site-packages/urllib3/contrib/socks.py | 228 + .../site-packages/urllib3/exceptions.py | 335 + .../site-packages/urllib3/fields.py | 341 + .../site-packages/urllib3/filepost.py | 89 + .../site-packages/urllib3/http2/__init__.py | 53 + .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 2027 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 19048 bytes .../http2/__pycache__/probe.cpython-311.pyc | Bin 0 -> 4347 bytes .../site-packages/urllib3/http2/connection.py | 356 + .../site-packages/urllib3/http2/probe.py | 87 + .../site-packages/urllib3/poolmanager.py | 653 + .../python3.11/site-packages/urllib3/py.typed | 2 + .../site-packages/urllib3/response.py | 1493 ++ .../site-packages/urllib3/util/__init__.py | 42 + .../util/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1235 bytes .../__pycache__/connection.cpython-311.pyc | Bin 0 -> 5058 bytes .../util/__pycache__/proxy.cpython-311.pyc | Bin 0 -> 1293 bytes .../util/__pycache__/request.cpython-311.pyc | Bin 0 -> 9232 bytes .../util/__pycache__/response.cpython-311.pyc | Bin 0 -> 3367 bytes .../util/__pycache__/retry.cpython-311.pyc | Bin 0 -> 22028 bytes .../util/__pycache__/ssl_.cpython-311.pyc | Bin 0 -> 16657 bytes .../ssl_match_hostname.cpython-311.pyc | Bin 0 -> 6091 bytes .../__pycache__/ssltransport.cpython-311.pyc | Bin 0 -> 14326 bytes .../util/__pycache__/timeout.cpython-311.pyc | Bin 0 -> 12080 bytes .../util/__pycache__/url.cpython-311.pyc | Bin 0 -> 17779 bytes .../util/__pycache__/util.cpython-311.pyc | Bin 0 -> 2183 bytes .../util/__pycache__/wait.cpython-311.pyc | Bin 0 -> 3754 bytes .../site-packages/urllib3/util/connection.py | 137 + .../site-packages/urllib3/util/proxy.py | 43 + .../site-packages/urllib3/util/request.py | 263 + .../site-packages/urllib3/util/response.py | 101 + .../site-packages/urllib3/util/retry.py | 557 + .../site-packages/urllib3/util/ssl_.py | 477 + .../urllib3/util/ssl_match_hostname.py | 153 + .../urllib3/util/ssltransport.py | 271 + .../site-packages/urllib3/util/timeout.py | 275 + .../site-packages/urllib3/util/url.py | 469 + .../site-packages/urllib3/util/util.py | 42 + .../site-packages/urllib3/util/wait.py | 124 + 1478 files changed, 290917 insertions(+), 746 deletions(-) create mode 100644 myproject/accounts/__pycache__/delivery.cpython-311.pyc create mode 100644 myproject/accounts/__pycache__/forms.cpython-311.pyc create mode 100644 myproject/accounts/__pycache__/tests.cpython-311.pyc create mode 100644 myproject/accounts/delivery.py create mode 100644 myproject/accounts/migrations/0003_profile_default_address_profile_latitude_and_more.py create mode 100644 myproject/accounts/migrations/__pycache__/0003_profile_default_address_profile_latitude_and_more.cpython-311.pyc create mode 100644 myproject/cart/__pycache__/tests.cpython-311.pyc create mode 100644 myproject/core/__pycache__/tests.cpython-311.pyc create mode 100644 myproject/media/products/checkout.gif create mode 100644 myproject/media/products/checkout_7Tq3pK9.gif create mode 100644 myproject/media/products/checkout_Apl5oIV.gif create mode 100644 myproject/media/products/checkout_Fu8w9sg.gif create mode 100644 myproject/media/products/checkout_OIU3UZr.gif create mode 100644 myproject/media/products/checkout_UwESDAP.gif create mode 100644 myproject/media/products/checkout_XwH82Ej.gif create mode 100644 myproject/media/products/checkout_cHT6Jqv.gif create mode 100644 myproject/media/products/checkout_kHc70mM.gif create mode 100644 myproject/media/products/checkout_kXmZj1w.gif create mode 100644 myproject/media/products/checkout_swmZZ69.gif create mode 100644 myproject/media/products/checkout_tynTK9s.gif create mode 100644 myproject/media/products/product.gif create mode 100644 myproject/media/products/product_43wNxQz.gif create mode 100644 myproject/media/products/product_6lHiVJy.gif create mode 100644 myproject/media/products/product_Ant52cM.gif create mode 100644 myproject/media/products/product_AuUXWqH.gif create mode 100644 myproject/media/products/product_ETEIG5v.gif create mode 100644 myproject/media/products/product_ElMt9Bz.gif create mode 100644 myproject/media/products/product_Jr0cyVq.gif create mode 100644 myproject/media/products/product_LLFVOs6.gif create mode 100644 myproject/media/products/product_OEdan1B.gif create mode 100644 myproject/media/products/product_P2RBysy.gif create mode 100644 myproject/media/products/product_QD5Pj7T.gif create mode 100644 myproject/media/products/product_R2JLv1Y.gif create mode 100644 myproject/media/products/product_RHmtSgn.gif create mode 100644 myproject/media/products/product_RoWLVcr.gif create mode 100644 myproject/media/products/product_SaeMYQz.gif create mode 100644 myproject/media/products/product_bbYiWAc.gif create mode 100644 myproject/media/products/product_g0hum12.gif create mode 100644 myproject/media/products/product_k2IZBN8.gif create mode 100644 myproject/media/products/product_qrGyMS2.gif create mode 100644 myproject/media/products/product_rCx1Jzm.gif create mode 100644 myproject/media/products/product_rGz8cvy.gif create mode 100644 myproject/media/products/product_tjnDy5f.gif create mode 100644 myproject/media/products/product_vcUB9za.gif create mode 100644 myproject/media/profile_pics/user_3/samanya_you.webp create mode 100644 myproject/media/profile_pics/user_6/logo.jpg create mode 100644 myproject/orders/__pycache__/payments.cpython-311.pyc create mode 100644 myproject/orders/__pycache__/tests.cpython-311.pyc create mode 100644 myproject/orders/migrations/0005_order_paid_at_order_payment_currency_and_more.py create mode 100644 myproject/orders/migrations/0006_order_delivery_notes_order_latitude_and_more.py create mode 100644 myproject/orders/migrations/__pycache__/0005_order_paid_at_order_payment_currency_and_more.cpython-311.pyc create mode 100644 myproject/orders/migrations/__pycache__/0006_order_delivery_notes_order_latitude_and_more.cpython-311.pyc create mode 100644 myproject/orders/payments.py create mode 100644 myproject/products/__pycache__/tests.cpython-311.pyc create mode 100644 myproject/products/migrations/0008_alter_product_category.py create mode 100644 myproject/products/migrations/__pycache__/0008_alter_product_category.cpython-311.pyc create mode 100644 myproject/tempelates/order/payment_redirect.html create mode 100755 venv/bin/normalizer create mode 100755 venv/lib/python3.11/site-packages/81d243bd2c585b0f4821__mypyc.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/__pycache__/typing_extensions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.4.22.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.4.22.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.4.22.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.4.22.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.4.22.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/certifi-2026.4.22.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/certifi/__init__.py create mode 100644 venv/lib/python3.11/site-packages/certifi/__main__.py create mode 100644 venv/lib/python3.11/site-packages/certifi/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/certifi/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/certifi/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/certifi/cacert.pem create mode 100644 venv/lib/python3.11/site-packages/certifi/core.py create mode 100644 venv/lib/python3.11/site-packages/certifi/py.typed create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.7.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.7.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.7.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.7.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.7.dist-info/entry_points.txt create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.7.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer-3.4.7.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__init__.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__main__.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/cd.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/constant.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/legacy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/md.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/api.py create mode 100755 venv/lib/python3.11/site-packages/charset_normalizer/cd.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cd.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cli/__init__.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cli/__main__.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/cli/__pycache__/__main__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/constant.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/legacy.py create mode 100755 venv/lib/python3.11/site-packages/charset_normalizer/md.cpython-311-x86_64-linux-gnu.so create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/md.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/models.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/py.typed create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/utils.py create mode 100644 venv/lib/python3.11/site-packages/charset_normalizer/version.py create mode 100644 venv/lib/python3.11/site-packages/idna-3.15.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/idna-3.15.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/idna-3.15.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/idna-3.15.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/idna-3.15.dist-info/licenses/LICENSE.md create mode 100644 venv/lib/python3.11/site-packages/idna/__init__.py create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/codec.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/core.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/idnadata.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/intranges.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/package_data.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/__pycache__/uts46data.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/idna/codec.py create mode 100644 venv/lib/python3.11/site-packages/idna/compat.py create mode 100644 venv/lib/python3.11/site-packages/idna/core.py create mode 100644 venv/lib/python3.11/site-packages/idna/idnadata.py create mode 100644 venv/lib/python3.11/site-packages/idna/intranges.py create mode 100644 venv/lib/python3.11/site-packages/idna/package_data.py create mode 100644 venv/lib/python3.11/site-packages/idna/py.typed create mode 100644 venv/lib/python3.11/site-packages/idna/uts46data.py create mode 100644 venv/lib/python3.11/site-packages/requests-2.34.2.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/requests-2.34.2.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/requests-2.34.2.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/requests-2.34.2.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/requests-2.34.2.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/requests-2.34.2.dist-info/licenses/NOTICE create mode 100644 venv/lib/python3.11/site-packages/requests-2.34.2.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/requests/__init__.py create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/__version__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/_internal_utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/_types.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/adapters.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/api.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/auth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/certs.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/compat.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/cookies.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/help.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/hooks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/models.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/packages.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/sessions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/status_codes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/structures.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__pycache__/utils.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/requests/__version__.py create mode 100644 venv/lib/python3.11/site-packages/requests/_internal_utils.py create mode 100644 venv/lib/python3.11/site-packages/requests/_types.py create mode 100644 venv/lib/python3.11/site-packages/requests/adapters.py create mode 100644 venv/lib/python3.11/site-packages/requests/api.py create mode 100644 venv/lib/python3.11/site-packages/requests/auth.py create mode 100644 venv/lib/python3.11/site-packages/requests/certs.py create mode 100644 venv/lib/python3.11/site-packages/requests/compat.py create mode 100644 venv/lib/python3.11/site-packages/requests/cookies.py create mode 100644 venv/lib/python3.11/site-packages/requests/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/requests/help.py create mode 100644 venv/lib/python3.11/site-packages/requests/hooks.py create mode 100644 venv/lib/python3.11/site-packages/requests/models.py create mode 100644 venv/lib/python3.11/site-packages/requests/packages.py create mode 100644 venv/lib/python3.11/site-packages/requests/py.typed create mode 100644 venv/lib/python3.11/site-packages/requests/sessions.py create mode 100644 venv/lib/python3.11/site-packages/requests/status_codes.py create mode 100644 venv/lib/python3.11/site-packages/requests/structures.py create mode 100644 venv/lib/python3.11/site-packages/requests/utils.py create mode 100644 venv/lib/python3.11/site-packages/stripe-12.5.1.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/stripe-12.5.1.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/stripe-12.5.1.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/stripe-12.5.1.dist-info/REQUESTED create mode 100644 venv/lib/python3.11/site-packages/stripe-12.5.1.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/stripe-12.5.1.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/stripe-12.5.1.dist-info/top_level.txt create mode 100644 venv/lib/python3.11/site-packages/stripe/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_capability_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_external_account_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_link_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_login_link_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_person_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_account_session_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_any_iterator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_api_mode.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_api_requestor.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_api_version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_app_info.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_apple_pay_domain.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_apple_pay_domain_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_application.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_application_fee.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_application_fee_refund.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_application_fee_refund_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_application_fee_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_apps_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_balance.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_balance_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_balance_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_balance_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_bank_account.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_base_address.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_billing_portal_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_billing_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_capability.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_card.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_cash_balance.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_charge.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_charge_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_checkout_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_client_options.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_climate_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_confirmation_token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_confirmation_token_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_connect_collection_transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_country_spec.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_country_spec_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_coupon.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_coupon_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_createable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_credit_note.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_credit_note_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_credit_note_line_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_credit_note_preview_lines_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_credit_note_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_custom_method.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_balance_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_balance_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_cash_balance_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_cash_balance_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_cash_balance_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_funding_instructions_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_payment_method_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_payment_source_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_session_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_customer_tax_id_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_deletable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_discount.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_dispute.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_dispute_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_encode.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_entitlements_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_ephemeral_key.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_ephemeral_key_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_error.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_error_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_event_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_exchange_rate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_exchange_rate_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_expandable_field.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_file.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_file_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_file_link_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_file_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_financial_connections_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_forwarding_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_funding_instructions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_http_client.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_identity_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_line_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_payment.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_payment_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_rendering_template.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_rendering_template_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_invoice_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_issuing_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_list_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_listable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_login_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_mandate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_mandate_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_multipart_data_generator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_nested_resource_class_methods.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_oauth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_oauth_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_object_classes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_intent.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_intent_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_link_line_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_link_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_method.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_method_configuration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_method_configuration_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_method_domain.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_method_domain_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payment_method_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payout.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_payout_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_person.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_plan.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_plan_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_price.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_price_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_product.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_product_feature.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_product_feature_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_product_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_promotion_code.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_promotion_code_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_quote.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_quote_computed_upfront_line_items_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_quote_line_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_quote_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_radar_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_refund.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_refund_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_reporting_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_request_metrics.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_request_options.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_requestor_options.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_reserve_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_reversal.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_review.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_review_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_search_result_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_searchable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_setup_attempt.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_setup_attempt_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_setup_intent.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_setup_intent_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_shipping_rate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_shipping_rate_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_sigma_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_singleton_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_source.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_source_mandate_notification.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_source_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_source_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_source_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_stripe_client.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_stripe_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_stripe_response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_stripe_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_subscription.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_subscription_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_subscription_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_subscription_schedule.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_subscription_schedule_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_subscription_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_tax_code.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_tax_code_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_tax_deducted_at_source.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_tax_id.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_tax_id_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_tax_rate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_tax_rate_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_tax_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_terminal_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_test_helpers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_test_helpers_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_token_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_topup.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_topup_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_transfer_reversal_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_transfer_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_treasury_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_updateable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_v1_services.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_v2_services.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_verify_mixin.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_webhook.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_webhook_endpoint.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/_webhook_endpoint_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/api_version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/app_info.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/error.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/http_client.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/multipart_data_generator.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/oauth.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/oauth_error.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/request_metrics.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/request_options.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/stripe_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/stripe_response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/__pycache__/webhook.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/_account.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_capability_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_external_account_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_link.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_link_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_login_link_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_person_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_account_session_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_any_iterator.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_api_mode.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_api_requestor.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_api_version.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_app_info.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_apple_pay_domain.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_apple_pay_domain_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_application.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_application_fee.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_application_fee_refund.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_application_fee_refund_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_application_fee_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_apps_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_balance.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_balance_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_balance_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_balance_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_bank_account.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_base_address.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_billing_portal_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_billing_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_capability.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_card.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_cash_balance.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_charge.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_charge_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_checkout_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_client_options.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_climate_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_confirmation_token.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_confirmation_token_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_connect_collection_transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_country_spec.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_country_spec_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_coupon.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_coupon_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_createable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_credit_note.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_credit_note_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_credit_note_line_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_credit_note_preview_lines_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_credit_note_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_custom_method.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_balance_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_balance_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_cash_balance_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_cash_balance_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_cash_balance_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_funding_instructions_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_payment_method_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_payment_source_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_session_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_customer_tax_id_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_deletable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_discount.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_dispute.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_dispute_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_encode.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_entitlements_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_ephemeral_key.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_ephemeral_key_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_error.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_error_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_event_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_exchange_rate.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_exchange_rate_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_expandable_field.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_file.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_file_link.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_file_link_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_file_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_financial_connections_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_forwarding_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_funding_instructions.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_http_client.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_identity_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_line_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_payment.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_payment_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_rendering_template.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_rendering_template_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_invoice_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_issuing_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_list_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_listable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_login_link.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_mandate.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_mandate_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_multipart_data_generator.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_nested_resource_class_methods.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_oauth.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_oauth_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_object_classes.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_intent.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_intent_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_link.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_link_line_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_link_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_method.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_method_configuration.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_method_configuration_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_method_domain.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_method_domain_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payment_method_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payout.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_payout_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_person.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_plan.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_plan_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_price.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_price_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_product.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_product_feature.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_product_feature_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_product_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_promotion_code.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_promotion_code_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_quote.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_quote_computed_upfront_line_items_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_quote_line_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_quote_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_radar_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_refund.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_refund_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_reporting_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_request_metrics.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_request_options.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_requestor_options.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_reserve_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_reversal.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_review.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_review_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_search_result_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_searchable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_setup_attempt.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_setup_attempt_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_setup_intent.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_setup_intent_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_shipping_rate.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_shipping_rate_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_sigma_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_singleton_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_source.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_source_mandate_notification.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_source_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_source_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_source_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_stripe_client.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_stripe_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_stripe_response.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_stripe_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_subscription.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_subscription_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_subscription_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_subscription_schedule.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_subscription_schedule_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_subscription_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_tax_code.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_tax_code_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_tax_deducted_at_source.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_tax_id.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_tax_id_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_tax_rate.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_tax_rate_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_tax_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_terminal_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_test_helpers.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_test_helpers_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_token.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_token_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_topup.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_topup_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_transfer_reversal_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_transfer_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_treasury_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_updateable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_util.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_v1_services.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_v2_services.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_verify_mixin.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_version.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_webhook.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_webhook_endpoint.py create mode 100644 venv/lib/python3.11/site-packages/stripe/_webhook_endpoint_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/account.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/account_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/account_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/apple_pay_domain.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/application.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/application_fee.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/application_fee_refund.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/balance.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/balance_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/bank_account.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/capability.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/card.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/cash_balance.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/charge.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/confirmation_token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/connect_collection_transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/country_spec.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/coupon.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/credit_note.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/credit_note_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/customer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/customer_balance_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/customer_cash_balance_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/customer_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/discount.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/dispute.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/ephemeral_key.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/error_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/exchange_rate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/file.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/file_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/funding_instructions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/invoice.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/invoice_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/invoice_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/invoice_payment.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/invoice_rendering_template.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/list_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/login_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/mandate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/payment_intent.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/payment_link.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/payment_method.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/payment_method_configuration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/payment_method_domain.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/payout.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/person.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/plan.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/price.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/product.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/product_feature.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/promotion_code.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/quote.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/recipient_transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/refund.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/reserve_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/reversal.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/review.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/search_result_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/setup_attempt.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/setup_intent.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/shipping_rate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/source.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/source_mandate_notification.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/source_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/subscription.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/subscription_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/subscription_schedule.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/tax_code.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/tax_deducted_at_source.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/tax_id.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/tax_rate.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/topup.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/__pycache__/webhook_endpoint.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/createable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/custom_method.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/deletable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/listable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/nested_resource_class_methods.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/searchable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/singleton_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/test_helpers.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/updateable_api_resource.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/__pycache__/verify_mixin.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/createable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/custom_method.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/deletable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/listable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/nested_resource_class_methods.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/searchable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/singleton_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/test_helpers.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/updateable_api_resource.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/abstract/verify_mixin.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/account.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/account_link.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/account_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/apple_pay_domain.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/application.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/application_fee.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/application_fee_refund.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/apps/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/apps/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/apps/__pycache__/secret.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/apps/secret.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/balance.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/balance_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/bank_account.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/alert.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/alert_triggered.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/credit_balance_summary.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/credit_balance_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/credit_grant.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/meter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/meter_event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/meter_event_adjustment.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/__pycache__/meter_event_summary.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/alert.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/alert_triggered.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/credit_balance_summary.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/credit_balance_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/credit_grant.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/meter.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/meter_event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/meter_event_adjustment.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing/meter_event_summary.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing_portal/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing_portal/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing_portal/__pycache__/configuration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing_portal/__pycache__/session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing_portal/configuration.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/billing_portal/session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/capability.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/card.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/cash_balance.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/charge.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/checkout/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/checkout/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/checkout/__pycache__/session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/checkout/session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/climate/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/climate/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/climate/__pycache__/order.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/climate/__pycache__/product.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/climate/__pycache__/supplier.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/climate/order.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/climate/product.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/climate/supplier.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/confirmation_token.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/connect_collection_transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/country_spec.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/coupon.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/credit_note.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/credit_note_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/customer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/customer_balance_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/customer_cash_balance_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/customer_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/discount.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/dispute.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/entitlements/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/entitlements/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/entitlements/__pycache__/active_entitlement.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/entitlements/__pycache__/active_entitlement_summary.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/entitlements/__pycache__/feature.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/entitlements/active_entitlement.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/entitlements/active_entitlement_summary.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/entitlements/feature.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/ephemeral_key.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/error_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/exchange_rate.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/file.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/file_link.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/__pycache__/account.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/__pycache__/account_owner.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/__pycache__/account_ownership.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/__pycache__/session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/__pycache__/transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/account.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/account_owner.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/account_ownership.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/financial_connections/transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/forwarding/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/forwarding/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/forwarding/__pycache__/request.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/forwarding/request.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/funding_instructions.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/identity/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/identity/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/identity/__pycache__/verification_report.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/identity/__pycache__/verification_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/identity/verification_report.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/identity/verification_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/invoice.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/invoice_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/invoice_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/invoice_payment.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/invoice_rendering_template.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/authorization.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/card.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/cardholder.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/dispute.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/personalization_design.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/physical_bundle.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/__pycache__/transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/authorization.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/card.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/cardholder.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/dispute.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/personalization_design.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/physical_bundle.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/token.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/issuing/transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/list_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/login_link.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/mandate.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/payment_intent.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/payment_link.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/payment_method.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/payment_method_configuration.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/payment_method_domain.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/payout.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/person.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/plan.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/price.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/product.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/product_feature.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/promotion_code.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/quote.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/radar/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/radar/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/radar/__pycache__/early_fraud_warning.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/radar/__pycache__/value_list.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/radar/__pycache__/value_list_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/radar/early_fraud_warning.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/radar/value_list.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/radar/value_list_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/recipient_transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/refund.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/reporting/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/reporting/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/reporting/__pycache__/report_run.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/reporting/__pycache__/report_type.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/reporting/report_run.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/reporting/report_type.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/reserve_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/reversal.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/review.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/search_result_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/setup_attempt.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/setup_intent.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/shipping_rate.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/sigma/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/sigma/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/sigma/__pycache__/scheduled_query_run.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/sigma/scheduled_query_run.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/source.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/source_mandate_notification.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/source_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/subscription.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/subscription_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/subscription_schedule.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/__pycache__/calculation.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/__pycache__/calculation_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/__pycache__/registration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/__pycache__/settings.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/__pycache__/transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/__pycache__/transaction_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/calculation.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/calculation_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/registration.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/settings.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax/transaction_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax_code.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax_deducted_at_source.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax_id.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/tax_rate.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/__pycache__/configuration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/__pycache__/connection_token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/__pycache__/location.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/__pycache__/reader.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/configuration.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/connection_token.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/location.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/terminal/reader.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/test_helpers/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/test_helpers/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/test_helpers/__pycache__/test_clock.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/test_helpers/test_clock.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/token.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/topup.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/credit_reversal.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/debit_reversal.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/financial_account.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/financial_account_features.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/inbound_transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/outbound_payment.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/outbound_transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/received_credit.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/received_debit.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/__pycache__/transaction_entry.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/credit_reversal.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/debit_reversal.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/financial_account.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/financial_account_features.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/inbound_transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/outbound_payment.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/outbound_transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/received_credit.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/received_debit.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/treasury/transaction_entry.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_resources/webhook_endpoint.py create mode 100644 venv/lib/python3.11/site-packages/stripe/api_version.py create mode 100644 venv/lib/python3.11/site-packages/stripe/app_info.py create mode 100644 venv/lib/python3.11/site-packages/stripe/apps/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/apps/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/apps/__pycache__/_secret.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/apps/__pycache__/_secret_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/apps/_secret.py create mode 100644 venv/lib/python3.11/site-packages/stripe/apps/_secret_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_alert.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_alert_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_alert_triggered.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_credit_balance_summary.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_credit_balance_summary_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_credit_balance_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_credit_balance_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_credit_grant.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_credit_grant_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_meter.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_meter_event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_meter_event_adjustment.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_meter_event_adjustment_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_meter_event_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_meter_event_summary.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_meter_event_summary_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/__pycache__/_meter_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_alert.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_alert_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_alert_triggered.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_credit_balance_summary.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_credit_balance_summary_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_credit_balance_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_credit_balance_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_credit_grant.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_credit_grant_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_meter.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_meter_event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_meter_event_adjustment.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_meter_event_adjustment_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_meter_event_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_meter_event_summary.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_meter_event_summary_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing/_meter_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/__pycache__/_configuration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/__pycache__/_configuration_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/__pycache__/_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/__pycache__/_session_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/_configuration.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/_configuration_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/billing_portal/_session_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/checkout/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/checkout/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/checkout/__pycache__/_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/checkout/__pycache__/_session_line_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/checkout/__pycache__/_session_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/checkout/_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/checkout/_session_line_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/checkout/_session_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/__pycache__/_order.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/__pycache__/_order_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/__pycache__/_product.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/__pycache__/_product_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/__pycache__/_supplier.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/__pycache__/_supplier_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/_order.py create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/_order_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/_product.py create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/_product_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/_supplier.py create mode 100644 venv/lib/python3.11/site-packages/stripe/climate/_supplier_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/data/ca-certificates.crt create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/__pycache__/_active_entitlement.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/__pycache__/_active_entitlement_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/__pycache__/_active_entitlement_summary.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/__pycache__/_feature.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/__pycache__/_feature_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/_active_entitlement.py create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/_active_entitlement_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/_active_entitlement_summary.py create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/_feature.py create mode 100644 venv/lib/python3.11/site-packages/stripe/entitlements/_feature_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/error.py create mode 100644 venv/lib/python3.11/site-packages/stripe/events/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/events/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/events/__pycache__/_event_classes.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/events/__pycache__/_v1_billing_meter_error_report_triggered_event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/events/__pycache__/_v1_billing_meter_no_meter_found_event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/events/__pycache__/_v2_core_event_destination_ping_event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/events/_event_classes.py create mode 100644 venv/lib/python3.11/site-packages/stripe/events/_v1_billing_meter_error_report_triggered_event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/events/_v1_billing_meter_no_meter_found_event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/events/_v2_core_event_destination_ping_event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_account.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_account_owner.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_account_owner_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_account_ownership.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_account_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_session_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/__pycache__/_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_account.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_account_owner.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_account_owner_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_account_ownership.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_account_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_session_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/financial_connections/_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/forwarding/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/forwarding/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/forwarding/__pycache__/_request.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/forwarding/__pycache__/_request_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/forwarding/_request.py create mode 100644 venv/lib/python3.11/site-packages/stripe/forwarding/_request_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/http_client.py create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/__pycache__/_verification_report.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/__pycache__/_verification_report_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/__pycache__/_verification_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/__pycache__/_verification_session_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/_verification_report.py create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/_verification_report_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/_verification_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/identity/_verification_session_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_authorization.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_authorization_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_card.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_card_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_cardholder.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_cardholder_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_dispute.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_dispute_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_personalization_design.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_personalization_design_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_physical_bundle.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_physical_bundle_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_token_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/__pycache__/_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_authorization.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_authorization_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_card.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_card_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_cardholder.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_cardholder_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_dispute.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_dispute_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_personalization_design.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_personalization_design_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_physical_bundle.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_physical_bundle_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_token.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_token_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/issuing/_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/multipart_data_generator.py create mode 100644 venv/lib/python3.11/site-packages/stripe/oauth.py create mode 100644 venv/lib/python3.11/site-packages/stripe/oauth_error.py create mode 100644 venv/lib/python3.11/site-packages/stripe/py.typed create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/__pycache__/_early_fraud_warning.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/__pycache__/_early_fraud_warning_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/__pycache__/_value_list.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/__pycache__/_value_list_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/__pycache__/_value_list_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/__pycache__/_value_list_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/_early_fraud_warning.py create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/_early_fraud_warning_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/_value_list.py create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/_value_list_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/_value_list_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/radar/_value_list_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/__pycache__/_report_run.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/__pycache__/_report_run_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/__pycache__/_report_type.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/__pycache__/_report_type_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/_report_run.py create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/_report_run_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/_report_type.py create mode 100644 venv/lib/python3.11/site-packages/stripe/reporting/_report_type_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/request_metrics.py create mode 100644 venv/lib/python3.11/site-packages/stripe/request_options.py create mode 100644 venv/lib/python3.11/site-packages/stripe/sigma/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/sigma/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/sigma/__pycache__/_scheduled_query_run.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/sigma/__pycache__/_scheduled_query_run_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/sigma/_scheduled_query_run.py create mode 100644 venv/lib/python3.11/site-packages/stripe/sigma/_scheduled_query_run_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/stripe_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/stripe_response.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_calculation.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_calculation_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_calculation_line_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_calculation_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_registration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_registration_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_settings.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_settings_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_transaction_line_item.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_transaction_line_item_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/__pycache__/_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_calculation.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_calculation_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_calculation_line_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_calculation_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_registration.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_registration_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_settings.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_settings_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_transaction_line_item.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_transaction_line_item_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/tax/_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/_configuration.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/_configuration_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/_connection_token.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/_connection_token_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/_location.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/_location_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/_reader.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/__pycache__/_reader_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/_configuration.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/_configuration_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/_connection_token.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/_connection_token_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/_location.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/_location_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/_reader.py create mode 100644 venv/lib/python3.11/site-packages/stripe/terminal/_reader_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/_confirmation_token_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/_customer_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/_issuing_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/_refund_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/_terminal_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/_test_clock.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/_test_clock_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/__pycache__/_treasury_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/_confirmation_token_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/_customer_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/_issuing_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/_refund_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/_terminal_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/_test_clock.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/_test_clock_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/_treasury_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/__pycache__/_authorization_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/__pycache__/_card_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/__pycache__/_personalization_design_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/__pycache__/_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/_authorization_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/_card_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/_personalization_design_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/issuing/_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/terminal/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/terminal/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/terminal/__pycache__/_reader_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/terminal/_reader_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/__pycache__/_inbound_transfer_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/__pycache__/_outbound_payment_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/__pycache__/_outbound_transfer_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/__pycache__/_received_credit_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/__pycache__/_received_debit_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/_inbound_transfer_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/_outbound_payment_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/_outbound_transfer_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/_received_credit_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/test_helpers/treasury/_received_debit_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_credit_reversal.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_credit_reversal_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_debit_reversal.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_debit_reversal_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_financial_account.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_financial_account_features.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_financial_account_features_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_financial_account_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_inbound_transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_inbound_transfer_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_outbound_payment.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_outbound_payment_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_outbound_transfer.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_outbound_transfer_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_received_credit.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_received_credit_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_received_debit.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_received_debit_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_transaction.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_transaction_entry.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_transaction_entry_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/__pycache__/_transaction_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_credit_reversal.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_credit_reversal_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_debit_reversal.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_debit_reversal_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_financial_account.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_financial_account_features.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_financial_account_features_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_financial_account_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_inbound_transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_inbound_transfer_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_outbound_payment.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_outbound_payment_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_outbound_transfer.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_outbound_transfer_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_received_credit.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_received_credit_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_received_debit.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_received_debit_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_transaction.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_transaction_entry.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_transaction_entry_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/treasury/_transaction_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/util.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/__pycache__/_amount.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/__pycache__/_billing_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/__pycache__/_core_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/__pycache__/_event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/__pycache__/_event_destination.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/__pycache__/_list_object.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/_amount.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/_billing_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/_core_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/_event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/_event_destination.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/_list_object.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__pycache__/_meter_event.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__pycache__/_meter_event_adjustment.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__pycache__/_meter_event_adjustment_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__pycache__/_meter_event_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__pycache__/_meter_event_session.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__pycache__/_meter_event_session_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/__pycache__/_meter_event_stream_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/_meter_event.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/_meter_event_adjustment.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/_meter_event_adjustment_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/_meter_event_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/_meter_event_session.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/_meter_event_session_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/billing/_meter_event_stream_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/core/__init__.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/core/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/core/__pycache__/_event_destination_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/core/__pycache__/_event_service.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/core/_event_destination_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/v2/core/_event_service.py create mode 100644 venv/lib/python3.11/site-packages/stripe/version.py create mode 100644 venv/lib/python3.11/site-packages/stripe/webhook.py create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE create mode 100644 venv/lib/python3.11/site-packages/typing_extensions.py create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.7.0.dist-info/INSTALLER create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.7.0.dist-info/METADATA create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.7.0.dist-info/RECORD create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.7.0.dist-info/WHEEL create mode 100644 venv/lib/python3.11/site-packages/urllib3-2.7.0.dist-info/licenses/LICENSE.txt create mode 100644 venv/lib/python3.11/site-packages/urllib3/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/_base_connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/_collections.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/_request_methods.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/_version.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/connectionpool.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/exceptions.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/fields.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/filepost.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/poolmanager.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/__pycache__/response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/_base_connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/_collections.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/_request_methods.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/_version.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/connectionpool.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/__pycache__/socks.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/fetch.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/request.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/__pycache__/response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/emscripten_fetch_worker.js create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/fetch.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/request.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/emscripten/response.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/pyopenssl.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/contrib/socks.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/exceptions.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/fields.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/filepost.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/__pycache__/probe.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/http2/probe.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/poolmanager.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/py.typed create mode 100644 venv/lib/python3.11/site-packages/urllib3/response.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__init__.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/__init__.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/connection.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/proxy.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/request.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/response.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/retry.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/ssl_.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/ssltransport.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/timeout.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/url.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/util.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/__pycache__/wait.cpython-311.pyc create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/connection.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/proxy.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/request.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/response.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/retry.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/ssl_.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/ssl_match_hostname.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/ssltransport.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/timeout.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/url.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/util.py create mode 100644 venv/lib/python3.11/site-packages/urllib3/util/wait.py diff --git a/myproject/accounts/__pycache__/admin.cpython-311.pyc b/myproject/accounts/__pycache__/admin.cpython-311.pyc index e7fd73b098278c0133354eb4d68c03548d0714fc..5f5d188a583741d74319f6d924dc68a10cc09cfe 100644 GIT binary patch literal 4682 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 X3eZChsznY_FZ>Me5!U_`A@cn%ZhF1f literal 0 HcmV?d00001 diff --git a/myproject/accounts/__pycache__/forms.cpython-311.pyc b/myproject/accounts/__pycache__/forms.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c1808868e60c33b255b8fc5e1769e3bbfdf869d GIT binary patch literal 15583 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 literal 0 HcmV?d00001 diff --git a/myproject/accounts/__pycache__/models.cpython-311.pyc b/myproject/accounts/__pycache__/models.cpython-311.pyc index 57ea40acb4a7be1dac6a8ec8bc3777ea94e74007..3c94d8febcef188a6a2bad2bafad60a5a03b8135 100644 GIT binary patch literal 3976 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 Y&xl81fcKFEXE>M+p;+`hJ@iuj0~Ut8djJ3c diff --git a/myproject/accounts/__pycache__/tests.cpython-311.pyc b/myproject/accounts/__pycache__/tests.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d61cb517aa948409ccbc1ff0ab2693838f26fd44 GIT binary patch literal 3496 zcmb_e&2QUA79UEYG_oZtiQU?29GhFGP1QJ(729!wZWFgfn=~!lCTVjJ8W1#RY*D2| zb%v~C!&zj3V$s7M_OOfO;01ijCTI)v&)6en5HLZYK!L>`dQ*^|dg>d>lqENAx4{m{ z$H(`@H($Ru|H@_u5VZIIoUQ!>BlI8f5jA;_c~Sx99wLZHCaOynNfLa_jMd|nc*w`i zL|v}P5{e-zJpk*kq8O->jG@bjB)&jIrtt@H(81Gbl@v+dK!wx~;DeQXoAGyABkY> z4PCdKhJBr`8r)`@ZCDKvo$FBy5$Xs$BEKgSK<}YVR1?y$ZTH$mLS#py1QH@W0GqG6 zb|gmPBtc}7geyfbNs|FGNHQe5m3a^YOL#i%jY4mAU4Q&c{@Jd7`YHZHk+%1}8LRE*pNlm8BOT8DZ+naN9JXijK6;op zL9nNeEd`i`yNR*@H|W~3vkqK*iLM3mn}XjMiKL74wpMSNw5VJ4APf7?YOFRj&dXu{ex{HKut1cCR;R(hiov+8hJ4!8B37n#%`gKj@>#PO36AJi z15E2`S0Xp7R)YpZrlp6#p_?XE1F~4szwN-oCnwhwe1iZq)q5yhaK*EX}az( zO0%L+fNRKl6?av&|3+?_IuR*-Own zHY!wOLbac<(A-zhY#$fGtH)etNA`wd%CwECa|oC3>6c zj%~3LjOeGlsp+&-Ux!RYiX|8a0mZyz3ji)Q*MswdQ#-4vgUzbWDEykMd+DodhFw*m zEErG)*41cCH?AFq>&0gcDG-O>f%&`)s4c`P3p8Tb(a`4YEJqI7l_ zkL}>G`(s}I%tPM7vmTyx@vM(Ckz)H*P<^xZ?OLmJ$tzuI;YANGx_I%wx#7QV?&c@$ig`XL{um4@X~O`dQl)CFR!w*S zKa>@NnuIF==8DbM6>U{B8bvk^u7yE%LIj);L<}FB6hr|M40RytEvsRJJ&z#p9nA#b z`GYWfQJ5tG-fTd?B)ttsJ6?#fQ$qI&5H5~bio#wMcGJH^1V%q|3;;AW1b7wli?Dp- z?cV_`hleSMBpv}d98Atc7;@a7dZ|5_6u1H8v78pT0R(X4`CrG4<2(5H{VVRvpS18T z58ra}t?pj^=g8LhZhm?vKkc5o?B=Ii`72)j%5MIHo%{!_{53Cst%a|9__`b2Y#Op% zD#!s=!&0fL!GJ1G*!�=XK%$7MDmx9fY#zuX6#9h&&BSRjB;v@&&jY#Jz1pz} z`BEEo$)YqQ-;mnq>9iA6#9J!hV3^dj#;OH}h=$FK<)Y@;RVE-I7~Io{8D@!IiNj3Z zSy$nL2~)cO2K(v$g#Xy--9`2~C;(g#{|k_IT#_Uo72W>ZM~d5j`)JbbzrRmCclS@N d)Toyly_;w!OOoi})9L-&k3-Fmhv>sRe+K@+GBN-F literal 0 HcmV?d00001 diff --git a/myproject/accounts/__pycache__/views.cpython-311.pyc b/myproject/accounts/__pycache__/views.cpython-311.pyc index 6de2d8e2a4ac3c80cbdb21a6dd02474dc04038b1..11947ea226778b9618b94762dc2232bcafd2eda4 100644 GIT binary patch literal 8148 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 literal 8226 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 Q-lK4B57xS@0iwJA0noAOz5oCK diff --git a/myproject/accounts/admin.py b/myproject/accounts/admin.py index 5b7afaf..08c15dd 100644 --- a/myproject/accounts/admin.py +++ b/myproject/accounts/admin.py @@ -1,20 +1,88 @@ from django.contrib import admin +from django.db.models import Q from django.utils.html import format_html from accounts.models import Profile +class GPSAvailabilityFilter(admin.SimpleListFilter): + title = 'GPS availability' + parameter_name = 'gps' + + def lookups(self, request, model_admin): + return ( + ('yes', 'With GPS'), + ('no', 'Manual only'), + ) + + def queryset(self, request, queryset): + if self.value() == 'yes': + return queryset.filter(latitude__isnull=False, longitude__isnull=False) + if self.value() == 'no': + return queryset.filter(Q(latitude__isnull=True) | Q(longitude__isnull=True)) + return queryset + + @admin.register(Profile) class ProfileAdmin(admin.ModelAdmin): - list_display = ('user', 'is_seller', 'image_preview') + list_display = ( + 'user', + 'delivery_readiness', + 'phone', + 'short_location', + 'has_precise_location', + 'location_updated_at', + 'is_seller', + 'image_preview', + ) + list_select_related = ('user',) + search_fields = ('user__username', 'user__email', 'phone', 'location_label', 'default_address') + list_filter = ('is_seller', GPSAvailabilityFilter, 'location_updated_at') + readonly_fields = ('location_updated_at', 'image_preview', 'maps_link') + autocomplete_fields = ('user',) + fieldsets = ( + ('Account', {'fields': ('user', 'is_seller')}), + ('Delivery defaults', {'fields': ('phone', 'location_label', 'default_address')}), + ('GPS location', {'fields': ('latitude', 'longitude', 'location_accuracy_m', 'location_updated_at', 'maps_link')}), + ('Profile details', {'fields': ('image', 'image_preview', 'bio')}), + ) + @admin.display(description='Delivery readiness') + def delivery_readiness(self, obj): + missing = [] + if not obj.phone: + missing.append('phone') + if not obj.formatted_delivery_address: + missing.append('address') + if not obj.has_precise_location: + missing.append('GPS') + if not missing: + return 'Complete' + return 'Missing ' + ', '.join(missing) + + @admin.display(description='Location') + def short_location(self, obj): + return obj.short_location or '-' + + @admin.display(boolean=True, description='GPS') + def has_precise_location(self, obj): + return obj.has_precise_location + + @admin.display(description='Map') + def maps_link(self, obj): + if not obj.has_precise_location: + return '-' + return format_html( + 'Open map', + obj.latitude, + obj.longitude, + ) + + @admin.display(description='Image') def image_preview(self, obj): if obj.image: return format_html( - '', - obj.image.url + '', + obj.image.url, ) - return "No Image" - - image_preview.short_description = 'Image' + return 'No image' diff --git a/myproject/accounts/apps.py b/myproject/accounts/apps.py index 3cab1e0..3e3c765 100644 --- a/myproject/accounts/apps.py +++ b/myproject/accounts/apps.py @@ -1,5 +1,6 @@ -from django.apps import AppConfig - - -class AccountsConfig(AppConfig): - name = 'accounts' +from django.apps import AppConfig + + +class AccountsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'accounts' diff --git a/myproject/accounts/delivery.py b/myproject/accounts/delivery.py new file mode 100644 index 0000000..07ea4a5 --- /dev/null +++ b/myproject/accounts/delivery.py @@ -0,0 +1,128 @@ +from decimal import Decimal, InvalidOperation +import re + +from django.utils import timezone + + +def phone_has_valid_digits(phone): + digits = re.sub(r'\D+', '', (phone or '').strip()) + return 7 <= len(digits) <= 15 + + +def first_address_line(address): + trimmed = (address or '').strip() + if not trimmed: + return '' + return trimmed.splitlines()[0].strip() + + +def derive_location_label(location_label='', address=''): + label = (location_label or '').strip() + if label: + return label[:255] + return first_address_line(address)[:255] + + +def parse_decimal_value(raw_value, *, field_label, minimum=None, maximum=None): + value = (raw_value or '').strip() + if not value: + return None + + try: + parsed = Decimal(value) + except (InvalidOperation, TypeError): + raise ValueError(f'Invalid {field_label}.') + + if minimum is not None and parsed < minimum: + raise ValueError(f'{field_label.capitalize()} must be at least {minimum}.') + if maximum is not None and parsed > maximum: + raise ValueError(f'{field_label.capitalize()} must be no more than {maximum}.') + return parsed + + +def stringify_decimal(value): + if value in {None, ''}: + return '' + return str(value) + + +def build_delivery_payload( + *, + full_name='', + phone='', + address='', + location_label='', + delivery_notes='', + latitude=None, + longitude=None, + location_accuracy_m=None, + save_as_default=True, + **extra, +): + payload = { + 'full_name': (full_name or '').strip(), + 'phone': (phone or '').strip(), + 'address': (address or '').strip(), + 'location_label': derive_location_label(location_label, address), + 'delivery_notes': (delivery_notes or '').strip(), + 'latitude': stringify_decimal(latitude), + 'longitude': stringify_decimal(longitude), + 'location_accuracy_m': stringify_decimal(location_accuracy_m), + 'save_as_default': bool(save_as_default), + } + payload.update(extra) + return payload + + +def profile_delivery_changes(*, phone, address, location_label='', latitude=None, longitude=None, location_accuracy_m=None): + return { + 'phone': (phone or '').strip(), + 'default_address': (address or '').strip(), + 'location_label': derive_location_label(location_label, address), + 'latitude': latitude, + 'longitude': longitude, + 'location_accuracy_m': location_accuracy_m, + 'location_updated_at': timezone.now() if latitude is not None and longitude is not None else None, + } + + +def apply_profile_delivery_fields(profile, **kwargs): + changes = profile_delivery_changes(**kwargs) + for field, value in changes.items(): + setattr(profile, field, value) + return profile + + +def save_profile_delivery_defaults(profile, **kwargs): + if profile is None: + return [] + + changes = profile_delivery_changes(**kwargs) + update_fields = [] + + for field, value in changes.items(): + if getattr(profile, field) != value: + setattr(profile, field, value) + update_fields.append(field) + + if update_fields: + profile.save(update_fields=update_fields) + + return update_fields + + +def delivery_payload_from_profile(profile, *, full_name='', **extra): + if profile is None: + return build_delivery_payload(full_name=full_name, **extra) + + return build_delivery_payload( + full_name=full_name, + phone=profile.phone, + address=profile.formatted_delivery_address, + location_label=profile.short_location, + latitude=profile.latitude, + longitude=profile.longitude, + location_accuracy_m=profile.location_accuracy_m, + save_as_default=True, + **extra, + ) diff --git a/myproject/accounts/forms.py b/myproject/accounts/forms.py index 7db28e6..da54286 100644 --- a/myproject/accounts/forms.py +++ b/myproject/accounts/forms.py @@ -1,27 +1,266 @@ -from django import forms -from django.contrib.auth.models import User -from .models import Profile - - -class ProfileForm(forms.ModelForm): - first_name = forms.CharField(required=False, max_length=30) - last_name = forms.CharField(required=False, max_length=150) - email = forms.EmailField(required=False) - - class Meta: - model = Profile - fields = ['image', 'bio'] - - def save(self, commit=True): - profile = super().save(commit=False) - # update related user fields - user = profile.user - user.first_name = self.cleaned_data.get('first_name', user.first_name) - user.last_name = self.cleaned_data.get('last_name', user.last_name) - email = self.cleaned_data.get('email') - if email: - user.email = email - if commit: - user.save() - profile.save() - return profile +from django import forms +from django.contrib.auth.models import User + +from .delivery import apply_profile_delivery_fields, derive_location_label, phone_has_valid_digits +from .models import Profile + + +class DeliveryLocationValidationMixin: + def clean_phone(self): + phone = (self.cleaned_data.get('phone') or '').strip() + if not phone_has_valid_digits(phone): + raise forms.ValidationError('Please enter a valid phone number.') + return phone + + def clean_default_address(self): + address = (self.cleaned_data.get('default_address') or '').strip() + if not address: + raise forms.ValidationError('Please enter your delivery address.') + return address + + def clean(self): + cleaned_data = super().clean() + latitude = cleaned_data.get('latitude') + longitude = cleaned_data.get('longitude') + + if (latitude is None) != (longitude is None): + raise forms.ValidationError('GPS location is incomplete. Please retry the location button or save without GPS.') + + if latitude is not None and not (-90 <= latitude <= 90): + raise forms.ValidationError('Latitude is outside the valid range.') + + if longitude is not None and not (-180 <= longitude <= 180): + raise forms.ValidationError('Longitude is outside the valid range.') + + location_accuracy_m = cleaned_data.get('location_accuracy_m') + if location_accuracy_m is not None and location_accuracy_m < 0: + raise forms.ValidationError('Location accuracy cannot be negative.') + + if cleaned_data.get('default_address') and not cleaned_data.get('location_label'): + cleaned_data['location_label'] = derive_location_label('', cleaned_data['default_address']) + + return cleaned_data + + def apply_location_to_profile(self, profile): + return apply_profile_delivery_fields( + profile, + phone=self.cleaned_data.get('phone', ''), + location_label=self.cleaned_data.get('location_label', ''), + address=self.cleaned_data.get('default_address', ''), + latitude=self.cleaned_data.get('latitude'), + longitude=self.cleaned_data.get('longitude'), + location_accuracy_m=self.cleaned_data.get('location_accuracy_m'), + ) + + +class RegistrationForm(DeliveryLocationValidationMixin, forms.Form): + username = forms.CharField( + min_length=3, + max_length=150, + widget=forms.TextInput( + attrs={ + 'placeholder': 'Choose a username', + 'autocomplete': 'username', + } + ), + ) + first_name = forms.CharField( + required=False, + max_length=30, + widget=forms.TextInput(attrs={'placeholder': 'First name', 'autocomplete': 'given-name'}), + ) + last_name = forms.CharField( + required=False, + max_length=150, + widget=forms.TextInput(attrs={'placeholder': 'Last name', 'autocomplete': 'family-name'}), + ) + email = forms.EmailField( + required=False, + widget=forms.EmailInput(attrs={'placeholder': 'your@email.com', 'autocomplete': 'email'}), + ) + password = forms.CharField( + min_length=6, + widget=forms.PasswordInput(attrs={'placeholder': 'At least 6 characters', 'autocomplete': 'new-password'}), + ) + confirm_password = forms.CharField( + min_length=6, + widget=forms.PasswordInput(attrs={'placeholder': 'Confirm your password', 'autocomplete': 'new-password'}), + ) + phone = forms.CharField( + max_length=30, + required=True, + widget=forms.TextInput(attrs={'placeholder': 'Phone number', 'autocomplete': 'tel'}), + ) + location_label = forms.CharField( + max_length=255, + required=False, + widget=forms.TextInput( + attrs={ + 'placeholder': 'Area / city / delivery label', + 'autocomplete': 'address-level2', + } + ), + ) + default_address = forms.CharField( + required=True, + widget=forms.Textarea( + attrs={ + 'rows': 4, + 'placeholder': 'Street, city, area, landmark', + 'autocomplete': 'street-address', + } + ), + ) + latitude = forms.DecimalField(required=False, max_digits=9, decimal_places=6, widget=forms.HiddenInput()) + longitude = forms.DecimalField(required=False, max_digits=9, decimal_places=6, widget=forms.HiddenInput()) + location_accuracy_m = forms.DecimalField(required=False, max_digits=8, decimal_places=2, widget=forms.HiddenInput()) + register_as_seller = forms.BooleanField(required=False) + + def clean_username(self): + username = (self.cleaned_data.get('username') or '').strip() + if User.objects.filter(username__iexact=username).exists(): + raise forms.ValidationError('Username already exists.') + return username + + def clean_email(self): + email = (self.cleaned_data.get('email') or '').strip() + if email and User.objects.filter(email__iexact=email).exists(): + raise forms.ValidationError('Email already registered.') + return email + + def clean(self): + cleaned_data = super().clean() + password = cleaned_data.get('password') + confirm_password = cleaned_data.get('confirm_password') + + if password and confirm_password and password != confirm_password: + self.add_error('confirm_password', 'Passwords do not match.') + + return cleaned_data + + def save(self): + user = User.objects.create_user( + username=self.cleaned_data['username'], + password=self.cleaned_data['password'], + email=self.cleaned_data.get('email', ''), + ) + user.first_name = self.cleaned_data.get('first_name', '').strip() + user.last_name = self.cleaned_data.get('last_name', '').strip() + user.save(update_fields=['first_name', 'last_name', 'email']) + + profile = user.profile + self.apply_location_to_profile(profile) + profile.is_seller = self.cleaned_data.get('register_as_seller', False) + profile.save() + return user + + +class ProfileForm(DeliveryLocationValidationMixin, forms.ModelForm): + first_name = forms.CharField(required=False, max_length=30) + last_name = forms.CharField(required=False, max_length=150) + email = forms.EmailField(required=False) + phone = forms.CharField( + max_length=30, + required=True, + widget=forms.TextInput(attrs={'placeholder': 'Phone number', 'autocomplete': 'tel'}), + ) + location_label = forms.CharField( + max_length=255, + required=False, + widget=forms.TextInput( + attrs={ + 'placeholder': 'Area / city / delivery label', + 'autocomplete': 'address-level2', + } + ), + ) + default_address = forms.CharField( + required=True, + widget=forms.Textarea( + attrs={ + 'rows': 4, + 'placeholder': 'Street, city, area, landmark', + 'autocomplete': 'street-address', + } + ), + ) + latitude = forms.DecimalField(required=False, max_digits=9, decimal_places=6, widget=forms.HiddenInput()) + longitude = forms.DecimalField(required=False, max_digits=9, decimal_places=6, widget=forms.HiddenInput()) + location_accuracy_m = forms.DecimalField(required=False, max_digits=8, decimal_places=2, widget=forms.HiddenInput()) + + class Meta: + model = Profile + fields = ['image', 'bio', 'phone', 'location_label', 'default_address', 'latitude', 'longitude', 'location_accuracy_m'] + widgets = { + 'bio': forms.Textarea(attrs={'rows': 5, 'placeholder': 'Tell shoppers something about yourself'}), + } + + def __init__(self, *args, user=None, **kwargs): + super().__init__(*args, **kwargs) + self.user = user or getattr(self.instance, 'user', None) + if self.user: + self.fields['first_name'].initial = self.user.first_name + self.fields['last_name'].initial = self.user.last_name + self.fields['email'].initial = self.user.email + + def clean_email(self): + email = (self.cleaned_data.get('email') or '').strip() + if email and User.objects.exclude(pk=getattr(self.user, 'pk', None)).filter(email__iexact=email).exists(): + raise forms.ValidationError('That email is already being used by another account.') + return email + + def save(self, commit=True): + profile = super().save(commit=False) + self.apply_location_to_profile(profile) + + user = self.user or profile.user + user.first_name = self.cleaned_data.get('first_name', '').strip() + user.last_name = self.cleaned_data.get('last_name', '').strip() + user.email = self.cleaned_data.get('email', '').strip() + + if commit: + user.save() + profile.save() + return profile + + +class DeliveryPreferencesForm(DeliveryLocationValidationMixin, forms.ModelForm): + phone = forms.CharField( + max_length=30, + required=True, + widget=forms.TextInput(attrs={'placeholder': 'Phone number', 'autocomplete': 'tel'}), + ) + location_label = forms.CharField( + max_length=255, + required=False, + widget=forms.TextInput( + attrs={ + 'placeholder': 'Area / city / delivery label', + 'autocomplete': 'address-level2', + } + ), + ) + default_address = forms.CharField( + required=True, + widget=forms.Textarea( + attrs={ + 'rows': 4, + 'placeholder': 'Street, city, area, landmark', + 'autocomplete': 'street-address', + } + ), + ) + latitude = forms.DecimalField(required=False, max_digits=9, decimal_places=6, widget=forms.HiddenInput()) + longitude = forms.DecimalField(required=False, max_digits=9, decimal_places=6, widget=forms.HiddenInput()) + location_accuracy_m = forms.DecimalField(required=False, max_digits=8, decimal_places=2, widget=forms.HiddenInput()) + + class Meta: + model = Profile + fields = ['phone', 'location_label', 'default_address', 'latitude', 'longitude', 'location_accuracy_m'] + + def save(self, commit=True): + profile = super().save(commit=False) + self.apply_location_to_profile(profile) + if commit: + profile.save() + return profile diff --git a/myproject/accounts/migrations/0003_profile_default_address_profile_latitude_and_more.py b/myproject/accounts/migrations/0003_profile_default_address_profile_latitude_and_more.py new file mode 100644 index 0000000..a2e47df --- /dev/null +++ b/myproject/accounts/migrations/0003_profile_default_address_profile_latitude_and_more.py @@ -0,0 +1,48 @@ +# Generated by Django 5.2.14 on 2026-05-20 09:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0002_profile_is_seller'), + ] + + operations = [ + migrations.AddField( + model_name='profile', + name='default_address', + field=models.TextField(blank=True, default=''), + ), + migrations.AddField( + model_name='profile', + name='latitude', + field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True), + ), + migrations.AddField( + model_name='profile', + name='location_accuracy_m', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=8, null=True), + ), + migrations.AddField( + model_name='profile', + name='location_label', + field=models.CharField(blank=True, default='', max_length=255), + ), + migrations.AddField( + model_name='profile', + name='location_updated_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='profile', + name='longitude', + field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True), + ), + migrations.AddField( + model_name='profile', + name='phone', + field=models.CharField(blank=True, default='', max_length=30), + ), + ] diff --git a/myproject/accounts/migrations/__pycache__/0003_profile_default_address_profile_latitude_and_more.cpython-311.pyc b/myproject/accounts/migrations/__pycache__/0003_profile_default_address_profile_latitude_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56bec6fd42e5cd946b05359cb8d51feae4a217cb GIT binary patch literal 1857 zcmbVMJ#5=X6h2ZEMKY2dUtA|Zf}%ANqv}s+w3`vPC~CB@(PpX90;+)n#XHMXj-+xV z5qooi4(*n$YbV!5G<58kv7-cNFmCOnO@T9IY2Q(z8e2i!`Y0an-QD}%d-r{(Uu!i7 zLHp_ZTH7)a`b!x_D^CWe_h9fdqKIl7g<3-k^@gq?9eshQ{sW>VrnO6j(-DlGOsz(V z8egM&d8n4_x^%*zCA>6RHJ)mmDkq$6gui=-el zRWoM0QUFkcmb>N=cs_x5+`5&s3C&rKH zg=RoNmgoC%7Nv~gMv0egADjkx@3z;em$}zueE7ElFXiB(rZ(h=oJFm4 z?J9}}&hHt|3{d!eeBrl8*=@0^iW^h(SRtb5S zd0Z8%EXq18qAcIO)Ao9(B$Evp;j%Ey-d*`6oH!`cR9wjG3Q zY&vm=O>X*c=oCQEi%0HW95Od+0)Lsy_L-lhv2Y*7;z81ZV|2p<;I7U5)Gb(c|NXyk zf$xu|e4pcXI$uymyof@*g5B*L2t{AssX_9KhS1^k8JWm-M!&`m4HNaaJhFej2t{iXwVf65NAFmJa`s;meT{guV zXHsnT@Ma%x4)EsraG%`9=HZrl#QOzh_v?nVY1@lh@m<=?)tPH@OzL}TTfX-L7`?FW xjV1oEaKQwgQSuFRqmrg+K(toxp?79~BlBI&9HH6nu`{@O`ig literal 0 HcmV?d00001 diff --git a/myproject/accounts/models.py b/myproject/accounts/models.py index d2f6e52..339ee2b 100644 --- a/myproject/accounts/models.py +++ b/myproject/accounts/models.py @@ -1,31 +1,54 @@ -from django.db import models -from django.contrib.auth.models import User -from django.db.models.signals import post_save -from django.dispatch import receiver - - -def user_profile_upload_path(instance, filename): - # Files will be uploaded to MEDIA_ROOT/profile_pics/user_/ - return f'profile_pics/user_{instance.user.id}/{filename}' - - +from django.contrib.auth.models import User +from django.db import models +from django.db.models.signals import post_save +from django.dispatch import receiver + + +def user_profile_upload_path(instance, filename): + # Files will be uploaded to MEDIA_ROOT/profile_pics/user_/ + return f'profile_pics/user_{instance.user.id}/{filename}' + + class Profile(models.Model): - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') - bio = models.TextField(blank=True, null=True) - image = models.ImageField(upload_to=user_profile_upload_path, blank=True, null=True) - is_seller = models.BooleanField(default=False) - - def __str__(self): - return f'Profile for {self.user.username}' - - -@receiver(post_save, sender=User) -def ensure_profile_exists(sender, instance, created, **kwargs): - if created: - Profile.objects.create(user=instance) - else: - # save existing profile to ensure any related signals run - try: - instance.profile.save() - except Exception: - pass + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') + bio = models.TextField(blank=True, null=True) + image = models.ImageField(upload_to=user_profile_upload_path, blank=True, null=True) + is_seller = models.BooleanField(default=False) + phone = models.CharField(max_length=30, blank=True, default='') + location_label = models.CharField(max_length=255, blank=True, default='') + default_address = models.TextField(blank=True, default='') + latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True) + longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True) + location_accuracy_m = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True) + location_updated_at = models.DateTimeField(blank=True, null=True) + + def __str__(self): + return f'Profile for {self.user.username}' + + @property + def short_location(self): + if self.location_label and self.location_label.strip(): + return self.location_label.strip() + if self.default_address and self.default_address.strip(): + return self.default_address.splitlines()[0].strip() + return '' + + @property + def formatted_delivery_address(self): + return (self.default_address or '').strip() + + @property + def has_precise_location(self): + return self.latitude is not None and self.longitude is not None + + +@receiver(post_save, sender=User) +def ensure_profile_exists(sender, instance, created, **kwargs): + if created: + Profile.objects.create(user=instance) + else: + # save existing profile to ensure any related signals run + try: + instance.profile.save() + except Exception: + pass diff --git a/myproject/accounts/tests.py b/myproject/accounts/tests.py index de8bdc0..de77001 100644 --- a/myproject/accounts/tests.py +++ b/myproject/accounts/tests.py @@ -1,3 +1,109 @@ -from django.test import TestCase - -# Create your tests here. +from django.contrib.auth import get_user_model +from django.test import TestCase +from django.urls import reverse + +from accounts.forms import DeliveryPreferencesForm + +User = get_user_model() + + +class AccountRegistrationTests(TestCase): + def test_registration_creates_profile_with_delivery_location(self): + response = self.client.post( + reverse('register'), + { + 'username': 'newbuyer', + 'first_name': 'New', + 'last_name': 'Buyer', + 'email': 'newbuyer@example.com', + 'password': 'strongpass123', + 'confirm_password': 'strongpass123', + 'phone': '+9779800000001', + 'location_label': 'Boudha, Kathmandu', + 'default_address': 'Boudha Stupa Gate\nKathmandu', + 'latitude': '27.721900', + 'longitude': '85.361100', + 'location_accuracy_m': '14.50', + }, + ) + + self.assertEqual(response.status_code, 302) + self.assertEqual(response['Location'], reverse('login')) + + user = User.objects.get(username='newbuyer') + self.assertEqual(user.first_name, 'New') + self.assertEqual(user.last_name, 'Buyer') + self.assertEqual(user.profile.phone, '+9779800000001') + self.assertEqual(user.profile.location_label, 'Boudha, Kathmandu') + self.assertEqual(user.profile.default_address, 'Boudha Stupa Gate\nKathmandu') + self.assertIsNotNone(user.profile.latitude) + self.assertIsNotNone(user.profile.longitude) + self.assertIsNotNone(user.profile.location_updated_at) + + def test_registration_defaults_location_label_from_address_when_blank(self): + self.client.post( + reverse('register'), + { + 'username': 'autolabel', + 'first_name': 'Auto', + 'last_name': 'Label', + 'email': 'autolabel@example.com', + 'password': 'strongpass123', + 'confirm_password': 'strongpass123', + 'phone': '+9779800000002', + 'location_label': '', + 'default_address': 'Imadol Height\nLalitpur', + }, + ) + + user = User.objects.get(username='autolabel') + self.assertEqual(user.profile.location_label, 'Imadol Height') + + def test_registration_requires_phone_and_address(self): + response = self.client.post( + reverse('register'), + { + 'username': 'missinglocation', + 'password': 'strongpass123', + 'confirm_password': 'strongpass123', + 'phone': '', + 'default_address': '', + }, + ) + + self.assertEqual(response.status_code, 200) + self.assertContains(response, 'Please correct the highlighted fields and try again.') + self.assertFalse(User.objects.filter(username='missinglocation').exists()) + + +class DeliveryPreferencesFormTests(TestCase): + def test_saving_manual_address_clears_stale_gps_from_profile(self): + user = User.objects.create_user(username='gpsuser', password='password123') + profile = user.profile + profile.phone = '+9779811111111' + profile.location_label = 'Old Baneshwor' + profile.default_address = 'Old Address\nKathmandu' + profile.latitude = '27.700000' + profile.longitude = '85.300000' + profile.location_accuracy_m = '9.50' + profile.save() + + form = DeliveryPreferencesForm( + data={ + 'phone': '+9779801234567', + 'location_label': 'Manual only', + 'default_address': 'New Road\nBhaktapur', + }, + instance=profile, + ) + + self.assertTrue(form.is_valid(), form.errors) + form.save() + profile.refresh_from_db() + + self.assertEqual(profile.phone, '+9779801234567') + self.assertEqual(profile.default_address, 'New Road\nBhaktapur') + self.assertIsNone(profile.latitude) + self.assertIsNone(profile.longitude) + self.assertIsNone(profile.location_accuracy_m) + self.assertIsNone(profile.location_updated_at) diff --git a/myproject/accounts/views.py b/myproject/accounts/views.py index 2bcd653..0808e47 100644 --- a/myproject/accounts/views.py +++ b/myproject/accounts/views.py @@ -1,13 +1,39 @@ from django.contrib import messages from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required -from django.contrib.auth.models import User from django.db.models import Sum from django.shortcuts import redirect, render from orders.models import Order from products.models import WishlistItem +from .forms import ProfileForm, RegistrationForm +from .models import Profile + + +def _sync_delivery_location_session(request, user): + profile = getattr(user, 'profile', None) + if profile and profile.short_location: + request.session['delivery_location'] = profile.short_location + else: + request.session.pop('delivery_location', None) + + +def _recent_delivery_points(order_queryset, *, limit=3): + points = [] + seen = set() + + for order in order_queryset.exclude(address='').order_by('-created_at'): + key = (order.phone.strip(), order.address.strip(), order.location_label.strip()) + if key in seen: + continue + seen.add(key) + points.append(order) + if len(points) >= limit: + break + + return points + def login_view(request): if request.user.is_authenticated: @@ -24,6 +50,7 @@ def login_view(request): if user: login(request, user) + _sync_delivery_location_session(request, user) messages.success(request, f'Welcome back, {username}!') return redirect('profile') @@ -37,41 +64,28 @@ def register_view(request): return redirect('profile') if request.method == 'POST': - username = request.POST.get('username', '').strip() - password = request.POST.get('password', '').strip() - confirm_password = request.POST.get('confirm_password', '').strip() - email = request.POST.get('email', '').strip() - register_as_seller = request.POST.get('register_as_seller') == 'on' - - if not username or not password or not confirm_password: - return render(request, 'accounts/register.html', {'error': 'All fields are required', 'username': username, 'email': email, 'register_as_seller': register_as_seller}) - if len(username) < 3: - return render(request, 'accounts/register.html', {'error': 'Username must be at least 3 characters long', 'username': username, 'email': email, 'register_as_seller': register_as_seller}) - if len(password) < 6: - return render(request, 'accounts/register.html', {'error': 'Password must be at least 6 characters long', 'username': username, 'email': email, 'register_as_seller': register_as_seller}) - if password != confirm_password: - return render(request, 'accounts/register.html', {'error': 'Passwords do not match', 'username': username, 'email': email, 'register_as_seller': register_as_seller}) - if User.objects.filter(username=username).exists(): - return render(request, 'accounts/register.html', {'error': 'Username already exists', 'email': email, 'register_as_seller': register_as_seller}) - if email and User.objects.filter(email=email).exists(): - return render(request, 'accounts/register.html', {'error': 'Email already registered', 'username': username, 'register_as_seller': register_as_seller}) - - user = User.objects.create_user(username=username, password=password, email=email) - if register_as_seller: - user.profile.is_seller = True - user.profile.save(update_fields=['is_seller']) - messages.success(request, 'Account created successfully! Please log in.') - return redirect('login') + form = RegistrationForm(request.POST) + if form.is_valid(): + form.save() + messages.success(request, 'Account created successfully! Please log in.') + return redirect('login') + messages.error(request, 'Please correct the highlighted fields and try again.') + else: + form = RegistrationForm(initial={'register_as_seller': request.GET.get('seller') == '1'}) return render( request, 'accounts/register.html', - {'register_as_seller': request.GET.get('seller') == '1'}, + { + 'form': form, + 'register_as_seller': request.GET.get('seller') == '1', + }, ) def logout_view(request): logout(request) + request.session.pop('delivery_location', None) return redirect('/') @@ -80,53 +94,53 @@ def profile_view(request): user_orders = Order.objects.filter(user=request.user) delivered_orders = user_orders.filter(status='Delivered') recent_orders = user_orders.order_by('-created_at')[:5] + recent_delivery_points = _recent_delivery_points(user_orders, limit=3) + profile = getattr(request.user, 'profile', None) total_spent = delivered_orders.aggregate(total=Sum('total_price')).get('total') or 0 wishlist_count = WishlistItem.objects.filter(user=request.user).count() + profile_checks = [ + bool(request.user.email), + bool(profile and profile.phone), + bool(profile and profile.formatted_delivery_address), + bool(profile and profile.has_precise_location), + ] + profile_completion = int(sum(profile_checks) / len(profile_checks) * 100) if profile_checks else 0 + return render( request, 'accounts/profile.html', { 'user': request.user, + 'profile': profile, 'orders_count': user_orders.count(), 'delivered_count': delivered_orders.count(), 'pending_count': user_orders.exclude(status='Delivered').count(), 'wishlist_count': wishlist_count, 'total_spent': total_spent, 'recent_orders': recent_orders, + 'recent_delivery_points': recent_delivery_points, + 'profile_completion': profile_completion, }, ) @login_required def edit_profile(request): - from .forms import ProfileForm - profile = getattr(request.user, 'profile', None) if profile is None: - # ensure profile exists - from .models import Profile - profile = Profile.objects.create(user=request.user) if request.method == 'POST': - form = ProfileForm(request.POST, request.FILES, instance=profile) - # populate user fields into form for display/save - form.fields['first_name'].initial = request.user.first_name - form.fields['last_name'].initial = request.user.last_name - form.fields['email'].initial = request.user.email - + form = ProfileForm(request.POST, request.FILES, instance=profile, user=request.user) if form.is_valid(): - form.save() + profile = form.save() + _sync_delivery_location_session(request, request.user) messages.success(request, 'Profile updated successfully.') return redirect('profile') - else: - messages.error(request, 'Please correct the errors below.') + messages.error(request, 'Please correct the errors below.') else: - form = ProfileForm(instance=profile) - form.fields['first_name'].initial = request.user.first_name - form.fields['last_name'].initial = request.user.last_name - form.fields['email'].initial = request.user.email + form = ProfileForm(instance=profile, user=request.user) return render(request, 'accounts/edit_profile.html', {'form': form, 'profile': profile}) diff --git a/myproject/cart/__pycache__/apps.cpython-311.pyc b/myproject/cart/__pycache__/apps.cpython-311.pyc index 461c6252b03e15e02c863b9fd66c1b85e2689c96..1754494295bdab47bc1473fa1e1fe636cd0fe986 100644 GIT binary patch delta 251 zcmcb~JdK5SIWI340}!;e@n-c*i;$vSbp zs<2Q>YFc7xPDy+sP&z&hBtP+Th`c1wss=c`A!%`eMeGK*V1o+?7V%DYU{sdk0jeqD r1rdBe;unVv(5}*)RJ$U9$+e8C=1h!29~dx+36dW{qF=B`feixy4N^lm delta 191 zcmbQna+8^NIWI340}x2c@n%I# z?XqA&?G<#Ov`K{R!?2R0svd$I?xT{s7OUPP8o^IEU}NU*FEYI~RGOX#@ck zGnzdUdmUNESljrBC)yPqtUU0~n>_ohr&%GV#XoJgZhnJfpV(~)1$3Das|VDz`KOe;v(f7{ol$~ zh|y&KT$mzT4dPZ|mV;yombhQ9hveF&U&>@_WrOjszSP2h8xpx z8B#sXJrwNcckUUJSrs>892F^dUXGjhf@ znQ|wK`NHklX?I&Kjo+QL^5aEc>x;AR#!$rRhLmjyJX6y*O3W}%7!k)`+wtGxT=T_< zFUEXvo#oBrVgz6+#U7X@nE-eXxb&61F^_iDTB7q8KgE(yPd&;#&drZ}iM2n;E@geC zjwB%sg8eYh4@4gps&Zn1)a3Yzw8pPqcz*dq_u#9UYHDaJHB{}$ZgpfgN2?vfRe5+p z-N+nKu~|!Y*NonJs}d%41Y$?hRq+=BQAawv()kuoFp^4Qd!r|n#>M~!`$6HvVcOq1 CyRc^f delta 728 zcmZ`%&ubGw6n?Y6cam+Jq>ygRrm00Rs4R-0EkQvGrZZ)QGT{&s2Vjb%|lvny7x zm483AOHQ0~AGg+hH(HIJgpun%^_x-HV(w;(t+h8EHhp*f*#>I`elv831F~AoS-4+D z|Mgu0*oKgZo^nJi*^A=2T{G|B!)&a?s(5D~^OZgU7@+UjTd9xL0s5ZB8dtg2(9$*6 z0)2wjjtYQPW0H}vK3R3}9I?!$o+)k@X2mCah7#yL;1Zh-WpQDyBtDnsGdhQ0JTZW{ zQJA~sDV}=h3`S_D9k8Fl<%9L{JZ4O}!On8CeP&+}pl2n$U!W))+(aOB_C0SGEJ5A!ymXMp1@#aAdA`Fdt{a#Z(e=;F(-P zhRk(Nc?PF7J-Tc3@jVC0n~v=c)G{~OMbRxs#1N8Gmuh*j;w*{R&gp!X<&eaZPr&Xb z;kx+YoK&(1MYZD427*oW_Kvt(Ia>HqC~hymT7FsIs*gZb7chu!<;qZ+r=&Q_nI;_p mhM&5X)qVqp5m=&D{XiPxYqdlk4gXXZNclLy{J(+CVxzx11&DzF diff --git a/myproject/cart/apps.py b/myproject/cart/apps.py index 4b6b018..f3e3ec9 100644 --- a/myproject/cart/apps.py +++ b/myproject/cart/apps.py @@ -1,5 +1,6 @@ -from django.apps import AppConfig - - -class CartConfig(AppConfig): - name = 'cart' +from django.apps import AppConfig + + +class CartConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'cart' diff --git a/myproject/cart/views.py b/myproject/cart/views.py index 1037266..d6712c0 100644 --- a/myproject/cart/views.py +++ b/myproject/cart/views.py @@ -120,12 +120,16 @@ def cart_view(request): cart = get_cart(request) products = [] subtotal = Decimal('0') + item_count = 0 + saved_amount = Decimal('0') for id, qty in cart.items(): product = get_object_or_404(Product, id=int(id)) product.qty = qty product.subtotal = product.display_price * qty subtotal += product.subtotal + item_count += qty + saved_amount += Decimal(str(product.savings or 0)) * qty products.append(product) shipping = Decimal('60') if products else Decimal('0') @@ -155,5 +159,7 @@ def cart_view(request): 'grand_total': grand_total, 'coupon_code': coupon_code, 'coupon': coupon, + 'item_count': item_count, + 'saved_amount': saved_amount, }, - ) + ) diff --git a/myproject/core/__pycache__/context_processors.cpython-311.pyc b/myproject/core/__pycache__/context_processors.cpython-311.pyc index 8ef28b28854dbafdccd18b7b6ec8d342e8546906..a90daa4ddb824f5864298b525186b0495a6a6411 100644 GIT binary patch delta 776 zcmZXQL1+^}6ozLuO}E|bZn7~+yP0ZJU5PDfT9nd5wGa?W+JmLoQW0Ws+uD#OWp<$& zHlzoIq8DKhEJO?xtDuK!1wD!2)x##NBnAq-dRs*hPdb|rwD_3!%|HKpZy4tD$i_M0 znILe$i47tB_LY#~m}xi3vZwa8xe1pH(o(ZXk@mM0{-j4qzZe=`WuF?Hwyh75-$D?E$Os=KLn6<5cObn7k^#?vqTyUgQeA!Q-BUZ>GD!uHoF$N@kIK^&W$_NSAL0hRIdm z6S=`IFX|~>#|=@tnZtTAle>}9S8`eM%XdN$aGJgcuQ@1?L1{t8>r^-ROiI&}DOJUb znx+ZVijaqr!fjEdIeD=6QF;xFta!(;Sj7gcdkXIRF3?M=PUj(%Rjcs);)e3 zxVxv|gLSLtOiR`yQ7bZP@<-{aOUG^CqV;_gDP5?cSQW)~=igj2QLKXE7K+zUqKXpc z>=hFwDrn9^b2XH#qNI6!wSuxm3uS94UqyKv00UlP=r+weSARECQ6?;9;sdmlcukqCDw7o@VJQjIH(+;y zaI`M^4uWzyUcOB(2A0D2=zrk*4mKPV9jrRoBJTrX_;~M2;K0>43_ES`KX8_I{sDT6 B$@KsL delta 587 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 buVq3yG(o@%Dx|ZTp%fu|Ft?pVaXJ4736plC delta 2278 zcmZ`)TWlLe6rJ^J*IvI8J5FM65+_cZI&mH)^r5z(B2pD7O(}gKLLqfL6UT{Pon5DC zsn$vr;-i%+gmBgJ0}|rSI&KplqusMJ z_ntd*=gytGx5jSmc7Ne=IS{ngcGvXhjhEal0>0GKcT7MSVM|)fNMjQ8t>@909oqmM zSOk=@1n9(eKo@oZy0HxC!OkNn>blQoj0(CqLK3M=JPlp*bF;}yzcnw%gcBxfE2!=4 z1M`i5z?o~!312h34?kUgU}u)&TBNQ)sA#_i)a#GwBk0X9PnZx|a4g70dAhOAq#hXg z>ZA3VdDv#wtwq^)?$9CUdKTTU_0=t4r471y86hqDM2p)t`Y~@s=xTtSa`?=^W4k=N z7hOdc4$pubA!^2*3+}8RBwdds5s=6r>3%HP1QHY8yx<0}n(J#(2{=7#924FGTF{TT z)b$s?(uV7O@EYN0QP4oZ?m2vHhchA-twmeWbT!DGBMA3ybUZKMj-pt!2+{@)JlUzj%^jG;)8py*1W8jH z7nqYoi+cF(PrbX!tZB&E_6tF*^Tp<}hD;vWX?37YsOpjIur|O0(do23LI73dwAyHpb+orKXWKIo9_uB6zQBXAme0`Dt?`LmL8C{Z zPguH55$YDb>}H#9@2eoENB&_Ws)c+W&Yd0yMGD@Byn3BOcjSf-drF~!vOKsd50)&0 zG`QT+&P@GpfLb?YiSANU8iB*lCJXUo?R27c-IgKRR1VYEfkyYUpTe}<0pVU$@u+$jm`JpZK2*Z<$1!_pXP0Oekvg_pj@!Ps*f zg0OrHRcRVTwT6WmsMkQiMJ719*y;9d;RT^6P`M}ok6$38VbdP?W;-N=GEW*ar)pf_NWPC-35GoH>Rpm61~v={7jNhKOD zW9odPQ5Nb$qclV%dJ;%$k>tHN2MnN_^SQ-5<$*QsUDQ;I?hFW2?j{c@=eg=Lj?bpZ zX_^JuJDhVK;2f%m?(=6a2Uf(6lGssEB3E9%t;AN8SgC*Sjjpn?Z&lfMTRE_z94IRX zSCxY$skI_2Rb;mBt_+X3F6_T}sH6;*okJz(5WCqMT=X%ip= 50: @@ -83,6 +112,29 @@ def home(request): label = 'Featured Deal' product.deal_label = label + experience_highlights = [ + { + 'title': 'Verified payments', + 'description': 'Orders are only marked paid after wallet or card verification is completed on the server.', + 'badge': 'Trusted checkout', + }, + { + 'title': 'Flexible payment flow', + 'description': 'Customers can start with cash on delivery and later switch to eSewa or Khalti before shipment.', + 'badge': 'Wallet ready', + }, + { + 'title': 'Smart product discovery', + 'description': 'Search, categories, sorting, wishlist, and featured filters make it easier to find the right item fast.', + 'badge': 'Fast browsing', + }, + { + 'title': 'Trackable orders', + 'description': 'Order status, payment status, and next actions are visible from one clean dashboard-style experience.', + 'badge': 'Clear visibility', + }, + ] + return render( request, 'core/home.html', @@ -94,6 +146,8 @@ def home(request): 'avg_rating': aggregates.get('avg_rating') or 0, 'special_deals': special_deals, 'advertised_products': advertised_products, + 'category_spotlights': _build_category_spotlights(), + 'experience_highlights': experience_highlights, }, ) @@ -128,12 +182,44 @@ def landing(request): def settings_view(request): - if request.method == 'POST': - delivery_location = request.POST.get('delivery_location', '').strip() - if delivery_location: - request.session['delivery_location'] = delivery_location + location_form = None + guest_delivery_location = request.session.get('delivery_location', '').strip() + profile = None + + if request.user.is_authenticated: + profile = getattr(request.user, 'profile', None) + if profile is None: + profile = Profile.objects.create(user=request.user) + + if request.method == 'POST': + location_form = DeliveryPreferencesForm(request.POST, instance=profile) + if location_form.is_valid(): + profile = location_form.save() + if profile.short_location: + request.session['delivery_location'] = profile.short_location + else: + request.session.pop('delivery_location', None) + messages.success(request, 'Delivery preferences updated successfully.') + return redirect('settings') + messages.error(request, 'Please correct the location details below.') + else: + location_form = DeliveryPreferencesForm(instance=profile) + elif request.method == 'POST': + guest_delivery_location = request.POST.get('delivery_location', '').strip() + if guest_delivery_location: + request.session['delivery_location'] = guest_delivery_location + messages.success(request, 'Temporary delivery location saved for this browser.') else: request.session.pop('delivery_location', None) + messages.info(request, 'Temporary delivery location cleared.') return redirect('settings') - return render(request, 'core/settings.html') + return render( + request, + 'core/settings.html', + { + 'location_form': location_form, + 'guest_delivery_location': guest_delivery_location, + 'location_saved_at': getattr(profile, 'location_updated_at', None), + }, + ) diff --git a/myproject/db.sqlite3 b/myproject/db.sqlite3 index d8f429514f42b560f772e8a571d7cc91375efc76..314a1ec44568b64d41b9911434da4813ebddf607 100644 GIT binary patch delta 5871 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 Su0ABtL%jMaqVP}krT+u(rFJ*~ diff --git a/myproject/media/products/checkout.gif b/myproject/media/products/checkout.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_7Tq3pK9.gif b/myproject/media/products/checkout_7Tq3pK9.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_Apl5oIV.gif b/myproject/media/products/checkout_Apl5oIV.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_Fu8w9sg.gif b/myproject/media/products/checkout_Fu8w9sg.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_OIU3UZr.gif b/myproject/media/products/checkout_OIU3UZr.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_UwESDAP.gif b/myproject/media/products/checkout_UwESDAP.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_XwH82Ej.gif b/myproject/media/products/checkout_XwH82Ej.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_cHT6Jqv.gif b/myproject/media/products/checkout_cHT6Jqv.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_kHc70mM.gif b/myproject/media/products/checkout_kHc70mM.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_kXmZj1w.gif b/myproject/media/products/checkout_kXmZj1w.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_swmZZ69.gif b/myproject/media/products/checkout_swmZZ69.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/checkout_tynTK9s.gif b/myproject/media/products/checkout_tynTK9s.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product.gif b/myproject/media/products/product.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_43wNxQz.gif b/myproject/media/products/product_43wNxQz.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_6lHiVJy.gif b/myproject/media/products/product_6lHiVJy.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_Ant52cM.gif b/myproject/media/products/product_Ant52cM.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_AuUXWqH.gif b/myproject/media/products/product_AuUXWqH.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_ETEIG5v.gif b/myproject/media/products/product_ETEIG5v.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_ElMt9Bz.gif b/myproject/media/products/product_ElMt9Bz.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_Jr0cyVq.gif b/myproject/media/products/product_Jr0cyVq.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_LLFVOs6.gif b/myproject/media/products/product_LLFVOs6.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_OEdan1B.gif b/myproject/media/products/product_OEdan1B.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_P2RBysy.gif b/myproject/media/products/product_P2RBysy.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_QD5Pj7T.gif b/myproject/media/products/product_QD5Pj7T.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_R2JLv1Y.gif b/myproject/media/products/product_R2JLv1Y.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_RHmtSgn.gif b/myproject/media/products/product_RHmtSgn.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_RoWLVcr.gif b/myproject/media/products/product_RoWLVcr.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_SaeMYQz.gif b/myproject/media/products/product_SaeMYQz.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_bbYiWAc.gif b/myproject/media/products/product_bbYiWAc.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_g0hum12.gif b/myproject/media/products/product_g0hum12.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_k2IZBN8.gif b/myproject/media/products/product_k2IZBN8.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_qrGyMS2.gif b/myproject/media/products/product_qrGyMS2.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_rCx1Jzm.gif b/myproject/media/products/product_rCx1Jzm.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_rGz8cvy.gif b/myproject/media/products/product_rGz8cvy.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_tjnDy5f.gif b/myproject/media/products/product_tjnDy5f.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/products/product_vcUB9za.gif b/myproject/media/products/product_vcUB9za.gif new file mode 100644 index 0000000000000000000000000000000000000000..bdf7a77041307b7742ba833f1b373a42cb5910f7 GIT binary patch literal 43 pcmZ?wbhEHbWMp7uXkY+=|Ns9h{$ybUF?B!$NQQxl$%T=@8UVku2KfL0 literal 0 HcmV?d00001 diff --git a/myproject/media/profile_pics/user_3/samanya_you.webp b/myproject/media/profile_pics/user_3/samanya_you.webp new file mode 100644 index 0000000000000000000000000000000000000000..f3ff0090fe3290954ecb754c299cb5ec45549cab GIT binary patch literal 15226 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 A-~a#s literal 0 HcmV?d00001 diff --git a/myproject/media/profile_pics/user_6/logo.jpg b/myproject/media/profile_pics/user_6/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b68a9c82490dd0294def42cf6b98a733049a1d62 GIT binary patch literal 87570 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

5uA0-J<7~l1hzRwn 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

  • 7J^uh^062Mh*HvTx0Mv|4 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 diff --git a/myproject/myproject/settings.py b/myproject/myproject/settings.py index d0c76f7..2687e85 100644 --- a/myproject/myproject/settings.py +++ b/myproject/myproject/settings.py @@ -10,6 +10,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/6.0/ref/settings/ """ +import os from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. @@ -27,6 +28,8 @@ DEBUG = True ALLOWED_HOSTS = ['localhost', '127.0.0.1', '[::1]', 'testserver', '.flatlogic.app'] CSRF_TRUSTED_ORIGINS = ['https://*.flatlogic.app', 'http://*.flatlogic.app'] +SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') +USE_X_FORWARDED_HOST = True # Application definition @@ -43,7 +46,6 @@ INSTALLED_APPS = [ 'cart', # cart app for shopping cart functionality 'orders', # orders app for order management 'products', # products app for product management - ] MIDDLEWARE = [ @@ -61,7 +63,7 @@ ROOT_URLCONF = 'myproject.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [BASE_DIR / 'tempelates'], # ✅ FIX HERE + 'DIRS': [BASE_DIR / 'tempelates'], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -128,10 +130,46 @@ USE_TZ = True STATIC_URL = '/static/' STATICFILES_DIRS = [ - BASE_DIR / "static", + BASE_DIR / 'static', ] # Authentication Settings LOGIN_URL = 'login' LOGIN_REDIRECT_URL = 'profile' LOGOUT_REDIRECT_URL = 'home' + +# Payment configuration +PUBLIC_APP_URL = os.getenv('PUBLIC_APP_URL', '').strip().rstrip('/') +PAYMENT_CURRENCY = (os.getenv('PAYMENT_CURRENCY', 'NPR').strip() or 'NPR').upper() + +# Stripe fallback for card payments +STRIPE_SECRET_KEY = os.getenv('STRIPE_SECRET_KEY', '').strip() +STRIPE_WEBHOOK_SECRET = os.getenv('STRIPE_WEBHOOK_SECRET', '').strip() +STRIPE_CURRENCY = (os.getenv('STRIPE_CURRENCY', PAYMENT_CURRENCY.lower()).strip() or PAYMENT_CURRENCY.lower()).lower() + +# eSewa ePay (defaults to official UAT credentials in this dev environment) +ESEWA_SANDBOX = (os.getenv('ESEWA_SANDBOX', '1').strip() or '1').lower() not in {'0', 'false', 'no'} +ESEWA_PRODUCT_CODE = os.getenv('ESEWA_PRODUCT_CODE', 'EPAYTEST' if ESEWA_SANDBOX else '').strip() +ESEWA_SECRET_KEY = os.getenv('ESEWA_SECRET_KEY', '8gBm/:&EnhH.1/q' if ESEWA_SANDBOX else '').strip() +ESEWA_FORM_URL = os.getenv( + 'ESEWA_FORM_URL', + 'https://rc-epay.esewa.com.np/api/epay/main/v2/form' if ESEWA_SANDBOX else 'https://epay.esewa.com.np/api/epay/main/v2/form', +).strip() +ESEWA_STATUS_URL = os.getenv( + 'ESEWA_STATUS_URL', + 'https://rc.esewa.com.np/api/epay/transaction/status/' if ESEWA_SANDBOX else 'https://epay.esewa.com.np/api/epay/transaction/status/', +).strip() + +# Khalti KPG-2 +KHALTI_SANDBOX = (os.getenv('KHALTI_SANDBOX', '1').strip() or '1').lower() not in {'0', 'false', 'no'} +KHALTI_SECRET_KEY = os.getenv('KHALTI_SECRET_KEY', '').strip() +KHALTI_INITIATE_URL = os.getenv( + 'KHALTI_INITIATE_URL', + 'https://dev.khalti.com/api/v2/epayment/initiate/' if KHALTI_SANDBOX else 'https://khalti.com/api/v2/epayment/initiate/', +).strip() +KHALTI_LOOKUP_URL = os.getenv( + 'KHALTI_LOOKUP_URL', + 'https://dev.khalti.com/api/v2/epayment/lookup/' if KHALTI_SANDBOX else 'https://khalti.com/api/v2/epayment/lookup/', +).strip() + +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' diff --git a/myproject/orders/__pycache__/admin.cpython-311.pyc b/myproject/orders/__pycache__/admin.cpython-311.pyc index bb5fde2f82bbb160c9637e710e47cb5b1bd45818..4537e0b62f7a2f9e7ba7223863f4907dfe6796c6 100644 GIT binary patch literal 9356 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 JMtrJ={|EGcjRODx literal 1192 zcmZuwJ8u&~5Z=9)-%g0JfyM+0ijz=WBOxS;D2gDVfa;pl<#v;txrf=i6LIGvKfqmD zsvwjX5>+}!NtKG3bIy^K>|<_sX7<~eZ|A<(YGnfLNxRnlO$qsjo4gq} zi_2fII3kQN>XU$4loF;e)mH-5QUlG>C{f4;VcH>KI;UMd2RK#n6s8)7=Td#uVSuU#5e}^Np2!m2|Tm-QT1((Ja>Qv*A{Pq*oz;DSvp52lS3eosVQ?k1fGlZZQ6W^28^Kr%Cd=<#C^gL$7+n}hX9 zwKiDCE|zlF`x9RU^KIggw8|7nUbS>?>`|-0G@wA2<&1*2$SmZocuZ<(47?g~;v{J- z>piC*@G!9hp6o|VR+1=je7h$+m&>v%xRY>ZJBg`?CI*Cj!|T)$#I{i)U7`W%ZL=s! z=!112Dj;Ol_u|B6UflDYzN}=sUC&P-fLhEQ;qKeJ9`{+CaUu&|_Dr#;BSJ>NGOku~ zfuQjV5Vx$IHLSt=$;#T`-Q?lR!PaD{J*qz)Y+#=u;NfkvBI~T{gnQAN8-4dC~7RMQRKDuvA4TaXH|OqAt8^RPYCPibpRTT?}& tt5b4U44dNz&o0n#h2lab%A>h|olxVj{FgNTkj8NHl(fgBJ<3PM=YM)?9U=e# diff --git a/myproject/orders/__pycache__/models.cpython-311.pyc b/myproject/orders/__pycache__/models.cpython-311.pyc index c7d90e2bbc27e47e44c6b2398e5f9d04e2f99609..4e3717ee238759d77837bfd8d0996b06d0b12a15 100644 GIT binary patch literal 4682 zcma)AO;8(07M_ttf1p1ELV&@@{MeSWnAou$ll3~rfWWaWVc8$5svT~F3Tr*9_yBjC2LJu zjk+}>WNk?s&sn%>jtI{=Vx!h&dyUa6E64o;uUV1~17!!4}Mz-yMI+dz0~ZQ>@LEpHPS zuYvK^F+OS~{;jqq9r+KT1QIxeYHLEZla8%m(|Um>Oebj}p{=f__1c?I-AAH2J_r?T zLb-ug&!H7N4b%Z`f-jzo1EsGhpsQ47bL);re3>1ZwV8mRZD z+)u)=V$0TvR|4Dyc+HaR`#{|BCfoq=9LcZ$gLW4-tZNXgYp6-O6J+=~mmHvjRdC+E%&b5cHlp)H_U0gAGP>+Z{&0`h=e?V0AP{(z!*3b^>i-R!S3w#~6XZ_)>ah zg%ajA+pbBPNk63wdQe>v0WkJ^xfPt^g%0LKf*uG5qEb2oNHh)IM&tBrNw?ozk}^tK zcSQ3!x+1OW_PD~*D^z#fSy;%Vb2MTDsBA!=RG|wss9c5SP3X_O?#kyx@E%m532-28 zsi5S=T>fiOB4iJDv4_SELbYV2XCg^2rWIND5}Hb9rHr_eky2FN>i~!$e8g(vGBmfS zEa{HaQa%j;-9hMrRLCfXgnI=Yi;4#A#`SOh2h1<7$Bzy>=^FrLUBI>3m)!q|HPi81~=sO_P$8=Pg$ zalJvA4m!(4!(GDBTi>-9M}PJmS%+K5#ScQA{+2~R}OGgWj3pu4QN}tgboB|vDI?tZSE1==g?CJ{3 zFN2y!jj8ge>G995tm*=8gM9*QK89Bg0x8yim5vh|pRYUd$HriU{T@iFCL`22G))K# z+#8$?0ge9?w+uD2d=DWF+I9SL-SL0V{V1R=VrvdV8R5Y-Yj`9K=Wj_9T_`|c(w#_A zWVmGlobrN!uYjuzw*%>Ir$D25ENE{;8QL0;Ac0dTz>oO7_==rcfUOY9v#0c=bZV0^rz1B&ZSH z8&8ZU?#0E4nL9Tors8^M?IareSrljBt=C(kc}CNVxtnyAp%Qe*#CUvSd~%9i#g=Ch z%sP?I(rB7yh~Dzv&UN>s>Ho};Rwb{XFJ$2Abl1d^#LRxXtVl`$yk+eio7-8cEaeHC z!qwVpAVwD;IOKp;pw=Z*Sq9CCU|IDWmntwst?CYp9N>I(*8=!L!};j8l_hZax+_7S zDdt`r;LaJa(Y>{EFs~Z>0v2aCaR=@75h(@SrPQjJMNe-;t5t{z3Y882!LB3R33q;l zGG&#`Ad6c_E+aAg4B9xuB+?*Qk^c&ptyur7Vr<`SJ8oBno_#MD=&l5MD($@{ z-EXz`+xIyjs&H)I&$;{7FKMm4FA|&gw;rjjSIVtdwAL%d$x7SsMyJ*`T)LpPT`sp> z*4i!?zo-O;H%@AS;Zk5{Tn$9afv6UU7H?KOee3r%Pv2&s^k{cp^*kth9%!Bi#b_ls zym4O(0$%+?TzyE@;6gdLpamC-vHDQEdiAavoGSq0r>5jbU)Vd?3_>QpqSna-B?!K#a z-&KXq25uMC(A{$At`>rkj*53+eL?dMYzn1G)jL-9j%nVp;&jCy-mq)_@a9BG*_l)Q zGiCpb=AS9vsJMIAqnf*S(^4ARv8e8evU@^vPZXyr-s8yV_{&7;yz0GF_FmGwmw-`C z^!Dw^-2pXtyBxf&1#g3ZzJc|pnr~oJ+TnLQ)WnynZ@%oC*L?HEnTmf9S0CK`YNu^? zNWC|&`jcgUQu8Na13e=zPHH_P+ikn&aF&=-dq}y5Xgx#~Lch7(zQEfC!IK>#ud(m# z`vE&|`wVeaV(0AMeT&uhh~MXszP3Wg^DnDiEygHsn}JcJ_0jiT=74!?@t!th1NG0n zZ5Vl<4M5UqT}B^b6lx>2rOVfu0eB3qQoegMfV|Yor3^b-*Mj^tMt?84h)j(iA zX(Hg$ZOhrj#Y0?>*m_9|crq|<7{@43)qKb9A0@H$a^PQ0j~$f-1mZ(PVL$NfV_8>yx9X#sfXu4tl*8SQTd;1#*LwElJ)tiLl delta 1281 zcmZuxOH5Ni6rI=i=?D6yuZSQY`BqKE#044y!ImPCUs7;UO=@8#rC3@rEhMn8B(gBk zO*2s!u7w5NYuvdqaa9u+3#Fgz3Hcc4*}Pq)9FBb zb#yz|@2e%(oFtVV3<7kNUb{QBjT|PKd{8o!TQZR}-rRx0aptQi2qBH*s88#_qDGsgkG0GM|sI z_e`2s(0sKE2#&Amfo&Evjd0sO!v3a=AM5)luH!%q1=|gEfnqMd614CJkStDTQ`Cm8 zA;bg9Vls^>s0i8ET6%MnU1{%J1XN@{lv&BfZm9j^Cz$(&9A1b7EmY?= zZRc?E5~3(5i;$tNWRlrOW~Q5GIJHYq*-!PO+QZFr?7h~l4MK33ebt^^7~-a3O(gOK znn>(A#l=IXZYO(e9hnC5d@w+J;YWP{7daTN*wWlm7#!%!*&FaRL#1h=6ufdatD`}lb6)jw5> z8qoIUt1kAUCFN>+M=E;cvmW`PNA~8~o7Ne&?HuzXNxfMGFpEMNn180bzW2f0(N+#8 zFt$NSh(+BH^#FKTyZhP56>jE%&`ZUY;F`N$A2Is`E-G|d?s5UDMF)ZlEE|#`Rf2tfU`szhXgLh1}BLjaSa=NV%D_QUcp`}9@~;lmE|&aYY*<>gtp}^@78W@_f$KW>I4b5QmkE9k_sJJiHbQY zzwh;2Jpd(o*ZWr*J>R@}{jPrRd*A!6_wXHuqmaY(yA6)%FZOWUf1)4h%ajUyFs0+T zH#wf;bu-+U`mGz&vETYJJ^MC{8Q8aR%!qIOjA_<9W}dZ-S#*@%Fk_u97%P}994lnM zjWf1c`uO*76}*O+V8J?3V=%`-)_o-q##TV{%9OU6oASU2Mx^Gs?2LRpUk=#7SMWOgRq|DLjQoz*^kaMYorrJb zs{!}&e!zYFF2E*!H{gE02C$j01#IE#09*Nbzyo{(U>m;&@F3p^c!<}HaE<$ZPA@Uo zs8=jKp^5Npa7J+q4_zAU3G{cK?+aYIh$jX8qoWsl1z}!Lte1w*vk*lu3NxX(iFrPx zSP-0^56@9C!=Xy)0Z;46~C##jtR5QZWeE5w|#bLovKE#{(?Bq8M%j5qD#r zz{0f&bwpH{9-t3u@%!^YsSrnK1QgQo`a8N+?wXD_yjD17Smkc$#*F9;qf&e^cyl&1 z7d;b2U%r(U_ z8;V4NlOYzX6a)ejGr>qC5QrF&%J28DJU-bnH9s3_SsY)Si!Qc=ZiFTlqw_+`^?Bjt z$U<-;)G~W>L71NoO+;Jf1s(&`vY_@vq^#3XLt%R$ z@ae_ijQWICt~gTfG!dGa2?QE-!XB!SI_?>v5m4Bf23~s53xJlS|C0OmKjQSJ>R%lQ zd(-7=aEpi)8~I@bwBsJlj2;IP#_P4jBA)XUSyPu5SAdCzLB)Ns^Z5(CgQJ1&OT)vx zgWb<7hQW)&Kn2SrP%#=61RHWIro{yy#=D%_Q0fZBof^8p#G)WzhTaqoBf1iw2w@Ed z$maRVF>y!Bx>vFtm2F2iY#j+(hh#e~+fIwd)2t}X>(Z;T*FA*5lV5i_^Kx3W9^r%< zWJKGIgm~dN zQdHv;DF&byaec)qyZ1`AeX?zzXxz88>9pXmre6WF>UYvhh#r3+fQ$*&sx`aOZLOE{qTmpJz;N` z>>aYbBlWC#T`$=W%JzdB_Tvframn5;+uJ`b-=hLkLE$e97Q6YE9Ka*aVlr<<%K|iy z(BK2GDF5H0<)mQ?BAEu2qH|z9Mh9{U1H+@@RQ$l;!015dXfH#ZbmH?vL+37Cq$uGu zx-}nBie8=y&P2nxm~sZmn(>Lu0_0-Kf%P`Yenhq(*|48X*iTCKQ?mV3YQzt&4@>rA zvi;bG{Zzt!O0qvA+n-52+cw`Li;=LwOxOVMh%=|LA(sebmJ22dfJ@QQT;b3Zsf69Ru@m>-`8 z9~inx9N4ws;!IRAql73p6r$MRZTxKgSL~_9;+5dcVn}!v&yL{}xel zMM+=OVm9fIsgph(kMHSBI>8>@Hhu(XkzHWpx#*Kg&sHuCYQ(9|Ef=3RsJyW}lO|5c zxaHEWb<4V#Zo!K7n9~Utbi8R9ylXrMxzf+_SIT8W%n-L`pJqe6SxXQEJ#Rs&`rm;N z7Bl<~_m%-jR4}OcNFoVb319`e+&SFS+e6FF=nz|P9_yL}ni-05DjHo_ayDO^2}Wn; zC&LrX!G#6IM6r=2!- ziK)#0F4?k^5Uydydpu8@{s%-`SrYlzc<7Z%DlOtn3@!@Lfsxu1LNy**CT_lyp>yj$?7l+fIC~ z1ErHT&xWlsVXKsEJ7n9Am7b)<_W9+{E{one$x<&{>Z#uHWKr3wIq57BZPmEfQs1Jn zTE*@R2|{}b7Z`R=A@F2QE5>QZ7-Oq@OCQs1Pr&#*2`QhLfuuavwKN(8!Y9^$ig|{S zf=0dY0^$_oLNGcNp@wEiMQ}VaKeHHB`#gjvL-<5m0caiY{LEJ$zb^S&WM7L|+@{{^ zJ%4oW_s-onNQZjlLp_qMSGM(v#@?-SJVVNV6UAwJA^**{mkD!a$o#j@qEDOHte+td+j@y?>_g9z}tZz zEQ|J9$$mk$Us&ngv=!a1TPs%4P&Dq?idjTc7-kKsbTdOMInYEcHi25`w(nOh1^mENSq_4!vn`>ML${;aZ1w9vij^4vcB z=BYPMz0+{F<{M3KH~nD8?Nd_m8Mzn>cfaiF7p?u^_ivltvcyeab>4AG?)nW^Yr@s~ z2c`Flf4A!QtNz*{x>_aIbF%9>$#z+`T^5a(Rcu2GG8d5whHWH$U>_=QD(V{9(jpKKf`x<0v5F7TXh8?X+0dO>(r1PiJ0fd-TgEOi#l!^l&eXW9iq&GfYFe zjr1MUMP1q7F~f9*L4cABLz3lo@hroiPG_c_CYCfK>>};(=k!_ThBw^N^Ts=dXf_Jm z?6f1DUOQEJ(;dAwM#tTnAkLfwUJI6YesLoD^IxLVK_!i(uTpG$C^7-HMKnA=hiS2h zk`)^ve2PLU_Efe2AB+Z(t#CmIPlVX7GzE^{Y;>xui7TZfN$Y?Ffyy(5qoLV|;)L!G z3cG+10*3?T$TRfJ3?>I`37cJtiIpwH@IZK#z-I^$MhpKO0BnniY5UY>7S4p{LIJgG zBm1It024UHVtWJG1Vr`&YTjE&G=Wd#Cjh`z;#3+oT>BHQ{gSIicD1bZCyR<#&L-X7 zFWWZUdlT-xcaKZ%!?OGEhWmKJjc~i{Zhyo%Ooa@r8k1JfhP6ClEq`R@b~SF+w5=cd z{S)_YNHzU(P5%Rb?b~+Qe<0bg@9mfj9>{pV_`XqY=zU}|)cGE91T2*fiVGdiM;yQ}4EBP;UvdDCvY>*q`$VI6>k5?7B9#CYwX3>z0!3W8 zdZ7Gi@>yM!_=D7?&8gD}X3)z3tFoHmWqs}n#T$5IOgBx#!>+LIJ(G5lK#0ps0$L^W z#XxXf=G+qS+wzui*_f9rkB1;W{4M>mi8n+uQ--FlwyiN^%%qvjIW5(u{0F7V5C&~o zd;z9*;iQhY@pj&Er(l`hZyQ1(xVDdvnR(|)^k%d))v5TJwx`2c5;5&e$MLQ(7c;-D z`%N;WxCbAXk1#s#4@dlS^HG0RZP~0?B8w9f(9wfvsA_e^$|g@B%)=&Pei;J8WaM$- z>2zer(ysal(u0T~Nyl$=_xE<68@eetLrB=b4!h-*Eu!?w8Oo zm|Y?v0eKYT1cVU97=)f5=9A#f#sb9%4SPuV0wuGh8bo4;QmB^0!o?FaVHiL_RIY_c zc?^QUE7n=4oQYm3C28FZ7o;4#CqA!c-8E1*E#ujs=l69It;jbgwGDSVki zMtW1lq!x68VyqC*CSIOjgz;%a?L5UiA%s928!b#25MHNb_Vl}xWT4nmFHb*&uj0Az zHA+MSH8UUNBgA|X4aB8t8cNk71L?{FseuySLrT&&M0R89f)LuOB->8e#ss)yo6ZWc z@`&U-Dm#yg)}s%NUddQ08%srF>1J`o+HtA4PA;xnIlt*CUu(QOcF+4~Wnxp8=;@X` z-Lj{9<=m!sSG?iwNy&Rm_8t>GpT>Q^_x*k~1c($R{&?x#eNxF0x#Wmg)T7=jXF)`Z zDmH!l?)FN)HrdyfEZv>-`8TU~#}B`K?5oRnmLHZ?uJzvO|ElATW3#kk?eLurskBip zZ3IE}f;(CG|aegb=vCucBa zmOwHdQ0q9pgl`ZazD*!p6o|MB-vNNA6#`v=)e|$lFgvN4@hXK<<>@3_k!l@9{5C$3 z9)M3ks?A)aO7;APZC}E+@9tUE(jyv=Ze85y)mgXyIRYQo?NCh-bDX-e$|x*)G)q#~ zHj7?{4CkwYu;^ttIFQ@S&}^?p!ZN1Yz6DwhCL5fkT`6*WJv2TwKmYPJWVz9*4jnV3 zc~h*`<=(D-D3ep_=e%K6ESJ^N6c@-lND=tI0ETuBVzTgEbbwM22~W-iqp((KF}&Y{DNR(_8pNMgj81_Zi(gQ*wO|DPo?{F#>W*a-No*r$y`O{INc@VQWm-8t*o& zAOFFWeCn!XdqK9nAR1rTI?XcUeV#Eh1sXkbR$ka5TI=Qx)@a3{3^vqq!Y&xEIj8}3 zal)l77tIIiAoa@U%O~{DLv*^%-7q}QUDs*!&$?U;(K0#0I)wcU&ZNtx?|cQP;MKAk zydf(9XxRv;S)Wv9p4n?lnK??-ZOY8BExGN~_6j7VeOJ+^%ldpBeAJW8mDdMFF#}i{ zQjwZs2Hu=~FH)CI=ymAVTTQu2h8&qGk8#T%6{sq5WwK99-DnwH@?DyHd2astoPSbv zq40;uailrigf&qyt6mg}gGB~XUJFb56Mm+$ZL}%I=?HiRXdkfhDz395LxXTj0oS53 z1)b;x;Vgl31O^Cvi@@gq6yr=7N?8-XIJ*#mXaid_f0Ip0VUW@=m4p$Y>{9Lvgl?d$sot-h+LCCa-!wGEl~kKKkfGGiUYOZg}gEWbw-u|0B+7 zYJ__Bi|t=%zkNfp`DGj8bOn1ii+#7RuicPK_ejN!a&e<*&m{YdWNVOZ4V3JFn(Q-j zX^T|cDi^nk_SR&@uCMR^+WxP$+-ZRiL_re+ub*A*zU|#~m9N#kQzE(Qp?>KZLoD5gJMN8t`t33`EV}op_eYzq;#*5=4U%iO?Ajea6z`57l3ja5>z;=;=j!#> zPu@DYW?U;?GeWlvrCx*(>9ZxJ+?)G5EruVOb%2WDOz-H=OYi`rWmXwVm55rVLP2su zQ7ps|f}xwhIIxSxkJcKtUhM{irx=_p!a4{g99Vw+KhxrRIv)u@2xkSV?X@BKbYt1f z>tiO~NP+?8nKx$Ip1Q^I6n9wHa@IVoTjrQ4MnW3e|6O_qb}d^#duj1WT`^0{_?}ri zzYlZE)|hpBDyO9$+pn2h-lzbx9DmwcbljY+hC9GTjMw!l4c2kbb2|LZ{WfSmX`xaV zDE*b?!dT%yrbWEvJ*&33g%|JahfdwwnoHfH}Q#58i$A!$!|A59W|3;>6#pWutETnjUB7bBsSk<7@_ zu9UBwKV<;(UxQ#5;{9Y7^OK#<|5(>7_>p_5AwTKF{NfDHgyr!NzsPBDaTOelrwN<(W?gv47~jMA4XUpfLbFc83*JyA#^(I4Rx zX#{7m!acCMMNjP`gTB^MdTW02$9%XqwlN zP5g3vQgk#+j%L}>OiRtd^*zbr$~QaS==jpl0qs?bdIK-g?Q~DSJCt z3pbs+HtoCPCnS5bY;P9rL9s0;KKH!*+=~=ocd}$B#9UY5FF1f-5t*=dcRr!}4p z6_wygx{6i{9vKa$DV;iGwUVn^c2$ek>Ku+@idC0}thxblDry9jM_v$}FG|iA zW#@|`KPg%#)74E;b&()Y=7;{Gt^?c;5A5lxGyJIBj_{A_j9rbEA2k{%+@z!MeilAZ z*lRTWsJ*ke$7y)q>A;WoD{FgB8{R){Lii{4;$A=Z6Thp^Y4}M?MPGs8&kIZlXO?AD z#u@Qp%kmfkv@E}-5iIh>iFjsdrp)OpU+>wI=Vb@c&M>&8T3S0k7zcQhn}ihdLK8VC zd><;(c)DE8w|3q9e%aHd`;z|FewcR-p(v2UPWsX-`sP-}bS)g3;d8~k$Au?}7bS{z zYN;teA|c!XSTg4C8i6J~5^X*?GY?mn$SDNUssBBSjT{A7;Y3?Vz1KoNy+onQS2r$? zCoYdmmwEXzkC@foFP{6txz{h;x{yiBq&;DjHBM!XpQo@+@oa5Gt_Gs)NsSc#Bl7<{ zd?Nb+;7Y?<^-e_G*C92Wk{eEKH1s4IdhU-%4Fht+02(6MLNXE=Lt8Zs8P4rK%A&D? zS~~{~@)gODhmMi6NQ`?$CwR1qb>`W&aSS?K2yla<5 zTP^NQPn}qQ?%omrZpm|A_M8{(=aW{)7wuoLuN8{k6S(7-?~ciJ$J8H^wOzKhi|kI? zoL@Zlg=4pSUq5{dUcwbyN0$~*MgYJzVsvvyHdm{#{Rri2jW8!O+69!Gx$@IRsn*n$ zRp)8-K~H0y1SaN~G^R89tSxfGwsL%atC$8#_$k^&YWJzx;DlnB3tbof8ZnAxDj1oX z36H}tJQZv^d<1Msc#^hEn8^|7$RVX*{Kz4dlMzHJ!a#aMXq}_Xdfb30;Xeat?d!z> zswSWo$y|z#91{K;lKnj;y$S&BlB4L>mD|%BzJ`Ra;jTsUwaUKM^@cxc{=Me=rBd5~ z+&1vnNB`=Sy_WnH1ByG=DjhN)?)a1vb-7w-_;K?PcH^Q ziU&|yYDy_a*w-UZl=tDS5*8v+IA+0d7!C{{Am@L@C-MvcXqyYXg~3$Lz^WnXE`8JX zhHb4|a{Fbsf7O(Z%;^ z4X&y=0vvDBrqzmRco(wMWu`hQtzd=xwUx%Knxq(m|6oiX^`-kJ*S5!7@f0>ozJM>h zQ@Cu-6$dprGJ;{WI$I7zdoyp#E-Tvi)BZwA`$=Tgl$sIwP?A1clPy_`Bd}@G9wq1C zLCx>0Xa(eEfl^~P_Ig89S0O$>(bun zd^9+da!zQ1GHfmaeHhst7Z<~PQ`%X9B&5bd)yttSLFhR={vnvUl~Ghu8GyP0~x>~V^X+6#p`bCIMqQ()i^5Q5^UFx^}jGR-O{ zCVZa~k?TdHN9dyPP6FQqfYlJMgHDyZt8Cu1y0K4e(^|S_j+@1XcG-VYvUbSUj$fDzm2jU2 zSm|4BhuQQ)J6BpQ`}QY2Wl3NCW=XA7QZJX(W9J2V*sCDzW{*D1TqcAVJ^l!>5eGX7rZJc8%$H$opu|gHK*&#zOn=KdD1NAx)RlFk%4cnt^>e$S`pID?pz!g6 zj^?%}&)^U@{?<1V4xsJOXdg90ldk`J~A1`6W^efm7JLk+ryL?XU zxAeCfAou23cq^;s>&@zMHV-$j+T>uSm{% z*;&78ST#V8#B^3ynGz`t+0yZ>C|yQ)D?F6 z4L`KGJ1Y%8tTa)$wxP?;{mAa?I%@dQZg*Fk;YV#Igf+8-2qGi@s+a7OB#~`4(O`_W zURpu}jT0B&ng}s)*2{C%k3UU$VEF}XeE})VSy1@AB>@hFIb=R}Imt5rxpM7RM?fv% z#R8PW@Mqb5+VQ1Lnb)p7CLbgkRuFi}3dE(U(i$;sOSLLNOw$3TH(}lq#LmvD%9Q4% zmM5mtSPZ}^hQaai&DhC9LLgJhsk|QJ)JXoyVb}f+KjDD}rCboqq$+c#RWYoY)I!CR zCb>-QqIz-={m;&6e}GkdGmoZa(+g!7U@~||h|FMirv%A!cRiB3Np?4FxZ4u$HpzWR zb{|?9NS6D*Uir03vF`Z2HmUrSTz+b!yeCoKBbE2b<$a>j_duP^XLTYxSTSwRs?(-l zat_GO0ns|}u)HbDJz2zE2PNwv*?I_!Qw1?j6=oFjVIgb<@J17>53C=TY#p+#gUY(3 zmNgLe5$q0y_>?M@1Lgw|1HPc6n(se_WC4ULvG>MzqmH=ywIB-GuKS-={@r<7z$Ir*Q z(?B$uZ#g0X2@Zl8W36~nOLW>F5RQ|=DLjQa364VH1!l=X$*;3G;9w9w+}8BoFRe1C zB!yepAsJnSwiy0Piwi+RR<1g_S+)1>VR_$4sj5S+>PY(QWdAX? z@$?a=?ml(W?o-BSJ2`h5%=8#g|6n(=O@0I8TDsG z3oYHw>pP>Syxd&CvmC*|L<*8^TeyWee`2ew|DgVcdPS&?nR7j$vK~y^wkXfWjx{pJ zr8{4QTeifoT_}q`*$`i-?JJ>7gU7a*g)hvieLzX_ECi@G`HhYGN!@K?YZkG2-==;gJsm@m=x%!2QUSnt)AyP(VW6?&@ovBj*s?`5_M z3MRgE+0K_OJLZZITaN9ECcXkOm58zORS4~fS+TzDgeuh$v&XD4Tg;HFveaTv%)wXR zF=O5H4+^ArQWaRF;asX$`LKLB*`K54^M~QDF)}(8N=eZWRn<%>PiKERGq#dWO!=co zNV}CH(Tqfkvur}M3sFCI6yY)0K(+~@nJvCc$G0h2-DYT89z2EKtnl4dpUUcoBT2LNlN>wuFQUQWls6Lobc0LKU%Su+Mm#K zX)!*PJ@d{vJ=&boLw2%Fw`vchIo(v>K3xwew$z(;lkU|Jnc$aBPxQ_#WW3x?buZ#o9e|;o|w;(O$)PF&O64yngzXGu5WHUtC+9nYr0~if~%7 zT8>BT>f$pS^~VzR$E5lba{UR()h@f*!H61b<5whOvutb@ zjm-~AtKW>h5hLA)UMg*uOWQX}I}@dyQfaqb+6`@X(pE{5%z0IkIV(BO$JdTZkS-#P!y^XohB zd*#kysdhxJ9g)1FvUhZ4aMRn0rIwZRLdp}z`r?DC z+OMDg+WEUX?|G!ElXBI`jjFChRhLxNBUkl^#`2_k?#QQg;;th<*dw2~l-PAi+;xeS zGA}t7WaoltU3lmNOE38j$i4$BLk}#z4NFDBQn7Ygvh0&B`{;E;>g!J2uNI$uN$w1a zyC-lEnBPJC~r!XH{HFmE=c7k zohb+`F%^VeblHQ%UhKOWw#UqD$_LJrSs2m}d%ZN|^7c=G8 zCq88@4!J^+cEQ&Q1Te|#dHu_n<{(R2;UiBphEj)ioo1M2uo$LXAMZHF4k&wqQ9u0mAQDRlQ)$RE7^dQgKM0NKTzGbIHp@#h zp3y&l%|9Gz_8(|%UNXZSpm%t`@ITONKPRH2I8tY!seFLy6JQylLqGjBbTXG3&o%?w zuvaaDlK`0IeTFg@Ei4jCjPr`pTa}gKyeK*b0lVQ|rR1iCsrk8(@D9QnRXnKynZar& z0x5%4VcK97(|_MW$A`i2WJ@_*sz+wnh_gUXa9~Cl7b4gZv$T(nL=A(D3#8sG&EsYL zD>Fu>x2T9(6agbs^;PwLcj<0qy;pqhQ}`J-#4lwYFr}B`$n04T&t01bZ#y(HsyI3q zvHw{JFELm8$K-b8hgs~$C^_pO4hCG^?alg+Br2Rn6y|SaMlvlMsa=loOr`hZ9J?&b zs>(yqRG&rTRj!n{HPykPQaD3(Qa`dYADAwZv6sx>K`>BCBLNcu#({`Hr2_dC` zIC18eD!fg<9dy7|CQh-^K5H6Op_@vev1I$Lm_Acwb9*VShrqW83=rr9fVz|%;Z>EV zOO;x1fNfwQ7>)#mPAZO!W&&-q5`IP@_KN55GeS!P##y~op0o4`11(%chJQhs%0NPh z?abME-K{b+oszRlc6N!@u7|$5cu1~4`m^H$((!Zh@pF>zyzD!VBeE>MwUUHohiKWs zn3&6w^NQ>wJJy4;vvDuBK$V@v{k@*|&c1v8z4LO@$$P{1g7=2yre`*q`VvijQd7U& z)UT$(F%l2U>*AB&yT1MzspX8^az-lem&^M_--~pQJ}-}6Rl}R5NB?|R=W6RQv6eq=M#W@`XA;(NFv-bCi1h8@eTeov|XtyPI)xTXK?>eyRxIHOZcP7~+xc9Z>bfR)-{G)k9Ymvo6r7cQ9oni~Qp5-tU#kjotXB+uaA(3%B_f9KbILtn`2A zdl!qX5t+IUUaZ=IK1$kKI|YzQe{xbIiK!*yX9_$x|!Kn+wlA)mYhn4P!+L@rqbMZtdH)*PhQAY81*(8qGWf zy|xT&4tyGnbZT=!{hVi}*xt=vJ1)yM@cpio`q>gIjF@;g)XYUp1#RR#Oa)zxm=dOf z_9Enq86kU>rc}^IsG#*v9(Smq%a{tfd{7_*CvzBB+Lz*YpU5SpRm`M<9@Qv%Q#sQK z(k1-LI_OvW*N3zWv*&NhUx*%V5xG_3b@=&jcLYD<&m0IMQtWwD&y0s zeHmZ1bb7n~NOS6{iXE!^k5Ttx^Wrre5eW|`XU_YO0=S?%y;D;lpRJ|3RP)mB@G**B zfgJ--Fpy%{dG>p0PpW`V)bI-XsXljpKMKu+Gc5o(ODM|@ccRk;rj@0IGKV#d;(<~? zJ6+ka0!ra?bZ9UO=kd^xcTyaDRxNxKxp6+*>r^_e(25IZ8sZ;k;NVOg`3m+PCy=W4 zdZvHH{!n!fYuaTxtAI^0#Ojg7t(Ta~x6%^0Psy}3h^eRiDQmz35| zRNs12>f4vqbFouzDU2iI5Accn23D$1Vx%9GR^DD(6E=K%623i>Z?Ejz3ntoDK@8fn zD%U+EIWNl2i=y=+beL<0WoXtakFN_G70)Cpo{=iLk0q z^GlL5C_96qHTb|+_2%>&)A60^b{Cb;pB629aKnMF;04`gZNpucRC`RWJto?B;r?jT zUH;Yyk)4Nt=XjwEWV@(_CC`ZL8KIq+_Nyr;H>5xaM>$mPy;~>mZU0%v1*v05?ii9P zF3J@bS6xY)KR%SeZW-G_R>-*InUFmbqJ83l#m>(8HJHM>&6@i7E8kiA=91XfdtZ#dXR6QqEU6HG6K(v-6M?iFafQ~J{5Ptcd1%+Z&giN7d%&Zu{;zI1QW zSC?_z-l{K+(2o5d?{;;!aX)S=>M1k4Z*cb%8{RKAA*`OTd6@Zl3O}c5_;&>UgaC=V zbW}L|S2pY@Q}r-gJGO6Q%T+VmeXZ{QCJs(X$HN^5QZ6yQ>?C2unM$ADg-z0^x|7_- zPY35F=bOn)$XIq9`KZPqOGFi`Z&2z8fo~9C!ueqe9VgI5fRU+ZDfAKnCX&xl=oJFw zvBb_hV~2_f>-6&v3EU^Zqy^dmsBS}GzHT4TPue=bTuYe;8uJ%oCK)Cm3yccV49`1& z^s)7%`ma|`31K|N%|-qe^BgwrfF7OrTaEwa^l<9PRtcDD<>UB6PE&~dU zx+_SK1D!fuD>WentVKEq#Tl@tN(ZOh3^--f9i!YS;56!9WTj=G(@oW7Ks~p+VcmF- z|0(v5?$Xi5^C!T5V8u1o@(i?^buhtYfJd)8L@$y8g(e-29LNB7HFZ@6^yoY~BC$De suR}*3h&j+-pgTZ)mjY$&R73{Ebo=Oc23*yd>30Tr4$;r8fa&-CACPl60ssI2 literal 0 HcmV?d00001 diff --git a/myproject/orders/__pycache__/tests.cpython-311.pyc b/myproject/orders/__pycache__/tests.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab72e21dcd00398e3f0f6791e91903d1ad7e73cf GIT binary patch literal 16491 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 m;P`W<_bCaW<{sTVCstjtZ# zE731XEh#O^(@!l6V)7%*iLFlFVbNg4V1*~R+B zB}JJ9srtA0AdGmZL={JIX>xLEak2j7!;J2Xe3QAE9C(UA9xmbo5&V-qm}0oaflNjq zF6LsKyq-yt@xkPiO!1RLn1u~*uy8cET;Nn(V0uN_Y)AYB7T=33zE@a$q2kI5La(S= iUT_Gwz!G?oCGZMM;ACZHSAJnGex?R)5G)b}8Vdk4W@-We delta 119 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 literal 12534 zcmb_CTWlLwb~Ahq$>Ez4_15TVF|j2%wxTGGllUb+BFlCp$F=O3OL0aLZ9bHlp=GI5 zS1sIv$!Za$bs8-i1H__8wXi?*kq>`tfppQ2eCz@H3k=WR(x$~omsxu#qxdWyzn_M|)I zneyN~mGq{3Q@)gc%8$Pt$v`SN6@(T5$BrNX0`?AT0b>U zwL#CeeLdTuw0&PG!!j^e2h?@!tLuc)&V8j_ta*ZnbbWrGkbBXzRj#V9}xn$xl2NTCp?@B;h#ti@8{0AhT5II7u)WGju zf^Vw+E>!o_+vSMQp!|_umnKS>(_%_4HmSt9%341)8Am6H)xn$z$Y>kq(Lkz&1stpPc$Np$ ziz=0!k7rVVFoe%!Y?@1|RzZx39N^MBF?nM0>O^$n%$2KW#!sD5tqCC3J=MXbvnh^; zMyf3a*iEw$n`%S7vV!U^j~vz7VzMR^Fr_)c-cv1t$j$Rj0EmE4&*1Rg$iQ4C#SLVq zvuQCqz}@5GSuw*8EM)jQ!h9^w4Wt(5`3%}Y0~theVc>3pTM+u^7gcX`I-5wcQM7x| zG<**X8${#356KEq8ano`KbMBaA%1*mD-wvrcLlhA307DAX$wjwM%c<JEm9XL0~vREIA| z6sj<{2Mp_+B_F$t^CK2Nf&U})_*aN%h#A45$%>r7hv54wL>C@yJKlqm080EQ!4>V0 z`wgkOv-2z*n&?b|OR_?Q;t`Hib2_u2I^#SCRctgS@@N7cb>W*)(t;XU5Fdp2y@Sl*Z z5Zj*m)#Ur>)%1E+X&;b111o1scF)I=!U-wRD+hX&KyT6BE7^NX{+7HgZ!0-`AD=J8 zq)?w6>Qh2}MMt0H=qve~zOOQjDtAzuonvqQ_O(B}Asw57sGrTA#|P!muo4=UApR`2 za&bG@xfSdy2KzSZ<=~(a99$VI*@J7TqPB*D(e&phJjR-+jmc-T^0fa6KRSF*IOnXaL6(u^t#p z3sHS8bZn~`WR9q%pLVnX*BDik5exqc45FInGxMOGf&_32NW5OOw@LQ466Ia>Zc)ues(Jlq+m=#5y%m&`X$zo-&lA%6Om7ZOnVOgspDAv>*_lUy397V~pR z?Xa z9GVO{|gcE@B9+%Qgogy7wCAtTkiW z4YjtKS}GmxB19y$%0cv1as)AB>Lz$FnXVJ7BMZbm^L1i@%u$s+z>}+|MI`FV;Wol9 z4h6)B_Jy4NaSdz*bh7pZ<64&;IfwAFfdcw!fdaOD6lmQWFh}G}`|7LYel3NxJ)NU+ zj@xJ><51Qgevvb=_A;9qe=anJp8rI!0Q+qnpYZK`Xx#_Tp8~H7#zT4q4v%T$SQ_*{ zDQrIqS5bWr0CY$R!XZa3!A{OOqDVo~N-R*Xe=PwOk;PM}tJGKj<{ZX-O2Up`{mYzL zIBHm5^;vWqu>oiCPr>ZIvkD@mz5)^J(I~%0@?S!ExKdtdsN|}DSug7|!cu6guCL^4 z_PO&%jO_ojMt1#(kpq9$$aKyLN{x#*RE>WAJu`=Yf|-#pYLO~;yRGt-v#<@?njSZP z25R9W_}9X+J7)%~e{R_!zFsK;CZW-qMeoTfc~vU7;2iM#eU`l%QE1W zKprW9ndW9PJjY<|54bun8BGax>FA|2$7E(0agJjIE(tCTu4)t* zJe^^Zne;5jGqJm|1bAeUTt8M$m#ml4$wg+#$z;=@L!m*Iyi5!x-D{|N$^e0#Cqi$S z)LAKk$$Q2#3|6-G;GW53(<}q9YoH^r!F6_NVp4U?WRuBgItHGe)36Ty0$Pkc#tg8JM4h z9O#Wy1)-`{%!sk1N`b=>`Rx{$I?FSH*9sx0vJj+KGT@Jz=JF7eQS`oscIi6Tid12(6ah#9l_GY^O6qHXa8& zpk>2WIF(7wCpnR0=3|Q~0FV(gfSGhcn5#moy<7>N01BfcnqVW{*!bd+&ZpWJVtg7l z4-dL2!K1?r9yf4n3g9~fSDj;Wah^NF^BG=sz7tDkwLFg)t!mdCtb%F-f&hM0>r8?d zMAgcn_B=8|_;*o53nu6#lr_HxD|NF8VLlmK)X=0-ptEDN@raM9wiGAMWmx`g)PDq( z08048Jdbo(tf=#dTc|b-E&N}gVx;e==2Yw+KY()fGOAQJGClQ874c~H6kWEb@IraS zwZMf42Mqwyju!t88Wcgy-$BV0l-xkc6iSRV#S|5gHj7;!dZJmsRAvA1ccBGBitsBy z^9u2_{mAB7x&1Yz{WaOrvNE>zLdg|IElwqH6>9~+urcHP4>1c z-gb#<-wD-&mx2zioqB(4b!_F#POyC|*i#Jl$iV|j@W3w7V(tAJCGXqwru?a0lf_ZD z-Pp4J_OHU9hVvJ;!%gc)KDzhdUjAJE+_&4l#)q#;-d?b)9d&z2i4Nt@?V6$N+i$=pOZzzE`@^&!LcL}qj zdz%iej;{|(-BU7sL!oa-^o?!0voO4IL8gZldRU@|w}Z{=qjIoI33f?zIqrZ_Kl>n6 zbahFtu9CNL{d&>c3qWrB8XkDo7o@(KP5b9=_<{Ik`1dVZ4pP}StN3Om-|V)px3IA3 zlzqn(-!aK|Y&+a8F@sO8{dP(UpOeGql<+ypSB_6BKu&L*eSA^so`(3vwST{<)XJ1c9ohtmFB_CSLEhnc{>mg97Jnj#or-Q9mri$`-T+X5WomzJ-8LTr}2bLPb&1JL{Dx98)3$huV;rjRBG+q>FF5%7-u)#dL1nu_xPYdB|U(d?k9>v>Z9RHk5pI7Mf5`F&vH@?6AfqTo>UG#OA{0$FU zN)4^0U`wgKy%Y!oDtFz4zvpYh?sxtXC3)*^fM@_n%#N3El0Umm*C}-C7TsN>yElfO z9Qg9=@86Q5GfGsH=x&+LDs)z&v)e801^Yj{VWYZa=Gc=fa?2Y^%NzN#s~1aj@WZhW z#y0GQ#r&8|A6DqY5{^%6X|A&ZR;DAe9&p?pNMs;u)6fU-FASWbuoV;7Ng(KVeF#Y{RXa`)hd z?yb34QcNrz*eByO-=hdqE8kViu8Z zWq`PP5Um5K23AghMXRA z@iE;-qu{`r$~OOt)qb1Xx{n65SF=$g1?^S0eUN?)qv=*O_&;FYNBZ0o$YMa!UYpCN zTbalf)cr&S-7=`OM8B-vsDUq=!8$fVse54nO3FBM4V3mDfYSV9JT--?b?-sSI#{Q1 zZgejrqKk)efcv4a0cWmiXmS?ta{xW|{FQ(;GwUwXD9sUQE1Nz+U}sD83Q{_jWzTMVifjyTeWqqA_ewGdkb7y8d& z0M%apUh zNAN}_bUUl8ooj<5Q!bqmL6x7M&+uS}^)ChRAOmF}G%LlVSqW4bXdx2h(Rs#-ucq)~ zAh8B-NuIz^J8^aQ+4SIBIn^@2LDT_{1X0!MR4PT zx=Xh{|GvF^oK?XBu0Dv+S!y}-#QIz6%NL~JRXKQ730{@xt2-{gRCl20Iv}|Yl)57MGYZX=nmh7m zR>w-T|HBI(T#$NSenLq-C-R{7o>b_Q5`7YYQ)ti!rQRDdeN&-tO7u+(ogC~{g1r*m z`xFr3SzC~pw`6Kep~fU??0Ld}?SRxg@MP!@8R_sXh_WlHxT2CJs$ECu%n9hB3#?uc z34gZ00>=N73M}*Y39RbtfkG9VgVmG+xZGiv?LCM=?0&^4m~?>#Y;3;+-^dcb7a9&H19%$n_YQzIFGI4-4xQ#P{qu=xJ z`_%%kacmG7h>Mg1jOaryQP%$qmL3@ASD>Bt#^A3}?r%_nnDo*M`&eC>YgKsNo~wvQ zyj;D8bwz|RyUdoyCBm~V{9)J285C{Y)m$v5^GsRTA;`->Z+O8b$#RiRppZycn~ zmp0Ey9mml-hu0PAb%}a?&qwjjliZi1${Q0>=Q~=IscQ;#O`@*hIc0CB;_Z~EPOwlA zlN$bFNV*!6My4UkuDIfgOP2WlOH&JA3~{Y*Iw3J~DcGqsSDw2ug-T9OIy)uAc)8I;VT1Zja4 z@8k3$egULW#jGh9|9~1Huc&}<1^R@hO*r&f_*d2nb8-UbDF z!C^Co-wGiI#a7^CF>vw=a6(;C0#{`B+lu>bxVra)UyZbO;3RL|rW)75_rfTZ#|~w> zAKpCoWJWr2Ms|%Vu2IP{s*zteoM3KUc5cAO^U421#-8DQNR8w&a(pmKkdlQ%4av<0 zQls}MAZJ+fGq|@!|J^N`+_8wHc2jP*Vb|{a2 zVU;FsNH5=nD7)TOT<=PjcQJt?-QchXWgor9#P8TtJFC4D#_nwXEX=HW*xRx6Y^ERd zbnqolYrgL`V_|f?v|AxSL!BqH;dJV?UCb`%7Uqd6H1R=D-jt0LjNtTE<$rwvS zvt*1V!m)z?c8D&?7)!*6WQ--^P3ifuM07~TxI?@kJu8-s6T!SYM7Q*;2!83{>r&u2 z#1-$Z%|?cH2|WpT$wRw@o^)GCaN_BS$4a*E5_;k@k)2>OR1zm)^6i>3Bne(Ilzwf7 zg8OadqB%3+ZzzS|DuoY#OU(mqP(l;_#!~prQn(Kay{Hfpt?-nwFzgGOb_qxT=w3Wi zGx;-emq4jL6E1oU*9PIa+Ae`oy%rZ8B+0|T)hY>v8(YY;&={q9V_f7Z*WSXlx2kI^ MMX1{?5^taX11;X$?*IS* diff --git a/myproject/orders/admin.py b/myproject/orders/admin.py index fc07dac..0f73875 100644 --- a/myproject/orders/admin.py +++ b/myproject/orders/admin.py @@ -1,8 +1,30 @@ from django.contrib import admin +from django.db.models import Q +from django.template.defaultfilters import linebreaksbr +from django.utils import timezone +from django.utils.html import format_html, format_html_join from .models import Order, OrderItem +class GPSAvailabilityFilter(admin.SimpleListFilter): + title = 'GPS availability' + parameter_name = 'gps' + + def lookups(self, request, model_admin): + return ( + ('yes', 'With GPS'), + ('no', 'Manual only'), + ) + + def queryset(self, request, queryset): + if self.value() == 'yes': + return queryset.filter(latitude__isnull=False, longitude__isnull=False) + if self.value() == 'no': + return queryset.filter(Q(latitude__isnull=True) | Q(longitude__isnull=True)) + return queryset + + class OrderItemInline(admin.TabularInline): model = OrderItem extra = 0 @@ -10,10 +32,129 @@ class OrderItemInline(admin.TabularInline): @admin.register(Order) class OrderAdmin(admin.ModelAdmin): - list_display = ('id', 'user', 'status', 'payment_method', 'total_price', 'created_at') - list_filter = ('status', 'payment_method') - search_fields = ('user__username', 'id') + list_display = ( + 'id', + 'user', + 'status', + 'payment_status', + 'payment_method', + 'payment_provider_label', + 'short_location', + 'has_precise_location', + 'total_price', + 'created_at', + 'paid_at', + ) + list_select_related = ('user',) + list_filter = ('status', 'payment_status', 'payment_provider', 'payment_method', GPSAvailabilityFilter) + search_fields = ( + 'user__username', + 'user__email', + 'id', + 'payment_reference', + 'payment_session_id', + 'full_name', + 'phone', + 'address', + 'location_label', + 'delivery_notes', + ) + readonly_fields = ('created_at', 'payment_reference', 'payment_session_id', 'paid_at', 'delivery_snapshot', 'maps_link') + date_hierarchy = 'created_at' + autocomplete_fields = ('user',) + actions = ('mark_payment_pending', 'mark_payment_paid', 'mark_status_shipped', 'mark_status_delivered') + fieldsets = ( + ('Order', {'fields': ('user', 'status', 'created_at', 'total_price')}), + ( + 'Payment', + { + 'fields': ( + 'payment_status', + 'payment_method', + 'payment_provider', + 'payment_currency', + 'payment_reference', + 'payment_session_id', + 'paid_at', + ) + }, + ), + ('Delivery snapshot', {'fields': ('full_name', 'phone', 'location_label', 'address', 'delivery_notes', 'delivery_snapshot')}), + ('GPS', {'fields': ('latitude', 'longitude', 'location_accuracy_m', 'maps_link')}), + ) inlines = [OrderItemInline] + @admin.display(description='Location') + def short_location(self, obj): + return obj.location_label or (obj.address.splitlines()[0].strip() if obj.address else '-') -admin.site.register(OrderItem) + @admin.display(boolean=True, description='GPS') + def has_precise_location(self, obj): + return obj.has_precise_location + + @admin.display(description='Payment provider') + def payment_provider_label(self, obj): + return obj.payment_provider_label + + @admin.display(description='Delivery summary') + def delivery_snapshot(self, obj): + lines = [] + if obj.full_name: + lines.append(format_html('{}', obj.full_name)) + if obj.phone: + lines.append(obj.phone) + if obj.location_label: + lines.append(obj.location_label) + if obj.address: + lines.append(linebreaksbr(obj.address)) + if obj.delivery_notes: + lines.append(format_html('Notes: {}', obj.delivery_notes)) + if not lines: + return '-' + return format_html_join(format_html('
    '), '{}', ((line,) for line in lines)) + + @admin.display(description='Map') + def maps_link(self, obj): + if not obj.has_precise_location: + return '-' + return format_html( + 'Open map', + obj.latitude, + obj.longitude, + ) + + @admin.action(description='Mark selected orders as payment pending') + def mark_payment_pending(self, request, queryset): + updated = queryset.exclude(payment_status='Pending').update(payment_status='Pending') + self.message_user(request, f'{updated} order(s) marked as payment pending.') + + @admin.action(description='Mark selected orders as paid') + def mark_payment_paid(self, request, queryset): + now = timezone.now() + updated = queryset.exclude(payment_status='Paid').update(payment_status='Paid', paid_at=now) + queryset.filter(status='Pending').update(status='Paid') + self.message_user(request, f'{updated} order(s) marked as paid.') + + @admin.action(description='Mark selected orders as shipped') + def mark_status_shipped(self, request, queryset): + updated = queryset.exclude(status__in=['Shipped', 'Delivered']).update(status='Shipped') + self.message_user(request, f'{updated} order(s) marked as shipped.') + + @admin.action(description='Mark selected orders as delivered') + def mark_status_delivered(self, request, queryset): + updated = queryset.exclude(status='Delivered').update(status='Delivered') + cod_collected = queryset.filter(payment_method='Cash on Delivery').exclude(payment_status='Paid').update( + payment_status='Paid', + paid_at=timezone.now(), + ) + message = f'{updated} order(s) marked as delivered.' + if cod_collected: + message += f' {cod_collected} COD payment(s) were also marked paid.' + self.message_user(request, message) + + +@admin.register(OrderItem) +class OrderItemAdmin(admin.ModelAdmin): + list_display = ('order', 'product', 'quantity', 'price') + search_fields = ('order__id', 'product__name') + autocomplete_fields = ('order', 'product') diff --git a/myproject/orders/migrations/0005_order_paid_at_order_payment_currency_and_more.py b/myproject/orders/migrations/0005_order_paid_at_order_payment_currency_and_more.py new file mode 100644 index 0000000..178f78a --- /dev/null +++ b/myproject/orders/migrations/0005_order_paid_at_order_payment_currency_and_more.py @@ -0,0 +1,58 @@ +# Generated by Django 5.2.14 on 2026-05-20 02:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0004_order_delivery_fields'), + ] + + operations = [ + migrations.AddField( + model_name='order', + name='paid_at', + field=models.DateTimeField(blank=True, null=True), + ), + migrations.AddField( + model_name='order', + name='payment_currency', + field=models.CharField(blank=True, default='NPR', max_length=10), + ), + migrations.AddField( + model_name='order', + name='payment_provider', + field=models.CharField(blank=True, default='', max_length=50), + ), + migrations.AddField( + model_name='order', + name='payment_reference', + field=models.CharField(blank=True, default='', max_length=255), + ), + migrations.AddField( + model_name='order', + name='payment_session_id', + field=models.CharField(blank=True, default='', max_length=255), + ), + migrations.AddField( + model_name='order', + name='payment_status', + field=models.CharField(choices=[('Unpaid', 'Unpaid'), ('Pending', 'Pending'), ('Paid', 'Paid'), ('Failed', 'Failed')], default='Unpaid', max_length=20), + ), + migrations.AlterField( + model_name='order', + name='id', + field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + migrations.AlterField( + model_name='order', + name='payment_method', + field=models.CharField(default='Pending selection', max_length=100), + ), + migrations.AlterField( + model_name='orderitem', + name='id', + field=models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), + ), + ] diff --git a/myproject/orders/migrations/0006_order_delivery_notes_order_latitude_and_more.py b/myproject/orders/migrations/0006_order_delivery_notes_order_latitude_and_more.py new file mode 100644 index 0000000..b436f6b --- /dev/null +++ b/myproject/orders/migrations/0006_order_delivery_notes_order_latitude_and_more.py @@ -0,0 +1,38 @@ +# Generated by Django 5.2.14 on 2026-05-20 09:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('orders', '0005_order_paid_at_order_payment_currency_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='order', + name='delivery_notes', + field=models.CharField(blank=True, default='', max_length=255), + ), + migrations.AddField( + model_name='order', + name='latitude', + field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True), + ), + migrations.AddField( + model_name='order', + name='location_accuracy_m', + field=models.DecimalField(blank=True, decimal_places=2, max_digits=8, null=True), + ), + migrations.AddField( + model_name='order', + name='location_label', + field=models.CharField(blank=True, default='', max_length=255), + ), + migrations.AddField( + model_name='order', + name='longitude', + field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True), + ), + ] diff --git a/myproject/orders/migrations/__pycache__/0005_order_paid_at_order_payment_currency_and_more.cpython-311.pyc b/myproject/orders/migrations/__pycache__/0005_order_paid_at_order_payment_currency_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a6f15ba600dacf1f407c4e1f39764f66309bf9fb GIT binary patch literal 2288 zcmb_cO-vg{6rNqL*Ir{%7)a9+APJ?YRx3=~q*bMWL>p0oD4>M4k}s=eXE1B;k2AZQ z#yN55p~t9~-g}^_;zN!-a?H_|d_Z%pdhpE%PPsI1)?NbvQHVOb`*z-&`M!Dc-kbTO zzdwVZ%}w-|{z)P9w@~7i>~;?BLgzO`5Rq);NCnA}3$lb{^erOt&xjFU@l0 z43>8;%`))6uneALDI$V@m&gzqu3f!AY_wiHW%6#s6qT8aU^PI^SHlhNAP1+sm_G5)r`6tzMhxdDZIlWX6_6%6I9dW=x!^O2dEncI4#=up$v zBg(4!rbTVy^JHY^sfu9{-3ZnJmfWxnx6BncwC!914uv=fx@$NTY(gd@EFY*CRfoEP zZib9e*R1ly%G&*w2xTt8`ryY?gl-z49RP{(ShuNL47QGN73Mv%z(bB&pNZLnF(IRy zR4~%kzrv1VyH9-|4ySGrex+v%j3D%LirDY>uGj_}6&}buwMJcHxkWbC(UmnZINnjz z1;er_VK+dH0Igv$kl-nE%d<@Cvmr4ej9j+J0+$!>d;`zBTojqe%q|(I?w1jq$9K`^s~DDFf?qD5}^@Vf&D_%EO1_2aXdXw$bv{S6J^Z%?}5|nmO~>O z*S^^@Sf`trw*%VkYxA(fuGy>5?sfPlIsgjv>S2D%b7(%?2;Cse)5p|=*)0E)$I5=i zFlpYYLRL$#t$e5W@<&%{9?I}ew+y@G*3(WFl5V&J_Q~jUrOH%THxi=b&%oWe-Fw<9 z(mrh`{Dz3UAIZZ=p5e~82=Z7Ir zBRVC~+2|D69WgDM`z7>VrSEo*+8p}|R0%%+2N3OqBuP+sQm&3ZI{miQ+mhNwr^VAu Pb6|2`3>=;@8m;>pbu~bz literal 0 HcmV?d00001 diff --git a/myproject/orders/migrations/__pycache__/0006_order_delivery_notes_order_latitude_and_more.cpython-311.pyc b/myproject/orders/migrations/__pycache__/0006_order_delivery_notes_order_latitude_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3593ac5ca6254499f0faddaf533f56c8fa116862 GIT binary patch literal 1551 zcmb_b&ui2`6rNKVJ!@4X1dLGl58i5c0r+n z2amn^AJj^F@K5MXk6YNoGFMM~+tQwT(Kp#2T356bC%Z52<<0xvoAn9Z69)|A6L2M{eMULiYkfS?F{k<$IuQ9K2R!N{R{!K?Rj4MWv8Z5!Fhaq98SqU-VL6 z2Y_fKP4u0<<0b55j@vybMuL+01;r$1h_=(e2@TnXe{1~{C)Dc~eS*D! zQ;|-#iveKUeMxx*`$0s*rvf#;Lu+#>kzQoBzashwU9w{q!Iao*m{GqNErZug<^=n; zM}?Ni^pZ;%5g7)P6vc!#biipC5=`S+c*$Ij>)8yKneEW9g-G0@8-;)oGbV;v;3R{H zZ3jxWp7Rd35OgEDR3l27OWwxXkQemU@HK3cmmN^REKF5|-hJd9PCDL5Vt1zQt7j=S|B4XSdoc9p|9^vD3#cWmDw}mpx5{ zRKnYEAJ@B2Q%A-_rI}Jk^z}zg6B%Rg&01!(e(pkj=u+Jp-{$ynYvJ#K6Q>P4U7cemPj~&i zrLWJ)hhOdVaz3XCgOqH)7)+7HWGa$bXmxu+ZcFw~f_9XdX^qw$eho|@0EN#$G*gPA g00T;{iY9x1P5q*xH&L(HFl&RC_od_T58fp2513$-M*si- literal 0 HcmV?d00001 diff --git a/myproject/orders/models.py b/myproject/orders/models.py index fc6d7d4..fadb101 100644 --- a/myproject/orders/models.py +++ b/myproject/orders/models.py @@ -1,5 +1,5 @@ -from django.db import models from django.contrib.auth.models import User +from django.db import models from products.models import Product @@ -11,15 +11,39 @@ class Order(models.Model): ('Shipped', 'Shipped'), ('Delivered', 'Delivered'), ) + PAYMENT_STATUS_CHOICES = ( + ('Unpaid', 'Unpaid'), + ('Pending', 'Pending'), + ('Paid', 'Paid'), + ('Failed', 'Failed'), + ) + PAYMENT_PROVIDER_LABELS = { + 'esewa': 'eSewa', + 'khalti': 'Khalti', + 'fonepay': 'Fonepay', + 'stripe': 'Stripe', + 'offline': 'Offline', + } user = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) total_price = models.DecimalField(max_digits=10, decimal_places=2) status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='Pending') - payment_method = models.CharField(max_length=100, default='COD') + payment_status = models.CharField(max_length=20, choices=PAYMENT_STATUS_CHOICES, default='Unpaid') + payment_method = models.CharField(max_length=100, default='Pending selection') + payment_provider = models.CharField(max_length=50, blank=True, default='') + payment_reference = models.CharField(max_length=255, blank=True, default='') + payment_session_id = models.CharField(max_length=255, blank=True, default='') + payment_currency = models.CharField(max_length=10, blank=True, default='NPR') + paid_at = models.DateTimeField(null=True, blank=True) full_name = models.CharField(max_length=150, blank=True, default='') phone = models.CharField(max_length=30, blank=True, default='') address = models.TextField(blank=True, default='') + location_label = models.CharField(max_length=255, blank=True, default='') + latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True) + longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, null=True) + location_accuracy_m = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True) + delivery_notes = models.CharField(max_length=255, blank=True, default='') class Meta: ordering = ['-created_at'] @@ -27,6 +51,16 @@ class Order(models.Model): def __str__(self): return f"Order #{self.id} - {self.user.username}" + @property + def payment_provider_label(self): + if not self.payment_provider: + return '-' + return self.PAYMENT_PROVIDER_LABELS.get(self.payment_provider, self.payment_provider) + + @property + def has_precise_location(self): + return self.latitude is not None and self.longitude is not None + class OrderItem(models.Model): order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE) @@ -35,4 +69,4 @@ class OrderItem(models.Model): price = models.DecimalField(max_digits=10, decimal_places=2) def __str__(self): - return f"{self.quantity} x {self.product.name} @ {self.price}" + return f"{self.quantity} x {self.product.name} @ {self.price}" diff --git a/myproject/orders/payments.py b/myproject/orders/payments.py new file mode 100644 index 0000000..c78ae9a --- /dev/null +++ b/myproject/orders/payments.py @@ -0,0 +1,497 @@ +import base64 +import hashlib +import hmac +import json +import uuid +from decimal import Decimal, ROUND_HALF_UP +from urllib.error import HTTPError, URLError +from urllib.parse import urlencode, urljoin +from urllib.request import Request, urlopen + +from django.conf import settings +from django.urls import reverse + +import stripe + +ZERO_DECIMAL_CURRENCIES = { + 'bif', 'clp', 'djf', 'gnf', 'jpy', 'kmf', 'krw', 'mga', 'pyg', 'rwf', 'ugx', 'vnd', 'vuv', 'xaf', 'xof', 'xpf' +} + + +class PaymentGatewayError(RuntimeError): + def __init__(self, message, *, details=''): + super().__init__(message) + self.details = details + + +def payment_currency(): + return getattr(settings, 'PAYMENT_CURRENCY', 'NPR').upper() + + +def stripe_configured(): + return bool(settings.STRIPE_SECRET_KEY) + + +def esewa_configured(): + return all( + [ + getattr(settings, 'ESEWA_PRODUCT_CODE', '').strip(), + getattr(settings, 'ESEWA_SECRET_KEY', '').strip(), + getattr(settings, 'ESEWA_FORM_URL', '').strip(), + getattr(settings, 'ESEWA_STATUS_URL', '').strip(), + ] + ) + + +def khalti_configured(): + return all( + [ + getattr(settings, 'KHALTI_SECRET_KEY', '').strip(), + getattr(settings, 'KHALTI_INITIATE_URL', '').strip(), + getattr(settings, 'KHALTI_LOOKUP_URL', '').strip(), + ] + ) + + +def stripe_value(obj, key, default=None): + if obj is None: + return default + if isinstance(obj, dict): + return obj.get(key, default) + getter = getattr(obj, 'get', None) + if callable(getter): + return getter(key, default) + return getattr(obj, key, default) + + +def _public_base_url(request): + if settings.PUBLIC_APP_URL: + return settings.PUBLIC_APP_URL + + forwarded_proto = request.META.get('HTTP_X_FORWARDED_PROTO', '').split(',')[0].strip() + scheme = forwarded_proto or request.scheme or 'http' + host = request.get_host() + if host.endswith('.flatlogic.app'): + scheme = 'https' + return f'{scheme}://{host}' + + +def absolute_url(request, path): + return urljoin(f"{_public_base_url(request)}/", path.lstrip('/')) + + +def _format_amount(amount): + value = Decimal(amount).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP) + return format(value, 'f') + + +def _to_minor_units(amount, currency): + value = Decimal(amount) + if currency.lower() in ZERO_DECIMAL_CURRENCIES: + return int(value.quantize(Decimal('1'), rounding=ROUND_HALF_UP)) + return int((value * Decimal('100')).quantize(Decimal('1'), rounding=ROUND_HALF_UP)) + + +def _configure_stripe(): + stripe.api_key = settings.STRIPE_SECRET_KEY + + +def _line_items_for_order(order): + currency = settings.STRIPE_CURRENCY.lower() + line_items = [] + for item in order.items.select_related('product').all(): + line_items.append( + { + 'price_data': { + 'currency': currency, + 'unit_amount': _to_minor_units(item.price, currency), + 'product_data': { + 'name': item.product.name, + 'description': item.product.description[:500], + }, + }, + 'quantity': int(item.quantity), + } + ) + return line_items + + +def create_checkout_session(request, order): + if not stripe_configured(): + raise RuntimeError('Stripe is not configured.') + + _configure_stripe() + success_path = reverse('success') + cancel_path = reverse('payment', kwargs={'order_id': order.id}) + success_url = f"{absolute_url(request, success_path)}?order_id={order.id}&session_id={{CHECKOUT_SESSION_ID}}" + cancel_url = f"{absolute_url(request, cancel_path)}?cancelled=1" + + payload = { + 'mode': 'payment', + 'line_items': _line_items_for_order(order), + 'success_url': success_url, + 'cancel_url': cancel_url, + 'client_reference_id': str(order.id), + 'metadata': { + 'order_id': str(order.id), + 'user_id': str(order.user_id), + }, + 'payment_method_types': ['card'], + 'billing_address_collection': 'auto', + 'submit_type': 'pay', + } + + if order.user.email: + payload['customer_email'] = order.user.email + + return stripe.checkout.Session.create(**payload) + + +def retrieve_checkout_session(session_id): + if not stripe_configured(): + raise RuntimeError('Stripe is not configured.') + _configure_stripe() + return stripe.checkout.Session.retrieve(session_id) + + +def construct_webhook_event(payload, signature): + if not stripe_configured() or not settings.STRIPE_WEBHOOK_SECRET: + raise RuntimeError('Stripe webhook is not configured.') + _configure_stripe() + return stripe.Webhook.construct_event(payload, signature, settings.STRIPE_WEBHOOK_SECRET) + + +def _extract_error_message(body): + try: + payload = json.loads(body) + except json.JSONDecodeError: + return (body or 'Unknown gateway error.').strip()[:300] + + if isinstance(payload, dict): + if payload.get('detail'): + return str(payload['detail']) + if payload.get('error_message'): + return str(payload['error_message']) + for key, value in payload.items(): + if isinstance(value, list) and value: + return f"{key}: {value[0]}" + return json.dumps(payload)[:300] + + return str(payload)[:300] + + +def _json_request(url, *, method='GET', payload=None, headers=None, timeout=20): + request_headers = { + 'Accept': 'application/json', + } + data = None + + if payload is not None: + data = json.dumps(payload).encode('utf-8') + request_headers['Content-Type'] = 'application/json' + + if headers: + request_headers.update(headers) + + request = Request(url, data=data, headers=request_headers, method=method) + + try: + with urlopen(request, timeout=timeout) as response: + body = response.read().decode('utf-8') + except HTTPError as exc: + error_body = exc.read().decode('utf-8', errors='replace') + raise PaymentGatewayError( + _extract_error_message(error_body) or f'Gateway request failed with HTTP {exc.code}.', + details=error_body, + ) from exc + except URLError as exc: + raise PaymentGatewayError('Gateway request could not be completed.', details=str(exc.reason)) from exc + + if not body: + return {} + + try: + return json.loads(body) + except json.JSONDecodeError as exc: + raise PaymentGatewayError('Gateway returned an invalid response.', details=body[:500]) from exc + + +def _signed_field_names_list(signed_field_names): + return [field.strip() for field in str(signed_field_names).split(',') if field and field.strip()] + + +def _signed_message(payload, signed_field_names): + parts = [] + for field_name in _signed_field_names_list(signed_field_names): + if field_name not in payload: + raise PaymentGatewayError(f'Missing signed field: {field_name}') + parts.append(f'{field_name}={payload[field_name]}') + return ','.join(parts) + + +def _hmac_sha256_base64(secret_key, message): + digest = hmac.new(secret_key.encode('utf-8'), message.encode('utf-8'), hashlib.sha256).digest() + return base64.b64encode(digest).decode('utf-8') + + +def _first_present(payload, *keys): + for key in keys: + value = payload.get(key) + if value not in (None, ''): + return value + return '' + + +def build_esewa_redirect(request, order): + if not esewa_configured(): + raise PaymentGatewayError('eSewa is not configured yet.') + + transaction_uuid = f"ORD-{order.id}-{uuid.uuid4().hex[:12].upper()}" + total_amount = _format_amount(order.total_price) + success_url = f"{absolute_url(request, reverse('esewa_return'))}?order_id={order.id}" + failure_url = f"{absolute_url(request, reverse('esewa_return'))}?order_id={order.id}&failed=1" + + fields = { + 'amount': total_amount, + 'tax_amount': '0', + 'total_amount': total_amount, + 'transaction_uuid': transaction_uuid, + 'product_code': settings.ESEWA_PRODUCT_CODE, + 'product_service_charge': '0', + 'product_delivery_charge': '0', + 'success_url': success_url, + 'failure_url': failure_url, + 'signed_field_names': 'total_amount,transaction_uuid,product_code', + } + fields['signature'] = _hmac_sha256_base64( + settings.ESEWA_SECRET_KEY, + _signed_message(fields, fields['signed_field_names']), + ) + + return { + 'action_url': settings.ESEWA_FORM_URL, + 'fields': fields, + 'session_id': transaction_uuid, + 'currency': payment_currency(), + } + + +def _decode_esewa_callback(encoded_data): + if not encoded_data: + raise PaymentGatewayError('eSewa did not return any payment payload.') + + padded = encoded_data + ('=' * (-len(encoded_data) % 4)) + try: + raw = base64.b64decode(padded) + except Exception as exc: + raise PaymentGatewayError('eSewa returned an unreadable payment payload.') from exc + + try: + payload = json.loads(raw.decode('utf-8')) + except (UnicodeDecodeError, json.JSONDecodeError) as exc: + raise PaymentGatewayError('eSewa returned an invalid payment payload.') from exc + + if not isinstance(payload, dict): + raise PaymentGatewayError('eSewa returned an unexpected payment payload.') + + return {str(key): '' if value is None else str(value) for key, value in payload.items()} + + +def _verify_esewa_callback_signature(payload): + signature = payload.get('signature', '').strip() + signed_field_names = payload.get('signed_field_names', '').strip() + + if not signature or not signed_field_names: + raise PaymentGatewayError('eSewa callback signature is missing.') + + expected_signature = _hmac_sha256_base64( + settings.ESEWA_SECRET_KEY, + _signed_message(payload, signed_field_names), + ) + + if not hmac.compare_digest(expected_signature, signature): + raise PaymentGatewayError('eSewa callback signature could not be verified.') + + +def _esewa_status_lookup(order): + params = urlencode( + { + 'product_code': settings.ESEWA_PRODUCT_CODE, + 'total_amount': _format_amount(order.total_price), + 'transaction_uuid': order.payment_session_id, + } + ) + base_url = settings.ESEWA_STATUS_URL.rstrip('/') + '/' + return _json_request(f'{base_url}?{params}') + + +def verify_esewa_payment(order, encoded_data): + if not esewa_configured(): + raise PaymentGatewayError('eSewa is not configured yet.') + + callback = _decode_esewa_callback(encoded_data.strip()) + _verify_esewa_callback_signature(callback) + + transaction_uuid = callback.get('transaction_uuid', '').strip() + if not transaction_uuid: + raise PaymentGatewayError('eSewa did not return a transaction id.') + + if transaction_uuid != (order.payment_session_id or '').strip(): + raise PaymentGatewayError('The returned eSewa session did not match the latest payment attempt for this order.') + + callback_total = _format_amount(callback.get('total_amount', order.total_price)) + order_total = _format_amount(order.total_price) + if callback_total != order_total: + raise PaymentGatewayError('The returned eSewa amount did not match this order total.') + + callback_product_code = callback.get('product_code', '').strip() + if callback_product_code and callback_product_code != settings.ESEWA_PRODUCT_CODE: + raise PaymentGatewayError('The returned eSewa product code did not match the configured merchant code.') + + status_response = _esewa_status_lookup(order) + + if status_response.get('error_message'): + raise PaymentGatewayError(f"eSewa status lookup failed: {status_response['error_message']}") + + gateway_status = str(status_response.get('status', '')).upper().strip() + if not gateway_status: + raise PaymentGatewayError('eSewa did not return a payment status for this transaction.') + + returned_total = _first_present(status_response, 'total_amount', 'totalAmount') + if returned_total and _format_amount(returned_total) != order_total: + raise PaymentGatewayError('The verified eSewa amount did not match this order total.') + + returned_product_code = str(_first_present(status_response, 'product_code', 'productCode', 'scd')).strip() + if returned_product_code and returned_product_code != settings.ESEWA_PRODUCT_CODE: + raise PaymentGatewayError('The verified eSewa merchant code did not match this order.') + + reference = str(_first_present(status_response, 'ref_id', 'refId') or callback.get('transaction_code') or transaction_uuid).strip() + + if gateway_status == 'COMPLETE': + local_status = 'Paid' + message = 'eSewa payment verified successfully.' + elif gateway_status in {'PENDING', 'AMBIGUOUS'}: + local_status = 'Pending' + message = 'eSewa is still processing this payment.' + else: + local_status = 'Failed' + message = f'eSewa returned {gateway_status} for this payment.' + + return { + 'status': local_status, + 'gateway_status': gateway_status, + 'reference': reference, + 'session_id': transaction_uuid, + 'currency': payment_currency(), + 'message': message, + } + + +def initiate_khalti_payment(request, order): + if not khalti_configured(): + raise PaymentGatewayError('Khalti is not configured yet.') + + amount_in_paisa = _to_minor_units(order.total_price, payment_currency()) + if amount_in_paisa < 1000: + raise PaymentGatewayError('Khalti requires a minimum payment amount of Rs. 10.') + + purchase_order_id = f"ORDER-{order.id}-{uuid.uuid4().hex[:8].upper()}" + payload = { + 'return_url': f"{absolute_url(request, reverse('khalti_return'))}?order_id={order.id}", + 'website_url': _public_base_url(request), + 'amount': amount_in_paisa, + 'purchase_order_id': purchase_order_id, + 'purchase_order_name': f'Order #{order.id}', + } + + customer_info = { + 'name': order.full_name or order.user.get_full_name() or order.user.username, + 'phone': order.phone, + } + if order.user.email: + customer_info['email'] = order.user.email + payload['customer_info'] = {key: value for key, value in customer_info.items() if value} + + response = _json_request( + settings.KHALTI_INITIATE_URL, + method='POST', + payload=payload, + headers={'Authorization': f'key {settings.KHALTI_SECRET_KEY}'}, + ) + + payment_url = str(response.get('payment_url', '')).strip() + pidx = str(response.get('pidx', '')).strip() + + if not payment_url or not pidx: + raise PaymentGatewayError('Khalti did not return a payment URL for this order.') + + return { + 'payment_url': payment_url, + 'session_id': pidx, + 'reference': purchase_order_id, + 'currency': payment_currency(), + } + + +def _khalti_lookup(pidx): + return _json_request( + settings.KHALTI_LOOKUP_URL, + method='POST', + payload={'pidx': pidx}, + headers={'Authorization': f'key {settings.KHALTI_SECRET_KEY}'}, + ) + + +def verify_khalti_payment(order, pidx): + if not khalti_configured(): + raise PaymentGatewayError('Khalti is not configured yet.') + + normalized_pidx = (pidx or '').strip() + if not normalized_pidx: + raise PaymentGatewayError('Khalti did not return a payment session id.') + + if normalized_pidx != (order.payment_session_id or '').strip(): + raise PaymentGatewayError('The returned Khalti session did not match the latest payment attempt for this order.') + + lookup = _khalti_lookup(normalized_pidx) + gateway_status = str(lookup.get('status', '')).strip() + if not gateway_status: + raise PaymentGatewayError('Khalti did not return a payment status for this transaction.') + + returned_amount = lookup.get('total_amount') + if returned_amount not in (None, ''): + try: + returned_amount_value = int(returned_amount) + except (TypeError, ValueError) as exc: + raise PaymentGatewayError('Khalti returned an invalid payment amount.') from exc + + expected_amount = _to_minor_units(order.total_price, payment_currency()) + if returned_amount_value != expected_amount: + raise PaymentGatewayError('The returned Khalti amount did not match this order total.') + + if order.payment_reference: + returned_order_reference = str(lookup.get('purchase_order_id', '')).strip() + if returned_order_reference and returned_order_reference != order.payment_reference: + raise PaymentGatewayError('The returned Khalti purchase order id did not match this order.') + + refunded = bool(lookup.get('refunded')) + transaction_reference = str(lookup.get('transaction_id') or normalized_pidx).strip() + + if gateway_status == 'Completed' and not refunded: + local_status = 'Paid' + message = 'Khalti payment verified successfully.' + elif gateway_status in {'Pending', 'Initiated'}: + local_status = 'Pending' + message = 'Khalti is still processing this payment.' + else: + local_status = 'Failed' + message = f'Khalti returned {gateway_status} for this payment.' + + return { + 'status': local_status, + 'gateway_status': gateway_status, + 'reference': transaction_reference, + 'session_id': normalized_pidx, + 'currency': payment_currency(), + 'message': message, + } diff --git a/myproject/orders/tests.py b/myproject/orders/tests.py index de8bdc0..1915df8 100644 --- a/myproject/orders/tests.py +++ b/myproject/orders/tests.py @@ -1,3 +1,282 @@ -from django.test import TestCase - -# Create your tests here. +from unittest.mock import patch + +from django.contrib.auth import get_user_model +from django.core.files.uploadedfile import SimpleUploadedFile +from django.test import TestCase, override_settings +from django.urls import reverse + +from orders.models import Order, OrderItem +from products.models import Product + +User = get_user_model() + +SAMPLE_GIF = bytes.fromhex( + '47494638396101000100800000000000ffffff21f90401000000002c00000000010001000002024401003b' +) + + +class OrderPaymentFlowTests(TestCase): + def setUp(self): + self.user = User.objects.create_user(username='alice', password='password123', email='alice@example.com') + self.client.force_login(self.user) + image = SimpleUploadedFile('product.gif', SAMPLE_GIF, content_type='image/gif') + self.product = Product.objects.create( + name='Wireless Mouse', + description='A test product for order payments.', + price='1250.00', + listing_type='sale', + image=image, + category='Electronics', + stock=8, + ) + self.order = Order.objects.create( + user=self.user, + total_price='1250.00', + full_name='Alice Example', + phone='+9779800000000', + address='Kathmandu', + ) + OrderItem.objects.create(order=self.order, product=self.product, quantity=1, price='1250.00') + + def test_payment_page_does_not_fake_pay_order(self): + response = self.client.get(reverse('payment', args=[self.order.id])) + self.assertEqual(response.status_code, 200) + self.order.refresh_from_db() + self.assertEqual(self.order.payment_status, 'Unpaid') + self.assertEqual(self.order.status, 'Pending') + + @override_settings( + PAYMENT_CURRENCY='NPR', + ESEWA_SANDBOX=True, + ESEWA_PRODUCT_CODE='EPAYTEST', + ESEWA_SECRET_KEY='secret-key', + ESEWA_FORM_URL='https://esewa.test/form', + ESEWA_STATUS_URL='https://esewa.test/status/', + ) + def test_posting_esewa_returns_redirect_form_and_sets_pending_state(self): + response = self.client.post(reverse('payment', args=[self.order.id]), {'payment': 'esewa'}) + + self.assertEqual(response.status_code, 200) + self.assertTemplateUsed(response, 'order/payment_redirect.html') + self.assertContains(response, 'https://esewa.test/form') + + self.order.refresh_from_db() + self.assertEqual(self.order.payment_provider, 'esewa') + self.assertEqual(self.order.payment_method, 'eSewa') + self.assertEqual(self.order.payment_status, 'Pending') + self.assertEqual(self.order.payment_currency, 'NPR') + self.assertTrue(self.order.payment_session_id.startswith(f'ORD-{self.order.id}-')) + self.assertContains(response, self.order.payment_session_id) + + @override_settings(PAYMENT_CURRENCY='NPR') + @patch('orders.views.verify_esewa_payment') + def test_esewa_return_marks_order_paid_only_after_verified_status(self, mock_verify_esewa_payment): + self.order.payment_method = 'eSewa' + self.order.payment_provider = 'esewa' + self.order.payment_status = 'Pending' + self.order.payment_session_id = 'ORD-1-ABC123' + self.order.payment_currency = 'NPR' + self.order.save() + + mock_verify_esewa_payment.return_value = { + 'status': 'Paid', + 'reference': 'ESEWA-REF-123', + 'session_id': 'ORD-1-ABC123', + 'currency': 'NPR', + 'message': 'eSewa payment verified successfully.', + } + + response = self.client.get(reverse('esewa_return') + f'?order_id={self.order.id}&data=dummy') + + self.assertEqual(response.status_code, 302) + self.assertEqual(response['Location'], reverse('success') + f'?order_id={self.order.id}') + self.order.refresh_from_db() + self.assertEqual(self.order.payment_status, 'Paid') + self.assertEqual(self.order.status, 'Paid') + self.assertEqual(self.order.payment_reference, 'ESEWA-REF-123') + self.assertEqual(self.order.payment_provider, 'esewa') + self.assertIsNotNone(self.order.paid_at) + + @override_settings( + PAYMENT_CURRENCY='NPR', + KHALTI_SECRET_KEY='test_secret', + KHALTI_INITIATE_URL='https://khalti.test/initiate/', + KHALTI_LOOKUP_URL='https://khalti.test/lookup/', + ) + @patch('orders.views.initiate_khalti_payment') + def test_posting_khalti_redirects_to_payment_url(self, mock_initiate_khalti_payment): + mock_initiate_khalti_payment.return_value = { + 'payment_url': 'https://pay.khalti.test/session/123', + 'session_id': 'pidx_test_123', + 'reference': 'ORDER-1-TEST123', + 'currency': 'NPR', + } + + response = self.client.post(reverse('payment', args=[self.order.id]), {'payment': 'khalti'}) + + self.assertEqual(response.status_code, 302) + self.assertEqual(response['Location'], 'https://pay.khalti.test/session/123') + self.order.refresh_from_db() + self.assertEqual(self.order.payment_provider, 'khalti') + self.assertEqual(self.order.payment_method, 'Khalti') + self.assertEqual(self.order.payment_status, 'Pending') + self.assertEqual(self.order.payment_session_id, 'pidx_test_123') + self.assertEqual(self.order.payment_reference, 'ORDER-1-TEST123') + + @override_settings(PAYMENT_CURRENCY='NPR') + @patch('orders.views.verify_khalti_payment') + def test_khalti_return_marks_order_paid_only_after_verified_lookup(self, mock_verify_khalti_payment): + self.order.payment_method = 'Khalti' + self.order.payment_provider = 'khalti' + self.order.payment_status = 'Pending' + self.order.payment_session_id = 'pidx_test_123' + self.order.payment_reference = 'ORDER-1-TEST123' + self.order.payment_currency = 'NPR' + self.order.save() + + mock_verify_khalti_payment.return_value = { + 'status': 'Paid', + 'reference': 'TXN-456', + 'session_id': 'pidx_test_123', + 'currency': 'NPR', + 'message': 'Khalti payment verified successfully.', + } + + response = self.client.get(reverse('khalti_return') + f'?order_id={self.order.id}&pidx=pidx_test_123') + + self.assertEqual(response.status_code, 302) + self.assertEqual(response['Location'], reverse('success') + f'?order_id={self.order.id}') + self.order.refresh_from_db() + self.assertEqual(self.order.payment_status, 'Paid') + self.assertEqual(self.order.status, 'Paid') + self.assertEqual(self.order.payment_reference, 'TXN-456') + self.assertEqual(self.order.payment_provider, 'khalti') + self.assertIsNotNone(self.order.paid_at) + + def test_cash_on_delivery_does_not_mark_order_as_paid(self): + response = self.client.post(reverse('payment', args=[self.order.id]), {'payment': 'cod'}) + + self.assertEqual(response.status_code, 302) + self.order.refresh_from_db() + self.assertEqual(self.order.payment_method, 'Cash on Delivery') + self.assertEqual(self.order.payment_status, 'Pending') + self.assertEqual(self.order.status, 'Pending') + + +class CheckoutLocationFlowTests(TestCase): + def setUp(self): + self.user = User.objects.create_user(username='buyer', password='password123', email='buyer@example.com') + self.user.profile.phone = '+9779811111111' + self.user.profile.location_label = 'Baneshwor, Kathmandu' + self.user.profile.default_address = 'Old Baneshwor Chowk\nKathmandu' + self.user.profile.latitude = '27.693400' + self.user.profile.longitude = '85.335000' + self.user.profile.location_accuracy_m = '20.50' + self.user.profile.save() + + image = SimpleUploadedFile('checkout.gif', SAMPLE_GIF, content_type='image/gif') + self.product = Product.objects.create( + name='Smart Watch', + description='Checkout location test product.', + price='2500.00', + listing_type='sale', + image=image, + category='Electronics', + stock=5, + ) + self.client.force_login(self.user) + session = self.client.session + session['cart'] = {str(self.product.id): 1} + session.save() + + def test_checkout_prefills_saved_profile_delivery_details(self): + response = self.client.get(reverse('checkout')) + + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['delivery']['phone'], '+9779811111111') + self.assertEqual(response.context['delivery']['location_label'], 'Baneshwor, Kathmandu') + self.assertEqual(response.context['delivery']['address'], 'Old Baneshwor Chowk\nKathmandu') + self.assertEqual(response.context['delivery']['latitude'], '27.693400') + self.assertEqual(response.context['delivery']['longitude'], '85.335000') + + def test_checkout_saves_order_delivery_snapshot_and_updates_profile(self): + response = self.client.post( + reverse('checkout'), + { + 'full_name': 'Buyer Example', + 'phone': '+9779801234567', + 'location_label': 'Lalitpur, Kupondole', + 'address': 'Kupondole Height\nLalitpur', + 'delivery_notes': 'Call before reaching the gate', + 'latitude': '27.685100', + 'longitude': '85.316700', + 'location_accuracy_m': '12.75', + 'save_as_default': 'on', + }, + ) + + order = Order.objects.get(user=self.user) + self.assertEqual(response.status_code, 302) + self.assertEqual(response['Location'], reverse('payment', args=[order.id])) + self.assertEqual(order.phone, '+9779801234567') + self.assertEqual(order.location_label, 'Lalitpur, Kupondole') + self.assertEqual(order.delivery_notes, 'Call before reaching the gate') + self.assertIsNotNone(order.latitude) + self.assertIsNotNone(order.longitude) + + self.user.profile.refresh_from_db() + self.assertEqual(self.user.profile.phone, '+9779801234567') + self.assertEqual(self.user.profile.location_label, 'Lalitpur, Kupondole') + self.assertEqual(self.user.profile.default_address, 'Kupondole Height\nLalitpur') + + def test_checkout_can_prefill_from_recent_delivery_shortcut(self): + recent_order = Order.objects.create( + user=self.user, + total_price='2500.00', + status='Delivered', + payment_status='Paid', + payment_method='Cash on Delivery', + full_name='Buyer Example', + phone='+9779809999999', + address='Naxal Chowk\nKathmandu', + location_label='Naxal, Kathmandu', + latitude='27.717300', + longitude='85.331900', + location_accuracy_m='11.25', + delivery_notes='Ring the bell once', + ) + + response = self.client.get(reverse('checkout') + f'?delivery_shortcut=order-{recent_order.id}') + + self.assertEqual(response.status_code, 200) + self.assertEqual(response.context['delivery']['phone'], '+9779809999999') + self.assertEqual(response.context['delivery']['location_label'], 'Naxal, Kathmandu') + self.assertEqual(response.context['delivery']['address'], 'Naxal Chowk\nKathmandu') + self.assertEqual(response.context['delivery']['delivery_notes'], 'Ring the bell once') + self.assertEqual(response.context['delivery']['selected_shortcut_id'], f'order-{recent_order.id}') + self.assertTrue(any(shortcut['selected'] for shortcut in response.context['delivery_shortcuts'])) + + def test_checkout_save_as_default_clears_stale_profile_gps_when_manual_address_has_no_coordinates(self): + response = self.client.post( + reverse('checkout'), + { + 'full_name': 'Buyer Example', + 'phone': '+9779801234567', + 'location_label': 'Bhaktapur Durbar Area', + 'address': 'Taumadhi Square\nBhaktapur', + 'delivery_notes': 'Call after arrival', + 'save_as_default': 'on', + }, + ) + + order = Order.objects.get(user=self.user) + self.assertEqual(response.status_code, 302) + self.assertEqual(response['Location'], reverse('payment', args=[order.id])) + + self.user.profile.refresh_from_db() + self.assertEqual(self.user.profile.default_address, 'Taumadhi Square\nBhaktapur') + self.assertIsNone(self.user.profile.latitude) + self.assertIsNone(self.user.profile.longitude) + self.assertIsNone(self.user.profile.location_accuracy_m) + self.assertIsNone(self.user.profile.location_updated_at) + diff --git a/myproject/orders/urls.py b/myproject/orders/urls.py index a9ec0cc..06f8532 100644 --- a/myproject/orders/urls.py +++ b/myproject/orders/urls.py @@ -1,11 +1,15 @@ -from django.urls import path -from . import views - -urlpatterns = [ - path('checkout/', views.checkout, name='checkout'), - path('payment//', views.payment_page, name='payment'), - path('payment///', views.payment_gateway, name='payment_gateway'), - path('success/', views.success, name='success'), - path('my-orders/', views.my_orders, name='my_orders'), - path('order//', views.order_detail, name='order_detail'), -] \ No newline at end of file +from django.urls import path + +from . import views + +urlpatterns = [ + path('checkout/', views.checkout, name='checkout'), + path('payment//', views.payment_page, name='payment'), + path('payment///', views.payment_gateway, name='payment_gateway'), + path('payment/return/esewa/', views.esewa_return, name='esewa_return'), + path('payment/return/khalti/', views.khalti_return, name='khalti_return'), + path('payment/webhooks/stripe/', views.stripe_webhook, name='stripe_webhook'), + path('success/', views.success, name='success'), + path('my-orders/', views.my_orders, name='my_orders'), + path('order//', views.order_detail, name='order_detail'), +] diff --git a/myproject/orders/views.py b/myproject/orders/views.py index 031004c..454b567 100644 --- a/myproject/orders/views.py +++ b/myproject/orders/views.py @@ -1,19 +1,47 @@ -from datetime import timedelta +import logging from decimal import Decimal -import re +from django.conf import settings from django.contrib import messages from django.contrib.auth.decorators import login_required +from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect, render +from django.urls import reverse from django.utils import timezone +from django.views.decorators.csrf import csrf_exempt +from accounts.delivery import ( + build_delivery_payload, + delivery_payload_from_profile, + derive_location_label, + parse_decimal_value, + phone_has_valid_digits, + save_profile_delivery_defaults, +) from cart.views import get_cart, save_cart from products.models import Product from .models import Order, OrderItem +from .payments import ( + PaymentGatewayError, + build_esewa_redirect, + construct_webhook_event, + create_checkout_session, + esewa_configured, + initiate_khalti_payment, + khalti_configured, + payment_currency, + retrieve_checkout_session, + stripe_configured, + stripe_value, + verify_esewa_payment, + verify_khalti_payment, +) +logger = logging.getLogger(__name__) STATUS_SEQUENCE = ['Pending', 'Paid', 'Shipped', 'Delivered'] +UNSET = object() def _build_timeline(status): @@ -25,24 +53,6 @@ def _build_timeline(status): return timeline -def _sync_demo_status(order): - elapsed = timezone.now() - order.created_at - if elapsed >= timedelta(minutes=3): - target = 'Delivered' - elif elapsed >= timedelta(minutes=2): - target = 'Shipped' - elif elapsed >= timedelta(minutes=1): - target = 'Paid' - else: - target = 'Pending' - - current_index = STATUS_SEQUENCE.index(order.status) if order.status in STATUS_SEQUENCE else 0 - target_index = STATUS_SEQUENCE.index(target) - if target_index > current_index: - order.status = target - order.save(update_fields=['status']) - - def _get_checkout_source(request): buy_now = request.session.get('buy_now', {}) if isinstance(buy_now, dict) and buy_now: @@ -50,6 +60,7 @@ def _get_checkout_source(request): return get_cart(request), 'cart' + def _clear_checkout_source(request, source_key): if source_key == 'buy_now': request.session.pop('buy_now', None) @@ -58,9 +69,291 @@ def _clear_checkout_source(request, source_key): save_cart(request, {}) -def _validate_phone(phone): - digits = re.sub(r'\D+', '', phone) - return 7 <= len(digits) <= 15 + +def _build_delivery_shortcuts(user, profile, *, limit=4): + shortcuts = [] + seen = set() + default_full_name = user.get_full_name() or user.username + + def add_shortcut( + identifier, + *, + badge, + title, + note='', + full_name='', + phone='', + address='', + location_label='', + delivery_notes='', + latitude=None, + longitude=None, + location_accuracy_m=None, + ): + payload = build_delivery_payload( + full_name=full_name, + phone=phone, + address=address, + location_label=location_label, + delivery_notes=delivery_notes, + latitude=latitude, + longitude=longitude, + location_accuracy_m=location_accuracy_m, + save_as_default=True, + ) + dedupe_key = ( + payload['phone'].lower(), + payload['address'].lower(), + payload['location_label'].lower(), + ) + if not payload['address'] or dedupe_key in seen: + return + + seen.add(dedupe_key) + shortcuts.append( + { + 'id': identifier, + 'badge': badge, + 'title': title, + 'note': note, + 'full_name': payload['full_name'], + 'phone': payload['phone'], + 'address': payload['address'], + 'location_label': payload['location_label'], + 'delivery_notes': payload['delivery_notes'], + 'latitude': payload['latitude'], + 'longitude': payload['longitude'], + 'location_accuracy_m': payload['location_accuracy_m'], + 'has_precise_location': bool(payload['latitude'] and payload['longitude']), + 'selected': False, + } + ) + + if profile is not None and (profile.phone or profile.formatted_delivery_address): + add_shortcut( + 'profile-default', + badge='Saved profile', + title=profile.short_location or 'Default account address', + note='Use your currently saved checkout defaults.', + full_name=default_full_name, + phone=profile.phone, + address=profile.formatted_delivery_address, + location_label=profile.short_location, + latitude=profile.latitude, + longitude=profile.longitude, + location_accuracy_m=profile.location_accuracy_m, + ) + + recent_orders = ( + Order.objects.filter(user=user) + .exclude(address='') + .order_by('-created_at') + .only( + 'id', + 'full_name', + 'phone', + 'address', + 'location_label', + 'delivery_notes', + 'latitude', + 'longitude', + 'location_accuracy_m', + 'created_at', + ) + ) + + for order in recent_orders: + add_shortcut( + f'order-{order.id}', + badge=f'Order #{order.id}', + title=order.location_label or order.address.splitlines()[0].strip() or f'Order #{order.id}', + note=f'Last used {order.created_at:%b %d, %Y}.', + full_name=order.full_name or default_full_name, + phone=order.phone, + address=order.address, + location_label=order.location_label, + delivery_notes=order.delivery_notes, + latitude=order.latitude, + longitude=order.longitude, + location_accuracy_m=order.location_accuracy_m, + ) + if len(shortcuts) >= limit: + break + + return shortcuts + + + +def _resolve_delivery_shortcut(shortcuts, shortcut_id): + if not shortcut_id: + return None + return next((shortcut for shortcut in shortcuts if shortcut['id'] == shortcut_id), None) + + + +def _set_selected_delivery_shortcut(shortcuts, shortcut_id): + for shortcut in shortcuts: + shortcut['selected'] = shortcut['id'] == shortcut_id + + + +def _render_checkout(request, *, cart_products, total, delivery, delivery_shortcuts): + return render( + request, + 'order/checkout.html', + { + 'products': cart_products, + 'total': total, + 'delivery': delivery, + 'delivery_shortcuts': delivery_shortcuts, + }, + ) + + + +def _save_order_updates(order, **changes): + update_fields = [] + for field, value in changes.items(): + if value is UNSET: + continue + if getattr(order, field) != value: + setattr(order, field, value) + update_fields.append(field) + if update_fields: + order.save(update_fields=update_fields) + + + +def _mark_order_paid( + order, + *, + payment_method=UNSET, + payment_provider=UNSET, + payment_reference=UNSET, + payment_session_id=UNSET, + payment_currency_value=UNSET, +): + _save_order_updates( + order, + status='Paid', + payment_status='Paid', + payment_method=payment_method, + payment_provider=payment_provider, + payment_reference=payment_reference, + payment_session_id=payment_session_id, + payment_currency=payment_currency_value, + paid_at=order.paid_at or timezone.now(), + ) + + + +def _mark_order_paid_from_stripe(order, session): + payment_reference = stripe_value(session, 'payment_intent', '') or UNSET + payment_session_id = stripe_value(session, 'id', '') or UNSET + payment_currency_value = (stripe_value(session, 'currency', '') or settings.STRIPE_CURRENCY).upper() + _mark_order_paid( + order, + payment_method='Card / Wallet', + payment_provider='stripe', + payment_reference=payment_reference, + payment_session_id=payment_session_id, + payment_currency_value=payment_currency_value, + ) + + + +def _build_payment_options(order): + stripe_ready = stripe_configured() + esewa_ready = esewa_configured() + khalti_ready = khalti_configured() + + options = [ + { + 'value': 'esewa', + 'title': 'eSewa ePay', + 'badge': 'Sandbox / UAT' if settings.ESEWA_SANDBOX else 'Live gateway', + 'badge_muted': not esewa_ready, + 'description': 'Redirect to the official eSewa wallet page and verify the transaction on return before marking the order paid.', + 'note': ( + 'Ready to test with the official eSewa sandbox merchant.' + if esewa_ready and settings.ESEWA_SANDBOX + else 'Add your live eSewa merchant code and secret to switch this gateway to production.' + if esewa_ready + else 'Configure eSewa credentials to enable this wallet.' + ), + 'ready': esewa_ready, + }, + { + 'value': 'khalti', + 'title': 'Khalti', + 'badge': 'KPG-2', + 'badge_muted': not khalti_ready, + 'description': 'Create a real Khalti payment session on the server and verify its final status using the lookup API.', + 'note': ( + 'Ready with your configured Khalti secret key.' + if khalti_ready + else 'Add KHALTI_SECRET_KEY to enable Khalti ePayment.' + ), + 'ready': khalti_ready, + }, + { + 'value': 'fonepay', + 'title': 'Fonepay', + 'badge': 'Merchant onboarding', + 'badge_muted': True, + 'description': 'Reserved for Fonepay Business / Dynamic QR integration once merchant onboarding details are available.', + 'note': 'Kept disabled so the app never claims a Fonepay payment succeeded without official verification.', + 'ready': False, + }, + ] + + if stripe_ready: + options.append( + { + 'value': 'stripe', + 'title': 'Card / Wallet', + 'badge': 'Stripe Checkout', + 'badge_muted': False, + 'description': 'Fallback card checkout with Stripe, verified before the order is marked paid.', + 'note': f'Charges are created in {settings.STRIPE_CURRENCY.upper()} and verified on return/webhook.', + 'ready': True, + } + ) + + options.append( + { + 'value': 'cod', + 'title': 'Cash on Delivery', + 'badge': 'Offline', + 'badge_muted': True, + 'description': 'Confirm the order now and collect payment when the package arrives.', + 'note': 'You can still return later and switch to eSewa or Khalti before delivery.', + 'ready': True, + } + ) + + ready_option_values = {option['value'] for option in options if option['ready']} + selected_payment = None + + if order.payment_provider in ready_option_values: + selected_payment = order.payment_provider + elif order.payment_method == 'Cash on Delivery': + selected_payment = 'cod' + else: + selected_payment = next((option['value'] for option in options if option['ready'] and option['value'] != 'cod'), 'cod') + + for option in options: + option['checked'] = option['value'] == selected_payment + + online_ready = any(option['ready'] and option['value'] != 'cod' for option in options) + + return { + 'payment_options': options, + 'online_ready': online_ready, + 'stripe_ready': stripe_ready, + 'esewa_ready': esewa_ready, + 'khalti_ready': khalti_ready, + } @login_required @@ -108,50 +401,146 @@ def checkout(request): _clear_checkout_source(request, source_key) return redirect('cart') + profile = getattr(request.user, 'profile', None) + delivery_shortcuts = _build_delivery_shortcuts(request.user, profile) + selected_shortcut_id = ( + request.POST.get('selected_shortcut_id', '').strip() + if request.method == 'POST' + else request.GET.get('delivery_shortcut', '').strip() + ) + selected_shortcut = _resolve_delivery_shortcut(delivery_shortcuts, selected_shortcut_id) + if selected_shortcut is None: + selected_shortcut_id = '' + _set_selected_delivery_shortcut(delivery_shortcuts, selected_shortcut_id) + if request.method == 'POST': full_name = request.POST.get('full_name', '').strip() phone = request.POST.get('phone', '').strip() address = request.POST.get('address', '').strip() + location_label = request.POST.get('location_label', '').strip() + delivery_notes = request.POST.get('delivery_notes', '').strip() + save_as_default = request.POST.get('save_as_default') == 'on' + + try: + latitude = parse_decimal_value( + request.POST.get('latitude'), + field_label='latitude', + minimum=Decimal('-90'), + maximum=Decimal('90'), + ) + longitude = parse_decimal_value( + request.POST.get('longitude'), + field_label='longitude', + minimum=Decimal('-180'), + maximum=Decimal('180'), + ) + location_accuracy_m = parse_decimal_value( + request.POST.get('location_accuracy_m'), + field_label='location accuracy', + minimum=Decimal('0'), + maximum=Decimal('100000'), + ) + except ValueError as exc: + messages.error(request, str(exc)) + return _render_checkout( + request, + cart_products=cart_products, + total=total, + delivery=build_delivery_payload( + full_name=full_name, + phone=phone, + address=address, + location_label=location_label, + delivery_notes=delivery_notes, + latitude=request.POST.get('latitude', ''), + longitude=request.POST.get('longitude', ''), + location_accuracy_m=request.POST.get('location_accuracy_m', ''), + save_as_default=save_as_default, + selected_shortcut_id=selected_shortcut_id, + ), + delivery_shortcuts=delivery_shortcuts, + ) + + if (latitude is None) != (longitude is None): + messages.error(request, 'GPS location is incomplete. Please retry the location button or continue without GPS.') + return _render_checkout( + request, + cart_products=cart_products, + total=total, + delivery=build_delivery_payload( + full_name=full_name, + phone=phone, + address=address, + location_label=location_label, + delivery_notes=delivery_notes, + latitude=latitude, + longitude=longitude, + location_accuracy_m=location_accuracy_m, + save_as_default=save_as_default, + selected_shortcut_id=selected_shortcut_id, + ), + delivery_shortcuts=delivery_shortcuts, + ) + + location_label = derive_location_label(location_label, address) if not full_name or not phone or not address: messages.error(request, 'Please fill in full name, phone, and address.') - return render( + return _render_checkout( request, - 'order/checkout.html', - { - 'products': cart_products, - 'total': total, - 'delivery': { - 'full_name': full_name, - 'phone': phone, - 'address': address, - }, - }, + cart_products=cart_products, + total=total, + delivery=build_delivery_payload( + full_name=full_name, + phone=phone, + address=address, + location_label=location_label, + delivery_notes=delivery_notes, + latitude=latitude, + longitude=longitude, + location_accuracy_m=location_accuracy_m, + save_as_default=save_as_default, + selected_shortcut_id=selected_shortcut_id, + ), + delivery_shortcuts=delivery_shortcuts, ) - if not _validate_phone(phone): + if not phone_has_valid_digits(phone): messages.error(request, 'Please enter a valid phone number.') - return render( + return _render_checkout( request, - 'order/checkout.html', - { - 'products': cart_products, - 'total': total, - 'delivery': { - 'full_name': full_name, - 'phone': phone, - 'address': address, - }, - }, + cart_products=cart_products, + total=total, + delivery=build_delivery_payload( + full_name=full_name, + phone=phone, + address=address, + location_label=location_label, + delivery_notes=delivery_notes, + latitude=latitude, + longitude=longitude, + location_accuracy_m=location_accuracy_m, + save_as_default=save_as_default, + selected_shortcut_id=selected_shortcut_id, + ), + delivery_shortcuts=delivery_shortcuts, ) order = Order.objects.create( user=request.user, total_price=total, status='Pending', + payment_status='Unpaid', + payment_method='Pending selection', + payment_currency=payment_currency(), full_name=full_name, phone=phone, address=address, + location_label=location_label, + latitude=latitude, + longitude=longitude, + location_accuracy_m=location_accuracy_m, + delivery_notes=delivery_notes, ) for product in cart_products: @@ -159,113 +548,470 @@ def checkout(request): product.stock = max(product.stock - product.qty, 0) product.save(update_fields=['stock']) + if save_as_default: + save_profile_delivery_defaults( + profile, + phone=phone, + address=address, + location_label=location_label, + latitude=latitude, + longitude=longitude, + location_accuracy_m=location_accuracy_m, + ) + + if location_label: + request.session['delivery_location'] = location_label + else: + request.session.pop('delivery_location', None) + _clear_checkout_source(request, source_key) - messages.success(request, 'Order created successfully. Complete payment to finish checkout.') + messages.success(request, 'Order created successfully. Complete the payment step to finish checkout.') return redirect('payment', order_id=order.id) - return render( - request, - 'order/checkout.html', - { - 'products': cart_products, - 'total': total, - 'delivery': { - 'full_name': request.user.get_full_name(), - 'phone': '', - 'address': '', - }, - }, + initial_delivery = delivery_payload_from_profile( + profile, + full_name=request.user.get_full_name() or request.user.username, + selected_shortcut_id=selected_shortcut_id, ) + if selected_shortcut is not None: + initial_delivery = build_delivery_payload( + full_name=selected_shortcut['full_name'] or request.user.get_full_name() or request.user.username, + phone=selected_shortcut['phone'], + address=selected_shortcut['address'], + location_label=selected_shortcut['location_label'], + delivery_notes=selected_shortcut['delivery_notes'], + latitude=selected_shortcut['latitude'], + longitude=selected_shortcut['longitude'], + location_accuracy_m=selected_shortcut['location_accuracy_m'], + save_as_default=True, + selected_shortcut_id=selected_shortcut_id, + ) - -GATEWAY_OPTIONS = { - 'esewa': { - 'name': 'eSewa', - 'description': 'Pay securely using eSewa mobile wallet or QR code.', - 'button_text': 'Pay with eSewa', - }, - 'khalti': { - 'name': 'Khalti', - 'description': 'Complete payment instantly with Khalti.', - 'button_text': 'Pay with Khalti', - }, - 'fonpay': { - 'name': 'Fonpay', - 'description': 'Use Fonpay to pay from your mobile wallet.', - 'button_text': 'Pay with Fonpay', - }, -} + return _render_checkout( + request, + cart_products=cart_products, + total=total, + delivery=initial_delivery, + delivery_shortcuts=delivery_shortcuts, + ) @login_required def payment_page(request, order_id): order = get_object_or_404(Order, id=order_id, user=request.user) + payment_context = _build_payment_options(order) - if order.status == 'Paid': + if order.payment_status == 'Paid' or order.status == 'Paid': messages.info(request, 'This order has already been paid.') return redirect('order_detail', order_id=order.id) + if request.GET.get('cancelled'): + messages.warning(request, 'Payment was cancelled. Your order is still saved and waiting for payment.') + if request.method == 'POST': - method = request.POST.get('payment') - if not method: - messages.error(request, 'Please select a payment method.') + method = request.POST.get('payment', '').strip() + + if method == 'esewa': + if not payment_context['esewa_ready']: + messages.error(request, 'eSewa is not configured yet. Add the merchant credentials to enable it.') + return redirect('payment', order_id=order.id) + + try: + gateway = build_esewa_redirect(request, order) + except PaymentGatewayError as exc: + messages.error(request, str(exc)) + return redirect('payment', order_id=order.id) + except Exception: + logger.exception('Unable to start eSewa payment for order %s', order.id) + messages.error(request, 'We could not start the eSewa payment window right now. Please try again in a moment.') + return redirect('payment', order_id=order.id) + + _save_order_updates( + order, + payment_method='eSewa', + payment_provider='esewa', + payment_status='Pending', + payment_reference='', + payment_session_id=gateway['session_id'], + payment_currency=gateway['currency'], + ) + return render( + request, + 'order/payment_redirect.html', + { + 'order': order, + 'gateway_name': 'eSewa', + 'action_url': gateway['action_url'], + 'fields': gateway['fields'], + }, + ) + + if method == 'khalti': + if not payment_context['khalti_ready']: + messages.error(request, 'Khalti is not configured yet. Add the Khalti secret key to enable it.') + return redirect('payment', order_id=order.id) + + try: + gateway = initiate_khalti_payment(request, order) + except PaymentGatewayError as exc: + messages.error(request, str(exc)) + return redirect('payment', order_id=order.id) + except Exception: + logger.exception('Unable to start Khalti payment for order %s', order.id) + messages.error(request, 'We could not start Khalti right now. Please try again in a moment.') + return redirect('payment', order_id=order.id) + + _save_order_updates( + order, + payment_method='Khalti', + payment_provider='khalti', + payment_status='Pending', + payment_reference=gateway['reference'], + payment_session_id=gateway['session_id'], + payment_currency=gateway['currency'], + ) + return redirect(gateway['payment_url']) + + if method == 'fonepay': + messages.error( + request, + 'Fonepay automation is intentionally disabled until the official merchant onboarding/API details are available.', + ) return redirect('payment', order_id=order.id) - method_key = method.lower().replace(' ', '') - if method_key in GATEWAY_OPTIONS: - return redirect('payment_gateway', order_id=order.id, gateway=method_key) + if method == 'stripe': + if not payment_context['stripe_ready']: + messages.error(request, 'Online card payments are not configured yet. Add a Stripe secret key to enable them.') + return redirect('payment', order_id=order.id) - if method == 'Cash on Delivery': - order.payment_method = method - order.status = 'Paid' - order.save(update_fields=['payment_method', 'status']) - messages.success(request, 'Cash on Delivery selected. Your order is confirmed.') - return redirect('success') + try: + session = create_checkout_session(request, order) + except Exception: + logger.exception('Unable to start Stripe Checkout for order %s', order.id) + messages.error(request, 'We could not start the secure payment window right now. Please try again in a moment.') + return redirect('payment', order_id=order.id) - messages.error(request, 'Selected payment method is not supported.') + _save_order_updates( + order, + payment_method='Card / Wallet', + payment_provider='stripe', + payment_status='Pending', + payment_currency=settings.STRIPE_CURRENCY.upper(), + payment_session_id=stripe_value(session, 'id', '') or '', + ) + + checkout_url = stripe_value(session, 'url') + if not checkout_url: + messages.error(request, 'Stripe did not return a checkout URL. Please try again.') + return redirect('payment', order_id=order.id) + return redirect(checkout_url) + + if method == 'cod': + _save_order_updates( + order, + payment_method='Cash on Delivery', + payment_provider='offline', + payment_status='Pending', + payment_reference='', + payment_session_id='', + payment_currency=payment_currency(), + ) + messages.success(request, 'Cash on delivery selected. You can still switch to an online wallet later if you want.') + return redirect(f"{reverse('success')}?order_id={order.id}") + + messages.error(request, 'Please choose a supported payment method.') return redirect('payment', order_id=order.id) - return render(request, 'order/payment.html', {'order': order, 'gateways': GATEWAY_OPTIONS}) + return render( + request, + 'order/payment.html', + { + 'order': order, + 'currency_code': payment_currency(), + 'esewa_sandbox': settings.ESEWA_SANDBOX, + **payment_context, + }, + ) @login_required def payment_gateway(request, order_id, gateway): + messages.info(request, 'Use the payment selection page to start the gateway securely.') + return redirect('payment', order_id=order_id) + + +@login_required +def esewa_return(request): + order_id = request.GET.get('order_id') order = get_object_or_404(Order, id=order_id, user=request.user) - if order.status == 'Paid': + if order.payment_status == 'Paid': messages.info(request, 'This order has already been paid.') - return redirect('order_detail', order_id=order.id) + return redirect(f"{reverse('success')}?order_id={order.id}") - gateway_data = GATEWAY_OPTIONS.get(gateway) - if gateway_data is None: - messages.error(request, 'Selected payment gateway is not available.') + if request.GET.get('failed'): + _save_order_updates( + order, + payment_method='eSewa', + payment_provider='esewa', + payment_status='Failed', + payment_currency=payment_currency(), + ) + messages.warning(request, 'eSewa payment was not completed. Your order is still saved and waiting for payment.') return redirect('payment', order_id=order.id) - if request.method == 'POST': - order.payment_method = gateway_data['name'] - order.status = 'Paid' - order.save(update_fields=['payment_method', 'status']) - messages.success(request, f'Payment completed through {gateway_data["name"]}.') - return redirect('success') + try: + result = verify_esewa_payment(order, request.GET.get('data', '')) + except PaymentGatewayError as exc: + logger.warning('Unable to verify eSewa payment for order %s: %s', order.id, exc) + messages.error(request, str(exc)) + return redirect('payment', order_id=order.id) + except Exception: + logger.exception('Unexpected eSewa verification error for order %s', order.id) + messages.error(request, 'We could not verify the eSewa payment yet. Please try again.') + return redirect('payment', order_id=order.id) - return render(request, 'order/payment_gateway.html', {'order': order, 'gateway': gateway_data}) + if result['status'] == 'Paid': + _mark_order_paid( + order, + payment_method='eSewa', + payment_provider='esewa', + payment_reference=result['reference'], + payment_session_id=result['session_id'], + payment_currency_value=result['currency'], + ) + messages.success(request, result['message']) + return redirect(f"{reverse('success')}?order_id={order.id}") + + if result['status'] == 'Pending': + _save_order_updates( + order, + payment_method='eSewa', + payment_provider='esewa', + payment_status='Pending', + payment_session_id=result['session_id'], + payment_currency=result['currency'], + ) + messages.info(request, result['message']) + else: + _save_order_updates( + order, + payment_method='eSewa', + payment_provider='esewa', + payment_status='Failed', + payment_session_id=result['session_id'], + payment_currency=result['currency'], + ) + messages.warning(request, result['message']) + + return redirect('payment', order_id=order.id) +@login_required +def khalti_return(request): + order_id = request.GET.get('order_id') + order = get_object_or_404(Order, id=order_id, user=request.user) + + if order.payment_status == 'Paid': + messages.info(request, 'This order has already been paid.') + return redirect(f"{reverse('success')}?order_id={order.id}") + + pidx = request.GET.get('pidx', '').strip() + if not pidx: + _save_order_updates( + order, + payment_method='Khalti', + payment_provider='khalti', + payment_status='Failed', + payment_currency=payment_currency(), + ) + messages.warning(request, 'Khalti payment was not completed. Your order is still saved and waiting for payment.') + return redirect('payment', order_id=order.id) + + try: + result = verify_khalti_payment(order, pidx) + except PaymentGatewayError as exc: + logger.warning('Unable to verify Khalti payment for order %s: %s', order.id, exc) + messages.error(request, str(exc)) + return redirect('payment', order_id=order.id) + except Exception: + logger.exception('Unexpected Khalti verification error for order %s', order.id) + messages.error(request, 'We could not verify the Khalti payment yet. Please try again.') + return redirect('payment', order_id=order.id) + + if result['status'] == 'Paid': + _mark_order_paid( + order, + payment_method='Khalti', + payment_provider='khalti', + payment_reference=result['reference'], + payment_session_id=result['session_id'], + payment_currency_value=result['currency'], + ) + messages.success(request, result['message']) + return redirect(f"{reverse('success')}?order_id={order.id}") + + if result['status'] == 'Pending': + _save_order_updates( + order, + payment_method='Khalti', + payment_provider='khalti', + payment_status='Pending', + payment_session_id=result['session_id'], + payment_currency=result['currency'], + ) + messages.info(request, result['message']) + else: + _save_order_updates( + order, + payment_method='Khalti', + payment_provider='khalti', + payment_status='Failed', + payment_session_id=result['session_id'], + payment_currency=result['currency'], + ) + messages.warning(request, result['message']) + + return redirect('payment', order_id=order.id) + + +@login_required def success(request): - return render(request, 'order/success.html') + order_id = request.GET.get('order_id') + session_id = request.GET.get('session_id', '').strip() + + if not order_id: + messages.info(request, 'Open an order to view its payment status.') + return redirect('my_orders') + + order = get_object_or_404(Order, id=order_id, user=request.user) + payment_verified = order.payment_status == 'Paid' + verification_message = 'Your order has been created successfully.' + + if session_id: + if not stripe_configured(): + verification_message = 'The order exists, but Stripe is not configured on the server to verify the payment session.' + else: + try: + session = retrieve_checkout_session(session_id) + except Exception: + logger.exception('Unable to verify Stripe checkout session %s for order %s', session_id, order.id) + verification_message = 'We could not verify the payment yet. Please refresh this page or open the order details page.' + else: + metadata = stripe_value(session, 'metadata', {}) or {} + session_order_id = str(metadata.get('order_id') or stripe_value(session, 'client_reference_id', '') or '') + if session_order_id != str(order.id): + verification_message = 'The returned payment session did not match this order, so payment could not be confirmed.' + elif stripe_value(session, 'payment_status') == 'paid': + _mark_order_paid_from_stripe(order, session) + payment_verified = True + verification_message = 'Payment verified successfully. Your order is confirmed.' + else: + verification_message = 'Your order was created, but Stripe has not marked the payment as paid yet.' + elif order.payment_status == 'Paid': + payment_verified = True + verification_message = 'Payment verified successfully. Your order is confirmed.' + elif order.payment_status == 'Failed': + provider_name = order.payment_provider_label if order.payment_provider else 'payment gateway' + verification_message = f'The last {provider_name} attempt did not complete. You can retry from the payment page.' + elif order.payment_method == 'Cash on Delivery': + verification_message = 'Your order is confirmed. Payment will be collected on delivery, and you can still switch to an online wallet before shipment if needed.' + elif order.payment_provider == 'esewa': + verification_message = 'Your order was created, but eSewa has not marked the payment as complete yet.' + elif order.payment_provider == 'khalti': + verification_message = 'Your order was created, but Khalti has not marked the payment as complete yet.' + elif order.payment_provider == 'stripe': + verification_message = 'Your order was created, but Stripe has not marked the payment as complete yet.' + else: + verification_message = 'Your order is waiting for payment. You can return to the payment page any time.' + + return render( + request, + 'order/success.html', + { + 'order': order, + 'payment_verified': payment_verified, + 'verification_message': verification_message, + }, + ) + + +@csrf_exempt +def stripe_webhook(request): + if request.method != 'POST': + return HttpResponse(status=405) + + if not stripe_configured() or not settings.STRIPE_WEBHOOK_SECRET: + return HttpResponse('Stripe webhook is not configured.', status=503) + + signature = request.META.get('HTTP_STRIPE_SIGNATURE', '') + + try: + event = construct_webhook_event(request.body, signature) + except Exception: + logger.exception('Invalid Stripe webhook received') + return HttpResponse(status=400) + + event_type = event.get('type', '') + session = event.get('data', {}).get('object', {}) + metadata = stripe_value(session, 'metadata', {}) or {} + order_id = str(metadata.get('order_id') or stripe_value(session, 'client_reference_id', '') or '').strip() + order = Order.objects.filter(id=order_id).first() if order_id else None + + if order and event_type in {'checkout.session.completed', 'checkout.session.async_payment_succeeded'}: + _mark_order_paid_from_stripe(order, session) + elif order and event_type == 'checkout.session.expired' and order.payment_status != 'Paid': + _save_order_updates(order, payment_status='Failed') + + return HttpResponse(status=200) @login_required def my_orders(request): - orders = list(Order.objects.filter(user=request.user).order_by('-created_at')) - for order in orders: - _sync_demo_status(order) - return render(request, 'order/my_orders.html', {'orders': orders}) + status_filter = request.GET.get('status', '').strip() + payment_filter = request.GET.get('payment', '').strip() + + valid_statuses = [choice[0] for choice in Order.STATUS_CHOICES] + valid_payment_statuses = [choice[0] for choice in Order.PAYMENT_STATUS_CHOICES] + + if status_filter not in valid_statuses: + status_filter = '' + if payment_filter not in valid_payment_statuses: + payment_filter = '' + + base_orders = Order.objects.filter(user=request.user) + orders = base_orders.prefetch_related('items__product').order_by('-created_at') + + if status_filter: + orders = orders.filter(status=status_filter) + if payment_filter: + orders = orders.filter(payment_status=payment_filter) + + order_summary = { + 'total': base_orders.count(), + 'paid': base_orders.filter(payment_status='Paid').count(), + 'pending_payment': base_orders.exclude(payment_status='Paid').count(), + 'shipped': base_orders.filter(status='Shipped').count(), + 'delivered': base_orders.filter(status='Delivered').count(), + } + + return render( + request, + 'order/my_orders.html', + { + 'orders': orders, + 'order_summary': order_summary, + 'status_filters': valid_statuses, + 'payment_filters': valid_payment_statuses, + 'selected_status': status_filter, + 'selected_payment_status': payment_filter, + 'has_order_filters': bool(status_filter or payment_filter), + }, + ) @login_required def order_detail(request, order_id): - order = get_object_or_404(Order, id=order_id, user=request.user) - _sync_demo_status(order) + order = get_object_or_404(Order.objects.prefetch_related('items__product'), id=order_id, user=request.user) timeline = _build_timeline(order.status) return render(request, 'order/order_detail.html', {'order': order, 'timeline': timeline}) diff --git a/myproject/products/__pycache__/apps.cpython-311.pyc b/myproject/products/__pycache__/apps.cpython-311.pyc index 73cf74628f1191c399a133a4d24508c80e64d8e0..e1f6fc1450ff186fac32a98da6bec934b5799970 100644 GIT binary patch delta 259 zcmaFLyoiN&IWI340}!;e@n%h#$XgmA2INdDRbio&)U?FXoRauNppy7BkeZ3NBjhE4RyM%l4M~d&EMhmfMH^f|u!wiE52Laa v4^T}JFNoj+62CZXfcBNz`4J@g1&b8eFaVbaFjD{k diff --git a/myproject/products/__pycache__/models.cpython-311.pyc b/myproject/products/__pycache__/models.cpython-311.pyc index 55c26fe2149b05ee3e3b25947fbec760a3184e3c..0f815ee6eb9d97d7b4531418e5c2fc10f58485ea 100644 GIT binary patch delta 1955 zcmaJ?U2GIp6rQ^~Kl|HlDebn>Us_uyHf{OoQYoOc*d-8FuvMA{qQlN?J9WAPccvI> zbxA}8!$X^EqA_S1V`>a&Fud@<15ZYin(UG)%@`6Md?6-gi9Y#&o-?zpT}-&yIdjkV zoqO&%XU@I*Yy0- z?5V<_X})36h^GaU)J$ts2iH*#;g4!yT;VA>VbnAYi^e=vd?}OB!MxH_rNg?Np476m zszi@c<*a7VO`aOsKVzHIrmdgVXm!aVsZbRbZ1z;)s6rvo8c&mwT2`ZqL2Esory47e zF7oM(N90{!gVv}vU*ML2y9$pt#kak{+>6!DTbJf8&*cMKD5j8JcL)l$9lH4Q4-g-7bKDfX zy+NnhcY)^ENx;@u&{tU@(2&~*%|iPm zuu|2nv^kTtUn{Y*bw{bG&ZO;bRnL`ENmyVRAkK65!?BfcQ<3upcP;K*X-nMPeCw$@ zZA1CCp&$6=5WH6F8m@#EM^~QiFVywlJaFq!AwK+5Xa42mKXxy77iz~YCht|(&cAs# z-gzh9`Hghl|8?YAq!900iT4$%6D!q;d?c|d#wstKf!50e`!diHZnpGA2%xMHFpZ#c zR?!XRl%dU5t;N3%r7&*14C^jA~)c3JMte%`;zsEXcj3y<= zHg1Y0Zk|yO3<=O7arai7>w-T;*6-_l1UIlUXSlM*MP>isTD!Zw&2IX3 zH{eJpNJOHCP|2DLH$H?~^@5PXUjPzUa)M|p#FgAqi4zxiv+F`@%lggye(yJL-n^Op zIs16D^I=CvT)^MJP)GfXc(d~q*=e2~9I6Uh_#1LNqD3^Z8oDipgatv9_5@9);kwi` z`%|(nMNx{iq-0c!7lmx%nCEN$`0B2RV>aZ;d8?!w)CQ@=bE;j_EfeH`M;5J33ekW_ zvs87R2Emp zWWzAXZ6n+!YqX-eh667kYehV{T(j^rHk@J0;_xWn6+%2t;0zAA<8WZk;Nb6u#-{lF z)r(3EyREn-*K}NkeniW7PEbCyV8h;0%T(EHY=Kp$WklR|!R|=I(j?D5&4@g}zLLht6#GRQ?0XYMn_t)`!cnSczi}8n1(WDm65m4c5i7_8 z$qU>=5Hc{uTscdo*_ZMNnPfl7cb*R_(X-?NyBSq5ct0^fuCuSB@62eVC_Db7oH?VVI1ILCNP;BI?@-Ha*nQL5|SU99bXVzM8u@+|Z1so3v{VKUGD zN%Z&d!>(jc!|U8L!QmXsCdbkdoO-djnhH6c8XBBumE^CvX>Pd0Ls4ub-YdS9S*|T` zSmLnEfp-i1K2Gu3i%($)CwAiCvyR_LZ~8yun z-FI-9iWBl0d))P2PC;!YD?VE*DqhMp^}8-zcdROPY82oNRNG7NE3aW-m3^EZd3whW z((h(;?yhq<&!Mg5aEZOtJwS?Vs{57QpjoN50>JN8JZAybtL8P@0RBw9)Xa^w#q}G- z`RnWX)hqMMo;){GoSV5a5B`pRPyB7)=i7e3;lK8_S6|}M65nTu{n7ocUkGqn bW-$VBu`H1Iz|6?Vc!NRV0yb2{22=q6+GjeY literal 0 HcmV?d00001 diff --git a/myproject/products/__pycache__/views.cpython-311.pyc b/myproject/products/__pycache__/views.cpython-311.pyc index 1361085d3638e16c26cf9de1f0a1bda7c38e433f..0ef7cb6fc9fba55a72b4818a9dc6e0e94edae943 100644 GIT binary patch delta 2637 zcmZ`*Z)h9m8NZY6q|@o|S+Nu;v3s$d+FDw!*H{f*|5(pmdDUF@{ICFWr|t&&hIP z+`imBdfwmrywCgmeNUfG{9>kYHyRZg7;lb8FTI>(n7`trH~1aq%a4Ki4MP~h>P(d_ zvMlmG-B$8&nHDinoks2Hk>MbX1}JzR|xBftkpP>)t)#aOiw zFUA27NQj6eOd_|qVuD0(Fhz+RAn_Y)v5zERmQ-0H-C*v38TWg}F~tLb_U%La0Zr~h zQzW*;sdSanlM&7jqiuC1#?DT7fJgKDZt$6!%% zj&kn|WPn>N`+)Yw0bo4U8$stu`lT(Azs^M}%r(*W(~K={O3qt+a+o29ZU4Ir8My7g z!$N@J?GBc)d3vxXcZ4B>HvcYj+qX|DNc($IhZyqQzIBd%ySE->h-{58j5Ey-e#_=; z?hY7yf7j@*RqxwOqM@%bR<36n!;sY8V;&sYJHHmTjy;vO88T%1Y{BO3pzViqL$+@- zg<73Ig{IgZH=?h3CAnTDAFKV@tu6Wf& zV+e&`EK?QBRw-FD4v1ria|?%nsfU3qsU=!onUX)>xK+nvKi{~$F23BYsH;=*dUPH( z*QrWmqo!Y74=jNRQ!+G-Sh`$Mx`plB3+MCmfTf6LmW_JN>KdRZnpvysI-LT=xtJ@g zQiIgXmPtpPzlCo!+(b_vs~Gorl5VV2wzSKta#7PQm6~qfO376AV!4Af0!ry~KwP0z zs~Hy9OanOepDrxB{)%eRA)NBij4E{lU2PPvF;_4sQ5#gbaMf!W*KdOKB(5YhII3=~ zs5MK&#v(KdFqM%Eqd<7+N9UH6S7+x6uP(WvQl&!G3LcG}OG7BZd#_G6I2ESp=9)(z%KJoU@Q0!EOvsCZHDD1 zJ3{KQFz`qiXbw(%Pyo_>TEg+RaJ(rT?*tE`-1pgM1gD$FPBaIn;b{poZDFP<%9cQ9xk^==h~xl&B0Ufw1h%iC^Ut_ zXHw>|H2g>!{)749EQmjy!fZ{(k(=_04!oUTDh;kL9ID z@={Aa-TtSIT;w zsPqklu(s$~Bv?*vK)nJvGQE1q@$@_{d>4s=Yu6T913euMIuz!oqIC|>d880&EJH)}W$}`AA@xKVYgiG8rA*ur43RE>$ zjhd;Nm=p{VO*=~Z5O2ctZKsi*1N9%L{}?z9bE-IRAIzWM^|YHMuiaxN_*b?Rs_I^| zV*}@W-P7v8oA@z8YaZuP_Ki6vKG2C}I?_m| n@91`jkNdV6ARFQBM37BwGrQ!#DVBxi*hd$A&Ofp>4z2h<5b~iR delta 1657 zcmZWp-D@0G6rZ~vvtP3xO*U)N?IxvB>ZUY{AZ@Y1QZY@f8e>cpM$0&zxk)yi*@@@Q zx=C1Ag*=G}av%JlXrCgbBEtGmAN4N~UkXEg@&iUOl_nzPH zoSBa<+&k0zCZEr0xW>lw>!T%2`<;S=729|2e~->*nyb0Y(|l$!Mt;nT`EfI@{J59! zlV(!+2~YP^X39^SX+L9T6qfX|e$LFHue&MF@bhNgFPH^(Rddrjnpt#SPOjKXkTl$ z!ghmia;F^z(C7qkU2ND6Z}?jq5Ug`2Y{-T9ODre9j9)~1FW%LMu#l)CgLp-UN%XUF zJMnp~jNZI+AQRP!5^8b$-@lpcH_o+#xRKq(<8RXyY9YBq=Owc zTdVS`d_7UY=ViGtU8rZHG%Dq`olwAp+$iky>cf!3Z8%DIr0rHK2=NF=QW&3`U5etX zJcJsBNiXPdi1d}FhZ&GiPXyp{u&!+>aih4vI<-KjK0)RJ8bL3@@xukG<;Ffw z%WLAvuVDuDT>OAN|3Le#Soyejw|Mf`Vt=hP6_bm@yt+4%%VhU7H2`9Fh?OJM=8GPcx}{Yksy)(6t@Ad!T~Rrhj!Bglcx4%`AOv`R_-r6@iptc zPLD33i4rZo8AitCrKJUHarV;e;_RYQ;sI;a4R~0#>WmtIJT}`3z#0tFpp&}GJ&p~3 zkz!%Rjnw7!Ro5Vtxi*{scx)b_EmXj ztk25QJ9_JiQiiyr4yr0ukU}$v!n?GU_@6`$0#O>c*a%vJ3u+2U1VhrQR+CK(*JZEz z0v`W!^+){-#;`0uJT|?2$aK&px*{qFb_n>z@O3wR9kYRXH(zx5aVf zvLH+}pAqVXPEnY>jDj3Bz}P_))g^-JGLc$RU6B!0JAF}bG!Y)HqxUyxA) z`dJyf<+B`iD-#2RnTfI3R|N9PUCv1CL}Bu1W@hHTjlGC+yKveLj%bVV-Z{7DhLIbz z?5NkJHV%mGGfoq|s7lKHvg!z&F!02qPQ+Q@Iw2nb<>1p7S;O^c$Oj9)fWtPlh!5pl zead{wFXTj+Fh=?eO?z9=48zwrTO&og>3<=(}JsPy4HpIeyqQ9Zowoy zI5#r=k(loGxCTdLAdK(>z}D%LYRFiVQbiuqwqB$rGH!e^_sZAz$8YYBOzc-Cw{P!N zCR2o_BJCW0)M`4oR`oaHHM*uBW_X-os;h>1hyacSq>5J2ww{TH-|MScs;Y@WIyh*t zY0}90mh~#vdsn1oxl>@BlxOqiKjhOuCHRN00a8VhB=`oY`U~Cp_m^se66pRHw#~ia NTZbZW{GVuc?jH+0Lv8>7 literal 0 HcmV?d00001 diff --git a/myproject/products/models.py b/myproject/products/models.py index 5e5eeb9..95eff53 100644 --- a/myproject/products/models.py +++ b/myproject/products/models.py @@ -1,3 +1,5 @@ +from decimal import Decimal + from django.conf import settings from django.db import models @@ -64,6 +66,13 @@ class Product(models.Model): def savings(self): if self.discount_price and self.discount_price < self.price: return self.price - self.discount_price + return Decimal('0') + + @property + def discount_percent(self): + if self.discount_price and self.discount_price < self.price and self.price: + percent = ((self.price - self.discount_price) / self.price) * Decimal('100') + return int(percent.quantize(Decimal('1'))) return 0 @property diff --git a/myproject/products/views.py b/myproject/products/views.py index 64adfb6..e784d59 100644 --- a/myproject/products/views.py +++ b/myproject/products/views.py @@ -1,11 +1,18 @@ from django.contrib.auth.decorators import login_required -from django.db.models import Q +from django.db.models import Avg, Q from django.db.models.functions import Coalesce from django.shortcuts import get_object_or_404, redirect, render from cart.views import add_to_cart from .models import Product, WishlistItem +SORT_LABELS = { + 'newest': 'Newest first', + 'rating': 'Top rated', + 'price_asc': 'Price low to high', + 'price_desc': 'Price high to low', +} + def _normalized_categories(): categories = [choice[0] for choice in Product.CATEGORY_CHOICES] @@ -54,6 +61,18 @@ def product_list(request, category=None): if request.user.is_authenticated: wishlist_ids = set(WishlistItem.objects.filter(user=request.user).values_list('product_id', flat=True)) + active_filters = [] + if query: + active_filters.append(f'Search: “{query}”') + if selected_category: + active_filters.append(f'Category: {selected_category}') + if selected_featured: + active_filters.append('Featured only') + if sort: + active_filters.append(f'Sort: {SORT_LABELS.get(sort, sort)}') + + aggregates = products.aggregate(avg_rating=Avg('rating')) + return render( request, 'products/product_list.html', @@ -68,6 +87,10 @@ def product_list(request, category=None): 'products_count': products.count(), 'featured_count': products.filter(featured=True).count(), 'in_stock_count': products.filter(stock__gt=0).count(), + 'discounted_count': products.filter(discount_price__isnull=False).count(), + 'avg_rating': aggregates.get('avg_rating') or 0, + 'active_filters': active_filters, + 'has_active_filters': bool(active_filters), }, ) @@ -115,4 +138,3 @@ def move_wishlist_to_cart(request, product_id): def wishlist_view(request): wishlist_items = WishlistItem.objects.filter(user=request.user).select_related('product') return render(request, 'products/wishlist.html', {'wishlist_items': wishlist_items}) - diff --git a/myproject/static/css/auth.css b/myproject/static/css/auth.css index acd8f4d..81c1948 100644 --- a/myproject/static/css/auth.css +++ b/myproject/static/css/auth.css @@ -1,131 +1,266 @@ -.auth-container { - display: flex; - justify-content: center; - align-items: center; - min-height: 76vh; - padding: 24px; -} - -.auth-box { - background: #fff; - border: 1px solid #dbe4f8; - border-radius: 24px; - padding: 36px; - width: 100%; - max-width: 420px; - box-shadow: 0 24px 60px rgba(15, 23, 42, 0.08); -} - -.auth-box h2 { - font-size: 2rem; - margin-bottom: 18px; - color: #0f172a; - text-align: center; -} - -.auth-form { - margin-top: 24px; - display: grid; - gap: 18px; -} - -.form-group { - display: grid; - gap: 8px; -} - -.form-group label { - font-weight: 700; - color: #334155; -} - -.form-group input { - width: 100%; - padding: 14px 16px; - border: 1px solid #cbd5e1; - border-radius: 14px; - background: #f8fbff; - color: #0f172a; - font-size: 1rem; - transition: border-color 0.2s ease, box-shadow 0.2s ease; -} - -.form-group input:focus { - outline: none; - border-color: #3b82f6; - box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.12); -} - -.form-group input::placeholder { - color: #94a3b8; -} - -.form-group small { - color: #64748b; - font-size: 0.85rem; -} - -.btn-primary { - width: 100%; - padding: 14px; - background: linear-gradient(135deg, #2874f0 0%, #3b82f6 100%); - color: #fff; - border: none; - border-radius: 14px; - font-weight: 700; - font-size: 1rem; - cursor: pointer; - transition: transform 0.2s ease, box-shadow 0.2s ease; - margin-top: 10px; -} - -.btn-primary:hover { - transform: translateY(-1px); - box-shadow: 0 18px 30px rgba(40, 116, 240, 0.24); -} - -.alert { - padding: 14px 16px; - border-radius: 14px; - margin-bottom: 12px; - font-weight: 500; -} - -.alert-success { - background: #ecfdf5; - border: 1px solid #34d399; - color: #065f46; -} - -.alert-error { - background: #fef2f2; - border: 1px solid #ef4444; - color: #b91c1c; -} - -.auth-link { - text-align: center; - margin-top: 18px; - color: #475569; -} - -.auth-link a { - color: #2563eb; - text-decoration: none; - font-weight: 700; -} - -.auth-link a:hover { - text-decoration: underline; -} - -/* Responsive */ -@media (max-width: 480px) { - .auth-box { - padding: 24px; - } - - .auth-box h2 { - font-size: 1.6rem; - } -} +.auth-container { + display: flex; + justify-content: center; + align-items: center; + min-height: 76vh; + padding: 24px; +} + +.auth-container--wide { + align-items: flex-start; +} + +.auth-box { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 24px; + padding: 36px; + width: 100%; + max-width: 420px; + box-shadow: 0 24px 60px rgba(15, 23, 42, 0.08); +} + +.auth-box--wide { + max-width: 860px; +} + +.auth-copy-block { + display: grid; + gap: 8px; +} + +.auth-copy-block p { + color: var(--muted); + line-height: 1.7; +} + +.auth-box h2 { + font-size: 2rem; + margin-bottom: 4px; + color: var(--text); +} + +.auth-form { + margin-top: 24px; + display: grid; + gap: 18px; +} + +.auth-form--wide { + gap: 20px; +} + +.auth-form-grid { + gap: 18px; +} + +.form-group { + display: grid; + gap: 8px; +} + +.form-group--full { + grid-column: 1 / -1; +} + +.form-group label { + font-weight: 700; + color: var(--text); +} + +.form-group input, +.form-group textarea, +.form-group select { + width: 100%; + padding: 14px 16px; + border: 1px solid #cbd5e1; + border-radius: 14px; + background: #f8fbff; + color: #0f172a; + font-size: 1rem; + transition: border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease; +} + +.form-group textarea { + min-height: 110px; + resize: vertical; +} + +.form-group input:focus, +.form-group textarea:focus, +.form-group select:focus { + outline: none; + border-color: #3b82f6; + box-shadow: 0 0 0 4px rgba(59, 130, 246, 0.12); + background: #fff; +} + +.form-group input::placeholder, +.form-group textarea::placeholder { + color: #94a3b8; +} + +.form-group small, +.field-note { + color: #64748b; + font-size: 0.85rem; + line-height: 1.6; +} + +.field-errors { + color: #b91c1c; + font-size: 0.85rem; +} + +.field-errors ul { + margin: 0; + padding-left: 18px; +} + +.form-group--checkbox { + background: var(--surface-soft); + border: 1px solid var(--border); + border-radius: 16px; + padding: 16px 18px; +} + +.checkbox-label { + display: inline-flex; + align-items: center; + gap: 10px; + font-weight: 700; + cursor: pointer; +} + +.checkbox-label input { + width: 18px; + height: 18px; +} + +.btn-primary { + width: 100%; + padding: 14px; + background: linear-gradient(135deg, #2874f0 0%, #3b82f6 100%); + color: #fff; + border: none; + border-radius: 14px; + font-weight: 700; + font-size: 1rem; + cursor: pointer; + transition: transform 0.2s ease, box-shadow 0.2s ease; + margin-top: 4px; +} + +.btn-primary:hover { + transform: translateY(-1px); + box-shadow: 0 18px 30px rgba(40, 116, 240, 0.24); +} + +.alert { + padding: 14px 16px; + border-radius: 14px; + margin-bottom: 12px; + font-weight: 500; +} + +.alert-success { + background: #ecfdf5; + border: 1px solid #34d399; + color: #065f46; +} + +.alert-error { + background: #fef2f2; + border: 1px solid #ef4444; + color: #b91c1c; +} + +.auth-link { + text-align: center; + margin-top: 18px; + color: #475569; +} + +.auth-link a { + color: #2563eb; + text-decoration: none; + font-weight: 700; +} + +.auth-link a:hover { + text-decoration: underline; +} + +body.theme-dark .auth-box, +body.theme-dark .form-group--checkbox { + background: var(--surface); + border-color: var(--border); +} + +body.theme-dark .form-group input, +body.theme-dark .form-group textarea, +body.theme-dark .form-group select { + background: var(--surface-soft); + border-color: var(--border); + color: var(--text); +} + +body.theme-dark .form-group input:focus, +body.theme-dark .form-group textarea:focus, +body.theme-dark .form-group select:focus { + background: var(--surface); +} + +body.theme-dark .auth-link, +body.theme-dark .field-note, +body.theme-dark .form-group small, +body.theme-dark .auth-copy-block p { + color: var(--muted); +} + +body.theme-dark .alert-success { + background: rgba(22, 163, 74, 0.12); + border-color: rgba(74, 222, 128, 0.32); + color: #bbf7d0; +} + +body.theme-dark .alert-error { + background: rgba(239, 68, 68, 0.12); + border-color: rgba(248, 113, 113, 0.3); + color: #fecaca; +} + +@media (max-width: 768px) { + .auth-container { + padding: 16px; + } + + .auth-box { + padding: 28px 22px; + } + + .auth-box h2 { + font-size: 1.8rem; + } +} + +@media (max-width: 480px) { + .auth-box { + padding: 22px 16px; + border-radius: 20px; + } + + .auth-form, + .auth-form--wide { + gap: 16px; + } + + .checkbox-label { + align-items: flex-start; + } + + .btn-primary, + .location-card .btn { + width: 100%; + } +} diff --git a/myproject/static/css/home.css b/myproject/static/css/home.css index 4f934de..06a11ae 100644 --- a/myproject/static/css/home.css +++ b/myproject/static/css/home.css @@ -274,3 +274,199 @@ .top-category-bar { padding: 10px 16px; } .top-navbar { padding: 12px 16px; } } + +.hero-metric-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; +} + +.hero-metric-card { + background: rgba(255, 255, 255, 0.12); + border: 1px solid rgba(255, 255, 255, 0.18); + border-radius: 18px; + padding: 16px 18px; + display: grid; + gap: 6px; +} + +.hero-metric-card strong { + font-size: 1.45rem; +} + +.hero-metric-card span { + color: rgba(255, 255, 255, 0.82); + font-size: 0.92rem; +} + +.market-pill { + display: grid; + gap: 4px; +} + +.market-pill strong { + font-size: 1rem; +} + +.market-pill span { + color: var(--muted); + font-size: 0.94rem; + font-weight: 600; +} + +.spotlight-shell, +.experience-shell, +.quick-action-shell { + margin-top: 10px; +} + +.spotlight-grid, +.experience-grid, +.quick-action-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 18px; +} + +.spotlight-card, +.experience-card, +.quick-action-card { + background: #fff; + border: 1px solid #dbe4f8; + border-radius: 22px; + padding: 22px; + box-shadow: var(--shadow-soft); + display: grid; + gap: 12px; +} + +.spotlight-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; +} + +.spotlight-kicker { + color: #2563eb; + font-size: 0.82rem; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.spotlight-pill, +.experience-badge { + display: inline-flex; + align-items: center; + justify-content: center; + width: fit-content; + border-radius: 999px; + padding: 6px 10px; + background: #eff6ff; + color: #1d4ed8; + font-size: 0.82rem; + font-weight: 800; +} + +.spotlight-card h3, +.experience-card h3, +.quick-action-card strong { + color: var(--text); +} + +.spotlight-card p, +.experience-card p, +.quick-action-card p { + color: var(--muted); + line-height: 1.7; +} + +.spotlight-meta { + display: flex; + flex-wrap: wrap; + gap: 8px; +} + +.spotlight-meta span { + display: inline-flex; + align-items: center; + padding: 6px 10px; + border-radius: 999px; + background: #f8fbff; + border: 1px solid #dbe4f8; + color: #475569; + font-size: 0.84rem; + font-weight: 700; +} + +.quick-action-card { + text-decoration: none; + transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease; +} + +.quick-action-card:hover, +.spotlight-card:hover, +.experience-card:hover { + transform: translateY(-3px); + box-shadow: 0 18px 44px rgba(15, 23, 42, 0.12); + border-color: #bfd4ff; +} + +.deal-topline { + display: flex; + gap: 8px; + align-items: center; + flex-wrap: wrap; +} + +body.theme-dark .hero { + background: linear-gradient(135deg, #1d4ed8 0%, #1e3a8a 38%, #0f172a 100%); +} + +body.theme-dark .spotlight-card, +body.theme-dark .experience-card, +body.theme-dark .quick-action-card, +body.theme-dark .deal-card, +body.theme-dark .card, +body.theme-dark .market-pill { + background: var(--surface); + border-color: var(--border); + color: var(--text); +} + +body.theme-dark .market-pill span, +body.theme-dark .spotlight-card p, +body.theme-dark .experience-card p, +body.theme-dark .quick-action-card p, +body.theme-dark .deal-note, +body.theme-dark .section-heading p { + color: var(--muted); +} + +body.theme-dark .spotlight-meta span, +body.theme-dark .spotlight-pill, +body.theme-dark .experience-badge, +body.theme-dark .deal-badge { + background: rgba(59, 130, 246, 0.16); + border-color: rgba(96, 165, 250, 0.22); + color: #93c5fd; +} + +@media (max-width: 1024px) { + .hero-metric-grid, + .spotlight-grid, + .experience-grid, + .quick-action-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 760px) { + .hero-metric-grid, + .spotlight-grid, + .experience-grid, + .quick-action-grid { + grid-template-columns: 1fr; + } +} diff --git a/myproject/static/css/navbar.css b/myproject/static/css/navbar.css index df5f5a2..4e56505 100644 --- a/myproject/static/css/navbar.css +++ b/myproject/static/css/navbar.css @@ -322,3 +322,150 @@ justify-content: flex-end; } } + +.fk-theme-toggle { + border: 1px solid rgba(255, 255, 255, 0.22); + background: rgba(255, 255, 255, 0.1); +} + +.fk-theme-toggle .theme-icon { + font-size: 1rem; +} + +.fk-theme-toggle .theme-label { + font-weight: 700; +} + +.fk-dropdown-menu--right { + left: auto; + right: 0; +} + +body.theme-dark .fk-theme-toggle { + background: rgba(255, 255, 255, 0.08); + border-color: rgba(255, 255, 255, 0.16); +} + +@media (max-width: 768px) { + .fk-theme-toggle { + order: 2; + } +} + +.fk-location-text { + display: inline-flex; + align-items: center; + gap: 6px; + flex-wrap: wrap; +} + +.fk-location-copy { + max-width: 260px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.fk-location-link { + white-space: nowrap; +} + +@media (max-width: 960px) { + .fk-top-row, + .fk-middle-row { + flex-direction: column; + align-items: stretch; + gap: 12px; + } + + .fk-top-right { + font-size: 0.82rem; + } + + .fk-main-actions { + justify-content: space-between; + flex-wrap: wrap; + gap: 10px; + } + + .fk-action-btn { + min-height: 44px; + } +} + +@media (max-width: 640px) { + .fk-container { + padding: 0 12px; + } + + .fk-brand-btn { + width: 100%; + justify-content: center; + } + + .fk-search-bar { + min-width: 100%; + padding: 10px 12px; + } + + .fk-main-actions { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + width: 100%; + } + + .fk-action-btn, + .fk-dropdown-wrapper { + width: 100%; + } + + .fk-dropdown-wrapper > .fk-action-btn, + .fk-cart-btn { + justify-content: center; + } + + .fk-dropdown-menu, + .fk-dropdown-menu--right { + left: 0; + right: 0; + min-width: 100%; + } + + .fk-category-bar, + .nav-scrolled .fk-category-bar { + height: 82px; + } + + .fk-category-scroll, + .nav-scrolled .fk-category-scroll { + min-height: 82px; + padding: 8px 0; + } + + .fk-cat-item, + .nav-scrolled .fk-cat-item { + width: 68px; + min-width: 68px; + height: 66px; + } + + .fk-location-copy { + max-width: 180px; + } +} + +@media (max-width: 420px) { + .fk-main-actions { + grid-template-columns: 1fr; + } + + .fk-location-copy { + max-width: 120px; + } + + .fk-cat-item, + .nav-scrolled .fk-cat-item { + width: 62px; + min-width: 62px; + } +} diff --git a/myproject/static/css/product.css b/myproject/static/css/product.css index babbb83..a47185b 100644 --- a/myproject/static/css/product.css +++ b/myproject/static/css/product.css @@ -456,3 +456,1094 @@ .timeline-step.upcoming { background: #f8fafc; } @media (max-width: 760px) { .timeline { grid-template-columns: 1fr 1fr; } } + + +.page-eyebrow { + margin: 0 0 6px; + font-size: 0.82rem; + font-weight: 800; + letter-spacing: 0.08em; + text-transform: uppercase; + color: #2563eb; +} + +.payment-panel--main { + display: grid; + gap: 18px; +} + +.payment-panel-heading { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + flex-wrap: wrap; +} + +.payment-step { + margin: 0 0 6px; + font-size: 0.82rem; + font-weight: 800; + letter-spacing: 0.06em; + text-transform: uppercase; + color: #2563eb; +} + +.payment-caption { + margin: 6px 0 0; + color: var(--muted); +} + +.payment-method-card { + border: 1px solid #dbe4f8; + border-radius: 16px; + padding: 16px; + display: flex; + align-items: flex-start; + gap: 14px; + background: #f8fbff; + cursor: pointer; + transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease; +} + +.payment-method-card:hover { + border-color: #93c5fd; + box-shadow: 0 18px 44px rgba(37, 99, 235, 0.08); + transform: translateY(-1px); +} + +.payment-method-card input[type="radio"] { + margin-top: 4px; +} + +.payment-method-card.is-disabled { + opacity: 0.72; + cursor: not-allowed; +} + +.payment-method-top { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; + margin-bottom: 8px; +} + +.payment-method-body { + display: grid; + gap: 6px; + width: 100%; +} + +.payment-method-heading { + display: grid; + gap: 2px; +} + +.payment-method-subtitle { + font-size: 0.85rem; + color: #64748b; +} + +.payment-badge { + display: inline-flex; + align-items: center; + padding: 6px 10px; + border-radius: 999px; + background: #dbeafe; + color: #1d4ed8; + font-size: 0.8rem; + font-weight: 700; +} + +.payment-badge--muted { + background: #e2e8f0; + color: #475569; +} + +.payment-choice-form { + display: grid; + gap: 14px; +} + +.payment-trust-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; +} + +.payment-trust-item { + background: #fff; + border: 1px solid #dbe4f8; + border-radius: 14px; + padding: 12px 14px; + color: #334155; + font-size: 0.95rem; +} + +.gateway-status-banner { + border-radius: 14px; + padding: 14px 16px; + border: 1px solid transparent; + display: grid; + gap: 4px; +} + +.gateway-status-banner p, +.alert-card p, +.payment-mini-card p, +.success-summary-item span { + margin: 0; + color: var(--muted); +} + +.gateway-status-banner.info { + border-color: #bfdbfe; + background: #eff6ff; + color: #1e3a8a; +} + +.gateway-status-banner.warning, +.alert-card.warning { + border-color: #fcd34d; + background: #fffbeb; + color: #92400e; +} + +.gateway-status-banner.danger { + border-color: #fecaca; + background: #fef2f2; + color: #991b1b; +} + +.alert-card.neutral { + border-color: #dbe4f8; + background: #f8fbff; + color: #334155; +} + +.alert-card { + border-radius: 16px; + padding: 16px; + border: 1px solid transparent; + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 18px; + flex-wrap: wrap; +} + +.payment-summary { + position: sticky; + top: 96px; + align-self: start; +} + +.payment-summary-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 14px; + flex-wrap: wrap; +} + +.payment-mini-card { + gap: 6px; + background: #f8fbff; +} + +.checkout-form { + gap: 14px; +} + +.field-stack { + display: grid; + gap: 8px; +} + +.field-stack label { + font-weight: 700; + color: #1e293b; +} + +.inline-status-row { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; + color: var(--muted); +} + +.inline-status-row--spaced { + margin-top: 10px; +} + +.order-actions { + display: flex; + align-items: center; + gap: 10px; + flex-wrap: wrap; +} + +.status-payment-unpaid { + color: #92400e; + background: #fff7ed; + border-color: #fed7aa; +} + +.status-payment-pending { + color: #1e40af; + background: #eff6ff; + border-color: #bfdbfe; +} + +.status-payment-failed { + color: #991b1b; + background: #fef2f2; + border-color: #fecaca; +} + +.success-summary { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 12px; + margin: 24px 0; + text-align: left; +} + +.success-summary-item { + background: #f8fbff; + border: 1px solid #dbe4f8; + border-radius: 14px; + padding: 14px 16px; + display: grid; + gap: 8px; +} + +.success-summary-item strong { + color: #0f172a; +} + +@media (max-width: 1024px) { + .payment-summary { + position: static; + } + + .payment-trust-grid { + grid-template-columns: 1fr; + } +} + +@media (max-width: 760px) { + .payment-method-card, + .alert-card, + .order-item-row { + flex-direction: column; + align-items: flex-start; + } + + .success-summary { + grid-template-columns: 1fr; + } +} + +.redirect-gateway-form { + gap: 12px; +} + +.redirect-gateway-form .btn { + width: fit-content; +} + +.payment-method-card.is-disabled:hover { + transform: none; + box-shadow: none; + border-color: #dbe4f8; +} + +.product-hero-stats { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; +} + +.product-hero-stat { + background: #fff; + border: 1px solid #dbe4f8; + border-radius: 18px; + padding: 16px; + display: grid; + gap: 4px; + box-shadow: var(--shadow-soft); +} + +.product-hero-stat strong { + font-size: 1.35rem; + color: #0f172a; +} + +.product-hero-stat span { + color: #475569; + font-size: 0.92rem; + font-weight: 700; +} + +.search-form-actions { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.filter-summary-bar { + max-width: 1180px; + margin: 0 auto 18px; + padding: 16px 18px; + border: 1px solid #dbe4f8; + border-radius: 18px; + background: #fff; + box-shadow: var(--shadow-soft); + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + flex-wrap: wrap; +} + +.filter-chip-row { + display: flex; + gap: 10px; + flex-wrap: wrap; +} + +.filter-chip { + display: inline-flex; + align-items: center; + border-radius: 999px; + padding: 8px 12px; + background: #eff6ff; + color: #1d4ed8; + font-size: 0.88rem; + font-weight: 800; +} + +.shop-feature-strip { + max-width: 1180px; + margin: 0 auto 18px; + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 12px; +} + +.shop-stat-card, +.cart-insight-card, +.checkout-side-card, +.orders-summary-card, +.payment-overview-card { + background: #fff; + border: 1px solid #dbe4f8; + border-radius: 18px; + padding: 18px; + box-shadow: var(--shadow-soft); + display: grid; + gap: 8px; +} + +.shop-stat-label { + color: #2563eb; + font-size: 0.82rem; + font-weight: 800; + text-transform: uppercase; + letter-spacing: 0.08em; +} + +.shop-stat-value { + color: #0f172a; + font-size: clamp(1.35rem, 2vw, 1.9rem); + font-weight: 800; +} + +.shop-stat-note { + color: #64748b; + line-height: 1.6; +} + +.product-rating-row { + display: flex; + gap: 10px; + align-items: center; + flex-wrap: wrap; +} + +.rating-chip, +.availability-chip { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 999px; + padding: 7px 12px; + font-size: 0.84rem; + font-weight: 800; +} + +.rating-chip { + background: #fffbeb; + color: #92400e; +} + +.availability-chip { + background: #ecfdf5; + color: #166534; +} + +.availability-chip.out { + background: #fef2f2; + color: #991b1b; +} + +.savings-tag { + background: #ecfdf5; + color: #047857; +} + +.product-card-caption { + color: #64748b; + font-size: 0.94rem; + line-height: 1.7; +} + +.product-detail-page { + max-width: 1180px; + margin: 0 auto 28px; + display: grid; + grid-template-columns: minmax(0, 2.2fr) minmax(280px, 0.8fr); + gap: 16px; + align-items: start; +} + +.product-detail-page > .related-products { + grid-column: 1 / -1; +} + +.product-extras div { + display: grid; + gap: 6px; + text-align: left; +} + +.product-extras div strong { + font-size: 1rem; +} + +.product-extras div span { + color: #475569; + font-weight: 600; + line-height: 1.5; +} + +.detail-usp-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; +} + +.detail-usp-card, +.detail-support-card, +.order-support-card { + background: #fff; + border: 1px solid #dbe4f8; + border-radius: 18px; + padding: 18px; + box-shadow: var(--shadow-soft); + display: grid; + gap: 10px; +} + +.detail-usp-card strong, +.detail-support-card h3, +.order-support-card h4 { + color: #0f172a; +} + +.detail-usp-card p, +.detail-support-card p, +.order-support-card p { + color: #64748b; + line-height: 1.7; +} + +.cart-insight-strip, +.orders-summary-grid, +.payment-overview-grid { + max-width: 1180px; + margin: 0 auto 18px; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; +} + +.orders-summary-grid { + grid-template-columns: repeat(4, minmax(0, 1fr)); +} + +.cart-card-left { + display: flex; + justify-content: space-between; + gap: 18px; + flex: 1; +} + +.cart-product-copy { + display: grid; + gap: 8px; +} + +.cart-actions { + display: flex; + justify-content: flex-end; + gap: 10px; + flex-wrap: wrap; +} + +.cart-summary-note { + border-radius: 16px; + padding: 14px 16px; + background: #f8fbff; + border: 1px solid #dbe4f8; + display: grid; + gap: 6px; +} + +.cart-summary-note strong { + color: #0f172a; +} + +.cart-summary-note p { + margin: 0; + color: #64748b; + line-height: 1.7; +} + +.cart-summary-note--success { + background: #ecfdf5; + border-color: #bbf7d0; +} + +.checkout-progress { + max-width: 1180px; + margin: 0 auto 18px; + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; +} + +.checkout-progress-step { + background: #fff; + border: 1px solid #dbe4f8; + border-radius: 18px; + padding: 16px 18px; + display: flex; + align-items: center; + gap: 12px; + box-shadow: var(--shadow-soft); +} + +.checkout-progress-step strong { + width: 34px; + height: 34px; + border-radius: 50%; + display: inline-flex; + align-items: center; + justify-content: center; + background: #eff6ff; + color: #1d4ed8; +} + +.checkout-progress-step span { + font-weight: 800; + color: #1f2937; +} + +.checkout-progress-step.is-active { + border-color: #93c5fd; + box-shadow: 0 18px 44px rgba(37, 99, 235, 0.1); +} + +.checkout-progress-step.is-done strong { + background: #dcfce7; + color: #166534; +} + +.checkout-overview-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; + margin-top: 18px; +} + +.checkout-form-actions, +.orders-filter-actions { + display: flex; + gap: 10px; + flex-wrap: wrap; + align-items: center; +} + +.orders-filter-bar { + max-width: 1180px; + margin: 0 auto 18px; + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)) auto; + gap: 14px; + padding: 18px; + background: #fff; + border: 1px solid #dbe4f8; + border-radius: 18px; + box-shadow: var(--shadow-soft); + align-items: end; +} + +.payment-overview-card p { + margin: 0; + color: #64748b; + line-height: 1.7; +} + +.success-wrap { + max-width: 1180px; + margin: 0 auto 28px; +} + +.success-card { + background: #fff; + border: 1px solid #dbe4f8; + border-radius: 24px; + padding: 28px; + box-shadow: var(--shadow-soft); +} + +.success-next-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 12px; + margin-bottom: 24px; +} + +.success-next-card { + background: #f8fbff; + border: 1px solid #dbe4f8; + border-radius: 18px; + padding: 16px; + display: grid; + gap: 8px; +} + +.success-next-card strong { + color: #0f172a; +} + +.success-next-card p { + margin: 0; + color: #64748b; + line-height: 1.7; +} + +.success-actions { + justify-content: flex-start; +} + +.order-side-panel { + position: sticky; + top: 96px; +} + +.order-support-card { + margin-top: 6px; +} + +body.theme-dark .product-hero, +body.theme-dark .product-hero-stat, +body.theme-dark .filter-summary-bar, +body.theme-dark .shop-stat-card, +body.theme-dark .card, +body.theme-dark .product-detail-card, +body.theme-dark .detail-usp-card, +body.theme-dark .detail-support-card, +body.theme-dark .cart-card, +body.theme-dark .summary-box, +body.theme-dark .payment-panel, +body.theme-dark .order-detail-box, +body.theme-dark .order-card, +body.theme-dark .cart-insight-card, +body.theme-dark .checkout-side-card, +body.theme-dark .orders-summary-card, +body.theme-dark .orders-filter-bar, +body.theme-dark .payment-overview-card, +body.theme-dark .success-card, +body.theme-dark .success-next-card, +body.theme-dark .order-support-card, +body.theme-dark .checkout-progress-step, +body.theme-dark .payment-method-card, +body.theme-dark .payment-trust-item, +body.theme-dark .payment-mini-card, +body.theme-dark .order-item-row, +body.theme-dark .timeline-step, +body.theme-dark .category-chip, +body.theme-dark .product-image-placeholder, +body.theme-dark .cart-summary-note { + background: var(--surface); + border-color: var(--border); + color: var(--text); +} + +body.theme-dark .product-search-bar input, +body.theme-dark .product-search-bar select, +body.theme-dark .field-input, +body.theme-dark .cart-qty-form input, +body.theme-dark .orders-filter-bar select { + background: var(--surface-soft); + border-color: var(--border); + color: var(--text); +} + +body.theme-dark .product-hero h1, +body.theme-dark .product-hero-stat strong, +body.theme-dark .shop-stat-value, +body.theme-dark .success-summary-item strong, +body.theme-dark .success-next-card strong, +body.theme-dark .detail-usp-card strong, +body.theme-dark .cart-summary-note strong { + color: var(--text); +} + +body.theme-dark .product-hero p, +body.theme-dark .product-hero-stat span, +body.theme-dark .description, +body.theme-dark .stock, +body.theme-dark .product-card-caption, +body.theme-dark .shop-stat-note, +body.theme-dark .payment-caption, +body.theme-dark .payment-overview-card p, +body.theme-dark .success-next-card p, +body.theme-dark .detail-usp-card p, +body.theme-dark .product-extras div span, +body.theme-dark .cart-summary-note p, +body.theme-dark .order-meta, +body.theme-dark .field-stack label, +body.theme-dark .order-summary-list li span { + color: var(--muted); +} + +body.theme-dark .payment-badge, +body.theme-dark .filter-chip, +body.theme-dark .category-chip.active, +body.theme-dark .rating-chip, +body.theme-dark .checkout-progress-step strong { + background: rgba(59, 130, 246, 0.16); + color: #93c5fd; +} + +body.theme-dark .payment-badge--muted { + background: rgba(148, 163, 184, 0.16); + color: #cbd5e1; +} + +body.theme-dark .availability-chip { + background: rgba(22, 163, 74, 0.14); + color: #86efac; +} + +body.theme-dark .availability-chip.out, +body.theme-dark .status-payment-failed { + background: rgba(239, 68, 68, 0.14); + color: #fca5a5; +} + +body.theme-dark .gateway-status-banner.info, +body.theme-dark .alert-card.neutral { + background: rgba(59, 130, 246, 0.12); + border-color: rgba(96, 165, 250, 0.24); + color: #bfdbfe; +} + +body.theme-dark .gateway-status-banner.warning, +body.theme-dark .alert-card.warning { + background: rgba(234, 179, 8, 0.12); + border-color: rgba(250, 204, 21, 0.28); + color: #fde68a; +} + +body.theme-dark .gateway-status-banner.danger { + background: rgba(239, 68, 68, 0.12); + border-color: rgba(248, 113, 113, 0.28); + color: #fecaca; +} + +@media (max-width: 1180px) { + .product-hero-stats, + .shop-feature-strip, + .orders-summary-grid, + .checkout-overview-grid, + .payment-overview-grid, + .success-next-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } +} + +@media (max-width: 1024px) { + .product-detail-page, + .cart-insight-strip, + .orders-summary-grid, + .payment-overview-grid, + .success-next-grid, + .checkout-progress { + grid-template-columns: 1fr; + } + + .product-detail-page > .related-products { + grid-column: auto; + } + + .detail-usp-grid, + .orders-filter-bar { + grid-template-columns: 1fr; + } + + .order-side-panel { + position: static; + } +} + +@media (max-width: 768px) { + .product-hero-stats, + .shop-feature-strip, + .cart-insight-strip, + .checkout-overview-grid, + .payment-overview-grid, + .success-next-grid, + .orders-summary-grid { + grid-template-columns: 1fr; + } + + .search-form-actions, + .checkout-form-actions, + .orders-filter-actions, + .cart-actions, + .success-actions { + width: 100%; + } + + .search-form-actions .btn, + .checkout-form-actions .btn, + .orders-filter-actions .btn, + .success-actions .btn { + width: 100%; + } + + .filter-summary-bar, + .orders-filter-bar { + grid-template-columns: 1fr; + } + + .cart-card-left { + flex-direction: column; + } +} + +.checkout-form-grid { + margin-top: 4px; +} + +.field-stack--full { + grid-column: 1 / -1; +} + +.field-textarea--compact { + min-height: 74px; +} + +.checkout-location-card { + margin-top: 4px; +} + +.checkout-shortcuts { + display: grid; + gap: 12px; + margin: 16px 0 6px; +} + +.checkout-shortcuts-head { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 12px; + flex-wrap: wrap; +} + +.checkout-shortcuts-head p { + margin: 4px 0 0; + color: var(--muted); + line-height: 1.6; +} + +.checkout-shortcuts-grid { + display: grid; + gap: 10px; +} + +.checkout-shortcut-card { + display: grid; + gap: 10px; + padding: 14px 16px; + border-radius: 16px; + border: 1px solid var(--border); + background: var(--surface-soft); + color: var(--text); + text-decoration: none; + transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease, background 0.2s ease; +} + +.checkout-shortcut-card:hover { + border-color: var(--accent-soft); + background: var(--surface); + box-shadow: 0 10px 24px rgba(15, 23, 42, 0.08); + transform: translateY(-1px); +} + +.checkout-shortcut-card.is-selected { + border-color: var(--accent); + background: rgba(40, 116, 240, 0.08); + box-shadow: 0 0 0 1px rgba(40, 116, 240, 0.12); +} + +.checkout-shortcut-top { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 12px; + flex-wrap: wrap; +} + +.checkout-shortcut-top strong { + color: var(--text); +} + +.checkout-shortcut-top span, +.checkout-shortcut-card small, +.checkout-shortcut-meta { + color: var(--muted); +} + +.checkout-shortcut-top span { + font-size: 0.82rem; + font-weight: 700; +} + +.checkout-shortcut-card p { + margin: 0; + line-height: 1.6; +} + +.checkout-shortcut-meta { + display: flex; + gap: 8px 16px; + flex-wrap: wrap; + font-size: 0.9rem; +} + +.order-actions { + display: flex; + flex-wrap: wrap; + gap: 10px; +} + +.order-card-header h2, +.payment-panel-heading h2 { + overflow-wrap: anywhere; +} + +.summary-row { + gap: 12px; +} + +.summary-row strong { + text-align: right; +} + +.payment-mini-card p { + overflow-wrap: anywhere; +} + +@media (max-width: 680px) { + .payment-page, + .order-detail-page, + .cart-page { + gap: 14px; + } + + .payment-panel, + .order-detail-box, + .summary-box, + .order-card, + .cart-card { + padding: 16px; + } + + .order-item-row, + .order-summary-list li, + .summary-row { + flex-direction: column; + align-items: flex-start; + } + + .summary-row strong, + .order-item-row strong { + text-align: left; + } + + .order-item-left { + align-items: flex-start; + } + + .checkout-form-grid { + grid-template-columns: 1fr; + } + + .checkbox-inline--solid { + align-items: flex-start; + } + + .checkout-shortcuts-head, + .checkout-shortcut-top { + flex-direction: column; + align-items: flex-start; + } +} + +@media (max-width: 520px) { + .payment-panel-heading, + .payment-summary-header, + .order-card-header, + .order-actions, + .inline-status-row, + .inline-status-row--spaced { + flex-direction: column; + align-items: flex-start; + } + + .payment-badge, + .status-tag { + max-width: 100%; + } + + .order-card-items { + gap: 8px; + } + + .order-thumb, + .order-item-avatar { + width: 46px; + height: 46px; + } +} diff --git a/myproject/static/css/profile.css b/myproject/static/css/profile.css index 3c63d3a..216a6c1 100644 --- a/myproject/static/css/profile.css +++ b/myproject/static/css/profile.css @@ -3,7 +3,7 @@ } .profile-shell { - max-width: 920px; + max-width: 980px; margin: 0 auto; display: grid; gap: 24px; @@ -25,11 +25,34 @@ .profile-head::before { content: ''; position: absolute; - top: 0; left: 0; right: 0; + top: 0; + left: 0; + right: 0; height: 5px; background: linear-gradient(90deg, var(--accent), var(--accent-2)); } +.profile-head-copy { + display: grid; + gap: 4px; +} + +.profile-readiness { + display: inline-flex; + align-items: center; + gap: 10px; + margin-top: 8px; + padding: 10px 14px; + border-radius: 999px; + background: rgba(40, 116, 240, 0.12); + color: var(--accent); + width: fit-content; +} + +.profile-readiness strong { + font-size: 1rem; +} + .profile-avatar { width: 100px; height: 100px; @@ -60,14 +83,14 @@ .profile-head h1 { font-size: 1.8rem; - margin-bottom: 6px; + margin-bottom: 2px; color: var(--text); } .profile-head p { color: var(--muted); font-size: 1rem; - margin-bottom: 4px; + margin-bottom: 2px; } .profile-stats { @@ -111,19 +134,137 @@ box-shadow: var(--shadow-soft); } +.profile-panel h1, .profile-panel h2 { margin-bottom: 16px; font-size: 1.3rem; color: var(--text); +} + +.profile-panel h2 { border-bottom: 2px solid var(--surface-soft); padding-bottom: 12px; } +.profile-section-head { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 16px; + flex-wrap: wrap; + margin-bottom: 18px; +} + +.profile-section-head p { + color: var(--muted); + line-height: 1.7; +} + +.profile-delivery-grid { + display: grid; + grid-template-columns: 1.4fr 1fr; + gap: 18px; +} + +.delivery-details-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; +} + +.delivery-detail-card { + background: var(--surface-soft); + border: 1px solid var(--border); + border-radius: 16px; + padding: 16px; + display: grid; + gap: 8px; +} + +.delivery-detail-card--full { + grid-column: 1 / -1; +} + +.delivery-detail-card span { + color: var(--muted); + font-size: 0.88rem; + font-weight: 700; +} + +.delivery-detail-card strong { + color: var(--text); + line-height: 1.6; +} + +.profile-checklist { + display: grid; + gap: 10px; +} + +.check-row { + padding: 14px 16px; + border-radius: 14px; + border: 1px solid var(--border); + background: var(--surface-soft); + color: var(--muted); + font-weight: 600; +} + +.check-row.is-done { + border-color: rgba(22, 163, 74, 0.28); + background: rgba(22, 163, 74, 0.08); + color: #0f766e; +} + .recent-orders { display: grid; gap: 12px; } +.delivery-shortcuts-list { + display: grid; + gap: 12px; +} + +.delivery-shortcut-card { + display: grid; + gap: 10px; + padding: 16px; + border-radius: 16px; + border: 1px solid var(--border); + background: var(--surface-soft); +} + +.delivery-shortcut-top { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 12px; + flex-wrap: wrap; +} + +.delivery-shortcut-top strong { + color: var(--text); +} + +.delivery-shortcut-top span, +.delivery-shortcut-meta { + color: var(--muted); + font-size: 0.9rem; +} + +.delivery-shortcut-card p { + margin: 0; + line-height: 1.7; + color: var(--text); +} + +.delivery-shortcut-meta { + display: flex; + gap: 8px 16px; + flex-wrap: wrap; +} + .recent-order-row { display: grid; grid-template-columns: 80px minmax(0, 1fr) 110px 130px; @@ -165,8 +306,11 @@ } .profile-edit-form { - max-width: 640px; display: grid; + gap: 18px; +} + +.profile-form-grid { gap: 16px; } @@ -175,6 +319,10 @@ gap: 8px; } +.profile-edit-form .form-row--full { + grid-column: 1 / -1; +} + .profile-edit-form label { font-size: 0.95rem; color: var(--text); @@ -216,16 +364,28 @@ box-shadow: 0 0 0 2px var(--accent-soft); } -.profile-edit-form .form-row:last-child { +.profile-edit-actions { display: flex; + flex-wrap: wrap; gap: 12px; align-items: center; - margin-top: 8px; } -@media (max-width: 900px) { +.field-errors { + color: #b91c1c; + font-size: 0.85rem; +} + +.field-errors ul { + margin: 0; + padding-left: 18px; +} + +@media (max-width: 980px) { + .profile-delivery-grid, + .delivery-details-grid, .recent-order-row { - grid-template-columns: 1fr 1fr; + grid-template-columns: 1fr; } .recent-order-row strong { @@ -245,7 +405,23 @@ padding: 24px; } - .profile-edit-form .form-row:last-child { + .profile-readiness { + margin-left: auto; + margin-right: auto; + } + + .profile-actions .btn, + .profile-edit-actions .btn, + .profile-section-head .btn { + width: 100%; + } + + .delivery-shortcut-top { + flex-direction: column; + align-items: flex-start; + } + + .profile-edit-actions { flex-direction: column; align-items: stretch; } diff --git a/myproject/static/css/style.css b/myproject/static/css/style.css index 61257a6..a2a0746 100644 --- a/myproject/static/css/style.css +++ b/myproject/static/css/style.css @@ -290,3 +290,220 @@ textarea { border-color: var(--accent); outline: none; } + +.section-shell { + max-width: 1180px; + margin: 0 auto 30px; +} + +.page-header--split { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 18px; + flex-wrap: wrap; +} + +.page-header-actions { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; +} + +.form-control { + width: 100%; + padding: 14px 16px; + border-radius: 14px; + border: 1px solid var(--border); + background: var(--surface); + color: var(--text); +} + +.form-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; +} + +.form-group { + display: grid; + gap: 8px; +} + +.form-group--full { + grid-column: 1 / -1; +} + +.form-group label { + font-weight: 700; + color: var(--text); +} + +.form-group input, +.form-group textarea, +.form-group select { + width: 100%; + padding: 14px 16px; + border-radius: 14px; + border: 1px solid var(--border); + background: var(--surface); + color: var(--text); +} + +.form-group textarea { + min-height: 110px; + resize: vertical; +} + +.form-group input:focus, +.form-group textarea:focus, +.form-group select:focus { + outline: none; + border-color: var(--accent); + box-shadow: 0 0 0 3px rgba(40, 116, 240, 0.1); +} + +.location-card { + background: var(--surface-soft); + border: 1px solid var(--border); + border-radius: 18px; + padding: 16px; + display: grid; + gap: 12px; +} + +.location-card-head { + display: flex; + justify-content: space-between; + align-items: flex-start; + gap: 12px; + flex-wrap: wrap; +} + +.location-status { + color: var(--muted); + line-height: 1.7; + font-size: 0.95rem; +} + +.location-status.is-success { + color: #0f766e; +} + +.location-status.is-error { + color: #b91c1c; +} + +.checkbox-inline { + display: inline-flex; + align-items: flex-start; + gap: 10px; + cursor: pointer; +} + +.checkbox-inline input { + width: 18px; + height: 18px; + margin-top: 2px; +} + +.checkbox-inline--solid { + padding: 14px 16px; + border-radius: 16px; + border: 1px solid var(--border); + background: var(--surface-soft); + color: var(--text); + font-weight: 600; +} + +.settings-card--wide { + grid-column: 1 / -1; +} + +.settings-action--stretch { + align-items: stretch; +} + +.settings-location-form { + width: 100%; + display: grid; + gap: 16px; +} + +.settings-form-grid { + gap: 16px; +} + +.reveal { + opacity: 0; + transform: translateY(18px); + transition: opacity 0.45s ease, transform 0.45s ease; +} + +.reveal.is-visible { + opacity: 1; + transform: translateY(0); +} + +body.theme-dark .page-header, +body.theme-dark .message, +body.theme-dark .empty-state, +body.theme-dark .settings-card, +body.theme-dark .form-control, +body.theme-dark .form-select, +body.theme-dark .btn-secondary, +body.theme-dark .location-card, +body.theme-dark .checkbox-inline--solid { + background: var(--surface); + border-color: var(--border); + color: var(--text); +} + +body.theme-dark .message.success { + background: rgba(22, 163, 74, 0.12); + border-color: rgba(74, 222, 128, 0.32); + color: #bbf7d0; +} + +body.theme-dark .message.error, +body.theme-dark .message.danger, +body.theme-dark .message.warning { + background: rgba(239, 68, 68, 0.12); + border-color: rgba(248, 113, 113, 0.3); + color: #fecaca; +} + +body.theme-dark .page-header p, +body.theme-dark .settings-card p, +body.theme-dark .settings-header p { + color: var(--muted); +} + +@media (max-width: 768px) { + .page-header-actions { + width: 100%; + } + + .page-header-actions .btn, + .location-card .btn { + width: 100%; + } + + .form-grid, + .settings-grid { + grid-template-columns: 1fr; + } + + .settings-card--wide { + grid-column: auto; + } + + .settings-container { + padding: 16px; + } + + .location-card-head { + flex-direction: column; + } +} diff --git a/myproject/static/js/app.js b/myproject/static/js/app.js index 569884f..a3e5cc8 100644 --- a/myproject/static/js/app.js +++ b/myproject/static/js/app.js @@ -2,12 +2,33 @@ document.addEventListener('DOMContentLoaded', function () { const sidebarToggle = document.querySelector('.sidebar-toggle'); const sidebarOverlay = document.querySelector('.sidebar-overlay'); const sidebarClose = document.querySelector('.sidebar-close'); - const modeToggle = document.querySelector('.mode-toggle'); + const modeToggles = document.querySelectorAll('.mode-toggle'); + const geolocateButtons = document.querySelectorAll('[data-geolocate-btn]'); const body = document.body; const collapseKey = 'hk_nav_collapsed'; const themeKey = 'hk_theme'; + const syncThemeToggleLabels = function (dark) { + modeToggles.forEach(function (toggle) { + const icon = toggle.querySelector('.theme-icon'); + const label = toggle.querySelector('.theme-label'); + const text = dark ? 'Light Mode' : 'Dark Mode'; + + if (icon) { + icon.textContent = dark ? '☀️' : '🌙'; + } + + if (label) { + label.textContent = dark ? 'Light' : 'Dark'; + } else { + toggle.textContent = text; + } + + toggle.setAttribute('aria-label', dark ? 'Switch to light mode' : 'Switch to dark mode'); + }); + }; + const setCollapsed = function (collapsed) { body.classList.toggle('nav-collapsed', collapsed); localStorage.setItem(collapseKey, collapsed ? '1' : '0'); @@ -16,10 +37,7 @@ document.addEventListener('DOMContentLoaded', function () { const setTheme = function (theme) { const dark = theme === 'dark'; body.classList.toggle('theme-dark', dark); - if (modeToggle) { - modeToggle.textContent = dark ? 'Light' : 'Dark'; - modeToggle.setAttribute('aria-label', dark ? 'Switch to light mode' : 'Switch to dark mode'); - } + syncThemeToggleLabels(dark); localStorage.setItem(themeKey, dark ? 'dark' : 'light'); }; @@ -30,9 +48,11 @@ document.addEventListener('DOMContentLoaded', function () { setCollapsed(localStorage.getItem(collapseKey) === '1'); } - if (modeToggle) { - modeToggle.addEventListener('click', function () { - setTheme(body.classList.contains('theme-dark') ? 'light' : 'dark'); + if (modeToggles.length) { + modeToggles.forEach(function (toggle) { + toggle.addEventListener('click', function () { + setTheme(body.classList.contains('theme-dark') ? 'light' : 'dark'); + }); }); } @@ -63,4 +83,195 @@ document.addEventListener('DOMContentLoaded', function () { body.classList.remove('sidebar-open'); } }); + + const revealElements = document.querySelectorAll('.reveal'); + if (revealElements.length) { + if ('IntersectionObserver' in window) { + const observer = new IntersectionObserver( + function (entries) { + entries.forEach(function (entry) { + if (entry.isIntersecting) { + entry.target.classList.add('is-visible'); + observer.unobserve(entry.target); + } + }); + }, + { + threshold: 0.12, + rootMargin: '0px 0px -40px 0px', + } + ); + + revealElements.forEach(function (element) { + observer.observe(element); + }); + } else { + revealElements.forEach(function (element) { + element.classList.add('is-visible'); + }); + } + } + + const findLocationField = function (container, names) { + for (let index = 0; index < names.length; index += 1) { + const field = container.querySelector('[name="' + names[index] + '"]'); + if (field) { + return field; + } + } + return null; + }; + + const setStatus = function (container, type, message) { + const statusNode = container.querySelector('[data-location-status]'); + if (!statusNode) { + return; + } + statusNode.textContent = message; + statusNode.classList.remove('is-success', 'is-error'); + if (type === 'success') { + statusNode.classList.add('is-success'); + } + if (type === 'error') { + statusNode.classList.add('is-error'); + } + }; + + const setFieldValue = function (field, value, overwriteWhenFilled) { + if (!field) { + return; + } + if (!overwriteWhenFilled && field.value) { + return; + } + field.value = value || ''; + }; + + const buildAddressText = function (address) { + const roadLine = [address.house_number, address.road].filter(Boolean).join(' ').trim(); + const areaLine = [ + address.suburb, + address.neighbourhood, + address.city || address.town || address.village || address.municipality, + address.state, + address.postcode, + address.country, + ] + .filter(Boolean) + .filter(function (value, index, values) { + return values.indexOf(value) === index; + }) + .join(', ') + .trim(); + + return [roadLine, areaLine].filter(Boolean).join('\n').trim(); + }; + + const buildLocationLabel = function (address) { + return [ + address.suburb || address.neighbourhood || address.hamlet, + address.city || address.town || address.village || address.municipality, + address.state, + ] + .filter(Boolean) + .filter(function (value, index, values) { + return values.indexOf(value) === index; + }) + .join(', ') + .trim(); + }; + + const reverseGeocode = async function (latitude, longitude) { + const url = 'https://nominatim.openstreetmap.org/reverse?format=jsonv2&addressdetails=1&lat=' + encodeURIComponent(latitude) + '&lon=' + encodeURIComponent(longitude); + const response = await fetch(url, { + headers: { + Accept: 'application/json', + }, + }); + + if (!response.ok) { + throw new Error('Reverse geocoding is temporarily unavailable.'); + } + + return response.json(); + }; + + if (geolocateButtons.length) { + geolocateButtons.forEach(function (button) { + button.addEventListener('click', function () { + const container = button.closest('[data-location-form]') || button.closest('form') || document; + const latitudeField = findLocationField(container, ['latitude']); + const longitudeField = findLocationField(container, ['longitude']); + const accuracyField = findLocationField(container, ['location_accuracy_m']); + const labelField = findLocationField(container, ['location_label']); + const addressField = findLocationField(container, ['default_address', 'address']); + + if (!navigator.geolocation) { + setStatus(container, 'error', 'Your browser does not support GPS access. You can still enter your address manually.'); + return; + } + + button.disabled = true; + setStatus(container, '', 'Requesting GPS access from your device…'); + + navigator.geolocation.getCurrentPosition( + async function (position) { + const latitude = Number(position.coords.latitude).toFixed(6); + const longitude = Number(position.coords.longitude).toFixed(6); + const accuracy = Number(position.coords.accuracy || 0).toFixed(2); + + if (latitudeField) { + latitudeField.value = latitude; + } + if (longitudeField) { + longitudeField.value = longitude; + } + if (accuracyField) { + accuracyField.value = accuracy; + } + + try { + const payload = await reverseGeocode(latitude, longitude); + const address = payload.address || {}; + const suggestedAddress = buildAddressText(address); + const locationLabel = buildLocationLabel(address); + + setFieldValue(labelField, locationLabel, false); + setFieldValue(addressField, suggestedAddress || payload.display_name || '', false); + setStatus( + container, + 'success', + 'GPS captured successfully. Accuracy ±' + Math.round(Number(accuracy)) + ' meters. Please review the address before saving.' + ); + } catch (error) { + setStatus( + container, + 'success', + 'GPS captured successfully. Exact coordinates were saved, but the address suggestion could not be loaded right now.' + ); + } finally { + button.disabled = false; + } + }, + function (error) { + let message = 'Unable to get your location. Please enter your address manually.'; + + if (error.code === error.PERMISSION_DENIED) { + message = 'Location permission was denied. You can still continue with a manual address.'; + } else if (error.code === error.TIMEOUT) { + message = 'Location request timed out. Please retry or continue manually.'; + } + + setStatus(container, 'error', message); + button.disabled = false; + }, + { + enableHighAccuracy: true, + timeout: 15000, + maximumAge: 0, + } + ); + }); + }); + } }); diff --git a/myproject/tempelates/accounts/edit_profile.html b/myproject/tempelates/accounts/edit_profile.html index 8d7cd47..cbcf2c0 100644 --- a/myproject/tempelates/accounts/edit_profile.html +++ b/myproject/tempelates/accounts/edit_profile.html @@ -1,44 +1,110 @@ -{% extends 'base.html' %} -{% load static %} - +{% extends 'base.html' %} +{% load static %} + {% block extra_head %} - + +{% endblock %} + +{% block content %} +
    +
    +
    +
    +
    +

    Edit Profile

    +

    Manage your account info, saved phone number, address, and GPS delivery preference.

    +
    + Back to Profile +
    + +
    + {% csrf_token %} + {{ form.latitude }} + {{ form.longitude }} + {{ form.location_accuracy_m }} + + {% if form.non_field_errors %} +
    {{ form.non_field_errors }}
    + {% endif %} + +
    +
    + + {{ form.first_name }} + {% if form.first_name.errors %}
    {{ form.first_name.errors }}
    {% endif %} +
    +
    + + {{ form.last_name }} + {% if form.last_name.errors %}
    {{ form.last_name.errors }}
    {% endif %} +
    +
    + + {{ form.email }} + {% if form.email.errors %}
    {{ form.email.errors }}
    {% endif %} +
    +
    + + {{ form.phone }} + {% if form.phone.errors %}
    {{ form.phone.errors }}
    {% endif %} +
    + +
    + + {{ form.location_label }} + {% if form.location_label.errors %}
    {{ form.location_label.errors }}
    {% else %}Shown in the navbar and used as your quick delivery area.{% endif %} +
    + +
    +
    +
    +
    + GPS delivery pin +

    Refresh your exact coordinates when you move or want more accurate delivery support.

    +
    + +
    +

    + {% if profile.has_precise_location %} + GPS is saved for this account. Update it anytime if your delivery point changes. + {% else %} + No exact GPS saved yet. You can still use a manual address, but GPS improves delivery accuracy. + {% endif %} +

    + {% if profile.location_updated_at %} + Last GPS update: {{ profile.location_updated_at|date:'M d, Y H:i' }} + {% endif %} +
    +
    + +
    + + {{ form.default_address }} + {% if form.default_address.errors %}
    {{ form.default_address.errors }}
    {% endif %} +
    + +
    + + {{ form.bio }} + {% if form.bio.errors %}
    {{ form.bio.errors }}
    {% endif %} +
    + +
    + + {% if profile.image %} +
    avatar
    + {% endif %} + {{ form.image }} + {% if form.image.errors %}
    {{ form.image.errors }}
    {% endif %} +
    +
    + +
    + + Cancel +
    +
    +
    +
    +
    {% endblock %} - -{% block content %} -
    -
    -

    Edit Profile

    -
    - {% csrf_token %} -
    - - {{ form.first_name }} -
    -
    - - {{ form.last_name }} -
    -
    - - {{ form.email }} -
    -
    - - {% if profile.image %} -
    avatar
    - {% endif %} - {{ form.image }} -
    -
    - - {{ form.bio }} -
    -
    - - Cancel -
    -
    -
    -
    -{% endblock %} diff --git a/myproject/tempelates/accounts/login.html b/myproject/tempelates/accounts/login.html index 5785fe6..71e911f 100644 --- a/myproject/tempelates/accounts/login.html +++ b/myproject/tempelates/accounts/login.html @@ -1,47 +1,47 @@ -{% extends 'base.html' %} -{% load static %} - -{% block extra_head %} - - -{% endblock %} - -{% block content %} - -
    -
    -

    Login

    - - {% if messages %} - {% for message in messages %} -
    {{ message }}
    - {% endfor %} - {% endif %} - - {% if error %} -
    {{ error }}
    - {% endif %} - -
    - {% csrf_token %} - -
    - - -
    - -
    - - -
    - - -
    - - -
    -
    - +{% extends 'base.html' %} +{% load static %} + +{% block extra_head %} + + +{% endblock %} + +{% block content %} + +
    +
    +

    Login

    + + {% if messages %} + {% for message in messages %} +
    {{ message }}
    + {% endfor %} + {% endif %} + + {% if error %} +
    {{ error }}
    + {% endif %} + +
    + {% csrf_token %} + +
    + + +
    + +
    + + +
    + + +
    + + +
    +
    + {% endblock %} \ No newline at end of file diff --git a/myproject/tempelates/accounts/profile.html b/myproject/tempelates/accounts/profile.html index 685fdc0..e2ee11c 100644 --- a/myproject/tempelates/accounts/profile.html +++ b/myproject/tempelates/accounts/profile.html @@ -2,7 +2,7 @@ {% load static %} {% block extra_head %} - + {% endblock %} {% block content %} @@ -16,12 +16,20 @@
    {{ user.username|slice:":1"|upper }}
    {% endif %} -
    -

    {{ user.username }}

    +
    +

    {{ user.get_full_name|default:user.username }}

    +

    @{{ user.username }}

    {{ user.email|default:'No email added yet' }}

    + {% if profile.short_location %} +

    📍 {{ profile.short_location }}

    + {% endif %} {% if user.profile.is_seller %}

    Seller Account: Active

    {% endif %} +
    + {{ profile_completion }}% + checkout-ready account setup +
    @@ -34,6 +42,74 @@

    {{ user.date_joined|date:'Y' }}

    Member Since

    +
    +
    +

    Saved Delivery Details

    +
    +
    + Phone + {{ profile.phone|default:'Not set' }} +
    +
    + Quick location + {{ profile.short_location|default:'Not set' }} +
    +
    + Default address + {% if profile.formatted_delivery_address %}{{ profile.formatted_delivery_address|linebreaksbr }}{% else %}Not set{% endif %} +
    +
    + GPS status + {% if profile.has_precise_location %}Saved{% else %}Manual only{% endif %} +
    +
    + Last GPS update + {% if profile.location_updated_at %}{{ profile.location_updated_at|date:'M d, Y H:i' }}{% else %}-{% endif %} +
    +
    +
    + +
    +

    What this unlocks

    +
    +
    Email for order/payment communication
    +
    Phone ready for delivery calls
    +
    Default address prefilled at checkout
    +
    Precise GPS support for delivery help
    +
    +
    +
    + +
    +
    +
    +

    Recent Delivery Shortcuts

    +

    These recent delivery points appear as quick-select shortcuts on the checkout page.

    +
    + Update Default Address +
    + {% if recent_delivery_points %} +
    + {% for order in recent_delivery_points %} +
    +
    + {{ order.location_label|default:order.address|truncatechars:48 }} + Order #{{ order.id }} +
    +

    {{ order.address|linebreaksbr }}

    +
    + {{ order.phone }} + {{ order.created_at|date:'M d, Y' }} + {% if order.has_precise_location %}GPS saved{% else %}Manual{% endif %} +
    +
    + {% endfor %} +
    + {% else %} +

    Complete a checkout once and your recent delivery points will appear here as reusable shortcuts.

    + {% endif %} +
    +

    Recent Orders

    {% if recent_orders %} @@ -55,6 +131,7 @@ diff --git a/myproject/tempelates/accounts/register.html b/myproject/tempelates/accounts/register.html index 9c0f8d9..b5d8c1f 100644 --- a/myproject/tempelates/accounts/register.html +++ b/myproject/tempelates/accounts/register.html @@ -1,67 +1,124 @@ -{% extends 'base.html' %} -{% load static %} - -{% block extra_head %} - - -{% endblock %} - -{% block content %} - -
    -
    -

    Create Account

    - - {% if messages %} - {% for message in messages %} -
    {{ message }}
    - {% endfor %} - {% endif %} - - {% if error %} -
    {{ error }}
    - {% endif %} - -
    - {% csrf_token %} - -
    - - - At least 3 characters -
    - -
    - - -
    - -
    - - - At least 6 characters -
    - -
    - - -
    +{% extends 'base.html' %} +{% load static %} -
    - - Enable this if you want to sell products on Hamro Karma. -
    - - -
    - - -
    -
    - +{% block extra_head %} + + +{% endblock %} + +{% block content %} +
    +
    +
    +

    Create Account

    +

    Set your phone and delivery location now so checkout is faster, more accurate, and GPS-ready later.

    +
    + + {% if messages %} + {% for message in messages %} +
    {{ message }}
    + {% endfor %} + {% endif %} + + {% if form.non_field_errors %} +
    {{ form.non_field_errors }}
    + {% endif %} + +
    + {% csrf_token %} + {{ form.latitude }} + {{ form.longitude }} + {{ form.location_accuracy_m }} + +
    +
    + + {{ form.username }} + {% if form.username.errors %}
    {{ form.username.errors }}
    {% else %}At least 3 characters{% endif %} +
    + +
    + + {{ form.email }} + {% if form.email.errors %}
    {{ form.email.errors }}
    {% endif %} +
    + +
    + + {{ form.first_name }} + {% if form.first_name.errors %}
    {{ form.first_name.errors }}
    {% endif %} +
    + +
    + + {{ form.last_name }} + {% if form.last_name.errors %}
    {{ form.last_name.errors }}
    {% endif %} +
    + +
    + + {{ form.password }} + {% if form.password.errors %}
    {{ form.password.errors }}
    {% else %}At least 6 characters{% endif %} +
    + +
    + + {{ form.confirm_password }} + {% if form.confirm_password.errors %}
    {{ form.confirm_password.errors }}
    {% endif %} +
    + +
    + + {{ form.phone }} + {% if form.phone.errors %}
    {{ form.phone.errors }}
    {% else %}Required for delivery updates and order confirmation.{% endif %} +
    + +
    + + {{ form.location_label }} + {% if form.location_label.errors %}
    {{ form.location_label.errors }}
    {% else %}City / area / landmark name shown across the app.{% endif %} +
    + +
    +
    +
    +
    + GPS delivery setup +

    Allow browser location to capture live coordinates and improve delivery accuracy.

    +
    + +
    +

    + {% if form.latitude.value and form.longitude.value %} + GPS coordinates are already attached to this account form. + {% else %} + GPS is optional, but recommended for accurate delivery and support. + {% endif %} +

    +
    +
    + +
    + + {{ form.default_address }} + {% if form.default_address.errors %}
    {{ form.default_address.errors }}
    {% else %}Required so your first checkout starts prefilled.{% endif %} +
    + +
    + + Enable this if you also want to sell products on Hamro Karma. +
    +
    + + +
    + + +
    +
    {% endblock %} diff --git a/myproject/tempelates/base.html b/myproject/tempelates/base.html index b787654..4281af9 100644 --- a/myproject/tempelates/base.html +++ b/myproject/tempelates/base.html @@ -8,9 +8,9 @@ - - - + + + {% block extra_head %}{% endblock %} @@ -32,7 +32,7 @@ {% include 'includes/footer.html' %} - + diff --git a/myproject/tempelates/cart/cart.html b/myproject/tempelates/cart/cart.html index 3b2783a..94a6c4e 100644 --- a/myproject/tempelates/cart/cart.html +++ b/myproject/tempelates/cart/cart.html @@ -2,22 +2,49 @@ {% load static %} {% block extra_head %} - + {% endblock %} {% block content %} -