4

私は 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) 

プロセスがどのように機能するかの簡単な概要を次に示します。

  1. 営業担当者が新しいプロジェクトを作成し、それが営業マネージャーに割り当てられます

  2. 営業マネージャーには、(a)プロジェクトを承認する、または
    (b) 営業担当者に詳細情報を要求 する、次のオプションが提示されます。
  3. プロジェクトが承認された場合、次のオプションが提示されたプロジェクト マネージャーに
    割り当て ます

  4. ユーザーからさらに情報が要求された場合、プロジェクトはそのユーザーに割り当てられ、テキストボックスの応答を提供するだけで済みます。ただし、応答が受信されたら、プロジェクトは前のステップに戻る必要があります (これが、上記の 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)

現在、各応答アクションのロジックはビューにハード コードされており、あるステップと別のステップの間に正式な関係はありません。このワークフローを追跡するために使用する必要がある、より優れたモデル構造またはデータ構造があるように感じますが、現在のシステムを長い間使用しているため、別の方法で考えるのに苦労しています。どんな洞察やインスピレーションも大歓迎です!何か明確にする必要がある場合はお知らせください。

4

1 に答える 1

1

Stepモデルをもっと活用してください。可能な次のステップを外部キーとして保持できます。このようにして、データを変更してフローを編集できます (たとえば、ハードコーディングする代わりに admin を使用します)。たぶん次のようなもの:

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 つのビューのみが必要です (実際の作業を行うには、Project クラスのメソッドを呼び出すだけです)。現在のプロジェクトの状態 (そのプロジェクトの最新の ProjectHistoryStep) と、ユーザーの行動、およびそれに応じた行動。

于 2010-08-18T23:00:28.367 に答える