Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat(minute)/viewset #788

Merged
merged 3 commits into from
Apr 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@

## Neste versjon

## Versjon 2023.04.08
- ✨ **Codex** Index brukere kan nå opprette dokumenter og møtereferater i Codex.

## Versjon 2023.03.11
- 🦟 **Vipps** Brukere som kommer fra venteliste vil nå få en payment countdown startet, slik at de blir kastet ut hvis de ikke betaler.
- ⚡ **Venteliste** Brukere vil nå se sin reelle ventelisteplass som tar hensyn til prioriteringer.
Expand Down
7 changes: 7 additions & 0 deletions app/content/admin/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -251,3 +251,10 @@ def object_link(self, obj):

object_link.admin_order_field = "object_repr"
object_link.short_description = "object"


@admin.register(models.Minute)
class MinuteAdmin(admin.ModelAdmin):
list_display = ("title", "author", "created_at", "updated_at")
search_fields = ("title", "content", "author__user_id")
list_filter = ("author",)
5 changes: 5 additions & 0 deletions app/content/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,8 @@ class CategoryEnum(ChoiceEnum):
KURS = "Kurs"
ANNET = "Annet"
FADDERUKA = "Fadderuka"


class MinuteTagEnum(models.TextChoices):
MINUTE = "Møtereferat"
DOCUMENT = "Dokument"
1 change: 1 addition & 0 deletions app/content/filters/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from app.content.filters.cheatsheet import CheatsheetFilter
from app.content.filters.event import EventFilter
from app.content.filters.user import UserFilter
from app.content.filters.minute import MinuteFilter
15 changes: 15 additions & 0 deletions app/content/filters/minute.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from django_filters.rest_framework import FilterSet, OrderingFilter

from app.content.models import Minute


class MinuteFilter(FilterSet):
"""Filters minutes"""

ordering = OrderingFilter(
fields=("created_at", "updated_at", "title", "author", "tag")
)

class Meta:
model = Minute
fields = ["author", "title", "tag"]
22 changes: 22 additions & 0 deletions app/content/migrations/0060_minute_tag.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 4.2.5 on 2024-04-08 19:44

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("content", "0059_minute"),
]

operations = [
migrations.AddField(
model_name="minute",
name="tag",
field=models.CharField(
choices=[("Møtereferat", "Minute"), ("Dokument", "Document")],
default="Møtereferat",
max_length=50,
),
),
]
4 changes: 4 additions & 0 deletions app/content/models/minute.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from app.common.enums import AdminGroup
from app.common.permissions import BasePermissionModel
from app.content.enums import MinuteTagEnum
from app.content.models.user import User
from app.util.models import BaseModel

Expand All @@ -12,6 +13,9 @@ class Minute(BaseModel, BasePermissionModel):

title = models.CharField(max_length=200)
content = models.TextField(default="", blank=True)
tag = models.CharField(
max_length=50, choices=MinuteTagEnum.choices, default=MinuteTagEnum.MINUTE
)
author = models.ForeignKey(
User,
blank=True,
Expand Down
1 change: 1 addition & 0 deletions app/content/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,5 @@
MinuteCreateSerializer,
MinuteSerializer,
MinuteUpdateSerializer,
MinuteListSerializer,
)
14 changes: 11 additions & 3 deletions app/content/serializers/minute.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class Meta:
class MinuteCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Minute
fields = ("title", "content")
fields = ("title", "content", "tag")

def create(self, validated_data):
author = self.context["request"].user
Expand All @@ -25,13 +25,21 @@ class MinuteSerializer(serializers.ModelSerializer):

class Meta:
model = Minute
fields = ("id", "title", "content", "author", "created_at", "updated_at")
fields = ("id", "title", "content", "author", "created_at", "updated_at", "tag")


class MinuteUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = Minute
fields = ("id", "title", "content")
fields = ("id", "title", "content", "tag")

def update(self, instance, validated_data):
return super().update(instance, validated_data)


class MinuteListSerializer(serializers.ModelSerializer):
author = SimpleUserSerializer(read_only=True)

class Meta:
model = Minute
fields = ("id", "title", "author", "created_at", "updated_at", "tag")
23 changes: 21 additions & 2 deletions app/content/views/minute.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
from rest_framework import status
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, status
from rest_framework.response import Response

from app.common.pagination import BasePagination
from app.common.permissions import BasicViewPermission
from app.common.viewsets import BaseViewSet
from app.content.filters import MinuteFilter
from app.content.models import Minute
from app.content.serializers import (
MinuteCreateSerializer,
MinuteListSerializer,
MinuteSerializer,
MinuteUpdateSerializer,
)
Expand All @@ -18,11 +21,26 @@ class MinuteViewSet(BaseViewSet):
pagination_class = BasePagination
queryset = Minute.objects.all()

filter_backends = [DjangoFilterBackend, filters.SearchFilter]
filterset_class = MinuteFilter
search_fields = [
"title",
"author__first_name",
"author__last_name",
"author__user_id",
]

def get_serializer_class(self):
if hasattr(self, "action") and self.action == "list":
return MinuteListSerializer
return super().get_serializer_class()

def create(self, request, *args, **kwargs):
data = request.data
serializer = MinuteCreateSerializer(data=data, context={"request": request})
if serializer.is_valid():
super().perform_create(serializer)
minute = super().perform_create(serializer)
serializer = MinuteSerializer(minute)
return Response(serializer.data, status=status.HTTP_201_CREATED)

return Response(
Expand All @@ -36,6 +54,7 @@ def update(self, request, *args, **kwargs):
)
if serializer.is_valid():
minute = super().perform_update(serializer)
serializer = MinuteSerializer(minute)
return Response(serializer.data, status=status.HTTP_200_OK)

return Response(
Expand Down
Loading