Spaces:
Sleeping
Sleeping
Update Utils.py
Browse files
Utils.py
CHANGED
@@ -1,6 +1,12 @@
|
|
1 |
import pandas as pd
|
2 |
import streamlit as st
|
3 |
import base64
|
|
|
|
|
|
|
|
|
|
|
|
|
4 |
|
5 |
|
6 |
def clear_rfp_data():
|
@@ -30,3 +36,64 @@ def estimate_to_value(estimate):
|
|
30 |
else:
|
31 |
# Handle the case when the estimate is not one of the specified values
|
32 |
return "Invalid estimate"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import pandas as pd
|
2 |
import streamlit as st
|
3 |
import base64
|
4 |
+
from roadmapper.roadmap import Roadmap
|
5 |
+
from roadmapper.timelinemode import TimelineMode
|
6 |
+
import datetime
|
7 |
+
import re
|
8 |
+
from io import BytesIO
|
9 |
+
import json
|
10 |
|
11 |
|
12 |
def clear_rfp_data():
|
|
|
36 |
else:
|
37 |
# Handle the case when the estimate is not one of the specified values
|
38 |
return "Invalid estimate"
|
39 |
+
|
40 |
+
|
41 |
+
def is_key_value_present(array_of_objects, key, value):
|
42 |
+
for obj in array_of_objects:
|
43 |
+
if key in obj and obj[key] == value:
|
44 |
+
return True
|
45 |
+
return False
|
46 |
+
|
47 |
+
def generate_roadmap_image():
|
48 |
+
# Calculate the project start date (15 days from today)
|
49 |
+
project_start_date = datetime.datetime.now() + datetime.timedelta(days=15)
|
50 |
+
project_start_date_str = project_start_date.strftime("%Y-%m-%d")
|
51 |
+
|
52 |
+
roadmap = Roadmap(1400, 800, colour_theme="BLUEMOUNTAIN")
|
53 |
+
roadmap.set_title("Project Roadmap")
|
54 |
+
roadmap.set_subtitle(st.session_state["project_name"])
|
55 |
+
roadmap.set_timeline(TimelineMode.MONTHLY, start=project_start_date_str, number_of_items=12)
|
56 |
+
group_index = 1
|
57 |
+
milestone_index = 1
|
58 |
+
data = st.session_state["roadmap_data_json"]
|
59 |
+
prev_phase_end_date = None
|
60 |
+
|
61 |
+
data = json.loads(st.session_state["roadmap_data_json"])
|
62 |
+
|
63 |
+
for phase in data["phases"]:
|
64 |
+
group_name = f"{phase['name']} - {group_index}"
|
65 |
+
group = roadmap.add_group(group_name)
|
66 |
+
|
67 |
+
milestone_start_date = project_start_date if prev_phase_end_date is None else prev_phase_end_date
|
68 |
+
for milestone in phase["milestones"]:
|
69 |
+
task_name = f"milestone - {milestone_index}"
|
70 |
+
|
71 |
+
total_time_range = [int(num) for num in re.findall(r'\d+', milestone["totalTime"])]
|
72 |
+
total_working_days = sum(total_time_range) / 2
|
73 |
+
average_duration = total_working_days / 5 * 7
|
74 |
+
milestone_end_date = milestone_start_date + datetime.timedelta(days=average_duration)
|
75 |
+
|
76 |
+
print(milestone_start_date,milestone_end_date)
|
77 |
+
|
78 |
+
group.add_task(task_name, milestone_start_date.strftime("%Y-%m-%d"), milestone_end_date.strftime("%Y-%m-%d"))
|
79 |
+
|
80 |
+
milestone_start_date = milestone_end_date
|
81 |
+
milestone_index += 1
|
82 |
+
prev_phase_end_date = milestone_end_date
|
83 |
+
group_index += 1
|
84 |
+
|
85 |
+
roadmap.set_footer("Generated by Roadmapper")
|
86 |
+
roadmap.draw()
|
87 |
+
roadmap.save("project_roadmap.png")
|
88 |
+
|
89 |
+
image_buffer = BytesIO()
|
90 |
+
|
91 |
+
image_data = image_buffer.getvalue()
|
92 |
+
return image_data
|
93 |
+
|
94 |
+
def get_binary_file_downloader_html(bin_file, file_label, button_label):
|
95 |
+
with st.spinner("Processing..."):
|
96 |
+
# Provide a download link for the image
|
97 |
+
bin_str = base64.b64encode(bin_file).decode()
|
98 |
+
href = f'<a href="data:application/octet-stream;base64,{bin_str}" download="{file_label}">{button_label}</a>'
|
99 |
+
return href
|