mirror of
https://github.com/seanmorley15/AdventureLog.git
synced 2025-07-24 23:39:37 +02:00
migration to new backend
This commit is contained in:
parent
28a5d423c2
commit
9abe9fb315
309 changed files with 21476 additions and 24132 deletions
0
backend/server/adventures/__init__.py
Normal file
0
backend/server/adventures/__init__.py
Normal file
66
backend/server/adventures/admin.py
Normal file
66
backend/server/adventures/admin.py
Normal file
|
@ -0,0 +1,66 @@
|
|||
from django.contrib import admin
|
||||
from django.utils.html import mark_safe
|
||||
from .models import Adventure
|
||||
from worldtravel.models import Country, Region, VisitedRegion
|
||||
|
||||
|
||||
class AdventureAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'type', 'user_id', 'date', 'image_display')
|
||||
list_filter = ('type', 'user_id')
|
||||
|
||||
def image_display(self, obj):
|
||||
if obj.image:
|
||||
return mark_safe(f'<img src="{obj.image.url}" width="100px" height="100px"')
|
||||
else:
|
||||
return
|
||||
|
||||
image_display.short_description = 'Image Preview'
|
||||
|
||||
|
||||
class CountryAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'country_code', 'continent', 'number_of_regions')
|
||||
list_filter = ('continent', 'country_code')
|
||||
|
||||
def number_of_regions(self, obj):
|
||||
return Region.objects.filter(country=obj).count()
|
||||
|
||||
number_of_regions.short_description = 'Number of Regions'
|
||||
|
||||
|
||||
class RegionAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'country', 'number_of_visits')
|
||||
# list_filter = ('country', 'number_of_visits')
|
||||
|
||||
def number_of_visits(self, obj):
|
||||
return VisitedRegion.objects.filter(region=obj).count()
|
||||
|
||||
number_of_visits.short_description = 'Number of Visits'
|
||||
|
||||
from django.contrib import admin
|
||||
from django.contrib.auth.admin import UserAdmin
|
||||
from users.models import CustomUser
|
||||
|
||||
class CustomUserAdmin(UserAdmin):
|
||||
model = CustomUser
|
||||
list_display = ['username', 'email', 'is_staff', 'is_active', 'image_display']
|
||||
fieldsets = UserAdmin.fieldsets + (
|
||||
(None, {'fields': ('profile_pic',)}),
|
||||
)
|
||||
def image_display(self, obj):
|
||||
if obj.profile_pic:
|
||||
return mark_safe(f'<img src="{obj.profile_pic.url}" width="100px" height="100px"')
|
||||
else:
|
||||
return
|
||||
|
||||
admin.site.register(CustomUser, CustomUserAdmin)
|
||||
|
||||
|
||||
|
||||
admin.site.register(Adventure, AdventureAdmin)
|
||||
admin.site.register(Country, CountryAdmin)
|
||||
admin.site.register(Region, RegionAdmin)
|
||||
admin.site.register(VisitedRegion)
|
||||
|
||||
admin.site.site_header = 'AdventureLog Admin'
|
||||
admin.site.site_title = 'AdventureLog Admin Site'
|
||||
admin.site.index_title = 'Welcome to AdventureLog Admin Page'
|
6
backend/server/adventures/apps.py
Normal file
6
backend/server/adventures/apps.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class AdventuresConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "adventures"
|
0
backend/server/adventures/management/__init__.py
Normal file
0
backend/server/adventures/management/__init__.py
Normal file
50
backend/server/adventures/management/commands/travel-seed.py
Normal file
50
backend/server/adventures/management/commands/travel-seed.py
Normal file
|
@ -0,0 +1,50 @@
|
|||
# myapp/management/commands/seed.py
|
||||
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.contrib.auth import get_user_model
|
||||
from adventures.models import Adventure
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Imports the featured adventures'
|
||||
|
||||
def handle(self, *args, **kwargs):
|
||||
User = get_user_model()
|
||||
username = input(
|
||||
"Enter a username to own the featured adventures: ")
|
||||
|
||||
try:
|
||||
user = User.objects.get(username=username)
|
||||
except User.DoesNotExist:
|
||||
self.stdout.write(self.style.ERROR(
|
||||
f'User with username "{username}" does not exist.'))
|
||||
return
|
||||
|
||||
adventures = [
|
||||
('Yellowstone National Park', 'Wyoming, Montana, Idaho, USA', 'featured'),
|
||||
('Yosemite National Park', 'California, USA', 'featured'),
|
||||
('Banff National Park', 'Alberta, Canada', 'featured'),
|
||||
('Kruger National Park', 'Limpopo, South Africa', 'featured'),
|
||||
('Grand Canyon National Park', 'Arizona, USA', 'featured'),
|
||||
('Great Smoky Mountains National Park',
|
||||
'North Carolina, Tennessee, USA', 'featured'),
|
||||
('Zion National Park', 'Utah, USA', 'featured'),
|
||||
('Glacier National Park', 'Montana, USA', 'featured'),
|
||||
('Rocky Mountain National Park', 'Colorado, USA', 'featured'),
|
||||
('Everglades National Park', 'Florida, USA', 'featured'),
|
||||
('Arches National Park', 'Utah, USA', 'featured'),
|
||||
('Acadia National Park', 'Maine, USA', 'featured'),
|
||||
('Sequoia National Park', 'California, USA', 'featured'),
|
||||
]
|
||||
|
||||
for name, location, type_ in adventures:
|
||||
Adventure.objects.create(
|
||||
user_id=user,
|
||||
name=name,
|
||||
location=location,
|
||||
type=type_,
|
||||
is_public=True
|
||||
)
|
||||
|
||||
self.stdout.write(self.style.SUCCESS(
|
||||
'Successfully inserted featured adventures!'))
|
13
backend/server/adventures/middleware.py
Normal file
13
backend/server/adventures/middleware.py
Normal file
|
@ -0,0 +1,13 @@
|
|||
class AppVersionMiddleware:
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
def __call__(self, request):
|
||||
# Process request (if needed)
|
||||
response = self.get_response(request)
|
||||
|
||||
# Add custom header to response
|
||||
# Replace with your app version
|
||||
response['X-AdventureLog-Version'] = '1.0.0'
|
||||
|
||||
return response
|
31
backend/server/adventures/migrations/0001_initial.py
Normal file
31
backend/server/adventures/migrations/0001_initial.py
Normal file
|
@ -0,0 +1,31 @@
|
|||
# Generated by Django 5.0.6 on 2024-06-28 01:01
|
||||
|
||||
import django.contrib.postgres.fields
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Adventure',
|
||||
fields=[
|
||||
('id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('type', models.CharField(max_length=100)),
|
||||
('name', models.CharField(max_length=200)),
|
||||
('location', models.CharField(blank=True, max_length=200, null=True)),
|
||||
('activity_types', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, null=True, size=None)),
|
||||
('description', models.TextField(blank=True, null=True)),
|
||||
('rating', models.FloatField(blank=True, null=True)),
|
||||
('link', models.URLField(blank=True, null=True)),
|
||||
('image', models.ImageField(blank=True, null=True, upload_to='images/')),
|
||||
('date', models.DateField(blank=True, null=True)),
|
||||
('trip_id', models.IntegerField(blank=True, null=True)),
|
||||
],
|
||||
),
|
||||
]
|
23
backend/server/adventures/migrations/0002_initial.py
Normal file
23
backend/server/adventures/migrations/0002_initial.py
Normal file
|
@ -0,0 +1,23 @@
|
|||
# Generated by Django 5.0.6 on 2024-06-28 01:01
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('adventures', '0001_initial'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='adventure',
|
||||
name='user_id',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,18 @@
|
|||
# Generated by Django 5.0.6 on 2024-06-28 15:29
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('adventures', '0002_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='adventure',
|
||||
name='is_public',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
]
|
|
@ -0,0 +1,23 @@
|
|||
# Generated by Django 5.0.6 on 2024-06-28 18:30
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('adventures', '0003_adventure_is_public'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='adventure',
|
||||
name='latitude',
|
||||
field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='adventure',
|
||||
name='longitude',
|
||||
field=models.DecimalField(blank=True, decimal_places=6, max_digits=9, null=True),
|
||||
),
|
||||
]
|
0
backend/server/adventures/migrations/__init__.py
Normal file
0
backend/server/adventures/migrations/__init__.py
Normal file
33
backend/server/adventures/models.py
Normal file
33
backend/server/adventures/models.py
Normal file
|
@ -0,0 +1,33 @@
|
|||
from django.db import models
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.postgres.fields import ArrayField
|
||||
|
||||
|
||||
# Assuming you have a default user ID you want to use
|
||||
default_user_id = 1 # Replace with an actual user ID
|
||||
|
||||
User = get_user_model()
|
||||
|
||||
|
||||
class Adventure(models.Model):
|
||||
id = models.AutoField(primary_key=True)
|
||||
user_id = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, default=default_user_id)
|
||||
type = models.CharField(max_length=100)
|
||||
name = models.CharField(max_length=200)
|
||||
location = models.CharField(max_length=200, blank=True, null=True)
|
||||
activity_types = ArrayField(models.CharField(
|
||||
max_length=100), blank=True, null=True)
|
||||
description = models.TextField(blank=True, null=True)
|
||||
rating = models.FloatField(blank=True, null=True)
|
||||
link = models.URLField(blank=True, null=True)
|
||||
image = models.ImageField(null=True, blank=True, upload_to='images/')
|
||||
date = models.DateField(blank=True, null=True)
|
||||
trip_id = models.IntegerField(blank=True, null=True)
|
||||
is_public = models.BooleanField(default=False)
|
||||
longitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
|
||||
latitude = models.DecimalField(max_digits=9, decimal_places=6, null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
19
backend/server/adventures/serializers.py
Normal file
19
backend/server/adventures/serializers.py
Normal file
|
@ -0,0 +1,19 @@
|
|||
import os
|
||||
from .models import Adventure
|
||||
from rest_framework import serializers
|
||||
|
||||
class AdventureSerializer(serializers.ModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = Adventure
|
||||
fields = '__all__' # Serialize all fields of the Adventure model
|
||||
|
||||
def to_representation(self, instance):
|
||||
representation = super().to_representation(instance)
|
||||
if instance.image:
|
||||
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
|
||||
print(public_url)
|
||||
# remove any ' from the url
|
||||
public_url = public_url.replace("'", "")
|
||||
representation['image'] = f"{public_url}/media/{instance.image.name}"
|
||||
return representation
|
3
backend/server/adventures/tests.py
Normal file
3
backend/server/adventures/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
11
backend/server/adventures/urls.py
Normal file
11
backend/server/adventures/urls.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
from django.urls import include, path
|
||||
from rest_framework.routers import DefaultRouter
|
||||
from .views import AdventureViewSet
|
||||
|
||||
router = DefaultRouter()
|
||||
router.register(r'adventures', AdventureViewSet, basename='adventures')
|
||||
|
||||
urlpatterns = [
|
||||
# Include the router under the 'api/' prefix
|
||||
path('', include(router.urls)),
|
||||
]
|
44
backend/server/adventures/views.py
Normal file
44
backend/server/adventures/views.py
Normal file
|
@ -0,0 +1,44 @@
|
|||
from rest_framework.decorators import action
|
||||
from rest_framework import viewsets
|
||||
from rest_framework.response import Response
|
||||
from .models import Adventure
|
||||
from .serializers import AdventureSerializer
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from django.db.models import Q
|
||||
|
||||
# Create your views here.
|
||||
|
||||
class AdventureViewSet(viewsets.ModelViewSet):
|
||||
serializer_class = AdventureSerializer
|
||||
permission_classes = [IsAuthenticated]
|
||||
|
||||
def get_queryset(self):
|
||||
# Allow any user to see public adventures or their own adventures
|
||||
return Adventure.objects.filter(
|
||||
Q(is_public=True) | Q(user_id=self.request.user.id)
|
||||
)
|
||||
|
||||
def perform_create(self, serializer):
|
||||
serializer.save(user_id=self.request.user)
|
||||
|
||||
# Custom actions to return visited and planned adventures
|
||||
@action(detail=False, methods=['get'])
|
||||
def visited(self, request):
|
||||
visited_adventures = Adventure.objects.filter(
|
||||
type='visited', user_id=request.user.id, trip_id=None)
|
||||
serializer = self.get_serializer(visited_adventures, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
@action(detail=False, methods=['get'])
|
||||
def planned(self, request):
|
||||
planned_adventures = Adventure.objects.filter(
|
||||
type='planned', user_id=request.user.id, trip_id=None)
|
||||
serializer = self.get_serializer(planned_adventures, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
@action(detail=False, methods=['get'])
|
||||
def featured(self, request):
|
||||
featured_adventures = Adventure.objects.filter(
|
||||
type='featured', is_public=True, trip_id=None)
|
||||
serializer = self.get_serializer(featured_adventures, many=True)
|
||||
return Response(serializer.data)
|
Loading…
Add table
Add a link
Reference in a new issue