File size: 2,882 Bytes
24291c5
 
 
 
bed9358
24291c5
 
 
 
 
 
 
0855c6c
24291c5
 
 
bed9358
581d5e9
ec79501
c9c4c03
24291c5
cfc1d6e
24291c5
0855c6c
 
 
 
c9c4c03
 
 
cfc1d6e
c9c4c03
 
 
 
bf51e2c
 
 
 
 
 
 
 
 
 
cfc1d6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
import plotly.figure_factory as ff
import random
from datetime import datetime, timedelta

def generate_random_color():
    r = random.randint(0, 255)
    g = random.randint(0, 255)
    b = random.randint(0, 255)
    return f'rgb({r}, {g}, {b})'

st.set_page_config(layout="wide")
st.title("Project Schedule/Gantt Chart Generator")

project_name = st.text_input("Project Name:")
start_date = st.date_input("Project Start Date:", value=datetime.today())
end_date = st.date_input("Project End Date:", value=datetime.today() + timedelta(days=30))

num_activities = st.number_input("Number of Activities (Minimum 1):", min_value=1, value=5)

activities = [] # Corrected line 22: Placed outside the loop
for i in range(num_activities):
    col1, col2 = st.columns(2)
    with col1:
        activity_name = st.text_input(f"Activity {i+1} Name:", key=f"name_{i}")
    with col2:
        activity_duration = st.number_input(f"Activity {i+1} Duration (days):", min_value=1, key=f"duration_{i}")
    activities.append({"Task": activity_name, "Duration": activity_duration})

if st.button("Create Gantt Chart"):
    if not project_name:
        st.error("Please enter a project name.")
    elif any(not activity["Task"] for activity in activities):
        st.error("Please enter names for all activities.")
    elif start_date > end_date:
        st.error("Start date cannot be after end date.")
    else:
        try:
            df = pd.DataFrame(activities)
            df['Start'] = pd.to_datetime(start_date)
            df['Finish'] = df['Start']

            for i in range(len(df)):
                if i > 0:
                    df.loc[i, 'Start'] = df.loc[i - 1, 'Finish']
                df.loc[i, 'Finish'] = df.loc[i, 'Start'] + pd.to_timedelta(df.loc[i, 'Duration'], unit='D')

            df['Start_str'] = df['Start'].dt.strftime('%Y-%m-%d')
            df['Finish_str'] = df['Finish'].dt.strftime('%Y-%m-%d')

            data = []
            for _, row in df.iterrows():
                data.append(dict(Task=row['Task'], Start=row['Start_str'], Finish=row['Finish_str']))

            fig = ff.create_gantt(data, colors=[generate_random_color() for _ in range(len(df))],
                                  index_col='Task', show_colorbar=False, group_tasks=True, bar_width=0.4,
                                  showgrid_x=True, showgrid_y=True)

            fig.update_layout(title_text=f"Gantt Chart for: {project_name}", title_x=0.5,
                              margin=dict(l=20, r=20, t=60, b=20),
                              xaxis=dict(range=[start_date, end_date]),
                              height=600)

            fig.update_yaxes(autorange="reversed")

            st.plotly_chart(fig, use_container_width=True)

        except Exception as e:
            st.error(f"An error occurred during chart creation: {e}")