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
|