Files
allianceauth/allianceauth/timerboard/views.py
2024-03-08 17:37:11 +08:00

130 lines
4.0 KiB
Python

import datetime
import logging
from django.contrib import messages
from django.contrib.auth.mixins import (
LoginRequiredMixin, PermissionRequiredMixin,
)
from django.db.models import Q
from django.shortcuts import get_object_or_404, redirect, render
from django.template.loader import render_to_string
from django.urls import reverse_lazy
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django.views import View
from django.views.generic import CreateView, DeleteView, UpdateView
from allianceauth.eveonline.models import EveCorporationInfo
from allianceauth.timerboard.form import TimerForm
from allianceauth.timerboard.models import Timer
logger = logging.getLogger(__name__)
TIMER_VIEW_PERMISSION = 'auth.timer_view'
TIMER_MANAGE_PERMISSION = 'auth.timer_management'
class BaseTimerView(LoginRequiredMixin, PermissionRequiredMixin, View):
pass
class TimerView(BaseTimerView):
template_name = 'timerboard/view.html'
permission_required = TIMER_VIEW_PERMISSION
def get(self, request):
logger.debug(f"timer_view called by user {request.user}")
char = request.user.profile.main_character
if char:
corp = char.corporation
else:
corp = None
base_query = Timer.objects.select_related('eve_character')
render_items = {
'timers': base_query.filter(corp_timer=False),
'corp_timers': base_query.filter(corp_timer=True, eve_corp=corp),
'future_timers': base_query.filter(corp_timer=False, eve_time__gte=timezone.now()),
'past_timers': base_query.filter(corp_timer=False, eve_time__lt=timezone.now()),
}
return render(request, self.template_name, context=render_items)
class TimerManagementView(BaseTimerView):
permission_required = TIMER_MANAGE_PERMISSION
index_redirect = 'timerboard:view'
success_url = reverse_lazy(index_redirect)
model = Timer
def get_timer(self, timer_id):
return get_object_or_404(self.model, id=timer_id)
class AddUpdateMixin:
def get_form_kwargs(self):
"""
Inject the request user into the kwargs passed to the form
"""
kwargs = super().get_form_kwargs()
kwargs.update({'user': self.request.user})
return kwargs
class AddTimerView(TimerManagementView, AddUpdateMixin, CreateView):
template_name_suffix = '_create_form'
form_class = TimerForm
def form_valid(self, form):
result = super().form_valid(form)
timer = self.object
logger.info(
f"Created new timer in {timer.system} at {timer.eve_time} by user {self.request.user}"
)
messages.success(
self.request,
_('Added new timer in %(system)s at %(time)s.') % {"system": timer.system, "time": timer.eve_time}
)
return result
class EditTimerView(TimerManagementView, AddUpdateMixin, UpdateView):
template_name_suffix = '_update_form'
form_class = TimerForm
def form_valid(self, form):
messages.success(self.request, _('Saved changes to the timer.'))
return super().form_valid(form)
class RemoveTimerView(TimerManagementView, DeleteView):
form_class = TimerForm
def dashboard_timers(request):
if request.user.has_perm(TIMER_VIEW_PERMISSION):
try:
corp = request.user.profile.main_character.corporation
except (EveCorporationInfo.DoesNotExist, AttributeError):
return ""
timers = Timer.objects.select_related(
'eve_character'
).filter(
(Q(corp_timer=True) & Q(eve_corp=corp)) | Q(corp_timer=False),
eve_time__gte=timezone.now()
)[:5]
if timers.count():
context = {
'timers': timers,
}
return render_to_string(
template_name='timerboard/dashboard.timers.html',
context=context, request=request
)
else:
return ""
else:
return ""