lesscode-flask 0.0.97__tar.gz → 0.0.99__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.
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/PKG-INFO +1 -1
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/__init__.py +1 -1
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/log/access_log_handler.py +1 -3
- lesscode_flask-0.0.99/lesscode_flask/static/swagger.py +67 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/swagger/swagger_template.py +10 -2
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/swagger/swagger_util.py +16 -2
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/PKG-INFO +1 -1
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/SOURCES.txt +1 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/elasticsearch.py +21 -66
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/README.md +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/app.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/db/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/db/datasource.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/db/executor.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/export_data/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/export_data/data_download_handler.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/access_log.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/base_model.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/parameterized_query.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/response_result.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/model/user.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/service/access_log_service.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/service/base_service.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/setting/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/setup/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/decorator/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/decorator/cache.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/decorator/swagger.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/file/file_exporter.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/helpers.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/json/NotSortJSONProvider.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/oss/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/oss/ks3_oss.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/redis/redis_helper.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/request/request.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/thread/thread_utils.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/wsgi.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/dependency_links.txt +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/requires.txt +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/top_level.txt +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/clickhouse.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/kingbase.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/mysql.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/query_runner/pg.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/settings/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/settings/helpers.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/utils/__init__.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/redash/utils/requests_session.py +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/setup.cfg +0 -0
- {lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/setup.py +0 -0
|
@@ -46,9 +46,7 @@ class AccessLogHandler(Handler):
|
|
|
46
46
|
resource_label = "-"
|
|
47
47
|
client_id = "-"
|
|
48
48
|
try:
|
|
49
|
-
url_info = RedisHelper(app_config.get("REDIS_OAUTH_KEY", "redis")).sync_hgetall(url_info_key
|
|
50
|
-
["id", "label",
|
|
51
|
-
"client_id"])
|
|
49
|
+
url_info = RedisHelper(app_config.get("REDIS_OAUTH_KEY", "redis")).sync_hgetall(url_info_key)
|
|
52
50
|
if url_info:
|
|
53
51
|
resource_id = url_info.get("id", "-")
|
|
54
52
|
resource_label = url_info.get("label", "-")
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
swagger_json = {
|
|
2
|
+
"openapi": "3.0.0",
|
|
3
|
+
"info": {
|
|
4
|
+
"title": "Example API",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"description": "This is an example API that demonstrates OpenAPI 3.0 features."
|
|
7
|
+
},
|
|
8
|
+
"servers": [
|
|
9
|
+
{
|
|
10
|
+
"url": "https://api.example.com/v1",
|
|
11
|
+
"description": "Main production server"
|
|
12
|
+
}
|
|
13
|
+
],
|
|
14
|
+
"paths": {
|
|
15
|
+
"/api/v1/greet": {
|
|
16
|
+
"get": {
|
|
17
|
+
"summary": "Get a greeting message",
|
|
18
|
+
"description": "This endpoint returns a greeting message to the user.",
|
|
19
|
+
"operationId": "getGreeting",
|
|
20
|
+
"security": [
|
|
21
|
+
{
|
|
22
|
+
"BearerAuth": []
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"responses": {
|
|
26
|
+
"200": {
|
|
27
|
+
"description": "A greeting message",
|
|
28
|
+
"content": {
|
|
29
|
+
"application/json": {
|
|
30
|
+
"schema": {
|
|
31
|
+
"$ref": "#/components/schemas/Greeting"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"400": {
|
|
37
|
+
"description": "Bad Request - Missing or invalid Authorization header"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
"components": {
|
|
44
|
+
"securitySchemes": {
|
|
45
|
+
"BearerAuth": {
|
|
46
|
+
"type": "http",
|
|
47
|
+
"scheme": "bearer",
|
|
48
|
+
"bearerFormat": "JWT"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"schemas": {
|
|
52
|
+
"Greeting": {
|
|
53
|
+
"type": "object",
|
|
54
|
+
"properties": {
|
|
55
|
+
"message": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"example": "Hello, John Doe!"
|
|
58
|
+
},
|
|
59
|
+
"lang": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"example": "en"
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
{lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/swagger/swagger_template.py
RENAMED
|
@@ -38,12 +38,20 @@ def get_request_body(body, required, request_type):
|
|
|
38
38
|
def get_header_template():
|
|
39
39
|
return [
|
|
40
40
|
{
|
|
41
|
-
"name": "
|
|
41
|
+
"name": "App-Key",
|
|
42
42
|
"in": "header",
|
|
43
43
|
"required": False,
|
|
44
44
|
"schema": {
|
|
45
45
|
"type": "string",
|
|
46
|
-
"description": "
|
|
46
|
+
"description": "App-Key"
|
|
47
|
+
}
|
|
48
|
+
}, {
|
|
49
|
+
"name": "Data-Source-Id",
|
|
50
|
+
"in": "header",
|
|
51
|
+
"required": False,
|
|
52
|
+
"schema": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"description": "Data-Source-Id"
|
|
47
55
|
}
|
|
48
56
|
}
|
|
49
57
|
]
|
{lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/swagger/swagger_util.py
RENAMED
|
@@ -28,7 +28,12 @@ def generate_openapi_spec(app):
|
|
|
28
28
|
"tags": [rule.endpoint.split('.')[0]],
|
|
29
29
|
# "description": f"Description for {method} {rule.rule}",
|
|
30
30
|
"description": description,
|
|
31
|
-
"responses": get_response_template()
|
|
31
|
+
"responses": get_response_template(),
|
|
32
|
+
"security": [
|
|
33
|
+
{
|
|
34
|
+
"BearerAuth": []
|
|
35
|
+
}
|
|
36
|
+
],
|
|
32
37
|
}
|
|
33
38
|
|
|
34
39
|
if method_ == "post":
|
|
@@ -63,7 +68,16 @@ def generate_openapi_spec(app):
|
|
|
63
68
|
"version": "1.0.0"
|
|
64
69
|
},
|
|
65
70
|
"tags": [{"name": k} for k in app.blueprints],
|
|
66
|
-
"paths": paths
|
|
71
|
+
"paths": paths,
|
|
72
|
+
"components": {
|
|
73
|
+
"securitySchemes": {
|
|
74
|
+
"BearerAuth": {
|
|
75
|
+
"type": "http",
|
|
76
|
+
"scheme": "bearer",
|
|
77
|
+
"bearerFormat": "JWT"
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
67
81
|
}
|
|
68
82
|
return openapi_spec
|
|
69
83
|
|
|
@@ -23,6 +23,7 @@ lesscode_flask/service/access_log_service.py
|
|
|
23
23
|
lesscode_flask/service/base_service.py
|
|
24
24
|
lesscode_flask/setting/__init__.py
|
|
25
25
|
lesscode_flask/setup/__init__.py
|
|
26
|
+
lesscode_flask/static/swagger.py
|
|
26
27
|
lesscode_flask/utils/__init__.py
|
|
27
28
|
lesscode_flask/utils/helpers.py
|
|
28
29
|
lesscode_flask/utils/decorator/__init__.py
|
|
@@ -1,25 +1,11 @@
|
|
|
1
1
|
import logging
|
|
2
|
-
import sys
|
|
3
|
-
import urllib.request
|
|
4
|
-
import urllib.parse
|
|
5
2
|
import urllib.error
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
try:
|
|
9
|
-
requests = import_module("requests")
|
|
10
|
-
except ImportError as e:
|
|
11
|
-
raise Exception(f"requests is not exist,run:pip install requests==2.32.3")
|
|
12
|
-
from requests.auth import HTTPBasicAuth
|
|
3
|
+
import urllib.parse
|
|
13
4
|
|
|
5
|
+
from lesscode_flask.utils.request.request import get_basic_auth, sync_common_request_origin
|
|
14
6
|
from redash.query_runner import *
|
|
15
7
|
from redash.utils import json_dumps, json_loads
|
|
16
8
|
|
|
17
|
-
try:
|
|
18
|
-
import http.client as http_client
|
|
19
|
-
except ImportError:
|
|
20
|
-
# Python 2
|
|
21
|
-
import http.client as http_client
|
|
22
|
-
|
|
23
9
|
logger = logging.getLogger(__name__)
|
|
24
10
|
|
|
25
11
|
ELASTICSEARCH_TYPES_MAPPING = {
|
|
@@ -75,8 +61,6 @@ class BaseElasticSearch(BaseQueryRunner):
|
|
|
75
61
|
self.syntax = "json"
|
|
76
62
|
|
|
77
63
|
if self.DEBUG_ENABLED:
|
|
78
|
-
http_client.HTTPConnection.debuglevel = 1
|
|
79
|
-
|
|
80
64
|
# you need to initialize logging, otherwise you will not see anything from requests
|
|
81
65
|
logging.basicConfig()
|
|
82
66
|
logging.getLogger().setLevel(logging.DEBUG)
|
|
@@ -94,25 +78,18 @@ class BaseElasticSearch(BaseQueryRunner):
|
|
|
94
78
|
basic_auth_password = self.configuration.get("basic_auth_password", None)
|
|
95
79
|
self.auth = None
|
|
96
80
|
if basic_auth_user and basic_auth_password:
|
|
97
|
-
self.auth =
|
|
81
|
+
self.auth = get_basic_auth(basic_auth_user, basic_auth_password)
|
|
98
82
|
|
|
99
83
|
def _get_mappings(self, url):
|
|
100
|
-
mappings = {}
|
|
101
84
|
error = None
|
|
102
85
|
try:
|
|
103
|
-
r =
|
|
86
|
+
r = sync_common_request_origin(url=url, method="get", auth=self.auth)
|
|
104
87
|
r.raise_for_status()
|
|
105
88
|
|
|
106
89
|
mappings = r.json()
|
|
107
|
-
except
|
|
90
|
+
except Exception as e:
|
|
108
91
|
logger.exception(e)
|
|
109
|
-
error = "Failed to execute query.
|
|
110
|
-
r.status_code, r.text
|
|
111
|
-
)
|
|
112
|
-
mappings = None
|
|
113
|
-
except requests.exceptions.RequestException as e:
|
|
114
|
-
logger.exception(e)
|
|
115
|
-
error = "Connection refused"
|
|
92
|
+
error = f"Failed to execute query. Reason: {e}"
|
|
116
93
|
mappings = None
|
|
117
94
|
|
|
118
95
|
return mappings, error
|
|
@@ -178,10 +155,10 @@ class BaseElasticSearch(BaseQueryRunner):
|
|
|
178
155
|
return list(schema.values())
|
|
179
156
|
|
|
180
157
|
def _parse_results(
|
|
181
|
-
|
|
158
|
+
self, mappings, result_fields, raw_result, result_columns, result_rows
|
|
182
159
|
):
|
|
183
160
|
def add_column_if_needed(
|
|
184
|
-
|
|
161
|
+
mappings, column_name, friendly_name, result_columns, result_columns_index
|
|
185
162
|
):
|
|
186
163
|
if friendly_name not in result_columns_index:
|
|
187
164
|
result_columns.append(
|
|
@@ -210,7 +187,7 @@ class BaseElasticSearch(BaseQueryRunner):
|
|
|
210
187
|
row[key] = value
|
|
211
188
|
|
|
212
189
|
def collect_aggregations(
|
|
213
|
-
|
|
190
|
+
mappings, rows, parent_key, data, row, result_columns, result_columns_index
|
|
214
191
|
):
|
|
215
192
|
if isinstance(data, dict):
|
|
216
193
|
for key, value in data.items():
|
|
@@ -345,20 +322,13 @@ class BaseElasticSearch(BaseQueryRunner):
|
|
|
345
322
|
|
|
346
323
|
def test_connection(self):
|
|
347
324
|
try:
|
|
348
|
-
r =
|
|
349
|
-
|
|
350
|
-
|
|
325
|
+
r = sync_common_request_origin(url="{0}/_cluster/health".format(self.server_url), method="get",
|
|
326
|
+
auth=self.auth
|
|
327
|
+
)
|
|
351
328
|
r.raise_for_status()
|
|
352
|
-
except
|
|
329
|
+
except Exception as e:
|
|
353
330
|
logger.exception(e)
|
|
354
|
-
raise Exception(
|
|
355
|
-
"Failed to execute query. Return Code: {0} Reason: {1}".format(
|
|
356
|
-
r.status_code, r.text
|
|
357
|
-
)
|
|
358
|
-
)
|
|
359
|
-
except requests.exceptions.RequestException as e:
|
|
360
|
-
logger.exception(e)
|
|
361
|
-
raise Exception("Connection refused")
|
|
331
|
+
raise Exception(f"Failed to execute query.Reason: {e}")
|
|
362
332
|
|
|
363
333
|
|
|
364
334
|
class Kibana(BaseElasticSearch):
|
|
@@ -367,10 +337,10 @@ class Kibana(BaseElasticSearch):
|
|
|
367
337
|
return True
|
|
368
338
|
|
|
369
339
|
def _execute_simple_query(
|
|
370
|
-
|
|
340
|
+
self, url, auth, _from, mappings, result_fields, result_columns, result_rows
|
|
371
341
|
):
|
|
372
342
|
url += "&from={0}".format(_from)
|
|
373
|
-
r =
|
|
343
|
+
r = sync_common_request_origin(url=url, method="get", auth=self.auth)
|
|
374
344
|
r.raise_for_status()
|
|
375
345
|
|
|
376
346
|
raw_result = r.json()
|
|
@@ -442,15 +412,9 @@ class Kibana(BaseElasticSearch):
|
|
|
442
412
|
|
|
443
413
|
# json_data = json_dumps({"columns": result_columns, "rows": result_rows})
|
|
444
414
|
json_data = {"columns": result_columns, "rows": result_rows}
|
|
445
|
-
except
|
|
446
|
-
logger.exception(e)
|
|
447
|
-
error = "Failed to execute query. Return Code: {0} Reason: {1}".format(
|
|
448
|
-
r.status_code, r.text
|
|
449
|
-
)
|
|
450
|
-
json_data = None
|
|
451
|
-
except requests.exceptions.RequestException as e:
|
|
415
|
+
except Exception as e:
|
|
452
416
|
logger.exception(e)
|
|
453
|
-
error = "
|
|
417
|
+
error = f"Failed to execute query. Reason: {e}"
|
|
454
418
|
json_data = None
|
|
455
419
|
|
|
456
420
|
return json_data, error
|
|
@@ -488,7 +452,7 @@ class ElasticSearch(BaseElasticSearch):
|
|
|
488
452
|
|
|
489
453
|
logger.debug("Using URL: %s", url)
|
|
490
454
|
logger.debug("Using query: %s", query_dict)
|
|
491
|
-
r =
|
|
455
|
+
r = sync_common_request_origin(url=url, method="get", json=query_dict, auth=self.auth)
|
|
492
456
|
r.raise_for_status()
|
|
493
457
|
logger.debug("Result: %s", r.json())
|
|
494
458
|
|
|
@@ -499,18 +463,9 @@ class ElasticSearch(BaseElasticSearch):
|
|
|
499
463
|
)
|
|
500
464
|
|
|
501
465
|
json_data = json_dumps({"columns": result_columns, "rows": result_rows})
|
|
502
|
-
except
|
|
503
|
-
logger.exception(e)
|
|
504
|
-
raise
|
|
505
|
-
except requests.HTTPError as e:
|
|
506
|
-
logger.exception(e)
|
|
507
|
-
error = "Failed to execute query. Return Code: {0} Reason: {1}".format(
|
|
508
|
-
r.status_code, r.text
|
|
509
|
-
)
|
|
510
|
-
json_data = None
|
|
511
|
-
except requests.exceptions.RequestException as e:
|
|
466
|
+
except Exception as e:
|
|
512
467
|
logger.exception(e)
|
|
513
|
-
error = "
|
|
468
|
+
error = f"Failed to execute query. Reason: {e}"
|
|
514
469
|
json_data = None
|
|
515
470
|
|
|
516
471
|
return json_data, error
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/export_data/data_download_handler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/service/access_log_service.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask/utils/json/NotSortJSONProvider.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lesscode_flask-0.0.97 → lesscode_flask-0.0.99}/lesscode_flask.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|