square-administration 1.0.0__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.
- square_administration/__init__.py +0 -0
- square_administration/configuration.py +119 -0
- square_administration/data/config.ini +45 -0
- square_administration/main.py +59 -0
- square_administration/messages.py +13 -0
- square_administration/pydantic_models/__init__.py +0 -0
- square_administration/pydantic_models/authentication.py +12 -0
- square_administration/pydantic_models/core.py +0 -0
- square_administration/routes/__init__.py +0 -0
- square_administration/routes/authentication.py +239 -0
- square_administration/routes/core.py +5 -0
- square_administration/utils/__init__.py +0 -0
- square_administration-1.0.0.dist-info/METADATA +50 -0
- square_administration-1.0.0.dist-info/RECORD +16 -0
- square_administration-1.0.0.dist-info/WHEEL +5 -0
- square_administration-1.0.0.dist-info/top_level.txt +1 -0
File without changes
|
@@ -0,0 +1,119 @@
|
|
1
|
+
import os
|
2
|
+
import sys
|
3
|
+
|
4
|
+
from square_authentication_helper import SquareAuthenticationHelper
|
5
|
+
from square_commons import ConfigReader
|
6
|
+
from square_database_helper import SquareDatabaseHelper, FiltersV0
|
7
|
+
from square_database_helper.pydantic_models import FilterConditionsV0
|
8
|
+
from square_database_structure.square import global_string_database_name
|
9
|
+
from square_database_structure.square.public import global_string_schema_name
|
10
|
+
from square_database_structure.square.public.tables import App
|
11
|
+
from square_logger.main import SquareLogger
|
12
|
+
|
13
|
+
try:
|
14
|
+
config_file_path = (
|
15
|
+
os.path.dirname(os.path.abspath(__file__))
|
16
|
+
+ os.sep
|
17
|
+
+ "data"
|
18
|
+
+ os.sep
|
19
|
+
+ "config.ini"
|
20
|
+
)
|
21
|
+
ldict_configuration = ConfigReader(config_file_path).read_configuration()
|
22
|
+
|
23
|
+
# get all vars and typecast
|
24
|
+
# ===========================================
|
25
|
+
# general
|
26
|
+
config_str_module_name = ldict_configuration["GENERAL"]["MODULE_NAME"]
|
27
|
+
config_str_app_name = ldict_configuration["GENERAL"]["APP_NAME"]
|
28
|
+
# ===========================================
|
29
|
+
|
30
|
+
# ===========================================
|
31
|
+
# environment
|
32
|
+
config_str_host_ip = ldict_configuration["ENVIRONMENT"]["HOST_IP"]
|
33
|
+
config_int_host_port = int(ldict_configuration["ENVIRONMENT"]["HOST_PORT"])
|
34
|
+
config_str_log_file_name = ldict_configuration["ENVIRONMENT"]["LOG_FILE_NAME"]
|
35
|
+
config_str_admin_password_hash = ldict_configuration["ENVIRONMENT"][
|
36
|
+
"ADMIN_PASSWORD_HASH"
|
37
|
+
]
|
38
|
+
|
39
|
+
config_str_ssl_crt_file_path = ldict_configuration["ENVIRONMENT"][
|
40
|
+
"SSL_CRT_FILE_PATH"
|
41
|
+
]
|
42
|
+
config_str_ssl_key_file_path = ldict_configuration["ENVIRONMENT"][
|
43
|
+
"SSL_KEY_FILE_PATH"
|
44
|
+
]
|
45
|
+
# ===========================================
|
46
|
+
|
47
|
+
# ===========================================
|
48
|
+
# square_logger
|
49
|
+
config_int_log_level = int(ldict_configuration["SQUARE_LOGGER"]["LOG_LEVEL"])
|
50
|
+
config_str_log_path = ldict_configuration["SQUARE_LOGGER"]["LOG_PATH"]
|
51
|
+
config_int_log_backup_count = int(
|
52
|
+
ldict_configuration["SQUARE_LOGGER"]["LOG_BACKUP_COUNT"]
|
53
|
+
)
|
54
|
+
# ===========================================
|
55
|
+
|
56
|
+
# ===========================================
|
57
|
+
# square_database_helper
|
58
|
+
|
59
|
+
config_str_square_database_protocol = ldict_configuration["SQUARE_DATABASE_HELPER"][
|
60
|
+
"SQUARE_DATABASE_PROTOCOL"
|
61
|
+
]
|
62
|
+
config_str_square_database_ip = ldict_configuration["SQUARE_DATABASE_HELPER"][
|
63
|
+
"SQUARE_DATABASE_IP"
|
64
|
+
]
|
65
|
+
config_int_square_database_port = int(
|
66
|
+
ldict_configuration["SQUARE_DATABASE_HELPER"]["SQUARE_DATABASE_PORT"]
|
67
|
+
)
|
68
|
+
# ===========================================
|
69
|
+
# ===========================================
|
70
|
+
# square_authentication_helper
|
71
|
+
|
72
|
+
config_str_square_authentication_protocol = ldict_configuration[
|
73
|
+
"SQUARE_AUTHENTICATION_HELPER"
|
74
|
+
]["SQUARE_AUTHENTICATION_PROTOCOL"]
|
75
|
+
config_str_square_authentication_ip = ldict_configuration[
|
76
|
+
"SQUARE_AUTHENTICATION_HELPER"
|
77
|
+
]["SQUARE_AUTHENTICATION_IP"]
|
78
|
+
config_int_square_authentication_port = int(
|
79
|
+
ldict_configuration["SQUARE_AUTHENTICATION_HELPER"][
|
80
|
+
"SQUARE_AUTHENTICATION_PORT"
|
81
|
+
]
|
82
|
+
)
|
83
|
+
# ===========================================
|
84
|
+
# Initialize logger
|
85
|
+
global_object_square_logger = SquareLogger(
|
86
|
+
pstr_log_file_name=config_str_log_file_name,
|
87
|
+
pint_log_level=config_int_log_level,
|
88
|
+
pstr_log_path=config_str_log_path,
|
89
|
+
pint_log_backup_count=config_int_log_backup_count,
|
90
|
+
)
|
91
|
+
|
92
|
+
global_object_square_database_helper = SquareDatabaseHelper(
|
93
|
+
param_str_square_database_ip=config_str_square_database_ip,
|
94
|
+
param_int_square_database_port=config_int_square_database_port,
|
95
|
+
param_str_square_database_protocol=config_str_square_database_protocol,
|
96
|
+
)
|
97
|
+
global_object_square_authentication_helper = SquareAuthenticationHelper(
|
98
|
+
param_str_square_authentication_protocol=config_str_square_authentication_protocol,
|
99
|
+
param_str_square_authentication_ip=config_str_square_authentication_ip,
|
100
|
+
param_int_square_authentication_port=config_int_square_authentication_port,
|
101
|
+
)
|
102
|
+
# get app id
|
103
|
+
global_int_app_id = global_object_square_database_helper.get_rows_v0(
|
104
|
+
database_name=global_string_database_name,
|
105
|
+
schema_name=global_string_schema_name,
|
106
|
+
table_name=App.__tablename__,
|
107
|
+
filters=FiltersV0(
|
108
|
+
root={
|
109
|
+
App.app_name.name: FilterConditionsV0(eq=config_str_app_name),
|
110
|
+
}
|
111
|
+
),
|
112
|
+
columns=[App.app_id.name],
|
113
|
+
)["data"]["main"][0][App.app_id.name]
|
114
|
+
except Exception as e:
|
115
|
+
print(
|
116
|
+
"\033[91mMissing or incorrect config.ini file.\n"
|
117
|
+
"Error details: " + str(e) + "\033[0m"
|
118
|
+
)
|
119
|
+
sys.exit()
|
@@ -0,0 +1,45 @@
|
|
1
|
+
[GENERAL]
|
2
|
+
MODULE_NAME = square_administration
|
3
|
+
APP_NAME = square_admin
|
4
|
+
|
5
|
+
[ENVIRONMENT]
|
6
|
+
HOST_IP = 0.0.0.0
|
7
|
+
HOST_PORT = 10111
|
8
|
+
|
9
|
+
LOG_FILE_NAME = square_administration
|
10
|
+
|
11
|
+
ADMIN_PASSWORD_HASH = $2b$12$tDw4ZR0guiF5s5oVve5PcuELhlWO.lUH.OChPoeWVn95ac7QJlndq
|
12
|
+
|
13
|
+
# absolute path (mandatory only for http)
|
14
|
+
SSL_CRT_FILE_PATH = ssl.crt
|
15
|
+
SSL_KEY_FILE_PATH = ssl.key
|
16
|
+
|
17
|
+
[SQUARE_LOGGER]
|
18
|
+
|
19
|
+
# | Log Level | Value |
|
20
|
+
# | --------- | ----- |
|
21
|
+
# | CRITICAL | 50 |
|
22
|
+
# | ERROR | 40 |
|
23
|
+
# | WARNING | 30 |
|
24
|
+
# | INFO | 20 |
|
25
|
+
# | DEBUG | 10 |
|
26
|
+
# | NOTSET | 0 |
|
27
|
+
|
28
|
+
LOG_LEVEL = 20
|
29
|
+
# absolute or relative path
|
30
|
+
LOG_PATH = logs
|
31
|
+
# number of backup log files to keep during rotation
|
32
|
+
# if backupCount is zero, rollover never occurs.
|
33
|
+
LOG_BACKUP_COUNT = 3
|
34
|
+
|
35
|
+
[SQUARE_DATABASE_HELPER]
|
36
|
+
|
37
|
+
SQUARE_DATABASE_PROTOCOL = http
|
38
|
+
SQUARE_DATABASE_IP = localhost
|
39
|
+
SQUARE_DATABASE_PORT = 10010
|
40
|
+
|
41
|
+
[SQUARE_AUTHENTICATION_HELPER]
|
42
|
+
|
43
|
+
SQUARE_AUTHENTICATION_PROTOCOL = http
|
44
|
+
SQUARE_AUTHENTICATION_IP = localhost
|
45
|
+
SQUARE_AUTHENTICATION_PORT = 10011
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import os.path
|
2
|
+
|
3
|
+
from fastapi import FastAPI, status
|
4
|
+
from fastapi.middleware.cors import CORSMiddleware
|
5
|
+
from fastapi.responses import JSONResponse
|
6
|
+
from square_commons import get_api_output_in_standard_format
|
7
|
+
from uvicorn import run
|
8
|
+
|
9
|
+
from square_administration.configuration import (
|
10
|
+
config_int_host_port,
|
11
|
+
config_str_host_ip,
|
12
|
+
global_object_square_logger,
|
13
|
+
config_str_module_name,
|
14
|
+
config_str_ssl_key_file_path,
|
15
|
+
config_str_ssl_crt_file_path,
|
16
|
+
)
|
17
|
+
from square_administration.routes import core, authentication
|
18
|
+
|
19
|
+
app = FastAPI()
|
20
|
+
|
21
|
+
app.add_middleware(
|
22
|
+
CORSMiddleware,
|
23
|
+
allow_origins=["*"],
|
24
|
+
allow_methods=["*"],
|
25
|
+
allow_headers=["*"],
|
26
|
+
)
|
27
|
+
|
28
|
+
app.include_router(core.router)
|
29
|
+
app.include_router(authentication.router)
|
30
|
+
|
31
|
+
|
32
|
+
@app.get("/")
|
33
|
+
@global_object_square_logger.async_auto_logger
|
34
|
+
async def root():
|
35
|
+
output_content = get_api_output_in_standard_format(log=config_str_module_name)
|
36
|
+
return JSONResponse(status_code=status.HTTP_200_OK, content=output_content)
|
37
|
+
|
38
|
+
|
39
|
+
if __name__ == "__main__":
|
40
|
+
try:
|
41
|
+
if os.path.exists(config_str_ssl_key_file_path) and os.path.exists(
|
42
|
+
config_str_ssl_crt_file_path
|
43
|
+
):
|
44
|
+
run(
|
45
|
+
app,
|
46
|
+
host=config_str_host_ip,
|
47
|
+
port=config_int_host_port,
|
48
|
+
ssl_certfile=config_str_ssl_crt_file_path,
|
49
|
+
ssl_keyfile=config_str_ssl_key_file_path,
|
50
|
+
)
|
51
|
+
else:
|
52
|
+
run(
|
53
|
+
app,
|
54
|
+
host=config_str_host_ip,
|
55
|
+
port=config_int_host_port,
|
56
|
+
)
|
57
|
+
|
58
|
+
except Exception as exc:
|
59
|
+
global_object_square_logger.logger.critical(exc, exc_info=True)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
messages = {
|
2
|
+
"REGISTRATION_SUCCESSFUL": "registration was successful. welcome aboard!",
|
3
|
+
"LOGIN_SUCCESSFUL": "you have logged in successfully.",
|
4
|
+
"LOGOUT_SUCCESSFUL": "you have logged out successfully.",
|
5
|
+
"INCORRECT_USERNAME": "the username you entered does not exist.",
|
6
|
+
"INCORRECT_PASSWORD": "the password you entered is incorrect. please try again.",
|
7
|
+
"GENERIC_CREATION_SUCCESSFUL": "records created successfully.",
|
8
|
+
"GENERIC_READ_SUCCESSFUL": "data retrieved successfully.",
|
9
|
+
"GENERIC_UPDATE_SUCCESSFUL": "your information has been updated successfully.",
|
10
|
+
"GENERIC_DELETE_SUCCESSFUL": "your records have been deleted successfully.",
|
11
|
+
"GENERIC_400": "the request is invalid or cannot be processed.",
|
12
|
+
"GENERIC_500": "an internal server error occurred. please try again later.",
|
13
|
+
}
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,239 @@
|
|
1
|
+
import json
|
2
|
+
from typing import Annotated
|
3
|
+
|
4
|
+
import bcrypt
|
5
|
+
from fastapi import APIRouter, status, HTTPException, Header
|
6
|
+
from fastapi.responses import JSONResponse
|
7
|
+
from requests import HTTPError
|
8
|
+
from square_commons import get_api_output_in_standard_format
|
9
|
+
|
10
|
+
from square_administration.configuration import (
|
11
|
+
global_object_square_logger,
|
12
|
+
config_str_admin_password_hash,
|
13
|
+
global_object_square_authentication_helper,
|
14
|
+
global_int_app_id,
|
15
|
+
)
|
16
|
+
from square_administration.messages import messages
|
17
|
+
from square_administration.pydantic_models.authentication import (
|
18
|
+
RegisterUsernameV0,
|
19
|
+
LoginUsernameV0,
|
20
|
+
)
|
21
|
+
|
22
|
+
router = APIRouter(
|
23
|
+
tags=["authentication"],
|
24
|
+
)
|
25
|
+
|
26
|
+
|
27
|
+
@router.post("/register_username/v0")
|
28
|
+
@global_object_square_logger.async_auto_logger
|
29
|
+
async def register_username_v0(
|
30
|
+
body: RegisterUsernameV0,
|
31
|
+
):
|
32
|
+
username = body.username
|
33
|
+
password = body.password
|
34
|
+
admin_password = body.admin_password
|
35
|
+
|
36
|
+
username = username.lower()
|
37
|
+
try:
|
38
|
+
"""
|
39
|
+
validation
|
40
|
+
"""
|
41
|
+
|
42
|
+
# validation for admin_password
|
43
|
+
if not (
|
44
|
+
bcrypt.checkpw(
|
45
|
+
admin_password.encode("utf-8"),
|
46
|
+
config_str_admin_password_hash.encode("utf-8"),
|
47
|
+
)
|
48
|
+
):
|
49
|
+
output_content = get_api_output_in_standard_format(
|
50
|
+
message=messages["INCORRECT_PASSWORD"],
|
51
|
+
log=f"incorrect admin password.",
|
52
|
+
)
|
53
|
+
return JSONResponse(
|
54
|
+
status_code=status.HTTP_400_BAD_REQUEST,
|
55
|
+
content=output_content,
|
56
|
+
)
|
57
|
+
|
58
|
+
"""
|
59
|
+
main process
|
60
|
+
"""
|
61
|
+
response = global_object_square_authentication_helper.register_username_v0(
|
62
|
+
username=username,
|
63
|
+
password=password,
|
64
|
+
app_id=global_int_app_id,
|
65
|
+
)
|
66
|
+
"""
|
67
|
+
return value
|
68
|
+
"""
|
69
|
+
output_content = get_api_output_in_standard_format(
|
70
|
+
message=messages["REGISTRATION_SUCCESSFUL"],
|
71
|
+
data={"main": response["data"]["main"]},
|
72
|
+
)
|
73
|
+
return JSONResponse(
|
74
|
+
status_code=status.HTTP_201_CREATED,
|
75
|
+
content=output_content,
|
76
|
+
)
|
77
|
+
except HTTPError as http_error:
|
78
|
+
global_object_square_logger.logger.error(http_error, exc_info=True)
|
79
|
+
"""
|
80
|
+
rollback logic
|
81
|
+
"""
|
82
|
+
# pass
|
83
|
+
return JSONResponse(
|
84
|
+
status_code=http_error.response.status_code,
|
85
|
+
content=json.loads(http_error.response.content),
|
86
|
+
)
|
87
|
+
except HTTPException as http_exception:
|
88
|
+
global_object_square_logger.logger.error(http_exception, exc_info=True)
|
89
|
+
"""
|
90
|
+
rollback logic
|
91
|
+
"""
|
92
|
+
# pass
|
93
|
+
return JSONResponse(
|
94
|
+
status_code=http_exception.status_code, content=http_exception.detail
|
95
|
+
)
|
96
|
+
except Exception as e:
|
97
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
98
|
+
"""
|
99
|
+
rollback logic
|
100
|
+
"""
|
101
|
+
# pass
|
102
|
+
output_content = get_api_output_in_standard_format(
|
103
|
+
message=messages["GENERIC_500"],
|
104
|
+
log=str(e),
|
105
|
+
)
|
106
|
+
return JSONResponse(
|
107
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
108
|
+
)
|
109
|
+
|
110
|
+
|
111
|
+
@router.post("/login_username/v0")
|
112
|
+
@global_object_square_logger.async_auto_logger
|
113
|
+
async def login_username_v0(
|
114
|
+
body: LoginUsernameV0,
|
115
|
+
):
|
116
|
+
username = body.username
|
117
|
+
password = body.password
|
118
|
+
|
119
|
+
try:
|
120
|
+
"""
|
121
|
+
validation
|
122
|
+
"""
|
123
|
+
# pass
|
124
|
+
"""
|
125
|
+
main process
|
126
|
+
"""
|
127
|
+
response = global_object_square_authentication_helper.login_username_v0(
|
128
|
+
username=username,
|
129
|
+
password=password,
|
130
|
+
app_id=global_int_app_id,
|
131
|
+
assign_app_id_if_missing=False,
|
132
|
+
)
|
133
|
+
"""
|
134
|
+
return value
|
135
|
+
"""
|
136
|
+
output_content = get_api_output_in_standard_format(
|
137
|
+
message=messages["LOGIN_SUCCESSFUL"],
|
138
|
+
data={"main": response["data"]["main"]},
|
139
|
+
)
|
140
|
+
return JSONResponse(
|
141
|
+
status_code=status.HTTP_200_OK,
|
142
|
+
content=output_content,
|
143
|
+
)
|
144
|
+
except HTTPError as http_error:
|
145
|
+
global_object_square_logger.logger.error(http_error, exc_info=True)
|
146
|
+
"""
|
147
|
+
rollback logic
|
148
|
+
"""
|
149
|
+
# pass
|
150
|
+
return JSONResponse(
|
151
|
+
status_code=http_error.response.status_code,
|
152
|
+
content=json.loads(http_error.response.content),
|
153
|
+
)
|
154
|
+
except HTTPException as http_exception:
|
155
|
+
global_object_square_logger.logger.error(http_exception, exc_info=True)
|
156
|
+
"""
|
157
|
+
rollback logic
|
158
|
+
"""
|
159
|
+
# pass
|
160
|
+
return JSONResponse(
|
161
|
+
status_code=http_exception.status_code, content=http_exception.detail
|
162
|
+
)
|
163
|
+
except Exception as e:
|
164
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
165
|
+
"""
|
166
|
+
rollback logic
|
167
|
+
"""
|
168
|
+
# pass
|
169
|
+
output_content = get_api_output_in_standard_format(
|
170
|
+
message=messages["GENERIC_500"],
|
171
|
+
log=str(e),
|
172
|
+
)
|
173
|
+
return JSONResponse(
|
174
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
175
|
+
)
|
176
|
+
|
177
|
+
|
178
|
+
@router.patch("/remove_app_for_self/v0")
|
179
|
+
@global_object_square_logger.async_auto_logger
|
180
|
+
async def remove_app_for_self_v0(
|
181
|
+
access_token: Annotated[str, Header()],
|
182
|
+
):
|
183
|
+
|
184
|
+
try:
|
185
|
+
"""
|
186
|
+
validation
|
187
|
+
"""
|
188
|
+
# pass
|
189
|
+
"""
|
190
|
+
main process
|
191
|
+
"""
|
192
|
+
response = global_object_square_authentication_helper.update_user_app_ids_v0(
|
193
|
+
access_token=access_token,
|
194
|
+
app_ids_to_add=[],
|
195
|
+
app_ids_to_remove=[global_int_app_id],
|
196
|
+
)
|
197
|
+
"""
|
198
|
+
return value
|
199
|
+
"""
|
200
|
+
output_content = get_api_output_in_standard_format(
|
201
|
+
message=messages["GENERIC_UPDATE_SUCCESSFUL"],
|
202
|
+
data={"main": response["data"]["main"]},
|
203
|
+
)
|
204
|
+
return JSONResponse(
|
205
|
+
status_code=status.HTTP_200_OK,
|
206
|
+
content=output_content,
|
207
|
+
)
|
208
|
+
except HTTPError as http_error:
|
209
|
+
global_object_square_logger.logger.error(http_error, exc_info=True)
|
210
|
+
"""
|
211
|
+
rollback logic
|
212
|
+
"""
|
213
|
+
# pass
|
214
|
+
return JSONResponse(
|
215
|
+
status_code=http_error.response.status_code,
|
216
|
+
content=json.loads(http_error.response.content),
|
217
|
+
)
|
218
|
+
except HTTPException as http_exception:
|
219
|
+
global_object_square_logger.logger.error(http_exception, exc_info=True)
|
220
|
+
"""
|
221
|
+
rollback logic
|
222
|
+
"""
|
223
|
+
# pass
|
224
|
+
return JSONResponse(
|
225
|
+
status_code=http_exception.status_code, content=http_exception.detail
|
226
|
+
)
|
227
|
+
except Exception as e:
|
228
|
+
global_object_square_logger.logger.error(e, exc_info=True)
|
229
|
+
"""
|
230
|
+
rollback logic
|
231
|
+
"""
|
232
|
+
# pass
|
233
|
+
output_content = get_api_output_in_standard_format(
|
234
|
+
message=messages["GENERIC_500"],
|
235
|
+
log=str(e),
|
236
|
+
)
|
237
|
+
return JSONResponse(
|
238
|
+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, content=output_content
|
239
|
+
)
|
File without changes
|
@@ -0,0 +1,50 @@
|
|
1
|
+
Metadata-Version: 2.1
|
2
|
+
Name: square-administration
|
3
|
+
Version: 1.0.0
|
4
|
+
Summary: common business layer for my personal server.
|
5
|
+
Home-page: https://github.com/thepmsquare/square_administration
|
6
|
+
Author: thePmSquare
|
7
|
+
Author-email: thepmsquare@gmail.com
|
8
|
+
License: UNKNOWN
|
9
|
+
Platform: UNKNOWN
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
11
|
+
Classifier: Intended Audience :: Developers
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
14
|
+
Classifier: Programming Language :: Python :: 3.9
|
15
|
+
Description-Content-Type: text/markdown
|
16
|
+
Requires-Dist: uvicorn>=0.24.0.post1
|
17
|
+
Requires-Dist: fastapi>=0.104.1
|
18
|
+
Requires-Dist: pydantic>=2.5.3
|
19
|
+
Requires-Dist: requests>=2.32.3
|
20
|
+
Requires-Dist: bcrypt>=4.2.0
|
21
|
+
Requires-Dist: square-commons>=1.0.0
|
22
|
+
Requires-Dist: square-logger>=1.0.0
|
23
|
+
Requires-Dist: square-database-helper>=2.0.0
|
24
|
+
Requires-Dist: square-database-structure>=1.0.0
|
25
|
+
Requires-Dist: square-authentication-helper>=2.1.0
|
26
|
+
|
27
|
+
# square_administration
|
28
|
+
|
29
|
+
## about
|
30
|
+
|
31
|
+
administration business layer for my personal server.
|
32
|
+
|
33
|
+
## Installation
|
34
|
+
|
35
|
+
```shell
|
36
|
+
pip install square_administration
|
37
|
+
```
|
38
|
+
|
39
|
+
## env
|
40
|
+
|
41
|
+
- python>=3.12.0
|
42
|
+
|
43
|
+
## changelog
|
44
|
+
|
45
|
+
### v1.0.0
|
46
|
+
|
47
|
+
- initial implementation.
|
48
|
+
|
49
|
+
## Feedback is appreciated. Thank you!
|
50
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
square_administration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
|
+
square_administration/configuration.py,sha256=ldSmVp3FWOndN4u-dH-pf4i0olRZx1-uORJAj1qW-g8,4733
|
3
|
+
square_administration/main.py,sha256=H6YJ-PjqVKqj8Odot4jAHg02aAlYbuamHWmXKXy2aAk,1650
|
4
|
+
square_administration/messages.py,sha256=Zj0GyT4D0Yp1KGNRuPbn0k0zAO_ES9zwal7ONZ5ylGU,818
|
5
|
+
square_administration/data/config.ini,sha256=NMpUnBSPEdwCW1Y-z5DOjpTQgXGjt4ZcqP4QQiAXr_U,997
|
6
|
+
square_administration/pydantic_models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
7
|
+
square_administration/pydantic_models/authentication.py,sha256=DWXctw5UWzkSVY7nMIQZsRhmgW3OK455OVcoUpJrPY0,202
|
8
|
+
square_administration/pydantic_models/core.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
|
+
square_administration/routes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
10
|
+
square_administration/routes/authentication.py,sha256=26PjMeyj4UYk3hcK0rLmBQi4tHYfK2a14gtAx7jcy2E,7046
|
11
|
+
square_administration/routes/core.py,sha256=qGpLuQcnfo1SpOMwnft-vRA7vH_X_BiINfy85NjO_1I,72
|
12
|
+
square_administration/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
13
|
+
square_administration-1.0.0.dist-info/METADATA,sha256=rWBJwjqQrp5HxTYTkOux42eydl84V1TsBEDt-oISa1M,1205
|
14
|
+
square_administration-1.0.0.dist-info/WHEEL,sha256=bFJAMchF8aTQGUgMZzHJyDDMPTO3ToJ7x23SLJa1SVo,92
|
15
|
+
square_administration-1.0.0.dist-info/top_level.txt,sha256=8WFipDrMQUPRDo5AvipxU1YK3wZtWZyCUMWaR416zAw,22
|
16
|
+
square_administration-1.0.0.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
square_administration
|