From fff2cd32d5bf57939de4951f2aa1d229cf3f24ce Mon Sep 17 00:00:00 2001 From: Basraah Date: Wed, 27 Sep 2017 19:12:07 +1000 Subject: [PATCH] Update timerboard views Adds basic unit tests Changed to class based views --- allianceauth/timerboard/form.py | 54 +++- allianceauth/timerboard/models.py | 2 +- .../timerboard/templates/timerboard/add.html | 29 --- .../timerboard/templates/timerboard/form.html | 33 +++ .../templates/timerboard/index_button.html | 4 + .../timerboard/timer_confirm_delete.html | 26 ++ .../timerboard/timer_create_form.html | 14 ++ .../timerboard/timer_update_form.html | 14 ++ .../templates/timerboard/update.html | 35 --- .../timerboard/{management.html => view.html} | 8 +- allianceauth/timerboard/tests.py | 232 +++++++++++++++++- allianceauth/timerboard/urls.py | 10 +- allianceauth/timerboard/views.py | 199 +++++---------- setup.py | 1 + 14 files changed, 453 insertions(+), 208 deletions(-) delete mode 100644 allianceauth/timerboard/templates/timerboard/add.html create mode 100644 allianceauth/timerboard/templates/timerboard/form.html create mode 100644 allianceauth/timerboard/templates/timerboard/index_button.html create mode 100644 allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html create mode 100644 allianceauth/timerboard/templates/timerboard/timer_create_form.html create mode 100644 allianceauth/timerboard/templates/timerboard/timer_update_form.html delete mode 100644 allianceauth/timerboard/templates/timerboard/update.html rename allianceauth/timerboard/templates/timerboard/{management.html => view.html} (98%) mode change 100755 => 100644 allianceauth/timerboard/tests.py diff --git a/allianceauth/timerboard/form.py b/allianceauth/timerboard/form.py index 261c11cf..44e4886f 100755 --- a/allianceauth/timerboard/form.py +++ b/allianceauth/timerboard/form.py @@ -1,9 +1,37 @@ +import logging +import datetime from django import forms +from django.utils import timezone from django.core.validators import MaxValueValidator, MinValueValidator from django.utils.translation import ugettext_lazy as _ +from .models import Timer + +logger = logging.getLogger(__name__) + + +class TimerForm(forms.ModelForm): + class Meta: + model = Timer + fields = ('details', 'system', 'planet_moon', 'structure', 'objective', 'important', 'corp_timer') + + def __init__(self, *args, **kwargs): + self.user = kwargs.pop('user', None) + if 'instance' in kwargs and kwargs['instance'] is not None: + # Do conversion from db datetime to days/hours/minutes + # for appropriate fields + current_time = timezone.now() + td = kwargs['instance'].eve_time - current_time + initial = kwargs.pop('initial', dict()) + if 'days_left' not in initial: + initial.update({'days_left': td.days}) + if 'hours_left' not in initial: + initial.update({'hours_left': td.seconds // 3600}) + if 'minutes_left' not in initial: + initial.update({'minutes_left': td.seconds // 60 % 60}) + kwargs.update({'initial': initial}) + super(TimerForm, self).__init__(*args, **kwargs) -class TimerForm(forms.Form): structure_choices = [('POCO', 'POCO'), ('I-HUB', 'I-HUB'), ('POS[S]', 'POS[S]'), ('POS[M]', 'POS[M]'), ('POS[L]', 'POS[L]'), ('Citadel[M]', 'Citadel[M]'), ('Citadel[L]', 'Citadel[L]'), ('Citadel[XL]', 'Citadel[XL]'), @@ -25,3 +53,27 @@ class TimerForm(forms.Form): validators=[MinValueValidator(0), MaxValueValidator(59)]) important = forms.BooleanField(label=_("Important"), required=False) corp_timer = forms.BooleanField(label=_("Corp-Restricted"), required=False) + + def save(self, commit=True): + timer = super(TimerForm, self).save(commit=False) + + # Get character + character = self.user.profile.main_character + corporation = character.corporation + logger.debug("Determined timer save request on behalf " + "of character {} corporation {}".format(character, corporation)) + # calculate future time + future_time = datetime.timedelta(days=self.cleaned_data['days_left'], hours=self.cleaned_data['hours_left'], + minutes=self.cleaned_data['minutes_left']) + current_time = timezone.now() + eve_time = current_time + future_time + logger.debug( + "Determined timer eve time is %s - current time %s, adding %s" % (eve_time, current_time, future_time)) + + timer.eve_time = eve_time + timer.eve_character = character + timer.eve_corp = corporation + timer.user = self.user + if commit: + timer.save() + return timer diff --git a/allianceauth/timerboard/models.py b/allianceauth/timerboard/models.py index d1a10c0f..708e7dc6 100755 --- a/allianceauth/timerboard/models.py +++ b/allianceauth/timerboard/models.py @@ -22,4 +22,4 @@ class Timer(models.Model): user = models.ForeignKey(User) def __str__(self): - return str(self.system) + ' ' + str(self.objective) + return str(self.system) + ' ' + str(self.details) diff --git a/allianceauth/timerboard/templates/timerboard/add.html b/allianceauth/timerboard/templates/timerboard/add.html deleted file mode 100644 index b0ce16ad..00000000 --- a/allianceauth/timerboard/templates/timerboard/add.html +++ /dev/null @@ -1,29 +0,0 @@ -{% extends "allianceauth/base.html" %} -{% load bootstrap %} -{% load staticfiles %} -{% load i18n %} -{% get_current_language as LANGUAGE_CODE %} - -{% block title %}{% trans "Alliance Auth - Structure Timer Create" %}{% endblock %} - -{% block page_title %}{% trans "Timer Create" %}{% endblock page_title %} - -{% block content %} -
-

{% trans "Create Structure Timer" %}

- -
-
-
- -
-
-
-
- -{% endblock content %} diff --git a/allianceauth/timerboard/templates/timerboard/form.html b/allianceauth/timerboard/templates/timerboard/form.html new file mode 100644 index 00000000..827c06ef --- /dev/null +++ b/allianceauth/timerboard/templates/timerboard/form.html @@ -0,0 +1,33 @@ +{% extends "allianceauth/base.html" %} +{% load bootstrap %} +{% load staticfiles %} +{% load i18n %} + +{% block page_title %} +{% endblock page_title %} + +{% block content %} +
+

+ {% block page_header %} + {% endblock %} + {% include 'timerboard/index_button.html' %} +

+
+
+
+ +
+
+
+
+ +{% endblock content %} diff --git a/allianceauth/timerboard/templates/timerboard/index_button.html b/allianceauth/timerboard/templates/timerboard/index_button.html new file mode 100644 index 00000000..cf7e20bf --- /dev/null +++ b/allianceauth/timerboard/templates/timerboard/index_button.html @@ -0,0 +1,4 @@ +{% load i18n %} +
+ Back +
diff --git a/allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html b/allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html new file mode 100644 index 00000000..63265ba8 --- /dev/null +++ b/allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html @@ -0,0 +1,26 @@ +{% extends "allianceauth/base.html" %} +{% load i18n %} + +{% block page_title %} + Delete Timer +{% endblock page_title %} + +{% block content %} +
+

+ {% trans "Delete Timer" %} + {% include 'timerboard/index_button.html' %} +

+
+
+
+
+ {% csrf_token %} +

{% blocktrans %}Are you sure you want to delete timer "{{ object }}"?{% endblocktrans %}

+ +
+
+
+
+
+{% endblock content %} diff --git a/allianceauth/timerboard/templates/timerboard/timer_create_form.html b/allianceauth/timerboard/templates/timerboard/timer_create_form.html new file mode 100644 index 00000000..750fab08 --- /dev/null +++ b/allianceauth/timerboard/templates/timerboard/timer_create_form.html @@ -0,0 +1,14 @@ +{% extends "timerboard/form.html" %} +{% load i18n %} + +{% block page_title %} + {% trans "Create Timer" %} +{% endblock page_title %} + +{% block page_header %} + {% trans "Create Structure Timer" %} +{% endblock %} + +{% block submit_button_text %} + {% trans "Create Timer" %} +{% endblock %} diff --git a/allianceauth/timerboard/templates/timerboard/timer_update_form.html b/allianceauth/timerboard/templates/timerboard/timer_update_form.html new file mode 100644 index 00000000..e54bcd7f --- /dev/null +++ b/allianceauth/timerboard/templates/timerboard/timer_update_form.html @@ -0,0 +1,14 @@ +{% extends "timerboard/form.html" %} +{% load i18n %} + +{% block page_title %} + {% trans "Update Structure Timer" %} +{% endblock page_title %} + +{% block page_header %} + {% trans "Update Structure Timer" %} +{% endblock %} + +{% block submit_button_text %} + {% trans "Update Structure Timer" %} +{% endblock %} diff --git a/allianceauth/timerboard/templates/timerboard/update.html b/allianceauth/timerboard/templates/timerboard/update.html deleted file mode 100644 index 1b4482c2..00000000 --- a/allianceauth/timerboard/templates/timerboard/update.html +++ /dev/null @@ -1,35 +0,0 @@ -{% extends "allianceauth/base.html" %} -{% load bootstrap %} -{% load staticfiles %} -{% load i18n %} - -{% block title %}Alliance Auth - Update Structure Timer {% endblock %} - -{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %} - -{% block content %} - -
-

{% trans "Update Structure Timer" %}

- -
-
-
- {% if no_fleet_id %} - - {% else %} - - {% endif %} -
-
-
- -
- -{% endblock content %} diff --git a/allianceauth/timerboard/templates/timerboard/management.html b/allianceauth/timerboard/templates/timerboard/view.html similarity index 98% rename from allianceauth/timerboard/templates/timerboard/management.html rename to allianceauth/timerboard/templates/timerboard/view.html index a63cb810..b5ae816d 100644 --- a/allianceauth/timerboard/templates/timerboard/management.html +++ b/allianceauth/timerboard/templates/timerboard/view.html @@ -3,8 +3,6 @@ {% load i18n %} {% get_current_language as LANGUAGE_CODE %} -{% block title %}Alliance Auth{% endblock %} - {% block page_title %}{% trans "Structure Timer Management" %}{% endblock page_title %} {% block extra_css %}{% endblock extra_css %} @@ -145,7 +143,7 @@ {{ timer.eve_character.character_name }} {% if perms.auth.timer_management %} - + @@ -279,7 +277,7 @@ {{ timer.eve_character.character_name }} {% if perms.auth.timer_management %} - + @@ -415,7 +413,7 @@ {{ timer.eve_character.character_name }} {% if perms.auth.timer_management %} - + diff --git a/allianceauth/timerboard/tests.py b/allianceauth/timerboard/tests.py old mode 100755 new mode 100644 index a39b155a..11e3c90d --- a/allianceauth/timerboard/tests.py +++ b/allianceauth/timerboard/tests.py @@ -1 +1,231 @@ -# Create your tests here. +from django_webtest import WebTest +from django.utils import timezone +from django.core.urlresolvers import reverse +from django.contrib.auth.models import Permission, User +from django.conf import settings + +from datetime import timedelta + +from allianceauth.tests.auth_utils import AuthUtils +from allianceauth.eveonline.models import EveCorporationInfo + +from .models import Timer +from .form import TimerForm + + +class TimerboardViewsTestCase(WebTest): + csrf_checks = False + + def setUp(self): + corp = EveCorporationInfo.objects.create(corporation_id='2345', corporation_name='test corp', + corporation_ticker='testc', member_count=24) + other_corp = EveCorporationInfo.objects.create(corporation_id='9345', corporation_name='other test corp', + corporation_ticker='testd', member_count=1) + self.user = AuthUtils.create_user('test_user') + AuthUtils.add_main_character(self.user, 'test character', '1234', '2345', 'test corp', 'testc') + self.user = User.objects.get_by_natural_key('test_user') + character = self.user.profile.main_character + self.other_user = AuthUtils.create_user('other_test_user') + AuthUtils.add_main_character(self.other_user, 'test character 2', '9234', '9345', 'other test corp', 'testd') + self.other_user = User.objects.get_by_natural_key('other_test_user') + other_character = self.other_user.profile.main_character + + self.timer = Timer.objects.create( + details='details', + system='system', + planet_moon='planet_moon', + structure='structure', + objective='objective', + eve_time=timezone.now() + timedelta(days=30), + important=True, + corp_timer=False, + eve_character=character, + eve_corp=character.corporation, + user=self.user, + ) + self.corp_timer = Timer.objects.create( + details='details', + system='system', + planet_moon='planet_moon', + structure='structure', + objective='objective', + eve_time=timezone.now() + timedelta(days=30), + important=False, + corp_timer=True, + eve_character=character, + eve_corp=character.corporation, + user=self.user, + ) + self.other_corp_timer = Timer.objects.create( + details='details', + system='system', + planet_moon='planet_moon', + structure='structure', + objective='objective', + eve_time=timezone.now() + timedelta(days=30), + important=False, + corp_timer=True, + eve_character=other_character, + eve_corp=other_character.corporation, + user=self.user, + ) + self.expired_timer = Timer.objects.create( + details='details', + system='system', + planet_moon='planet_moon', + structure='structure', + objective='objective', + eve_time=timezone.now() - timedelta(days=30), + important=True, + corp_timer=False, + eve_character=character, + eve_corp=character.corporation, + user=self.user, + ) + + self.view_permission = Permission.objects.get(codename='timer_view') + self.edit_permission = Permission.objects.get(codename='timer_management') + + self.view_url = reverse('timerboard:view') + self.add_url = reverse('timerboard:add') + self.edit_url_name = 'timerboard:edit' + self.delete_url_name = 'timerboard:delete' + + def test_timer_view(self): + self.user.user_permissions.add(self.view_permission) + + self.app.set_user(self.user) + + response = self.app.get(self.view_url) + + context = response.context[-1] + + timers = context['timers'] + corp_timers = context['corp_timers'] + future_timers = context['future_timers'] + past_timers = context['past_timers'] + + self.assertTemplateUsed(response, 'timerboard/view.html') + + self.assertIn(self.timer, timers) + self.assertIn(self.expired_timer, timers) + self.assertNotIn(self.corp_timer, timers) + self.assertNotIn(self.other_corp_timer, timers) + + self.assertNotIn(self.timer, corp_timers) + self.assertNotIn(self.expired_timer, corp_timers) + self.assertIn(self.corp_timer, corp_timers) + self.assertNotIn(self.other_corp_timer, corp_timers) + + self.assertIn(self.timer, future_timers) + self.assertNotIn(self.expired_timer, future_timers) + self.assertNotIn(self.corp_timer, future_timers) + self.assertNotIn(self.other_corp_timer, future_timers) + + self.assertNotIn(self.timer, past_timers) + self.assertIn(self.expired_timer, past_timers) + self.assertNotIn(self.corp_timer, past_timers) + self.assertNotIn(self.other_corp_timer, past_timers) + + def test_timer_view_permission(self): + self.client.force_login(self.user) + response = self.app.get(self.view_url) + self.assertRedirects(response, expected_url=reverse(settings.LOGIN_URL) + '?next=' + self.view_url) + + def test_timer_view_login(self): + response = self.app.get(self.view_url) + self.assertRedirects(response, expected_url=reverse(settings.LOGIN_URL) + '?next=' + self.view_url) + + def test_add_timer_get(self): + self.user.user_permissions.add(self.edit_permission) + self.app.set_user(self.user) + + response = self.app.get(self.add_url) + + self.assertTemplateUsed(response, 'timerboard/timer_create_form.html') + + context = response.context[-1] + + self.assertIs(TimerForm, type(context['form'])) + + def test_add_timer_form_error(self): + self.user.user_permissions.add(self.edit_permission) + self.app.set_user(self.user) + page = self.app.post(self.add_url) + page = page.forms['add-timer-form'].submit() + self.assertContains(page, "This field is required.") + + def test_add_timer_post(self): + self.user.user_permissions.add(self.edit_permission) + self.user.user_permissions.add(self.view_permission) + + self.app.set_user(self.user) + + page = self.app.post(self.add_url) + form = page.forms['add-timer-form'] + + form['details'] = 'details' + form['system'] = 'jita' + form['planet_moon'] = '4-4' + form['structure'] = TimerForm.structure_choices[0][0] + form['objective'] = TimerForm.objective_choices[0][0] + form['days_left'] = 1 + form['hours_left'] = 2 + form['minutes_left'] = 3 + form['important'] = True + form['corp_timer'] = False + + response = form.submit() + + self.assertRedirects(response, self.view_url) + + self.assertTrue(Timer.objects.filter(system='jita', details='details').exists()) + + def test_edit_timer_get(self): + self.user.user_permissions.add(self.edit_permission) + self.app.set_user(self.user) + + response = self.app.get(reverse(self.edit_url_name, args=[self.timer.id])) + context = response.context[-1] + form = context['form'] + data = form.instance + + self.assertTemplateUsed(response, 'timerboard/timer_update_form.html') + self.assertIs(TimerForm, type(form)) + self.assertEqual(data, self.timer) + + def test_edit_timer_post(self): + self.user.user_permissions.add(self.edit_permission) + self.user.user_permissions.add(self.view_permission) + + self.app.set_user(self.user) + + page = self.app.post(reverse(self.edit_url_name, args=[self.timer.id])) + form = page.forms['add-timer-form'] + + form['details'] = 'detailsUNIQUE' + form['system'] = 'jita' + form['planet_moon'] = '4-4' + form['structure'] = TimerForm.structure_choices[0][0] + form['objective'] = TimerForm.objective_choices[0][0] + form['days_left'] = 1 + form['hours_left'] = 2 + form['minutes_left'] = 3 + form['important'] = True + form['corp_timer'] = False + + response = form.submit() + + self.assertRedirects(response, self.view_url) + + self.assertTrue(Timer.objects.filter(system='jita', details='detailsUNIQUE').exists()) + + def test_delete_timer_get(self): + self.user.user_permissions.add(self.edit_permission) + self.app.set_user(self.user) + + response = self.app.get(reverse(self.delete_url_name, args=[self.timer.id])) + + self.assertTemplateUsed(response, 'timerboard/timer_confirm_delete.html') + + self.assertContains(response, 'Are you sure you want to delete timer "'+str(self.timer)) diff --git a/allianceauth/timerboard/urls.py b/allianceauth/timerboard/urls.py index 2a7ef7d6..d4102494 100644 --- a/allianceauth/timerboard/urls.py +++ b/allianceauth/timerboard/urls.py @@ -5,8 +5,8 @@ from . import views app_name = 'timerboard' urlpatterns = [ - url(r'^$', views.timer_view, name='view'), - url(r'^add/$', views.add_timer_view, name='add'), - url(r'^remove/(\w+)$', views.remove_timer, name='remove'), - url(r'^edit/(\w+)$', views.edit_timer, name='edit'), - ] + url(r'^$', views.TimerView.as_view(), name='view'), + url(r'^add/$', views.AddTimerView.as_view(), name='add'), + url(r'^remove/(?P\w+)$', views.RemoveTimerView.as_view(), name='delete'), + url(r'^edit/(?P\w+)$', views.EditTimerView.as_view(), name='edit'), +] diff --git a/allianceauth/timerboard/views.py b/allianceauth/timerboard/views.py index 0e3a06f2..b865978e 100755 --- a/allianceauth/timerboard/views.py +++ b/allianceauth/timerboard/views.py @@ -2,13 +2,14 @@ import datetime import logging from django.contrib import messages -from django.contrib.auth.decorators import login_required -from django.contrib.auth.decorators import permission_required from django.shortcuts import get_object_or_404 from django.shortcuts import render, redirect +from django.views import View +from django.urls import reverse_lazy +from django.views.generic import CreateView, UpdateView, DeleteView +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin from django.utils import timezone from django.utils.translation import ugettext_lazy as _ -from allianceauth.eveonline.models import EveCorporationInfo from .form import TimerForm from .models import Timer @@ -16,136 +17,72 @@ from .models import Timer logger = logging.getLogger(__name__) -@login_required -@permission_required('auth.timer_view') -def timer_view(request): - logger.debug("timer_view called by user %s" % request.user) - char = request.user.profile.main_character - if char: - corp = EveCorporationInfo.objects.get(corporation_id=char.corporation_id) - else: - corp = None - if corp: - corp_timers = Timer.objects.all().filter(corp_timer=True).filter(eve_corp=corp) - else: - corp_timers = [] - render_items = {'timers': Timer.objects.all().filter(corp_timer=False), - 'corp_timers': corp_timers, - 'future_timers': Timer.objects.all().filter(corp_timer=False).filter( - eve_time__gte=datetime.datetime.now()), - 'past_timers': Timer.objects.all().filter(corp_timer=False).filter( - eve_time__lt=datetime.datetime.now())} - - return render(request, 'timerboard/management.html', context=render_items) +class BaseTimerView(LoginRequiredMixin, PermissionRequiredMixin, View): + pass -@login_required -@permission_required('auth.timer_management') -def add_timer_view(request): - logger.debug("add_timer_view called by user %s" % request.user) - if request.method == 'POST': - form = TimerForm(request.POST) - logger.debug("Request type POST contains form valid: %s" % form.is_valid()) - if form.is_valid(): - # Get character - character = request.user.profile.main_character - corporation = EveCorporationInfo.get_corporation_info_by_id(character.corporation_id) - logger.debug( - "Determined timer add request on behalf of character %s corporation %s" % (character, corporation)) - # calculate future time - future_time = datetime.timedelta(days=form.cleaned_data['days_left'], hours=form.cleaned_data['hours_left'], - minutes=form.cleaned_data['minutes_left']) - current_time = timezone.now() - eve_time = current_time + future_time - logger.debug( - "Determined timer eve time is %s - current time %s, adding %s" % (eve_time, current_time, future_time)) - # handle valid form - timer = Timer() - timer.details = form.cleaned_data['details'] - timer.system = form.cleaned_data['system'] - timer.planet_moon = form.cleaned_data['planet_moon'] - timer.structure = form.cleaned_data['structure'] - timer.objective = form.cleaned_data['objective'] - timer.eve_time = eve_time - timer.important = form.cleaned_data['important'] - timer.corp_timer = form.cleaned_data['corp_timer'] - timer.eve_character = character - timer.eve_corp = corporation - timer.user = request.user - timer.save() - logger.info("Created new timer in %s at %s by user %s" % (timer.system, timer.eve_time, request.user)) - messages.success(request, _('Added new timer in %(system)s at %(time)s.') % {"system": timer.system, "time": timer.eve_time}) - return redirect("timerboard:view") - else: - logger.debug("Returning new TimerForm") - form = TimerForm() +class TimerView(BaseTimerView): + template_name = 'timerboard/view.html' + permission_required = 'auth.timer_view' - render_items = {'form': form} + def get(self, request): + logger.debug("timer_view called by user {}".format(request.user)) + char = request.user.profile.main_character + if char: + corp = char.corporation + else: + corp = None - return render(request, 'timerboard/add.html', context=render_items) - - -@login_required -@permission_required('auth.timer_management') -def remove_timer(request, timer_id): - logger.debug("remove_timer called by user %s for timer id %s" % (request.user, timer_id)) - timer = get_object_or_404(Timer, id=timer_id) - timer.delete() - logger.debug("Deleting timer id %s by user %s" % (timer_id, request.user)) - messages.success(request, _('Deleted timer in %(system)s at %(time)s.') % {'system': timer.system, - 'time': timer.eve_time}) - return redirect("timerboard:view") - - -@login_required -@permission_required('auth.timer_management') -def edit_timer(request, timer_id): - logger.debug("edit_timer called by user %s for timer id %s" % (request.user, timer_id)) - timer = get_object_or_404(Timer, id=timer_id) - if request.method == 'POST': - form = TimerForm(request.POST) - logger.debug("Received POST request containing updated timer form, is valid: %s" % form.is_valid()) - if form.is_valid(): - character = request.user.profile.main_character - corporation = EveCorporationInfo.get_corporation_info_by_id(character.corporation_id) - logger.debug( - "Determined timer edit request on behalf of character %s corporation %s" % (character, corporation)) - # calculate future time - future_time = datetime.timedelta(days=form.cleaned_data['days_left'], hours=form.cleaned_data['hours_left'], - minutes=form.cleaned_data['minutes_left']) - current_time = datetime.datetime.utcnow() - eve_time = current_time + future_time - logger.debug( - "Determined timer eve time is %s - current time %s, adding %s" % (eve_time, current_time, future_time)) - timer.details = form.cleaned_data['details'] - timer.system = form.cleaned_data['system'] - timer.planet_moon = form.cleaned_data['planet_moon'] - timer.structure = form.cleaned_data['structure'] - timer.objective = form.cleaned_data['objective'] - timer.eve_time = eve_time - timer.important = form.cleaned_data['important'] - timer.corp_timer = form.cleaned_data['corp_timer'] - timer.eve_character = character - timer.eve_corp = corporation - logger.info("User %s updating timer id %s " % (request.user, timer_id)) - messages.success(request, _('Saved changes to the timer.')) - timer.save() - return redirect("timerboard:view") - else: - current_time = timezone.now() - td = timer.eve_time - current_time - tddays, tdhours, tdminutes = td.days, td.seconds // 3600, td.seconds // 60 % 60 - data = { - 'details': timer.details, - 'system': timer.system, - 'planet_moon': timer.planet_moon, - 'structure': timer.structure, - 'objective': timer.objective, - 'important': timer.important, - 'corp_timer': timer.corp_timer, - 'days_left': tddays, - 'hours_left': tdhours, - 'minutes_left': tdminutes, + render_items = { + 'timers': Timer.objects.filter(corp_timer=False), + 'corp_timers': Timer.objects.filter(corp_timer=True, eve_corp=corp), + 'future_timers': Timer.objects.filter(corp_timer=False, eve_time__gte=timezone.now()), + 'past_timers': Timer.objects.filter(corp_timer=False, eve_time__lt=timezone.now()), } - form = TimerForm(initial=data) - return render(request, 'timerboard/update.html', context={'form': form}) + + return render(request, self.template_name, context=render_items) + + +class TimerManagementView(BaseTimerView): + permission_required = 'auth.timer_management' + index_redirect = 'timerboard:view' + success_url = reverse_lazy(index_redirect) + model = Timer + form_class = TimerForm + + 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(AddUpdateMixin, self).get_form_kwargs() + kwargs.update({'user': self.request.user}) + return kwargs + + +class AddTimerView(TimerManagementView, AddUpdateMixin, CreateView): + template_name_suffix = '_create_form' + + def form_valid(self, form): + result = super(AddTimerView, self).form_valid(form) + timer = self.object + logger.info("Created new timer in {} at {} by user {}".format(timer.system, timer.eve_time, 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' + + def form_valid(self, form): + messages.success(self.request, _('Saved changes to the timer.')) + return super(EditTimerView, self).form_valid(form) + + +class RemoveTimerView(TimerManagementView, DeleteView): + pass diff --git a/setup.py b/setup.py index b24804d9..fbf65020 100644 --- a/setup.py +++ b/setup.py @@ -33,6 +33,7 @@ testing_extras = [ 'coverage>=4.3.1', 'requests-mock>=1.2.0', 'django-nose', + 'django-webtest', ] setup(