Skip to content

Commit

Permalink
Create minutes for Codex (#787)
Browse files Browse the repository at this point in the history
* init

* format
  • Loading branch information
MadsNyl committed Apr 8, 2024
1 parent c9b5975 commit 28067fa
Show file tree
Hide file tree
Showing 12 changed files with 349 additions and 0 deletions.
1 change: 1 addition & 0 deletions app/content/factories/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@
from app.content.factories.priority_pool_factory import PriorityPoolFactory
from app.content.factories.qr_code_factory import QRCodeFactory
from app.content.factories.logentry_factory import LogEntryFactory
from app.content.factories.minute_factory import MinuteFactory
14 changes: 14 additions & 0 deletions app/content/factories/minute_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import factory
from factory.django import DjangoModelFactory

from app.content.factories.user_factory import UserFactory
from app.content.models.minute import Minute


class MinuteFactory(DjangoModelFactory):
class Meta:
model = Minute

title = factory.Faker("sentence", nb_words=4)
content = factory.Faker("text")
author = factory.SubFactory(UserFactory)
47 changes: 47 additions & 0 deletions app/content/migrations/0059_minute.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Generated by Django 4.2.5 on 2024-04-08 17:56

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


class Migration(migrations.Migration):

dependencies = [
("content", "0058_merge_20231217_2155"),
]

operations = [
migrations.CreateModel(
name="Minute",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_at", models.DateTimeField(auto_now_add=True)),
("updated_at", models.DateTimeField(auto_now=True)),
("title", models.CharField(max_length=200)),
("content", models.TextField(blank=True, default="")),
(
"author",
models.ForeignKey(
blank=True,
default=None,
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="meeting_minutes",
to=settings.AUTH_USER_MODEL,
),
),
],
options={
"abstract": False,
},
),
]
1 change: 1 addition & 0 deletions app/content/models/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@
get_strike_strike_size,
)
from app.content.models.qr_code import QRCode
from app.content.models.minute import Minute
49 changes: 49 additions & 0 deletions app/content/models/minute.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
from django.db import models

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


class Minute(BaseModel, BasePermissionModel):
write_access = (AdminGroup.INDEX,)
read_access = (AdminGroup.INDEX,)

title = models.CharField(max_length=200)
content = models.TextField(default="", blank=True)
author = models.ForeignKey(
User,
blank=True,
null=True,
default=None,
on_delete=models.SET_NULL,
related_name="meeting_minutes",
)

@classmethod
def has_update_permission(cls, request):
return cls.has_write_permission(request)

@classmethod
def has_destroy_permission(cls, request):
return cls.has_write_permission(request)

@classmethod
def has_retrieve_permission(cls, request):
return cls.has_read_permission(request)

def has_object_read_permission(self, request):
return self.has_read_permission(request)

def has_object_update_permission(self, request):
return self.has_write_permission(request)

def has_object_destroy_permission(self, request):
return self.has_write_permission(request)

def has_object_retrieve_permission(self, request):
return self.has_read_permission(request)

def __str__(self):
return self.title
5 changes: 5 additions & 0 deletions app/content/serializers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,8 @@
DefaultUserSerializer,
UserPermissionsSerializer,
)
from app.content.serializers.minute import (
MinuteCreateSerializer,
MinuteSerializer,
MinuteUpdateSerializer,
)
37 changes: 37 additions & 0 deletions app/content/serializers/minute.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
from rest_framework import serializers

from app.content.models import Minute, User


class SimpleUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ("user_id", "first_name", "last_name", "image")


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

def create(self, validated_data):
author = self.context["request"].user
minute = Minute.objects.create(**validated_data, author=author)
return minute


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

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


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

def update(self, instance, validated_data):
return super().update(instance, validated_data)
2 changes: 2 additions & 0 deletions app/content/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
CheatsheetViewSet,
EventViewSet,
LogEntryViewSet,
MinuteViewSet,
NewsViewSet,
PageViewSet,
QRCodeViewSet,
Expand Down Expand Up @@ -42,6 +43,7 @@
router.register("pages", PageViewSet)
router.register("strikes", StrikeViewSet, basename="strikes")
router.register("log-entries", LogEntryViewSet, basename="log-entries")
router.register("minutes", MinuteViewSet, basename="minutes")

urlpatterns = [
re_path(r"", include(router.urls)),
Expand Down
1 change: 1 addition & 0 deletions app/content/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,4 @@
from app.content.views.toddel import ToddelViewSet
from app.content.views.qr_code import QRCodeViewSet
from app.content.views.logentry import LogEntryViewSet
from app.content.views.minute import MinuteViewSet
47 changes: 47 additions & 0 deletions app/content/views/minute.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
from rest_framework import 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.models import Minute
from app.content.serializers import (
MinuteCreateSerializer,
MinuteSerializer,
MinuteUpdateSerializer,
)


class MinuteViewSet(BaseViewSet):
serializer_class = MinuteSerializer
permission_classes = [BasicViewPermission]
pagination_class = BasePagination
queryset = Minute.objects.all()

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

return Response(
{"detail": serializer.errors}, status=status.HTTP_400_BAD_REQUEST
)

def update(self, request, *args, **kwargs):
minute = self.get_object()
serializer = MinuteUpdateSerializer(
minute, data=request.data, context={"request": request}
)
if serializer.is_valid():
minute = super().perform_update(serializer)
return Response(serializer.data, status=status.HTTP_200_OK)

return Response(
{"detail": serializer.errors}, status=status.HTTP_400_BAD_REQUEST
)

def destroy(self, request, *args, **kwargs):
super().destroy(request, *args, **kwargs)
return Response({"detail": "The minute was deleted"}, status=status.HTTP_200_OK)
12 changes: 12 additions & 0 deletions app/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from app.content.factories import (
CheatsheetFactory,
EventFactory,
MinuteFactory,
NewsFactory,
PageFactory,
ParentPageFactory,
Expand Down Expand Up @@ -124,6 +125,12 @@ def plask_member(member):
return member


@pytest.fixture()
def index_member(member):
add_user_to_group_with_name(member, AdminGroup.INDEX)
return member


@pytest.fixture()
def member_client(member):
return get_api_client(user=member)
Expand Down Expand Up @@ -281,3 +288,8 @@ def event_with_priority_pool(priority_group):
event = EventFactory(limit=1)
PriorityPoolFactory(event=event, groups=(priority_group,))
return event


@pytest.fixture()
def minute(user):
return MinuteFactory(author=user)
Loading

0 comments on commit 28067fa

Please sign in to comment.