square-administration 1.0.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 (21) hide show
  1. square_administration-1.0.0/PKG-INFO +40 -0
  2. square_administration-1.0.0/README.md +23 -0
  3. square_administration-1.0.0/setup.cfg +4 -0
  4. square_administration-1.0.0/setup.py +38 -0
  5. square_administration-1.0.0/square_administration/__init__.py +0 -0
  6. square_administration-1.0.0/square_administration/configuration.py +119 -0
  7. square_administration-1.0.0/square_administration/data/config.ini +45 -0
  8. square_administration-1.0.0/square_administration/main.py +59 -0
  9. square_administration-1.0.0/square_administration/messages.py +13 -0
  10. square_administration-1.0.0/square_administration/pydantic_models/__init__.py +0 -0
  11. square_administration-1.0.0/square_administration/pydantic_models/authentication.py +12 -0
  12. square_administration-1.0.0/square_administration/pydantic_models/core.py +0 -0
  13. square_administration-1.0.0/square_administration/routes/__init__.py +0 -0
  14. square_administration-1.0.0/square_administration/routes/authentication.py +239 -0
  15. square_administration-1.0.0/square_administration/routes/core.py +5 -0
  16. square_administration-1.0.0/square_administration/utils/__init__.py +0 -0
  17. square_administration-1.0.0/square_administration.egg-info/PKG-INFO +40 -0
  18. square_administration-1.0.0/square_administration.egg-info/SOURCES.txt +19 -0
  19. square_administration-1.0.0/square_administration.egg-info/dependency_links.txt +1 -0
  20. square_administration-1.0.0/square_administration.egg-info/requires.txt +10 -0
  21. square_administration-1.0.0/square_administration.egg-info/top_level.txt +1 -0
@@ -0,0 +1,40 @@
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
+
17
+ # square_administration
18
+
19
+ ## about
20
+
21
+ administration business layer for my personal server.
22
+
23
+ ## Installation
24
+
25
+ ```shell
26
+ pip install square_administration
27
+ ```
28
+
29
+ ## env
30
+
31
+ - python>=3.12.0
32
+
33
+ ## changelog
34
+
35
+ ### v1.0.0
36
+
37
+ - initial implementation.
38
+
39
+ ## Feedback is appreciated. Thank you!
40
+
@@ -0,0 +1,23 @@
1
+ # square_administration
2
+
3
+ ## about
4
+
5
+ administration business layer for my personal server.
6
+
7
+ ## Installation
8
+
9
+ ```shell
10
+ pip install square_administration
11
+ ```
12
+
13
+ ## env
14
+
15
+ - python>=3.12.0
16
+
17
+ ## changelog
18
+
19
+ ### v1.0.0
20
+
21
+ - initial implementation.
22
+
23
+ ## Feedback is appreciated. Thank you!
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,38 @@
1
+ from setuptools import find_packages, setup
2
+
3
+ package_name = "square_administration"
4
+
5
+ setup(
6
+ name=package_name,
7
+ version="1.0.0",
8
+ packages=find_packages(),
9
+ package_data={
10
+ package_name: ["data/*"],
11
+ },
12
+ install_requires=[
13
+ "uvicorn>=0.24.0.post1",
14
+ "fastapi>=0.104.1",
15
+ "pydantic>=2.5.3",
16
+ "requests>=2.32.3",
17
+ "bcrypt>=4.2.0",
18
+ "square_commons>=1.0.0",
19
+ "square_logger>=1.0.0",
20
+ "square_database_helper>=2.0.0",
21
+ "square_database_structure>=1.0.0",
22
+ "square_authentication_helper>=2.1.0",
23
+ ],
24
+ extras_require={},
25
+ author="thePmSquare",
26
+ author_email="thepmsquare@gmail.com",
27
+ description="common business layer for my personal server.",
28
+ long_description=open("README.md", "r").read(),
29
+ long_description_content_type="text/markdown",
30
+ url=f"https://github.com/thepmsquare/{package_name}",
31
+ classifiers=[
32
+ "Development Status :: 3 - Alpha",
33
+ "Intended Audience :: Developers",
34
+ "License :: OSI Approved :: MIT License",
35
+ "Programming Language :: Python :: 3",
36
+ "Programming Language :: Python :: 3.9",
37
+ ],
38
+ )
@@ -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
+ }
@@ -0,0 +1,12 @@
1
+ from pydantic import BaseModel
2
+
3
+
4
+ class RegisterUsernameV0(BaseModel):
5
+ username: str
6
+ password: str
7
+ admin_password: str
8
+
9
+
10
+ class LoginUsernameV0(BaseModel):
11
+ username: str
12
+ password: str
@@ -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
+ )
@@ -0,0 +1,5 @@
1
+ from fastapi import APIRouter
2
+
3
+ router = APIRouter(
4
+ tags=["core"],
5
+ )
@@ -0,0 +1,40 @@
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
+
17
+ # square_administration
18
+
19
+ ## about
20
+
21
+ administration business layer for my personal server.
22
+
23
+ ## Installation
24
+
25
+ ```shell
26
+ pip install square_administration
27
+ ```
28
+
29
+ ## env
30
+
31
+ - python>=3.12.0
32
+
33
+ ## changelog
34
+
35
+ ### v1.0.0
36
+
37
+ - initial implementation.
38
+
39
+ ## Feedback is appreciated. Thank you!
40
+
@@ -0,0 +1,19 @@
1
+ README.md
2
+ setup.py
3
+ square_administration/__init__.py
4
+ square_administration/configuration.py
5
+ square_administration/main.py
6
+ square_administration/messages.py
7
+ square_administration.egg-info/PKG-INFO
8
+ square_administration.egg-info/SOURCES.txt
9
+ square_administration.egg-info/dependency_links.txt
10
+ square_administration.egg-info/requires.txt
11
+ square_administration.egg-info/top_level.txt
12
+ square_administration/data/config.ini
13
+ square_administration/pydantic_models/__init__.py
14
+ square_administration/pydantic_models/authentication.py
15
+ square_administration/pydantic_models/core.py
16
+ square_administration/routes/__init__.py
17
+ square_administration/routes/authentication.py
18
+ square_administration/routes/core.py
19
+ square_administration/utils/__init__.py
@@ -0,0 +1,10 @@
1
+ uvicorn>=0.24.0.post1
2
+ fastapi>=0.104.1
3
+ pydantic>=2.5.3
4
+ requests>=2.32.3
5
+ bcrypt>=4.2.0
6
+ square_commons>=1.0.0
7
+ square_logger>=1.0.0
8
+ square_database_helper>=2.0.0
9
+ square_database_structure>=1.0.0
10
+ square_authentication_helper>=2.1.0
@@ -0,0 +1 @@
1
+ square_administration