File size: 10,804 Bytes
1987ae5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9903a51
 
1987ae5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3481992
16eefca
b9ec205
1987ae5
 
 
 
 
 
b9ec205
1987ae5
 
 
 
 
 
 
 
 
 
 
daffbb6
1987ae5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
import pandas as pd
import numpy as np
import json
import streamlit as st
from ConsoleApp import main
# from ConsoleApp import main_filter

# from ConsoleApp import get_filter
import sys
import hashlib
import json
import ast
import traceback
import hashlib
from PIL import Image
from itertools import chain
from bs4 import BeautifulSoup
# from session_state import SessionState



def load_file(df2, df_room):
    
    list_course = []
    index_count_course_id = 0
    list_prof = []     
    index_count_prof_id = 0
    for index1, row1 in df2.iterrows():
        if row1['Course_Name'] not in list_course:
            df2.at[index1, 'Course_id'] = index_count_course_id + 1
            index_count_course_id += 1
            list_course.append(row1['Course_Name'])
        else:
            df2.at[index1, 'Course_id'] = index_count_course_id

        if row1['Prof_Name'] not in list_prof:
            df2.at[index1, 'Prof_id'] = index_count_prof_id + 1
            index_count_prof_id += 1
            list_prof.append(row1['Prof_Name'])
        else:
            df2.at[index1, 'Prof_id'] = index_count_prof_id
            
    # create list of dictionaries representing each object in the JSON file
    objects = []
    for index, row in df2.iterrows():       
        if row['Prof_id'] != '':
            # create professor object
            prof = {
                "prof": {
                    "id": row['Prof_id'],
                    "name": row['Prof_Name']
                }
            }
            if prof not in objects:
                objects.append(prof)
        if row['Course_id'] != '':
            # create course object
            course = {
                "course": {
                    "id": row['Course_id'],
                    "name": row['Course_Name']
                }
            }
            if course not in objects:
                objects.append(course)
        if row['Group_id'] != '':
            # create group object
            group = {
                "group": {
                    "id": row['Group_id'],
                    "size": row['Size_Course']
                }
            }
            # if group not in objects:
            objects.append(group)
        if row['Prof_id'] != '' and row['Course_id'] != '':
            # create class object
            class_ = {
                "class": {
                    "professor": row['Prof_id'],
                    "course": row['Course_id'],
                    "duration": row['Duration'],
                    "group": row['Group_id'],
                    "lab": row['Lab']
                }
            }
            if class_ not in objects:
                objects.append(class_)
            
    for index, row in df_room.iterrows():
        if row['Room'] != '':
            # create room object
            room = {
                "room": {
                    "name": row['Room'],
                    "lab": row['Lab'],
                    "size": row['Size_Room']
                }
            }
            objects.append(room)    
            
    # create JSON object with list of objects
    json_data = json.dumps(objects, sort_keys=False)
    # write JSON object to file
    with open('GaSchedule1.json', 'w') as f:
        f.write(json_data) 
    file_name = "/GaSchedule1.json"
    return file_name




def for_stu():
    df_stu = pd.read_csv("data_stu.csv")
    df_ctdt = pd.read_csv("ctdt_ds.csv")

    df_ctdt = df_ctdt[['MaMH', 'Course Name', 'Sem', 'Expect Year', 'Credits', 'Elective']]

    df_stu = df_stu[['MaSV', 'NHHK', 'HK', 'MaMH', 'TenMH', 'SoTinChi', 'DiemHP']]
    df_stu = df_stu.dropna()
    df_stu['NHHK'] = df_stu['NHHK'].astype(str).str[:-1]
    input = st.text_input("Type Student ID", value="")

                
    

    col1, col2, col3 = st.columns(3)
    with col1:
        if input:

            # Convert 'DiemHP' column to numeric type, ignoring non-numeric values
            df_stu['DiemHP'] = pd.to_numeric(df_stu['DiemHP'], errors='coerce')

            list_subject_have_done = df_stu.loc[(df_stu['MaSV'].str.lower() == input.lower()) & (df_stu['DiemHP'].gt(50))]
            list_subject_have_done[''] = np.arange(1, len(list_subject_have_done) + 1) 
            list_subject_have_done = list_subject_have_done.reindex(columns=['', 'MaMH', 'TenMH','HK', 'NHHK', 'SoTinChi'])
            list_subject_have_done = list_subject_have_done.rename(columns={'NHHK': 'Actual Year', 'HK': 'Sem', 'TenMH': 'Course Name', 'SoTinChi': 'Credits'})           
            
            with st.expander("List of subjects have done"):  
                st.dataframe(list_subject_have_done.set_index(''))
    with col2:
        if input:
            list_subject_havent_done_yet = df_ctdt[~df_ctdt['MaMH'].isin(list_subject_have_done['MaMH'])]
            list_subject_havent_done_yet['Expect Year'] = list_subject_havent_done_yet['Expect Year'].astype(str)
            list_subject_havent_done_yet['Elective'] = list_subject_havent_done_yet['Elective'].astype(bool)
            list_subject_havent_done_yet[''] = np.arange(1, len(list_subject_havent_done_yet) + 1) 
            list_subject_havent_done_yet = list_subject_havent_done_yet.reindex(columns=['', 'MaMH', 'Course Name', 'Credits', 'Elective', 'Expect Year', 'Sem'])
            
            with st.expander("List of subjects haven't done yet"):  
                st.dataframe(list_subject_havent_done_yet.set_index(''))  

    with col3:
        if input:
            df_unique = df2[df2['Group_Lab'] == 1.0]
            df_unique = df_unique[['MaMH', 'Course_Name', 'Prof_Name', 'Duration', 'Group_Lab', 'Size_Course']]
            list_recommend_subjects = df_unique[df_unique['MaMH'].isin(list_subject_havent_done_yet['MaMH'])]
            list_recommend_subjects[''] = np.arange(1, len(list_recommend_subjects) + 1) 
            list_recommend_subjects = list_recommend_subjects.reindex(columns=['', 'MaMH', 'Course_Name', 'Prof_Name', 'Duration', 'Group_Lab', 'Size_Course'])
            with st.expander("List of recommend subjects in this semester"):    
                st.dataframe(list_recommend_subjects.set_index(''))  

def get_filter(html, list_filter):
    # Parse the HTML
    soup = BeautifulSoup(html, 'html.parser')

    # Find all div elements with id starting with 'room_'
    div_elements = soup.find_all('div', id=lambda x: x and x.startswith('room_'))
    # Filter and display the schedule for specific rooms
    filtered = ""
    for div in div_elements:
        room_id = div['id'].replace('room_', '')  # Extract the room ID from the div's id attribute
        if room_id in list_filter:
            filtered += str(div)
    return filtered

def data_display():

    uploaded_file = st.file_uploader('')
    if uploaded_file is not None:
        df = pd.read_csv(uploaded_file)

    else:
        df = [['Data Mining', 1, 35, 4, 'Nguyen Thi Thanh Sang', 'IT132IU'],
            ['Analytics for Observational Data', 2, 35, 4, 'Nguyen Thi Thanh Sang', 'IT142IU'],
            ['Fundamentals of Programming', 0, 90, 3, 'Dao Tran Hoang Chau', 'IT149IU'],
            ['Object-Oriented Analysis and Design', 0, 90, 4, 'Ha Viet Uyen Synh', 'IT090IU']]
        room_columns = ['TenMH', 'ToTH', 'TongSoSV', 'SoTiet', 'TenDayDuNV', 'MaMH']
        df = pd.DataFrame(df, columns=room_columns)

    df1 = df[['TenMH', 'ToTH', 'TongSoSV', 'SoTiet', 'TenDayDuNV', 'MaMH']]
    df1 = df1.rename(columns={'TenMH': 'Course_Name', 'ToTH': 'Group_Lab', 'TongSoSV': 'Size_Course', 'SoTiet': 'Duration', 'TenDayDuNV': 'Prof_Name', 'MaMH': 'MaMH'})
    df1['Lab'] = df1['Group_Lab']
    # df1['Lab'] = df1['Lab'].astype(str)
    for index, row in df1.iterrows():
        if row['Lab'] == 1 or row['Lab'] == 2 or row['Lab'] == 3 or row['Lab'] == 4:
            df1.at[index, 'Lab'] = 'True'
        else:
            df1.at[index, 'Lab'] = ''
    df1['Lab'] = df1['Lab'].astype(bool)
    

    ## create default room
    room_default = [['A1.309', 90, 0],
                    ['L107', 90, 0],
                    ['LA1.605', 60, 1],
                    ['La1.607', 60, 1]
    ]
    room_columns = ['Room', 'Size_Room', 'Lab']
    df_room = pd.DataFrame(room_default, columns=room_columns)
    df_room['Lab'] = df_room['Lab'].astype(str)
    for index, row in df_room.iterrows():
        if row['Lab'] == '1':
            df_room.at[index, 'Lab'] = 'True'
        else:
            df_room.at[index, 'Lab'] = ''
    df_room['Lab'] = df_room['Lab'].astype(bool)


    # col1, col2, col3, col4 = st.columns([0.5,7,2.4,0.5])
    col1, col2 = st.columns([9,4])
    with col1:
        df2 = st.experimental_data_editor(df1, num_rows="dynamic")
        df2['Size_Course'] = df2['Size_Course'].astype(int)
        df2['Duration'] = df2['Duration'].astype(int)
        df2['Group_id'] = np.arange(1, len(df2) + 1)
        df_prof_filter = df2['Prof_Name'].drop_duplicates().tolist()

    with col2:                          
        df_room = st.experimental_data_editor(df_room, num_rows="dynamic")
        df_room['Size_Room'] = df_room['Size_Room'].astype(int)
        filter = df_room['Room'].to_list()
        # df_room_filter = df_room[df_room['Room'].isin(list_filter)]   

    return df2, df_room, filter, df_prof_filter

st.set_page_config(layout="wide")
if __name__ == "__main__":

    st.markdown("<h1 style='text-align: center; color: white;'>Time Scheduling Engine</h1>", unsafe_allow_html=True)
    image = Image.open('logo-vector-IU-01.png')
    st.sidebar.image(image, width=240)
    tab1, tab2 = st.tabs(["Schedule", "Student"])
    with tab1:
        df2, df_room, filter, df_prof_filter = data_display()
        file_name = load_file(df2, df_room)
        # html_result_filter = main_filter(file_name)
        html_result = main(file_name)
        if 'html_result' not in st.session_state:
            st.session_state.html_result = []
        list_room_filter = st.sidebar.multiselect('Room Filter', filter, filter)
        # list_prof_filter = st.sidebar.multiselect('Prof Filter', df_prof_filter, df_prof_filter)
        if st.button('Generate'):
            st.session_state.html_result = html_result
            st.markdown(st.session_state.html_result, unsafe_allow_html=True)
        if st.sidebar.button('Room Filter'): 
            filtered1 = get_filter(st.session_state.html_result, list_room_filter)
            st.markdown(filtered1, unsafe_allow_html=True)

        # if len(sys.argv) > 1:
        #     file_name = sys.argv[1]
        # try:
        #     if st.button('Generate'): 
        #         temp = session_state['html_result']
        #         filtered1 = get_filter(temp, list_filter)
        #         st.markdown(filtered1, unsafe_allow_html=True)  

        # except:
        #     traceback.print_exc()

    with tab2:         
        for_stu()