Esempio n. 1
0
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)
Esempio n. 2
0
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)
Esempio n. 3
0
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)
Esempio n. 4
0
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)
Esempio n. 5
0
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
    })
Esempio n. 6
0
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
    })
Esempio n. 7
0
 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
Esempio n. 8
0
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)
Esempio n. 9
0
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")
Esempio n. 10
0
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()
Esempio n. 11
0
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)
Esempio n. 12
0
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
Esempio n. 13
0
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)
Esempio n. 14
0
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)
Esempio n. 15
0
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)
Esempio n. 16
0
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}
    )
Esempio n. 17
0
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)
Esempio n. 18
0
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)
Esempio n. 19
0
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()
Esempio n. 20
0
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)
Esempio n. 21
0
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)
Esempio n. 22
0
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})
Esempio n. 23
0
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)
Esempio n. 24
0
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")
    )
Esempio n. 25
0
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)
Esempio n. 26
0
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)
Esempio n. 27
0
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)
Esempio n. 28
0
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)
Esempio n. 29
0
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)
Esempio n. 30
0
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)