Skip to content

Commit 9b7d705

Browse files
committed
Merge remote-tracking branch 'origin/dev' into feature/auth
2 parents 39f25cb + daac508 commit 9b7d705

6 files changed

Lines changed: 42 additions & 16 deletions

File tree

.github/workflows/release-ci.yml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ jobs:
7676
type=ref,event=branch
7777
type=ref,event=pr
7878
type=semver,pattern={{version}}
79-
8079
- name: Build and push container
8180
uses: docker/build-push-action@v3
8281
with:
@@ -117,14 +116,11 @@ jobs:
117116
echo "EMAIL_PASSWORD=${{ secrets.EMAIL_PASSWORD }}" >> .env &&
118117
echo "EMAIL_HOST=${{ secrets.EMAIL_HOST }}" >> .env &&
119118
echo "EMAIL_PORT=${{ secrets.EMAIL_PORT }}" >> .env &&
120-
121119
echo "SELECTEL_ACCOUNT_ID=${{ secrets.SELECTEL_ACCOUNT_ID }}" >> .env &&
122120
echo "SELECTEL_CONTAINER_NAME=${{ secrets.SELECTEL_CONTAINER_NAME }}" >> .env &&
123121
echo "SELECTEL_CONTAINER_PASSWORD=${{ secrets.SELECTEL_CONTAINER_PASSWORD }}" >> .env &&
124122
echo "SELECTEL_CONTAINER_USERNAME=${{ secrets.SELECTEL_CONTAINER_USERNAME }}" >> .env &&
125-
126123
127124
echo "SENTRY_DSN=${{ secrets.SENTRY_DSN }}" >> .env
128125
129-
docker-compose -f docker-compose.prod-ci.yml -p prod up -d
130-
126+
docker-compose -f docker-compose.prod-ci.yml -p prod up -d

files/serializers.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from rest_framework.serializers import ModelSerializer
2+
3+
from files.models import UserFile
4+
5+
6+
class UserFileSerializer(ModelSerializer):
7+
class Meta:
8+
model = UserFile
9+
fields = ["user", "link", "datetime_uploaded"]

files/views.py

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,22 @@
11
from django.db import transaction
2+
from rest_framework import generics
23
from rest_framework import permissions, status
4+
from rest_framework.generics import get_object_or_404
35
from rest_framework.response import Response
4-
from rest_framework.views import APIView
56

67
from files.helpers import FileAPI
78
from files.models import UserFile
9+
from files.serializers import UserFileSerializer
810

911

10-
class FileView(APIView):
11-
permission_classes = [permissions.AllowAny]
12+
class FileView(generics.GenericAPIView):
13+
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
14+
serializer_class = UserFileSerializer
15+
queryset = UserFile.objects.all()
1216

1317
@transaction.atomic
1418
def post(self, request):
19+
"""creates a UserFile object and uploads the file to selectel"""
1520
file_api = FileAPI(request.FILES["file"], request.user)
1621
status_code, url = file_api.upload()
1722

@@ -20,3 +25,23 @@ def post(self, request):
2025
return Response({"url": url}, status=status.HTTP_201_CREATED)
2126

2227
return Response("Failed to upload file", status=status.HTTP_409_CONFLICT)
28+
29+
def delete(self, request, *args, **kwargs):
30+
"""deletes the file (only if the request is sent by the user who owns it!)
31+
The link has to be specified in the JSON body, not in the URL arguments.
32+
"""
33+
if request.data and (request.data.get("link") is not None):
34+
link = request.data.get("link")
35+
else:
36+
return Response(
37+
{
38+
"error": "you have to pass the link of the object you want to delete as JSON"
39+
},
40+
status=status.HTTP_400_BAD_REQUEST,
41+
)
42+
instance = get_object_or_404(self.get_queryset(), link=link)
43+
if instance.user != request.user:
44+
return Response(status=status.HTTP_403_FORBIDDEN)
45+
FileAPI.delete(instance.link) # delete the file via api
46+
self.perform_destroy(instance)
47+
return Response(status=status.HTTP_204_NO_CONTENT)

invites/filters.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,6 @@ class InviteFilter(filters.FilterSet):
1717
?is_active=false equals to .filter(is_active=False)
1818
"""
1919

20-
def __init__(self, *args, **kwargs):
21-
"""if is_active filter is not passed, default to True"""
22-
super().__init__(*args, **kwargs)
23-
if self.data.get("is_active") is None:
24-
self.data = dict(self.data)
25-
self.data["is_active"] = True
26-
2720
is_active = filters.BooleanFilter(field_name="is_active")
2821

2922
class Meta:

invites/views.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,13 @@ def create(self, request, *args, **kwargs):
2626

2727

2828
class InviteDetail(generics.RetrieveUpdateDestroyAPIView):
29+
queryset = Invite.objects.all()
2930
serializer_class = InviteDetailSerializer
3031
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
3132

3233

3334
class InviteAccept(generics.GenericAPIView):
35+
queryset = Invite.objects.all()
3436
serializer_class = InviteDetailSerializer
3537
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
3638

@@ -44,6 +46,7 @@ def post(self, request, *args, **kwargs):
4446

4547

4648
class InviteDecline(generics.GenericAPIView):
49+
queryset = Invite.objects.all()
4750
serializer_class = InviteDetailSerializer
4851
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
4952

users/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class MentorSerializer(serializers.ModelSerializer):
1717
class Meta:
1818
model = Mentor
1919
fields = [
20-
"job",
20+
# "job",
2121
"useful_to_project",
2222
]
2323

0 commit comments

Comments
 (0)