Skip to content

Commit f3a3816

Browse files
authored
fix: build absolute url (#157)
* fix: build absolute url for auto connect * fix: add docs for sites
1 parent 25b42c7 commit f3a3816

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,36 @@
156156
<p dir="rtl">
157157
اگر نیاز ندارید توابع داخلی را اوررایت کنیدو فقط به این نیاز دارید که مسیر یو ار ال های داخلی را در اپ جداگانه ای قرارگیرد میتوانید از این گزینه برای ادرسی دهی محل قرار گیری اپ استفاده کنید
158158
</p>
159+
160+
161+
<h3 dir="rtl">فعال‌سازی Django Sites و تعیین پروتکل/دامنه</h3> <p dir="rtl"> اگر می‌خواهید از قابلیت <code>auto_connect</code> استفاده کنید باید آدرس های کامل (به‌همراه دامنه) بسازیم، فریم‌ورک <code>django.contrib.sites</code> را فعال کنید و پروتکل پیش‌فرض را مشخص کنید. </p>
162+
163+
```python
164+
INSTALLED_APPS = [
165+
# ...
166+
"django.contrib.sites", # برای مدیریت دامنهٔ فعلی
167+
"azbankgateways",
168+
# ...
169+
]
170+
171+
172+
# شناسه سایت فعلی (معمولاً 1)
173+
SITE_ID = 1
174+
175+
# پروتکل پیش‌فرض برای ساخت URL کامل
176+
DEFAULT_PROTOCOL = "https" # در صورت نیاز می‌توانید "http" بگذارید
177+
```
178+
<p dir="rtl"> سپس مایگریت‌ها را اجرا کنید: </p>
179+
180+
```bash
181+
python manage.py migrate
182+
```
183+
184+
<p dir="rtl"> حالا از مسیر <b>Admin → Sites → Sites</b> رکورد با شناسه ۱ (یا رکورد موردنظر) را باز کنید و: </p>
185+
<p dir="rtl"><b>Name</b>: نام سایت (دلخواه)</p>
186+
<p dir="rtl"><b>Domain name</b>: دامنهٔ سایت بدون پروتکل و بدون اسلش پایانی (مثلاً <code>example.com</code>)</p>
187+
188+
159189
### urls.py
160190

161191
<p dir="rtl">

azbankgateways/banks/banks.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from django.urls import reverse
1111
from django.utils import timezone
1212

13+
from azbankgateways.utils import append_querystring, build_full_url
14+
1315
from .. import default_settings as settings
1416
from ..exceptions import (
1517
AmountDoesNotSupport,
@@ -19,7 +21,6 @@
1921
SafeSettingsEnabled,
2022
)
2123
from ..models import Bank, CurrencyEnum, PaymentStatus
22-
from ..utils import append_querystring
2324

2425

2526
# TODO: handle and expire record after 15 minutes
@@ -375,14 +376,15 @@ def get_gateway_payment_url(self):
375376
return redirect_url
376377

377378
def _get_gateway_callback_url(self):
378-
url = reverse(settings.CALLBACK_NAMESPACE)
379379
if self.get_request():
380+
url = reverse(settings.CALLBACK_NAMESPACE)
380381
url_parts = list(parse.urlparse(url))
381382
if not (url_parts[0] and url_parts[1]):
382383
url = self.get_request().build_absolute_uri(url)
383384
query = dict(parse.parse_qsl(self.get_request().GET.urlencode()))
384385
query.update({"bank_type": self.get_bank_type()})
385386
query.update({"identifier": self.identifier})
386387
url = append_querystring(url, query)
387-
388+
else:
389+
url = build_full_url(settings.CALLBACK_NAMESPACE)
388390
return url

azbankgateways/utils.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import json
22
from urllib import parse
33

4+
from django.conf import settings
5+
from django.urls import reverse
6+
47
from azbankgateways.types import DictQuerystring
58

69

@@ -33,3 +36,28 @@ def split_to_dict_querystring(url: str) -> DictQuerystring:
3336
url_parts[5] = ""
3437

3538
return parse.urlunparse(url_parts), query
39+
40+
41+
def build_full_url(viewname: str, *args, **kwargs):
42+
"""
43+
Build a full absolute URL including domain if Sites framework is available.
44+
Falls back to relative path if no site is configured.
45+
"""
46+
# Generate the path part
47+
path = reverse(viewname, args=args, kwargs=kwargs)
48+
49+
# Try to use django.contrib.sites if installed
50+
if "django.contrib.sites" in settings.INSTALLED_APPS:
51+
try:
52+
from django.contrib.sites.models import Site
53+
54+
site = Site.objects.get_current()
55+
if site and site.domain:
56+
protocol = getattr(settings, "DEFAULT_PROTOCOL", "https")
57+
return f"{protocol}://{site.domain}{path}"
58+
except Exception:
59+
# Any issue with Sites, just return relative path
60+
pass
61+
62+
# Fallback: return only relative path
63+
return path

0 commit comments

Comments
 (0)