Django:如何跟踪线性(但灵活)的项目管理工作流程?

时间:2010-08-18 20:30:05

标签: django project-management workflow data-modeling django-authentication

我正在Django开发一个项目管理应用程序,它需要一个涉及不同用户组的线性响应过程(如Django auth Groups)。响应过程中的每个步骤都有多个响应选项(步骤特有的大多数选项),并分配给特定组中的用户。该过程的下一步由用户的响应决定,有时可能需要从项目成员之一请求其他信息。

问题是我当前的实现看起来相当麻烦,我确信有更好的方法来跟踪响应过程。我希望有人可以提供一些更有力的解决方案。

作为一个简单示例,请考虑具有以下用户组的项目:销售代表,销售经理和项目经理。模型目前看起来像这样:

class Project(models.Model):  
    assigned_to = models.ForeignKey(User, related_name="projects_assigned_to") #Indicates which user needs to respond next.  Will be sales_rep, sales_mgr, or project_mgr.
    sales_rep = models.ForeignKey(User, related_name="sales_rep_projects") #choices limited to "Sales Rep" Group  
    sales_mgr = models.ForeignKey(User, related_name="sales_mgr_projects") #choices limited to "Sales Manager" Group 
    project_mgr = models.ForeignKey(User, related_name="project_mgr_projects") #choices limited to "Project Manager" Group
    current_step = models.ForeignKey(Step, related_name="projects_with_current_step")
    previous_step = models.ForeignKey(Step, related_name="projects_with_previous_step")
    status = models.ForeignKey(Status) #Automatically assigned according to the user's response.  Includes things like "On Track", "On Hold", "Rejected", "Accepted", etc.

class Step(models.Model):
    name = models.CharField(max_length=50) 

class Status(models.Model):
    name = models.CharField(max_length=50) 

以下是该流程如何运作的简单概述:

  1. 销售代表创建一个新项目,并将其分配给销售经理
  2. 销售经理提供以下选项:
    (a)批准该项目或 (b)要求销售代表提供更多信息
  3. 如果项目获得批准,请分配给提供以下选项的项目经理:
    (a)开始项目
    (b)拒绝该项目
    (c)要求销售代表或销售经理提供更多信息
  4. 如果要求用户提供更多信息,则会将项目分配给该用户,他们只需提供文本框响应即可。但是,一旦收到响应,项目就需要返回上一步(这就是我跟踪上面的current_step和previous_step的原因)。在此示例中,如果项目经理从销售代表请求更多信息,则一旦销售代表响应,项目应使用与之前相同的响应选项(开始,拒绝,请求更多信息)分配回项目管理器。 / LI>

    整个过程大约有10个左右的步骤。

    为了使事情复杂化,我还需要能够显示为每个步骤选择的响应。例如,如果销售经理批准项目,则应显示“销售经理批准项目”以及他们可能具有的任何评论。该模型如下所示:

    class Response(models.Model):
        comment = models.TextField()
        response_action = models.ForeignKey(ResponseAction)
        submitted = models.DateTimeField()
    
    class ResponseAction(models.Model):
         """ I.e. 'Sales Manager approved the project', 'Project Manager commenced the project'"""  
         name = models.CharField(max_length=100)
    

    现在,每个响应操作的逻辑都在视图中进行了硬编码,并且一个步骤与另一个步骤之间没有正式关系。我觉得我应该使用更好的模型结构或数据结构来跟踪这个工作流程,但是我一直在使用当前系统这么长时间以至于我无法以不同的方式思考它。任何见解或灵感将不胜感激!如果我需要澄清任何内容,请告诉我。

1 个答案:

答案 0 :(得分:1)

更多地使用Step模型。您可以将其作为外键保存可能的后续步骤。这样,您可以通过更改数据来编辑流(例如,使用管理员,而不是硬编码)。也许是这样的:

class Step(models.Model):
    name = models.CharField(max_length=50)
    responsible_role = models.CharField(max_length=50) # this contains 'sales_rep', 'sales_mgr' etc
    allowed_actions = models.ManyToManyField('AllowedAction')

class AllowedAction(models.Model):
    name = models.CharField(max_length=50)
    next_step = models.ForeignKey('Step') # the next step, if this action is chosen

将实际项目历史记录分离到另一个模型:

class ProjectHistoryStep(models.Model):
    timestamp = models.DateTimeField()
    step = models.ForeignKey('Step')
    project = models.ForeignKey('Project')  

您可以使用此模型跟踪项目的实际进度(不要忘记模型有get_next_by_FOO)。

你只需要一个处理所有逻辑的视图(它应该只调用Project类上的一些方法来完成实际工作) - 检查项目现在处于什么状态(该项目的最新ProjectHistoryStep),以及用户的行动是什么,并采取相应行动。