def setContribution(user, contribution): def validateContribution(c): # Method 1: return c >= 0.4 and c <= 1.6 # Method 2: # C = [0.4, 0.6, 0.8, 1.0, 1.2] # return c in C if not isinstance(user, User): return None if not validateContribution(contribution): log('设定的个人贡献比例不在值范围', 'teamutils', LOG_LEVEL.ERROR) return False # enroll = Enroll.objects.filter(user=user).first() my_member = Member.objects.filter(user=user).first() team = my_member.team print(team) members = Member.objects.filter(team=team) # print("curC") # print(curContrib) # if curContrib > maxContrib: # log('团队总贡献度超额', 'teamutils', LOG_LEVEL.ERROR) # return False Member.objects.filter(user=user).update(contribution=contribution) log('setContribution OK', 'teamutils', LOG_LEVEL.INFO)
def writeAttendanceReport(file, course_id, attendance=None): if attendance is None: attendance = showToday() users_att = [att.user for att in attendance] log(users_att, 'writeAttendanceReport') work_book = Workbook() ws = work_book.get_active_sheet() ws.cell(row=1, column=1).value = '学号' ws.cell(row=1, column=2).value = '姓名' ws.cell(row=1, column=3).value = '签到' num = 2 enrolls = Enroll.objects.filter(course_id=course_id) users = [enr.user for enr in enrolls] for user in users: if isStudent(user): ws.cell(row=num, column=1).value = str(user.username) ws.cell(row=num, column=2).value = str(user.name) if user in users_att: ws.cell(row=num, column=3).value = '1' else: ws.cell(row=num, column=3).value = '0' num += 1 work_book.save(filename=file)
def isEnrolledIn(user, course): if not isinstance(user, User) or not isinstance(course, Course): return None if user.role != 'student' and user.role != 'teacher': log('不是学生/老师', 'authUtils', LOG_LEVEL.ERROR) return False return Enroll.objects.filter(user=user, course=course).count() > 0
def isMemberOf(user, team): if not isinstance(user, User) or not isinstance(team, Team): return None if user.role != 'student': log('不是学生', 'authUtils', LOG_LEVEL.ERROR) return False return Member.objects.filter(user=user, team=team).count() > 0
def transferLeadership(team, user): if not isinstance(team, Team) or not isinstance(user, User): return None if user.role != 'student': log('不是学生', 'teamutils', LOG_LEVEL.ERROR) return False Member.objects.filter(team=team, role='leader').update(role='member') Member.objects.filter(team=team, user=user).update(role='leader') return True
def auditTeamRejected(team): if not isinstance(team, Team): return None if team.status != 'auditing': log('未提交申请', 'teamutils', LOG_LEVEL.ERROR) return False team.status = 'rejected' team.save() return team
def test(): log('='*50) log('File Utils Unit Test') fs = File.objects.filter() for f in fs: log(docPreviewUrl(f.file.url[1:]), 'docPreviewUrl') log(fileDownloadUrl(f.file.url[1:]), 'fileDownloadUrl') log('='*50)
def leaveTeam(user): if not isinstance(user, User): return None member = Member.objects.filter(user=user) if not member: log('未加入任何团队', 'teamutils', LOG_LEVEL.ERROR) return False member.delete() return True
def addAttendance(user): if not isinstance(user, User): return None if user.role != 'student': log('不是学生', 'attendanceUtils', LOG_LEVEL.ERROR) return False attendence = Attendance() attendence.user = user attendence.save() return attendence
def docPreviewUrl(path): f = os.path.basename(path) if not isOfficeFile(f): log(f + '不是office文档文件', 'docPreviewUrl', LOG_LEVEL.ERROR) return '#' url = os.path.join(URL_BASE, path) url = urllib.parse.quote(url) url = URL_API + url log(url, 'docPreviewUrl') return url
def isTeamMember(user): if not isinstance(user, User): return None if user.role != 'student': log('不是学生', 'authUtils', LOG_LEVEL.ERROR) return False if not Member.objects.filter(user=user).count() > 0: log('未加入团队', 'authUtils', LOG_LEVEL.ERROR) return False memberships = Member.objects.filter(user=user).first() return memberships.role == 'member'
def dismissTeam(team): if not isinstance(team, Team): return None if team.status == 'passed': log('团队已通过审核', 'teamutils', LOG_LEVEL.ERROR) return False members = Member.objects.filter(team=team) for member in members: member.delete() team.delete() return True
def sumGradeStudent(user): if not isinstance(user, User): return None member = Member.objects.filter(user=user).first() if not member: log('未加入任何团队', 'statisticsUils', LOG_LEVEL.ERROR) return False contrib = member.contribution if not contrib: log('未设置个人贡献度', 'statisticsUils', LOG_LEVEL.INFO) return 0 return contrib * (sumGradeTeam(member.team) or 0.0)
def addNotice(title, content, user): if not isinstance(user, User): return None if title == '' or title is None or content == '' or content is None: log('标题/内容不能为空', 'noticeUtils', LOG_LEVEL.ERROR) return False notice = Notice() notice.title = title notice.content = content notice.user = user notice.save() return notice
def auditMemberPassed(user): if not isinstance(user, User): return None member = Member.objects.filter(user=user).first() if not member: log('未加入任何团队', 'teamutils', LOG_LEVEL.ERROR) return False if not member.role == 'newMoe': log('不是新人', 'teamutils', LOG_LEVEL.ERROR) return False member.role = 'member' member.save() return member
def joinTeam(user, team): if not isinstance(team, Team) or not isinstance(user, User): return None if team.status != 'incomplete' or user.role != 'student': log('团队已冻结/不是学生', 'teamutils', LOG_LEVEL.ERROR) return False if Member.objects.filter(user=user).count() > 0: log('已经是队长或成员', 'teamutils', LOG_LEVEL.ERROR) return False member = Member() member.user = user member.team = team member.role = 'newMoe' member.save() return member
def createTeam(user, name): if not isinstance(user, User): return None if user.role != 'student': log('不是学生', 'teamutils', LOG_LEVEL.ERROR) return False if Member.objects.filter(user=user).count() > 0: log('已经是队长或成员', 'teamutils', LOG_LEVEL.ERROR) return False team = Team() team.course = Enroll.objects.get(user=user).course team.name = name team.status = 'incomplete' team.save() member = Member() member.user = user member.team = team member.role = 'leader' member.save() return team, member
def setContribution(user, contribution): def validateContribution(c): # Method 1: return c >= 0.4 and c <= 1.6 # Method 2: # C = [0.4, 0.6, 0.8, 1.0, 1.2] # return c in C if not isinstance(user, User): return None if not validateContribution(contribution): log('设定的个人贡献比例不在值范围', 'teamutils', LOG_LEVEL.ERROR) return False enroll = Enroll.objects.filter(user=user).first() team = Team.objects.filter(course=enroll.course).first() members = Member.objects.filter(team=team) maxContrib = members.count() curContrib = 0 curContrib += contribution if curContrib > maxContrib: log('团队总贡献度超额', 'teamutils', LOG_LEVEL.ERROR) return False Member.objects.filter(user=user).update(contribution=contribution) log('setContribution OK', 'teamutils', LOG_LEVEL.INFO) return curContrib + contribution
def auditTeamPassed(team): if not isinstance(team, Team): return None if team.status != 'auditing': log('未提交申请', 'teamutils', LOG_LEVEL.ERROR) return False teams = Team.objects.filter(course=team.course) idnum = 1 if teams.count() > 0: idnum = teams[0].serialNum for team in Team.objects.filter(course=team.course): if team.serialNum > idnum: idnum = team.serialNum idnum += 1 team.status = 'passed' print(idnum) team.serialNum = idnum team.save() print(team.name) print(team.status) print(team.serialNum) return team
def submitTeam(team): if not isinstance(team, Team): return None if team.status != 'unsubmitted': log('未审核且已冻结的团队才能提交申请', 'teamutils', LOG_LEVEL.ERROR) return False num = Member.objects.filter(team=team).count() # print(num) # if num < team.course.teamMeta.minNum or num > team.course.teamMeta.maxNum: # log('不在人数限制范围', 'teamutils', LOG_LEVEL.ERROR) # return False users = reportTeam(team) users['member'].append(users['leader']) num = 0 for person in users['member']: if person.user.gender == 'female': num += 1 if num > 1: log('性别要求不合', 'teamutils', LOG_LEVEL.ERROR) return False team.status = 'auditing' team.save() return team
def fileDownloadUrl(path): url = urllib.parse.quote(path) url = os.path.join(URL_BASE, url) log(url, 'fileDownloadUrl') return url