django-cfg 1.2.31__py3-none-any.whl → 1.3.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (264) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/api/health/views.py +4 -2
  3. django_cfg/apps/knowbase/config/settings.py +16 -15
  4. django_cfg/apps/payments/README.md +326 -0
  5. django_cfg/apps/payments/admin/__init__.py +20 -10
  6. django_cfg/apps/payments/admin/api_keys_admin.py +521 -237
  7. django_cfg/apps/payments/admin/balance_admin.py +592 -297
  8. django_cfg/apps/payments/admin/currencies_admin.py +526 -222
  9. django_cfg/apps/payments/admin/filters.py +306 -199
  10. django_cfg/apps/payments/admin/payments_admin.py +465 -70
  11. django_cfg/apps/payments/admin/subscriptions_admin.py +578 -128
  12. django_cfg/apps/payments/admin_interface/__init__.py +18 -0
  13. django_cfg/apps/payments/admin_interface/templates/payments/base.html +162 -0
  14. django_cfg/apps/payments/admin_interface/templates/payments/components/dev_tool_card.html +38 -0
  15. django_cfg/apps/payments/admin_interface/templates/payments/components/loading_spinner.html +16 -0
  16. django_cfg/apps/payments/admin_interface/templates/payments/components/notification.html +27 -0
  17. django_cfg/apps/payments/admin_interface/templates/payments/components/provider_card.html +86 -0
  18. django_cfg/apps/payments/admin_interface/templates/payments/components/status_card.html +39 -0
  19. django_cfg/apps/payments/admin_interface/templates/payments/currency_converter.html +382 -0
  20. django_cfg/apps/payments/admin_interface/templates/payments/payment_dashboard.html +300 -0
  21. django_cfg/apps/payments/admin_interface/templates/payments/payment_form.html +303 -0
  22. django_cfg/apps/payments/admin_interface/templates/payments/payment_list.html +382 -0
  23. django_cfg/apps/payments/admin_interface/templates/payments/payment_status.html +500 -0
  24. django_cfg/apps/payments/admin_interface/templates/payments/webhook_dashboard.html +594 -0
  25. django_cfg/apps/payments/admin_interface/views/__init__.py +23 -0
  26. django_cfg/apps/payments/admin_interface/views/payment_views.py +259 -0
  27. django_cfg/apps/payments/admin_interface/views/webhook_dashboard.py +37 -0
  28. django_cfg/apps/payments/apps.py +34 -9
  29. django_cfg/apps/payments/config/__init__.py +28 -51
  30. django_cfg/apps/payments/config/constance/__init__.py +22 -0
  31. django_cfg/apps/payments/config/constance/config_service.py +123 -0
  32. django_cfg/apps/payments/config/constance/fields.py +69 -0
  33. django_cfg/apps/payments/config/constance/settings.py +160 -0
  34. django_cfg/apps/payments/config/django_cfg_integration.py +202 -0
  35. django_cfg/apps/payments/config/helpers.py +130 -0
  36. django_cfg/apps/payments/management/__init__.py +1 -3
  37. django_cfg/apps/payments/management/commands/__init__.py +1 -3
  38. django_cfg/apps/payments/management/commands/cleanup_expired_data.py +419 -0
  39. django_cfg/apps/payments/management/commands/currency_stats.py +297 -225
  40. django_cfg/apps/payments/management/commands/manage_currencies.py +303 -151
  41. django_cfg/apps/payments/management/commands/manage_providers.py +333 -160
  42. django_cfg/apps/payments/management/commands/process_pending_payments.py +357 -0
  43. django_cfg/apps/payments/management/commands/test_providers.py +434 -0
  44. django_cfg/apps/payments/middleware/__init__.py +3 -1
  45. django_cfg/apps/payments/middleware/api_access.py +329 -222
  46. django_cfg/apps/payments/middleware/rate_limiting.py +342 -152
  47. django_cfg/apps/payments/middleware/usage_tracking.py +249 -240
  48. django_cfg/apps/payments/migrations/0001_initial.py +708 -536
  49. django_cfg/apps/payments/models/__init__.py +13 -18
  50. django_cfg/apps/payments/models/api_keys.py +121 -43
  51. django_cfg/apps/payments/models/balance.py +153 -115
  52. django_cfg/apps/payments/models/base.py +68 -15
  53. django_cfg/apps/payments/models/currencies.py +172 -148
  54. django_cfg/apps/payments/models/managers/__init__.py +44 -0
  55. django_cfg/apps/payments/models/managers/api_key_managers.py +329 -0
  56. django_cfg/apps/payments/models/managers/balance_managers.py +599 -0
  57. django_cfg/apps/payments/models/managers/currency_managers.py +385 -0
  58. django_cfg/apps/payments/models/managers/payment_managers.py +511 -0
  59. django_cfg/apps/payments/models/managers/subscription_managers.py +641 -0
  60. django_cfg/apps/payments/models/payments.py +235 -285
  61. django_cfg/apps/payments/models/subscriptions.py +257 -177
  62. django_cfg/apps/payments/models/tariffs.py +147 -40
  63. django_cfg/apps/payments/services/__init__.py +209 -56
  64. django_cfg/apps/payments/services/cache/__init__.py +6 -6
  65. django_cfg/apps/payments/services/cache_service/__init__.py +143 -0
  66. django_cfg/apps/payments/services/cache_service/api_key_cache.py +37 -0
  67. django_cfg/apps/payments/services/{cache/base.py → cache_service/interfaces.py} +3 -1
  68. django_cfg/apps/payments/services/cache_service/keys.py +49 -0
  69. django_cfg/apps/payments/services/cache_service/rate_limit_cache.py +47 -0
  70. django_cfg/apps/payments/services/cache_service/simple_cache.py +101 -0
  71. django_cfg/apps/payments/services/core/__init__.py +10 -6
  72. django_cfg/apps/payments/services/core/balance_service.py +435 -360
  73. django_cfg/apps/payments/services/core/base.py +166 -0
  74. django_cfg/apps/payments/services/core/currency_service.py +478 -0
  75. django_cfg/apps/payments/services/core/payment_service.py +371 -465
  76. django_cfg/apps/payments/services/core/subscription_service.py +425 -481
  77. django_cfg/apps/payments/services/core/webhook_service.py +410 -0
  78. django_cfg/apps/payments/services/integrations/__init__.py +29 -0
  79. django_cfg/apps/payments/services/integrations/ngrok_service.py +47 -0
  80. django_cfg/apps/payments/services/integrations/providers_config.py +107 -0
  81. django_cfg/apps/payments/services/providers/__init__.py +9 -14
  82. django_cfg/apps/payments/services/providers/base.py +234 -174
  83. django_cfg/apps/payments/services/providers/nowpayments.py +478 -0
  84. django_cfg/apps/payments/services/providers/registry.py +367 -301
  85. django_cfg/apps/payments/services/types/__init__.py +78 -0
  86. django_cfg/apps/payments/services/types/data.py +177 -0
  87. django_cfg/apps/payments/services/types/requests.py +150 -0
  88. django_cfg/apps/payments/services/types/responses.py +156 -0
  89. django_cfg/apps/payments/services/types/webhooks.py +232 -0
  90. django_cfg/apps/payments/signals/__init__.py +33 -8
  91. django_cfg/apps/payments/signals/api_key_signals.py +210 -129
  92. django_cfg/apps/payments/signals/balance_signals.py +174 -0
  93. django_cfg/apps/payments/signals/payment_signals.py +128 -103
  94. django_cfg/apps/payments/signals/subscription_signals.py +194 -142
  95. django_cfg/apps/payments/static/payments/css/components.css +380 -0
  96. django_cfg/apps/payments/static/payments/css/dashboard.css +188 -0
  97. django_cfg/apps/payments/static/payments/js/components.js +545 -0
  98. django_cfg/apps/payments/static/payments/js/utils.js +412 -0
  99. django_cfg/apps/payments/templatetags/__init__.py +1 -1
  100. django_cfg/apps/payments/templatetags/payment_tags.py +466 -0
  101. django_cfg/apps/payments/urls.py +45 -48
  102. django_cfg/apps/payments/urls_admin.py +33 -42
  103. django_cfg/apps/payments/views/api/__init__.py +101 -0
  104. django_cfg/apps/payments/views/api/api_keys.py +387 -0
  105. django_cfg/apps/payments/views/api/balances.py +381 -0
  106. django_cfg/apps/payments/views/api/base.py +298 -0
  107. django_cfg/apps/payments/views/api/currencies.py +402 -0
  108. django_cfg/apps/payments/views/api/payments.py +415 -0
  109. django_cfg/apps/payments/views/api/subscriptions.py +475 -0
  110. django_cfg/apps/payments/views/api/webhooks.py +476 -0
  111. django_cfg/apps/payments/views/serializers/__init__.py +99 -0
  112. django_cfg/apps/payments/views/serializers/api_keys.py +424 -0
  113. django_cfg/apps/payments/views/serializers/balances.py +300 -0
  114. django_cfg/apps/payments/views/serializers/currencies.py +335 -0
  115. django_cfg/apps/payments/views/serializers/payments.py +387 -0
  116. django_cfg/apps/payments/views/serializers/subscriptions.py +429 -0
  117. django_cfg/apps/payments/views/serializers/webhooks.py +137 -0
  118. django_cfg/config.py +1 -1
  119. django_cfg/core/config.py +40 -4
  120. django_cfg/core/generation.py +25 -4
  121. django_cfg/core/integration/README.md +363 -0
  122. django_cfg/core/integration/__init__.py +47 -0
  123. django_cfg/core/integration/commands_collector.py +239 -0
  124. django_cfg/core/integration/display/__init__.py +15 -0
  125. django_cfg/core/integration/display/base.py +157 -0
  126. django_cfg/core/integration/display/ngrok.py +164 -0
  127. django_cfg/core/integration/display/startup.py +815 -0
  128. django_cfg/core/integration/url_integration.py +123 -0
  129. django_cfg/core/integration/version_checker.py +160 -0
  130. django_cfg/management/commands/auto_generate.py +4 -0
  131. django_cfg/management/commands/check_settings.py +6 -0
  132. django_cfg/management/commands/clear_constance.py +5 -2
  133. django_cfg/management/commands/create_token.py +6 -0
  134. django_cfg/management/commands/list_urls.py +6 -0
  135. django_cfg/management/commands/migrate_all.py +6 -0
  136. django_cfg/management/commands/migrator.py +3 -0
  137. django_cfg/management/commands/rundramatiq.py +6 -0
  138. django_cfg/management/commands/runserver_ngrok.py +51 -29
  139. django_cfg/management/commands/script.py +6 -0
  140. django_cfg/management/commands/show_config.py +12 -2
  141. django_cfg/management/commands/show_urls.py +4 -0
  142. django_cfg/management/commands/superuser.py +6 -0
  143. django_cfg/management/commands/task_clear.py +4 -1
  144. django_cfg/management/commands/task_status.py +3 -1
  145. django_cfg/management/commands/test_email.py +3 -0
  146. django_cfg/management/commands/test_telegram.py +6 -0
  147. django_cfg/management/commands/test_twilio.py +6 -0
  148. django_cfg/management/commands/tree.py +6 -0
  149. django_cfg/management/commands/validate_config.py +155 -149
  150. django_cfg/models/constance.py +31 -11
  151. django_cfg/models/payments.py +175 -492
  152. django_cfg/modules/django_logger.py +160 -146
  153. django_cfg/modules/django_unfold/dashboard.py +64 -16
  154. django_cfg/registry/core.py +1 -0
  155. django_cfg/template_archive/django_sample.zip +0 -0
  156. django_cfg/utils/smart_defaults.py +227 -570
  157. django_cfg/utils/toolkit.py +51 -11
  158. {django_cfg-1.2.31.dist-info → django_cfg-1.3.3.dist-info}/METADATA +4 -1
  159. {django_cfg-1.2.31.dist-info → django_cfg-1.3.3.dist-info}/RECORD +162 -185
  160. django_cfg/apps/payments/__init__.py +0 -8
  161. django_cfg/apps/payments/admin/tariffs_admin.py +0 -199
  162. django_cfg/apps/payments/config/module.py +0 -70
  163. django_cfg/apps/payments/config/providers.py +0 -105
  164. django_cfg/apps/payments/config/settings.py +0 -96
  165. django_cfg/apps/payments/config/utils.py +0 -52
  166. django_cfg/apps/payments/decorators.py +0 -291
  167. django_cfg/apps/payments/management/commands/README.md +0 -146
  168. django_cfg/apps/payments/managers/__init__.py +0 -23
  169. django_cfg/apps/payments/managers/api_key_manager.py +0 -35
  170. django_cfg/apps/payments/managers/balance_manager.py +0 -361
  171. django_cfg/apps/payments/managers/currency_manager.py +0 -306
  172. django_cfg/apps/payments/managers/payment_manager.py +0 -192
  173. django_cfg/apps/payments/managers/subscription_manager.py +0 -37
  174. django_cfg/apps/payments/managers/tariff_manager.py +0 -29
  175. django_cfg/apps/payments/migrations/0002_network_providercurrency_and_more.py +0 -241
  176. django_cfg/apps/payments/migrations/0003_add_usd_rate_cache.py +0 -30
  177. django_cfg/apps/payments/models/events.py +0 -73
  178. django_cfg/apps/payments/serializers/__init__.py +0 -57
  179. django_cfg/apps/payments/serializers/api_keys.py +0 -51
  180. django_cfg/apps/payments/serializers/balance.py +0 -59
  181. django_cfg/apps/payments/serializers/currencies.py +0 -63
  182. django_cfg/apps/payments/serializers/payments.py +0 -62
  183. django_cfg/apps/payments/serializers/subscriptions.py +0 -71
  184. django_cfg/apps/payments/serializers/tariffs.py +0 -56
  185. django_cfg/apps/payments/services/billing/__init__.py +0 -8
  186. django_cfg/apps/payments/services/cache/simple_cache.py +0 -135
  187. django_cfg/apps/payments/services/core/fallback_service.py +0 -432
  188. django_cfg/apps/payments/services/internal_types.py +0 -461
  189. django_cfg/apps/payments/services/middleware/__init__.py +0 -8
  190. django_cfg/apps/payments/services/monitoring/__init__.py +0 -22
  191. django_cfg/apps/payments/services/monitoring/api_schemas.py +0 -76
  192. django_cfg/apps/payments/services/monitoring/provider_health.py +0 -372
  193. django_cfg/apps/payments/services/providers/cryptapi/__init__.py +0 -4
  194. django_cfg/apps/payments/services/providers/cryptapi/config.py +0 -8
  195. django_cfg/apps/payments/services/providers/cryptapi/models.py +0 -192
  196. django_cfg/apps/payments/services/providers/cryptapi/provider.py +0 -439
  197. django_cfg/apps/payments/services/providers/cryptomus/__init__.py +0 -4
  198. django_cfg/apps/payments/services/providers/cryptomus/models.py +0 -176
  199. django_cfg/apps/payments/services/providers/cryptomus/provider.py +0 -429
  200. django_cfg/apps/payments/services/providers/cryptomus/provider_v2.py +0 -564
  201. django_cfg/apps/payments/services/providers/models/__init__.py +0 -34
  202. django_cfg/apps/payments/services/providers/models/currencies.py +0 -190
  203. django_cfg/apps/payments/services/providers/nowpayments/__init__.py +0 -4
  204. django_cfg/apps/payments/services/providers/nowpayments/models.py +0 -196
  205. django_cfg/apps/payments/services/providers/nowpayments/provider.py +0 -380
  206. django_cfg/apps/payments/services/providers/stripe/__init__.py +0 -4
  207. django_cfg/apps/payments/services/providers/stripe/models.py +0 -184
  208. django_cfg/apps/payments/services/providers/stripe/provider.py +0 -109
  209. django_cfg/apps/payments/services/security/__init__.py +0 -34
  210. django_cfg/apps/payments/services/security/error_handler.py +0 -635
  211. django_cfg/apps/payments/services/security/payment_notifications.py +0 -342
  212. django_cfg/apps/payments/services/security/webhook_validator.py +0 -474
  213. django_cfg/apps/payments/static/payments/css/payments.css +0 -340
  214. django_cfg/apps/payments/static/payments/js/notifications.js +0 -202
  215. django_cfg/apps/payments/static/payments/js/payment-utils.js +0 -318
  216. django_cfg/apps/payments/static/payments/js/theme.js +0 -86
  217. django_cfg/apps/payments/tasks/__init__.py +0 -12
  218. django_cfg/apps/payments/tasks/webhook_processing.py +0 -177
  219. django_cfg/apps/payments/templates/admin/payments/currency/change_list.html +0 -50
  220. django_cfg/apps/payments/templates/payments/base.html +0 -182
  221. django_cfg/apps/payments/templates/payments/components/payment_card.html +0 -201
  222. django_cfg/apps/payments/templates/payments/components/payment_qr_code.html +0 -109
  223. django_cfg/apps/payments/templates/payments/components/progress_bar.html +0 -43
  224. django_cfg/apps/payments/templates/payments/components/provider_stats.html +0 -40
  225. django_cfg/apps/payments/templates/payments/components/status_badge.html +0 -34
  226. django_cfg/apps/payments/templates/payments/components/status_overview.html +0 -148
  227. django_cfg/apps/payments/templates/payments/dashboard.html +0 -258
  228. django_cfg/apps/payments/templates/payments/dashboard_simple_test.html +0 -35
  229. django_cfg/apps/payments/templates/payments/payment_create.html +0 -579
  230. django_cfg/apps/payments/templates/payments/payment_detail.html +0 -373
  231. django_cfg/apps/payments/templates/payments/payment_list.html +0 -354
  232. django_cfg/apps/payments/templates/payments/stats.html +0 -261
  233. django_cfg/apps/payments/templates/payments/test.html +0 -213
  234. django_cfg/apps/payments/templatetags/payments_tags.py +0 -315
  235. django_cfg/apps/payments/utils/__init__.py +0 -43
  236. django_cfg/apps/payments/utils/billing_utils.py +0 -342
  237. django_cfg/apps/payments/utils/config_utils.py +0 -239
  238. django_cfg/apps/payments/utils/middleware_utils.py +0 -228
  239. django_cfg/apps/payments/utils/validation_utils.py +0 -94
  240. django_cfg/apps/payments/views/__init__.py +0 -63
  241. django_cfg/apps/payments/views/api_key_views.py +0 -164
  242. django_cfg/apps/payments/views/balance_views.py +0 -75
  243. django_cfg/apps/payments/views/currency_views.py +0 -122
  244. django_cfg/apps/payments/views/payment_views.py +0 -149
  245. django_cfg/apps/payments/views/subscription_views.py +0 -135
  246. django_cfg/apps/payments/views/tariff_views.py +0 -131
  247. django_cfg/apps/payments/views/templates/__init__.py +0 -25
  248. django_cfg/apps/payments/views/templates/ajax.py +0 -451
  249. django_cfg/apps/payments/views/templates/base.py +0 -212
  250. django_cfg/apps/payments/views/templates/dashboard.py +0 -60
  251. django_cfg/apps/payments/views/templates/payment_detail.py +0 -102
  252. django_cfg/apps/payments/views/templates/payment_management.py +0 -158
  253. django_cfg/apps/payments/views/templates/qr_code.py +0 -174
  254. django_cfg/apps/payments/views/templates/stats.py +0 -244
  255. django_cfg/apps/payments/views/templates/utils.py +0 -181
  256. django_cfg/apps/payments/views/webhook_views.py +0 -266
  257. django_cfg/apps/payments/viewsets.py +0 -66
  258. django_cfg/core/integration.py +0 -160
  259. django_cfg/template_archive/.gitignore +0 -1
  260. django_cfg/template_archive/__init__.py +0 -0
  261. django_cfg/urls.py +0 -33
  262. {django_cfg-1.2.31.dist-info → django_cfg-1.3.3.dist-info}/WHEEL +0 -0
  263. {django_cfg-1.2.31.dist-info → django_cfg-1.3.3.dist-info}/entry_points.txt +0 -0
  264. {django_cfg-1.2.31.dist-info → django_cfg-1.3.3.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,143 @@
1
+ """
2
+ Cache services for the Universal Payment System v2.0.
3
+
4
+ Main entry point for cache functionality.
5
+ Based on proven solutions from payments_old with improvements.
6
+ ONLY for API access control - NOT payment data!
7
+ """
8
+
9
+ from typing import Dict, Any
10
+ from django.core.cache import cache
11
+ from django_cfg.modules.django_logger import get_logger
12
+
13
+ from .interfaces import CacheInterface
14
+ from .simple_cache import SimpleCache
15
+ from .api_key_cache import ApiKeyCache
16
+ from .rate_limit_cache import RateLimitCache
17
+ from .keys import CacheKeys
18
+
19
+ logger = get_logger(__name__)
20
+
21
+
22
+ class CacheService:
23
+ """
24
+ Main cache service providing access to specialized caches.
25
+
26
+ Provides centralized access to different cache types.
27
+ """
28
+
29
+ def __init__(self):
30
+ """Initialize cache service with specialized caches."""
31
+ self.simple_cache = SimpleCache()
32
+ self.api_key_cache = ApiKeyCache()
33
+ self.rate_limit_cache = RateLimitCache()
34
+ # Backward compatibility attributes
35
+ self.default_timeout = 300
36
+ self.key_prefix = "payments"
37
+
38
+ # Backward compatibility methods - delegate to simple_cache
39
+ def get(self, key: str):
40
+ """Get value from cache."""
41
+ return self.simple_cache.get(key)
42
+
43
+ def set(self, key: str, value, timeout=None):
44
+ """Set value in cache."""
45
+ return self.simple_cache.set(key, value, timeout)
46
+
47
+ def delete(self, key: str):
48
+ """Delete value from cache."""
49
+ return self.simple_cache.delete(key)
50
+
51
+ def exists(self, key: str):
52
+ """Check if key exists in cache."""
53
+ return self.simple_cache.exists(key)
54
+
55
+ def get_or_set(self, key: str, default, timeout=None):
56
+ """Get value or set default if not exists."""
57
+ value = self.get(key)
58
+ if value is None:
59
+ if callable(default):
60
+ value = default()
61
+ else:
62
+ value = default
63
+ self.set(key, value, timeout)
64
+ return value
65
+
66
+ def set_many(self, data: dict, timeout=None):
67
+ """Set multiple values."""
68
+ for key, value in data.items():
69
+ self.set(key, value, timeout)
70
+
71
+ def get_many(self, keys: list):
72
+ """Get multiple values."""
73
+ result = {}
74
+ for key in keys:
75
+ value = self.get(key)
76
+ if value is not None:
77
+ result[key] = value
78
+ return result
79
+
80
+ def delete_many(self, keys: list):
81
+ """Delete multiple values."""
82
+ for key in keys:
83
+ self.delete(key)
84
+
85
+ def clear(self):
86
+ """Clear all cache (not implemented for safety)."""
87
+ # For safety, we don't implement cache.clear()
88
+ # as it would clear the entire cache backend
89
+ # Instead, we clear Django's cache which is safe for tests
90
+ from django.core.cache import cache
91
+ cache.clear()
92
+
93
+ def health_check(self) -> Dict[str, Any]:
94
+ """Check cache health."""
95
+ try:
96
+ test_key = "health_check"
97
+ test_value = "ok"
98
+
99
+ # Test set/get/delete
100
+ self.simple_cache.set(test_key, test_value, 10)
101
+ retrieved = self.simple_cache.get(test_key)
102
+ self.simple_cache.delete(test_key)
103
+
104
+ is_healthy = retrieved == test_value
105
+
106
+ return {
107
+ 'healthy': is_healthy,
108
+ 'backend': cache.__class__.__name__,
109
+ 'simple_cache': True,
110
+ 'api_key_cache': True,
111
+ 'rate_limit_cache': True
112
+ }
113
+ except Exception as e:
114
+ logger.error(f"Cache health check failed: {e}")
115
+ return {
116
+ 'healthy': False,
117
+ 'error': str(e),
118
+ 'backend': cache.__class__.__name__
119
+ }
120
+
121
+
122
+ # Global cache service instance
123
+ _cache_service = None
124
+
125
+
126
+ def get_cache_service() -> CacheService:
127
+ """Get global cache service instance."""
128
+ global _cache_service
129
+ if _cache_service is None:
130
+ _cache_service = CacheService()
131
+ return _cache_service
132
+
133
+
134
+ # Export main classes for backward compatibility
135
+ __all__ = [
136
+ 'CacheService',
137
+ 'CacheInterface',
138
+ 'SimpleCache',
139
+ 'ApiKeyCache',
140
+ 'RateLimitCache',
141
+ 'CacheKeys',
142
+ 'get_cache_service'
143
+ ]
@@ -0,0 +1,37 @@
1
+ """
2
+ API Key cache implementation for the Universal Payment System v2.0.
3
+
4
+ Specialized caching for API key operations and validation.
5
+ """
6
+
7
+ from typing import Optional
8
+ from .simple_cache import SimpleCache
9
+
10
+
11
+ class ApiKeyCache:
12
+ """Specialized cache for API key operations."""
13
+
14
+ def __init__(self):
15
+ self.cache = SimpleCache("api_keys")
16
+ self.default_timeout = self._get_cache_timeout('api_key')
17
+
18
+ def _get_cache_timeout(self, cache_type: str) -> int:
19
+ """Get cache timeout from PaymentsConfig."""
20
+ try:
21
+ from django_cfg.models.payments import PaymentsConfig
22
+ config = PaymentsConfig.get_current_config()
23
+ return config.cache_timeouts.get(cache_type, 300)
24
+ except Exception:
25
+ return 300 # 5 minutes default
26
+
27
+ def get_api_key_data(self, api_key: str) -> Optional[dict]:
28
+ """Get cached API key data."""
29
+ return self.cache.get(f"key:{api_key}")
30
+
31
+ def cache_api_key_data(self, api_key: str, data: dict) -> bool:
32
+ """Cache API key data."""
33
+ return self.cache.set(f"key:{api_key}", data, self.default_timeout)
34
+
35
+ def invalidate_api_key(self, api_key: str) -> bool:
36
+ """Invalidate cached API key."""
37
+ return self.cache.delete(f"key:{api_key}")
@@ -1,5 +1,7 @@
1
1
  """
2
- Base cache interface for payments module.
2
+ Cache interfaces for the Universal Payment System v2.0.
3
+
4
+ Abstract interfaces for cache implementations.
3
5
  """
4
6
 
5
7
  from abc import ABC, abstractmethod
@@ -0,0 +1,49 @@
1
+ """
2
+ Cache key generation utilities for the Universal Payment System v2.0.
3
+
4
+ Centralized cache key generation for consistency and testing.
5
+ """
6
+
7
+
8
+ class CacheKeys:
9
+ """Cache key generation utilities."""
10
+
11
+ @staticmethod
12
+ def user_balance(user_id: int) -> str:
13
+ """Generate cache key for user balance."""
14
+ return f"payments:user_balance:{user_id}"
15
+
16
+ @staticmethod
17
+ def payment(payment_id: str) -> str:
18
+ """Generate cache key for payment data."""
19
+ return f"payments:payment:{payment_id}"
20
+
21
+ @staticmethod
22
+ def payment_status(payment_id: str) -> str:
23
+ """Generate cache key for payment status."""
24
+ return f"payments:payment_status:{payment_id}"
25
+
26
+ @staticmethod
27
+ def currency_rates(from_currency: str, to_currency: str) -> str:
28
+ """Generate cache key for currency exchange rates."""
29
+ return f"payments:currency_rates:{from_currency}:{to_currency}"
30
+
31
+ @staticmethod
32
+ def provider_currencies(provider: str) -> str:
33
+ """Generate cache key for provider supported currencies."""
34
+ return f"payments:provider_currencies:{provider}"
35
+
36
+ @staticmethod
37
+ def api_key_validation(api_key: str) -> str:
38
+ """Generate cache key for API key validation data."""
39
+ return f"payments:api_key_validation:{api_key}"
40
+
41
+ @staticmethod
42
+ def user_subscription(user_id: int) -> str:
43
+ """Generate cache key for user subscription data."""
44
+ return f"payments:user_subscription:{user_id}"
45
+
46
+ @staticmethod
47
+ def rate_limit(user_id: int, action: str) -> str:
48
+ """Generate cache key for rate limiting."""
49
+ return f"payments:rate_limit:{user_id}:{action}"
@@ -0,0 +1,47 @@
1
+ """
2
+ Rate limiting cache implementation for the Universal Payment System v2.0.
3
+
4
+ Specialized caching for API rate limiting and usage tracking.
5
+ """
6
+
7
+ from typing import Optional
8
+ from .simple_cache import SimpleCache
9
+
10
+
11
+ class RateLimitCache:
12
+ """Specialized cache for rate limiting."""
13
+
14
+ def __init__(self):
15
+ self.cache = SimpleCache("rate_limit")
16
+
17
+ def get_usage_count(self, user_id: int, endpoint_group: str, window: str = "hour") -> int:
18
+ """Get current usage count for rate limiting."""
19
+ key = f"usage:{user_id}:{endpoint_group}:{window}"
20
+ count = self.cache.get(key)
21
+ return count if count is not None else 0
22
+
23
+ def increment_usage(self, user_id: int, endpoint_group: str, window: str = "hour", ttl: Optional[int] = None) -> int:
24
+ """Increment usage count and return new count."""
25
+ key = f"usage:{user_id}:{endpoint_group}:{window}"
26
+
27
+ # Get current count
28
+ current = self.get_usage_count(user_id, endpoint_group, window)
29
+ new_count = current + 1
30
+
31
+ # Get TTL from config or use defaults
32
+ if ttl is None:
33
+ try:
34
+ from django_cfg.models.payments import PaymentsConfig
35
+ config = PaymentsConfig.get_current_config()
36
+ ttl = config.cache_timeouts.get('rate_limit', 3600)
37
+ except Exception:
38
+ ttl = 3600 if window == "hour" else 86400 # 1 hour or 1 day
39
+
40
+ # Set new count with TTL
41
+ self.cache.set(key, new_count, ttl)
42
+ return new_count
43
+
44
+ def reset_usage(self, user_id: int, endpoint_group: str, window: str = "hour") -> bool:
45
+ """Reset usage count."""
46
+ key = f"usage:{user_id}:{endpoint_group}:{window}"
47
+ return self.cache.delete(key)
@@ -0,0 +1,101 @@
1
+ """
2
+ Simple cache implementation for the Universal Payment System v2.0.
3
+
4
+ Basic cache functionality with graceful fallback.
5
+ """
6
+
7
+ from typing import Optional, Any
8
+ from django.core.cache import cache
9
+ from django_cfg.modules.django_logger import get_logger
10
+
11
+ from .interfaces import CacheInterface
12
+
13
+ logger = get_logger(__name__)
14
+
15
+
16
+ class SimpleCache(CacheInterface):
17
+ """
18
+ Simple cache implementation using Django's cache framework.
19
+
20
+ Falls back gracefully when cache is unavailable.
21
+ Based on proven solution from payments_old.
22
+ """
23
+
24
+ def __init__(self, prefix: str = "payments"):
25
+ self.prefix = prefix
26
+ self.enabled = self._is_cache_enabled()
27
+
28
+ def _is_cache_enabled(self) -> bool:
29
+ """Check if cache is enabled via PaymentsConfig."""
30
+ from django.conf import settings
31
+ import sys
32
+
33
+ # For tests, always enable cache (detect test environment)
34
+ if 'test' in sys.argv or hasattr(settings, 'TESTING'):
35
+ return True
36
+
37
+ # For development, enable by default
38
+ if settings.DEBUG:
39
+ return True
40
+
41
+ try:
42
+ from django_cfg.models.payments import PaymentsConfig
43
+ config = PaymentsConfig.get_current_config()
44
+ return config.enabled # Cache enabled if payments enabled
45
+ except Exception as e:
46
+ logger.debug(f"PaymentsConfig not available, enabling cache by default: {e}")
47
+ return True # Default to enabled with graceful fallback
48
+
49
+ def _make_key(self, key: str) -> str:
50
+ """Create prefixed cache key."""
51
+ return f"{self.prefix}:{key}"
52
+
53
+ def get(self, key: str) -> Optional[Any]:
54
+ """Get value from cache."""
55
+ if not self.enabled:
56
+ return None
57
+
58
+ try:
59
+ cache_key = self._make_key(key)
60
+ return cache.get(cache_key)
61
+ except Exception as e:
62
+ logger.warning(f"Cache get failed for key {key}: {e}")
63
+ return None
64
+
65
+ def set(self, key: str, value: Any, timeout: Optional[int] = None) -> bool:
66
+ """Set value in cache."""
67
+ if not self.enabled:
68
+ return False
69
+
70
+ try:
71
+ cache_key = self._make_key(key)
72
+ cache.set(cache_key, value, timeout)
73
+ return True
74
+ except Exception as e:
75
+ logger.warning(f"Cache set failed for key {key}: {e}")
76
+ return False
77
+
78
+ def delete(self, key: str) -> bool:
79
+ """Delete value from cache."""
80
+ if not self.enabled:
81
+ return False
82
+
83
+ try:
84
+ cache_key = self._make_key(key)
85
+ cache.delete(cache_key)
86
+ return True
87
+ except Exception as e:
88
+ logger.warning(f"Cache delete failed for key {key}: {e}")
89
+ return False
90
+
91
+ def exists(self, key: str) -> bool:
92
+ """Check if key exists in cache."""
93
+ if not self.enabled:
94
+ return False
95
+
96
+ try:
97
+ cache_key = self._make_key(key)
98
+ return cache.get(cache_key) is not None
99
+ except Exception as e:
100
+ logger.warning(f"Cache exists check failed for key {key}: {e}")
101
+ return False
@@ -1,17 +1,21 @@
1
1
  """
2
- Core payment services.
2
+ Core services for the Universal Payment System v2.0.
3
3
 
4
- Main business logic services for the payment system.
4
+ Business logic services with Pydantic validation.
5
5
  """
6
6
 
7
+ from .base import BaseService
7
8
  from .payment_service import PaymentService
8
9
  from .balance_service import BalanceService
9
10
  from .subscription_service import SubscriptionService
10
- # Core services only - no legacy adapters
11
+ from .currency_service import CurrencyService
12
+ from .webhook_service import WebhookService
11
13
 
12
14
  __all__ = [
15
+ 'BaseService',
13
16
  'PaymentService',
14
- 'BalanceService',
15
- 'SubscriptionService',
16
- # No legacy services
17
+ 'BalanceService',
18
+ 'SubscriptionService',
19
+ 'CurrencyService',
20
+ 'WebhookService',
17
21
  ]