def newSprintPost(handler, p_project, p_name, p_start, p_end, p_members = None, p_private = False, p_hidden = False): def die(msg): print msg done() handler.wrappers = False p_project = int(p_project) if not handler.session['user']: die("You must be logged in to create a new sprint") project = Project.load(p_project) if not project: die("Unknown project ID: %d" % p_project) if p_name == '': die("The sprint name cannot be empty") try: start = re.match("^(\d{1,2})/(\d{1,2})/(\d{4})$", p_start) if not start: raise ValueError month, day, year = map(int, start.groups()) start = datetime(year, month, day) except ValueError: die("Malformed start date: %s" % stripTags(p_start)) try: end = re.match("^(\d{1,2})/(\d{1,2})/(\d{4})$", p_end) if not end: raise ValueError month, day, year = map(int, end.groups()) end = datetime(year, month, day, 23, 59, 59) except ValueError: die("Malformed end date: %s" % stripTags(p_end)) msg = Sprint.validateDates(start, end) if msg: die(msg) members = set(User.load(int(memberid)) for memberid in p_members) if None in members: die("Unknown username") if handler.session['user'] not in members: die("The scrummaster (%s) must be a sprint member" % handler.session['user']) sprint = Sprint(project.id, p_name, handler.session['user'].id, dateToTs(start), dateToTs(end)) sprint.members |= members if p_private or p_hidden: sprint.flags.add('private') if p_hidden: sprint.flags.add('hidden') sprint.save() # Make a default 'Miscellaneous' group so there's something to add tasks to Group(sprint.id, 'Miscellaneous', 1, False).save() # Make the standard set of sprint goals Goal.newSet(sprint) handler.responseCode = 299 print "/sprints/%d" % sprint.id Event.newSprint(handler, sprint)