2022-02-03 13:45:58 -05:00
|
|
|
from django.contrib import admin
|
2023-12-21 14:56:38 -05:00
|
|
|
from django.contrib.humanize.templatetags.humanize import naturaltime
|
|
|
|
|
|
|
|
from django_object_actions import DjangoObjectActions, action
|
|
|
|
from django_q.tasks import async_task
|
|
|
|
from django_q.models import Task
|
2022-02-03 13:45:58 -05:00
|
|
|
|
2023-12-30 14:34:55 -05:00
|
|
|
from .models import (
|
|
|
|
Member,
|
|
|
|
Flag,
|
|
|
|
Transaction,
|
|
|
|
Event,
|
|
|
|
EventExt,
|
|
|
|
EventMeetingTime,
|
|
|
|
EventInstructor,
|
|
|
|
)
|
2023-12-21 14:56:38 -05:00
|
|
|
from .tasks.scrape import scrape_membershipworks
|
2022-02-03 13:45:58 -05:00
|
|
|
|
|
|
|
|
2022-02-10 16:51:32 -05:00
|
|
|
class ReadOnlyAdmin(admin.ModelAdmin):
|
2022-02-03 13:45:58 -05:00
|
|
|
def has_add_permission(self, request, obj=None):
|
|
|
|
return False
|
|
|
|
|
2022-02-10 16:51:32 -05:00
|
|
|
def has_change_permission(self, request, obj=None):
|
|
|
|
return False
|
|
|
|
|
2022-02-03 13:45:58 -05:00
|
|
|
def has_delete_permission(self, request, obj=None):
|
|
|
|
return False
|
2022-02-10 16:51:32 -05:00
|
|
|
|
|
|
|
|
2023-12-21 14:56:38 -05:00
|
|
|
class BaseMembershipWorksAdmin(DjangoObjectActions, ReadOnlyAdmin):
|
|
|
|
changelist_actions = ("refresh_membershipworks_data",)
|
|
|
|
|
|
|
|
# internal method from DjangoObjectActions
|
|
|
|
def _get_tool_dict(self, tool_name):
|
|
|
|
tool = super(DjangoObjectActions, self)._get_tool_dict(tool_name)
|
|
|
|
if tool_name == "refresh_membershipworks_data":
|
|
|
|
last_run = (
|
|
|
|
Task.objects.filter(group="Scrape Data from MembershipWorks")
|
|
|
|
.order_by("started")
|
|
|
|
.last()
|
|
|
|
)
|
2023-12-22 13:37:19 -05:00
|
|
|
last_run_time = (
|
|
|
|
naturaltime(last_run.started) if last_run is not None else "Never"
|
|
|
|
)
|
|
|
|
tool["label"] = f"Refresh Data [Last Run {last_run_time}]"
|
2023-12-21 14:56:38 -05:00
|
|
|
return tool
|
|
|
|
|
|
|
|
@action
|
|
|
|
def refresh_membershipworks_data(self, request, obj):
|
|
|
|
async_task(scrape_membershipworks, group="Scrape Data from MembershipWorks")
|
|
|
|
self.message_user(
|
|
|
|
request,
|
|
|
|
"Queued refresh, please wait a few seconds/minutes then refresh the page",
|
|
|
|
)
|
|
|
|
|
|
|
|
|
2022-02-10 16:51:32 -05:00
|
|
|
class MemberFlagInline(admin.TabularInline):
|
|
|
|
model = Member.flags.through
|
|
|
|
|
|
|
|
|
|
|
|
@admin.register(Member)
|
2023-12-21 14:56:38 -05:00
|
|
|
class MemberAdmin(BaseMembershipWorksAdmin):
|
2023-03-31 23:54:16 -04:00
|
|
|
search_fields = ["^first_name", "^last_name", "^account_name"]
|
2022-02-10 16:51:32 -05:00
|
|
|
inlines = [MemberFlagInline]
|
|
|
|
|
|
|
|
|
|
|
|
@admin.register(Flag)
|
2023-12-21 14:56:38 -05:00
|
|
|
class FlagAdmin(BaseMembershipWorksAdmin):
|
2022-02-10 16:51:32 -05:00
|
|
|
inlines = [MemberFlagInline]
|
2023-01-19 19:02:03 -05:00
|
|
|
list_display = ["name", "type"]
|
|
|
|
list_filter = ["type"]
|
2023-12-04 13:08:36 -05:00
|
|
|
show_facets = admin.ShowFacets.ALWAYS
|
2023-01-19 19:02:03 -05:00
|
|
|
search_fields = ["name"]
|
2023-12-19 23:42:46 -05:00
|
|
|
|
|
|
|
|
|
|
|
@admin.register(Transaction)
|
2023-12-21 14:56:38 -05:00
|
|
|
class TransactionAdmin(BaseMembershipWorksAdmin):
|
2023-12-19 23:42:46 -05:00
|
|
|
list_display = ["timestamp", "member", "name", "type", "sum", "note"]
|
|
|
|
list_filter = ["type"]
|
|
|
|
show_facets = admin.ShowFacets.ALWAYS
|
2023-12-29 18:19:58 -05:00
|
|
|
search_fields = ["member", "name", "type", "note"]
|
|
|
|
date_hierarchy = "timestamp"
|
2023-12-30 14:34:55 -05:00
|
|
|
|
|
|
|
|
|
|
|
class EventMeetingTimeInline(admin.TabularInline):
|
|
|
|
model = EventMeetingTime
|
|
|
|
extra = 0
|
|
|
|
min_num = 1
|
|
|
|
|
|
|
|
readonly_fields = ["duration"]
|
|
|
|
|
|
|
|
# TODO: remove when switched to GeneratedField
|
|
|
|
@admin.display()
|
|
|
|
def duration(self, obj):
|
|
|
|
return obj.duration
|
|
|
|
|
|
|
|
|
|
|
|
@admin.register(EventInstructor)
|
|
|
|
class EventInstructorAdmin(admin.ModelAdmin):
|
|
|
|
autocomplete_fields = ["member"]
|
|
|
|
|
|
|
|
|
|
|
|
@admin.register(EventExt)
|
|
|
|
class EventAdmin(admin.ModelAdmin):
|
|
|
|
inlines = [EventMeetingTimeInline]
|
|
|
|
list_display = [
|
|
|
|
"title",
|
|
|
|
"start",
|
|
|
|
"end",
|
|
|
|
"duration",
|
|
|
|
"count",
|
|
|
|
"cap",
|
|
|
|
"category",
|
|
|
|
"venue",
|
|
|
|
]
|
|
|
|
list_filter = ["category", "calendar", "venue"]
|
|
|
|
show_facets = admin.ShowFacets.ALWAYS
|
|
|
|
search_fields = ["eid", "title", "url"]
|
|
|
|
date_hierarchy = "start"
|
|
|
|
readonly_fields = [
|
|
|
|
field.name
|
|
|
|
for field in Event._meta.get_fields()
|
|
|
|
if not (field.auto_created or field.many_to_many or not field.concrete)
|
|
|
|
] + ["duration"]
|
|
|
|
|
|
|
|
@admin.display()
|
|
|
|
def duration(self, obj):
|
|
|
|
return obj.duration
|
|
|
|
|
|
|
|
def has_add_permission(self, request, obj=None):
|
|
|
|
return False
|
|
|
|
|
|
|
|
def has_delete_permission(self, request, obj=None):
|
|
|
|
return False
|