def view_calendar(request): member = None if user_is_member(request.user): member = request.user.member boards = get_user_boards(request.user) members = Member.objects.filter(boards__in=boards).distinct().filter( is_developer=True).order_by("id") min_date = DailyMemberMood.objects.filter(member__in=members).aggregate( min_date=Min("date"))["min_date"] max_date = DailyMemberMood.objects.filter(member__in=members).aggregate( max_date=Max("date"))["max_date"] dates = [] if min_date and max_date: date_i = copy.deepcopy(min_date) while date_i <= max_date: # Only add date when there are mood measurements if DailyMemberMood.objects.filter(date=date_i, member__in=members).exists(): dates.append(date_i) date_i += timedelta(days=1) replacements = {"member": member, "members": members, "dates": dates} return render(request, "niko_niko_calendar/calendar.html", replacements)
def view_archived_boards(request): member = None if user_is_member(request.user): member = request.user.member boards = get_user_boards(request.user, is_archived=True).order_by("name") replacements = {"member": member, "boards": boards} return render(request, "boards/archived_list.html", replacements)
def delete(request, board_id): member = None if user_is_member(request.user): member = request.user.member try: board = get_user_board_or_404(request.user, board_id) project_agility_rating = board.agility_rating except ObjectDoesNotExist: raise Http404 if request.method == "POST": form = DeleteProjectAgilityRatingForm(request.POST) if form.is_valid() and form.cleaned_data.get("confirmed"): project_agility_rating.delete() return HttpResponseRedirect( reverse("boards:agility_rating:view", args=(board_id, ))) else: form = DeleteProjectAgilityRatingForm() replacements = { "form": form, "board": board, "member": member, "project_agility_rating": project_agility_rating } return render(request, "agility_rating/delete.html", replacements)
def view_list(request): member = None if user_is_member(request.user): member = request.user.member hourly_rates = HourlyRate.objects.all() replacements = {"member": member, "hourly_rates": hourly_rates} return render(request, "hourly_rates/list.html", replacements)
def edit(request, board_id): member = None if user_is_member(request.user): member = request.user.member try: board = get_user_board_or_404(request.user, board_id) project_agility_rating = board.agility_rating except ObjectDoesNotExist: raise Http404 if request.method == "POST": form = ProjectAgilityRatingForm(request.POST, instance=project_agility_rating) if form.is_valid(): form.save(commit=True) return HttpResponseRedirect( reverse("boards:agility_rating:view", args=(board_id, ))) else: form = ProjectAgilityRatingForm(instance=project_agility_rating) return render(request, "agility_rating/edit.html", { "form": form, "board": board, "member": member })
def new_list(request, board_id): member = None if user_is_member(request.user): member = request.user.member board = get_user_board_or_404(request.user, board_id) list_ = List(board=board) # Setting maximum position of this new list (this list will be the last) lists = board.lists.all().order_by("-position") if lists.exists(): list_.position = lists[0].position + 10 if request.method == "POST": form = NewListForm(request.POST, instance=list_, member=member) if form.is_valid(): form.save(commit=True) return HttpResponseRedirect( reverse("boards:view_lists", args=(board_id, ))) else: form = NewListForm(instance=list_, member=member) return render(request, "boards/lists/new.html", { "form": form, "board": board, "member": member })
def get_context_data(self, **kwargs): context = super(ReportRecipientListView, self).get_context_data(**kwargs) if user_is_member(self.request.user): context["member"] = self.request.user.member context["report_recipients"] = ReportRecipient.objects.all().order_by("email") context["user_boards"] = get_user_boards(self.request.user) context["user_boards_ids"] = {board.id: board for board in get_user_boards(self.request.user)} return context
def view_label_report(request, board_id): member = None if user_is_member(request.user): member = request.user.member board = get_user_board_or_404(request.user, board_id) labels = board.labels.exclude(name="") replacements = {"member": member, "board": board, "labels": labels} return render(request, "boards/labels/list.html", replacements)
def assert_user_can_edit_member(user, member): if user_is_administrator(user): return True if user_is_member(user): current_member = user.member # An user can edit another one if he/she is his/her creator or if is him/herself return current_member.id == member.creator_id or current_member.id == member.id raise AssertionError("You do not have permissions to edit this users")
def spent_time_by_day_of_the_week(request, member_id=None, week_of_year=None, board_id=None): user_boards = get_user_boards(request.user) if member_id is None: if user_is_member(request.user): member = request.user.member else: member = Member.objects.filter(boards__in=user_boards)[0] else: member = Member.objects.filter(boards__in=user_boards).distinct().get( id=member_id) if week_of_year is None: now = timezone.now() today = now.date() week_of_year_ = get_iso_week_of_year(today) week_of_year = "{0}W{1}".format(today.year, week_of_year_) y, w = week_of_year.split("W") week = Week(int(y), int(w)) start_of_week = week.monday() end_of_week = week.sunday() chart_title = u"{0}'s spent time in week {1} ({2} - {3})".format( member.external_username, week_of_year, start_of_week.strftime("%Y-%m-%d"), end_of_week.strftime("%Y-%m-%d")) board = None if board_id: board = user_boards.get(id=board_id) chart_title += u" for board {0}".format(board.name) spent_time_chart = pygal.HorizontalBar(title=chart_title, legend_at_bottom=True, print_values=True, print_zeroes=False, human_readable=True) try: day = start_of_week while day <= end_of_week: member_spent_time = member.get_spent_time(day, board) spent_time_chart.add(u"{0}".format(day.strftime("%A")), member_spent_time) day += datetime.timedelta(days=1) except AssertionError: spent_time_chart.no_data_text = u"No developers for this board.\nCheck members' attributes." spent_time_chart.style = DefaultStyle(no_data_font_size=20) return spent_time_chart.render_django_response() return spent_time_chart.render_django_response()
def view(request, work_hours_package_id): member = None if user_is_member(request.user): member = request.user.member try: work_hours_package = member.work_hours_packages.get(id=work_hours_package_id) except WorkHoursPackage.DoesNotExist: raise Http404 elif user_is_administrator(request.user): work_hours_package = WorkHoursPackage.objects.get(id=work_hours_package_id) replacements = {"work_hours_package": work_hours_package, "member": member} return render(request, "work_hours_packages/view.html", replacements)
def _get_recurrent_card(current_user, board, recurrent_card_id): try: if user_is_administrator(current_user): return WeeklyRecurrentCard.objects.get(board=board, id=recurrent_card_id) elif user_is_member(current_user): member = current_user.member return member.created_recurrent_cards.get(board=board, id=recurrent_card_id) else: raise Http404 except WeeklyRecurrentCard.DoesNotExist: raise Http404
def view_list(request, board_id): member = None if user_is_member(request.user): member = request.user.member board = get_user_board_or_404(request.user, board_id) requirements = board.requirements.all().order_by("value") replacements = { "member": member, "board": board, "requirements": requirements } return render(request, "requirements/list.html", replacements)
def view_list(request, board_id=None): member = None if user_is_member(request.user): member = request.user.member visitor_group = Group.objects.get(name="Visitors") if board_id is None: visitor_users = visitor_group.user_set.all().order_by("username") else: board = get_object_or_404(Board, id=board_id) visitor_users = board.visitors.all().order_by("username") replacements = {"visitors": visitor_users, "member": member} return render(request, "visitors/list.html", replacements)
def notify_completions(request): member = None if user_is_member(request.user): member = request.user.member if request.method == "POST": form = NotificationCompletionSenderForm(request.POST, member=member) if form.is_valid(): form.send() return HttpResponseRedirect(reverse("work_hours_packages:view_list")) else: form = NotificationCompletionSenderForm(member=member) replacements = {"form": form, "member": member} return render(request, "work_hours_packages/notify_completions.html", replacements)
def delete(request, work_hours_package_id): member = None if user_is_member(request.user): member = request.user.member try: work_hours_package = member.created_work_hours_packages.get(id=work_hours_package_id) except WorkHoursPackage.DoesNotExist: raise Http404 elif user_is_administrator(request.user): work_hours_package = WorkHoursPackage.objects.get(id=work_hours_package_id) return model_views.delete( request, instance=work_hours_package, form_class=DeleteWorkHoursPackageForm, next_url=reverse("work_hours_packages:view_list"), template_path="work_hours_packages/delete.html", template_replacements={"member":member} )
def view_taskboard(request, board_id, path=""): board = get_user_board_or_404(request.user, board_id) member = None if user_is_member(request.user): member = request.user.member replacements = { "member": member, "board": board, "ANGULAR_URL": settings.ANGULAR_URL, "DOMAIN": settings.DOMAIN, "PORT": settings.PORT } return render(request, "boards/view_taskboard.html", replacements)
def view_lists(request, board_id): member = None if user_is_member(request.user): member = request.user.member board = get_user_board_or_404(request.user, board_id) lists = board.lists.all().order_by("position") replacements = { "member": member, "user": request.user, "board": board, "lists": lists, "list_types": List.LIST_TYPE_CHOICES } return render(request, "boards/lists/list.html", replacements)
def task_movements_by_member(request, movement_type="forward", board=None): if movement_type != "forward" and movement_type != "backward": raise ValueError( "{0} is not recognized as a valid movement type".format( movement_type)) # Caching chart_uuid = "members.task_movements_by_member-{0}-{1}".format( movement_type, board.id if board else "user-{0}".format(request.user.id)) chart = CachedChart.get(board=board, uuid=chart_uuid) if chart: return chart chart_title = u"Task {0} movements as of {1}".format( movement_type, timezone.now()) if board: chart_title += u" for board {0}".format(board.name) member_chart = pygal.HorizontalBar(title=chart_title, legend_at_bottom=True, print_values=True, print_zeroes=False, human_readable=True) card_movement_filter = {"type": movement_type} if board: card_movement_filter["board_id"] = board.id # If this user is a member, include it in the developers list at the front if user_is_member(request.user): members = [request.user.member] + list( Member.get_user_team_mates(request.user)) else: members = Member.get_user_team_mates(request.user) for member_i in members: member_name = member_i.external_username num_card_movements = member_i.card_movements.filter( **card_movement_filter).count() if num_card_movements > 0: member_chart.add(u"{0}".format(member_name), num_card_movements) chart = CachedChart.make(board=board, uuid=chart_uuid, svg=member_chart.render(is_unicode=True)) return chart.render_django_response()
def view(request, board_id, requirement_code): member = None if user_is_member(request.user): member = request.user.member board = get_user_board_or_404(request.user, board_id) requirement = get_object_or_404(Requirement, code=requirement_code, board=board) replacements = { "member": member, "board": board, "requirement": requirement } return render(request, "requirements/view.html", replacements)
def view(request, board_id): member = None if user_is_member(request.user): member = request.user.member board = get_user_board_or_404(request.user, board_id) try: agility_rating = board.agility_rating except ObjectDoesNotExist: agility_rating = None replacements = { "member": member, "board": board, "agility_rating": agility_rating } return render(request, "agility_rating/view.html", replacements)
def new(request): member = None if user_is_member(request.user): member = request.user.member user = User() if request.method == "POST": form = NewUserForm(request.POST, instance=user) if form.is_valid(): form.save(commit=True) return HttpResponseRedirect(reverse("visitors:view_list")) else: form = NewUserForm(instance=user) return render(request, "visitors/new.html", {"form": form, "user": user, "member": member})
def view_list(request, board_id): member = None if user_is_member(request.user): member = request.user.member board = get_user_boards(request.user).get(id=board_id) workflows = Workflow.objects.all().order_by("name") # Ordered workflow lists for workflow in workflows: workflow.ordered_lists = workflow.workflow_lists.all().order_by("order") workflow_card_reports = workflow.workflow_card_reports.all() workflow.avg_lead_time = avg(workflow_card_reports, "lead_time") workflow.std_dev_lead_time = std_dev(workflow_card_reports, "lead_time") workflow.avg_cycle_time = avg(workflow_card_reports, "cycle_time") workflow.std_dev_cycle_time = std_dev(workflow_card_reports, "cycle_time") replacements = {"board": board, "workflows": workflows, "member": member} return render(request, "workflows/list.html", replacements)
def edit(request, work_hours_package_id): member = None if user_is_member(request.user): member = request.user.member try: work_hours_package = member.created_work_hours_packages.get(id=work_hours_package_id) except WorkHoursPackage.DoesNotExist: raise Http404 elif user_is_administrator(request.user): work_hours_package = WorkHoursPackage.objects.get(id=work_hours_package_id) return model_views.edit( request, instance=work_hours_package, form_class=WorkHoursPackageForm, extra_form_parameters={"member": member}, template_path="work_hours_packages/edit.html", ok_url=reverse("work_hours_packages:view_list") )
def view_list(request): member = None form = None if user_is_member(request.user): member = request.user.member form = WorkHoursPackageFilterForm(request.GET, member=member) if form and form.is_valid(): work_hours_packages = form.get_work_hours_packages() else: if member: work_hours_packages = member.work_hours_packages.all().order_by("start_work_date", "end_work_date", "name") elif user_is_administrator(request.user): work_hours_packages = WorkHoursPackage.objects.order_by("start_work_date", "end_work_date", "name") replacements = {"work_hours_packages": work_hours_packages, "member": member, "form": form} return render(request, "work_hours_packages/list.html", replacements)
def view_member_report(request, board_id): member = None if user_is_member(request.user): member = request.user.member board = get_user_board_or_404(request.user, board_id) week_of_year = get_week_of_year() replacements = { "member": member, "board": board, "members": board.members.all(), "week_of_year": week_of_year, "weeks_of_year": get_weeks_of_year_since_one_year_ago() } return render(request, "boards/members/list.html", replacements)
def view_members(request): current_user = request.user boards = get_user_boards(current_user) if user_is_member(current_user): member = request.user.member members = Member.objects.filter( Q(boards__in=boards) | Q(creator=current_user.member) | Q(is_public=True)).distinct() else: member = None members = Member.objects.filter(boards__in=boards).distinct() replacements = { "member": member, "members": members, "developers": Member.objects.filter(is_developer=True) } return render(request, "members/list.html", replacements)
def view_report(request, board_id): try: member = None if user_is_member(request.user): member = request.user.member board = get_user_boards(request.user).get(id=board_id) except Board.DoesNotExist: raise Http404 cards = board.cards.all() replacements = { "week_of_year": get_week_of_year(), "member": member, "board": board, "avg_lead_time": avg(cards, "lead_time"), "std_dev_lead_time": std_dev(cards, "lead_time"), "avg_cycle_time": avg(cards, "cycle_time"), "std_dev_cycle_time": std_dev(cards, "cycle_time"), } return render(request, "boards/cards/list.html", replacements)
def view(request): member = None if user_is_member(request.user): member = request.user.member boards = get_user_boards(request.user).\ filter(show_on_slideshow=True).\ exclude(last_fetch_datetime=None).\ order_by("-last_activity_datetime") replacements = { "simple_carousel": True if request.GET.get("simple") == "1" else False, "column_mode": "single_column" if request.GET.get("column_mode") == "1" else "normal", "member": member, "boards": boards, "members": Member.objects.filter(boards__in=boards).distinct(), "interruptions": Interruption.objects.all(), "noise_measurements": NoiseMeasurement.objects.all() } return render(request, "slideshow/view.html", replacements)
def view(request, board_id): try: board = get_user_boards(request.user).get(id=board_id) member = None visitor = None if user_is_member(request.user): member = request.user.member elif user_is_visitor(request.user, board): visitor = request.user except Board.DoesNotExist: raise Http404 week_of_year = get_week_of_year() # Next cards by due date next_due_date_cards = board.cards\ .filter(due_datetime__isnull=False)\ .exclude( Q(list__type="ignored") | Q(list__type="closed") ).order_by("-due_datetime") # Requirements requirements = board.requirements.all().order_by("-value") requirement = None if requirements.exists(): requirement = requirements[0] # Replacements in the template replacements = { "url_prefix": "http://{0}".format(settings.DOMAIN), "board": board, "next_due_date_cards": next_due_date_cards, "requirement": requirement, "requirements": requirements, "week_of_year": week_of_year, "member": member, "visitor": visitor, "weeks_of_year": get_weeks_of_year_since_one_year_ago() } return render(request, "boards/view.html", replacements)