class SprintEndView(UpdateView): model = Sprint template_name = "scrum_sprint_end.html" @method_decorator(employee_role_required("scrum_master")) def dispatch(self, *args, **kwargs): return super(SprintEndView, self).dispatch(*args, **kwargs) def get(self, *args, **kwargs): instance = self.get_object() if instance.sprint_end: message = 'Sprint Already Ended' return redirect(self.get_success_url(message)) instance.updated_by = self.request.user.employee instance.sprint_end = timezone.now() instance.save() return redirect(self.get_success_url()) def get_success_url(self, message='Sprint successfully Ended'): messages.add_message(self.request, messages.SUCCESS, \ message ) success_url = reverse_lazy('scrum_product_backlog', args = [self.get_object().release_backlog.product_backlog.id] ) return success_url
class DevelopmentTaskDetailView(DetailView): model = UserStory template_name = "emptask/development_task_detail.html" @method_decorator(employee_role_required("developer")) def dispatch(self, *args, **kwargs): return super(DevelopmentTaskDetailView, self).dispatch(*args, **kwargs) def get(self, *args, **kwargs): instance = self.get_object() if not instance.assiged_developer == self.request.user.employee: raise PermissionDenied return super(DevelopmentTaskDetailView, self).get(*args, **kwargs) def get_context_data(self, *args, **kwargs): today = timezone.now().date development_worklog = WorkLogService.developer_worklogs( self.request.user.employee.id).filter(user_story=self.get_object(), log_type="development") context = super(DevelopmentTaskDetailView, self).get_context_data(*args, **kwargs) context['today'] = today context['development_worklog'] = development_worklog context['log_exists_for_today'] = development_worklog.filter( date=today).exists() context['user_story'] = self.get_object() return context
class SprintUpdateView(UpdateView): model = Sprint fields = ('name', ) @method_decorator(employee_role_required("scrum_master")) def dispatch(self, *args, **kwargs): return super(SprintUpdateView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.updated_by = self.request.user.employee return super(SprintUpdateView, self).form_valid(form) def get_context_data(self, **kwargs): context = super(SprintUpdateView, self).get_context_data(**kwargs) context['release_backlog'] = self.get_object().release_backlog return context def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, \ 'Sprint successfully Updated' ) success_url = reverse_lazy( 'scrum_product_backlog', args=[self.get_object().release_backlog.product_backlog.id]) return success_url
class ReleaseBacklogAssignScrumMasterView(UpdateView): form_class = ScrumMasterForm model = ReleaseBacklog template_name = "scrum/releasebacklog_assign_form.html" @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(ReleaseBacklogAssignScrumMasterView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.updated_by = self.request.user.employee employee = form.instance.scrum_master scrum_master = Role.objects.get(code="scrum_master") employee.roles.add(scrum_master) employee.save() return super(ReleaseBacklogAssignScrumMasterView, self).form_valid(form) def get_success_url(self): messages.add_message( self.request, messages.SUCCESS, \ 'Scrum Master Successfully Assigned to the {0}'\ .format(self.get_object().name) ) return reverse_lazy('scrum_product_backlog_detail',\ args = [self.get_object().product_backlog.id])
class UserStoryDetailView(DetailView): model = UserStory @method_decorator(employee_role_required("product_owner", "scrum_master")) def dispatch(self, *args, **kwargs): print 'here' return super(UserStoryDetailView, self).dispatch(*args, **kwargs)
class TestEstimateView(UpdateView): model = UserStory template_name = "emptask/testing_estimate_form.html" fields = ('tester_effort', ) @method_decorator(employee_role_required("tester")) def dispatch(self, *args, **kwargs): print 'here' return super(TestEstimateView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.updated_by = self.request.user.employee worklog, created = WorkLog.objects.get_or_create( employee=self.request.user.employee, user_story=self.get_object(), date=timezone.now(), log_type='test') # import pdb; # pdb.set_trace() if created: worklog.updated_by = self.request.user.employee worklog.work_remaining = form.cleaned_data['tester_effort'] worklog.work_done = 0 worklog.description = "User Story Task started" worklog.save() return super(TestEstimateView, self).form_valid(form) def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, \ 'Test Estimation successfully Updated' ) success_url = reverse_lazy('emptask_mytask') return success_url
class UserStoryToSprintView(View): @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(UserStoryToSprintView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): self.release_id = kwargs.get('release_id') self.release_backlog = ReleaseBacklog.objects.get(id=self.release_id) sprint_id = self.request.POST['sprint_id'] user_stories = self.get_selected_stories(self.request.body) try: sprint = Sprint.objects.get(id=sprint_id) UserStory.objects.filter(id__in=user_stories).update(sprint=sprint) messages.add_message( self.request, messages.SUCCESS, '{0} User Stories successfully moved to sprint {1}'\ .format(len(user_stories), sprint.name) ) except Exception as e: messages.add_message(self.request, messages.ERROR, str(e)) return redirect(self.get_success_url()) def get_selected_stories(self, body): user_stories = [ int(re.findall(r'\d+', s)[0]) \ for s in re.findall(r'(user_story=\d+)', body) ] return user_stories def get_success_url(self): success_url = reverse_lazy( 'scrum_product_backlog', args=[self.release_backlog.product_backlog.id]) return success_url
class DevelopmentEstimateUpdateView(UpdateView): model = WorkLog template_name = "emptask/development_estimate_daily_form.html" fields = ('work_remaining', 'work_done', 'description') @method_decorator(employee_role_required("developer")) def dispatch(self, *args, **kwargs): return super(DevelopmentEstimateUpdateView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.updated_by = self.request.user.employee return super(DevelopmentEstimateUpdateView, self).form_valid(form) def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, \ 'Development Estimation successfully Updated' ) success_url = reverse_lazy('emptask_development_task_detail', args=[self.get_object().user_story.id]) return success_url def get_context_data(self, **kwargs): context = super(DevelopmentEstimateUpdateView, self).get_context_data(**kwargs) context['user_story'] = self.get_object().user_story return context
class UserStoryCreateView(CreateView): model = UserStory fields = ( 'title', 'description', ) @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): self.product_id = kwargs.get('product_id', None) return super(UserStoryCreateView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): return super(UserStoryCreateView, self).post(*args, **kwargs) def form_valid(self, form): form.instance.created_by = self.request.user.employee form.instance.updated_by = self.request.user.employee form.instance.product_backlog_id = self.kwargs.get('product_id') return super(UserStoryCreateView, self).form_valid(form) def get_context_data(self, **kwargs): context = super(UserStoryCreateView, self).get_context_data(**kwargs) try: product_obj = ProductBacklog.objects.get(id=self.product_id) context['product_obj'] = product_obj except Exception, e: raise Http404 return context
class ProductBacklogListView(ListView): model = ProductBacklog paginate_by = 10 @method_decorator(employee_role_required("product_owner", "scrum_master")) def dispatch(self, *args, **kwargs): return super(ProductBacklogListView, self).dispatch(*args, **kwargs) def get_queryset(self): return ProductBacklogService.all()
class BurnDownChartListView(ListView): model = ProductBacklog paginate_by = 10 template_name = "product_backlog_list.html" @method_decorator( employee_role_required("product_owner", "scrum_master", "tester", "developer")) def dispatch(self, *args, **kwargs): return super(BurnDownChartListView, self).dispatch(*args, **kwargs) def get_queryset(self): return ProductBacklogService.all()
class EmployeeTaskTemplateView(TemplateView): template_name = "emptask/employeetasks.html" @method_decorator(employee_role_required("developer", "tester")) def dispatch(self, *args, **kwargs): return super(EmployeeTaskTemplateView, self).dispatch(*args, **kwargs) def get_context_data(self, **kwargs): context = super(EmployeeTaskTemplateView, self).get_context_data(**kwargs) context['development_tasks'] = UserStoryService.developer_user_stories( self.request.user.employee.id).order_by('sprint__id') context['testing_tasks'] = UserStoryService.tester_user_stories( self.request.user.employee.id).order_by('sprint__id') return context
class UserStoryUpdateView(UpdateView): model = UserStory fields = ('title', 'description') @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(UserStoryUpdateView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.updated_by = self.request.user.employee return super(UserStoryUpdateView, self).form_valid(form) def get_success_url(self): success_url = reverse_lazy('scrum_product_backlog', args=[self.get_object().product_backlog.id]) return success_url
class ReleaseBacklogUpdateView(UpdateView): model = ReleaseBacklog fields = ('name', ) @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(ReleaseBacklogUpdateView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.updated_by = self.request.user.employee return super(ReleaseBacklogUpdateView, self).form_valid(form) def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, \ 'Release Backlog Successfully Updated') return reverse_lazy('scrum_product_backlog_detail',\ args = [self.get_object().product_backlog.id])
class ProductBacklogDetailView(DetailView): model = ProductBacklog @method_decorator(employee_role_required("product_owner", "scrum_master")) def dispatch(self, *args, **kwargs): return super(ProductBacklogDetailView, self).dispatch(*args, **kwargs) def get_context_data(self, **kwargs): context = super(ProductBacklogDetailView, self).get_context_data(**kwargs) # import pdb; pdb.set_trace() context['user_stories'] = UserStoryService.product_backlog_stories( self.get_object().id) context[ 'release_list'] = ReleaseBacklogService.product_backlog_releases( self.get_object().id).order_by('-id') return context
class DevelopmentEstimateCreateView(CreateView): model = WorkLog template_name = "emptask/development_estimate_daily_form.html" fields = ('work_remaining', 'work_done', 'description') @method_decorator(employee_role_required("developer")) def dispatch(self, *args, **kwargs): return super(DevelopmentEstimateCreateView, self).dispatch(*args, **kwargs) def get(self, *args, **kwargs): story_id = kwargs['story_id'] try: self.user_story = UserStory.objects.get(pk=story_id) except: raise Http404 return super(DevelopmentEstimateCreateView, self).get(*args, **kwargs) def post(self, *args, **kwargs): story_id = kwargs['story_id'] try: self.user_story = UserStory.objects.get(pk=story_id) except: raise Http404 return super(DevelopmentEstimateCreateView, self).post(*args, **kwargs) def form_valid(self, form): form.instance.updated_by = self.request.user.employee form.instance.employee = self.request.user.employee form.instance.user_story = self.user_story form.instance.log_type = 'development' return super(DevelopmentEstimateCreateView, self).form_valid(form) def get_context_data(self, **kwargs): context = super(DevelopmentEstimateCreateView, self).get_context_data(**kwargs) context['user_story'] = self.user_story return context def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, \ 'Development Estimation successfully Updated' ) success_url = reverse_lazy('emptask_development_task_detail', args=[self.user_story.id]) return success_url
class ReleaseBacklogStoryDeleteView(DeleteView): model = UserStory template_name = "scrum/release_backlog_userstory_confirm_delete.html" @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(ReleaseBacklogStoryDeleteView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): user_story = self.get_object() user_story.updated_by = self.request.user.employee user_story.release_backlog = None user_story.save() return redirect(self.get_success_url()) def get_success_url(self): success_url = reverse_lazy('scrum_product_backlog', args = [self.get_object().product_backlog.id]) return success_url
class ProductBacklogDeleteView(DeleteView): model = ProductBacklog success_url = reverse_lazy('scrum_product_backlog_list') @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(ProductBacklogDeleteView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): product_backlog_object = self.get_object() product_backlog_object.updated_by = self.request.user.employee product_backlog_object.is_deleted = True product_backlog_object.deleted_by = self.request.user.employee product_backlog_object.deleted_on = timezone.now() product_backlog_object.save() messages.add_message(self.request, messages.SUCCESS, 'New employee successfully added') return redirect(self.success_url)
class ProductBacklogCreateView(CreateView): model = ProductBacklog fields = ('name', ) success_url = reverse_lazy('scrum_product_backlog_list') @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(ProductBacklogCreateView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.owner = self.request.user.employee form.instance.created_by = self.request.user.employee form.instance.updated_by = self.request.user.employee return super(ProductBacklogCreateView, self).form_valid(form) def get_success_url(self, *args, **kwargs): messages.add_message(self.request, messages.SUCCESS,\ 'New Prodcuct Backlog successfully added') return reverse_lazy('scrum_product_backlog_list')
class EmployeeCreateView(CreateView): model = Employee form_class = EmployeeForm user_form = UserForm template_name = "hris/employee_form.html" @method_decorator(employee_role_required("hradmin")) def dispatch(self, *args, **kwargs): return super(EmployeeCreateView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): return super(EmployeeCreateView, self).post(*args, **kwargs) def form_valid(self, form): # import pdb; pdb.set_trace() user_form = UserForm(self.request.POST, self.request.FILES) if user_form.is_valid(): user = user_form.save() form.instance.user = user form.instance.created_by = self.request.user.employee form.instance.updated_by = self.request.user.employee form.save() messages.add_message(self.request, messages.SUCCESS, 'New employee successfully added') else: messages.add_message(self.request, messages.ERROR, 'Oops!! something went wrong') self.set_user_form(user_form) return super(EmployeeCreateView, self).form_invalid(form) return super(EmployeeCreateView, self).form_valid(form) def get_context_data(self, **kwargs): context = super(EmployeeCreateView, self).get_context_data(**kwargs) roles = Role.objects.filter(is_visible=True) context['roles'] = roles context['user_form'] = self.user_form return context def set_user_form(self, form=None): self.user_form = form def get_success_url(self): return reverse('hris_employee_list')
class UserStoryDeleteView(DeleteView): model = UserStory @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(UserStoryDeleteView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): user_story = self.get_object() user_story.is_deleted = True user_story.deleted_by = self.request.user.employee user_story.deleted_on = timezone.now() user_story.updated_by = self.request.user.employee user_story.save() return redirect(self.get_success_url()) def get_success_url(self): success_url = reverse_lazy('scrum_product_backlog', args=[self.get_object().product_backlog.id]) return success_url
class SprintDeleteView(DeleteView): model = Sprint @method_decorator(employee_role_required("scrum_master")) def dispatch(self, *args, **kwargs): return super(SprintDeleteView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): sprint = self.get_object() sprint.is_deleted = True sprint.deleted_by = self.request.user.employee sprint.deleted_on = timezone.now() sprint.updated_by = self.request.user.employee sprint.save() return redirect(self.get_success_url()) def get_success_url(self): success_url = reverse_lazy( 'scrum_product_backlog', args=[self.get_object().release_backlog.product_backlog.id]) return success_url
class SprintCreateView(CreateView): model = Sprint fields = ('name', ) @method_decorator(employee_role_required("scrum_master")) def dispatch(self, *args, **kwargs): self.release_id = kwargs.get('release_id', None) return super(SprintCreateView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.release_backlog_id = self.release_id form.instance.created_by = self.request.user.employee form.instance.updated_by = self.request.user.employee return super(SprintCreateView, self).form_valid(form) def get_context_data(self, **kwargs): # import pdb;pdb.set_trace() context = super(SprintCreateView, self).get_context_data(**kwargs) context['release_backlog'] = self.get_release_object() return context def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, \ 'New Sprint successfully added to {0}'.format( self.get_release_object().name ) ) return reverse_lazy( 'scrum_product_backlog_detail', args=[self.get_release_object().product_backlog.id]) def get_release_object(self): release_backlog = None try: self.release_backlog = ReleaseBacklog.objects.get( id=self.release_id) except Exception, e: raise Http404 return self.release_backlog
class SprintStoryDeleteView(DeleteView): model = UserStory template_name = "scrum/sprint_userstory_confirm_delete.html" @method_decorator(employee_role_required("scrum_master")) def dispatch(self, *args, **kwargs): return super(SprintStoryDeleteView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): user_story = self.get_object() user_story.updated_by = self.request.user.employee user_story.sprint = None user_story.assiged_developer = None user_story.developer_effort = None user_story.assiged_tester = None user_story.tester_effort = None user_story.save() return redirect(self.get_success_url()) def get_success_url(self): success_url = reverse_lazy('scrum_product_backlog', args=[self.get_object().product_backlog.id]) return success_url
class UserStoryAssignDeveloperView(UpdateView): form_class = DeveloperForm model = UserStory # fields = ('scrum_master',) template_name = "scrum/userstory_assign_developer_form.html" @method_decorator(employee_role_required("scrum_master")) def dispatch(self, *args, **kwargs): return super(UserStoryAssignDeveloperView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.updated_by = self.request.user.employee return super(UserStoryAssignDeveloperView, self).form_valid(form) def get_success_url(self): messages.add_message( self.request, messages.SUCCESS, \ 'Developer Successfully Assigned to the User Story{0}'\ .format(self.get_object().title) ) return reverse_lazy('scrum_product_backlog_detail',\ args = [self.get_object().product_backlog.id])
class ReleaseBacklogDeleteView(DeleteView): model = ReleaseBacklog @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): return super(ReleaseBacklogDeleteView, self).dispatch(*args, **kwargs) def post(self, *args, **kwargs): release_backlog = self.get_object() release_backlog.is_deleted = True release_backlog.deleted_by = self.request.user.employee release_backlog.deleted_on = timezone.now() release_backlog.updated_by = self.request.user.employee release_backlog.save() return redirect(self.get_success_url()) def get_success_url(self): messages.add_message(self.request, messages.SUCCESS, \ 'ReleaseBacklog successfully Deleted to {0}' ) success_url = reverse_lazy('scrum_product_backlog', \ args = [self.get_object().product_backlog.id]) return success_url
class ReleaseBacklogCreateView(CreateView): model = ReleaseBacklog fields = ('name',) @method_decorator(employee_role_required("product_owner")) def dispatch(self, *args, **kwargs): self.product_id = kwargs.get('product_id',None) return super(ReleaseBacklogCreateView, self).dispatch(*args, **kwargs) def form_valid(self, form): form.instance.created_by = self.request.user.employee form.instance.updated_by = self.request.user.employee form.instance.product_backlog_id = self.product_id return super(ReleaseBacklogCreateView, self).form_valid(form) def get_context_data(self, **kwargs): # import pdb;pdb.set_trace() context = super(ReleaseBacklogCreateView, self).get_context_data(**kwargs) try: product_obj = ProductBacklog.objects.get(id=self.product_id) context['product_obj'] = product_obj except Exception, e: raise Http404 return context