私は Django でプロジェクト管理アプリケーションを開発しています。これには、さまざまなユーザー グループ (Django auth Groups のように) が関与するやや直線的な応答プロセスが必要です。応答プロセスの各ステップにはいくつかの応答オプションがあり (ほとんどのオプションはステップに固有)、特定のグループ内のユーザーに割り当てられます。プロセスの次のステップは、ユーザーの応答によって決定され、場合によっては、プロジェクトのメンバーの 1 人から追加情報を要求する必要がある場合があります。
問題は、私の現在の実装がやや面倒に思えることであり、応答プロセスを追跡するためのより良い方法があると確信しています。誰かがより堅牢なソリューションへの洞察を提供してくれることを望んでいました。
簡単な例として、営業担当者、営業マネージャー、およびプロジェクト マネージャーのユーザー グループを持つプロジェクトを考えてみましょう。モデルは現在、次のようになっています。
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) 営業担当者に詳細情報を要求 する、次のオプションが提示されます。- プロジェクトが承認された場合、次のオプションが提示されたプロジェクト マネージャーに
割り当て ます
。 - ユーザーからさらに情報が要求された場合、プロジェクトはそのユーザーに割り当てられ、テキストボックスの応答を提供するだけで済みます。ただし、応答が受信されたら、プロジェクトは前のステップに戻る必要があります (これが、上記の 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)
現在、各応答アクションのロジックはビューにハード コードされており、あるステップと別のステップの間に正式な関係はありません。このワークフローを追跡するために使用する必要がある、より優れたモデル構造またはデータ構造があるように感じますが、現在のシステムを長い間使用しているため、別の方法で考えるのに苦労しています。どんな洞察やインスピレーションも大歓迎です!何か明確にする必要がある場合はお知らせください。