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.
Files changed (125) hide show
  1. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/PKG-INFO +1 -1
  2. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/pyproject.toml +1 -1
  3. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/routes.py +9 -9
  4. iatoolkit-0.20.0/src/iatoolkit/static/styles/landing_page.css +156 -0
  5. iatoolkit-0.20.0/src/iatoolkit/templates/_branding_styles.html +53 -0
  6. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/_login_widget.html +2 -1
  7. iatoolkit-0.20.0/src/iatoolkit/templates/change_password.html +64 -0
  8. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/change_password_view.py +17 -8
  9. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/forgot_password_view.py +1 -1
  10. iatoolkit-0.20.0/src/iatoolkit/views/init_context_view.py +35 -0
  11. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/login_view.py +1 -1
  12. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/verify_user_view.py +6 -6
  13. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/PKG-INFO +1 -1
  14. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/SOURCES.txt +2 -0
  15. iatoolkit-0.19.0/src/iatoolkit/templates/_branding_styles.html +0 -30
  16. iatoolkit-0.19.0/src/iatoolkit/templates/change_password.html +0 -45
  17. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/readme.md +0 -0
  18. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/requirements.txt +0 -0
  19. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/setup.cfg +0 -0
  20. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/__init__.py +0 -0
  21. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/base_company.py +0 -0
  22. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/cli_commands.py +0 -0
  23. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/__init__.py +0 -0
  24. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/auth.py +0 -0
  25. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/exceptions.py +0 -0
  26. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/session_manager.py +0 -0
  27. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/common/util.py +0 -0
  28. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/company_registry.py +0 -0
  29. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/iatoolkit.py +0 -0
  30. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/__init__.py +0 -0
  31. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/call_service.py +0 -0
  32. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/__init__.py +0 -0
  33. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/file_connector.py +0 -0
  34. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/file_connector_factory.py +0 -0
  35. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/google_cloud_storage_connector.py +0 -0
  36. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/google_drive_connector.py +0 -0
  37. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/local_file_connector.py +0 -0
  38. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/connectors/s3_connector.py +0 -0
  39. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/gemini_adapter.py +0 -0
  40. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/google_chat_app.py +0 -0
  41. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/llm_client.py +0 -0
  42. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/llm_proxy.py +0 -0
  43. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/llm_response.py +0 -0
  44. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/mail_app.py +0 -0
  45. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/openai_adapter.py +0 -0
  46. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/infra/redis_session_manager.py +0 -0
  47. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/__init__.py +0 -0
  48. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/database_manager.py +0 -0
  49. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/document_repo.py +0 -0
  50. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/llm_query_repo.py +0 -0
  51. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/models.py +0 -0
  52. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/profile_repo.py +0 -0
  53. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/tasks_repo.py +0 -0
  54. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/repositories/vs_repo.py +0 -0
  55. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/__init__.py +0 -0
  56. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/benchmark_service.py +0 -0
  57. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/branding_service.py +0 -0
  58. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/dispatcher_service.py +0 -0
  59. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/document_service.py +0 -0
  60. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/excel_service.py +0 -0
  61. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/file_processor_service.py +0 -0
  62. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/history_service.py +0 -0
  63. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/jwt_service.py +0 -0
  64. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/load_documents_service.py +0 -0
  65. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/mail_service.py +0 -0
  66. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/onboarding_service.py +0 -0
  67. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/profile_service.py +0 -0
  68. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/prompt_manager_service.py +0 -0
  69. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/query_service.py +0 -0
  70. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/search_service.py +0 -0
  71. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/sql_service.py +0 -0
  72. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/tasks_service.py +0 -0
  73. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/user_feedback_service.py +0 -0
  74. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/services/user_session_context_service.py +0 -0
  75. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/arrow_up.png +0 -0
  76. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/diagrama_iatoolkit.jpg +0 -0
  77. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_clinica.png +0 -0
  78. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_iatoolkit.png +0 -0
  79. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_maxxa.png +0 -0
  80. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_notaria.png +0 -0
  81. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_tarjeta.png +0 -0
  82. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/logo_umayor.png +0 -0
  83. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/images/upload.png +0 -0
  84. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/js/chat_feedback.js +0 -0
  85. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/js/chat_filepond.js +0 -0
  86. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/js/chat_history.js +0 -0
  87. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/js/chat_main.js +0 -0
  88. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/styles/chat_iatoolkit.css +0 -0
  89. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/styles/chat_info.css +0 -0
  90. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/styles/chat_modal.css +0 -0
  91. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/static/styles/llm_output.css +0 -0
  92. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/system_prompts/format_styles.prompt +0 -0
  93. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/system_prompts/query_main.prompt +0 -0
  94. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/system_prompts/sql_rules.prompt +0 -0
  95. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/_navbar.html +0 -0
  96. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/about.html +0 -0
  97. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/base.html +0 -0
  98. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/chat.html +0 -0
  99. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/chat_modals.html +0 -0
  100. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/error.html +0 -0
  101. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/forgot_password.html +0 -0
  102. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/header.html +0 -0
  103. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/home.html +0 -0
  104. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/index.html +0 -0
  105. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/login.html +0 -0
  106. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/onboarding_shell.html +0 -0
  107. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/signup.html +0 -0
  108. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/templates/test.html +0 -0
  109. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/__init__.py +0 -0
  110. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/chat_token_request_view.py +0 -0
  111. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/download_file_view.py +0 -0
  112. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/external_login_view.py +0 -0
  113. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/file_store_view.py +0 -0
  114. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/history_view.py +0 -0
  115. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/home_view.py +0 -0
  116. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/index_view.py +0 -0
  117. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/llmquery_view.py +0 -0
  118. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/prompt_view.py +0 -0
  119. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/signup_view.py +0 -0
  120. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/tasks_review_view.py +0 -0
  121. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/tasks_view.py +0 -0
  122. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit/views/user_feedback_view.py +0 -0
  123. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/dependency_links.txt +0 -0
  124. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/requires.txt +0 -0
  125. {iatoolkit-0.19.0 → iatoolkit-0.20.0}/src/iatoolkit.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.19.0
3
+ Version: 0.20.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "iatoolkit"
7
- version = "0.19.0"
7
+ version = "0.20.0"
8
8
  requires-python = ">=3.11"
9
9
  description = "IAToolkit"
10
10
  readme = "readme.md"
@@ -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
- if company_short_name:
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
- # login testing /login_testing
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>/initiate_external_chat',
50
- view_func=InitiateExternalChatView.as_view('initiate_external_chat'))
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" class="form-control" required>
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, profile_service: ProfileService):
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
- return render_template('login.html',
82
- company_short_name=company_short_name,
83
- company=company,
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, flash, redirect, session
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["error"]), 400
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
- return render_template('login.html',
47
- company=company,
48
- company_short_name=company_short_name,
49
- alert_icon='success',
50
- alert_message=response['message'])
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,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: iatoolkit
3
- Version: 0.19.0
3
+ Version: 0.20.0
4
4
  Summary: IAToolkit
5
5
  Author: Fernando Libedinsky
6
6
  License-Expression: MIT
@@ -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