mirror of
https://github.com/seanmorley15/AdventureLog.git
synced 2026-01-09 23:19:01 -05:00
202 lines
7.6 KiB
Python
202 lines
7.6 KiB
Python
import os
|
|
from django.contrib import admin
|
|
from django.utils.html import mark_safe, format_html
|
|
from django.urls import reverse
|
|
from .models import Location, Checklist, ChecklistItem, Collection, Transportation, Note, ContentImage, Visit, Category, ContentAttachment, Lodging, CollectionInvite, Trail, Activity, CollectionItineraryItem, CollectionItineraryDay
|
|
from worldtravel.models import Country, Region, VisitedRegion, City, VisitedCity
|
|
from allauth.account.decorators import secure_admin_login
|
|
|
|
admin.autodiscover()
|
|
admin.site.login = secure_admin_login(admin.site.login)
|
|
|
|
@admin.action(description="Trigger geocoding")
|
|
def trigger_geocoding(modeladmin, request, queryset):
|
|
count = 0
|
|
for location in queryset:
|
|
try:
|
|
location.save() # Triggers geocoding logic in your model
|
|
count += 1
|
|
except Exception as e:
|
|
modeladmin.message_user(request, f"Error geocoding {location}: {e}", level='error')
|
|
modeladmin.message_user(request, f"Geocoding triggered for {count} locations.", level='success')
|
|
|
|
|
|
|
|
class LocationAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'get_category', 'get_visit_count', 'user', 'is_public')
|
|
list_filter = ( 'user', 'is_public')
|
|
search_fields = ('name',)
|
|
readonly_fields = ('city', 'region', 'country')
|
|
actions = [trigger_geocoding]
|
|
|
|
def get_category(self, obj):
|
|
if obj.category and obj.category.display_name and obj.category.icon:
|
|
return obj.category.display_name + ' ' + obj.category.icon
|
|
elif obj.category and obj.category.name:
|
|
return obj.category.name
|
|
else:
|
|
return 'No Category'
|
|
|
|
get_category.short_description = 'Category'
|
|
|
|
def get_visit_count(self, obj):
|
|
return obj.visits.count()
|
|
|
|
get_visit_count.short_description = 'Visit Count'
|
|
|
|
|
|
class CountryAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'country_code', 'number_of_regions')
|
|
list_filter = ('subregion',)
|
|
search_fields = ('name', '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',)
|
|
search_fields = ('name', 'country__name')
|
|
# 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'
|
|
|
|
class CityAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'region', 'country')
|
|
list_filter = ('region', 'region__country')
|
|
search_fields = ('name', 'region__name', 'region__country__name')
|
|
|
|
def country(self, obj):
|
|
return obj.region.country.name
|
|
|
|
country.short_description = 'Country'
|
|
|
|
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', 'is_staff', 'is_active', 'image_display', 'measurement_system', 'default_currency']
|
|
readonly_fields = ('uuid',)
|
|
search_fields = ('username',)
|
|
fieldsets = UserAdmin.fieldsets + (
|
|
(None, {'fields': ('profile_pic', 'uuid', 'public_profile', 'disable_password', 'measurement_system', 'default_currency')}),
|
|
)
|
|
def image_display(self, obj):
|
|
if obj.profile_pic:
|
|
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
|
|
public_url = public_url.replace("'", "")
|
|
return mark_safe(f'<img src="{public_url}/media/{obj.profile_pic.name}" width="100px" height="100px"')
|
|
else:
|
|
return
|
|
|
|
class ContentImageImageAdmin(admin.ModelAdmin):
|
|
list_display = ('user', 'image_display')
|
|
|
|
def image_display(self, obj):
|
|
if obj.image:
|
|
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
|
|
public_url = public_url.replace("'", "")
|
|
return mark_safe(f'<img src="{public_url}/media/{obj.image.name}" width="100px" height="100px"')
|
|
else:
|
|
return
|
|
|
|
|
|
class VisitAdmin(admin.ModelAdmin):
|
|
list_display = ('location', 'start_date', 'end_date', 'notes')
|
|
list_filter = ('start_date', 'end_date')
|
|
search_fields = ('notes',)
|
|
|
|
|
|
def image_display(self, obj):
|
|
if obj.image: # Ensure this field matches your model's image field
|
|
public_url = os.environ.get('PUBLIC_URL', 'http://127.0.0.1:8000').rstrip('/')
|
|
public_url = public_url.replace("'", "")
|
|
return mark_safe(f'<img src="{public_url}/media/{obj.image.name}" width="100px" height="100px"')
|
|
else:
|
|
return
|
|
|
|
image_display.short_description = 'Image Preview'
|
|
|
|
class CollectionInviteAdmin(admin.ModelAdmin):
|
|
list_display = ('collection', 'invited_user', 'created_at')
|
|
search_fields = ('collection__name', 'invited_user__username')
|
|
readonly_fields = ('created_at',)
|
|
|
|
def invited_user(self, obj):
|
|
return obj.invited_user.username if obj.invited_user else 'N/A'
|
|
|
|
invited_user.short_description = 'Invited User'
|
|
|
|
class CategoryAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'user', 'display_name', 'icon')
|
|
search_fields = ('name', 'display_name')
|
|
|
|
class CollectionAdmin(admin.ModelAdmin):
|
|
|
|
|
|
list_display = ('name', 'user', 'is_public')
|
|
|
|
class ActivityAdmin(admin.ModelAdmin):
|
|
list_display = ('name', 'user', 'visit__location', 'sport_type', 'distance', 'elevation_gain', 'moving_time')
|
|
|
|
class CollectionItineraryItemAdmin(admin.ModelAdmin):
|
|
list_display = ('collection', 'content_type', 'object_link', 'date', 'order')
|
|
search_fields = ('collection__name', 'content_type__model')
|
|
list_filter = ('content_type', 'date')
|
|
raw_id_fields = ('collection',)
|
|
readonly_fields = ('created_at',)
|
|
|
|
def object_link(self, obj):
|
|
"""
|
|
Display the generic related object; link to its admin change page if registered.
|
|
"""
|
|
linked_obj = obj.item
|
|
if not linked_obj:
|
|
return "—"
|
|
try:
|
|
ct = obj.content_type
|
|
app_label = ct.app_label
|
|
model = ct.model
|
|
admin_url = reverse('admin:%s_%s_change' % (app_label, model), args=[obj.object_id])
|
|
return format_html('<a href="{}">{}</a>', admin_url, str(linked_obj))
|
|
except Exception:
|
|
# Fallback to plain text if any error (object not registered, missing id, etc.)
|
|
return str(linked_obj)
|
|
|
|
object_link.short_description = 'Item'
|
|
|
|
admin.site.register(CustomUser, CustomUserAdmin)
|
|
admin.site.register(Location, LocationAdmin)
|
|
admin.site.register(Collection, CollectionAdmin)
|
|
admin.site.register(Visit, VisitAdmin)
|
|
admin.site.register(Country, CountryAdmin)
|
|
admin.site.register(Region, RegionAdmin)
|
|
admin.site.register(VisitedRegion)
|
|
admin.site.register(Transportation)
|
|
admin.site.register(Note)
|
|
admin.site.register(Checklist)
|
|
admin.site.register(ChecklistItem)
|
|
admin.site.register(ContentImage, ContentImageImageAdmin)
|
|
admin.site.register(Category, CategoryAdmin)
|
|
admin.site.register(City, CityAdmin)
|
|
admin.site.register(VisitedCity)
|
|
admin.site.register(ContentAttachment)
|
|
admin.site.register(Lodging)
|
|
admin.site.register(CollectionInvite, CollectionInviteAdmin)
|
|
admin.site.register(Trail)
|
|
admin.site.register(Activity, ActivityAdmin)
|
|
admin.site.register(CollectionItineraryItem, CollectionItineraryItemAdmin)
|
|
admin.site.register(CollectionItineraryDay)
|
|
|
|
admin.site.site_header = 'AdventureLog Admin'
|
|
admin.site.site_title = 'AdventureLog Admin Site'
|
|
admin.site.index_title = 'Welcome to AdventureLog Admin Page'
|