iatoolkit 0.19.0__tar.gz → 0.20.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.
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/PKG-INFO +1 -1
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/pyproject.toml +1 -1
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/routes.py +9 -9
- iatoolkit-0.20.0/src/iatoolkit/static/styles/landing_page.css +156 -0
- iatoolkit-0.20.0/src/iatoolkit/templates/_branding_styles.html +53 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/_login_widget.html +2 -1
- iatoolkit-0.20.0/src/iatoolkit/templates/change_password.html +64 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/change_password_view.py +17 -8
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/forgot_password_view.py +1 -1
- iatoolkit-0.20.0/src/iatoolkit/views/init_context_view.py +35 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/login_view.py +1 -1
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/verify_user_view.py +6 -6
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/PKG-INFO +1 -1
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/SOURCES.txt +2 -0
- iatoolkit-0.19.0/src/iatoolkit/templates/_branding_styles.html +0 -30
- iatoolkit-0.19.0/src/iatoolkit/templates/change_password.html +0 -45
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/readme.md +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/requirements.txt +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/setup.cfg +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/__init__.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/base_company.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/cli_commands.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/__init__.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/auth.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/exceptions.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/session_manager.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/util.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/company_registry.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/iatoolkit.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/__init__.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/call_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/gemini_adapter.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/llm_client.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/llm_response.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/mail_app.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/openai_adapter.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/__init__.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/database_manager.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/document_repo.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/models.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/tasks_repo.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/__init__.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/benchmark_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/branding_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/document_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/excel_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/file_processor_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/history_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/jwt_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/load_documents_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/mail_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/onboarding_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/profile_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/prompt_manager_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/query_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/search_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/sql_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/tasks_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/arrow_up.png +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_clinica.png +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_iatoolkit.png +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_maxxa.png +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_notaria.png +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_tarjeta.png +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_umayor.png +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/upload.png +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/js/chat_feedback.js +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/js/chat_history.js +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/js/chat_main.js +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/styles/chat_info.css +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/system_prompts/format_styles.prompt +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/system_prompts/query_main.prompt +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/system_prompts/sql_rules.prompt +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/_navbar.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/about.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/base.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/chat.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/chat_modals.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/error.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/forgot_password.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/header.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/home.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/index.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/login.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/signup.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/test.html +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/__init__.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/chat_token_request_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/download_file_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/external_login_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/file_store_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/history_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/home_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/index_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/llmquery_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/prompt_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/signup_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/tasks_review_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/tasks_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/user_feedback_view.py +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/requires.txt +0 -0
- {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
|
@@ -13,16 +13,14 @@ import os
|
|
|
13
13
|
def logout(company_short_name: str):
|
|
14
14
|
SessionManager.clear()
|
|
15
15
|
flash("Has cerrado sesión correctamente", "info")
|
|
16
|
-
|
|
17
|
-
return redirect(url_for('login', company_short_name=company_short_name))
|
|
18
|
-
else:
|
|
19
|
-
return redirect(url_for('home'))
|
|
16
|
+
return redirect(url_for('index', company_short_name=company_short_name))
|
|
20
17
|
|
|
21
18
|
|
|
22
19
|
# this function register all the views
|
|
23
20
|
def register_views(injector, app):
|
|
24
21
|
|
|
25
22
|
from iatoolkit.views.index_view import IndexView
|
|
23
|
+
from iatoolkit.views.init_context_view import InitContextView
|
|
26
24
|
from iatoolkit.views.llmquery_view import LLMQueryView
|
|
27
25
|
from iatoolkit.views.tasks_view import TaskView
|
|
28
26
|
from iatoolkit.views.tasks_review_view import TaskReviewView
|
|
@@ -41,13 +39,12 @@ def register_views(injector, app):
|
|
|
41
39
|
|
|
42
40
|
# landing page
|
|
43
41
|
app.add_url_rule('/<company_short_name>', view_func=IndexView.as_view('index'))
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
app.add_url_rule('/login_testing', view_func=HomeView.as_view('home'))
|
|
42
|
+
app.add_url_rule('/<company_short_name>/initiate_external_chat',
|
|
43
|
+
view_func=InitContextView.as_view('initiate_external_chat'))
|
|
47
44
|
|
|
48
45
|
# login for external portals
|
|
49
|
-
app.add_url_rule('/<company_short_name>/
|
|
50
|
-
view_func=
|
|
46
|
+
app.add_url_rule('/<company_short_name>/<external_user_id>/init-context',
|
|
47
|
+
view_func=InitContextView.as_view('init-context'))
|
|
51
48
|
app.add_url_rule('/<company_short_name>/external_login',
|
|
52
49
|
view_func=ExternalChatLoginView.as_view('external_login'))
|
|
53
50
|
app.add_url_rule('/auth/chat_token',
|
|
@@ -73,6 +70,9 @@ def register_views(injector, app):
|
|
|
73
70
|
app.add_url_rule('/tasks/review/<int:task_id>', view_func=TaskReviewView.as_view('tasks-review'))
|
|
74
71
|
app.add_url_rule('/load', view_func=FileStoreView.as_view('load'))
|
|
75
72
|
|
|
73
|
+
# login testing /login_testing
|
|
74
|
+
app.add_url_rule('/login_testing', view_func=HomeView.as_view('home'))
|
|
75
|
+
|
|
76
76
|
app.add_url_rule(
|
|
77
77
|
'/about', # URL de la ruta
|
|
78
78
|
view_func=lambda: render_template('about.html'))
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/* static/styles/landing_page.css */
|
|
2
|
+
|
|
3
|
+
/* --- Configuración General --- */
|
|
4
|
+
body {
|
|
5
|
+
background-color: #ffffff; /* Cambiado a blanco para que el hero destaque */
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/* --- 1. Barra de Navegación Superior --- */
|
|
9
|
+
.landing-navbar {
|
|
10
|
+
background-color: var(--brand-primary-color, #0d6efd);
|
|
11
|
+
padding: 1rem 1.5rem;
|
|
12
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.landing-navbar .navbar-brand {
|
|
16
|
+
color: var(--brand-text-on-primary, #FFFFFF);
|
|
17
|
+
font-weight: 700;
|
|
18
|
+
font-size: 1.8rem; /* Aumentado el tamaño del texto */
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* --- 2. Sección Principal (Hero) --- */
|
|
22
|
+
.hero-section {
|
|
23
|
+
padding: 5rem 0; /* <-- ESTA LÍNEA RESTAURA EL ESPACIADO SUPERIOR E INFERIOR */
|
|
24
|
+
background-color: #f8f9fa; /* Fondo gris claro para la sección principal */
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* Estilos para el texto de la propuesta de valor */
|
|
28
|
+
.value-proposition {
|
|
29
|
+
display: flex;
|
|
30
|
+
flex-direction: column;
|
|
31
|
+
justify-content: center;
|
|
32
|
+
height: 100%;
|
|
33
|
+
/* Se ajusta el padding para la nueva posición a la izquierda */
|
|
34
|
+
padding-left: 2rem;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.value-proposition .hero-title {
|
|
38
|
+
font-size: 2.8rem;
|
|
39
|
+
font-weight: 700;
|
|
40
|
+
line-height: 1.2;
|
|
41
|
+
color: #212529;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.value-proposition .hero-accelerator {
|
|
45
|
+
color: var(--brand-primary-color, #0d6efd);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.value-proposition .hero-subtitle {
|
|
49
|
+
font-size: 1.1rem;
|
|
50
|
+
color: #6c757d;
|
|
51
|
+
margin-top: 1.5rem;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* --- Estilo para el título del widget de login --- */
|
|
55
|
+
.hero-section .bg-light h4 {
|
|
56
|
+
color: var(--brand-primary-color, #0d6efd);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* --- Estilo para el texto introductorio del widget --- */
|
|
60
|
+
.widget-intro-text {
|
|
61
|
+
font-style: italic;
|
|
62
|
+
font-size: 0.9rem;
|
|
63
|
+
line-height: 1.4;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
/* --- 3. Sección de Características --- */
|
|
68
|
+
.features-section {
|
|
69
|
+
padding: 5rem 0;
|
|
70
|
+
background-color: #ffffff; /* Fondo blanco para esta sección */
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* (El resto del archivo CSS permanece sin cambios) */
|
|
74
|
+
.feature-item {
|
|
75
|
+
text-align: center;
|
|
76
|
+
padding: 2rem;
|
|
77
|
+
background-color: #f8f9fa; /* Fondo gris claro para cada tarjeta */
|
|
78
|
+
border: 1px solid #dee2e6;
|
|
79
|
+
border-radius: 0.5rem;
|
|
80
|
+
height: 100%; /* CLAVE: Asegura que todas las tarjetas en una fila tengan el mismo alto */
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.feature-icon {
|
|
84
|
+
font-size: 3rem;
|
|
85
|
+
color: var(--brand-primary-color); /* Usar color primario para más impacto */
|
|
86
|
+
margin-bottom: 1.5rem;
|
|
87
|
+
display: inline-block;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.feature-item h3 {
|
|
91
|
+
font-size: 1.4rem;
|
|
92
|
+
font-weight: 600;
|
|
93
|
+
margin-bottom: 1rem;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.feature-item p {
|
|
97
|
+
color: #6c757d;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.opensource-box {
|
|
101
|
+
background-color: #343a40;
|
|
102
|
+
color: #f8f9fa;
|
|
103
|
+
padding: 2rem;
|
|
104
|
+
border-radius: 0.5rem;
|
|
105
|
+
height: 100%; /* CLAVE: Asegura que tenga el mismo alto */
|
|
106
|
+
display: flex;
|
|
107
|
+
flex-direction: column;
|
|
108
|
+
justify-content: space-between;
|
|
109
|
+
text-align: center;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.opensource-icon {
|
|
113
|
+
font-size: 3rem; /* Tamaño consistente con los otros iconos */
|
|
114
|
+
color: var(--brand-text-on-primary, #FFFFFF);
|
|
115
|
+
opacity: 0.9;
|
|
116
|
+
margin-bottom: 1.5rem;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.opensource-content h3 {
|
|
120
|
+
font-weight: 600;
|
|
121
|
+
font-size: 1.4rem; /* Tamaño consistente */
|
|
122
|
+
margin-bottom: 1rem;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.opensource-content p {
|
|
126
|
+
margin-bottom: 1.5rem;
|
|
127
|
+
color: #adb5bd;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
.opensource-content .btn {
|
|
131
|
+
width: 100%;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.pypi-link {
|
|
135
|
+
margin-top: 1.5rem;
|
|
136
|
+
padding-top: 1.5rem;
|
|
137
|
+
border-top: 1px solid #495057;
|
|
138
|
+
font-size: 0.9rem;
|
|
139
|
+
color: #ced4da;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.pypi-link code {
|
|
143
|
+
background-color: #212529;
|
|
144
|
+
padding: 0.2rem 0.5rem;
|
|
145
|
+
border-radius: 4px;
|
|
146
|
+
color: #e83e8c;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* --- 4. Footer --- */
|
|
150
|
+
.landing-footer {
|
|
151
|
+
background-color: #343a40;
|
|
152
|
+
color: #adb5bd;
|
|
153
|
+
padding: 2rem 0;
|
|
154
|
+
text-align: center;
|
|
155
|
+
font-size: 0.9rem;
|
|
156
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<!-- templates/_branding_styles.html -->
|
|
2
|
+
<style>
|
|
3
|
+
{{ branding.css_variables | safe }}
|
|
4
|
+
|
|
5
|
+
/* Clases de botón reutilizables basadas en el branding */
|
|
6
|
+
.btn-branded-primary {
|
|
7
|
+
background-color: var(--brand-primary-color);
|
|
8
|
+
color: var(--brand-text-on-primary);
|
|
9
|
+
border-color: var(--brand-primary-color);
|
|
10
|
+
transition: all 0.2s ease-in-out;
|
|
11
|
+
}
|
|
12
|
+
.btn-branded-primary:hover {
|
|
13
|
+
color: var(--brand-text-on-primary);
|
|
14
|
+
box-shadow: inset 0 0 0 200px rgba(0, 0, 0, 0.15);
|
|
15
|
+
}
|
|
16
|
+
.btn-branded-secondary {
|
|
17
|
+
background-color: var(--brand-secondary-color);
|
|
18
|
+
color: var(--brand-text-on-secondary);
|
|
19
|
+
border-color: var(--brand-secondary-color);
|
|
20
|
+
transition: all 0.2s ease-in-out;
|
|
21
|
+
}
|
|
22
|
+
.btn-branded-secondary:hover {
|
|
23
|
+
color: var(--brand-text-on-secondary);
|
|
24
|
+
box-shadow: inset 0 0 0 200px rgba(0, 0, 0, 0.15);
|
|
25
|
+
}
|
|
26
|
+
.form-title {
|
|
27
|
+
color: var(--brand-primary-color);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/* --- ESTILOS CORREGIDOS Y MÁS ESPECÍFICOS PARA SWEETALERT2 --- */
|
|
31
|
+
|
|
32
|
+
/* Botón de Confirmar (OK) */
|
|
33
|
+
.swal2-confirm.custom-confirm-button {
|
|
34
|
+
background-color: var(--brand-primary-color) !important;
|
|
35
|
+
color: var(--brand-text-on-primary) !important;
|
|
36
|
+
border: 1px solid var(--brand-primary-color) !important;
|
|
37
|
+
box-shadow: none !important;
|
|
38
|
+
}
|
|
39
|
+
.swal2-confirm.custom-confirm-button:hover {
|
|
40
|
+
box-shadow: inset 0 0 0 200px rgba(0, 0, 0, 0.15) !important;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Botón de Cancelar */
|
|
44
|
+
.swal2-cancel.custom-cancel-button {
|
|
45
|
+
background-color: var(--brand-secondary-color) !important;
|
|
46
|
+
color: var(--brand-text-on-secondary) !important;
|
|
47
|
+
border: 1px solid var(--brand-secondary-color) !important;
|
|
48
|
+
box-shadow: none !important;
|
|
49
|
+
}
|
|
50
|
+
.swal2-cancel.custom-cancel-button:hover {
|
|
51
|
+
box-shadow: inset 0 0 0 200px rgba(0, 0, 0, 0.15) !important;
|
|
52
|
+
}
|
|
53
|
+
</style>
|
|
@@ -19,7 +19,8 @@
|
|
|
19
19
|
</div>
|
|
20
20
|
<div class="mb-3">
|
|
21
21
|
<label for="password" class="form-label d-block text-muted">Contraseña</label>
|
|
22
|
-
<input type="password" id="password" name="password"
|
|
22
|
+
<input type="password" id="password" name="password"
|
|
23
|
+
class="form-control" required>
|
|
23
24
|
</div>
|
|
24
25
|
<button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2">
|
|
25
26
|
Ingresar
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{% extends "base.html" %}
|
|
2
|
+
|
|
3
|
+
{% block title %}Cambiar Contraseña - {{ company.name }}{% endblock %}
|
|
4
|
+
|
|
5
|
+
{% block content %}
|
|
6
|
+
<!-- 1. Incluimos los estilos de branding reutilizables -->
|
|
7
|
+
{% include '_branding_styles.html' %}
|
|
8
|
+
|
|
9
|
+
<!-- Enlazamos la hoja de estilos de la landing page para reutilizar estilos -->
|
|
10
|
+
<link rel="stylesheet" href="{{ iatoolkit_base_url }}/static/styles/landing_page.css">
|
|
11
|
+
|
|
12
|
+
<!-- 2. Incluimos la barra de navegación reutilizable -->
|
|
13
|
+
{% include '_navbar.html' %}
|
|
14
|
+
|
|
15
|
+
<!-- 3. Sección contenedora para centrar el contenido -->
|
|
16
|
+
<section class="hero-section">
|
|
17
|
+
<div class="container">
|
|
18
|
+
<div class="row justify-content-center">
|
|
19
|
+
<div class="col-lg-6 col-md-8">
|
|
20
|
+
<div class="border rounded p-4 p-md-5 shadow-sm bg-light">
|
|
21
|
+
<h4 class="form-title fw-bold mb-3 text-center">Crear Nueva Contraseña</h4>
|
|
22
|
+
|
|
23
|
+
<p class="text-muted text-center mb-4">
|
|
24
|
+
Estás cambiando la contraseña para <strong>{{ email }}</strong>.
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
<form action="{{ url_for('change_password', company_short_name=company_short_name, token=token) }}" method="post">
|
|
28
|
+
|
|
29
|
+
<!-- CAMPO RESTAURADO: Código Temporal -->
|
|
30
|
+
<div class="mb-3">
|
|
31
|
+
<label for="temp_code" class="form-label text-secondary">Código Temporal</label>
|
|
32
|
+
<input type="text" id="temp_code" name="temp_code" class="form-control"
|
|
33
|
+
required value="{{ form_data.temp_code if form_data else '' }}"
|
|
34
|
+
placeholder="Revisa tu correo electrónico">
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<div class="mb-3">
|
|
38
|
+
<label for="new_password" class="form-label text-secondary">Nueva Contraseña</label>
|
|
39
|
+
<input type="password" id="new_password" name="new_password" class="form-control" required>
|
|
40
|
+
<div class="d-flex align-items-start text-muted mt-2" style="font-size: 0.8rem;">
|
|
41
|
+
<i class="bi bi-info-circle me-2" style="font-size: 0.9rem; line-height: 1.4;"></i>
|
|
42
|
+
<span>Debe contener al menos 8 caracteres, mayúscula, minúscula, número y un carácter especial.</span>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div class="mb-3">
|
|
47
|
+
<label for="confirm_password" class="form-label text-secondary">Confirmar Nueva Contraseña</label>
|
|
48
|
+
<input type="password" id="confirm_password" name="confirm_password" class="form-control" required>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
<button type="submit" class="btn btn-branded-primary w-100 fw-bold py-2 mt-3">Guardar Contraseña</button>
|
|
52
|
+
</form>
|
|
53
|
+
|
|
54
|
+
<div class="text-center mt-4 pt-3" style="border-top: 1px solid #e0e0e0;">
|
|
55
|
+
<a href="{{ url_for('index', company_short_name=company_short_name) }}" class="text-muted text-decoration-none fw-semibold">
|
|
56
|
+
<i class="bi bi-arrow-left me-1"></i>Volver al inicio
|
|
57
|
+
</a>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</section>
|
|
64
|
+
{% endblock %}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
# IAToolkit is open source software.
|
|
5
5
|
|
|
6
6
|
from flask.views import MethodView
|
|
7
|
-
from flask import render_template, request
|
|
7
|
+
from flask import render_template, request, url_for, session, redirect
|
|
8
8
|
from iatoolkit.services.profile_service import ProfileService
|
|
9
|
+
from iatoolkit.services.branding_service import BrandingService
|
|
9
10
|
from itsdangerous import URLSafeTimedSerializer, SignatureExpired
|
|
10
11
|
from flask_bcrypt import Bcrypt
|
|
11
12
|
from injector import inject
|
|
@@ -14,8 +15,11 @@ import os
|
|
|
14
15
|
|
|
15
16
|
class ChangePasswordView(MethodView):
|
|
16
17
|
@inject
|
|
17
|
-
def __init__(self,
|
|
18
|
+
def __init__(self,
|
|
19
|
+
profile_service: ProfileService,
|
|
20
|
+
branding_service: BrandingService):
|
|
18
21
|
self.profile_service = profile_service
|
|
22
|
+
self.branding_service = branding_service # 3. Guardar la instancia
|
|
19
23
|
|
|
20
24
|
self.serializer = URLSafeTimedSerializer(os.getenv("PASS_RESET_KEY"))
|
|
21
25
|
self.bcrypt = Bcrypt()
|
|
@@ -26,16 +30,20 @@ class ChangePasswordView(MethodView):
|
|
|
26
30
|
if not company:
|
|
27
31
|
return render_template('error.html', message=f"Empresa no encontrada: {company_short_name}"), 404
|
|
28
32
|
|
|
33
|
+
branding_data = self.branding_service.get_company_branding(company)
|
|
34
|
+
|
|
29
35
|
try:
|
|
30
36
|
# Decodificar el token
|
|
31
37
|
email = self.serializer.loads(token, salt='password-reset', max_age=3600)
|
|
32
38
|
except SignatureExpired as e:
|
|
33
39
|
return render_template('forgot_password.html',
|
|
40
|
+
branding=branding_data,
|
|
34
41
|
alert_message="El enlace de cambio de contraseña ha expirado. Por favor, solicita uno nuevo.")
|
|
35
42
|
|
|
36
43
|
return render_template('change_password.html',
|
|
37
44
|
company_short_name=company_short_name,
|
|
38
45
|
company=company,
|
|
46
|
+
branding=branding_data,
|
|
39
47
|
token=token, email=email)
|
|
40
48
|
|
|
41
49
|
def post(self, company_short_name: str, token: str):
|
|
@@ -44,6 +52,7 @@ class ChangePasswordView(MethodView):
|
|
|
44
52
|
if not company:
|
|
45
53
|
return render_template('error.html', message=f"Empresa no encontrada: {company_short_name}"), 404
|
|
46
54
|
|
|
55
|
+
branding_data = self.branding_service.get_company_branding(company)
|
|
47
56
|
try:
|
|
48
57
|
# Decodificar el token
|
|
49
58
|
email = self.serializer.loads(token, salt='password-reset', max_age=3600)
|
|
@@ -51,6 +60,7 @@ class ChangePasswordView(MethodView):
|
|
|
51
60
|
return render_template('forgot_password.html',
|
|
52
61
|
company_short_name=company_short_name,
|
|
53
62
|
company=company,
|
|
63
|
+
branding=branding_data,
|
|
54
64
|
alert_message="El enlace de cambio de contraseña ha expirado. Por favor, solicita uno nuevo.")
|
|
55
65
|
|
|
56
66
|
try:
|
|
@@ -72,17 +82,16 @@ class ChangePasswordView(MethodView):
|
|
|
72
82
|
token=token,
|
|
73
83
|
company_short_name=company_short_name,
|
|
74
84
|
company=company,
|
|
85
|
+
branding=branding_data,
|
|
75
86
|
form_data={"temp_code": temp_code,
|
|
76
87
|
"new_password": new_password,
|
|
77
88
|
"confirm_password": confirm_password},
|
|
78
89
|
alert_message=response["error"]), 400
|
|
79
90
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
alert_icon='success',
|
|
85
|
-
alert_message="Tu contraseña ha sido restablecida exitosamente. Ahora puedes iniciar sesión.")
|
|
91
|
+
# Éxito: Guardar mensaje en sesión y redirigir
|
|
92
|
+
session['alert_message'] = "Tu contraseña ha sido restablecida exitosamente. Ahora puedes iniciar sesión."
|
|
93
|
+
session['alert_icon'] = 'success'
|
|
94
|
+
return redirect(url_for('index', company_short_name=company_short_name))
|
|
86
95
|
|
|
87
96
|
except Exception as e:
|
|
88
97
|
return render_template("error.html",
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# IAToolkit is open source software.
|
|
5
5
|
|
|
6
6
|
from flask.views import MethodView
|
|
7
|
-
from flask import render_template, request, url_for,
|
|
7
|
+
from flask import render_template, request, url_for, redirect, session
|
|
8
8
|
from injector import inject
|
|
9
9
|
from iatoolkit.services.profile_service import ProfileService
|
|
10
10
|
from iatoolkit.services.branding_service import BrandingService
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
from flask.views import MethodView
|
|
2
|
+
from injector import inject
|
|
3
|
+
from iatoolkit.common.auth import IAuthentication
|
|
4
|
+
from iatoolkit.services.query_service import QueryService
|
|
5
|
+
from flask import jsonify
|
|
6
|
+
import logging
|
|
7
|
+
|
|
8
|
+
class InitContextView(MethodView):
|
|
9
|
+
|
|
10
|
+
@inject
|
|
11
|
+
def __init__(self,
|
|
12
|
+
iauthentication: IAuthentication,
|
|
13
|
+
query_service: QueryService
|
|
14
|
+
):
|
|
15
|
+
self.iauthentication = iauthentication
|
|
16
|
+
self.query_service = query_service
|
|
17
|
+
|
|
18
|
+
def get(self, company_short_name: str, external_user_id: str):
|
|
19
|
+
# 1. get access credentials
|
|
20
|
+
iaut = self.iauthentication.verify(company_short_name, external_user_id)
|
|
21
|
+
if not iaut.get("success"):
|
|
22
|
+
return jsonify(iaut), 401
|
|
23
|
+
|
|
24
|
+
try:
|
|
25
|
+
# initialize the context
|
|
26
|
+
self.query_service.llm_init_context(
|
|
27
|
+
company_short_name=company_short_name,
|
|
28
|
+
external_user_id=external_user_id
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
return {'status': 'OK'}, 200
|
|
32
|
+
except Exception as e:
|
|
33
|
+
logging.exception(
|
|
34
|
+
f"Error inesperado al inicializar el contexto durante el login para company {company_short_name}: {e}")
|
|
35
|
+
return jsonify({"error_message": str(e)}), 500
|
|
@@ -55,7 +55,7 @@ class InitiateLoginView(MethodView):
|
|
|
55
55
|
"email": email,
|
|
56
56
|
"password": password,
|
|
57
57
|
},
|
|
58
|
-
alert_message=response["
|
|
58
|
+
alert_message=response["message"]), 400
|
|
59
59
|
|
|
60
60
|
# 2. Get branding and onboarding data for the shell page
|
|
61
61
|
branding_data = self.branding_service.get_company_branding(company)
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# IAToolkit is open source software.
|
|
5
5
|
|
|
6
6
|
from flask.views import MethodView
|
|
7
|
-
from flask import render_template
|
|
7
|
+
from flask import render_template, url_for, redirect, session
|
|
8
8
|
from iatoolkit.services.profile_service import ProfileService
|
|
9
9
|
from itsdangerous import URLSafeTimedSerializer, SignatureExpired
|
|
10
10
|
from injector import inject
|
|
@@ -43,11 +43,11 @@ class VerifyAccountView(MethodView):
|
|
|
43
43
|
token=token,
|
|
44
44
|
alert_message=response["error"]), 400
|
|
45
45
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
46
|
+
# Guardamos el mensaje y el icono en la sesión manualmente
|
|
47
|
+
session['alert_message'] = response['message']
|
|
48
|
+
session['alert_icon'] = "success"
|
|
49
|
+
return redirect(url_for('index', company_short_name=company_short_name))
|
|
50
|
+
|
|
51
51
|
except Exception as e:
|
|
52
52
|
return render_template("error.html",
|
|
53
53
|
company=company,
|
|
@@ -78,6 +78,7 @@ src/iatoolkit/static/js/chat_main.js
|
|
|
78
78
|
src/iatoolkit/static/styles/chat_iatoolkit.css
|
|
79
79
|
src/iatoolkit/static/styles/chat_info.css
|
|
80
80
|
src/iatoolkit/static/styles/chat_modal.css
|
|
81
|
+
src/iatoolkit/static/styles/landing_page.css
|
|
81
82
|
src/iatoolkit/static/styles/llm_output.css
|
|
82
83
|
src/iatoolkit/system_prompts/format_styles.prompt
|
|
83
84
|
src/iatoolkit/system_prompts/query_main.prompt
|
|
@@ -109,6 +110,7 @@ src/iatoolkit/views/forgot_password_view.py
|
|
|
109
110
|
src/iatoolkit/views/history_view.py
|
|
110
111
|
src/iatoolkit/views/home_view.py
|
|
111
112
|
src/iatoolkit/views/index_view.py
|
|
113
|
+
src/iatoolkit/views/init_context_view.py
|
|
112
114
|
src/iatoolkit/views/llmquery_view.py
|
|
113
115
|
src/iatoolkit/views/login_view.py
|
|
114
116
|
src/iatoolkit/views/prompt_view.py
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<style>
|
|
2
|
-
{{ branding.css_variables | safe }}
|
|
3
|
-
|
|
4
|
-
/* Clases de botón reutilizables basadas en el branding */
|
|
5
|
-
.btn-branded-primary {
|
|
6
|
-
background-color: var(--brand-primary-color);
|
|
7
|
-
color: var(--brand-text-on-primary);
|
|
8
|
-
border-color: var(--brand-primary-color);
|
|
9
|
-
transition: all 0.2s ease-in-out;
|
|
10
|
-
}
|
|
11
|
-
.btn-branded-primary:hover {
|
|
12
|
-
background-color: #e9ecef;
|
|
13
|
-
color: var(--brand-primary-color);
|
|
14
|
-
border-color: var(--brand-primary-color);
|
|
15
|
-
}
|
|
16
|
-
.btn-branded-secondary {
|
|
17
|
-
background-color: var(--brand-secondary-color);
|
|
18
|
-
color: var(--brand-text-on-secondary);
|
|
19
|
-
border-color: var(--brand-secondary-color);
|
|
20
|
-
transition: all 0.2s ease-in-out;
|
|
21
|
-
}
|
|
22
|
-
.btn-branded-secondary:hover {
|
|
23
|
-
background-color: #e9ecef;
|
|
24
|
-
color: var(--brand-secondary-color);
|
|
25
|
-
border-color: var(--brand-secondary-color);
|
|
26
|
-
}
|
|
27
|
-
.form-title {
|
|
28
|
-
color: var(--brand-primary-color);
|
|
29
|
-
}
|
|
30
|
-
</style>
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
{% extends "base.html" %}
|
|
2
|
-
|
|
3
|
-
{% block title %}Cambiar Contraseña{% endblock %}
|
|
4
|
-
|
|
5
|
-
{% block content %}
|
|
6
|
-
<div class="container vh-100 d-flex justify-content-center align-items-center">
|
|
7
|
-
<div class="col-11 col-md-8 col-lg-5 border rounded p-3 shadow-sm">
|
|
8
|
-
<h4 class="text-muted fw-semibold text-start mb-3">Cambiar Contraseña</h4>
|
|
9
|
-
<h6 class="text-muted text-start mb-4">{{ email }}</h6>
|
|
10
|
-
|
|
11
|
-
<form action="{{ url_for('change_password', company_short_name=company_short_name, token=token) }}" method="post">
|
|
12
|
-
<div class="mb-3">
|
|
13
|
-
<label for="temp_code" class="form-label text-muted">Código Temporal recibido</label>
|
|
14
|
-
<input type="text" name="temp_code" id="temp_code"
|
|
15
|
-
class="form-control text-muted" required
|
|
16
|
-
autocomplete="off"
|
|
17
|
-
value="{{ form_data.temp_code if form_data else '' }}">
|
|
18
|
-
</div>
|
|
19
|
-
<div class="mb-3">
|
|
20
|
-
<label for="new_password" class="form-label text-muted">Nueva Contraseña</label>
|
|
21
|
-
<input type="password" name="new_password" id="new_password"
|
|
22
|
-
class="form-control text-muted" required
|
|
23
|
-
value="{{ form_data.new_password if form_data else '' }}">
|
|
24
|
-
<small class="form-text text-muted">
|
|
25
|
-
La contraseña debe contener al menos 8 caracteres, una letra mayúscula, una letra minúscula, un número y un carácter especial.
|
|
26
|
-
</small>
|
|
27
|
-
|
|
28
|
-
</div>
|
|
29
|
-
<div class="mb-3">
|
|
30
|
-
<label for="confirm_password" class="form-label text-muted">Confirmar Nueva Contraseña</label>
|
|
31
|
-
<input type="password" name="confirm_password" id="confirm_password"
|
|
32
|
-
class="form-control text-muted" required
|
|
33
|
-
value="{{ form_data.password if form_data else '' }}">
|
|
34
|
-
</div>
|
|
35
|
-
<button type="submit" class="btn btn-primary w-100">Cambiar Contraseña</button>
|
|
36
|
-
|
|
37
|
-
<p class="text-muted text-start mt-3" style="text-align: justify;">
|
|
38
|
-
Ingresa el código de seguridad que recibiste por correo y elige una nueva contraseña.
|
|
39
|
-
Asegúrate de que sea segura y fácil de recordar.
|
|
40
|
-
</p>
|
|
41
|
-
|
|
42
|
-
</form>
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
{% endblock %}
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/file_connector_factory.py
RENAMED
|
File without changes
|
|
File without changes
|
{iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/google_drive_connector.py
RENAMED
|
File without changes
|
{iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/local_file_connector.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
|
|
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
|
|
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
|
{iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/user_session_context_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
|
|
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
|
|
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
|
|
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
|