-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
153 lines (119 loc) · 5.83 KB
/
main.py
File metadata and controls
153 lines (119 loc) · 5.83 KB
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
import json
import os
import sys
from datetime import datetime
import requests
from PyQt6.QtCore import Qt, QDate
from PyQt6.QtGui import QIcon
from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidgetItem, QTreeWidgetItem, QMessageBox, QDialog
from googleapiclient.errors import HttpError
from calendar_api import CalendarWorker
from timetable import TimeTable
from uis.MainWindow import Ui_MainWindow
from uis.PushToCalendar import Ui_Dialog
class Scheduler(QMainWindow):
def __init__(self):
super(Scheduler, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.show()
self.ui.treeWidget.itemClicked.connect(self.on_item_clicked)
self.ui.buttonPushSetup.clicked.connect(self.on_button_push_to_calendar_clicked)
def fill_table(self, timetable: TimeTable):
fw, sw = timetable.parse_timetable(push=False, until='', calendar_id='', calendar_worker=None)
for day in range(0, 6):
for lesson in range(0, 6):
self.ui.timeTable1.setItem(lesson, day, QTableWidgetItem(fw[lesson + day*6]))
self.ui.timeTable2.setItem(lesson, day, QTableWidgetItem(sw[lesson + day*6]))
self.ui.timeTable1.resizeRowsToContents()
self.ui.timeTable2.resizeRowsToContents()
def fill_tree(self, data, parent_item=None):
for key, value in data.items():
if isinstance(value, dict):
# Create a new QTreeWidgetItem with the key as the title
item = QTreeWidgetItem([key])
if parent_item is None:
self.ui.treeWidget.addTopLevelItem(item)
else:
parent_item.addChild(item)
# Recursively add child items
self.fill_tree(value, item)
else:
# If the value is a URL, add it as a child item
child_item = QTreeWidgetItem([key])
child_item.setData(0, Qt.ItemDataRole.UserRole, value)
parent_item.addChild(child_item)
def on_item_clicked(self, item):
url = item.data(0, Qt.ItemDataRole.UserRole)
try:
if not url:
return
response = requests.get(url)
if not response:
QMessageBox.information(self, 'Http Error', f'File not found. Server returned {response}', QMessageBox.StandardButton.Ok)
return
with open('timetable.xlsx', 'wb') as file:
file.write(response.content)
self.fill_table(TimeTable('timetable.xlsx'))
self.ui.buttonPushSetup.setEnabled(True)
except HttpError as ex:
QMessageBox.information(self, 'Http Error', f'File not found. Server returned {ex.content}', QMessageBox.StandardButton.Ok)
except:
QMessageBox.critical(self, 'Error', str(sys.exc_info()[1]))
@staticmethod
def on_button_push_to_calendar_clicked():
push_to_calendar = PushToCalendar()
push_to_calendar.exec()
class PushToCalendar(QDialog):
def __init__(self):
super(PushToCalendar, self).__init__()
self.ui = Ui_Dialog()
self.ui.setupUi(self)
self.ui.calendar.setMinimumDate(QDate.currentDate())
self.calendar_worker = CalendarWorker()
self.ui.buttonUpdate.clicked.connect(self.on_button_update_clicked)
self.ui.buttonPush.clicked.connect(self.on_button_push_clicked)
def on_button_push_clicked(self):
if not os.path.exists('timetable.xlsx'):
return
if self.get_current_calendar_id() is None:
QMessageBox.information(self,
'No calendar selected',
'You should select Your calendar in combobox. Click update if it is empty.',
QMessageBox.StandardButton.Ok)
return
timetable = TimeTable('timetable.xlsx')
answer = QMessageBox.question(self,
'Final approval',
f'You are about to push some events to Your calendar `{self.ui.comboBoxCalendars.currentText()}`.\n'
f'Events will be scheduled from {timetable.get_start_date().strftime('%d.%m.%Y')} to {self.ui.calendar.selectedDate().toString('dd.MM.yyyy')}.\n'
f'This action cannot be undone.',
QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
if answer == QMessageBox.StandardButton.Yes:
timetable.parse_timetable(push=True,
until=self.ui.calendar.selectedDate().toString('yyyyMMdd'),
calendar_id=self.get_current_calendar_id(),
calendar_worker=self.calendar_worker)
def on_button_update_clicked(self):
calendars = self.calendar_worker.get_calendars_list()
if len(calendars.items()) > 0:
self.ui.buttonPush.setEnabled(True)
self.ui.comboBoxCalendars.clear()
for item in calendars.items():
self.add_item_to_combobox(item[1], item[0])
def add_item_to_combobox(self, name, user_data):
self.ui.comboBoxCalendars.addItem(name)
index = self.ui.comboBoxCalendars.count() - 1
self.ui.comboBoxCalendars.setItemData(index, user_data, Qt.ItemDataRole.UserRole)
def get_current_calendar_id(self) -> str:
current_index = self.ui.comboBoxCalendars.currentIndex()
user_data = self.ui.comboBoxCalendars.itemData(current_index, Qt.ItemDataRole.UserRole)
return user_data
def load_json(path):
with open(path, 'r', encoding='utf-8') as file:
return json.load(file)
if __name__ == '__main__':
app = QApplication([])
window = Scheduler()
window.fill_tree(load_json('groups_tree.json'))
app.exec()