diff --git a/allianceauth/authentication/views.py b/allianceauth/authentication/views.py index 7d8c33d5..b2121442 100644 --- a/allianceauth/authentication/views.py +++ b/allianceauth/authentication/views.py @@ -6,7 +6,7 @@ from django.contrib.auth import login, authenticate from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.core import signing -from django.core.urlresolvers import reverse +from django.urls import reverse from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ from esi.decorators import token_required diff --git a/allianceauth/corputils/models.py b/allianceauth/corputils/models.py index 58643a67..c07d68c0 100644 --- a/allianceauth/corputils/models.py +++ b/allianceauth/corputils/models.py @@ -18,7 +18,7 @@ logger = logging.getLogger(__name__) class CorpStats(models.Model): token = models.ForeignKey(Token, on_delete=models.CASCADE) - corp = models.OneToOneField(EveCorporationInfo) + corp = models.OneToOneField(EveCorporationInfo, on_delete=models.CASCADE) last_update = models.DateTimeField(auto_now=True) class Meta: diff --git a/allianceauth/eveonline/migrations/0009_on_delete.py b/allianceauth/eveonline/migrations/0009_on_delete.py new file mode 100644 index 00000000..ad534248 --- /dev/null +++ b/allianceauth/eveonline/migrations/0009_on_delete.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-09-28 02:16 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('eveonline', '0008_remove_apikeys'), + ] + + operations = [ + migrations.AlterField( + model_name='evecorporationinfo', + name='alliance', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='eveonline.EveAllianceInfo'), + ), + ] diff --git a/allianceauth/eveonline/models.py b/allianceauth/eveonline/models.py index 43b48500..b7754c52 100644 --- a/allianceauth/eveonline/models.py +++ b/allianceauth/eveonline/models.py @@ -1,4 +1,5 @@ from django.db import models +from typing import Union from .managers import EveCharacterManager, EveCharacterProviderManager from .managers import EveCorporationManager, EveCorporationProviderManager @@ -6,34 +7,6 @@ from .managers import EveAllianceManager, EveAllianceProviderManager from . import providers -class EveCharacter(models.Model): - character_id = models.CharField(max_length=254, unique=True) - character_name = models.CharField(max_length=254, unique=True) - corporation_id = models.CharField(max_length=254) - corporation_name = models.CharField(max_length=254) - corporation_ticker = models.CharField(max_length=254) - alliance_id = models.CharField(max_length=254, blank=True, null=True, default='') - alliance_name = models.CharField(max_length=254, blank=True, null=True, default='') - - objects = EveCharacterManager() - provider = EveCharacterProviderManager() - - def update_character(self, character: providers.Character = None): - if character is None: - character = self.provider.get_character(self.character_id) - self.character_name = character.name - self.corporation_id = character.corp.id - self.corporation_name = character.corp.name - self.corporation_ticker = character.corp.ticker - self.alliance_id = character.alliance.id - self.alliance_name = character.alliance.name - self.save() - return self - - def __str__(self): - return self.character_name - - class EveAllianceInfo(models.Model): alliance_id = models.CharField(max_length=254, unique=True) alliance_name = models.CharField(max_length=254, unique=True) @@ -68,7 +41,7 @@ class EveCorporationInfo(models.Model): corporation_name = models.CharField(max_length=254, unique=True) corporation_ticker = models.CharField(max_length=254) member_count = models.IntegerField() - alliance = models.ForeignKey(EveAllianceInfo, blank=True, null=True) + alliance = models.ForeignKey(EveAllianceInfo, blank=True, null=True, on_delete=models.SET_NULL) objects = EveCorporationManager() provider = EveCorporationProviderManager() @@ -86,3 +59,51 @@ class EveCorporationInfo(models.Model): def __str__(self): return self.corporation_name + + +class EveCharacter(models.Model): + character_id = models.CharField(max_length=254, unique=True) + character_name = models.CharField(max_length=254, unique=True) + corporation_id = models.CharField(max_length=254) + corporation_name = models.CharField(max_length=254) + corporation_ticker = models.CharField(max_length=254) + alliance_id = models.CharField(max_length=254, blank=True, null=True, default='') + alliance_name = models.CharField(max_length=254, blank=True, null=True, default='') + + objects = EveCharacterManager() + provider = EveCharacterProviderManager() + + @property + def alliance(self) -> Union[EveAllianceInfo, None]: + """ + Pseudo foreign key from alliance_id to EveAllianceInfo + :raises: EveAllianceInfo.DoesNotExist + :return: EveAllianceInfo or None + """ + if self.alliance_id is None: + return None + return EveAllianceInfo.objects.get(alliance_id=self.alliance_id) + + @property + def corporation(self) -> EveCorporationInfo: + """ + Pseudo foreign key from corporation_id to EveCorporationInfo + :raises: EveCorporationInfo.DoesNotExist + :return: EveCorporationInfo + """ + return EveCorporationInfo.objects.get(corporation_id=self.corporation_id) + + def update_character(self, character: providers.Character = None): + if character is None: + character = self.provider.get_character(self.character_id) + self.character_name = character.name + self.corporation_id = character.corp.id + self.corporation_name = character.corp.name + self.corporation_ticker = character.corp.ticker + self.alliance_id = character.alliance.id + self.alliance_name = character.alliance.name + self.save() + return self + + def __str__(self): + return self.character_name diff --git a/allianceauth/eveonline/tests/test_models.py b/allianceauth/eveonline/tests/test_models.py new file mode 100644 index 00000000..3471a588 --- /dev/null +++ b/allianceauth/eveonline/tests/test_models.py @@ -0,0 +1,121 @@ +from django.test import TestCase + +from ..models import EveCharacter, EveCorporationInfo, EveAllianceInfo + + +class EveCharacterTestCase(TestCase): + def test_corporation_prop(self): + """ + Test that the correct corporation is returned by the corporation property + """ + character = EveCharacter.objects.create( + character_id='1234', + character_name='character.name', + corporation_id='2345', + corporation_name='character.corp.name', + corporation_ticker='character.corp.ticker', + alliance_id='character.alliance.id', + alliance_name='character.alliance.name', + ) + + expected = EveCorporationInfo.objects.create( + corporation_id='2345', + corporation_name='corp.name', + corporation_ticker='corp.ticker', + member_count=10, + alliance=None, + ) + + incorrect = EveCorporationInfo.objects.create( + corporation_id='9999', + corporation_name='corp.name1', + corporation_ticker='corp.ticker1', + member_count=10, + alliance=None, + ) + + self.assertEqual(character.corporation, expected) + self.assertNotEqual(character.corporation, incorrect) + + def test_corporation_prop_exception(self): + """ + Check that an exception is raised when the expected + object is not in the database + """ + character = EveCharacter.objects.create( + character_id='1234', + character_name='character.name', + corporation_id='2345', + corporation_name='character.corp.name', + corporation_ticker='character.corp.ticker', + alliance_id='character.alliance.id', + alliance_name='character.alliance.name', + ) + + with self.assertRaises(EveCorporationInfo.DoesNotExist): + result = character.corporation + + def test_alliance_prop(self): + """ + Test that the correct alliance is returned by the alliance property + """ + character = EveCharacter.objects.create( + character_id='1234', + character_name='character.name', + corporation_id='2345', + corporation_name='character.corp.name', + corporation_ticker='character.corp.ticker', + alliance_id='3456', + alliance_name='character.alliance.name', + ) + + expected = EveAllianceInfo.objects.create( + alliance_id='3456', + alliance_name='alliance.name', + alliance_ticker='alliance.ticker', + executor_corp_id='alliance.executor_corp_id', + ) + + incorrect = EveAllianceInfo.objects.create( + alliance_id='9001', + alliance_name='alliance.name1', + alliance_ticker='alliance.ticker1', + executor_corp_id='alliance.executor_corp_id1', + ) + + self.assertEqual(character.alliance, expected) + self.assertNotEqual(character.alliance, incorrect) + + def test_alliance_prop_exception(self): + """ + Check that an exception is raised when the expected + object is not in the database + """ + character = EveCharacter.objects.create( + character_id='1234', + character_name='character.name', + corporation_id='2345', + corporation_name='character.corp.name', + corporation_ticker='character.corp.ticker', + alliance_id='3456', + alliance_name='character.alliance.name', + ) + + with self.assertRaises(EveAllianceInfo.DoesNotExist): + result = character.alliance + + def test_alliance_prop_none(self): + """ + Check that None is returned when the character has no alliance + """ + character = EveCharacter.objects.create( + character_id='1234', + character_name='character.name', + corporation_id='2345', + corporation_name='character.corp.name', + corporation_ticker='character.corp.ticker', + alliance_id=None, + alliance_name=None, + ) + + self.assertIsNone(character.alliance) diff --git a/allianceauth/fleetactivitytracking/models.py b/allianceauth/fleetactivitytracking/models.py index 3cf4607d..8bb248b4 100644 --- a/allianceauth/fleetactivitytracking/models.py +++ b/allianceauth/fleetactivitytracking/models.py @@ -23,11 +23,11 @@ class Fatlink(models.Model): class Fat(models.Model): character = models.ForeignKey(EveCharacter, on_delete=models.CASCADE) - fatlink = models.ForeignKey(Fatlink) + fatlink = models.ForeignKey(Fatlink, on_delete=models.CASCADE) system = models.CharField(max_length=30) shiptype = models.CharField(max_length=30) station = models.CharField(max_length=125) - user = models.ForeignKey(User) + user = models.ForeignKey(User, on_delete=models.CASCADE) class Meta: unique_together = (('character', 'fatlink'),) diff --git a/allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html b/allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html index 8b507612..7bb16bf6 100644 --- a/allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html +++ b/allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html @@ -2,7 +2,6 @@ {% load bootstrap %} {% load staticfiles %} {% load i18n %} -{% load bootstrap_pagination %} {% block title %}Alliance Auth{% endblock %} {% block page_title %}{% trans "Fatlink view" %}{% endblock page_title %} @@ -20,9 +19,6 @@
{% trans "User" %} | diff --git a/allianceauth/fleetactivitytracking/views.py b/allianceauth/fleetactivitytracking/views.py index 614f9baa..2d20a666 100644 --- a/allianceauth/fleetactivitytracking/views.py +++ b/allianceauth/fleetactivitytracking/views.py @@ -29,19 +29,6 @@ SWAGGER_SPEC_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sw logger = logging.getLogger(__name__) -FATS_PER_PAGE = int(getattr(settings, 'FATS_PER_PAGE', 20)) - - -def get_page(model_list, page_num): - p = Paginator(model_list, FATS_PER_PAGE) - try: - fats = p.page(page_num) - except PageNotAnInteger: - fats = p.page(1) - except EmptyPage: - fats = p.page(p.num_pages) - return fats - class CorpStat(object): def __init__(self, corp_id, start_of_month, start_of_next_month, corp=None): @@ -359,8 +346,6 @@ def modify_fatlink_view(request, hash=""): registered_fats = Fat.objects.filter(fatlink=fatlink).order_by('character__character_name') - fat_page = get_page(registered_fats, request.GET.get('page', 1)) - - context = {'fatlink': fatlink, 'registered_fats': fat_page} + context = {'fatlink': fatlink, 'registered_fats': registered_fats} return render(request, 'fleetactivitytracking/fatlinkmodify.html', context=context) diff --git a/allianceauth/groupmanagement/migrations/0007_on_delete.py b/allianceauth/groupmanagement/migrations/0007_on_delete.py new file mode 100644 index 00000000..022e93bd --- /dev/null +++ b/allianceauth/groupmanagement/migrations/0007_on_delete.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-09-28 02:16 +from __future__ import unicode_literals + +import django.contrib.auth.models +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('auth', '0008_alter_user_username_max_length'), + ('groupmanagement', '0006_request_groups_perm'), + ] + + operations = [ + migrations.CreateModel( + name='ProxyGroup', + fields=[ + ], + options={ + 'verbose_name': 'group', + 'indexes': [], + 'proxy': True, + 'verbose_name_plural': 'groups', + }, + bases=('auth.group',), + managers=[ + ('objects', django.contrib.auth.models.GroupManager()), + ], + ), + migrations.RemoveField( + model_name='grouprequest', + name='main_char', + ), + ] diff --git a/allianceauth/groupmanagement/models.py b/allianceauth/groupmanagement/models.py index bcb1b24d..ed9310ef 100644 --- a/allianceauth/groupmanagement/models.py +++ b/allianceauth/groupmanagement/models.py @@ -10,9 +10,16 @@ from allianceauth.eveonline.models import EveCharacter class GroupRequest(models.Model): status = models.CharField(max_length=254) leave_request = models.BooleanField(default=0) - user = models.ForeignKey(User) - group = models.ForeignKey(Group) - main_char = models.ForeignKey(EveCharacter) + user = models.ForeignKey(User, on_delete=models.CASCADE) + group = models.ForeignKey(Group, on_delete=models.CASCADE) + + @property + def main_char(self): + """ + Legacy property for main character + :return: self.users main character + """ + return self.user.profile.main_character def __str__(self): return self.user.username + ":" + self.group.name diff --git a/allianceauth/hrapplications/models.py b/allianceauth/hrapplications/models.py index 82317549..a9bf57e8 100755 --- a/allianceauth/hrapplications/models.py +++ b/allianceauth/hrapplications/models.py @@ -23,7 +23,7 @@ class ApplicationChoice(models.Model): class ApplicationForm(models.Model): questions = SortedManyToManyField(ApplicationQuestion) - corp = models.OneToOneField(EveCorporationInfo) + corp = models.OneToOneField(EveCorporationInfo, on_delete=models.CASCADE) def __str__(self): return str(self.corp) diff --git a/allianceauth/optimer/migrations/0004_on_delete.py b/allianceauth/optimer/migrations/0004_on_delete.py new file mode 100644 index 00000000..958cdff8 --- /dev/null +++ b/allianceauth/optimer/migrations/0004_on_delete.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.5 on 2017-09-28 02:16 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('optimer', '0003_make_strings_more_stringy'), + ] + + operations = [ + migrations.AlterField( + model_name='optimer', + name='eve_character', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='eveonline.EveCharacter'), + ), + ] diff --git a/allianceauth/optimer/models.py b/allianceauth/optimer/models.py index fe9d19b9..08a17e3e 100644 --- a/allianceauth/optimer/models.py +++ b/allianceauth/optimer/models.py @@ -17,7 +17,7 @@ class OpTimer(models.Model): operation_name = models.CharField(max_length=254, default="") fc = models.CharField(max_length=254, default="") post_time = models.DateTimeField(default=timezone.now) - eve_character = models.ForeignKey(EveCharacter) + eve_character = models.ForeignKey(EveCharacter, null=True, on_delete=models.SET_NULL) def __str__(self): return self.operation_name diff --git a/allianceauth/permissions_tool/tests.py b/allianceauth/permissions_tool/tests.py index b432fa29..42b35ddf 100644 --- a/allianceauth/permissions_tool/tests.py +++ b/allianceauth/permissions_tool/tests.py @@ -10,7 +10,6 @@ from allianceauth.tests.auth_utils import AuthUtils class PermissionsToolViewsTestCase(TestCase): def setUp(self): self.member = AuthUtils.create_member('auth_member') - self.member.set_password('password') self.member.email = 'auth_member@example.com' self.member.save() self.none_user = AuthUtils.create_user('none_user', disconnect_signals=True) @@ -18,7 +17,6 @@ class PermissionsToolViewsTestCase(TestCase): self.none_user3 = AuthUtils.create_user('none_user3', disconnect_signals=True) self.no_perm_user = AuthUtils.create_user('no_perm_user', disconnect_signals=True) - self.no_perm_user.set_password('password') AuthUtils.disconnect_signals() self.no_perm_group = Group.objects.create(name="No Permission Group") @@ -38,17 +36,16 @@ class PermissionsToolViewsTestCase(TestCase): AuthUtils.connect_signals() def test_menu_item(self): - self.client.login(username=self.member.username, password='password') + self.client.force_login(self.member) response = self.client.get(urls.reverse('permissions_tool:overview')) - response_content = str(response.content, encoding='utf8') + response_content = response.content.decode('utf-8') - self.assertInHTML( - '{{ 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..805e228b
--- 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.urls 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 |
---|