def save(self, request, commit=True, *args, **kwargs): logger = logging.getLogger("alliance") logger.debug("Inside BacklogNewForm save") results = {'success': False} results['errors'] = None logger.debug(results) backlog = super(BacklogNewForm, self).save(commit=False, *args, **kwargs) backlog.story_title = self.cleaned_data['story_title'] backlog.story_descr = self.cleaned_data['story_descr'] backlog.priority = self.cleaned_data['priority'] backlog.module = "backlog" teamNameFromRequest = request.session.get('teamName') logger.debug(teamNameFromRequest) if 'All Megastars' == teamNameFromRequest: backlog.github_repo = "alliance-community" elif 'North Stars' == teamNameFromRequest: backlog.github_repo = "nexus-community" elif 'Belatrix Stars' == teamNameFromRequest: backlog.github_repo = "bigbluebutton-community" else: backlog.github_repo = "test-community" logger.debug(backlog.github_repo) backlog.status = get_object_or_none(Status, category='backlog', name='open') if backlog.status is None: logger.debug("Status is None") results[ 'errors'] = "Missing Status to Save Backlog. Please contact your administrator." backlog.team = get_object_or_none(Team, id=request.session.get('team')) if backlog.team is None: logger.debug("Team is None") results[ 'errors'] = "Missing Team to Save Backlog. Please contact your administrator." backlog.project = get_object_or_none(Project, id=project_id_list( request.session.get('team'))) if backlog.project is None: logger.debug("Project is None") results[ 'errors'] = "Team is missing Project association and hence not authorized to add backlog. Please contact your administrator." if results['errors'] is None: logger.debug("results errors is None") if commit: backlog = backlog.save() results['success'] = True return results else: return results
def evulateAcceptedVelocity(self, request, teamId): logger = logging.getLogger("alliance") # Accepted Velocity for current/recent sprint : START statusFlag = 'OPEN' priorityFlag = '9' backlogs = retrieve_backlogs_by_project_status_and_priority(teamId, statusFlag, priorityFlag) \ .order_by('project__name', 'module', 'sprint_id', 'priority', 'id') acceptedSprint = 0 acceptedEstimate = 0 acceptedEstimateVel = 0 for backlog in backlogs: estimate = get_object_or_none(Estimate, team_id=teamId, backlog_id=backlog.id) if not estimate: estimate = Estimate(team_id=teamId, backlog_id=backlog.id) acceptedSprint = backlog.sprint_id acceptedEstimate = estimate.estimate logger.debug(estimate) logger.debug(acceptedEstimate) if not acceptedEstimate: acceptedEstimate = 0 logger.debug("Accepted Estimate is EMPTY. Resetting to ZERO(0) ", acceptedEstimate) if acceptedSprint != None and acceptedEstimate != None: acceptedEstimateVel += int(acceptedEstimate) return acceptedEstimateVel
def update_backlog_and_acc_cri(self, request, results): from ...backlog.forms import AcceptanceCriteriaFormSet, BacklogUpdateForm backlog_id = request.POST.get('backlog-id') backlog = get_object_or_none(Backlog, id=backlog_id) form = BacklogUpdateForm(request.POST, prefix='backlog', instance=backlog) prefix = 'acceptance-criteria-%d' % backlog.id formset = AcceptanceCriteriaFormSet(request.POST, instance=backlog, prefix=prefix) if form.is_valid(): if formset.is_valid(): backlog = form.save() backlog.refresh_from_db() formset.save() formset = AcceptanceCriteriaFormSet(instance=backlog, prefix=prefix) html = render_to_string('backlog/acc_cri_par.txt', {'form': form, 'formset': formset}) results['html'] = html results['mgt_fields'] = formset.management_form.as_p() results['update_dttm'] = localtime(backlog.update_dttm) results['success'] = True else: results['errors'] = formset.non_form_errors() else: results['errors'] = form.errors.as_json()
def post(self, request): logger = logging.getLogger("alliance") logger.debug("Inside CheckBacklogsView") result = {'outdated': False} team_id = request.session.get('team') ui_backlogs = json.loads(request.body).get("backlogs") if ui_backlogs and team_id: ui_backlogs_count = len(ui_backlogs) paginator_count = request.session.get('paginatorCount') # Same query executed in the BacklogView class statusFlag = request.session.get('statusFlag') priorityFlag = request.session.get('priorityFlag') logger.debug(team_id) logger.debug(statusFlag) logger.debug(priorityFlag) db_backlogs_count = \ retrieve_backlogs_by_project_status_and_priority(team_id, statusFlag, priorityFlag)\ .count() logger.debug(db_backlogs_count) logger.debug(ui_backlogs_count) logger.debug(paginator_count) # If the number of backlogs displayed to the user # differs from the number that exists into database # then user must refresh his/her page. if (paginator_count != db_backlogs_count): result['outdated'] = True else: # Otherwise we must compare the last update time # of each backlog displayed to the user with those # existing into database. for ui_backlog in ui_backlogs: backlog_id = ui_backlog.get('id') backlog = get_object_or_none(Backlog, id=backlog_id) result['outdated'] = backlog is None # Database datetime has greater precision than # the one brought from ui so we add a timedelta, # otherwise the page that executed the update # would show the message of requested refresh. ui_last_update = parse_datetime( ui_backlog.get('lastUpdated')) db_last_update = backlog.update_dttm if not ui_last_update and db_last_update: result['outdated'] = True elif db_last_update: ui_last_update += datetime.timedelta(milliseconds=500) if db_last_update > ui_last_update: result['outdated'] = True return JsonResponse(result)
def update_estimate(self, request, results, team_id): from ...backlog.forms import EstimateForm backlog_id = request.POST.get('estimate-backlog_id') estimate = get_object_or_none(Estimate, team_id=team_id, backlog_id=backlog_id) form = EstimateForm(request.POST, prefix='estimate', instance=estimate) if form.is_valid(): form.save() # TODO: What is happening in the next 3 lines?? backlog = Backlog.objects.get(id=backlog_id) backlog.save() # No need to save, we haven't made any changes backlog.refresh_from_db() # No need to get an update from the db, we just got this object results['update_dttm'] = localtime(backlog.update_dttm) results['success'] = True else: results['errors'] = form.errors.as_json()
def update_estimate(self, request, results, team_id): from ...backlog.forms import EstimateForm backlog_id = request.POST.get('estimate-backlog_id') estimate = get_object_or_none(Estimate, team_id=team_id, backlog_id=backlog_id) form = EstimateForm(request.POST, prefix='estimate', instance=estimate) if form.is_valid(): form.save() backlog = Backlog.objects.get(id=backlog_id) backlog.save() backlog.refresh_from_db() results['update_dttm'] = localtime(backlog.update_dttm) results['success'] = True else: results['errors'] = form.errors.as_json()
def post(self, request): result = {'outdated': False} team_id = request.session.get('team') ui_backlogs = json.loads(request.body).get("backlogs") if ui_backlogs and team_id: ui_backlogs_count = len(ui_backlogs) # Same query executed in the BacklogView class db_backlogs_count = \ retrieve_backlogs_by_status_project_and_priority(team_id)\ .count() # If the number of backlogs displayed to the user # differs from the number that exists into database # then user must refresh his/her page. if (ui_backlogs_count != db_backlogs_count): result['outdated'] = True else: # Otherwise we must compare the last update time # of each backlog displayed to the user with those # existing into database. for ui_backlog in ui_backlogs: backlog_id = ui_backlog.get('id') backlog = get_object_or_none(Backlog, id=backlog_id) result['outdated'] = backlog is None # Database datetime has greater precision than # the one brought from ui so we add a timedelta, # otherwise the page that executed the update # would show the message of requested refresh. ui_last_update = parse_datetime( ui_backlog.get('lastUpdated')) db_last_update = backlog.update_dttm if not ui_last_update and db_last_update: result['outdated'] = True elif db_last_update: ui_last_update += datetime.timedelta( milliseconds=500) if db_last_update > ui_last_update: result['outdated'] = True return JsonResponse(result)
def get(self, request): # Get the volunteers team team_id = request.session.get('team') # Redirects to the index page if there is no team associated if team_id is None: return redirect(reverse('index')) # From here now we have all we need to list the backlogs backlogs = retrieve_backlogs_by_status_project_and_priority(team_id)\ .order_by('project__name', 'priority', 'module', 'id') backlog_tuple = [] from ...backlog.forms import AcceptanceCriteriaFormSet, EstimateForm, BacklogUpdateForm for backlog in backlogs: read_only = backlog.status.id == queued_status_id() estimate = get_object_or_none(Estimate, team_id=team_id, backlog_id=backlog.id) if not estimate: estimate = Estimate(team_id=team_id, backlog_id=backlog.id) # Creates the backlog form to edit data like story descr, skills, # notes, etc form = BacklogUpdateForm(read_only=read_only, instance=backlog, prefix='backlog') # Creates the estimate form to edit the estimate time of the # specific backlog form_estimate = EstimateForm(instance=estimate, prefix='estimate') # Creates a set of forms that represents each acceptance # criteria linked to the specific backlog prefix = 'acceptance-criteria-%d' % backlog.id formset = AcceptanceCriteriaFormSet(instance=backlog, prefix=prefix) # Apeend all these information to be sent in the context backlog_tuple.append((backlog, form_estimate, form, formset), ) context = RequestContext(request, { 'backlogs': backlog_tuple, }) return render(request, 'backlog/backlog_list.html', context)
def get(self, request): # Get the volunteers team team_id = request.session.get('team') # Redirects to the index page if there is no team associated if team_id is None: return redirect(reverse('index')) # From here now we have all we need to list the backlogs backlogs = retrieve_backlogs_by_status_project_and_priority(team_id)\ .order_by('project__name', 'priority', 'module', 'id') backlog_tuple = [] from ...backlog.forms import AcceptanceCriteriaFormSet, EstimateForm, BacklogUpdateForm for backlog in backlogs: read_only = backlog.status.id == queued_status_id() estimate = get_object_or_none(Estimate, team_id=team_id, backlog_id=backlog.id) if not estimate: estimate = Estimate(team_id=team_id, backlog_id=backlog.id) # Creates the backlog form to edit data like story descr, skills, # notes, etc form = BacklogUpdateForm(read_only=read_only, instance=backlog, prefix='backlog') # Creates the estimate form to edit the estimate time of the # specific backlog form_estimate = EstimateForm(instance=estimate, prefix='estimate') # Creates a set of forms that represents each acceptance # criteria linked to the specific backlog prefix = 'acceptance-criteria-%d' % backlog.id formset = AcceptanceCriteriaFormSet(instance=backlog, prefix=prefix) # Apeend all these information to be sent in the context backlog_tuple.append((backlog, form_estimate, form, formset),) context = RequestContext(request, {'backlogs': backlog_tuple, }) return render(request, 'backlog/backlog_list.html', context)
def evulateAvgTeamVelocity(self, request, teamId): logger = logging.getLogger("alliance") # Average Team Velocity for Completed backlogs : START statusFlag = 'COMPLETE' priorityFlag = '9' completedBacklogs = retrieve_backlogs_by_project_status_and_priority(teamId, statusFlag, priorityFlag) \ .order_by('project__name', 'module', 'sprint_id', 'priority', 'id') previousRecSprint = 0 currentRecSprint = 0 bgCountBySprint = 0 totalEstimateSum = 0 estimateValue = 0 estimateList = [] myTeamVelocitydict = {} for backlog in completedBacklogs: estimate = get_object_or_none(Estimate, team_id=teamId, backlog_id=backlog.id) if not estimate: estimate = Estimate(team_id=teamId, backlog_id=backlog.id) currentRecSprint = backlog.sprint_id estimateValue = estimate.estimate logger.debug(estimate) logger.debug(estimateValue) if estimateValue == "" or estimateValue is None: estimateValue = 0 if bgCountBySprint == 0: previousRecSprint = currentRecSprint if currentRecSprint == previousRecSprint: bgCountBySprint += 1 estimateList.append(int(estimateValue)) else: bgCountBySprint = 1 if previousRecSprint != None: myTeamVelocitydict.update({previousRecSprint: estimateList}) estimateList = [] estimateList.append(int(estimateValue)) previousRecSprint = currentRecSprint if previousRecSprint != None: myTeamVelocitydict.update({previousRecSprint: estimateList}) logger.debug(myTeamVelocitydict) for key in myTeamVelocitydict: logger.debug(key) logger.debug(myTeamVelocitydict[key]) estimateSum = sum(myTeamVelocitydict[key]) logger.debug(estimateSum) totalEstimateSum += estimateSum logger.debug(totalEstimateSum) logger.debug(len(myTeamVelocitydict.keys())) teamVelocity = totalEstimateSum / len(myTeamVelocitydict.keys()) return teamVelocity
def get(self, request): logger = logging.getLogger("alliance") # Get the volunteers team team_id = request.session.get('team') # Redirects to the index page if there is no team associated if team_id is None: return redirect(reverse('index')) logger.debug(request.GET) results = {'success': False} statusResults = False statusFlag = request.session.get('statusFlag') if 'backlogStatus' in request.GET: logger.debug("Inside list_backlog_view backlogStatus") request.session['statusFlag'] = None if "COMPLETE" in request.GET.getlist("backlogStatus"): request.session['statusFlag'] = 'COMPLETE' else: request.session['statusFlag'] = 'OPEN' statusFlag = request.session['statusFlag'] logger.debug(statusFlag) statusResults = True else: logger.debug("List backlogs default flow : backlogStatus is not avaliable in request.GET") priorityResults = False priorityFlag = request.session.get('priorityFlag') if 'backlogPriority' in request.GET: logger.debug("Inside list_backlog_view backlogPriority") request.session['priorityFlag'] = None if "3" in request.GET.getlist("backlogPriority"): request.session['priorityFlag'] = '3' elif "4" in request.GET.getlist("backlogPriority"): request.session['priorityFlag'] = '4' elif "5" in request.GET.getlist("backlogPriority"): request.session['priorityFlag'] = '5' elif "6" in request.GET.getlist("backlogPriority"): request.session['priorityFlag'] = '6' elif "7" in request.GET.getlist("backlogPriority"): request.session['priorityFlag'] = '7' elif "8" in request.GET.getlist("backlogPriority"): request.session['priorityFlag'] = '8' elif "9" in request.GET.getlist("backlogPriority"): request.session['priorityFlag'] = '9' else: request.session['priorityFlag'] = '2' priorityFlag = request.session['priorityFlag'] logger.debug(priorityFlag) priorityResults = True else: logger.debug("List backlogs default flow : backlogPriority is not avaliable in request.GET") if statusResults and priorityResults: results = {'success': True} return JsonResponse(results) # Sprint Velocity and Average Team Velocity : START acceptedEstimateVel = self.evulateAcceptedVelocity(request, team_id) teamVelocity = self.evulateAvgTeamVelocity(request, team_id) logger.debug("Velocity in list_backlogs_view !!!!!! ") logger.debug(acceptedEstimateVel) request.session['acceptedVelocity'] = acceptedEstimateVel logger.debug(teamVelocity) request.session['teamVelocity'] = teamVelocity # Sprint Velocity and Average Team Velocity : END # From here now we have all we need to list the backlogs backlogs = retrieve_backlogs_by_project_status_and_priority(team_id, statusFlag, priorityFlag)\ .order_by('project__name', 'priority', 'module', 'id') backlog_tuple = [] from ...backlog.forms import AcceptanceCriteriaFormSet, EstimateForm, BacklogUpdateForm for backlog in backlogs: read_only = backlog.status.id == queued_status_id() estimate = get_object_or_none(Estimate, team_id=team_id, backlog_id=backlog.id) if not estimate: estimate = Estimate(team_id=team_id, backlog_id=backlog.id) # Creates the backlog form to edit data like story descr, skills, # notes, etc form = BacklogUpdateForm(read_only=read_only, instance=backlog, prefix='backlog') # Creates the estimate form to edit the estimate time of the # specific backlog form_estimate = EstimateForm(instance=estimate, prefix='estimate') # Creates a set of forms that represents each acceptance # criteria linked to the specific backlog prefix = 'acceptance-criteria-%d' % backlog.id formset = AcceptanceCriteriaFormSet(instance=backlog, prefix=prefix) # Apeend all these information to be sent in the context backlog_tuple.append((backlog, form_estimate, form, formset),) page = request.GET.get('page', 1) paginator = Paginator(backlog_tuple,5) request.session['paginatorCount'] = paginator.count try: backlog_tuple_list = paginator.page(page) except PageNotAnInteger: backlog_tuple_list = paginator.page(1) except EmptyPage: backlog_tuple_list = paginator.page(paginator.num_pages) context = RequestContext(request, {'backlogs': backlog_tuple_list, }) return render(request, 'backlog/backlog_list.html', context)
def status_id(name): status = get_object_or_none(Status, category='backlog', name=name) if status: return status.id return None