This commit is contained in:
2026-08-31 15:11:52 +03:30
parent 236002a87c
commit 463b812e3e
63 changed files with 3254 additions and 1476 deletions
+50 -3
View File
@@ -10,13 +10,60 @@ from django.utils.translation import gettext_lazy as _
class BazaarSettings(models.Model):
"""تنظیمات کافه‌بازار — عمداً از پنل ادمین ویرایش می‌شود (نه .env)، چون
باید بدون ری‌دیپلوی قابل‌تغییر باشد. تک‌ردیفی (singleton)."""
باید بدون ری‌دیپلوی قابل‌تغییر باشد. تک‌ردیفی (singleton).
access_token = models.CharField(max_length=255, blank=True, verbose_name=_("Access Token"))
refresh_token = models.CharField(max_length=255, blank=True, verbose_name=_("Refresh Token"))
دو روش احراز هویت با devapi کافه‌بازار پشتیبانی می‌شود:
۱) روش جدید (ساده): توکن ثابت از پیشخان → «API پیشخان بازار» → «دریافت
توکن جدید»، مستقیم در access_token جای‌گذاری می‌شود؛ چون access_token_
expires_at خالی می‌ماند، هیچ‌وقت سعی در refresh نمی‌شود (این توکن API
رفرش ندارد؛ اگر باطل شد باید دستی از پیشخان توکن تازه گرفت و همینجا
جایگزین کرد).
۲) روش قدیمی (OAuth با رفرش خودکار): client_id/client_secret را اینجا
بگذار، از دکمه‌ی «اتصال به کافه‌بازار» در همین صفحه استفاده کن؛ از آن
به بعد access_token هر بار که نزدیک انقضا باشد، خودش با refresh_token
تمدید می‌شود — بدون نیاز به مراجعه‌ی دستی دوباره."""
access_token = models.CharField(
max_length=255,
blank=True,
verbose_name=_("Access Token"),
help_text=_(
"یا توکن ثابت «روش جدید» پیشخان را مستقیم اینجا بچسبان، یا با دکمه‌ی اتصال زیر "
"بگذار خودش (روش قدیمی/OAuth) پر و بعدا خودکار تمدید شود."
),
)
refresh_token = models.CharField(
max_length=255, blank=True, verbose_name=_("Refresh Token"),
help_text=_("فقط برای روش OAuth — با دکمه‌ی اتصال خودش پر می‌شود، دستی لازم نیست."),
)
access_token_expires_at = models.DateTimeField(
null=True,
blank=True,
verbose_name=_("انقضای Access Token (فقط OAuth)"),
help_text=_(
"اگر خالی باشد یعنی توکن ثابتِ روش جدید است و هیچ‌وقت خودکار تمدید نمی‌شود. "
"اگر پر باشد یعنی از OAuth آمده و پیش از انقضا خودش تمدید خواهد شد."
),
)
client_id = models.CharField(
max_length=255, blank=True, verbose_name=_("Client ID (روش قدیمی/OAuth)")
)
client_secret = models.CharField(
max_length=255, blank=True, verbose_name=_("Client Secret (روش قدیمی/OAuth)")
)
package_name = models.CharField(
max_length=150, blank=True, verbose_name=_("application id اپ (مثلا ir.example.app)")
)
dynamic_discount_secret = models.CharField(
max_length=255,
blank=True,
verbose_name=_("کلید امضای تخفیف پویا"),
help_text=_(
"از پیشخان → برنامه‌ات → پرداخت درون‌برنامه‌ای → تخفیف پویا. فقط سمت سرور استفاده "
"می‌شود (apps.billing.providers.dynamic_discount) — هیچ‌وقت نباید در اپ فلاتر ذخیره شود، "
"وگرنه کلید افشا می‌شود و کافه‌بازار مسئولیتی نمی‌پذیرد."
),
)
updated_at = models.DateTimeField(auto_now=True)
class Meta: