def adminProjects(handler): handler.title('Project Management') requirePriv(handler, 'Admin') print "<style type=\"text/css\">" print "table.list td.right > * {width: 400px;}" print "table.list td.right button {width: 200px;}" # Half of the above value print "</style>" undelay(handler) print "<h3>New Project</h3>" print "<form method=\"post\" action=\"/admin/projects\">" print "<table class=\"list\">" print "<tr><td class=\"left\">Name:</td><td class=\"right\"><input type=\"text\" name=\"name\"></td></tr>" print "<tr><td class=\"left\"> </td><td class=\"right\">" print Button('Save', id = 'save-button', type = 'submit').positive() print Button('Cancel', type = 'button', url = '/admin').negative() print "</td></tr>" print "</table>" print "</form>" print "<h3>Current Projects</h3>" for project in Project.getAllSorted(handler.session['user']): print "<a href=\"/admin/projects/%d\">%s</a><br>" % (project.id, project.safe.name)
def newTaskImport(handler, group, source=None, assigned=None): # 'assigned' is ignored, it's just in case the user gets here from a filtered backlog handler.title("New Tasks") requirePriv(handler, "User") id = int(group) print tabs.format(id).where("import") group = Group.load(id) if not group or group.sprint.isHidden(handler.session["user"]): ErrorBox.die("Invalid Group", "No group with ID <b>%d</b>" % id) sprint = group.sprint if not (sprint.isActive() or sprint.isPlanning()): ErrorBox.die("Sprint Closed", "Unable to modify inactive sprint") elif not sprint.canEdit(handler.session["user"]): ErrorBox.die("Permission Denied", "You don't have permission to modify this sprint") sprints = sprint.project.getSprints() sprintIdx = sprints.index(sprint) prevSprint = sprints[sprintIdx - 1] if sprintIdx > 0 else None if not source: print "Select a sprint to import from:<br><br>" print '<form method="get" action="/tasks/new/import">' print '<input type="hidden" name="group" value="%d">' % group.id print '<select name="source" id="import-source">' for projectIter in Project.getAllSorted(handler.session["user"], sprint.project): print '<optgroup label="%s">' % projectIter.safe.name for sprintIter in projectIter.getSprints(): print '<option value="%d"%s>%s</option>' % ( sprintIter.id, " selected" if sprintIter == prevSprint else "", sprintIter.safe.name, ) print "</optgroup>" print "</select>" print "<br><br>" print Button("Next").positive().post() print "</form>" else: id = int(source) source = Sprint.load(id) if not source: ErrorBox.die("Invalid Sprint", "No sprint with ID <b>%d</b>" % id) print '<script type="text/javascript">' nextURL = "/sprints/%d" % sprint.id if assigned: nextURL += "?search=assigned:%s" % stripTags(assigned.replace(" ", ",")) print "next_url = %s;" % toJS(nextURL) print 'post_url = "/tasks/new/import?group=%d&source=%d";' % (group.id, source.id) print "scrummaster = %s;" % toJS(sprint.owner.username) print "TaskTable.init();" print "</script>" print '<b>Source sprint</b>: <a href="/sprints/%d">%s</a><br>' % (source.id, source.name) print '<b>Target sprint</b>: <a href="/sprints/%d">%s</a><br><br>' % (sprint.id, sprint.name) print "All incomplete tasks are listed here, with their current values from the source sprint. You can change any of the fields before importing. Only checked tasks will be imported<br><br>" assignedList = [sprint.owner] + list(sprint.members - {sprint.owner}) print TaskTable( source, editable=True, assignedList=assignedList, checkbox=True, status=True, name=True, assigned=True, hours=True, debug=isDevMode(handler), ) print InfoBox("Loading...", id="post-status", close=True) print Button("Import", id="save-button", type="button").positive() print Button("Cancel", id="cancel-button", type="button").negative() print "</form><br><br>"
def projectsList(handler): undelay(handler) print '<div class="project-list">' print '<div class="buttons">' print Button("Calendar", "/projects/calendar") print "</div>" for project in Project.getAllSorted(handler.session["user"]): sprints = filter(lambda sprint: not sprint.isHidden(handler.session["user"]), project.getSprints()) active, inactive = partition(lambda sprint: sprint.isActive() or sprint.isPlanning(), reversed(sprints)) activeMembers = set() for sprint in active: activeMembers |= sprint.members isTest = project.id < 0 classes = ["project-summary"] if len(active) > 0: classes.append("active") if isTest: classes.append("test") print '<div id="project-summary-%d" class="%s">' % (project.id, " ".join(classes)) print '<div class="project-name">%s</div>' % project.name print '<div class="buttons">' print Button("new sprint", "/sprints/new?project=%d" % project.id).mini() print Button("export", "/sprints/export?project=%d" % project.id).mini() print Button("active", "/sprints/active?project=%d" % project.id).mini() if handler.session["user"] and handler.session["user"].hasPrivilege("Admin"): print Button("manage", "/admin/projects/%d" % project.id).mini().negative() print "</div>" print '<div class="project-members %s">' % ("short" if len(inactive) <= 6 or len(active) == 0 else "long") members = set(project.getMembers()) scrummasters = set(sprint.owner for sprint in active) for member in sorted(scrummasters): print '<div class="member scrummaster">%s</div>' % member.str("scrummaster") for member in sorted(activeMembers - scrummasters): print '<div class="member active">%s</div>' % member.str("member") for member in sorted(members - activeMembers - scrummasters): print '<div class="member inactive">%s</div>' % member.str("member") print "</div>" if sprints: def printSprint(sprint): if sprint.isActive() or sprint.isPlanning(): print '<div class="sprint-active">' print '<div class="sprint-name">%s</div>' % sprint.link(handler.session["user"], "sprint-large") print '<div class="sprint-time">' if sprint.isPlanning(): print '<span class="label danger">Planning</span>' elif sprint.isReview(): print '<span class="label success">Review</span>' else: day = Weekday.today().date() sprintDays = [i.date() for i in sprint.getDays()] print '<span class="label primary">Day %d of %d</span>' % ( sprintDays.index(day) + 1, len(sprintDays), ) print "</div><br>" for tab in sprintTabs().group("").values(): print '<a href="%s">%s</a>' % (tab.getPath(sprint.id), tab.getDisplayName().lower()) if handler.session["user"] in sprint.members: print '<a href="/sprints/%d?search=assigned:me">your tasks</a>' % sprint.id print "</div>" else: print '<div class="sprint-summary">%s <span class="sprint-time">(%s - %s)</span></div>' % ( sprint.link(handler.session["user"]), sprint.getStartStr(), sprint.getEndStr(), ) print '<div class="sprint-summaries">' map(printSprint, active) if len(inactive) <= 6: map(printSprint, inactive) else: map(printSprint, inactive[:5]) print '<div class="show-old-sprints">(%d more)</div>' % (len(inactive) - 5) print '<div class="old-sprints">' map(printSprint, inactive[5:]) print "</div>" print "</div>" else: print " " print '<div class="clear"></div>' print "</div>" print "</div>"