mirror of
https://github.com/seanmorley15/AdventureLog.git
synced 2025-07-23 14:59:36 +02:00
upload
This commit is contained in:
parent
e4de8a39a4
commit
03927a2394
4 changed files with 104 additions and 7 deletions
|
@ -1,11 +1,11 @@
|
||||||
import os
|
import os
|
||||||
from .models import Adventure, ChecklistItem, Collection, Note, Transportation, Checklist
|
from .models import Adventure, AdventureImage, ChecklistItem, Collection, Note, Transportation, Checklist
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
|
||||||
class AdventureImageSerializer(serializers.ModelSerializer):
|
class AdventureImageSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Adventure
|
model = AdventureImage
|
||||||
fields = ['id', 'image']
|
fields = ['id', 'image', 'adventure']
|
||||||
read_only_fields = ['id']
|
read_only_fields = ['id']
|
||||||
|
|
||||||
def to_representation(self, instance):
|
def to_representation(self, instance):
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from django.urls import include, path
|
from django.urls import include, path
|
||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
from .views import AdventureViewSet, ChecklistViewSet, CollectionViewSet, NoteViewSet, StatsViewSet, GenerateDescription, ActivityTypesView, TransportationViewSet
|
from .views import AdventureViewSet, ChecklistViewSet, CollectionViewSet, NoteViewSet, StatsViewSet, GenerateDescription, ActivityTypesView, TransportationViewSet, AdventureImageViewSet
|
||||||
|
|
||||||
router = DefaultRouter()
|
router = DefaultRouter()
|
||||||
router.register(r'adventures', AdventureViewSet, basename='adventures')
|
router.register(r'adventures', AdventureViewSet, basename='adventures')
|
||||||
|
@ -11,6 +11,7 @@ router.register(r'activity-types', ActivityTypesView, basename='activity-types')
|
||||||
router.register(r'transportations', TransportationViewSet, basename='transportations')
|
router.register(r'transportations', TransportationViewSet, basename='transportations')
|
||||||
router.register(r'notes', NoteViewSet, basename='notes')
|
router.register(r'notes', NoteViewSet, basename='notes')
|
||||||
router.register(r'checklists', ChecklistViewSet, basename='checklists')
|
router.register(r'checklists', ChecklistViewSet, basename='checklists')
|
||||||
|
router.register(r'images', AdventureImageViewSet, basename='images')
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
|
import uuid
|
||||||
import requests
|
import requests
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
from django.db.models.functions import Lower
|
from django.db.models.functions import Lower
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from .models import Adventure, Checklist, Collection, Transportation, Note
|
from .models import Adventure, Checklist, Collection, Transportation, Note, AdventureImage
|
||||||
from worldtravel.models import VisitedRegion, Region, Country
|
from worldtravel.models import VisitedRegion, Region, Country
|
||||||
from .serializers import AdventureSerializer, CollectionSerializer, NoteSerializer, TransportationSerializer, ChecklistSerializer
|
from .serializers import AdventureImageSerializer, AdventureSerializer, CollectionSerializer, NoteSerializer, TransportationSerializer, ChecklistSerializer
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
from django.db.models import Q, Prefetch
|
from django.db.models import Q, Prefetch
|
||||||
from .permissions import IsOwnerOrReadOnly, IsPublicReadOnly
|
from .permissions import IsOwnerOrReadOnly, IsPublicReadOnly
|
||||||
|
@ -530,3 +531,83 @@ class ChecklistViewSet(viewsets.ModelViewSet):
|
||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
serializer.save(user_id=self.request.user)
|
serializer.save(user_id=self.request.user)
|
||||||
|
|
||||||
|
class AdventureImageViewSet(viewsets.ModelViewSet):
|
||||||
|
serializer_class = AdventureImageSerializer
|
||||||
|
permission_classes = [IsAuthenticated]\
|
||||||
|
|
||||||
|
# make sure that when creating and updating an image, the user is authenticated and the adventure user is the same as the authenticated user
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
if not request.user.is_authenticated:
|
||||||
|
return Response({"error": "User is not authenticated"}, status=status.HTTP_401_UNAUTHORIZED)
|
||||||
|
adventure_id = request.data.get('adventure')
|
||||||
|
try:
|
||||||
|
adventure = Adventure.objects.get(id=adventure_id)
|
||||||
|
except Adventure.DoesNotExist:
|
||||||
|
return Response({"error": "Adventure not found"}, status=status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
|
if adventure.user_id != request.user:
|
||||||
|
return Response({"error": "User does not own this adventure"}, status=status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
|
return super().create(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def update(self, request, *args, **kwargs):
|
||||||
|
if not request.user.is_authenticated:
|
||||||
|
return Response({"error": "User is not authenticated"}, status=status.HTTP_401_UNAUTHORIZED)
|
||||||
|
|
||||||
|
adventure_id = request.data.get('adventure')
|
||||||
|
try:
|
||||||
|
adventure = Adventure.objects.get(id=adventure_id)
|
||||||
|
except Adventure.DoesNotExist:
|
||||||
|
return Response({"error": "Adventure not found"}, status=status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
|
if adventure.user_id != request.user:
|
||||||
|
return Response({"error": "User does not own this adventure"}, status=status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
|
return super().update(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def destroy(self, request, *args, **kwargs):
|
||||||
|
if not request.user.is_authenticated:
|
||||||
|
return Response({"error": "User is not authenticated"}, status=status.HTTP_401_UNAUTHORIZED)
|
||||||
|
|
||||||
|
instance = self.get_object()
|
||||||
|
adventure = instance.adventure
|
||||||
|
if adventure.user_id != request.user:
|
||||||
|
return Response({"error": "User does not own this adventure"}, status=status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
|
return super().destroy(request, *args, **kwargs)
|
||||||
|
|
||||||
|
def partial_update(self, request, *args, **kwargs):
|
||||||
|
if not request.user.is_authenticated:
|
||||||
|
return Response({"error": "User is not authenticated"}, status=status.HTTP_401_UNAUTHORIZED)
|
||||||
|
|
||||||
|
instance = self.get_object()
|
||||||
|
adventure = instance.adventure
|
||||||
|
if adventure.user_id != request.user:
|
||||||
|
return Response({"error": "User does not own this adventure"}, status=status.HTTP_403_FORBIDDEN)
|
||||||
|
|
||||||
|
return super().partial_update(request, *args, **kwargs)
|
||||||
|
|
||||||
|
@action(detail=False, methods=['GET'], url_path='(?P<adventure_id>[0-9a-f-]+)')
|
||||||
|
def adventure_images(self, request, adventure_id=None, *args, **kwargs):
|
||||||
|
if not request.user.is_authenticated:
|
||||||
|
return Response({"error": "User is not authenticated"}, status=status.HTTP_401_UNAUTHORIZED)
|
||||||
|
|
||||||
|
try:
|
||||||
|
adventure_uuid = uuid.UUID(adventure_id)
|
||||||
|
except ValueError:
|
||||||
|
return Response({"error": "Invalid adventure ID"}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
queryset = AdventureImage.objects.filter(
|
||||||
|
Q(adventure__id=adventure_uuid) & Q(user_id=request.user)
|
||||||
|
)
|
||||||
|
|
||||||
|
serializer = self.get_serializer(queryset, many=True, context={'request': request})
|
||||||
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
# This method is used for list and retrieve actions
|
||||||
|
return AdventureImage.objects.filter(user_id=self.request.user)
|
||||||
|
|
||||||
|
def perform_create(self, serializer):
|
||||||
|
serializer.save(user_id=self.request.user)
|
|
@ -159,7 +159,7 @@ export const actions: Actions = {
|
||||||
}
|
}
|
||||||
formDataToSend.append('rating', rating ? rating.toString() : '');
|
formDataToSend.append('rating', rating ? rating.toString() : '');
|
||||||
formDataToSend.append('link', link || '');
|
formDataToSend.append('link', link || '');
|
||||||
formDataToSend.append('image', image);
|
// formDataToSend.append('image', image);
|
||||||
|
|
||||||
// log each key-value pair in the FormData
|
// log each key-value pair in the FormData
|
||||||
for (let pair of formDataToSend.entries()) {
|
for (let pair of formDataToSend.entries()) {
|
||||||
|
@ -233,6 +233,21 @@ export const actions: Actions = {
|
||||||
let image_url = new_id.image;
|
let image_url = new_id.image;
|
||||||
let link_url = new_id.link;
|
let link_url = new_id.link;
|
||||||
|
|
||||||
|
if (image && image.size > 0) {
|
||||||
|
let imageForm = new FormData();
|
||||||
|
imageForm.append('image', image);
|
||||||
|
imageForm.append('adventure', id);
|
||||||
|
let imageRes = await fetch(`${serverEndpoint}/api/images/`, {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
Cookie: `${event.cookies.get('auth')}`
|
||||||
|
},
|
||||||
|
body: imageForm
|
||||||
|
});
|
||||||
|
let data = await imageRes.json();
|
||||||
|
console.log(data);
|
||||||
|
}
|
||||||
|
|
||||||
return { id, user_id, image_url, link };
|
return { id, user_id, image_url, link };
|
||||||
},
|
},
|
||||||
edit: async (event) => {
|
edit: async (event) => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue