-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtest1.py
150 lines (125 loc) · 5.52 KB
/
test1.py
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
import yaml
import csv
from graphviz import Digraph
# Static classes, import data and export to CSV...
# This is to test "idealexport type functionality"
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person: {self.name}, Age: {self.age}"
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
def __str__(self):
return f"Student: {self.name}, Age: {self.age}, Student ID: {self.student_id}"
class Teacher(Person):
def __init__(self, name, age, employee_id):
super().__init__(name, age)
self.employee_id = employee_id
def __str__(self):
return f"Teacher: {self.name}, Age: {self.age}, Employee ID: {self.employee_id}"
class Course:
def __init__(self, name, teacher=None, students=None, version=1):
self.name = name
self.teacher = teacher
self.students = students if students else []
self.version = version
def set_version(self, version):
self.version = version
def assign_teacher(self, teacher):
self.teacher = teacher
def add_student(self, student):
self.students.append(student)
def __str__(self):
if self.version == 2:
teacher_name = self.teacher.name if self.teacher else "No teacher assigned"
return f"Course: {self.name}, Version: {self.version}"
else:
teacher_name = self.teacher.name if self.teacher else "No teacher assigned"
student_list = ", ".join([student.name for student in self.students])
return f"Course: {self.name}, Teacher: {teacher_name}, Students: {student_list}"
@property
def __dict__(self):
teacher_name = self.teacher.name if self.teacher else "No teacher assigned"
student_list = ", ".join([student.name for student in self.students])
return {'name': self.name, 'teacher': teacher_name, 'students': student_list, 'version': self.version}
def import_data(filename):
with open(filename, 'r') as file:
data = yaml.safe_load(file)
teachers = {}
students = {}
courses = []
# Create Teacher objects
for teacher_data in data.get('teachers', []):
teacher = Teacher(teacher_data['name'], teacher_data['age'], teacher_data['employee_id'])
teachers[teacher_data['name']] = teacher
# Create Student objects
for student_data in data.get('students', []):
student = Student(student_data['name'], student_data['age'], student_data['student_id'])
students[student_data['name']] = student
# Create Course objects
for course_data in data.get('courses', []):
course = Course(course_data['name'])
version = course_data.get('version')
if version:
course.set_version(version)
teacher_name = course_data.get('teacher')
if teacher_name:
teacher = teachers.get(teacher_name)
if teacher:
course.assign_teacher(teacher)
else:
print(f"Error: Teacher '{teacher_name}' not found for course '{course_data['name']}'")
else:
print(f"Error: No teacher assigned for course '{course_data['name']}'")
for student_name in course_data.get('students', []):
student = students.get(student_name)
if student:
course.add_student(student)
else:
print(f"Error: Student '{student_name}' not found for course '{course_data['name']}'")
courses.append(course)
return teachers, students, courses
# Print the imported data
def print_data(teachers, students, courses):
for teacher in teachers.values():
print(teacher)
for student in students.values():
print(student)
for course in courses:
print(course)
print(course.__dict__)
# Function to export data to CSV
def export_to_csv(objects, filename):
with open(filename, 'w', newline='') as csvfile:
fieldnames = objects[0].__dict__.keys()
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
for obj in objects:
writer.writerow(obj.__dict__)
# Export data for each class
def export_model_to_csv(teachers, students, courses):
export_to_csv(list(teachers.values()), 'output/test1_teachers.csv')
export_to_csv(list(students.values()), 'output/test1_students.csv')
export_to_csv(courses, 'output/test1_courses.csv')
# Visualise
def visualise_data(teachers, students, courses):
dot = Digraph()
for course in courses:
dot.node(course.name, 'Course: ' + course.name + '\n' + 'Version: ' + str(course.version))
if course.teacher:
dot.node(course.teacher.name, 'Teacher: ' + course.teacher.name + '\n' + 'ID: ' + course.teacher.employee_id)
dot.edge(course.name, course.teacher.name)
if course.students:
for student in course.students:
dot.node(student.name, 'Student: ' + student.name + '\n' + 'ID: ' + student.student_id)
dot.edge(course.name, student.name)
dot.render('output/test1', format='png', cleanup=True)
# Import data from YAML file
teachers, students, courses = import_data('data/test1.yaml')
print_data(teachers, students, courses)
export_model_to_csv(teachers, students, courses)
visualise_data(teachers, students, courses)