class-scheduling / model /Configuration.py
garizz's picture
Upload 31 files
8e7d8ae
import codecs
import json
from .Professor import Professor
from .StudentsGroup import StudentsGroup
from .Course import Course
from .Room import Room
from .CourseClass import CourseClass
# Reads configuration file and stores parsed objects
class Configuration:
# Initialize data
def __init__(self):
# Indicate that configuration is not parsed yet
self._isEmpty = True
# parsed professors
self._professors = {}
# parsed student groups
self._studentGroups = {}
# parsed courses
self._courses = {}
# parsed rooms
self._rooms = {}
# parsed classes
self._courseClasses = []
# Returns professor with specified ID
# If there is no professor with such ID method returns NULL
def getProfessorById(self, id) -> Professor:
if id in self._professors:
return self._professors[id]
return None
@property
# Returns number of parsed professors
def numberOfProfessors(self) -> int:
return len(self._professors)
# Returns student group with specified ID
# If there is no student group with such ID method returns NULL
def getStudentsGroupById(self, id) -> StudentsGroup:
if id in self._studentGroups:
return self._studentGroups[id]
return None
@property
# Returns number of parsed student groups
def numberOfStudentGroups(self) -> int:
return len(self._studentGroups)
# Returns course with specified ID
# If there is no course with such ID method returns NULL
def getCourseById(self, id) -> Course:
if id in self._courses:
return self._courses[id]
return None
@property
def numberOfCourses(self) -> int:
return len(self._courses)
# Returns room with specified ID
# If there is no room with such ID method returns NULL
def getRoomById(self, id) -> Room:
if id in self._rooms:
return self._rooms[id]
return None
@property
# Returns number of parsed rooms
def numberOfRooms(self) -> int:
return len(self._rooms)
@property
# Returns reference to list of parsed classes
def courseClasses(self) -> []:
return self._courseClasses
@property
# Returns number of parsed classes
def numberOfCourseClasses(self) -> int:
return len(self._courseClasses)
@property
# Returns TRUE if configuration is not parsed yet
def isEmpty(self) -> bool:
return self._isEmpty
# Reads professor's data from config file, makes object and returns
# Returns NULL if method cannot parse configuration data
@staticmethod
def __parseProfessor(dictConfig):
id = 0
name = ''
for key in dictConfig:
if key == 'id':
id = dictConfig[key]
elif key == 'name':
name = dictConfig[key]
if id == 0 or name == '':
return None
return Professor(id, name)
# Reads StudentsGroup's data from config file, makes object and returns
# Returns None if method cannot parse configuration data
@staticmethod
def __parseStudentsGroup(dictConfig):
id = 0
# name = ''
size = 0
for key in dictConfig:
if key == 'id':
id = dictConfig[key]
# elif key == 'name':
# name = dictConfig[key]
elif key == 'size':
size = dictConfig[key]
if id == 0:
return None
return StudentsGroup(id, size)
# Reads course's data from config file, makes object and returns
# Returns None if method dictConfig parse configuration data
@staticmethod
def __parseCourse(dictConfig):
id = 0
name = ''
for key in dictConfig:
if key == 'id':
id = dictConfig[key]
elif key == 'name':
name = dictConfig[key]
if id == 0:
return None
return Course(id, name)
# Reads rooms's data from config file, makes object and returns
# Returns None if method cannot parse configuration data
@staticmethod
def __parseRoom(dictConfig):
lab = False
name = ''
size = 0
for key in dictConfig:
if key == 'lab':
lab = dictConfig[key]
elif key == 'name':
name = dictConfig[key]
elif key == 'size':
size = dictConfig[key]
if size == 0 or name == '':
return None
return Room(name, lab, size)
# Reads class' data from config file, makes object and returns pointer
# Returns None if method cannot parse configuration data
def __parseCourseClass(self, dictConfig):
pid = 0
cid = 0
dur = 1
lab = False
group_list = []
for key in dictConfig:
if key == 'professor':
pid = dictConfig[key]
elif key == 'course':
cid = dictConfig[key]
elif key == 'lab':
lab = dictConfig[key]
elif key == 'duration':
dur = dictConfig[key]
elif key == 'group' or key == 'groups':
groups = dictConfig[key]
if isinstance(groups, list):
for grp in groups:
g = self.getStudentsGroupById(grp)
if g:
group_list.append(g)
else:
g = self.getStudentsGroupById(groups)
if g:
group_list.append(g)
# get professor who teaches class and course to which this class belongs
p = self.getProfessorById(pid)
c = self.getCourseById(cid)
# does professor and class exists
if not c or not p:
return None
# make object and return
return CourseClass(p, c, lab, dur, group_list)
# parse file and store parsed object
def parseFile(self, fileName):
# clear previously parsed objects
self._professors = {}
self._studentGroups = {}
self._courses = {}
self._rooms = {}
self._courseClasses = []
Room.restartIDs()
CourseClass.restartIDs()
with codecs.open(fileName, "r", "utf-8") as f:
# read file into a string and deserialize JSON to a type
data = json.load(f)
for dictConfig in data:
for key in dictConfig:
if key == 'prof':
prof = self.__parseProfessor(dictConfig[key])
self._professors[prof.Id] = prof
elif key == 'course':
course = self.__parseCourse(dictConfig[key])
self._courses[course.Id] = course
elif key == 'room':
room = self.__parseRoom(dictConfig[key])
self._rooms[room.Id] = room
elif key == 'group':
group = self.__parseStudentsGroup(dictConfig[key])
self._studentGroups[group.Id] = group
elif key == 'class':
courseClass = self.__parseCourseClass(dictConfig[key])
self._courseClasses.append(courseClass)
self._isEmpty = False