@@ -1210,17 +1210,25 @@ def list_leases() -> List[Lease]:
12101210
12111211 return leases
12121212
1213+
12131214def _status_color (cell ):
1214- return "#a2d9fe" if cell .value == "2-ACTIVE" else (
1215- "#ffe599" if cell .value == "1-PENDING" else (
1216- "#f69084" if cell .value == "3-TERMINATED" else "#e0e0e0" ))
1217-
1215+ return (
1216+ "#a2d9fe"
1217+ if cell .value == "2-ACTIVE"
1218+ else (
1219+ "#ffe599"
1220+ if cell .value == "1-PENDING"
1221+ else ("#f69084" if cell .value == "3-TERMINATED" else "#e0e0e0" )
1222+ )
1223+ )
1224+
1225+
12181226def show_leases () -> DataGrid :
12191227 """
12201228 Displays a table of the user's leases in an interactive, sortable format.
12211229
12221230 Uses an ipydatagrid to present key lease attributes such as ID, name, status,
1223- duration, and reservation counts. The grid supports sorting, filtering, and
1231+ duration, and reservation counts. The grid supports sorting, filtering, and
12241232 scrolling for easy exploration of lease state.
12251233
12261234 Returns:
@@ -1233,95 +1241,106 @@ def estimate_column_width(df, column, char_px=7, padding=0):
12331241 max_chars = df [column ].astype (str ).map (len ).max ()
12341242 return max (max_chars * char_px + padding , 80 )
12351243
1236-
12371244 leases = list_leases ()
12381245
12391246 rows = []
12401247 for lease in leases :
1241-
12421248 try :
12431249 project_name = get_project_name (lease .project_id )
12441250 except ResourceError :
12451251 project_name = lease .project_id [:8 ] if lease .project_id else "Unknown"
1246-
1252+
12471253 if lease .user_id == connection ().current_user_id :
12481254 user_label = os .getenv ("OS_USERNAME" )
12491255 else :
12501256 user_label = lease .user_id if lease .user_id else "Unknown"
1251-
1257+
12521258 if lease .start_date and lease .end_date :
1253- duration_hrs = round ((lease .end_date - lease .start_date ).total_seconds () / 3600 , 1 )
1259+ duration_hrs = round (
1260+ (lease .end_date - lease .start_date ).total_seconds () / 3600 , 1
1261+ )
12541262 else :
12551263 duration_hrs = "N/A"
1256-
1264+
12571265 # Inside your row-building loop:
12581266 if lease .end_date and lease .end_date > datetime .now ():
12591267 remaining_td = lease .end_date - datetime .now ()
1260- remaining_str = f"{ remaining_td .days :02d} d { (remaining_td .seconds // 3600 ):02d} h"
1268+ remaining_str = (
1269+ f"{ remaining_td .days :02d} d { (remaining_td .seconds // 3600 ):02d} h"
1270+ )
12611271 elif lease .end_date and lease .end_date <= datetime .now ():
12621272 remaining_str = "Expired"
12631273 else :
12641274 remaining_str = "N/A"
12651275
1266-
12671276 # prepending status with numeric makes it possible to character sort
12681277 # since ipydatagrid does not allow custom sort functions
12691278 status_order = {
12701279 "PENDING" : "1-PENDING" ,
12711280 "ACTIVE" : "2-ACTIVE" ,
1272- "TERMINATED" : "3-TERMINATED"
1281+ "TERMINATED" : "3-TERMINATED" ,
12731282 }
1274-
1275- rows .append ({
1276- "Name" : lease .name ,
1277- "Status" : status_order .get (lease .status , f"4-{ lease .status } " ),
1278- "User" : user_label ,
1279- "Project" : project_name ,
1280- "Start" : lease .start_date .strftime ("%Y-%m-%d %H:%M" ) if lease .start_date else "" ,
1281- "End" : lease .end_date .strftime ("%Y-%m-%d %H:%M" ) if lease .end_date else "" ,
1282- "Remaining" : remaining_str ,
1283- "Total Hours" : duration_hrs ,
1284- "# Nodes" : len (lease .node_reservations ),
1285- "# FIPs" : len (lease .fip_reservations ),
1286- "Created" : lease .created_at .strftime ("%Y-%m-%d %H:%M" ) if lease .created_at else "" ,
1287- "Lease ID" : lease .id ,
1288- "_is_user_lease" : 0 if lease .user_id == connection ().current_user_id else 1
1289- })
1290-
1283+
1284+ rows .append (
1285+ {
1286+ "Name" : lease .name ,
1287+ "Status" : status_order .get (lease .status , f"4-{ lease .status } " ),
1288+ "User" : user_label ,
1289+ "Project" : project_name ,
1290+ "Start" : lease .start_date .strftime ("%Y-%m-%d %H:%M" )
1291+ if lease .start_date
1292+ else "" ,
1293+ "End" : lease .end_date .strftime ("%Y-%m-%d %H:%M" )
1294+ if lease .end_date
1295+ else "" ,
1296+ "Remaining" : remaining_str ,
1297+ "Total Hours" : duration_hrs ,
1298+ "# Nodes" : len (lease .node_reservations ),
1299+ "# FIPs" : len (lease .fip_reservations ),
1300+ "Created" : lease .created_at .strftime ("%Y-%m-%d %H:%M" )
1301+ if lease .created_at
1302+ else "" ,
1303+ "Lease ID" : lease .id ,
1304+ "_is_user_lease" : 0
1305+ if lease .user_id == connection ().current_user_id
1306+ else 1 ,
1307+ }
1308+ )
1309+
12911310 df = pandas .DataFrame (rows )
12921311 df = pandas .DataFrame (rows )
12931312 df = df .sort_values (by = ["_is_user_lease" , "Status" , "Created" ])
12941313 df = df .drop (columns = ["_is_user_lease" ])
12951314
12961315 renderers = {
1297- "Status" : TextRenderer (
1298- background_color = Expr (_status_color ),
1299- text_color = "black" ,
1300- ),
1301-
1316+ "Status" : TextRenderer (
1317+ background_color = Expr (_status_color ),
1318+ text_color = "black" ,
1319+ ),
13021320 }
13031321
1304- display (DataGrid (
1305- df ,
1306- layout = {"height" : "400px" , "width" : "100%" },
1307- column_widths = {
1308- "key" : 30 ,
1309- "Name" : int (estimate_column_width (df , "Name" )),
1310- "Status" : 120 ,
1311- "Remaining" : 80 ,
1312- "Total Hours" : 50 ,
1313- "# Nodes" : 30 ,
1314- "# FIPs" : 30 ,
1315- "Project" : 100 ,
1316- "User" : 75 ,
1317- "Start" : 95 ,
1318- "End" : 95 ,
1319- "Created" : 95 ,
1320- "Lease ID" : 30 ,
1321-
1322- },
1323- renderers = renderers
1324- ))
1322+ display (
1323+ DataGrid (
1324+ df ,
1325+ layout = {"height" : "400px" , "width" : "100%" },
1326+ column_widths = {
1327+ "key" : 30 ,
1328+ "Name" : int (estimate_column_width (df , "Name" )),
1329+ "Status" : 120 ,
1330+ "Remaining" : 80 ,
1331+ "Total Hours" : 50 ,
1332+ "# Nodes" : 30 ,
1333+ "# FIPs" : 30 ,
1334+ "Project" : 100 ,
1335+ "User" : 75 ,
1336+ "Start" : 95 ,
1337+ "End" : 95 ,
1338+ "Created" : 95 ,
1339+ "Lease ID" : 30 ,
1340+ },
1341+ renderers = renderers ,
1342+ )
1343+ )
13251344
13261345
13271346def _get_lease_from_blazar (ref : str ):
0 commit comments