Skip to content

Commit

Permalink
Merge pull request #119 from seanmorley15/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
seanmorley15 authored Jul 12, 2024
2 parents 9904ab5 + 1929227 commit ddc492b
Show file tree
Hide file tree
Showing 7 changed files with 278 additions and 89 deletions.
4 changes: 3 additions & 1 deletion backend/server/adventures/urls.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import AdventureViewSet, TripViewSet, StatsViewSet
from .views import AdventureViewSet, TripViewSet, StatsViewSet, GenerateDescription

router = DefaultRouter()
router.register(r'adventures', AdventureViewSet, basename='adventures')
router.register(r'trips', TripViewSet, basename='trips')
router.register(r'stats', StatsViewSet, basename='stats')
router.register(r'generate', GenerateDescription, basename='generate')


urlpatterns = [
# Include the router under the 'api/' prefix
Expand Down
110 changes: 87 additions & 23 deletions backend/server/adventures/views.py
Original file line number Diff line number Diff line change
@@ -1,44 +1,74 @@
import requests
from rest_framework.decorators import action
from rest_framework import viewsets
from django.db.models.functions import Lower
from rest_framework.response import Response
from .models import Adventure, Trip
from worldtravel.models import VisitedRegion, Region, Country
from .serializers import AdventureSerializer, TripSerializer
from rest_framework.permissions import IsAuthenticated
from django.db.models import Q, Prefetch
from .permissions import IsOwnerOrReadOnly, IsPublicReadOnly
from rest_framework.pagination import PageNumberPagination

class StandardResultsSetPagination(PageNumberPagination):
page_size = 10
page_size_query_param = 'page_size'
max_page_size = 1000

from rest_framework.pagination import PageNumberPagination

from rest_framework.decorators import action
from rest_framework.response import Response
from django.db.models import Q

class AdventureViewSet(viewsets.ModelViewSet):
serializer_class = AdventureSerializer
permission_classes = [IsOwnerOrReadOnly, IsPublicReadOnly]
pagination_class = StandardResultsSetPagination

def get_queryset(self):
return Adventure.objects.filter(
lower_name = Lower('name')
queryset = Adventure.objects.annotate(
).filter(
Q(is_public=True) | Q(user_id=self.request.user.id)
)

).order_by(lower_name) # Sort by the annotated lowercase name
return queryset

def perform_create(self, serializer):
serializer.save(user_id=self.request.user)

@action(detail=False, methods=['get'])
def visited(self, request):
visited_adventures = Adventure.objects.filter(
type='visited', user_id=request.user.id, trip=None)
serializer = self.get_serializer(visited_adventures, many=True)
return Response(serializer.data)
def filtered(self, request):
types = request.query_params.get('types', '').split(',')
valid_types = ['visited', 'planned', 'featured']
types = [t for t in types if t in valid_types]

@action(detail=False, methods=['get'])
def planned(self, request):
planned_adventures = Adventure.objects.filter(
type='planned', user_id=request.user.id, trip=None)
serializer = self.get_serializer(planned_adventures, many=True)
return Response(serializer.data)
if not types:
return Response({"error": "No valid types provided"}, status=400)

@action(detail=False, methods=['get'])
def featured(self, request):
featured_adventures = Adventure.objects.filter(
type='featured', is_public=True, trip=None)
serializer = self.get_serializer(featured_adventures, many=True)
queryset = Adventure.objects.none()

for adventure_type in types:
if adventure_type in ['visited', 'planned']:
queryset |= Adventure.objects.filter(
type=adventure_type, user_id=request.user.id, trip=None)
elif adventure_type == 'featured':
queryset |= Adventure.objects.filter(
type='featured', is_public=True, trip=None)

lower_name = Lower('name')
queryset = queryset.order_by(lower_name)
adventures = self.paginate_and_respond(queryset, request)
return adventures

def paginate_and_respond(self, queryset, request):
paginator = self.pagination_class()
page = paginator.paginate_queryset(queryset, request)
if page is not None:
serializer = self.get_serializer(page, many=True)
return paginator.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)

class TripViewSet(viewsets.ModelViewSet):
Expand All @@ -57,11 +87,12 @@ def get_queryset(self):
def perform_create(self, serializer):
serializer.save(user_id=self.request.user)

@action(detail=False, methods=['get'])
@action(detail=False, methods=['get'])
def visited(self, request):
trips = self.get_queryset().filter(type='visited', user_id=request.user.id)
serializer = self.get_serializer(trips, many=True)
return Response(serializer.data)
visited_adventures = Adventure.objects.filter(
type='visited', user_id=request.user.id, trip=None)
return self.get_paginated_response(visited_adventures)

@action(detail=False, methods=['get'])
def planned(self, request):
Expand Down Expand Up @@ -103,4 +134,37 @@ def counts(self, request):
'total_regions': total_regions,
'country_count': country_count,
'total_countries': total_countries
})
})

class GenerateDescription(viewsets.ViewSet):
permission_classes = [IsAuthenticated]

@action(detail=False, methods=['get'],)
def desc(self, request):
name = self.request.query_params.get('name', '')
# un url encode the name
name = name.replace('%20', ' ')
print(name)
url = 'https://en.wikipedia.org/w/api.php?origin=*&action=query&prop=extracts&exintro&explaintext&format=json&titles=%s' % name
response = requests.get(url)
data = response.json()
data = response.json()
page_id = next(iter(data["query"]["pages"]))
extract = data["query"]["pages"][page_id]
if extract.get('extract') is None:
return Response({"error": "No description found"}, status=400)
return Response(extract)
@action(detail=False, methods=['get'],)
def img(self, request):
name = self.request.query_params.get('name', '')
# un url encode the name
name = name.replace('%20', ' ')
url = 'https://en.wikipedia.org/w/api.php?origin=*&action=query&prop=pageimages&format=json&piprop=original&titles=%s' % name
response = requests.get(url)
data = response.json()
page_id = next(iter(data["query"]["pages"]))
extract = data["query"]["pages"][page_id]
if extract.get('original') is None:
return Response({"error": "No image found"}, status=400)
return Response(extract["original"])

12 changes: 6 additions & 6 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ version: "3.9"

services:
web:
#build: ./frontend/
image: ghcr.io/seanmorley15/adventurelog-frontend:latest
build: ./frontend/
#image: ghcr.io/seanmorley15/adventurelog-frontend:latest
environment:
- PUBLIC_SERVER_URL=http://server:8000
- ORIGIN=http://localhost:8080
- ORIGIN=http://10.0.0.92:8080
- BODY_SIZE_LIMIT=Infinity
ports:
- "8080:3000"
Expand All @@ -23,8 +23,8 @@ services:
- postgres_data:/var/lib/postgresql/data/

server:
#build: ./backend/
image: ghcr.io/seanmorley15/adventurelog-backend:latest
build: ./backend/
#image: ghcr.io/seanmorley15/adventurelog-backend:latest
environment:
- PGHOST=db
- PGDATABASE=database
Expand All @@ -34,7 +34,7 @@ services:
- DJANGO_ADMIN_USERNAME=admin
- DJANGO_ADMIN_PASSWORD=admin
- [email protected]
- PUBLIC_URL='http://127.0.0.1:81'
- PUBLIC_URL='http://10.0.92:81'
- CSRF_TRUSTED_ORIGINS=https://api.adventurelog.app,https://adventurelog.app
- DEBUG=False
ports:
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/routes/+page.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ export const actions: Actions = {
}
});
if (res.ok) {
cookies.delete('auth', { path: '/' });
cookies.delete('refresh', { path: '/' });
cookies.delete('auth', { path: '/', secure: false });
cookies.delete('refresh', { path: '/', secure: false });
return redirect(302, '/login');
} else {
return redirect(302, '/');
Expand Down
Loading

0 comments on commit ddc492b

Please sign in to comment.