3

나는 (Django auth Groups에서와 같이) 여러 그룹의 사용자를 포함하는 다소 선형적인 응답 프로세스가 필요한 Django의 프로젝트 관리 응용 프로그램을 개발 중입니다. 응답 프로세스의 각 단계에는 여러 응답 옵션 (단계에 고유 한 대부분의 옵션)이 있으며 특정 그룹 내의 사용자에게 지정됩니다. 프로세스의 다음 단계는 사용자의 응답에 의해 결정되며 때로는 프로젝트 구성원 중 하나로부터 추가 정보를 요청해야 할 수도 있습니다.Django : 선형 (아직 유연한) 프로젝트 관리 워크 플로우를 어떻게 추적합니까?

문제는 현재 구현이 다소 번거롭고 응답 프로세스를 추적하는 더 나은 방법이 있다는 것입니다. 나는 누군가가보다 견고한 솔루션에 대한 통찰력을 제공 할 수 있기를 희망했다.

예를 들어 영업 담당자, 영업 관리자 및 프로젝트 관리자와 같은 사용자 그룹이있는 프로젝트를 생각해보십시오. 모델은 현재 다음과 같습니다 : 여기

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. 에서 더 많은 정보를 요청 승인, 다음과 같은 옵션이 표시되는 프로젝트 관리자에 할당 :
    (가) 시작 프로젝트
    (b)는 거부 프로젝트
    (다) 영업 담당자로부터 더 많은 정보를 요청하거나 영업 관리자
  4. 더하면 정보가 사용자로부터 요청되면 프로젝트는 해당 사용자에게 할당되고 텍스트 상자 응답 만 제공하면됩니다. 그러나 일단 응답이 수신되면 프로젝트는 이전 단계로 돌아 가야합니다 (위의 이유로 current_step 및 previous_step을 추적합니다). 이 예에서 Project Manager가 영업 담당자에게 더 많은 정보를 요청하면 영업 담당자가 응답 한 후에 프로젝트가 이전과 동일한 응답 옵션으로 프로젝트 관리자에게 다시 지정되어야합니다 (시작, 거부, 추가 정보 요청).

전체 프로세스에는 약 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

스텝 모델을 더 활용하십시오. 가능한 다음 단계를 외래 키로 유지할 수 있습니다. 이렇게하면 데이터를 변경하여 흐름을 편집 할 수 있습니다 (예 : 관리자를 사용하여 하드 코딩하는 대신).아마 같은 :

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). 그리고 사용자의 행동은 무엇이며 그에 따라 행동하십시오.

+0

답변 해 주셔서 감사합니다. 나중에 오늘 같이 놀고 어떻게 진행되는지 알려 드리겠습니다. –

+0

다른 일을하고 싶었습니다. 일부 허용 된 작업의 경우 작성해야하는 몇 가지 필드가 있습니다. 내가 이러한 필드를 폼 수준에서 지정하거나 AllowedActionOption과 같은 다른 ManyToMany 필드를 만들어야합니까? 모든 도움에 감사드립니다. –

+0

단순한 경우 (예 : 모든 텍스트 상자와 이름이 다른 경우), AllowedAction에서 M2M으로 다른 모델을 만들어야합니다. 더 복잡한 경우 (일부 필드는 다른 장소로 FK, 일부는 텍스트, 일부는 URL 등), django의 양식을 사용하고 허용 된 작업에서 사용할 양식을 지정하십시오. –

관련 문제