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

标签 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) 

以下是该过程如何工作的简单概述:
  • 销售代表创建一个新项目并将其分配给销售经理
  • 销售经理提供以下选项:
    (a) 批准项目或
    (b) 向销售代表索取更多信息
  • 如果项目获得批准,则分配给项目经理,项目经理提供以下选项:
    (a) 启动项目
    (b) 拒绝该项目
    (c) 向销售代表或销售经理索取更多信息
  • 如果向用户请求更多信息,项目将分配给该用户,他们只需要提供一个文本框响应。但是,一旦收到他们的响应,项目需要返回到上一步(这就是我跟踪上面的 current_step 和 previous_step 的原因)。在此示例中,如果项目经理向销售代表请求更多信息,则一旦销售代表做出响应,项目应被分配回项目经理,并使用与之前相同的响应选项(开始、拒绝、请求更多信息)。

  • 整个过程大约有 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)
    

    现在每个响应 Action 的逻辑都被硬编码在 View 中,一步与另一步之间没有正式的关系。我觉得应该使用更好的模型结构或数据结构来跟踪这个工作流程,但是我使用当前系统已经很长时间了,以至于我很难以不同的方式思考它。任何见解或灵感将不胜感激!如果我需要澄清任何事情,请告诉我。

    最佳答案

    更多地使用 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 )。

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

    关于Django:如何跟踪线性(但灵活)的项目管理工作流程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3516396/

    相关文章:

    django - “SubfieldBase的处理方法已弃用。请改用Field.from_db_value。”

    python - 如何在 Django View 中定义 get_queryset、get_context_data?

    c# - 你如何处理大型项目?

    ruby - 使用 Bundler 为什么要关心 RVM 的 Gemset 特性?

    python - "def __iter__(self): return iter(self.file)"是做什么用的?

    python - url 中省略的参数

    language-agnostic - 契约(Contract)设计和测试驱动开发

    language-agnostic - 在 Web 应用程序中进行适当的 UI/交互/功能设计需要哪些技能?

    web-services - 将记录从 Netsuite 发送到外部系统的最佳方式?

    java - 如何在 github 操作工作流中运行我的单元测试?