Remove obsolete Kanban parts.
This commit is contained in:
131
models.py
131
models.py
@@ -726,136 +726,6 @@ class SystemEvent(db.Model):
|
||||
'health_status': 'healthy' if recent_errors == 0 else 'issues' if recent_errors < 5 else 'critical'
|
||||
}
|
||||
|
||||
# Kanban Board models
|
||||
class KanbanBoard(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String(100), nullable=False)
|
||||
description = db.Column(db.Text, nullable=True)
|
||||
|
||||
# Company association for multi-tenancy (removed project-specific constraint)
|
||||
company_id = db.Column(db.Integer, db.ForeignKey('company.id'), nullable=False)
|
||||
|
||||
# Board settings
|
||||
is_active = db.Column(db.Boolean, default=True)
|
||||
is_default = db.Column(db.Boolean, default=False) # Default board for company
|
||||
|
||||
# Metadata
|
||||
created_at = db.Column(db.DateTime, default=datetime.now)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
|
||||
created_by_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
|
||||
|
||||
# Relationships
|
||||
company = db.relationship('Company', backref='kanban_boards')
|
||||
created_by = db.relationship('User', foreign_keys=[created_by_id])
|
||||
columns = db.relationship('KanbanColumn', backref='board', lazy=True, cascade='all, delete-orphan', order_by='KanbanColumn.position')
|
||||
|
||||
# Unique constraint per company
|
||||
__table_args__ = (db.UniqueConstraint('company_id', 'name', name='uq_kanban_board_name_per_company'),)
|
||||
|
||||
def __repr__(self):
|
||||
return f'<KanbanBoard {self.name}>'
|
||||
|
||||
class KanbanColumn(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
name = db.Column(db.String(100), nullable=False)
|
||||
description = db.Column(db.Text, nullable=True)
|
||||
|
||||
# Column settings
|
||||
position = db.Column(db.Integer, nullable=False) # Order in board
|
||||
color = db.Column(db.String(7), default='#6c757d') # Hex color
|
||||
wip_limit = db.Column(db.Integer, nullable=True) # Work in progress limit
|
||||
is_active = db.Column(db.Boolean, default=True)
|
||||
|
||||
# Board association
|
||||
board_id = db.Column(db.Integer, db.ForeignKey('kanban_board.id'), nullable=False)
|
||||
|
||||
# Metadata
|
||||
created_at = db.Column(db.DateTime, default=datetime.now)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
|
||||
|
||||
# Relationships
|
||||
cards = db.relationship('KanbanCard', backref='column', lazy=True, cascade='all, delete-orphan', order_by='KanbanCard.position')
|
||||
|
||||
# Unique constraint per board
|
||||
__table_args__ = (db.UniqueConstraint('board_id', 'name', name='uq_kanban_column_name_per_board'),)
|
||||
|
||||
def __repr__(self):
|
||||
return f'<KanbanColumn {self.name}>'
|
||||
|
||||
@property
|
||||
def card_count(self):
|
||||
"""Get number of cards in this column"""
|
||||
return len([card for card in self.cards if card.is_active])
|
||||
|
||||
@property
|
||||
def is_over_wip_limit(self):
|
||||
"""Check if column is over WIP limit"""
|
||||
if not self.wip_limit:
|
||||
return False
|
||||
return self.card_count > self.wip_limit
|
||||
|
||||
class KanbanCard(db.Model):
|
||||
id = db.Column(db.Integer, primary_key=True)
|
||||
title = db.Column(db.String(200), nullable=False)
|
||||
description = db.Column(db.Text, nullable=True)
|
||||
|
||||
# Card settings
|
||||
position = db.Column(db.Integer, nullable=False) # Order in column
|
||||
color = db.Column(db.String(7), nullable=True) # Optional custom color
|
||||
is_active = db.Column(db.Boolean, default=True)
|
||||
|
||||
# Column association
|
||||
column_id = db.Column(db.Integer, db.ForeignKey('kanban_column.id'), nullable=False)
|
||||
|
||||
# Project context for cross-project support
|
||||
project_id = db.Column(db.Integer, db.ForeignKey('project.id'), nullable=True)
|
||||
|
||||
# Optional task association
|
||||
task_id = db.Column(db.Integer, db.ForeignKey('task.id'), nullable=True)
|
||||
|
||||
# Card assignment
|
||||
assigned_to_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=True)
|
||||
|
||||
# Card dates
|
||||
due_date = db.Column(db.Date, nullable=True)
|
||||
completed_date = db.Column(db.Date, nullable=True)
|
||||
|
||||
# Metadata
|
||||
created_at = db.Column(db.DateTime, default=datetime.now)
|
||||
updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
|
||||
created_by_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
|
||||
|
||||
# Relationships
|
||||
project = db.relationship('Project', backref='kanban_cards')
|
||||
task = db.relationship('Task', backref='kanban_cards')
|
||||
assigned_to = db.relationship('User', foreign_keys=[assigned_to_id], backref='assigned_kanban_cards')
|
||||
created_by = db.relationship('User', foreign_keys=[created_by_id])
|
||||
|
||||
def __repr__(self):
|
||||
return f'<KanbanCard {self.title}>'
|
||||
|
||||
def can_user_access(self, user):
|
||||
"""Check if a user can access this card"""
|
||||
# Check company membership first
|
||||
if self.column.board.company_id != user.company_id:
|
||||
return False
|
||||
|
||||
# If card has project context, check project permissions
|
||||
if self.project_id:
|
||||
return self.project.is_user_allowed(user)
|
||||
|
||||
# If no project context, allow access to anyone in the company
|
||||
return True
|
||||
|
||||
@property
|
||||
def project_code(self):
|
||||
"""Get project code for display purposes"""
|
||||
return self.project.code if self.project else None
|
||||
|
||||
@property
|
||||
def project_name(self):
|
||||
"""Get project name for display purposes"""
|
||||
return self.project.name if self.project else None
|
||||
|
||||
# Sprint Management System
|
||||
class SprintStatus(enum.Enum):
|
||||
@@ -984,7 +854,6 @@ class WidgetType(enum.Enum):
|
||||
# Task Management Widgets
|
||||
ASSIGNED_TASKS = "assigned_tasks"
|
||||
TASK_PRIORITY = "task_priority"
|
||||
KANBAN_SUMMARY = "kanban_summary"
|
||||
TASK_TRENDS = "task_trends"
|
||||
|
||||
# Analytics Widgets
|
||||
|
||||
Reference in New Issue
Block a user