Skip to content

Commit 1561ff4

Browse files
authored
Merge pull request #42 from toggle-corp/feat/add-pmer
feat(pmer): add pmer feature
2 parents 280f48a + 96924f4 commit 1561ff4

22 files changed

Lines changed: 1080 additions & 0 deletions

‎apps/pmer/__init__.py‎

Whitespace-only changes.

‎apps/pmer/admin.py‎

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from django.contrib import admin
2+
3+
from .models import PmerReport
4+
5+
6+
@admin.register(PmerReport)
7+
class PmerReportAdmin(admin.ModelAdmin):
8+
list_display = ["title", "category", "report_type", "visibility"]
9+
list_filter = ["category", "report_type", "visibility"]
10+
search_fields = ["title"]
11+
readonly_fields = ["created_at", "updated_at"]
12+
ordering = ["-created_at"]

‎apps/pmer/apps.py‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from django.apps import AppConfig
2+
3+
4+
class PmerConfig(AppConfig):
5+
default_auto_field = "django.db.models.BigAutoField"
6+
name = "apps.pmer"
7+
verbose_name = "PMER"

‎apps/pmer/factories.py‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from factory.declarations import Sequence, SubFactory
2+
from factory.django import DjangoModelFactory, FileField
3+
4+
from apps.users.factories import UserFactory
5+
6+
from .models import PmerReport
7+
8+
9+
class PmerReportFactory(DjangoModelFactory[PmerReport]):
10+
title = Sequence(lambda n: f"PMER Report {n}")
11+
description = Sequence(lambda n: f"PMER report description {n}")
12+
file = FileField(filename="pmer-report.pdf")
13+
category = PmerReport.Category.DPR
14+
report_type = PmerReport.DocumentType.ANNUAL_REPORT
15+
visibility = PmerReport.Visibility.PUBLIC
16+
created_by = SubFactory(UserFactory)
17+
18+
class Meta: # type: ignore[misc]
19+
model = PmerReport

‎apps/pmer/graphql/__init__.py‎

Whitespace-only changes.

‎apps/pmer/graphql/filters.py‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import strawberry
2+
import strawberry_django
3+
4+
from apps.pmer.models import PmerReport, PmerReportCategory, PmerReportDocumentType
5+
from apps.reports.models import ReportVisibility
6+
7+
8+
@strawberry_django.filters.filter(PmerReport, lookups=True)
9+
class PmerReportFilter:
10+
id: strawberry.ID | None = strawberry.UNSET
11+
category: PmerReportCategory | None = strawberry.UNSET
12+
report_type: PmerReportDocumentType | None = strawberry.UNSET
13+
title: strawberry.auto
14+
department: strawberry.auto
15+
project: strawberry.auto
16+
region_id: strawberry.ID | None = strawberry.UNSET
17+
visibility: ReportVisibility | None = strawberry.UNSET

‎apps/pmer/graphql/inputs.py‎

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import strawberry
2+
import strawberry_django
3+
from strawberry.file_uploads import Upload
4+
5+
from apps.pmer.models import PmerReport, PmerReportCategory, PmerReportDocumentType
6+
from apps.reports.models import ReportVisibility
7+
8+
9+
@strawberry_django.input(PmerReport)
10+
class PmerReportCreateInput:
11+
title: strawberry.auto
12+
category: PmerReportCategory
13+
report_type: PmerReportDocumentType
14+
file: Upload
15+
description: strawberry.auto
16+
department: strawberry.auto
17+
project: strawberry.auto
18+
region: strawberry.ID | None = strawberry.UNSET
19+
visibility: ReportVisibility = ReportVisibility.PUBLIC
20+
21+
22+
@strawberry_django.partial(PmerReport)
23+
class PmerReportUpdateInput:
24+
title: strawberry.auto
25+
# `strawberry.auto` cannot resolve an IntegerChoicesField to a registered
26+
# GraphQL enum, so the choices enum is named explicitly here.
27+
category: PmerReportCategory | None = strawberry.UNSET
28+
report_type: PmerReportDocumentType | None = strawberry.UNSET
29+
file: Upload | None = strawberry.UNSET
30+
description: strawberry.auto
31+
department: strawberry.auto
32+
project: strawberry.auto
33+
region: strawberry.ID | None = strawberry.UNSET
34+
visibility: ReportVisibility | None = strawberry.UNSET

‎apps/pmer/graphql/mutations.py‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import strawberry
2+
import strawberry_django
3+
4+
from apps.pmer.models import PmerReport
5+
from apps.pmer.serializers import PmerReportSerializer
6+
from main.graphql.context import Info
7+
from main.graphql.permissions import IsAuthenticated
8+
from utils.graphql.mutations import ModelMutation
9+
from utils.graphql.types import MutationResponseType
10+
11+
from .inputs import PmerReportCreateInput, PmerReportUpdateInput
12+
from .types import PmerReportType
13+
14+
15+
@strawberry.type
16+
class Mutation:
17+
@strawberry_django.mutation(permission_classes=[IsAuthenticated])
18+
async def create_pmer_report(
19+
self,
20+
info: Info,
21+
data: PmerReportCreateInput,
22+
) -> MutationResponseType[PmerReportType]:
23+
return await ModelMutation(PmerReportSerializer).handle_create_mutation(data, info)
24+
25+
@strawberry_django.mutation(permission_classes=[IsAuthenticated])
26+
async def update_pmer_report(
27+
self,
28+
info: Info,
29+
id: strawberry.ID,
30+
data: PmerReportUpdateInput,
31+
) -> MutationResponseType[PmerReportType]:
32+
instance = await PmerReport.objects.aget(id=id)
33+
return await ModelMutation(PmerReportSerializer).handle_update_mutation(data, info, instance)
34+
35+
@strawberry_django.mutation(permission_classes=[IsAuthenticated])
36+
async def delete_pmer_report(
37+
self,
38+
info: Info,
39+
id: strawberry.ID,
40+
) -> MutationResponseType[PmerReportType]:
41+
instance = await PmerReport.objects.aget(id=id)
42+
await instance.adelete()
43+
return MutationResponseType(ok=True)

‎apps/pmer/graphql/orders.py‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import strawberry
2+
import strawberry_django
3+
4+
from apps.pmer.models import PmerReport
5+
6+
7+
@strawberry_django.order_type(PmerReport)
8+
class PmerReportOrder:
9+
title: strawberry.auto

‎apps/pmer/graphql/queries.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import strawberry
2+
import strawberry_django
3+
from strawberry_django.pagination import OffsetPaginated
4+
5+
from main.graphql.permissions import IsAuthenticated
6+
7+
from .filters import PmerReportFilter
8+
from .orders import PmerReportOrder
9+
from .types import PmerReportType
10+
11+
12+
@strawberry.type
13+
class Query:
14+
pmer_reports: OffsetPaginated[PmerReportType] = strawberry_django.offset_paginated(
15+
filters=PmerReportFilter,
16+
order=PmerReportOrder,
17+
permission_classes=[IsAuthenticated],
18+
)
19+
20+
pmer_report: PmerReportType = strawberry_django.field(
21+
permission_classes=[IsAuthenticated],
22+
)

0 commit comments

Comments
 (0)