I'm building simple app on streamlit. I'm struggling with making list of chooses depending on user permissions.
utils.py
Dict with pages:
pages = {
"Start": start_page,
"Test kabli": cable_test_page,
"ARP": arp_page,
"FGRestart": fg_restart_page,
"MACTable": mac_table_page,
"PingGateWAN": ping_gate_wan_page,
"PInterface": psyhical_interface_page,
"RoutingTable": routing_table_page,
"TestŁączaWWAN(LTE)": wan_lte_test_page,
"WanMAC": wan_mac_page,
"TestŁączaWAN": wan_test_page,
"ResetPortów": reset_poe_page,
"RestartSwitcha": switch_restart_page,
}
Function for selecting items from a list
def select_page(ssh):
page = st.selectbox("Select item", tuple(pages.keys()))
pages[page](ssh)
Permissions to each item in a list are made like this:
permissions = {
'cable_diag': ["user1","user2","user3"],
'ping':[ "user1","user2","user3"],
'arp': ["user1","user2","user3"],
'fgrestart':["user1","user2","user3"],
'mactable':["user1","user2","user3"],
'Pinterface':["user1","user2","user3"],
'poe':["user1","user2","user3"],
'routingtable':["user1","user3"],
'srestart':["user1","user2","user3"],
'lte':["user2","user3"],
'wanmac':["user1","user2","user3"],
'wan':["user2","user3"],}
def decorator(func):
#wraps(func)
def wrapper(*args, **kwargs):
if st.session_state["username"] in permissions[module_name]:
print('Accessed')
return func(*args, **kwargs)
else:
st.text('ACCESS DENIED')
return wrapper
return decorator
All file with page have assigned role like this:
#has_role('page_name')
It's working but i want that if user1 don't have permissions to site 'wan' i also want that he will not be able to see this page in the list. I really don't have idea how to solve it
Full utils.py
import streamlit as st
import pandas as pd
import paramiko
from permissions import permissions
from modules.streamlit.pages.cable_test import cable_test_page
from modules.streamlit.pages.arp import arp_page
from modules.streamlit.pages.fg_restart import fg_restart_page
from modules.streamlit.pages.mac_table import mac_table_page
from modules.streamlit.pages.ping_gate_wan import ping_gate_wan_page
from modules.streamlit.pages.psyhical_interface import psyhical_interface_page
from modules.streamlit.pages.routing_table import routing_table_page
from modules.streamlit.pages.switch_restart import switch_restart_page
from modules.streamlit.pages.wan_lte_test import wan_lte_test_page
from modules.streamlit.pages.wan_mac import wan_mac_page
from modules.streamlit.pages.wan_test import wan_test_page
from modules.streamlit.pages.reset_poe import reset_poe_page
from modules.streamlit.pages.start import start_page
from modules.streamlit.pages.test import test_page
pages = {
"Start": start_page,
"Test kabli": cable_test_page,
"ARP": arp_page,
"FGRestart": fg_restart_page,
"MACTable": mac_table_page,
"PingGateWAN": ping_gate_wan_page,
"PInterface": psyhical_interface_page,
"RoutingTable": routing_table_page,
"TestŁączaWWAN(LTE)": wan_lte_test_page,
"WanMAC": wan_mac_page,
"TestŁączaWAN": wan_test_page,
"ResetPortów": reset_poe_page,
"RestartSwitcha": switch_restart_page,
}
custom_options = {"sideBar": False, "enableCellTextSelection": True}
#st.cache
def load_markets_xls():
df = pd.read_excel("path",
index_col=None, engine="openpyxl")
return df
def choose_market(df):
shop_number = st.text_input('Number', '')
if shop_number:
df = df[df["Host_Name"].notna()]
df['Host_Name'] = df['Host_Name'].astype(int).astype(str)
try:
single_row = df.loc[df['Host_Name'] == shop_number].to_dict('records')[0]
ip = single_row['ip']
return ip
except IndexError:
st.text("No found ")
def connect_to_market(ssh,market_ip):
print(market_ip)
try:
ssh.connect(hostname=str(market_ip), port=22, username='user',
password='password', allow_agent=False, timeout=None, compress=False)
st.text('Connected!')
return True
except Exception as e:
st.text('----- ')
return False
def select_page(ssh):
page = st.selectbox("Choose", tuple(pages.keys()))
pages[page](ssh)
Full permissions.py:
from functools import wraps
import streamlit as st
import pandas as pd
import paramiko
permissions = {
'cable_diag': ["user1","user2","user3"],
'ping':[ "user1","user2","user3"],
'arp': ["user1","user2","user3"],
'fgrestart':["user1","user2","user3"],
'mactable':["user1","user2","user3"],
'Pinterface':["user1","user2","user3"],
'poe':["user1","user2","user3"],
'routingtable':["user1","user3"],
'srestart':["user1","user2","user3"],
'lte':["user2","user3"],
'wanmac':["user1","user2","user3"],
'wan':["user2","user3"],}
def has_role(module_name):
def decorator(func):
#wraps(func)
def wrapper(*args, **kwargs):
if st.session_state["username"] in permissions[module_name]:
print('jest dostep')
return func(*args, **kwargs)
else:
st.text('ACCESS DENIED!')
return wrapper
return decorator```
app.py:
import streamlit as st
import pandas as pd
import paramiko
import streamlit_authenticator as stauth
from utils import load_markets_xls, choose_market, connect_to_market, select_page
from cred import hashed_passwords , names, usernames
from PIL import Image
import base64
ssh = paramiko.SSHClient()
# ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
hide_menu_style = """
<style>
#MainMenu {visibility: hidden;}
</style>
"""
custom_options = {"sideBar": False, "enableCellTextSelection": True}
def main():
st.set_page_config(page_title='Market Tests', layout="wide")
st.markdown(hide_menu_style, unsafe_allow_html=True)
authenticator = stauth.Authenticate(names,usernames,hashed_passwords, 'cookie','some_key', cookie_expiry_days=0)
col1, col2, col3 = st.columns(3)
with col1:
st.write(' ')
with col2:
image = Image.open('path')
st.image(image)
with col3:
st.write(' ')
name, authentication_status, username = authenticator.login('Panel Logowania','main')
if authentication_status:
authenticator.logout('Logout', 'main')
data_load_state = st.text('Loading data...')
df = load_markets_xls()
data_load_state.text('Markets loaded!')
market_ip = choose_market(df)
if (market_ip):
if connect_to_market(ssh, market_ip):
select_page(ssh)
elif authentication_status == False:
st.error('Username/password is incorrect')
elif authentication_status == None:
st.warning('Please enter your username and password')
def refresh_data():
st.legacy_caching.clear_cache()
raise st.script_runner.RerunException(st.script_request_queue.RerunData(None))
if __name__ == "__main__":
main()
sample page:
import streamlit as st
from permissions import has_role
custom_options = {
"enableCellTextSelection": True,
"sideBar":True
}
#has_role('arp')
def arp_page(ssh):
st.title('ARP')
stdin, stdout, stderr = ssh.exec_command("get system arp")
for line in iter(stdout.readline, ""):
st.text(line)
I am getting an error while implementing the below code:
'''
from pandas.core.frame import DataFrame
import cx_Oracle
import pandas as pd
import sys
class IFTDataCore:
def __init__(self, accountCode):
i = 0
all_Procedures = []
dns_tns = cx_Oracle.makedsn("gbhenora06vd.corp.amvescap.net", "1525", "INVU")
db=cx_Oracle.connect("CORP-SVC-IFT", "C$Rp$vc1ftUat",dns_tns)
cursor = db.cursor()
cursor.execute("select procedure_name from all_procedures where object_name = 'PK_IVZ_IFT_EXTRACT' ")
rows = cursor.fetchall()
procedureName = ['PK_IVZ_IFT_EXTRACT.'+str(list(rows[indexRow])[0]) for indexRow in range(0,len(list(rows)))]
l_cur = cursor.var(cx_Oracle.CURSOR)
while i < len(procedureName):
if procedureName[i] == 'PK_IVZ_IFT_EXTRACT.SP_IVZ_IFT_EXTRACT_ACCOUNTS':
ret_cursor = cursor.callproc(procedureName[i],(l_cur,))
dfx = pd.DataFrame(ret_cursor[0])
all_Procedures.append(dfx)
else:
ret_cursor = cursor.callproc(procedureName[i],(l_cur,accountCode))
dfx = pd.DataFrame(ret_cursor[0])
all_Procedures.append(dfx)
i += 1
self.all_Procedures = all_Procedures
cursor.close()
db.close()
#property
def getallProcedures(self):
return self.all_Procedures
if __name__ == '__main__':
Procedures = []
all_Proc = IFTDataCore('TOUHI')
Procedures = all_Proc.getallProcedures()
print(Procedures[0])
PS: The code works fine if I do not put the logic in init and call the def logic directly in code. Please let me know the possible reason why when class initialization is done in main, the definition starts throwing error.
The solution works fine now as per the below code:
from pandas.core.frame import DataFrame
import cx_Oracle
import pandas as pd
import sys
import json
from pathlib import Path
import os
class IFTDataCore:
def __init__(self):
try:
db = cx_Oracle.connect('invest/invest#INVD.WORLD')
cursor = db.cursor()
cursor.execute("select procedure_name from all_procedures where object_name = 'PK_IVZ_IFT_EXTRACT' ")
rows = cursor.fetchall()
procedureName = ['PK_IVZ_IFT_EXTRACT.'+str(list(rows[indexRow])[0]) for indexRow in range(0,len(list(rows))-1)]
# To convert Accounts procedure to JSON format
l_cur_Account = cursor.var(cx_Oracle.CURSOR)
ret_cursor_Account = cursor.callproc(procedureName[1],(l_cur_Account,))
self.dfx_Account = pd.DataFrame(ret_cursor_Account[0])
self.dfx_Account.columns = ['fundCode', 'fundName', 'legalEntitiyIdentifier','isin']
result_Account = self.dfx_Account.to_json(orient='records')
except BaseException as e:
raise
def lambda_handler(event, context):
positional_data = IFTDataCore()
df_acct = positional_data.dfx_Account
df_acct=df_acct.fillna("")
Json=df_acct.to_json(orient='records')
lambda_response = __lambda_response__('200', Json)
return lambda_response
def __lambda_response__(status_code, response_body):
return {
'statusCode': status_code,
'headers': {
'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'OPTIONS,GET'
},
'body': response_body
}
I am using Flask app to get info from all daily hours from SQLAlchemy
If SQLAlchemy query.all() doesn't return all hours of the day, because they doesn't exists in the target table, I use a for loop to insert the missing hours before return with jsonfy to the route.
I have a route like this
import os
from flask import Flask, request, jsonify, render_template
from flask_sqlalchemy import SQLAlchemy
import datetime as dt
#app.route("/getall")
def get_all():
try:
ttt = TruckTurnaroundTime.query.filter(TruckTurnaroundTime.hour != None).all()
for i, o in enumerate(ttt):
if i == 0:
if o.hour != dt.time(0, 0):
ttt.insert(i, TruckTurnaroundTime(dt.time(0, 0), None))
old_o = o
continue
current_hour = (dt.datetime.combine(dt.date(1, 1, 1), old_o.hour) + dt.timedelta(hours=1)).time()
if o.hour != current_hour:
ttt.insert(i, TruckTurnaroundTime(current_hour, None))
old_o = o
return jsonify([e.serialize() for e in ttt])
except Exception as e:
return(str(e))
The problem is that when I go to the route (via browser) my computer just simply blocks and never loads the route "/getall"
If I get rid of this lines:
if o.hour != current_hour:
ttt.insert(i, TruckTurnaroundTime(current_hour, None))
the problem dissapears.
I think the problem is something related with dt.datetime.combine() but I don't know.
This is my models.py:
from app import db
class TruckTurnaroundTime(db.Model):
__tablename__ = 'truck_turnaround_time'
id = db.Column(db.Integer, primary_key=True)
hour = db.Column(db.Time())
truck_turnaround_time = db.Column(db.Float)
def __init__(self, hour, truck_turnaround_time):
self.hour = hour
self.truck_turnaround_time = truck_turnaround_time
def __repr__(self):
return '<id {}>'.format(self.id)
def serialize(self):
return {
'hour': str(self.hour),
'truck_turnaround_time': self.truck_turnaround_time
}
EDIT: Python version 3.8.5
This is my flask deployment code i am trying to append the all the values from request from but i am getting this error TypeError: float() argument must be a string or a number, not 'ImmutableMultiDict'
how to append all the values from request from to deploy my model.
I am having trouble in converting string to list of dictionary.
#app.route("/")
#cross_origin()
def home():
return render_template("about.html")
#app.route("/predict", methods = ["GET", "POST"])
#cross_origin()
def predict():
if request.method == 'POST':
# Date_of_Journey
Day= request.form["DAY"]
# Month
Month=request.form["MONTH"]
# Departure time
Dept_time = request.form["DEPARTURE_TIME"]
# Arrival time
Arr_time = request.form["ARRIVAL_TIME"]
# Scheduled time
Sch_time=request.form["SCHEDULED_TIME"]
# Taxi in
taxi_in=request.form["TAXI_IN"]
# Taxi Out
taxi_out=request.form["TAXI_OUT"]
# Arrival_Delay
arr_delay=request.form["ARRIVAL_DELAY"]
# Air System Delay
air_system=request.form["AIR_SYSTEM_DELAY"]
# Airline Delay
airline_delay=request.form["AIRLINE_DELAY"]
#Aircraft Delay
aircraft_delay=request.form["LATE_AIRCRAFT_DELAY"]
# Weather Delay
weather=request.form["WEATHER_DELAY"]
**result=request.form
pkl_file = open('cat', 'rb')
index_dict = pickle.load(pkl_file)
new_vector = np.zeros(len(index_dict))
try:
new_vector[index_dict['ORIGIN_AIRPORT'+str(result['origin'])]] = 1
except:
pass
try:
new_vector[index_dict['DESTINATION_AIRPORT'+str(result['destination'])]] = 1
except:
pass
try:
new_vector[index_dict['AIRLINE'+str(result['airline'])]] = 1
except:
pass**
prediction=Rf.predict([[
Day,
Month,
Dept_time,
Arr_time,
Sch_time, taxi_in,taxi_out,arr_delay,air_system,airline_delay,aircraft_delay,weather,
result
]])
output=round(prediction[0])
return render_template('about.html',prediction_text=" Flight delayed by {} mins".format(output))
return render_template('about.html')
if __name__ == "__main__":
app.run()
I have the following celery task:
#celery.task
def ScrapeWhileTrue():
current_titles = scrape_title()
current_urls = scrape_url()
while(True):
time.sleep(10)
print("completing a test")
current_titles2 = scrape_title()
current_urls2 = scrape_url()
if current_titles != current_titles2:
print("New listings!")
new_titles = set(current_titles2) - set(current_titles)
new_urls = set(current_urls2) - set(current_urls)
# send_mail(new_titles, new_urls)
current_titles = current_titles2
current_urls = current_urls2
Mt HTML contains two buttons, one which sends the data from the form to a different function. The second button I would like to be toggle-able. While its toggled, I would like it to run the above Celery task.
#app.route('/', methods=['GET', 'POST'])
def index():
if request.form['submit'] == 'Send':
#Set info
global url
url = CraiglistScraper(location, postal, max_price, radius, query, carorpart)
flash('Info set')
else:
flash('Scraping')
ScrapeWhileTrue()
return redirect(url_for('index'))
Is it possible to have something like this happen? Or would I need to run it as a Daemon (I have no idea how)?
Thanks!