File size: 12,205 Bytes
518c3a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
import streamlit as st
import pandas as pd
import hashlib
from sqlalchemy import create_engine
from Data import credentials
from streamlit_option_menu import option_menu
import os
from apps import Covid19, Scoring, Comentarios, Tasas, analisis_inmob,\
    Comandos_utiles, simulacion_vc, Mails_Analistas, Panel_de_control,\
    Mom_industrias, admin_portal, Clustering, companies

class MultiApp:
    """Framework for combining multiple streamlit applications.
    Usage:
        def foo():
            st.title("Hello Foo")
        def bar():
            st.title("Hello Bar")
        app = MultiApp()
        app.add_app("Foo", foo)
        app.add_app("Bar", bar)
        app.run()
    It is also possible keep each application in a separate file.
        import foo
        import bar
        app = MultiApp()
        app.add_app("Foo", foo.app)
        app.add_app("Bar", bar.app)
        app.run()
    """

    def __init__(self):
        self.apps = []

    def add_app(self, title, func):
        """Adds a new application.
        Parameters
        ----------
        func:
            the python function to render this app.
        title:
            title of the app. Appears in the dropdown in the sidebar.
        """
        self.apps.append({
            "title": title,
            "function": func
        })

    def run(self):
        if len(self.apps) > 1:
            app = st.selectbox(
                '',
                self.apps,
                format_func=lambda app: app['title'])
            st.session_state['Subvista'] = app['title']
            app['function']()
        else:
            self.apps[0]['function']()


class Auth:
    '''
    Clase generada para el proceso de autenticaci贸n
    esta clase permite el acceso a las distintas vistas del portal a trav茅s de
    la contrase帽a y el usuario
    '''

    def __init__(self):
        self.user = ""
        self.password = ""
        self.state = ""
        self.cargo = ""
        self.mail = ""

    def log_in(self, user, password):
        url = credentials.credentials_postgresql["POSTGRESQL"]
        engine = create_engine(url, echo=False)
        credenciales = pd.read_sql_query("""select * from credenciales""",
                                         con=engine)
        credenciales.columns = ['Usuario', 'Password', 'Area', 'Cargo',
                                'Mail', 'Nombre']
    
        credenciales = credenciales[credenciales["Usuario"] == user]
        if len(credenciales) > 0:
            password_enc = hashlib.sha256(password.encode()).hexdigest()
            passw = credenciales.iloc[0]["Password"]
            if password_enc == passw:
                self.area = credenciales.iloc[0]["Area"]
                self.user = credenciales.iloc[0]["Usuario"]
                self.mail = credenciales.iloc[0]["Mail"]
                self.cargo = credenciales.iloc[0]["Cargo"]
                self.state = password_enc == passw
            elif password == "":
                self.state=""
            else:
                self.state = False


class ViewPortal:
    '''
    Esta clase permite asignar vistas a las distintas areas de LV las vistas
    distintas vistas desarrolladas y asginar distinas funciones a las vistas
    correspondientes
    Para a帽adir una vista se debe agregar una nueva key en dict_app con el
    nombre respectivo a esa vista
    Para agregar una subvista, se debe a帽adir en el value de la key
    correspondiente a la vista a la cual se quiere asignar
    '''

    def __init__(self):
        self.user = ""
        self.area = ""
        self.mail= ""
        dict_area = {"Data Science": ["Home"] + 
                     sorted(["An谩lisis Inmobiliario",
                             "Notas Analistas",
                             "Covid-19", "Macro",
                             "Scoring",
                             "Noticias Equity LATAM",
                             "LarrAI",
                             "Comandos Utiles",
                             "Panel de Control",
                             "Momentum de Industrias",
                             "Admin Portal",
                             "Clustering",
                             "Index Constructor"]),
                     "Equity Latam": ["Home"] +
                     sorted(["Macro",
                             "Noticias Equity LATAM",
                             "Notas Analistas",
                             "Scoring",
                             "Momentum de Industrias",
                             "Clustering",
                             "Index Constructor"]),
                     "Inmobiliario": ["An谩lisis Inmobiliario"],
                     "Proyectos": ["LarrAI", "An谩lisis Inmobiliario"],
                     "Covid": ["Covid-19"],
                     "Directorio": ["Home"] + sorted(["Momentum de Industrias",
                                                      "Clustering",
                                                       "Notas Analistas",
                                                       "Covid-19",
                                                       "Macro",
                                                       "Scoring"])
                     }
        dict_app = {
                    "An谩lisis Inmobiliario": {
                                            "An谩lisis General":
                                            analisis_inmob.run_scrapping,
                                            "An谩lisis Focalizado":
                                            analisis_inmob.scraping_localizado
                                            },
                    "Notas Analistas": {
                                    "Ver Notas": Comentarios.ver_nota,
                                    "Estadisticas": Comentarios.estadisticas,
                                    },
                    "Admin Equity LATAM": {
                                          "Asignar analistas a empresas":
                                          Comentarios.asignar_analista,
                                          'Claves':
                                          Comentarios.save_password
                                          },
                    "Covid-19": {
                                 "Movilidad": Covid19.Movilidad,
                                 "Correlacion_GT": Covid19.Correlacion_GT,
                                 "Vacunacion": Covid19.vacunas
                                 },
                    "Macro":    {
                                 "View Macro": Tasas.view_macro,
                                 "Tasas": Tasas.bonos,
                                 "Pendiente": Tasas.tasa10y_2y,
                                 "Commodities": Tasas.Commodities,
                                 "Indices": Tasas.Indices,
                                 "Divisas": Tasas.Divisas,
                                 "Curva Yield": Tasas.curva_yield
                                 },
                    "Scoring":  {
                                 "General": Scoring.general,
                                 "Diagrama": Scoring.diagrama
                                 },
                    "LarrAI": {
                                        "Explorar data":
                                        simulacion_vc.explorar_data,
                                        "Prototipo simulaci贸n":
                                        simulacion_vc.prototipo_simulacion,
                                        "Simulaci贸n volatilidad en 3 periodos":
                                        simulacion_vc.sim_norm,
                                        "Simulacion volatilidad dinamica":
                                        simulacion_vc.sim_2,
                                        "Simulacion proyectos inmobiliarios":
                                        simulacion_vc.sim_inmob,
                                        "Simulacion ingreso clientes":
                                        simulacion_vc.sim_ingreso_clientes,
                                        "Candidatos":
                                        simulacion_vc.candidatos
                                },
                    "Noticias Equity LATAM": {
                                        "Escribir mail":
                                        Mails_Analistas.escribir_mails2,
                                        "Ver mails":
                                        Mails_Analistas.ver_mails
                            },
                    "Comandos Utiles": {
                        "Comandos Utiles": Comandos_utiles.comandos_utiles
                        },
                    "Panel de Control": {
                        "Panel de Control": Panel_de_control.panel_de_control
                        },
                    "Momentum de Industrias": {
                        "Medias M贸viles": Mom_industrias.medias_moviles,
                        "StN": Mom_industrias.signal_to_noise,
                        "Difusi贸n": Mom_industrias.difusion
                    },
                    "Admin Portal": {
                        "Admin Portal":  admin_portal.logs_portal,
                        "Editar credenciales":  admin_portal.edit_credentials
                        },
                    "Clustering": {
                        "Correlaciones": Clustering.clustering_basado_en_correlacion,
                        "DTW": Clustering.clustering_con_dtw
                        },
                    "Index Constructor":{
                        "Index Constructor": companies.index_constructor
                        }
                    }
        self.dict_apps = dict_app
        self.dict_area = dict_area

    def set_user(self, user, area, mail, cargo):
        self.user = user
        self.area = area
        self.mail = mail
        self.cargo = cargo

    def set_app(self, dict_apps):
        self.dict_apps = dict_apps

    def set_area(self, dict_area):
        self.dict_area = dict_area

    def run_views(self):
        '''
        Con la funci贸n run_views se corren las vistas asginadas al
        usuario respectivo, generando las vistas en la sidebar y las subivistas
        '''
        app = MultiApp()
        menu = self.dict_area[self.area]
        if self.user == "alehmann":
            menu.append("An谩lisis Inmobiliario")
        if self.cargo == "PM" or self.user == 'bull':
            menu.insert(1, "Admin Equity LATAM",)
        
        with st.sidebar:
            rad = option_menu("Navegaci贸n",menu,
                              menu_icon="app-indicator",
                              default_index=0, styles={
            "container": {"margin": "0px",
                          "background-color": "#fafafa"},
            "icon": { "font-size": "10px"},
            "nav-link": {"font-size": "15px",
                         "text-align": "left",
                         "margin":"0px",
                         "--hover-color": "#eee"},
            }
            )
        # rad = st.sidebar.radio("", menu)
        if rad == "Home":
            col1, col2 = st.columns((7, 2))
            col1.subheader("Hola " + self.user + ",")
            col1.title("Bienvenido al Portal LVAM")
        for name in self.dict_area[self.area]:
            if rad == name and rad != "Home":
                st.session_state['Funcion'] = name
                col1, col2 = st.columns((7, 2))
                col1.markdown("""
                    # {Name}
                    """.format(Name=name))
                if rad == "Notas Analistas" and self.cargo == "Investment Analyst":
                    app.add_app("Ingresar nota", Comentarios.ingresar_nota)
                for aplicacion in list(self.dict_apps[name].keys()):
                    dic = self.dict_apps[name]
                    app.add_app(aplicacion, dic[aplicacion])
                # st.write('Para dejar tu feedback accede al siguiente [formulario](https://forms.office.com/Pages/ResponsePage.aspx?id=mpR0wfr-_kmELD83ivOlRhEm1JCbNapEi4UG-t7FamlUM0VNTUU4TFpXNzBQTFM2NEo4RzhWVFk3Si4u)')
                app.run()
                # col2.image("img/logoDSTD.png")