This repository has been archived by the owner on Nov 21, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #25 from inspirehep/author-wf-status
update workflow models
- Loading branch information
Showing
7 changed files
with
166 additions
and
39 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,15 @@ | ||
from rest_framework import serializers | ||
|
||
from backoffice.workflows.models import Workflow | ||
from backoffice.workflows.models import Workflow, WorkflowTicket | ||
|
||
|
||
class WorkflowSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = Workflow | ||
fields = "__all__" | ||
|
||
|
||
class WorkflowTicketSerializer(serializers.ModelSerializer): | ||
class Meta: | ||
model = WorkflowTicket | ||
fields = "__all__" |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# tickets | ||
TICKET_TYPES = ( | ||
("author_create_curation", "Author create curation"), | ||
("author_create_user", "Author create user"), | ||
) | ||
DEFAULT_TICKET_TYPE = "author_create_curation" | ||
|
||
# workflows | ||
DEFAULT_STATUS_CHOICE = "running" | ||
DEFAULT_WORKFLOW_TYPE = "HEP_create" | ||
STATUS_CHOICES = ( | ||
("running", "Running"), | ||
("approval", "Waiting for approval"), | ||
("completed", "Completed"), | ||
("error", "Error"), | ||
) | ||
|
||
WORKFLOW_TYPES = ( | ||
("HEP_CREATE", "HEP create"), | ||
("HEP_UPDATE", "HEP update"), | ||
("AUTHOR_CREATE", "Author create"), | ||
("AUTHOR_UPDATE", "Author update"), | ||
) |
38 changes: 38 additions & 0 deletions
38
backoffice/workflows/migrations/0005_workflowticket_ticket_type_alter_workflow_status.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
# Generated by Django 4.2.6 on 2023-12-07 14:57 | ||
|
||
from django.db import migrations, models | ||
|
||
|
||
class Migration(migrations.Migration): | ||
dependencies = [ | ||
("workflows", "0004_workflow_workflow_type"), | ||
] | ||
|
||
operations = [ | ||
migrations.AddField( | ||
model_name="workflowticket", | ||
name="ticket_type", | ||
field=models.CharField( | ||
choices=[ | ||
("author_create_curation", "Author create curation"), | ||
("author_create_user", "Author create user"), | ||
], | ||
default="author_create_curation", | ||
max_length=30, | ||
), | ||
), | ||
migrations.AlterField( | ||
model_name="workflow", | ||
name="status", | ||
field=models.CharField( | ||
choices=[ | ||
("running", "Running"), | ||
("approval", "Waiting for approval"), | ||
("completed", "Completed"), | ||
("error", "Error"), | ||
], | ||
default="running", | ||
max_length=30, | ||
), | ||
), | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,18 @@ | ||
import pytest | ||
from django.apps import apps | ||
from django.contrib.auth import get_user_model | ||
from django.contrib.auth.models import Group | ||
from django.test import TransactionTestCase | ||
from rest_framework.test import APIClient | ||
|
||
from backoffice.workflows.api.serializers import WorkflowTicketSerializer | ||
from backoffice.workflows.models import WorkflowTicket | ||
|
||
User = get_user_model() | ||
Workflow = apps.get_model(app_label="workflows", model_name="Workflow") | ||
|
||
|
||
class TestWorkflowViewSet(TransactionTestCase): | ||
endpoint = "/api/workflows/" | ||
class BaseTransactionTestCase(TransactionTestCase): | ||
reset_sequences = True | ||
fixtures = ["backoffice/fixtures/groups.json"] | ||
|
||
|
@@ -25,7 +28,16 @@ def setUp(self): | |
self.admin.groups.add(self.admin_group) | ||
|
||
self.api_client = APIClient() | ||
self.workflow = Workflow.objects.create(data={}, status="APPROVAL", core=True, is_update=False) | ||
|
||
|
||
class TestWorkflowViewSet(BaseTransactionTestCase): | ||
endpoint = "/api/workflows/" | ||
reset_sequences = True | ||
fixtures = ["backoffice/fixtures/groups.json"] | ||
|
||
def setUp(self): | ||
super().setUp() | ||
self.workflow = Workflow.objects.create(data={}, status="approval", core=True, is_update=False) | ||
|
||
def test_list_curator(self): | ||
self.api_client.force_authenticate(user=self.curator) | ||
|
@@ -48,50 +60,83 @@ def test_list_anonymous(self): | |
self.assertEqual(response.status_code, 403) | ||
|
||
|
||
class WorkflowPartialUpdateViewSet(TransactionTestCase): | ||
class TestWorkflowPartialUpdateViewSet(BaseTransactionTestCase): | ||
endpoint_base_url = "/api/workflow-update" | ||
reset_sequences = True | ||
fixtures = ["backoffice/fixtures/groups.json"] | ||
|
||
def setUp(self): | ||
self.curator_group = Group.objects.get(name="curator") | ||
self.admin_group = Group.objects.get(name="admin") | ||
|
||
self.curator = User.objects.create_user(email="[email protected]", password="12345") | ||
self.admin = User.objects.create_user(email="[email protected]", password="12345") | ||
self.user = User.objects.create_user(email="[email protected]", password="12345") | ||
|
||
self.curator.groups.add(self.curator_group) | ||
self.admin.groups.add(self.admin_group) | ||
|
||
self.api_client = APIClient() | ||
self.workflow = Workflow.objects.create(data={}, status="APPROVAL", core=True, is_update=False) | ||
super().setUp() | ||
self.workflow = Workflow.objects.create(data={}, status="approval", core=True, is_update=False) | ||
|
||
@property | ||
def endpoint(self): | ||
return f"{self.endpoint_base_url}/{self.workflow.id}/" | ||
|
||
def test_patch_curator(self): | ||
self.api_client.force_authenticate(user=self.curator) | ||
response = self.api_client.patch(self.endpoint, format="json", data={"status": "POSTPROCESSING"}) | ||
response = self.api_client.patch(self.endpoint, format="json", data={"status": "running"}) | ||
|
||
self.assertEqual(response.status_code, 200) | ||
workflow = Workflow.objects.filter(id=str(self.workflow.id))[0] | ||
assert workflow.status == "POSTPROCESSING" | ||
assert workflow.status == "running" | ||
|
||
def test_patch_admin(self): | ||
self.api_client.force_authenticate(user=self.admin) | ||
response = self.api_client.patch( | ||
self.endpoint, format="json", data={"status": "PREPROCESSING", "data": {"test": "test"}} | ||
self.endpoint, format="json", data={"status": "approval", "data": {"test": "test"}} | ||
) | ||
|
||
workflow = Workflow.objects.filter(id=str(self.workflow.id))[0] | ||
self.assertEqual(response.status_code, 200) | ||
self.assertEquals(workflow.status, "PREPROCESSING") | ||
self.assertEquals(workflow.status, "approval") | ||
self.assertEquals(workflow.data, {"test": "test"}) | ||
|
||
def test_patch_anonymous(self): | ||
self.api_client.force_authenticate(user=self.user) | ||
response = self.api_client.get(self.endpoint, format="json") | ||
|
||
self.assertEqual(response.status_code, 403) | ||
|
||
|
||
class TestWorkflowTicketViewSet(BaseTransactionTestCase): | ||
endpoint = "/api/workflow-ticket" | ||
reset_sequences = True | ||
fixtures = ["backoffice/fixtures/groups.json"] | ||
|
||
def setUp(self): | ||
super().setUp() | ||
self.workflow = Workflow.objects.create(data={}, status="running", core=True, is_update=False) | ||
self.workflow_ticket = WorkflowTicket.objects.create( | ||
workflow_id=self.workflow, ticket_id="123", ticket_type="author_create_user" | ||
) | ||
|
||
def test_get_missing_params(self): | ||
self.api_client.force_authenticate(user=self.curator) | ||
response = self.api_client.get( | ||
f"{TestWorkflowTicketViewSet.endpoint}/{self.workflow.id}/", format="json", data={} | ||
) | ||
|
||
assert response.status_code == 400 | ||
assert response.data == {"error": "Both workflow_id and ticket_type are required."} | ||
|
||
def test_get_ticket_not_found(self): | ||
query_params = {"ticket_type": "test"} | ||
self.api_client.force_authenticate(user=self.curator) | ||
response = self.api_client.get( | ||
f"{TestWorkflowTicketViewSet.endpoint}/{self.workflow.id}/", format="json", data=query_params | ||
) | ||
|
||
assert response.status_code == 404 | ||
assert response.data == {"error": "Workflow ticket not found."} | ||
|
||
def test_get_ticket_happy_flow(self): | ||
self.api_client.force_authenticate(user=self.curator) | ||
|
||
query_params = {"ticket_type": self.workflow_ticket.ticket_type} | ||
response = self.api_client.get( | ||
f"{TestWorkflowTicketViewSet.endpoint}/{self.workflow.id}/", format="json", data=query_params | ||
) | ||
|
||
assert response.status_code == 200 | ||
assert response.data == WorkflowTicketSerializer(self.workflow_ticket).data |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters