Skip to content

Commit

Permalink
backoffice: standardizing author app
Browse files Browse the repository at this point in the history
  • Loading branch information
DonHaul committed Oct 2, 2024
1 parent 5b3d208 commit b565549
Show file tree
Hide file tree
Showing 22 changed files with 358 additions and 202 deletions.
Empty file.
23 changes: 23 additions & 0 deletions backoffice-repo/backoffice/backoffice/authors/admin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Register your models here.
from django.contrib import admin

from backoffice.authors.models import AuthorWorkflow
from backoffice.workflows.admin import WorkflowAdmin, WorkflowsAdminSite


class AuthorWorkflowsAdminSite(WorkflowsAdminSite):
"""
Custom admin site for managing author workflows.
This admin site extends the default Django admin site to include additional
functionality for managing author workflows. It checks whether the user has the
necessary permissions to access the admin site by verifying that they are
an active user and either a superuser or a member of the 'curator' group.
"""


@admin.register(AuthorWorkflow)
class AuthorWorkflowAdmin(WorkflowAdmin):
"""
Admin class for Author Workflow model. Define get, update and delete permissions.
"""
66 changes: 66 additions & 0 deletions backoffice-repo/backoffice/backoffice/authors/api/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
from backoffice.authors.constants import (
AuthorResolutionDags,
WorkflowType,
author_workflow_types,
)
from backoffice.authors.models import AuthorWorkflow
from backoffice.workflows.api.serializers import (
ResolutionSerializer,
WorkflowDocumentSerializer,
WorkflowSerializer,
)
from backoffice.workflows.constants import StatusChoices
from drf_spectacular.utils import OpenApiExample, extend_schema_serializer
from rest_framework import serializers


@extend_schema_serializer(
exclude_fields=[
"_created_at",
"_updated_at",
], # Exclude internal fields from schema
examples=[
OpenApiExample(
"Author Workflow Serializer",
summary="Author Workflow Serializer no data",
description="Author Workflow Serializer",
value={
"workflow_type": WorkflowType.AUTHOR_CREATE,
"status": StatusChoices.RUNNING,
"data": {},
},
),
],
)
class AuthorWorkflowSerializer(WorkflowSerializer):
def validate_workflow_type(self, value):
if value not in author_workflow_types:
raise serializers.ValidationError(
f"The field `workflow_type` should be on of {author_workflow_types}"
)
return value

class Meta(WorkflowSerializer.Meta):
model = AuthorWorkflow


@extend_schema_serializer(
examples=[
OpenApiExample(
"Accept",
description="Author Workflow Serializer",
value={"value": "accept", "create_ticket": False},
),
OpenApiExample(
"Reject",
description="Author Workflow Serializer",
value={"value": "reject", "create_ticket": False},
),
],
)
class AuthorResolutionSerializer(ResolutionSerializer):
value = serializers.ChoiceField(choices=AuthorResolutionDags)


class AuthorWorkflowDocumentSerializer(WorkflowDocumentSerializer):
pass
34 changes: 34 additions & 0 deletions backoffice-repo/backoffice/backoffice/authors/api/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import logging

from backoffice.authors.api.serializers import (
AuthorResolutionSerializer,
AuthorWorkflowDocumentSerializer,
AuthorWorkflowSerializer,
)
from backoffice.authors.constants import AuthorResolutionDags
from backoffice.authors.documents import AuthorWorkflowDocument
from backoffice.workflows.api.views import WorkflowDocumentView, WorkflowViewSet

logger = logging.getLogger(__name__)


class AuthorWorkflowViewSet(WorkflowViewSet):
serializer_class = AuthorWorkflowSerializer
resolution_serializer = AuthorResolutionSerializer
resolution_dags = AuthorResolutionDags


class AuthorWorkflowDocumentView(WorkflowDocumentView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.search = self.search.extra(track_total_hits=True)

document = AuthorWorkflowDocument
serializer_class = AuthorWorkflowDocumentSerializer
search_fields = {
"data.ids.value",
"data.ids.schema",
"data.name.value",
"data.name.preferred_name",
"data.email_addresses.value",
}
6 changes: 6 additions & 0 deletions backoffice-repo/backoffice/backoffice/authors/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class AuthorsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "backoffice.authors"
24 changes: 24 additions & 0 deletions backoffice-repo/backoffice/backoffice/authors/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from django.db import models

from backoffice.workflows.workflow_types import WorkflowType

author_workflow_types = [
WorkflowType.AUTHOR_CREATE,
WorkflowType.AUTHOR_UPDATE,
]


class AuthorResolutionDags(models.TextChoices):
accept = "accept", "author_create_approved_dag"
reject = "reject", "author_create_rejected_dag"
accept_curate = "accept_curate", "author_create_approved_dag"


class AuthorCreateDags(models.TextChoices):
initialize = "author_create_initialization_dag", "initialize"
approve = "author_create_approved_dag", "approve"
reject = "author_create_rejected_dag", "reject"


class AuthorUpdateDags(models.TextChoices):
initialize = "author_update_dag", "initialize"
10 changes: 10 additions & 0 deletions backoffice-repo/backoffice/backoffice/authors/documents.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from django.conf import settings
from django_opensearch_dsl.registries import registry

from backoffice.workflows.documents import WorkflowDocument


@registry.register_document
class AuthorWorkflowDocument(WorkflowDocument):
class Index(WorkflowDocument.Index):
name = settings.OPENSEARCH_INDEX_NAMES["authors"]
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Generated by Django 4.2.6 on 2024-10-01 16:01

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):
initial = True

dependencies = [
("workflows", "0012_remove_workflow_core_remove_workflow_is_update_and_more"),
]

operations = [
migrations.CreateModel(
name="AuthorWorkflow",
fields=[
(
"workflow_ptr",
models.OneToOneField(
auto_created=True,
on_delete=django.db.models.deletion.CASCADE,
parent_link=True,
primary_key=True,
serialize=False,
to="workflows.workflow",
),
),
],
bases=("workflows.workflow",),
),
]
Empty file.
5 changes: 5 additions & 0 deletions backoffice-repo/backoffice/backoffice/authors/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from backoffice.workflows.models import Workflow


class AuthorWorkflow(Workflow):
pass
1 change: 1 addition & 0 deletions backoffice-repo/backoffice/backoffice/authors/tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# Create your tests here.
4 changes: 0 additions & 4 deletions backoffice-repo/backoffice/backoffice/workflows/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,16 +101,12 @@ class WorkflowAdmin(BaseModelAdmin):
"id",
"workflow_type",
"status",
"core",
"is_update",
"_created_at",
"_updated_at",
)
list_filter = [
"workflow_type",
"status",
"core",
"is_update",
"_created_at",
"_updated_at",
]
Expand Down
54 changes: 3 additions & 51 deletions backoffice-repo/backoffice/backoffice/workflows/api/serializers.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from os import environ

from django_elasticsearch_dsl_drf.serializers import DocumentSerializer
from drf_spectacular.utils import OpenApiExample, extend_schema_serializer
from rest_framework import serializers

from backoffice.workflows.constants import ResolutionDags, StatusChoices, WorkflowType
from backoffice.workflows.constants import DECISION_CHOICES
from backoffice.workflows.documents import WorkflowDocument
from backoffice.workflows.models import Decision, Workflow, WorkflowTicket

Expand Down Expand Up @@ -47,53 +46,6 @@ class Meta:
fields = "__all__"


@extend_schema_serializer(
exclude_fields=[
"_created_at",
"_updated_at",
], # Exclude internal fields from schema
examples=[
OpenApiExample(
"Author Workflow Serializer",
summary="Author Workflow Serializer no data",
description="Author Workflow Serializer",
value={
"workflow_type": WorkflowType.AUTHOR_CREATE,
"status": StatusChoices.RUNNING,
"core": False,
"is_update": False,
"data": {},
},
),
],
)
class WorkflowAuthorSerializer(WorkflowSerializer):
def validate_workflow_type(self, value):
allowed_workflow_types = [
WorkflowType.AUTHOR_CREATE,
WorkflowType.AUTHOR_UPDATE,
]
if value not in allowed_workflow_types:
raise serializers.ValidationError(
f"The field `workflow_type` should be on of {allowed_workflow_types}"
)
return value


@extend_schema_serializer(
examples=[
OpenApiExample(
"Accept",
description="Author Workflow Serializer",
value={"value": "accept", "create_ticket": False},
),
OpenApiExample(
"Reject",
description="Author Workflow Serializer",
value={"value": "reject", "create_ticket": False},
),
],
)
class AuthorResolutionSerializer(serializers.Serializer):
value = serializers.ChoiceField(choices=ResolutionDags)
class ResolutionSerializer(serializers.Serializer):
value = serializers.ChoiceField(choices=DECISION_CHOICES)
create_ticket = serializers.BooleanField(default=False)
Loading

0 comments on commit b565549

Please sign in to comment.