1
0
Fork 0
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:
Sean Morley 2024-07-08 11:44:39 -04:00
parent 28a5d423c2
commit 9abe9fb315
309 changed files with 21476 additions and 24132 deletions

View file

View 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'

View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class AdventuresConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "adventures"

View 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!'))

View 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

View 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)),
],
),
]

View 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),
),
]

View file

@ -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),
),
]

View file

@ -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),
),
]

View 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

View 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

View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View 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)),
]

View 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)