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}
):
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
):
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
):
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
)
project_page
)Objective: Retrieve all labels associated with the project, plus labels assigned to project members and tasks.
Steps:
Query all labels defined for the project (
Label
table) sorted by name.Retrieve labels assigned to project members by joining
ProjectsUser
andLabelsProjectsUser
.Retrieve labels assigned to tasks by joining
LabelsTask
andTask
.Build dictionaries:
member_labels
: mappinguser_id
→ list of label IDs.labels_by_task
: mappingtask_id
→ list of label IDs.
Construct a mapping from label ID to label name for easy reference.
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
)
edit_member
)Objective: Update the set of labels assigned to a project member.
Steps:
Receive new label IDs from the form submission (
label_ids
).Query the
ProjectsUser
record representing the member-project relationship.Delete all existing label assignments for this member (
LabelsProjectsUser
entries).Insert new label assignments:
For each label ID, create a new
LabelsProjectsUser
record linking the label to the member.
Flush the session to persist changes.
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
)
kanban_partial
)Objective: Provide label info relevant for kanban board rendering.
Steps:
Query all labels associated with the project, ordered by name.
For each task in all statuses, query labels assigned to that task.
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