utg-base 1.4.0__tar.gz → 1.5.0__tar.gz

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 (54) hide show
  1. {utg_base-1.4.0 → utg_base-1.5.0}/PKG-INFO +3 -1
  2. {utg_base-1.4.0 → utg_base-1.5.0}/pyproject.toml +3 -1
  3. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/views/__init__.py +0 -2
  4. utg_base-1.5.0/src/utg_base/env.py +27 -0
  5. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/logging.py +0 -10
  6. utg_base-1.5.0/src/utg_base/models/__init__.py +2 -0
  7. utg_base-1.5.0/src/utg_base/models/timestamp.py +9 -0
  8. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/utils/data.py +50 -6
  9. utg_base-1.4.0/src/utg_base/models/__init__.py +0 -1
  10. {utg_base-1.4.0 → utg_base-1.5.0}/README.md +0 -0
  11. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/__init__.py +0 -0
  12. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/api/__init__.py +0 -0
  13. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/api/base.py +0 -0
  14. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/api/pagination.py +0 -0
  15. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/api/permissions.py +0 -0
  16. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/api/routers.py +0 -0
  17. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/api/serializers.py +0 -0
  18. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/api/views.py +0 -0
  19. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/authentications/__init__.py +0 -0
  20. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/authentications/microservice_authentication.py +0 -0
  21. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/authentications/models.py +0 -0
  22. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/__init__.py +0 -0
  23. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/apps.py +0 -0
  24. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/filters/__init__.py +0 -0
  25. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/filters/task_result.py +0 -0
  26. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/management/__init__.py +0 -0
  27. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/management/commands/__init__.py +0 -0
  28. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/management/commands/migrate_tasks.py +0 -0
  29. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/serializers/__init__.py +0 -0
  30. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/serializers/periodic_task.py +0 -0
  31. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/serializers/task_result.py +0 -0
  32. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/urls.py +0 -0
  33. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/views/periodic_task.py +0 -0
  34. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/celery/views/task_result.py +0 -0
  35. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/constants/__init__.py +0 -0
  36. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/constants/available_languages.py +0 -0
  37. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/middleware/__init__.py +0 -0
  38. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/middleware/locale.py +0 -0
  39. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/models/jwt_user.py +0 -0
  40. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/references_api/__init__.py +0 -0
  41. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/references_api/admin.py +0 -0
  42. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/references_api/apps.py +0 -0
  43. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/references_api/migrations/__init__.py +0 -0
  44. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/references_api/models.py +0 -0
  45. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/references_api/urls.py +0 -0
  46. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/references_api/utils.py +0 -0
  47. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/services/__init__.py +0 -0
  48. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/services/base_api.py +0 -0
  49. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/utils/__init__.py +0 -0
  50. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/utils/date.py +0 -0
  51. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/utils/dict_util.py +0 -0
  52. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/utils/response_processors.py +0 -0
  53. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/utils/sql.py +0 -0
  54. {utg_base-1.4.0 → utg_base-1.5.0}/src/utg_base/utils/translation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: utg-base
3
- Version: 1.4.0
3
+ Version: 1.5.0
4
4
  Summary: UTG Base Package
5
5
  Author: Rovshen
6
6
  Author-email: rovshenashirov1619@gmail.com
@@ -14,7 +14,9 @@ Requires-Dist: django-celery-results (>=2.6.0,<3.0.0)
14
14
  Requires-Dist: django-filter (>=23.5,<24.0)
15
15
  Requires-Dist: djangorestframework (>=3.16.1,<4.0.0)
16
16
  Requires-Dist: djangorestframework-simplejwt[crypto] (>=5.5.1,<6.0.0)
17
+ Requires-Dist: dotenv (>=0.9.9,<0.10.0)
17
18
  Requires-Dist: drf-spectacular[sidecar] (>=0.29.0,<0.30.0)
19
+ Requires-Dist: hvac (>=2.4.0,<3.0.0)
18
20
  Requires-Dist: inflect (>=7.2.1,<8.0.0)
19
21
  Requires-Dist: openpyxl (>=3.1.2,<4.0.0)
20
22
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "utg-base"
3
- version = "1.4.0"
3
+ version = "1.5.0"
4
4
  description = "UTG Base Package"
5
5
  authors = ["Rovshen <rovshenashirov1619@gmail.com>"]
6
6
  readme = "README.md"
@@ -18,6 +18,8 @@ inflect = "^7.2.1"
18
18
  celery = "^5.5.3"
19
19
  django-celery-beat = "^2.8.1"
20
20
  django-celery-results = "^2.6.0"
21
+ hvac = "^2.4.0"
22
+ dotenv = "^0.9.9"
21
23
 
22
24
  [[tool.poetry.source]]
23
25
  name = "PyPI"
@@ -1,4 +1,2 @@
1
1
  from .periodic_task import PeriodicTaskViewSet, PeriodicTaskRunNowView
2
2
  from .task_result import TaskResultViewSet
3
-
4
-
@@ -0,0 +1,27 @@
1
+ import os
2
+
3
+ import dotenv
4
+ import hvac
5
+ from django.conf import settings
6
+
7
+ dotenv.load_dotenv(settings.BASE_DIR / '.env')
8
+
9
+ client = hvac.Client(
10
+ url=os.environ.get("VAULT_URL"),
11
+ token=os.environ.get("VAULT_TOKEN"),
12
+ verify=False
13
+ )
14
+ if not client.is_authenticated():
15
+ raise Exception("Vault authentication failed")
16
+
17
+ envs = client.secrets.kv.read_secret_version(
18
+ path=os.environ.get("VAULT_PATH"),
19
+ mount_point="utg-scada"
20
+ )['data']['data']
21
+
22
+
23
+ def env(key, default=None):
24
+ if key in os.environ:
25
+ return os.environ.get(key, default)
26
+ else:
27
+ return envs.get(key, default)
@@ -21,7 +21,6 @@ class UtgBaseFilter(logging.Filter):
21
21
 
22
22
 
23
23
  class UtgBaseLogging:
24
- enable_file = int(os.environ.get('LOGGING_FILE', False))
25
24
  enable_console_info = int(os.environ.get('LOGGING_CONSOLE_INFO', True))
26
25
  enable_db_debug = int(os.environ.get('LOGGING_DB_DEBUG', False))
27
26
  enable_loki = int(os.environ.get('LOGGING_LOKI', True))
@@ -51,13 +50,6 @@ class UtgBaseLogging:
51
50
  },
52
51
  },
53
52
  'handlers': {
54
- 'file': {
55
- 'level': 'ERROR',
56
- 'class': 'logging.FileHandler',
57
- 'filename': 'logs/django-error.log',
58
- 'formatter': 'simple',
59
- 'filters': ['trim_path'],
60
- },
61
53
  'console_info': {
62
54
  'level': 'INFO',
63
55
  'class': 'logging.StreamHandler',
@@ -114,8 +106,6 @@ class UtgBaseLogging:
114
106
  def logging(cls):
115
107
  _logging = cls.__LOGGING.copy()
116
108
 
117
- if cls.enable_file:
118
- _logging['loggers']['django']['handlers'].append('file')
119
109
  if cls.enable_console_info:
120
110
  _logging['loggers']['django']['handlers'].append('console_info')
121
111
  if cls.enable_db_debug:
@@ -0,0 +1,2 @@
1
+ from .jwt_user import JWTUser
2
+ from .timestamp import BaseTimestamp
@@ -0,0 +1,9 @@
1
+ from django.db import models
2
+
3
+
4
+ class BaseTimestamp(models.Model):
5
+ created_at = models.DateTimeField(auto_now_add=True)
6
+ updated_at = models.DateTimeField(auto_now=True)
7
+
8
+ class Meta:
9
+ abstract = True
@@ -24,13 +24,24 @@ def deep_map(data: dict | list, func_cond, func_map, in_place=True):
24
24
  return data
25
25
 
26
26
 
27
- def deep_round(data: dict | list, ndigits: int, in_place=True):
28
- return deep_map(data, lambda value: isinstance(value, float), lambda value: round(value, ndigits), in_place)
27
+ def to_numeric_or_none(*args):
28
+ _is_iterable = isinstance(args[0], Iterable) and not isinstance(args[0], str)
29
+ if _is_iterable:
30
+ args = args[0]
31
+ result = []
32
+
33
+ for x in args:
34
+ if isinstance(x, (int, float, complex, bool)):
35
+ result.append(x)
36
+ else:
37
+ result.append(None)
38
+ if not _is_iterable and len(result) == 1 and len(args) == 1:
39
+ return result[0]
40
+ return result
29
41
 
30
42
 
31
43
  def safe_sum(*args, allow_null=True):
32
- if isinstance(args[0], Iterable):
33
- args = args[0]
44
+ args = to_numeric_or_none(*args)
34
45
 
35
46
  if all(arg is None for arg in args):
36
47
  return None
@@ -44,8 +55,7 @@ def safe_sum(*args, allow_null=True):
44
55
 
45
56
 
46
57
  def safe_subtract(*args, allow_null=False):
47
- if isinstance(args[0], Iterable):
48
- args = args[0]
58
+ args = to_numeric_or_none(*args)
49
59
 
50
60
  if all(arg is None for arg in args):
51
61
  return None
@@ -56,3 +66,37 @@ def safe_subtract(*args, allow_null=False):
56
66
  for arg in args[1:]:
57
67
  _sum -= arg or 0
58
68
  return _sum
69
+
70
+
71
+ def safe_multiply(*args, allow_null=False):
72
+ args = to_numeric_or_none(*args)
73
+
74
+ if all(arg is None for arg in args):
75
+ return None
76
+ if not allow_null and any(arg is None for arg in args):
77
+ return None
78
+
79
+ result = 1
80
+ for arg in args:
81
+ value = 0 if allow_null and arg is None else arg
82
+ result *= value
83
+ return result
84
+
85
+
86
+ def safe_divide(*args, allow_null=False):
87
+ args = to_numeric_or_none(*args)
88
+
89
+ if all(arg is None for arg in args):
90
+ return None
91
+ if not allow_null and any(arg is None for arg in args):
92
+ return None
93
+
94
+ result = 0 if allow_null and args[0] is None else args[0]
95
+
96
+ for arg in args[1:]:
97
+ value = 0 if allow_null and arg is None else arg
98
+ if value == 0:
99
+ return None
100
+ result /= value
101
+
102
+ return result
@@ -1 +0,0 @@
1
- from .jwt_user import JWTUser
File without changes