def insert_leave_record(key): # 向历史记录添加请假 学生请假休息包括 学号 提交类型 请假证明 提交时间 seq_info = DataManage(DataManage.target_info, args=('../InData/seq.csv',)).run() count = 0 for seq in seq_info: if seq['TeacherID'] == key['TeacherID']: if seq['ClassID'] == seq['ClassID']: count = seq['SeqID'] if not count: print '满足您输入信息的考勤细节表不存在!' return False filename = '../InData/'+key['TeacherID']+'_'+key['ClassID']+'_'+count+'_Detail.csv' if DataManage(DataManage.target_info, args=(filename, {'StuID': key['StuID'], 'checkinType': 'leave'})).run(): print '您在该次考勤中已经申请过请假无法再次申请!' return False data = dict() data['StuID'] = key['StuID'] data['checkTime'] = str(datetime.datetime.now())[:-7] data['ProofPath'] = key['ProofPath'] data['checkinType'] = 'leave' data['IsSucc'] = 'False' data['checkinResult'] = 'Submitted' print '提交假条成功!' return DataManage(DataManage.update, args=(filename, 'a', [data])).run()
def man_check_in(self): # 手动考勤 course_info = DataManage(DataManage.target_info, args=('../InData/courseInfo.csv', { 'CourseID': self.key['CourseID'], 'TeacherID': self.key['TeacherID'] })).run() if not course_info: print '当前没有与您相关的课程!' return False class_list = [] for course in course_info: if course['ClassName'] not in class_list: class_list.append(course['ClassName']) stu_list = [] for _class in class_list: student = DataManage(DataManage.target_info, args=('../InData/studentInfo.csv', { 'ClassID': _class })).run() for stu in student: stu_list.append(stu) self.write_seq() print '请按照以下选项输入状态 非法输入默认为缺勤!' print ' 1 正常 2 迟到 3 早退 4 缺勤 5 请假已批准' stu_list = self.init_data(stu_list, 'man') print '学生考勤状态手动设置完成!' return DataManage(DataManage.update, args=(self.filename, 'w', stu_list)).run()
def get_count_rate(self, key, num): # 给定教师ID和课程返回平均出勤率 若给定num显示哪一次的 try: num = int(num) except TypeError and ValueError: print '数据无效,请您输入正整数!' return False filename = '../InData/' + key['TeacherID'] + '_' + key[ 'CourseID'] + '_Sum.csv' class_info = DataManage(DataManage.target_info, args=(filename, )).run() if not class_info: print '课程考勤信息不存在请检查您的输入!' return False seq_info = DataManage(DataManage.target_info, args=('../InData/seq.csv', )).run() count = 0 for seq in seq_info: if seq['TeacherID'] == key["TeacherID"]: count = count + 1 if count == num: key['seqnum'] = seq['SeqID'] grade = self.get_att_rate(key) if grade == -1.0: return False print '%-10s课第%2d次考勤的出勤率为%-3.2f %%' \ % (key['teacher_info'], count, grade) return grade print '该次课程不存在第%d次考勤,请检查您的输入!' % (num, ) return False
def write_seq(self): if not DataManage(DataManage.target_key, args=('../InData/seq.csv', )).run(): print 'The system creates the seq.csv file automatically!' return DataManage(DataManage.update, args=('../InData/seq.csv', 'a', [self.get_seq_info()])).run()
def view_time(self, key): # 输入教师教工号和班级号的字典 查看最近历史的一次考勤 seq_info = DataManage(DataManage.target_info, args=('../InData/seq.csv', )).run() line = {} for seq in seq_info: if seq['TeacherID'] == key['teacher_info']['TeacherID']: line = seq if not line: print '您还没有完整的进行过一次考勤!' return False filename = '../InData/' + line['TeacherID'] + '_' + line[ 'CourseID'] + '_Sum.csv' keys = DataManage(DataManage.target_key, args=(filename, )).run() if keys and 'checkin' + line['SeqID'] in keys: key = 'checkin' + line['SeqID'] else: filename = '../InData/' + line['TeacherID'] + '_' + line[ 'CourseID'] + '_' + line['SeqID'] + '_Detail.csv' key = 'checkinResult' stu_info = DataManage(DataManage.target_info, args=(filename, )).run() return self.dis_play(stu_info, key)
def create_sum(self, key, info=''): filename = '../InData/' + key['TeacherID'] + '_' + key[ 'ClassID'] + '_' + key['SeqNum'] + '_Detail.csv' if not DataManage(DataManage.target_key, args=(filename, )).run(): print '该次考勤不存在无法计算考勤的结果' return False if not self.init(key): print '初始化考勤汇总表失败请检查您的键值是否正确!' return False self.detail_filename = filename self.historical_statistics() stu_list = DataManage(DataManage.target_info, args=(self.detail_filename, )).run() stu_list = self.statistics_calculation(stu_list) old_data = DataManage(DataManage.target_info, args=(self.sum_filename, )).run() DataManage(DataManage.update, args=(self.sum_filename, 'dl', old_data)).run() for line in old_data: line['checkin' + key['SeqNum']] = 'normal' for (k, item) in stu_list['checkin'].items(): if line['StuID'] == k: line['checkin' + key['SeqNum']] = item['Type'] if not info: print '您为班级%s创建第%s次考勤汇总表成功!' % (key['ClassID'], key['SeqNum']) return DataManage(DataManage.update, args=(self.sum_filename, 'w', old_data)).run()
def view(filename, stu_id, teacher_id, num, counter=None): stu_info = DataManage(DataManage.target_info, args=(filename,)).run() if not stu_info: print '该教师尚未统计此次的考勤汇总信息,所以无法查看结果' return False if num == 1: stu_info = AuxiliaryFunction().statistics_calculation(stu_info) name = DataManage(DataManage.target_info, args=('../InData/teacherInfo.csv', {'TeacherID': teacher_id})).run()[0]['TeacherName'] class_name = DataManage(DataManage.target_info, args=('../InData/courseInfo.csv', {'TeacherID': teacher_id})).run()[0]['CourseName'] if num == 1: for (k, item) in stu_info['checkin'].items(): if k == stu_id: print '%s老师在%s课上发起考勤,您在此次考勤状态为: %s' % (name, class_name, item['Type']) return True print '%s老师在%s课上发起考勤,您在此次考勤状态为: normal' % (name, class_name) else: length = len(stu_info[0].keys()) for info in stu_info: if info['StuID'] == stu_id: for index in range(1, length): print '%s老师在%s课上发起第%d次考勤,您在此次考勤状态为: %s' % (name, class_name, index, info['checkin'+str(index)]) counter[info['checkin'+str(index)]] = counter[info['checkin'+str(index)]]+1
def real_view(self, key): seq_info = DataManage(DataManage.target_info, args=('../InData/seq.csv',)).run() class_info = DataManage(DataManage.target_info, args=('../InData/courseInfo.csv', {'ClassName': key['ClassID']})).run() if not class_info: print '当前没有与您相关的课程!' return False data = {} for _class in class_info: if not data. has_key(_class['CourseID']): data[_class['CourseID']] = _class['TeacherID'] keys = data.keys() line = dict() for seq in seq_info: if seq['CourseID'] in keys: if seq['TeacherID'] == data[seq['CourseID']]: line = seq if not line: print '您最近还没有进行过一次完整的考勤!' return False filename = '../InData/' + line['TeacherID'] + '_' + line['CourseID'] + '_Sum.csv' keys = DataManage(DataManage.target_key, args=(filename,)).run() if keys and 'checkin'+line['SeqID'] in keys: pass else: filename = '../InData/'+line['TeacherID']+'_'+line['CourseID']+'_'+line['SeqID']+'_Detail.csv' self.view(filename, key['StuID'], line['TeacherID'] , line['SeqID'], None) return True
def maintain_info(key): # 手动维护考勤信息 seq_num = raw_input('请输入您需要修改哪一次的记录!') filename = '../InData/' + key['TeacherID'] + '_' + key[ 'CourseID'] + '_Sum.csv' stu_info_list = DataManage(DataManage.target_info, args=(filename, )).run() if not stu_info_list or 'checkin' + seq_num not in stu_info_list[ 0].keys(): print '该次考勤汇总表不存在请检查您的输入!' return False print '该次考勤所有学生的考勤状态如下:' for stu in stu_info_list: print stu['StuID'] + ' : ' + stu['checkin' + seq_num] stu_id = raw_input("请输入你要修改学生的学号!") count = 0 stu_info = {} for stu in stu_info_list: if stu['StuID'] == stu_id: stu_info = stu count = 1 break if not count: print '该学生不存在请检查您的输入!' return False print '该学生的该次的考勤状态 : %s' % (stu_info['checkin' + seq_num]) print '请按照以下选项输入状态 非法输入默认为缺勤!' print ' 1 正常 2 迟到 3 早退 4 缺勤 5 请假已批准' _type = raw_input('请输入你希望修改的值!') if _type not in ['1', '2', '3', '4', '5']: print '您输入了非法选项默认结果为缺勤!' stu_info['checkin' + seq_num] = 'Absence' else: stu_info['checkin' + seq_num] = { '1': 'normal', '2': 'Late', '3': 'leaveEarlier', '4': 'Absence', '5': 'approve' }[_type] print '修改成功!' return DataManage(DataManage.update, args=(filename, 'w', [stu_info], ['StuID'])).run()
def history(self, key): seq_info = DataManage(DataManage.target_info, args=('../InData/seq.csv',)).run() data = [] for seq in seq_info: if seq['ClassID'] == key['ClassID']: if seq['TeacherID'] not in data: data.append(seq['TeacherID']) if not data: print '您最近还没有进行过一次完整的考勤!' return False file_list = list() for line in data: filename = '../InData/' + line + '_' + key['ClassID'] + '_Sum.csv' file_list.append(filename) if not file_list: print '您的任何一位教师都尚未统计考勤汇总信息,所以无法查看结果' return False for index in range(len(data)): num = dict() num['normal'] = 0 num['Absence'] = 0 num['approve'] = 0 num['leaveEarlier'] = 0 print '第%d门课考勤信息如下:' % (index + 1) if self.view(file_list[index], key['StuID'], data[index], 0, num): print '您正常考勤%d次,缺勤%d次,请假%d次,早退%d次! 出勤率%.2f %%' %(num['normal'], num['Absence'], num['approve'], num['leaveEarlier'], 1.0 * num['normal'] / (num['normal'] + num['Absence'] + num['approve']+num['leaveEarlier'])) return True
def random_stu_list(self): now = datetime.datetime.now() if (now - self.start).seconds < self.time: print '当前自动考勤的仍然存在缓冲时间无法开启随机窗口,您可修改缓冲时间改变此设置!' return False stu_list = [] student_list = DataManage(DataManage.target_info, args=('../InData/studentInfo.csv', { 'ClassID': self.key['ClassID'] })).run() while True: num = raw_input('请输入需要抽点的百分比!') try: num = float(num) except TypeError and ValueError: print '您的输入不符合规则,请重新输入!' continue if num <= 0 or num > 100 or int( len(student_list) * num / 100) == 0: print '抽点的数量大于或小于当前学生的数量请重新输入!' time.sleep(1) else: num = int(len(student_list) * num / 100) print '抽点完成您此时共抽点了%-3d名学生!' % (num, ) break while len(stu_list) != num: index = random.randint(0, len(student_list) - 1) if student_list[index] not in stu_list: stu_list.append(student_list[index]) return stu_list
def course_operation(out_file, path=''): course_data = DataManage(DataManage.target_info, args=(out_file, )).run() if not course_data: return None new_data = [] try: for line in course_data: major = line['ClassNums'] info = major.split(',') for inf in info: class_info = re.findall(r'\d+', inf) class_interval = len(class_info) if class_interval == 0: continue else: begin = int(class_info[0]) end = int(class_info[-1]) major_info = re.findall('[^-0-9]+', inf) # 匹配非数字和 - class_name = major_info[0] for i in range(begin, end + 1): dict_line = dict() dict_line['CourseID'] = line['CourseID'] dict_line['CourseName'] = line['CourseName'] dict_line['TeacherID'] = line['TeacherID'] dict_line['ClassName'] = class_name + str(i) new_data.append(dict_line) except KeyError: print '存在非法键值无法导入!' return False return new_data
def get_all_rate(self, key): filename = '../InData/' + key['TeacherID'] + '_' + key[ 'CourseID'] + '_Sum.csv' class_info = DataManage(DataManage.target_info, args=(filename, )).run() if not class_info: print '课程考勤统计信息不存在请检查您的输入!' return False count = len(class_info[0].keys()) if count < 2: print '该课程没有进行过统计无法显示结果' return False result = 0.0 for index in range(1, count): grade = self.get_count_rate(key, index) if grade == -1.0: count -= 1 continue if type(grade) == float: result = result + grade else: return False print '%-10s课平均考勤出勤率为:%-3.2f %%' % (key['course_info'][ key['CourseID']]['CourseName'], 1.0 * result / count) return True
def start_auto(self): if self.status: print ' 当前已经存在自动考勤窗口无法再次开启!' return False if not self.get_time(): return False stu_list = DataManage(DataManage.target_info, args=('../InData/studentInfo.csv', { 'ClassID': self.key['ClassID'] })).run() self.write_seq() stu_list = self.init_data(stu_list, 'auto') self.status = True return DataManage(DataManage.update, args=(self.filename, 'w', stu_list)).run()
def historical_statistics(self): # 这里的键值包括TeacherID和老师要统计的班级和次序号 stu_info = DataManage(DataManage.target_info, args=(self.detail_filename, )).run() all_stu_info = self.statistics_calculation(stu_info) for (key, item) in all_stu_info['checkin'].items(): if item['Type'] == 'Submitted': self.take_leave_absence({'StuID': key}) return True
def man_check_in(self): # 手动考勤 stu_info = DataManage(DataManage.target_info, args=('../InData/studentInfo.csv', { 'ClassID': self.key['ClassID'] })).run() if not stu_info: print '当前班级不存在请重新输入!' return False self.write_seq() print '请按照以下选项输入状态 非法输入默认为缺勤!' print ' 1 正常 2 迟到 3 早退 4 缺勤 5 请假已批准' stu_list = self.init_data(stu_info, 'man') return DataManage(DataManage.update, args=(self.filename, 'w', stu_list)).run()
def import_file(source_file, out_file, _format=None, primary_key=None, operation=None, path=''): if operation: data = operation(out_file, path) if not data: print '文件不存在或与标准形式不符,请检查您的输入!' return False else: data = DataManage(DataManage.target_info, args=(out_file, )).run() error = DataManage(DataManage.format_check, args=(data, _format)).run() if DataManage(DataManage.get_result, args=(error, )).run(): for (key, item) in error.items(): print key, item Log().add(error) return False for key in primary_key: DataManage(DataManage.update, args=(source_file, 'w', data, key)).run() data = DataManage(DataManage.target_info, args=(source_file, )).run() return True
def init(self, key): self.sum_filename = '../InData/' + key['TeacherID'] + '_' + key[ 'ClassID'] + '_' + 'Sum.csv' if not DataManage(DataManage.target_key, args=(self.sum_filename, )).run(): result = [] stu_list = DataManage(DataManage.target_info, args=('../InData/studentInfo.csv', { 'ClassID': key['ClassID'] })).run() for k in stu_list: sum_dict = dict() sum_dict['StuID'] = k['StuID'] result.append(sum_dict) return DataManage(DataManage.update, args=(self.sum_filename, 'w', sum)).run() return True
def get_seq_num(self): seq_info = DataManage(DataManage.target_info, args=('../InData/seq.csv', { 'TeacherID': self.key['TeacherID'], 'ClassID': self.key['ClassID'] })).run() if not seq_info: return '1' return str(int(seq_info[-1]['SeqID']) + 1)
def start_random(self): if not self.status: print ' 当前没有开启自动考勤无法进行抽点考勤!' return False self.random_info = self.random_stu_list() if not self.random_info: return False stu_list = self.init_data(self.random_info, 'random') return DataManage(DataManage.update, args=(self.filename, 'a', stu_list)).run()
def auto_cal(self, stu_info): if DataManage(DataManage.target_info, args=(self.filename, { 'StuID': stu_info['StuID'], 'checkinType': 'leave' })).run(): print '您在该次考勤中已经申请过请假无法进行考勤!' return False if self.counter['auto'][stu_info['StuID']] == 0: print '您当前进行自动考勤次数已经用完无法考勤!' return False self.counter['auto'][stu_info['StuID']] -= 1 data = DataManage(DataManage.target_info, args=(self.filename, { 'checkinType': 'auto', 'StuID': stu_info['StuID'] })).run()[0] if data['IsSucc'] == 'True': print '您已经完成自动考勤无法再次考勤!' return False data['checkTime'] = datetime.datetime.now() data['ProofPath'] = stu_info['ProofPath'] num = random.randint(0, 1) if num: data['IsSucc'] = 'True' seconds = (data['checkTime'] - self.start).seconds if seconds <= self.time: print '考勤成功!' data['checkinResult'] = 'normal' else: print '考勤有效时间已过您当前为迟到!' data['checkinResult'] = 'Late' else: print '身份验证失败! 您还有 %d 次机会 ' % ( self.counter['auto'][stu_info['StuID']]) data['checkTime'] = str(datetime.datetime.now())[:-7] return DataManage(DataManage.update, args=(self.filename, 'w', [data], ['StuID', 'checkinType'])).run()
def maintain_stu(self, key): # 手动维护学生信息 class_info = DataManage(DataManage.target_info, args=('../InData/courseInfo.csv', { 'TeacherID': key['TeacherID'] })).run() class_list = set() for line in class_info: class_list.add(line['ClassName']) class_list = list(class_list) stu_info = DataManage(DataManage.target_info, args=('../InData/studentInfo.csv', )).run() for stu in stu_info: if stu['ClassID'] not in class_list: stu_info.remove(stu) stu_id = raw_input('请输入学生的学号!') info = {} for stu in stu_info: if stu['StuID'] == stu_id: info = stu break if not info: print '该学生不在你的修改范围之内无法修改!' return False info = self.get_result(class_list, info) error = DataManage(DataManage.format_check, args=([info], { "StuID": '^[\d]{12}$', "StuName": '^[\x80-\xff]{6,18}$', "WeChatID": '^[a-zA-Z0-9_]+$', "ClassID": '[\x80-\xff]+\d{4}$' })).run() if DataManage(DataManage.get_result, args=(error, )).run(): print error print '您输入的格式错误无法修改学生信息!' return False DataManage(DataManage.update, args=('../InData/studentInfo.csv', 'dl', [info])).run() print '修改学生信息成功!' return DataManage(DataManage.update, args=('../InData/studentInfo.csv', 'w', [info ])).run()
def view_time(self, key): # 输入教师教工号和班级号的字典 查看最近历史的一次考勤 seq_info = DataManage(DataManage.target_info, args=('../InData/seq.csv', )).run() line = {} for seq in seq_info: if seq['TeacherID'] == key['TeacherID']: line['TeacherID'] = seq['TeacherID'] line['ClassID'] = seq['ClassID'] line['seqnum'] = seq['SeqID'] if not line: print '您还没有完整的进行过一次考勤!' return False filename = '../InData/' + line['TeacherID'] + '_' + line[ 'ClassID'] + '_' + line['seqnum'] + '_Detail.csv' stu_info = DataManage(DataManage.target_info, args=(filename, )).run() return self.dis_play(stu_info)
def read_rule(key): rule = DataManage(DataManage.target_info, args=('../InData/set.csv', { 'TeacherID': key['TeacherID'] })).run() if not rule: return {'TeacherID': key['TeacherID'], 'bufferTime': '3'} else: return rule[0]
def teacher_test(key): # 输入微信号和班级 进行验证 teacher_info = DataManage(DataManage.target_info, args=('../InData/teacherInfo.csv', { 'WeChatID': key })).run() if not teacher_info: print '教师微信不存在请检查您的输入信息!' return False return teacher_info[0]
def random_cal(self, stu_info): if DataManage(DataManage.target_info, args=(self.filename, { 'StuID': stu_info['StuID'], 'checkinType': 'leave' })).run(): print '您在该次考勤中已经申请过请假无法进行考勤!' return False if self.counter['random'][stu_info['StuID']] == 0: print '您当前进行随机考勤次数已经用完无法考勤!' return False data = DataManage(DataManage.target_info, args=(self.filename, { 'checkinType': 'random', 'StuID': stu_info['StuID'] })).run() self.counter['random'][stu_info['StuID']] -= 1 if data[-1]['IsSucc'] == 'True': print '您已经完成随机考勤无法再次考勤' return False DataManage(DataManage.update, args=(self.filename, 'dl', data, ['StuID', 'checkinType'])).run() data[-1]['ProofPath'] = stu_info['ProofPath'] num = random.randint(0, 1) if num: data[-1]['IsSucc'] = 'True' print '随机考勤成功!' data[-1]['checkinResult'] = 'normal' else: print '身份验证失败! 您还有 %d 次机会 ' % ( self.counter['random'][stu_info['StuID']]) data[-1]['checkTime'] = str(datetime.datetime.now())[:-7] return DataManage(DataManage.update, args=(self.filename, 'a', data)).run()
def stu_operation(out_file, path): data = DataManage(DataManage.target_info, args=(out_file, )).run() if not data: return None try: for line in data: line['FeaturePath'] = path + '/' + line[ 'WeChatID'] + '_face.bin(jpg)' except KeyError: print '存在非法键值无法导入!' return False return data
def statistics_calculation(self, stu_info_list, _type=''): # 给定一定数量的学生考勤信息计算该信息内所有学生的考勤结果 absence = {} keys = { 'null': 0, 'normal': 1, 'Late': 2, 'leaveEarlier': 3, 'Absence': 4, 'Submitted': 5, 'approve': 6 } for stu in stu_info_list: info = {} if absence.has_key(stu['StuID']): continue else: absence[stu['StuID']] = info info['Type'] = 'null' info['StuName'] = DataManage(DataManage.target_info, args=('../InData/studentInfo.csv', { 'StuID': stu['StuID'] })).run()[0]['StuName'] if not _type: _type = 'checkinResult' for stu in stu_info_list: info = absence[stu['StuID']] if keys[info['Type']] < keys[stu[_type]]: if info['Type'] == 'null': info['Type'] = stu[_type] elif info['Type'] == 'normal' or info['Type'] == 'Late': if stu[_type] == 'Absence': info['Type'] = 'leaveEarlier' else: info['Type'] = stu[_type] elif info['Type'] == 'leaveEarlier' or info[ 'Type'] == 'Absence': if keys[stu[_type]] >= 5: info['Type'] = stu[_type] else: continue else: info['Type'] = stu[_type] else: if info['Type'] == 'Absence': if stu[_type] == 'normal' or stu[_type] == 'Late': info['Type'] = 'Late' continue return self.__calculation(absence)
def stu_info_test(key): stu_info = DataManage(DataManage.target_info, args=('../InData/studentInfo.csv', { 'WeChatID': key })).run() if not stu_info: print '学生微信不存在请检查您的输入信息!' return False return stu_info[0]
def get_count_rate(self, key, num): # 给定教师ID和课程返回平均出勤率 若给定num显示哪一次的 try: num = int(num) except TypeError and ValueError: print '数据无效,请您输入正整数!' return False class_info = DataManage(DataManage.target_info, args=('../InData/courseInfo.csv', { 'TeacherID': key['TeacherID'], 'CourseName': key['CourseName'] })).run() if not class_info: print '课程信息不存在请检查您的输入!' return False class_list = [] for line in class_info: if line['ClassName'] not in class_list: class_list.append(line['ClassName']) # 得到所有的班级名称 seq_info = DataManage(DataManage.target_info, args=('../InData/seq.csv', )).run() count = 0 for seq in seq_info: if seq['TeacherID'] == key["TeacherID"]: if seq['ClassID'] in class_list: count = count + 1 if count == num: key['ClassID'] = seq['ClassID'] key['seqnum'] = seq['SeqID'] grade = self.get_att_rate(key) print '%-10s课第%2d次是对班级: %-10s发起,考勤的出勤率为%-3.2f %%' \ % (key['CourseName'], count, key['ClassID'], grade) return grade print '该次课程不存在第%d次考勤,请检查您的输入!' % (num, ) return False