Labels

This describes the label functionality, which allows users to create labels on a project and assign them to both users and tasks, so that users can look at their assigned tasks.

From project_page view (GET /project/{id}):

  • Query project labels:

    project_labels = (
        request.dbsession.query(Label.id, Label.label_name, Label.label_hex_color)
        .filter_by(project_id=project_id)
        .order_by(Label.label_name.asc())
        .all()
    )
  • Query member labels (user-label assignments within the project):

    member_labels_query = (
        request.dbsession.query(ProjectsUser.user_id, LabelsProjectsUser.labels_id)
        .join(LabelsProjectsUser, ProjectsUser.id == LabelsProjectsUser.projects_users_id)
        .filter(ProjectsUser.project_id == project_id)
    )
    member_labels = defaultdict(list)
    for user_id, label_id in member_labels_query:
        member_labels[user_id].append(label_id)
  • Query task labels (task-label assignments within the project):

    labels_by_task = defaultdict(list)
    task_labels_query = (
        request.dbsession.query(LabelsTask.tasks_id, LabelsTask.labels_id)
        .join(Task)
        .filter(Task.project_id == project_id)
    )
    for task_id, label_id in task_labels_query:
        labels_by_task[task_id].append(label_id)
  • Rebuilding member labels dictionary (slightly redundant):

    member_labels = {}
    label_assignments = request.dbsession.query(
        ProjectsUser.user_id, 
        LabelsProjectsUser.labels_id
    ).join(
        LabelsProjectsUser, ProjectsUser.id == LabelsProjectsUser.projects_users_id
    ).filter(
        ProjectsUser.project_id == project_id
    ).all()
    
    for user_id, label_id in label_assignments:
        if user_id not in member_labels:
            member_labels[user_id] = []
  • Assign labels to tasks grouped by status and label name:

    label_id_to_name = {label.id: label.label_name for label in project_labels}
    tasks_by_label_status = {}
    
    for label in project_labels:
        tasks_by_label_status[label.label_name] = {
            'assigned': [],
            'in_progress': [],
            'under_review': [],
            'completed': []
        }
    
    for status, task_list in tasks_by_status.items():
        for task in task_list:
            task_labels = labels_by_task.get(task.id, [])
            for label_id in task_labels:
                label_name = label_id_to_name.get(label_id)
                if label_name:
                    task_info = {
                        "title": task.task_title or "Sin título",
                        "due_date": task.due_date.strftime('%Y-%m-%d') if task.due_date else None
                    }
                    tasks_by_label_status[label_name][status].append(task_info)

From edit_member view (POST /project/{id}/edit_member):

  • Receive updated label IDs from form:

    label_ids = request.POST.getall('labels')
  • Delete all previous label associations for the member:

    request.dbsession.query(LabelsProjectsUser).filter_by(
        projects_users_id=project_user.id
    ).delete()
  • Add updated labels:

    for label_id in label_ids:
        try:
            label_link = LabelsProjectsUser(
                labels_id=label_id,
                projects_users_id=project_user.id
            )
            request.dbsession.add(label_link)
        except ValueError:
            continue

From kanban_partial view (GET /project/{id}/kanban_partial):

  • Query project labels:

    project_labels = (
        request.dbsession.query(Label.id, Label.label_name, Label.label_hex_color).
        filter_by(project_id = project.id).order_by(Label.label_name.asc()).all()
    )
  • Query labels for each task in tasks by status:

labels_by_task = {}
for task_list in tasks_by_status.values():
    for task in task_list:
        labels_for_task = request.dbsession.query(LabelsTask).filter_by(tasks_id=task.id).all()
        labels_by_task[task.id] = [label.labels_id for label in labels_for_task]

Labels Handling Workflow


1. Loading Labels in Project View (project_page)

  • Objective: Retrieve all labels associated with the project, plus labels assigned to project members and tasks.

  • Steps:

    1. Query all labels defined for the project (Label table) sorted by name.

    2. Retrieve labels assigned to project members by joining ProjectsUser and LabelsProjectsUser.

    3. Retrieve labels assigned to tasks by joining LabelsTask and Task.

    4. Build dictionaries:

      • member_labels: mapping user_id → list of label IDs.

      • labels_by_task: mapping task_id → list of label IDs.

    5. Construct a mapping from label ID to label name for easy reference.

    6. Organize tasks by label and task status for structured display in the UI:

      • For each label, prepare buckets for each status (assigned, in_progress, under_review, completed).

      • For each task, assign task info (title, due date) to corresponding label/status buckets.

  • Result: Detailed data structures (project_labels, member_labels, labels_by_task, tasks_by_label_status) are passed to the template for rendering label-related info.


2. Editing Member Labels (edit_member)

  • Objective: Update the set of labels assigned to a project member.

  • Steps:

    1. Receive new label IDs from the form submission (label_ids).

    2. Query the ProjectsUser record representing the member-project relationship.

    3. Delete all existing label assignments for this member (LabelsProjectsUser entries).

    4. Insert new label assignments:

      • For each label ID, create a new LabelsProjectsUser record linking the label to the member.

    5. Flush the session to persist changes.

    6. Provide feedback (flash message) and redirect to project page.

  • Result: The member's label assignments are fully replaced with the newly selected labels.


3. Loading Labels in Kanban Partial View (kanban_partial)

  • Objective: Provide label info relevant for kanban board rendering.

  • Steps:

    1. Query all labels associated with the project, ordered by name.

    2. For each task in all statuses, query labels assigned to that task.

    3. Construct a dictionary mapping task IDs to their assigned label IDs.

  • Result: Data structures with project labels and labels assigned per task to render Kanban UI elements with labels.

Last updated