Merge branch 'sanity-checks-and-editorconfig' into 'v2.9.x'

Basic code sanity checks and editorconfig

See merge request allianceauth/allianceauth!1316
This commit is contained in:
Ariel Rin 2021-06-22 23:38:54 +00:00
commit a0a497ab33
345 changed files with 3044 additions and 3184 deletions

24
.editorconfig Normal file
View File

@ -0,0 +1,24 @@
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 4
tab_width = 4
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.{yaml,yml,less}]
indent_size = 2
[*.md]
indent_size = 2
# Makefiles always use tabs for indentation
[Makefile]
indent_style = tab
[*.bat]
indent_style = tab

View File

@ -1,4 +1,5 @@
stages: stages:
- pre-commit
- gitlab - gitlab
- test - test
- deploy - deploy
@ -13,6 +14,18 @@ before_script:
- python -V - python -V
- pip install wheel tox - pip install wheel tox
pre-commit-check:
stage: pre-commit
image: python:3.6-buster
variables:
PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
cache:
paths:
- ${PRE_COMMIT_HOME}
script:
- pip install pre-commit
- pre-commit run --all-files
sast: sast:
stage: gitlab stage: gitlab
before_script: [] before_script: []
@ -27,7 +40,7 @@ dependency_scanning:
test-3.7-core: test-3.7-core:
image: python:3.7-buster image: python:3.7-buster
script: script:
- tox -e py37-core - tox -e py37-core
artifacts: artifacts:
when: always when: always
@ -36,7 +49,7 @@ test-3.7-core:
test-3.8-core: test-3.8-core:
image: python:3.8-buster image: python:3.8-buster
script: script:
- tox -e py38-core - tox -e py38-core
artifacts: artifacts:
when: always when: always
@ -45,7 +58,7 @@ test-3.8-core:
test-3.9-core: test-3.9-core:
image: python:3.9-buster image: python:3.9-buster
script: script:
- tox -e py39-core - tox -e py39-core
artifacts: artifacts:
when: always when: always
@ -54,7 +67,7 @@ test-3.9-core:
test-3.7-all: test-3.7-all:
image: python:3.7-buster image: python:3.7-buster
script: script:
- tox -e py37-all - tox -e py37-all
artifacts: artifacts:
when: always when: always
@ -63,7 +76,7 @@ test-3.7-all:
test-3.8-all: test-3.8-all:
image: python:3.8-buster image: python:3.8-buster
script: script:
- tox -e py38-all - tox -e py38-all
artifacts: artifacts:
when: always when: always
@ -72,7 +85,7 @@ test-3.8-all:
test-3.9-all: test-3.9-all:
image: python:3.9-buster image: python:3.9-buster
script: script:
- tox -e py39-all - tox -e py39-all
artifacts: artifacts:
when: always when: always
@ -91,4 +104,4 @@ deploy_production:
- twine upload dist/* - twine upload dist/*
rules: rules:
- if: $CI_COMMIT_TAG - if: $CI_COMMIT_TAG

View File

@ -1,8 +1,8 @@
# Bug # Bug
- I have searched [issues](https://gitlab.com/allianceauth/allianceauth/issues?scope=all&utf8=%E2%9C%93&state=all) (Y/N): - I have searched [issues](https://gitlab.com/allianceauth/allianceauth/issues?scope=all&utf8=%E2%9C%93&state=all) (Y/N):
- What Version of Alliance Auth: - What Version of Alliance Auth:
- What Operating System: - What Operating System:
- Version of other components relevant to issue eg. Service, Database: - Version of other components relevant to issue eg. Service, Database:
Please include a brief description of your issue here. Please include a brief description of your issue here.
@ -11,4 +11,4 @@ Please include steps to reproduce the issue
Please include any tracebacks or logs Please include any tracebacks or logs
Please include the results of the command `pip list` Please include the results of the command `pip list`

View File

@ -4,4 +4,4 @@
- Is this a Service (external integration), a Module (Alliance Auth extension) or an enhancement to an existing service/module. - Is this a Service (external integration), a Module (Alliance Auth extension) or an enhancement to an existing service/module.
- Describe why its useful to you or others. - Describe why its useful to you or others.

28
.pre-commit-config.yaml Normal file
View File

@ -0,0 +1,28 @@
# Apply to all files without committing:
# pre-commit run --all-files
# Update this file:
# pre-commit autoupdate
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.0.1
hooks:
- id: check-case-conflict
- id: check-json
- id: check-xml
- id: check-yaml
- id: fix-byte-order-marker
- id: trailing-whitespace
exclude: (\.min\.css|\.min\.js|\.mo|\.po|swagger\.json)$
- id: end-of-file-fixer
exclude: (\.min\.css|\.min\.js|\.mo|\.po|swagger\.json)$
- id: mixed-line-ending
args: [ '--fix=lf' ]
- id: fix-encoding-pragma
args: [ '--remove' ]
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 2.3.5
hooks:
- id: editorconfig-checker
exclude: ^(LICENSE|allianceauth\/static\/css\/themes\/bootstrap-locals.less|allianceauth\/eveonline\/swagger.json|(.*.po)|(.*.mo))

View File

@ -20,4 +20,4 @@ formats: all
python: python:
version: 3.7 version: 3.7
install: install:
- requirements: docs/requirements.txt - requirements: docs/requirements.txt

View File

@ -337,4 +337,3 @@ proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. Public License instead of this License.

View File

@ -84,7 +84,7 @@ class UserProfileInline(admin.StackedInline):
if request.user.is_superuser: if request.user.is_superuser:
query |= Q(userprofile__isnull=True) query |= Q(userprofile__isnull=True)
else: else:
query |= Q(character_ownership__user=obj) query |= Q(character_ownership__user=obj)
formset = super().get_formset(request, obj=obj, **kwargs) formset = super().get_formset(request, obj=obj, **kwargs)
def get_kwargs(self, index): def get_kwargs(self, index):
@ -123,26 +123,26 @@ def user_username(obj):
works for both User objects and objects with `user` as FK to User works for both User objects and objects with `user` as FK to User
To be used for all user based admin lists To be used for all user based admin lists
""" """
link = reverse( link = reverse(
'admin:{}_{}_change'.format( 'admin:{}_{}_change'.format(
obj._meta.app_label, obj._meta.app_label,
type(obj).__name__.lower() type(obj).__name__.lower()
), ),
args=(obj.pk,) args=(obj.pk,)
) )
user_obj = obj.user if hasattr(obj, 'user') else obj user_obj = obj.user if hasattr(obj, 'user') else obj
if user_obj.profile.main_character: if user_obj.profile.main_character:
return format_html( return format_html(
'<strong><a href="{}">{}</a></strong><br>{}', '<strong><a href="{}">{}</a></strong><br>{}',
link, link,
user_obj.username, user_obj.username,
user_obj.profile.main_character.character_name user_obj.profile.main_character.character_name
) )
else: else:
return format_html( return format_html(
'<strong><a href="{}">{}</a></strong>', '<strong><a href="{}">{}</a></strong>',
link, link,
user_obj.username, user_obj.username,
) )
@ -160,16 +160,16 @@ def user_main_organization(obj):
user_obj = obj.user if hasattr(obj, 'user') else obj user_obj = obj.user if hasattr(obj, 'user') else obj
if not user_obj.profile.main_character: if not user_obj.profile.main_character:
result = None result = None
else: else:
corporation = user_obj.profile.main_character.corporation_name corporation = user_obj.profile.main_character.corporation_name
if user_obj.profile.main_character.alliance_id: if user_obj.profile.main_character.alliance_id:
result = format_html( result = format_html(
'{}<br>{}', '{}<br>{}',
corporation, corporation,
user_obj.profile.main_character.alliance_name user_obj.profile.main_character.alliance_name
) )
else: else:
result = corporation result = corporation
return result return result
@ -200,7 +200,7 @@ class MainCorporationsFilter(admin.SimpleListFilter):
def queryset(self, request, qs): def queryset(self, request, qs):
if self.value() is None: if self.value() is None:
return qs.all() return qs.all()
else: else:
if qs.model == User: if qs.model == User:
return qs.filter( return qs.filter(
profile__main_character__corporation_id=self.value() profile__main_character__corporation_id=self.value()
@ -209,7 +209,7 @@ class MainCorporationsFilter(admin.SimpleListFilter):
return qs.filter( return qs.filter(
user__profile__main_character__corporation_id=self.value() user__profile__main_character__corporation_id=self.value()
) )
class MainAllianceFilter(admin.SimpleListFilter): class MainAllianceFilter(admin.SimpleListFilter):
"""Custom filter to filter on alliances from mains only """Custom filter to filter on alliances from mains only
@ -234,16 +234,16 @@ class MainAllianceFilter(admin.SimpleListFilter):
def queryset(self, request, qs): def queryset(self, request, qs):
if self.value() is None: if self.value() is None:
return qs.all() return qs.all()
else: else:
if qs.model == User: if qs.model == User:
return qs.filter(profile__main_character__alliance_id=self.value()) return qs.filter(profile__main_character__alliance_id=self.value())
else: else:
return qs.filter( return qs.filter(
user__profile__main_character__alliance_id=self.value() user__profile__main_character__alliance_id=self.value()
) )
def update_main_character_model(modeladmin, request, queryset):
def update_main_character_model(modeladmin, request, queryset):
tasks_count = 0 tasks_count = 0
for obj in queryset: for obj in queryset:
if obj.profile.main_character: if obj.profile.main_character:
@ -251,7 +251,7 @@ def update_main_character_model(modeladmin, request, queryset):
tasks_count += 1 tasks_count += 1
modeladmin.message_user( modeladmin.message_user(
request, request,
'Update from ESI started for {} characters'.format(tasks_count) 'Update from ESI started for {} characters'.format(tasks_count)
) )
@ -262,7 +262,7 @@ update_main_character_model.short_description = \
class UserAdmin(BaseUserAdmin): class UserAdmin(BaseUserAdmin):
"""Extending Django's UserAdmin model """Extending Django's UserAdmin model
Behavior of groups and characters columns can be configured via settings Behavior of groups and characters columns can be configured via settings
""" """
@ -270,7 +270,7 @@ class UserAdmin(BaseUserAdmin):
css = { css = {
"all": ("authentication/css/admin.css",) "all": ("authentication/css/admin.css",)
} }
def get_queryset(self, request): def get_queryset(self, request):
qs = super().get_queryset(request) qs = super().get_queryset(request)
return qs.prefetch_related("character_ownerships__character", "groups") return qs.prefetch_related("character_ownerships__character", "groups")
@ -279,8 +279,8 @@ class UserAdmin(BaseUserAdmin):
actions = super(BaseUserAdmin, self).get_actions(request) actions = super(BaseUserAdmin, self).get_actions(request)
actions[update_main_character_model.__name__] = ( actions[update_main_character_model.__name__] = (
update_main_character_model, update_main_character_model,
update_main_character_model.__name__, update_main_character_model.__name__,
update_main_character_model.short_description update_main_character_model.short_description
) )
@ -290,21 +290,21 @@ class UserAdmin(BaseUserAdmin):
if svc.update_groups.__module__ != ServicesHook.update_groups.__module__: if svc.update_groups.__module__ != ServicesHook.update_groups.__module__:
action = make_service_hooks_update_groups_action(svc) action = make_service_hooks_update_groups_action(svc)
actions[action.__name__] = ( actions[action.__name__] = (
action, action,
action.__name__, action.__name__,
action.short_description action.short_description
) )
# Create sync nickname action if service implements it # Create sync nickname action if service implements it
if svc.sync_nickname.__module__ != ServicesHook.sync_nickname.__module__: if svc.sync_nickname.__module__ != ServicesHook.sync_nickname.__module__:
action = make_service_hooks_sync_nickname_action(svc) action = make_service_hooks_sync_nickname_action(svc)
actions[action.__name__] = ( actions[action.__name__] = (
action, action.__name__, action, action.__name__,
action.short_description action.short_description
) )
return actions return actions
def _list_2_html_w_tooltips(self, my_items: list, max_items: int) -> str: def _list_2_html_w_tooltips(self, my_items: list, max_items: int) -> str:
"""converts list of strings into HTML with cutoff and tooltip""" """converts list of strings into HTML with cutoff and tooltip"""
items_truncated_str = ', '.join(my_items[:max_items]) items_truncated_str = ', '.join(my_items[:max_items])
if not my_items: if not my_items:
@ -320,27 +320,27 @@ class UserAdmin(BaseUserAdmin):
items_truncated_str items_truncated_str
) )
return result return result
inlines = BaseUserAdmin.inlines + [UserProfileInline] inlines = BaseUserAdmin.inlines + [UserProfileInline]
ordering = ('username', ) ordering = ('username', )
list_select_related = ('profile__state', 'profile__main_character') list_select_related = ('profile__state', 'profile__main_character')
show_full_result_count = True show_full_result_count = True
list_display = ( list_display = (
user_profile_pic, user_profile_pic,
user_username, user_username,
'_state', '_state',
'_groups', '_groups',
user_main_organization, user_main_organization,
'_characters', '_characters',
'is_active', 'is_active',
'date_joined', 'date_joined',
'_role' '_role'
) )
list_display_links = None list_display_links = None
list_filter = ( list_filter = (
'profile__state', 'profile__state',
'groups', 'groups',
MainCorporationsFilter, MainCorporationsFilter,
MainAllianceFilter, MainAllianceFilter,
'is_active', 'is_active',
'date_joined', 'date_joined',
@ -348,32 +348,32 @@ class UserAdmin(BaseUserAdmin):
'is_superuser' 'is_superuser'
) )
search_fields = ( search_fields = (
'username', 'username',
'character_ownerships__character__character_name' 'character_ownerships__character__character_name'
) )
def _characters(self, obj): def _characters(self, obj):
character_ownerships = list(obj.character_ownerships.all()) character_ownerships = list(obj.character_ownerships.all())
characters = [obj.character.character_name for obj in character_ownerships] characters = [obj.character.character_name for obj in character_ownerships]
return self._list_2_html_w_tooltips( return self._list_2_html_w_tooltips(
sorted(characters), sorted(characters),
AUTHENTICATION_ADMIN_USERS_MAX_CHARS AUTHENTICATION_ADMIN_USERS_MAX_CHARS
) )
_characters.short_description = 'characters' _characters.short_description = 'characters'
def _state(self, obj): def _state(self, obj):
return obj.profile.state.name return obj.profile.state.name
_state.short_description = 'state' _state.short_description = 'state'
_state.admin_order_field = 'profile__state' _state.admin_order_field = 'profile__state'
def _groups(self, obj): def _groups(self, obj):
my_groups = sorted([group.name for group in list(obj.groups.all())]) my_groups = sorted([group.name for group in list(obj.groups.all())])
return self._list_2_html_w_tooltips( return self._list_2_html_w_tooltips(
my_groups, AUTHENTICATION_ADMIN_USERS_MAX_GROUPS my_groups, AUTHENTICATION_ADMIN_USERS_MAX_GROUPS
) )
_groups.short_description = 'groups' _groups.short_description = 'groups'
def _role(self, obj): def _role(self, obj):
@ -382,11 +382,11 @@ class UserAdmin(BaseUserAdmin):
elif obj.is_staff: elif obj.is_staff:
role = 'Staff' role = 'Staff'
else: else:
role = 'User' role = 'User'
return role return role
_role.short_description = 'role' _role.short_description = 'role'
def has_change_permission(self, request, obj=None): def has_change_permission(self, request, obj=None):
return request.user.has_perm('auth.change_user') return request.user.has_perm('auth.change_user')
@ -404,10 +404,10 @@ class UserAdmin(BaseUserAdmin):
@admin.register(State) @admin.register(State)
class StateAdmin(admin.ModelAdmin): class StateAdmin(admin.ModelAdmin):
list_select_related = True list_select_related = True
list_display = ('name', 'priority', '_user_count') list_display = ('name', 'priority', '_user_count')
def get_queryset(self, request): def get_queryset(self, request):
qs = super().get_queryset(request) qs = super().get_queryset(request)
return qs.annotate(user_count=Count("userprofile__id")) return qs.annotate(user_count=Count("userprofile__id"))
@ -423,17 +423,17 @@ class StateAdmin(admin.ModelAdmin):
}), }),
('Membership', { ('Membership', {
'fields': ( 'fields': (
'public', 'public',
'member_characters', 'member_characters',
'member_corporations', 'member_corporations',
'member_alliances' 'member_alliances'
), ),
}) })
) )
filter_horizontal = [ filter_horizontal = [
'member_characters', 'member_characters',
'member_corporations', 'member_corporations',
'member_alliances', 'member_alliances',
'permissions' 'permissions'
] ]
@ -463,16 +463,16 @@ class StateAdmin(admin.ModelAdmin):
}), }),
) )
return super(StateAdmin, self).get_fieldsets(request, obj=obj) return super(StateAdmin, self).get_fieldsets(request, obj=obj)
class BaseOwnershipAdmin(admin.ModelAdmin): class BaseOwnershipAdmin(admin.ModelAdmin):
class Media: class Media:
css = { css = {
"all": ("authentication/css/admin.css",) "all": ("authentication/css/admin.css",)
} }
list_select_related = ( list_select_related = (
'user__profile__state', 'user__profile__main_character', 'character') 'user__profile__state', 'user__profile__main_character', 'character')
list_display = ( list_display = (
user_profile_pic, user_profile_pic,
user_username, user_username,
@ -480,13 +480,13 @@ class BaseOwnershipAdmin(admin.ModelAdmin):
'character', 'character',
) )
search_fields = ( search_fields = (
'user__username', 'user__username',
'character__character_name', 'character__character_name',
'character__corporation_name', 'character__corporation_name',
'character__alliance_name' 'character__alliance_name'
) )
list_filter = ( list_filter = (
MainCorporationsFilter, MainCorporationsFilter,
MainAllianceFilter, MainAllianceFilter,
) )

View File

@ -2,14 +2,14 @@ from django.conf import settings
def _clean_setting( def _clean_setting(
name: str, name: str,
default_value: object, default_value: object,
min_value: int = None, min_value: int = None,
max_value: int = None, max_value: int = None,
required_type: type = None required_type: type = None
): ):
"""cleans the input for a custom setting """cleans the input for a custom setting
Will use `default_value` if settings does not exit or has the wrong type Will use `default_value` if settings does not exit or has the wrong type
or is outside define boundaries (for int only) or is outside define boundaries (for int only)
@ -18,22 +18,22 @@ def _clean_setting(
Will assume `min_value` of 0 for int (can be overriden) Will assume `min_value` of 0 for int (can be overriden)
Returns cleaned value for setting Returns cleaned value for setting
""" """
if default_value is None and not required_type: if default_value is None and not required_type:
raise ValueError('You must specify a required_type for None defaults') raise ValueError('You must specify a required_type for None defaults')
if not required_type: if not required_type:
required_type = type(default_value) required_type = type(default_value)
if min_value is None and required_type == int: if min_value is None and required_type == int:
min_value = 0 min_value = 0
if (hasattr(settings, name) if (hasattr(settings, name)
and isinstance(getattr(settings, name), required_type) and isinstance(getattr(settings, name), required_type)
and (min_value is None or getattr(settings, name) >= min_value) and (min_value is None or getattr(settings, name) >= min_value)
and (max_value is None or getattr(settings, name) <= max_value) and (max_value is None or getattr(settings, name) <= max_value)
): ):
return getattr(settings, name) return getattr(settings, name)
else: else:
return default_value return default_value
@ -43,4 +43,3 @@ AUTHENTICATION_ADMIN_USERS_MAX_GROUPS = \
AUTHENTICATION_ADMIN_USERS_MAX_CHARS = \ AUTHENTICATION_ADMIN_USERS_MAX_CHARS = \
_clean_setting('AUTHENTICATION_ADMIN_USERS_MAX_CHARS', 5) _clean_setting('AUTHENTICATION_ADMIN_USERS_MAX_CHARS', 5)

View File

@ -12,9 +12,9 @@ logger = logging.getLogger(__name__)
class StateBackend(ModelBackend): class StateBackend(ModelBackend):
@staticmethod @staticmethod
def _get_state_permissions(user_obj): def _get_state_permissions(user_obj):
"""returns permissions for state of given user object""" """returns permissions for state of given user object"""
if hasattr(user_obj, "profile") and user_obj.profile: if hasattr(user_obj, "profile") and user_obj.profile:
return Permission.objects.filter(state=user_obj.profile.state) return Permission.objects.filter(state=user_obj.profile.state)
else: else:
return Permission.objects.none() return Permission.objects.none()

View File

@ -11,4 +11,4 @@ urlpatterns = [
url(r'^register/complete/$', views.registration_complete, name='registration_complete'), url(r'^register/complete/$', views.registration_complete, name='registration_complete'),
url(r'^register/closed/$', views.registration_closed, name='registration_disallowed'), url(r'^register/closed/$', views.registration_closed, name='registration_disallowed'),
url(r'', include('django.contrib.auth.urls')), url(r'', include('django.contrib.auth.urls')),
] ]

View File

@ -23,8 +23,7 @@ class CharacterOwnershipManager(Manager):
def create_by_token(self, token): def create_by_token(self, token):
if not EveCharacter.objects.filter(character_id=token.character_id).exists(): if not EveCharacter.objects.filter(character_id=token.character_id).exists():
EveCharacter.objects.create_character(token.character_id) EveCharacter.objects.create_character(token.character_id)
return self.create(character=EveCharacter.objects.get(character_id=token.character_id), user=token.user, return self.create(character=EveCharacter.objects.get(character_id=token.character_id), user=token.user, owner_hash=token.character_owner_hash)
owner_hash=token.character_owner_hash)
class StateQuerySet(QuerySet): class StateQuerySet(QuerySet):

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-05 21:38 # Generated by Django 1.10.1 on 2016-09-05 21:38
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-07 19:14 # Generated by Django 1.10.1 on 2016-09-07 19:14
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-09 20:29 # Generated by Django 1.10.1 on 2016-09-09 20:29
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-09 23:19 # Generated by Django 1.10.1 on 2016-09-09 23:19
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-09 23:11 # Generated by Django 1.10.1 on 2016-09-09 23:11
from __future__ import unicode_literals from __future__ import unicode_literals
@ -17,7 +16,7 @@ def create_permissions(apps, schema_editor):
Permission = apps.get_model('auth', 'Permission') Permission = apps.get_model('auth', 'Permission')
ct = ContentType.objects.get_for_model(User) ct = ContentType.objects.get_for_model(User)
Permission.objects.get_or_create(codename="member", content_type=ct, name="member") Permission.objects.get_or_create(codename="member", content_type=ct, name="member")
Permission.objects.get_or_create(codename="blue_member", content_type=ct, name="blue_member") Permission.objects.get_or_create(codename="blue_member", content_type=ct, name="blue_member")
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-10 05:42 # Generated by Django 1.10.1 on 2016-09-10 05:42
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-10 21:50 # Generated by Django 1.10.1 on 2016-09-10 21:50
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-12 13:04 # Generated by Django 1.10.1 on 2016-09-12 13:04
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-10-21 02:28 # Generated by Django 1.10.2 on 2016-10-21 02:28
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2017-01-07 06:47 # Generated by Django 1.10.1 on 2017-01-07 06:47
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2017-01-07 07:11 # Generated by Django 1.10.1 on 2017-01-07 07:11
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-01-12 00:59 # Generated by Django 1.10.5 on 2017-01-12 00:59
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-12-11 23:14 # Generated by Django 1.10.2 on 2016-12-11 23:14
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-09 23:19 # Generated by Django 1.10.1 on 2016-09-09 23:19
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-03-22 23:09 # Generated by Django 1.10.5 on 2017-03-22 23:09
from __future__ import unicode_literals from __future__ import unicode_literals
@ -107,8 +106,8 @@ def populate_ownerships(apps, schema_editor):
EveCharacter = apps.get_model('eveonline', 'EveCharacter') EveCharacter = apps.get_model('eveonline', 'EveCharacter')
unique_character_owners = [t['character_id'] for t in unique_character_owners = [t['character_id'] for t in
Token.objects.all().values('character_id').annotate(n=models.Count('user')) if Token.objects.all().values('character_id').annotate(n=models.Count('user')) if
t['n'] == 1 and EveCharacter.objects.filter(character_id=t['character_id']).exists()] t['n'] == 1 and EveCharacter.objects.filter(character_id=t['character_id']).exists()]
tokens = Token.objects.filter(character_id__in=unique_character_owners) tokens = Token.objects.filter(character_id__in=unique_character_owners)
for c_id in unique_character_owners: for c_id in unique_character_owners:
@ -171,8 +170,7 @@ def recreate_authservicesinfo(apps, schema_editor):
# repopulate main characters # repopulate main characters
for profile in UserProfile.objects.exclude(main_character__isnull=True).select_related('user', 'main_character'): for profile in UserProfile.objects.exclude(main_character__isnull=True).select_related('user', 'main_character'):
AuthServicesInfo.objects.update_or_create(user=profile.user, AuthServicesInfo.objects.update_or_create(user=profile.user, defaults={'main_char_id': profile.main_character.character_id})
defaults={'main_char_id': profile.main_character.character_id})
# repopulate states we understand # repopulate states we understand
for profile in UserProfile.objects.exclude(state__name='Guest').filter( for profile in UserProfile.objects.exclude(state__name='Guest').filter(

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations from django.db import migrations

View File

@ -14,15 +14,11 @@ logger = logging.getLogger(__name__)
class State(models.Model): class State(models.Model):
name = models.CharField(max_length=20, unique=True) name = models.CharField(max_length=20, unique=True)
permissions = models.ManyToManyField(Permission, blank=True) permissions = models.ManyToManyField(Permission, blank=True)
priority = models.IntegerField(unique=True, priority = models.IntegerField(unique=True, help_text="Users get assigned the state with the highest priority available to them.")
help_text="Users get assigned the state with the highest priority available to them.")
member_characters = models.ManyToManyField(EveCharacter, blank=True, member_characters = models.ManyToManyField(EveCharacter, blank=True, help_text="Characters to which this state is available.")
help_text="Characters to which this state is available.") member_corporations = models.ManyToManyField(EveCorporationInfo, blank=True, help_text="Corporations to whose members this state is available.")
member_corporations = models.ManyToManyField(EveCorporationInfo, blank=True, member_alliances = models.ManyToManyField(EveAllianceInfo, blank=True, help_text="Alliances to whose members this state is available.")
help_text="Corporations to whose members this state is available.")
member_alliances = models.ManyToManyField(EveAllianceInfo, blank=True,
help_text="Alliances to whose members this state is available.")
public = models.BooleanField(default=False, help_text="Make this state available to any character.") public = models.BooleanField(default=False, help_text="Make this state available to any character.")
objects = StateManager() objects = StateManager()
@ -74,7 +70,7 @@ class UserProfile(models.Model):
logger.info('Updating {} state to {}'.format(self.user, self.state)) logger.info('Updating {} state to {}'.format(self.user, self.state))
self.save(update_fields=['state']) self.save(update_fields=['state'])
notify( notify(
self.user, self.user,
_('State changed to: %s' % state), _('State changed to: %s' % state),
_('Your user\'s state is now: %(state)s') _('Your user\'s state is now: %(state)s')
% ({'state': state}), % ({'state': state}),
@ -114,4 +110,4 @@ class OwnershipRecord(models.Model):
ordering = ['-created'] ordering = ['-created']
def __str__(self): def __str__(self):
return "%s: %s on %s" % (self.user, self.character, self.created) return "%s: %s on %s" % (self.user, self.character, self.created)

View File

@ -75,8 +75,7 @@ def create_required_models(sender, instance, created, *args, **kwargs):
@receiver(post_save, sender=Token) @receiver(post_save, sender=Token)
def record_character_ownership(sender, instance, created, *args, **kwargs): def record_character_ownership(sender, instance, created, *args, **kwargs):
if created: if created:
logger.debug('New token for {0} character {1} saved. Evaluating ownership.'.format(instance.user, logger.debug('New token for {0} character {1} saved. Evaluating ownership.'.format(instance.user, instance.character_name))
instance.character_name))
if instance.user: if instance.user:
query = Q(owner_hash=instance.character_owner_hash) & Q(user=instance.user) query = Q(owner_hash=instance.character_owner_hash) & Q(user=instance.user)
else: else:
@ -85,18 +84,14 @@ def record_character_ownership(sender, instance, created, *args, **kwargs):
CharacterOwnership.objects.filter(character__character_id=instance.character_id).exclude(query).delete() CharacterOwnership.objects.filter(character__character_id=instance.character_id).exclude(query).delete()
# create character if needed # create character if needed
if EveCharacter.objects.filter(character_id=instance.character_id).exists() is False: if EveCharacter.objects.filter(character_id=instance.character_id).exists() is False:
logger.debug('Token is for a new character. Creating model for {0} ({1})'.format(instance.character_name, logger.debug('Token is for a new character. Creating model for {0} ({1})'.format(instance.character_name, instance.character_id))
instance.character_id))
EveCharacter.objects.create_character(instance.character_id) EveCharacter.objects.create_character(instance.character_id)
char = EveCharacter.objects.get(character_id=instance.character_id) char = EveCharacter.objects.get(character_id=instance.character_id)
# check if we need to create ownership # check if we need to create ownership
if instance.user and not CharacterOwnership.objects.filter( if instance.user and not CharacterOwnership.objects.filter(
character__character_id=instance.character_id).exists(): character__character_id=instance.character_id).exists():
logger.debug("Character {0} is not yet owned. Assigning ownership to {1}".format(instance.character_name, logger.debug("Character {0} is not yet owned. Assigning ownership to {1}".format(instance.character_name, instance.user))
instance.user)) CharacterOwnership.objects.update_or_create(character=char, defaults={'owner_hash': instance.character_owner_hash, 'user': instance.user})
CharacterOwnership.objects.update_or_create(character=char,
defaults={'owner_hash': instance.character_owner_hash,
'user': instance.user})
@receiver(pre_delete, sender=CharacterOwnership) @receiver(pre_delete, sender=CharacterOwnership)
@ -156,4 +151,4 @@ def ownership_record_creation(sender, instance, created, *args, **kwargs):
logger.debug("Already have ownership record of {0} by user {1}".format(instance.character, instance.user)) logger.debug("Already have ownership record of {0} by user {1}".format(instance.character, instance.user))
return return
logger.info("Character {0} has a new owner {1}. Creating ownership record.".format(instance.character, instance.user)) logger.info("Character {0} has a new owner {1}. Creating ownership record.".format(instance.character, instance.user))
OwnershipRecord.objects.create(user=instance.user, character=instance.character, owner_hash=instance.owner_hash) OwnershipRecord.objects.create(user=instance.user, character=instance.character, owner_hash=instance.owner_hash)

View File

@ -1,12 +1,12 @@
/* /*
CSS for allianceauth admin site CSS for allianceauth admin site
*/ */
/* styling for profile pic */ /* styling for profile pic */
.img-circle { .img-circle {
border-radius: 50%; border-radius: 50%;
} }
.column-user_profile_pic { .column-user_profile_pic {
width: 1px; width: 1px;
white-space: nowrap; white-space: nowrap;
} }
@ -26,4 +26,4 @@ CSS for allianceauth admin site
color: black ; color: black ;
background-color: rgb(255, 255, 204) ; background-color: rgb(255, 255, 204) ;
z-index: 1 ; z-index: 1 ;
} }

View File

@ -63,7 +63,7 @@
{% endif %} {% endif %}
</div> </div>
</div> </div>
<div class="table visible-xs-block"> <div class="table visible-xs-block">
<p> <p>
<img class="ra-avatar" src="{{ main.portrait_url_64 }}"> <img class="ra-avatar" src="{{ main.portrait_url_64 }}">
<img class="ra-avatar" src="{{ main.corporation_logo_url_64 }}"> <img class="ra-avatar" src="{{ main.corporation_logo_url_64 }}">
@ -74,7 +74,7 @@
{{ main.corporation_name }}<br> {{ main.corporation_name }}<br>
{{ main.alliance_name }} {{ main.alliance_name }}
</p> </p>
</div> </div>
{% endwith %} {% endwith %}
{% else %} {% else %}
<div class="alert alert-danger" role="alert"> <div class="alert alert-danger" role="alert">
@ -121,7 +121,7 @@
{% trans 'Characters' %} {% trans 'Characters' %}
</h3> </h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<table class="table table-aa hidden-xs"> <table class="table table-aa hidden-xs">
<thead> <thead>
<tr> <tr>
@ -132,20 +132,20 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for char in characters %} {% for char in characters %}
<tr> <tr>
<td class="text-center"><img class="ra-avatar img-circle" src="{{ char.portrait_url_32 }}"> <td class="text-center"><img class="ra-avatar img-circle" src="{{ char.portrait_url_32 }}">
</td> </td>
<td class="text-center">{{ char.character_name }}</td> <td class="text-center">{{ char.character_name }}</td>
<td class="text-center">{{ char.corporation_name }}</td> <td class="text-center">{{ char.corporation_name }}</td>
<td class="text-center">{{ char.alliance_name }}</td> <td class="text-center">{{ char.alliance_name }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<table class="table table-aa visible-xs-block" style="width: 100%"> <table class="table table-aa visible-xs-block" style="width: 100%">
<tbody> <tbody>
{% for char in characters %} {% for char in characters %}
<tr> <tr>
<td class="text-center" style="vertical-align: middle"> <td class="text-center" style="vertical-align: middle">
<img class="ra-avatar img-circle" src="{{ char.portrait_url_32 }}"> <img class="ra-avatar img-circle" src="{{ char.portrait_url_32 }}">
@ -154,7 +154,7 @@
<strong>{{ char.character_name }}</strong><br> <strong>{{ char.character_name }}</strong><br>
{{ char.corporation_name }}<br> {{ char.corporation_name }}<br>
{{ char.alliance_name|default:"" }} {{ char.alliance_name|default:"" }}
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

@ -1,8 +1,8 @@
{% extends 'public/middle_box.html' %} {% extends 'public/middle_box.html' %}
{% load static %} {% load static %}
{% block page_title %}Login{% endblock %} {% block page_title %}Login{% endblock %}
{% block middle_box_content %} {% block middle_box_content %}
<a href="{% url 'auth_sso_login' %}{% if request.GET.next %}?next={{request.GET.next}}{%endif%}"> <a href="{% url 'auth_sso_login' %}{% if request.GET.next %}?next={{request.GET.next}}{%endif%}">
<img class="img-responsive center-block" src="{% static 'img/sso/EVE_SSO_Login_Buttons_Large_Black.png' %}" border=0> <img class="img-responsive center-block" src="{% static 'img/sso/EVE_SSO_Login_Buttons_Large_Black.png' %}" border=0>
</a> </a>
{% endblock %} {% endblock %}

View File

@ -21,4 +21,4 @@
{% endblock %} {% endblock %}
{% block extra_include %} {% block extra_include %}
{% include 'bundles/bootstrap-js.html' %} {% include 'bundles/bootstrap-js.html' %}
{% endblock %} {% endblock %}

View File

@ -10,4 +10,4 @@ Link not working? Try copy/pasting this URL into your browser:
This link will expire in {{ expiration_days }} day(s). This link will expire in {{ expiration_days }} day(s).
If this was not you, it is safe to ignore this email. If this was not you, it is safe to ignore this email.

View File

@ -1 +1 @@
Confirm your Alliance Auth account email address Confirm your Alliance Auth account email address

View File

@ -16,15 +16,15 @@ from allianceauth.tests.auth_utils import AuthUtils
from ..admin import ( from ..admin import (
BaseUserAdmin, BaseUserAdmin,
CharacterOwnershipAdmin, CharacterOwnershipAdmin,
StateAdmin, StateAdmin,
MainCorporationsFilter, MainCorporationsFilter,
MainAllianceFilter, MainAllianceFilter,
OwnershipRecordAdmin, OwnershipRecordAdmin,
User, User,
UserAdmin, UserAdmin,
user_main_organization, user_main_organization,
user_profile_pic, user_profile_pic,
user_username, user_username,
update_main_character_model, update_main_character_model,
make_service_hooks_update_groups_action, make_service_hooks_update_groups_action,
@ -36,7 +36,7 @@ from . import get_admin_change_view_url, get_admin_search_url
MODULE_PATH = 'allianceauth.authentication.admin' MODULE_PATH = 'allianceauth.authentication.admin'
class MockRequest(object): class MockRequest(object):
def __init__(self, user=None): def __init__(self, user=None):
self.user = user self.user = user
@ -51,7 +51,7 @@ class TestCaseWithTestData(TestCase):
EveAllianceInfo, EveCorporationInfo, EveCharacter, Group, User EveAllianceInfo, EveCorporationInfo, EveCharacter, Group, User
]: ]:
MyModel.objects.all().delete() MyModel.objects.all().delete()
# groups # groups
cls.group_1 = Group.objects.create( cls.group_1 = Group.objects.create(
name='Group 1' name='Group 1'
@ -84,16 +84,16 @@ class TestCaseWithTestData(TestCase):
alliance = EveAllianceInfo.objects.create( alliance = EveAllianceInfo.objects.create(
alliance_id=3001, alliance_id=3001,
alliance_name='Wayne Enterprises', alliance_name='Wayne Enterprises',
alliance_ticker='WE', alliance_ticker='WE',
executor_corp_id=2001 executor_corp_id=2001
) )
EveCorporationInfo.objects.create( EveCorporationInfo.objects.create(
corporation_id=2001, corporation_id=2001,
corporation_name='Wayne Technologies', corporation_name='Wayne Technologies',
corporation_ticker='WT', corporation_ticker='WT',
member_count=42, member_count=42,
alliance=alliance alliance=alliance
) )
cls.user_1 = User.objects.create_user( cls.user_1 = User.objects.create_user(
character_1.character_name.replace(' ', '_'), character_1.character_name.replace(' ', '_'),
'abc@example.com', 'abc@example.com',
@ -111,7 +111,7 @@ class TestCaseWithTestData(TestCase):
) )
cls.user_1.profile.main_character = character_1 cls.user_1.profile.main_character = character_1
cls.user_1.profile.save() cls.user_1.profile.save()
cls.user_1.groups.add(cls.group_1) cls.user_1.groups.add(cls.group_1)
# user 2 - corp only, staff # user 2 - corp only, staff
character_2 = EveCharacter.objects.create( character_2 = EveCharacter.objects.create(
@ -125,7 +125,7 @@ class TestCaseWithTestData(TestCase):
EveCorporationInfo.objects.create( EveCorporationInfo.objects.create(
corporation_id=2002, corporation_id=2002,
corporation_name='Daily Plane', corporation_name='Daily Plane',
corporation_ticker='DP', corporation_ticker='DP',
member_count=99, member_count=99,
alliance=None alliance=None
) )
@ -144,7 +144,7 @@ class TestCaseWithTestData(TestCase):
cls.user_2.groups.add(cls.group_2) cls.user_2.groups.add(cls.group_2)
cls.user_2.is_staff = True cls.user_2.is_staff = True
cls.user_2.save() cls.user_2.save()
# user 3 - no main, no group, superuser # user 3 - no main, no group, superuser
character_3 = EveCharacter.objects.create( character_3 = EveCharacter.objects.create(
character_id=1101, character_id=1101,
@ -157,7 +157,7 @@ class TestCaseWithTestData(TestCase):
EveCorporationInfo.objects.create( EveCorporationInfo.objects.create(
corporation_id=2101, corporation_id=2101,
corporation_name='Lex Corp', corporation_name='Lex Corp',
corporation_ticker='LC', corporation_ticker='LC',
member_count=666, member_count=666,
alliance=None alliance=None
) )
@ -186,25 +186,25 @@ def make_generic_search_request(ModelClass: type, search_term: str):
username='superuser', password='secret', email='admin@example.com' username='superuser', password='secret', email='admin@example.com'
) )
c = Client() c = Client()
c.login(username='superuser', password='secret') c.login(username='superuser', password='secret')
return c.get( return c.get(
'%s?q=%s' % (get_admin_search_url(ModelClass), quote(search_term)) '%s?q=%s' % (get_admin_search_url(ModelClass), quote(search_term))
) )
class TestCharacterOwnershipAdmin(TestCaseWithTestData): class TestCharacterOwnershipAdmin(TestCaseWithTestData):
def setUp(self): def setUp(self):
self.modeladmin = CharacterOwnershipAdmin( self.modeladmin = CharacterOwnershipAdmin(
model=User, admin_site=AdminSite() model=User, admin_site=AdminSite()
) )
def test_change_view_loads_normally(self): def test_change_view_loads_normally(self):
User.objects.create_superuser( User.objects.create_superuser(
username='superuser', password='secret', email='admin@example.com' username='superuser', password='secret', email='admin@example.com'
) )
c = Client() c = Client()
c.login(username='superuser', password='secret') c.login(username='superuser', password='secret')
ownership = self.user_1.character_ownerships.first() ownership = self.user_1.character_ownerships.first()
response = c.get(get_admin_change_view_url(ownership)) response = c.get(get_admin_change_view_url(ownership))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@ -219,18 +219,18 @@ class TestCharacterOwnershipAdmin(TestCaseWithTestData):
class TestOwnershipRecordAdmin(TestCaseWithTestData): class TestOwnershipRecordAdmin(TestCaseWithTestData):
def setUp(self): def setUp(self):
self.modeladmin = OwnershipRecordAdmin( self.modeladmin = OwnershipRecordAdmin(
model=User, admin_site=AdminSite() model=User, admin_site=AdminSite()
) )
def test_change_view_loads_normally(self): def test_change_view_loads_normally(self):
User.objects.create_superuser( User.objects.create_superuser(
username='superuser', password='secret', email='admin@example.com' username='superuser', password='secret', email='admin@example.com'
) )
c = Client() c = Client()
c.login(username='superuser', password='secret') c.login(username='superuser', password='secret')
ownership_record = OwnershipRecord.objects\ ownership_record = OwnershipRecord.objects\
.filter(user=self.user_1)\ .filter(user=self.user_1)\
.first() .first()
@ -245,23 +245,23 @@ class TestOwnershipRecordAdmin(TestCaseWithTestData):
class TestStateAdmin(TestCaseWithTestData): class TestStateAdmin(TestCaseWithTestData):
def setUp(self): def setUp(self):
self.modeladmin = StateAdmin( self.modeladmin = StateAdmin(
model=User, admin_site=AdminSite() model=User, admin_site=AdminSite()
) )
def test_change_view_loads_normally(self): def test_change_view_loads_normally(self):
User.objects.create_superuser( User.objects.create_superuser(
username='superuser', password='secret', email='admin@example.com' username='superuser', password='secret', email='admin@example.com'
) )
c = Client() c = Client()
c.login(username='superuser', password='secret') c.login(username='superuser', password='secret')
guest_state = AuthUtils.get_guest_state() guest_state = AuthUtils.get_guest_state()
response = c.get(get_admin_change_view_url(guest_state)) response = c.get(get_admin_change_view_url(guest_state))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
member_state = AuthUtils.get_member_state() member_state = AuthUtils.get_member_state()
response = c.get(get_admin_change_view_url(member_state)) response = c.get(get_admin_change_view_url(member_state))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@ -281,12 +281,12 @@ class TestUserAdmin(TestCaseWithTestData):
model=User, admin_site=AdminSite() model=User, admin_site=AdminSite()
) )
self.character_1 = self.user_1.character_ownerships.first().character self.character_1 = self.user_1.character_ownerships.first().character
def test_user_profile_pic_u1(self): def test_user_profile_pic_u1(self):
expected = ( expected = (
'<img src="https://images.evetech.net/characters/1001/' '<img src="https://images.evetech.net/characters/1001/'
'portrait?size=32" class="img-circle">' 'portrait?size=32" class="img-circle">'
) )
self.assertEqual(user_profile_pic(self.user_1), expected) self.assertEqual(user_profile_pic(self.user_1), expected)
def test_user_profile_pic_u3(self): def test_user_profile_pic_u3(self):
@ -332,18 +332,18 @@ class TestUserAdmin(TestCaseWithTestData):
expected = 'Lex Luthor' expected = 'Lex Luthor'
result = self.modeladmin._characters(self.user_3) result = self.modeladmin._characters(self.user_3)
self.assertEqual(result, expected) self.assertEqual(result, expected)
def test_groups_u1(self): def test_groups_u1(self):
expected = 'Group 1' expected = 'Group 1'
result = self.modeladmin._groups(self.user_1) result = self.modeladmin._groups(self.user_1)
self.assertEqual(result, expected) self.assertEqual(result, expected)
def test_groups_u2(self): def test_groups_u2(self):
expected = 'Group 2' expected = 'Group 2'
result = self.modeladmin._groups(self.user_2) result = self.modeladmin._groups(self.user_2)
self.assertEqual(result, expected) self.assertEqual(result, expected)
def test_groups_u3(self): def test_groups_u3(self):
result = self.modeladmin._groups(self.user_3) result = self.modeladmin._groups(self.user_3)
self.assertIsNone(result) self.assertIsNone(result)
@ -387,7 +387,7 @@ class TestUserAdmin(TestCaseWithTestData):
expected = None expected = None
result = self.modeladmin._list_2_html_w_tooltips(items, 5) result = self.modeladmin._list_2_html_w_tooltips(items, 5)
self.assertEqual(expected, result) self.assertEqual(expected, result)
# actions # actions
@patch(MODULE_PATH + '.UserAdmin.message_user', auto_spec=True) @patch(MODULE_PATH + '.UserAdmin.message_user', auto_spec=True)
@ -401,14 +401,14 @@ class TestUserAdmin(TestCaseWithTestData):
) )
self.assertEqual(mock_task.delay.call_count, 2) self.assertEqual(mock_task.delay.call_count, 2)
self.assertTrue(mock_message_user.called) self.assertTrue(mock_message_user.called)
# filters # filters
def test_filter_main_corporations(self): def test_filter_main_corporations(self):
class UserAdminTest(BaseUserAdmin): class UserAdminTest(BaseUserAdmin):
list_filter = (MainCorporationsFilter,) list_filter = (MainCorporationsFilter,)
my_modeladmin = UserAdminTest(User, AdminSite()) my_modeladmin = UserAdminTest(User, AdminSite())
# Make sure the lookups are correct # Make sure the lookups are correct
@ -417,7 +417,7 @@ class TestUserAdmin(TestCaseWithTestData):
changelist = my_modeladmin.get_changelist_instance(request) changelist = my_modeladmin.get_changelist_instance(request)
filters = changelist.get_filters(request) filters = changelist.get_filters(request)
filterspec = filters[0][0] filterspec = filters[0][0]
expected = [ expected = [
(2002, 'Daily Planet'), (2002, 'Daily Planet'),
(2001, 'Wayne Technologies'), (2001, 'Wayne Technologies'),
] ]
@ -425,20 +425,20 @@ class TestUserAdmin(TestCaseWithTestData):
# Make sure the correct queryset is returned # Make sure the correct queryset is returned
request = self.factory.get( request = self.factory.get(
'/', '/',
{'main_corporation_id__exact': self.character_1.corporation_id} {'main_corporation_id__exact': self.character_1.corporation_id}
) )
request.user = self.user_1 request.user = self.user_1
changelist = my_modeladmin.get_changelist_instance(request) changelist = my_modeladmin.get_changelist_instance(request)
queryset = changelist.get_queryset(request) queryset = changelist.get_queryset(request)
expected = [self.user_1] expected = [self.user_1]
self.assertSetEqual(set(queryset), set(expected)) self.assertSetEqual(set(queryset), set(expected))
def test_filter_main_alliances(self): def test_filter_main_alliances(self):
class UserAdminTest(BaseUserAdmin): class UserAdminTest(BaseUserAdmin):
list_filter = (MainAllianceFilter,) list_filter = (MainAllianceFilter,)
my_modeladmin = UserAdminTest(User, AdminSite()) my_modeladmin = UserAdminTest(User, AdminSite())
# Make sure the lookups are correct # Make sure the lookups are correct
@ -447,17 +447,17 @@ class TestUserAdmin(TestCaseWithTestData):
changelist = my_modeladmin.get_changelist_instance(request) changelist = my_modeladmin.get_changelist_instance(request)
filters = changelist.get_filters(request) filters = changelist.get_filters(request)
filterspec = filters[0][0] filterspec = filters[0][0]
expected = [ expected = [
(3001, 'Wayne Enterprises'), (3001, 'Wayne Enterprises'),
] ]
self.assertEqual(filterspec.lookup_choices, expected) self.assertEqual(filterspec.lookup_choices, expected)
# Make sure the correct queryset is returned # Make sure the correct queryset is returned
request = self.factory.get( request = self.factory.get(
'/', '/',
{'main_alliance_id__exact': self.character_1.alliance_id} {'main_alliance_id__exact': self.character_1.alliance_id}
) )
request.user = self.user_1 request.user = self.user_1
changelist = my_modeladmin.get_changelist_instance(request) changelist = my_modeladmin.get_changelist_instance(request)
queryset = changelist.get_queryset(request) queryset = changelist.get_queryset(request)
expected = [self.user_1] expected = [self.user_1]
@ -468,7 +468,7 @@ class TestUserAdmin(TestCaseWithTestData):
username='superuser', password='secret', email='admin@example.com' username='superuser', password='secret', email='admin@example.com'
) )
c = Client() c = Client()
c.login(username='superuser', password='secret') c.login(username='superuser', password='secret')
response = c.get(get_admin_change_view_url(self.user_1)) response = c.get(get_admin_change_view_url(self.user_1))
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@ -485,8 +485,8 @@ class TestMakeServicesHooksActions(TestCaseWithTestData):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.name = 'My Service A' self.name = 'My Service A'
def update_groups(self, user): def update_groups(self, user):
pass pass
@ -498,7 +498,7 @@ class TestMakeServicesHooksActions(TestCaseWithTestData):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.name = 'My Service B' self.name = 'My Service B'
def update_groups(self, user): def update_groups(self, user):
pass pass
@ -510,32 +510,32 @@ class TestMakeServicesHooksActions(TestCaseWithTestData):
def sync_nicknames_bulk(self, user): def sync_nicknames_bulk(self, user):
pass pass
def test_service_has_update_groups_only(self): def test_service_has_update_groups_only(self):
service = self.MyServicesHookTypeA() service = self.MyServicesHookTypeA()
mock_service = MagicMock(spec=service) mock_service = MagicMock(spec=service)
action = make_service_hooks_update_groups_action(mock_service) action = make_service_hooks_update_groups_action(mock_service)
action(MagicMock(), MagicMock(), [self.user_1]) action(MagicMock(), MagicMock(), [self.user_1])
self.assertTrue(mock_service.update_groups.called) self.assertTrue(mock_service.update_groups.called)
def test_service_has_update_groups_bulk(self): def test_service_has_update_groups_bulk(self):
service = self.MyServicesHookTypeB() service = self.MyServicesHookTypeB()
mock_service = MagicMock(spec=service) mock_service = MagicMock(spec=service)
action = make_service_hooks_update_groups_action(mock_service) action = make_service_hooks_update_groups_action(mock_service)
action(MagicMock(), MagicMock(), [self.user_1]) action(MagicMock(), MagicMock(), [self.user_1])
self.assertFalse(mock_service.update_groups.called) self.assertFalse(mock_service.update_groups.called)
self.assertTrue(mock_service.update_groups_bulk.called) self.assertTrue(mock_service.update_groups_bulk.called)
def test_service_has_sync_nickname_only(self): def test_service_has_sync_nickname_only(self):
service = self.MyServicesHookTypeA() service = self.MyServicesHookTypeA()
mock_service = MagicMock(spec=service) mock_service = MagicMock(spec=service)
action = make_service_hooks_sync_nickname_action(mock_service) action = make_service_hooks_sync_nickname_action(mock_service)
action(MagicMock(), MagicMock(), [self.user_1]) action(MagicMock(), MagicMock(), [self.user_1])
self.assertTrue(mock_service.sync_nickname.called) self.assertTrue(mock_service.sync_nickname.called)
def test_service_has_sync_nicknames_bulk(self): def test_service_has_sync_nicknames_bulk(self):
service = self.MyServicesHookTypeB() service = self.MyServicesHookTypeB()
mock_service = MagicMock(spec=service) mock_service = MagicMock(spec=service)
action = make_service_hooks_sync_nickname_action(mock_service) action = make_service_hooks_sync_nickname_action(mock_service)
action(MagicMock(), MagicMock(), [self.user_1]) action(MagicMock(), MagicMock(), [self.user_1])
self.assertFalse(mock_service.sync_nickname.called) self.assertFalse(mock_service.sync_nickname.called)

View File

@ -9,19 +9,19 @@ MODULE_PATH = 'allianceauth.authentication'
class TestSetAppSetting(TestCase): class TestSetAppSetting(TestCase):
@patch(MODULE_PATH + '.app_settings.settings') @patch(MODULE_PATH + '.app_settings.settings')
def test_default_if_not_set(self, mock_settings): def test_default_if_not_set(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = Mock(spec=None) mock_settings.TEST_SETTING_DUMMY = Mock(spec=None)
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
False, False,
) )
self.assertEqual(result, False) self.assertEqual(result, False)
@patch(MODULE_PATH + '.app_settings.settings') @patch(MODULE_PATH + '.app_settings.settings')
def test_default_if_not_set_for_none(self, mock_settings): def test_default_if_not_set_for_none(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = Mock(spec=None) mock_settings.TEST_SETTING_DUMMY = Mock(spec=None)
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
None, None,
required_type=int required_type=int
) )
@ -31,8 +31,8 @@ class TestSetAppSetting(TestCase):
def test_true_stays_true(self, mock_settings): def test_true_stays_true(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = True mock_settings.TEST_SETTING_DUMMY = True
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
False, False,
) )
self.assertEqual(result, True) self.assertEqual(result, True)
@ -40,7 +40,7 @@ class TestSetAppSetting(TestCase):
def test_false_stays_false(self, mock_settings): def test_false_stays_false(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = False mock_settings.TEST_SETTING_DUMMY = False
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
False False
) )
self.assertEqual(result, False) self.assertEqual(result, False)
@ -49,7 +49,7 @@ class TestSetAppSetting(TestCase):
def test_default_for_invalid_type_bool(self, mock_settings): def test_default_for_invalid_type_bool(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = 'invalid type' mock_settings.TEST_SETTING_DUMMY = 'invalid type'
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
False False
) )
self.assertEqual(result, False) self.assertEqual(result, False)
@ -58,7 +58,7 @@ class TestSetAppSetting(TestCase):
def test_default_for_invalid_type_int(self, mock_settings): def test_default_for_invalid_type_int(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = 'invalid type' mock_settings.TEST_SETTING_DUMMY = 'invalid type'
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
50 50
) )
self.assertEqual(result, 50) self.assertEqual(result, 50)
@ -67,7 +67,7 @@ class TestSetAppSetting(TestCase):
def test_default_if_below_minimum_1(self, mock_settings): def test_default_if_below_minimum_1(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = -5 mock_settings.TEST_SETTING_DUMMY = -5
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
default_value=50 default_value=50
) )
self.assertEqual(result, 50) self.assertEqual(result, 50)
@ -76,7 +76,7 @@ class TestSetAppSetting(TestCase):
def test_default_if_below_minimum_2(self, mock_settings): def test_default_if_below_minimum_2(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = -50 mock_settings.TEST_SETTING_DUMMY = -50
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
default_value=50, default_value=50,
min_value=-10 min_value=-10
) )
@ -86,7 +86,7 @@ class TestSetAppSetting(TestCase):
def test_default_for_invalid_type_int(self, mock_settings): def test_default_for_invalid_type_int(self, mock_settings):
mock_settings.TEST_SETTING_DUMMY = 1000 mock_settings.TEST_SETTING_DUMMY = 1000
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
default_value=50, default_value=50,
max_value=100 max_value=100
) )
@ -97,6 +97,6 @@ class TestSetAppSetting(TestCase):
mock_settings.TEST_SETTING_DUMMY = 'invalid type' mock_settings.TEST_SETTING_DUMMY = 'invalid type'
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
result = app_settings._clean_setting( result = app_settings._clean_setting(
'TEST_SETTING_DUMMY', 'TEST_SETTING_DUMMY',
default_value=None default_value=None
) )

View File

@ -23,27 +23,27 @@ class TestStatePermissions(TestCase):
self.permission_2 = AuthUtils.get_permission_by_name(PERMISSION_2) self.permission_2 = AuthUtils.get_permission_by_name(PERMISSION_2)
# group # group
self.group_1 = Group.objects.create(name="Group 1") self.group_1 = Group.objects.create(name="Group 1")
self.group_2 = Group.objects.create(name="Group 2") self.group_2 = Group.objects.create(name="Group 2")
# state # state
self.state_1 = AuthUtils.get_member_state() self.state_1 = AuthUtils.get_member_state()
self.state_2 = AuthUtils.create_state("Other State", 75) self.state_2 = AuthUtils.create_state("Other State", 75)
# user # user
self.user = AuthUtils.create_user("Bruce Wayne") self.user = AuthUtils.create_user("Bruce Wayne")
self.main = AuthUtils.add_main_character_2(self.user, self.user.username, 123) self.main = AuthUtils.add_main_character_2(self.user, self.user.username, 123)
def test_user_has_user_permissions(self): def test_user_has_user_permissions(self):
self.user.user_permissions.add(self.permission_1) self.user.user_permissions.add(self.permission_1)
user = User.objects.get(pk=self.user.pk) user = User.objects.get(pk=self.user.pk)
self.assertTrue(user.has_perm(PERMISSION_1)) self.assertTrue(user.has_perm(PERMISSION_1))
def test_user_has_group_permissions(self): def test_user_has_group_permissions(self):
self.group_1.permissions.add(self.permission_1) self.group_1.permissions.add(self.permission_1)
self.user.groups.add(self.group_1) self.user.groups.add(self.group_1)
user = User.objects.get(pk=self.user.pk) user = User.objects.get(pk=self.user.pk)
self.assertTrue(user.has_perm(PERMISSION_1)) self.assertTrue(user.has_perm(PERMISSION_1))
@ -55,7 +55,7 @@ class TestStatePermissions(TestCase):
self.assertTrue(user.has_perm(PERMISSION_1)) self.assertTrue(user.has_perm(PERMISSION_1))
def test_when_user_changes_state_perms_change_accordingly(self): def test_when_user_changes_state_perms_change_accordingly(self):
self.state_1.permissions.add(self.permission_1) self.state_1.permissions.add(self.permission_1)
self.state_1.member_characters.add(self.main) self.state_1.member_characters.add(self.main)
user = User.objects.get(pk=self.user.pk) user = User.objects.get(pk=self.user.pk)
self.assertTrue(user.has_perm(PERMISSION_1)) self.assertTrue(user.has_perm(PERMISSION_1))
@ -68,16 +68,16 @@ class TestStatePermissions(TestCase):
self.assertTrue(user.has_perm(PERMISSION_2)) self.assertTrue(user.has_perm(PERMISSION_2))
def test_state_permissions_are_returned_for_current_user_object(self): def test_state_permissions_are_returned_for_current_user_object(self):
# verify state permissions are returns for the current user object # verify state permissions are returns for the current user object
# and not for it's instance in the database, which might be outdated # and not for it's instance in the database, which might be outdated
self.state_1.permissions.add(self.permission_1) self.state_1.permissions.add(self.permission_1)
self.state_2.permissions.add(self.permission_2) self.state_2.permissions.add(self.permission_2)
self.state_1.member_characters.add(self.main) self.state_1.member_characters.add(self.main)
user = User.objects.get(pk=self.user.pk) user = User.objects.get(pk=self.user.pk)
user.profile.state = self.state_2 user.profile.state = self.state_2
self.assertFalse(user.has_perm(PERMISSION_1)) self.assertFalse(user.has_perm(PERMISSION_1))
self.assertTrue(user.has_perm(PERMISSION_2)) self.assertTrue(user.has_perm(PERMISSION_2))
class TestAuthenticate(TestCase): class TestAuthenticate(TestCase):
@classmethod @classmethod
@ -138,7 +138,7 @@ class TestAuthenticate(TestCase):
def test_iterate_username(self): def test_iterate_username(self):
t = Token(character_id=self.unclaimed_character.character_id, t = Token(character_id=self.unclaimed_character.character_id,
character_name=self.unclaimed_character.character_name, character_owner_hash='3') character_name=self.unclaimed_character.character_name, character_owner_hash='3')
username = StateBackend().authenticate(token=t).username username = StateBackend().authenticate(token=t).username
t.character_owner_hash = '4' t.character_owner_hash = '4'
username_1 = StateBackend().authenticate(token=t).username username_1 = StateBackend().authenticate(token=t).username

View File

@ -80,11 +80,11 @@ class StateTestCase(TestCase):
def setUpTestData(cls): def setUpTestData(cls):
cls.user = AuthUtils.create_user('test_user', disconnect_signals=True) cls.user = AuthUtils.create_user('test_user', disconnect_signals=True)
AuthUtils.add_main_character(cls.user, 'Test Character', '1', corp_id='1', alliance_id='1', AuthUtils.add_main_character(cls.user, 'Test Character', '1', corp_id='1', alliance_id='1',
corp_name='Test Corp', alliance_name='Test Alliance') corp_name='Test Corp', alliance_name='Test Alliance')
cls.guest_state = get_guest_state() cls.guest_state = get_guest_state()
cls.test_character = EveCharacter.objects.get(character_id='1') cls.test_character = EveCharacter.objects.get(character_id='1')
cls.test_corporation = EveCorporationInfo.objects.create(corporation_id='1', corporation_name='Test Corp', cls.test_corporation = EveCorporationInfo.objects.create(corporation_id='1', corporation_name='Test Corp',
corporation_ticker='TEST', member_count=1) corporation_ticker='TEST', member_count=1)
cls.test_alliance = EveAllianceInfo.objects.create(alliance_id='1', alliance_name='Test Alliance', cls.test_alliance = EveAllianceInfo.objects.create(alliance_id='1', alliance_name='Test Alliance',
alliance_ticker='TEST', executor_corp_id='1') alliance_ticker='TEST', executor_corp_id='1')
cls.member_state = State.objects.create( cls.member_state = State.objects.create(
@ -215,7 +215,7 @@ class CharacterOwnershipCheckTestCase(TestCase):
def setUpTestData(cls): def setUpTestData(cls):
cls.user = AuthUtils.create_user('test_user', disconnect_signals=True) cls.user = AuthUtils.create_user('test_user', disconnect_signals=True)
AuthUtils.add_main_character(cls.user, 'Test Character', '1', corp_id='1', alliance_id='1', AuthUtils.add_main_character(cls.user, 'Test Character', '1', corp_id='1', alliance_id='1',
corp_name='Test Corp', alliance_name='Test Alliance') corp_name='Test Corp', alliance_name='Test Alliance')
cls.character = EveCharacter.objects.get(character_id=1) cls.character = EveCharacter.objects.get(character_id=1)
cls.token = Token.objects.create( cls.token = Token.objects.create(
user=cls.user, user=cls.user,

View File

@ -10,9 +10,9 @@ from django.test import TestCase
from allianceauth.templatetags.admin_status import ( from allianceauth.templatetags.admin_status import (
status_overview, status_overview,
_fetch_list_from_gitlab, _fetch_list_from_gitlab,
_current_notifications, _current_notifications,
_current_version_summary, _current_version_summary,
_fetch_notification_issues_from_gitlab, _fetch_notification_issues_from_gitlab,
_latests_versions _latests_versions
) )
@ -58,10 +58,10 @@ class TestStatusOverviewTag(TestCase):
@patch(MODULE_PATH + '.admin_status.__version__', TEST_VERSION) @patch(MODULE_PATH + '.admin_status.__version__', TEST_VERSION)
@patch(MODULE_PATH + '.admin_status._fetch_celery_queue_length') @patch(MODULE_PATH + '.admin_status._fetch_celery_queue_length')
@patch(MODULE_PATH + '.admin_status._current_version_summary') @patch(MODULE_PATH + '.admin_status._current_version_summary')
@patch(MODULE_PATH + '.admin_status._current_notifications') @patch(MODULE_PATH + '.admin_status._current_notifications')
def test_status_overview( def test_status_overview(
self, self,
mock_current_notifications, mock_current_notifications,
mock_current_version_info, mock_current_version_info,
mock_fetch_celery_queue_length mock_fetch_celery_queue_length
): ):
@ -82,7 +82,7 @@ class TestStatusOverviewTag(TestCase):
} }
mock_current_version_info.return_value = version_info mock_current_version_info.return_value = version_info
mock_fetch_celery_queue_length.return_value = 3 mock_fetch_celery_queue_length.return_value = 3
result = status_overview() result = status_overview()
expected = { expected = {
'notifications': GITHUB_NOTIFICATION_ISSUES[:5], 'notifications': GITHUB_NOTIFICATION_ISSUES[:5],
@ -111,7 +111,7 @@ class TestNotifications(TestCase):
url = ( url = (
'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth/issues' 'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth/issues'
'?labels=announcement' '?labels=announcement'
) )
requests_mocker.get(url, json=GITHUB_NOTIFICATION_ISSUES) requests_mocker.get(url, json=GITHUB_NOTIFICATION_ISSUES)
# when # when
result = _fetch_notification_issues_from_gitlab() result = _fetch_notification_issues_from_gitlab()
@ -127,13 +127,13 @@ class TestNotifications(TestCase):
# then # then
self.assertEqual(result['notifications'], GITHUB_NOTIFICATION_ISSUES[:5]) self.assertEqual(result['notifications'], GITHUB_NOTIFICATION_ISSUES[:5])
@requests_mock.mock() @requests_mock.mock()
def test_current_notifications_failed(self, requests_mocker): def test_current_notifications_failed(self, requests_mocker):
# given # given
url = ( url = (
'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth/issues' 'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth/issues'
'?labels=announcement' '?labels=announcement'
) )
requests_mocker.get(url, status_code=404) requests_mocker.get(url, status_code=404)
# when # when
result = _current_notifications() result = _current_notifications()
@ -163,7 +163,7 @@ class TestVersionTags(TestCase):
@patch(MODULE_PATH + '.admin_status.__version__', TEST_VERSION) @patch(MODULE_PATH + '.admin_status.__version__', TEST_VERSION)
@patch(MODULE_PATH + '.admin_status.cache') @patch(MODULE_PATH + '.admin_status.cache')
def test_current_version_info_normal(self, mock_cache): def test_current_version_info_normal(self, mock_cache):
# given # given
mock_cache.get_or_set.return_value = GITHUB_TAGS mock_cache.get_or_set.return_value = GITHUB_TAGS
# when # when
@ -184,7 +184,7 @@ class TestVersionTags(TestCase):
url = ( url = (
'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth' 'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth'
'/repository/tags' '/repository/tags'
) )
requests_mocker.get(url, status_code=500) requests_mocker.get(url, status_code=500)
# when # when
result = _current_version_summary() result = _current_version_summary()
@ -197,7 +197,7 @@ class TestVersionTags(TestCase):
url = ( url = (
'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth' 'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth'
'/repository/tags' '/repository/tags'
) )
requests_mocker.get(url, json=GITHUB_TAGS) requests_mocker.get(url, json=GITHUB_TAGS)
# when # when
result = _current_version_summary() result = _current_version_summary()
@ -208,7 +208,7 @@ class TestVersionTags(TestCase):
@patch(MODULE_PATH + '.admin_status.cache') @patch(MODULE_PATH + '.admin_status.cache')
def test_current_version_info_return_no_data(self, mock_cache): def test_current_version_info_return_no_data(self, mock_cache):
# given # given
mock_cache.get_or_set.return_value = None mock_cache.get_or_set.return_value = None
# when # when
result = _current_version_summary() result = _current_version_summary()
# then # then
@ -218,7 +218,7 @@ class TestVersionTags(TestCase):
class TestLatestsVersion(TestCase): class TestLatestsVersion(TestCase):
def test_all_version_types_defined(self): def test_all_version_types_defined(self):
tags = create_tags_list( tags = create_tags_list(
['2.1.1', '2.1.0', '2.0.0', '2.1.1a1', '1.1.1', '1.1.0', '1.0.0'] ['2.1.1', '2.1.0', '2.0.0', '2.1.1a1', '1.1.1', '1.1.0', '1.0.0']
) )
@ -229,7 +229,7 @@ class TestLatestsVersion(TestCase):
self.assertEqual(beta, Pep440Version('2.1.1a1')) self.assertEqual(beta, Pep440Version('2.1.1a1'))
def test_major_and_minor_not_defined_with_zero(self): def test_major_and_minor_not_defined_with_zero(self):
tags = create_tags_list( tags = create_tags_list(
['2.1.2', '2.1.1', '2.0.1', '2.1.1a1', '1.1.1', '1.1.0', '1.0.0'] ['2.1.2', '2.1.1', '2.0.1', '2.1.1a1', '1.1.1', '1.1.0', '1.0.0']
) )
@ -238,9 +238,9 @@ class TestLatestsVersion(TestCase):
self.assertEqual(minor, Pep440Version('2.1.1')) self.assertEqual(minor, Pep440Version('2.1.1'))
self.assertEqual(patch, Pep440Version('2.1.2')) self.assertEqual(patch, Pep440Version('2.1.2'))
self.assertEqual(beta, Pep440Version('2.1.1a1')) self.assertEqual(beta, Pep440Version('2.1.1a1'))
def test_can_ignore_invalid_versions(self): def test_can_ignore_invalid_versions(self):
tags = create_tags_list( tags = create_tags_list(
['2.1.1', '2.1.0', '2.0.0', '2.1.1a1', 'invalid'] ['2.1.1', '2.1.0', '2.0.0', '2.1.1a1', 'invalid']
) )
@ -252,9 +252,9 @@ class TestLatestsVersion(TestCase):
class TestFetchListFromGitlab(TestCase): class TestFetchListFromGitlab(TestCase):
page_size = 2 page_size = 2
def setUp(self): def setUp(self):
self.url = ( self.url = (
'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth' 'https://gitlab.com/api/v4/projects/allianceauth%2Fallianceauth'
@ -266,8 +266,8 @@ class TestFetchListFromGitlab(TestCase):
page = int(request.qs['page'][0]) page = int(request.qs['page'][0])
start = (page - 1) * cls.page_size start = (page - 1) * cls.page_size
end = start + cls.page_size end = start + cls.page_size
return GITHUB_TAGS[start:end] return GITHUB_TAGS[start:end]
@requests_mock.mock() @requests_mock.mock()
def test_can_fetch_one_page_with_header(self, requests_mocker): def test_can_fetch_one_page_with_header(self, requests_mocker):
headers = { headers = {
@ -279,7 +279,7 @@ class TestFetchListFromGitlab(TestCase):
self.assertEqual(requests_mocker.call_count, 1) self.assertEqual(requests_mocker.call_count, 1)
@requests_mock.mock() @requests_mock.mock()
def test_can_fetch_one_page_wo_header(self, requests_mocker): def test_can_fetch_one_page_wo_header(self, requests_mocker):
requests_mocker.get(self.url, json=GITHUB_TAGS) requests_mocker.get(self.url, json=GITHUB_TAGS)
result = _fetch_list_from_gitlab(self.url) result = _fetch_list_from_gitlab(self.url)
self.assertEqual(result, GITHUB_TAGS) self.assertEqual(result, GITHUB_TAGS)
@ -296,7 +296,7 @@ class TestFetchListFromGitlab(TestCase):
self.assertEqual(requests_mocker.call_count, 1) self.assertEqual(requests_mocker.call_count, 1)
@requests_mock.mock() @requests_mock.mock()
def test_can_fetch_multiple_pages(self, requests_mocker): def test_can_fetch_multiple_pages(self, requests_mocker):
total_pages = ceil(len(GITHUB_TAGS) / self.page_size) total_pages = ceil(len(GITHUB_TAGS) / self.page_size)
headers = { headers = {
'x-total-pages': str(total_pages) 'x-total-pages': str(total_pages)
@ -307,7 +307,7 @@ class TestFetchListFromGitlab(TestCase):
self.assertEqual(requests_mocker.call_count, total_pages) self.assertEqual(requests_mocker.call_count, total_pages)
@requests_mock.mock() @requests_mock.mock()
def test_can_fetch_given_number_of_pages_only(self, requests_mocker): def test_can_fetch_given_number_of_pages_only(self, requests_mocker):
total_pages = ceil(len(GITHUB_TAGS) / self.page_size) total_pages = ceil(len(GITHUB_TAGS) / self.page_size)
headers = { headers = {
'x-total-pages': str(total_pages) 'x-total-pages': str(total_pages)

View File

@ -9,8 +9,8 @@ app_name = 'authentication'
urlpatterns = [ urlpatterns = [
url(r'^$', views.index, name='index'), url(r'^$', views.index, name='index'),
url( url(
r'^account/login/$', r'^account/login/$',
TemplateView.as_view(template_name='public/login.html'), TemplateView.as_view(template_name='public/login.html'),
name='login' name='login'
), ),
url( url(
@ -19,9 +19,9 @@ urlpatterns = [
name='change_main_character' name='change_main_character'
), ),
url( url(
r'^account/characters/add/$', r'^account/characters/add/$',
views.add_character, views.add_character,
name='add_character' name='add_character'
), ),
url(r'^dashboard/$', views.dashboard, name='dashboard'), url(r'^dashboard/$', views.dashboard, name='dashboard'),
] ]

View File

@ -16,8 +16,8 @@ from esi.decorators import token_required
from esi.models import Token from esi.models import Token
from django_registration.backends.activation.views import ( from django_registration.backends.activation.views import (
RegistrationView as BaseRegistrationView, RegistrationView as BaseRegistrationView,
ActivationView as BaseActivationView, ActivationView as BaseActivationView,
REGISTRATION_SALT REGISTRATION_SALT
) )
from django_registration.signals import user_registered from django_registration.signals import user_registered
@ -52,7 +52,7 @@ def dashboard(request):
.filter(character_ownership__user=request.user)\ .filter(character_ownership__user=request.user)\
.select_related()\ .select_related()\
.order_by('character_name') .order_by('character_name')
context = { context = {
'groups': groups, 'groups': groups,
'characters': characters 'characters': characters
@ -71,7 +71,7 @@ def main_character_change(request, token):
co = CharacterOwnership.objects.create_by_token(token) co = CharacterOwnership.objects.create_by_token(token)
else: else:
messages.error( messages.error(
request, request,
_('Cannot change main character to %(char)s: character owned by a different account.') % ({'char': token.character_name}) _('Cannot change main character to %(char)s: character owned by a different account.') % ({'char': token.character_name})
) )
co = None co = None
@ -138,7 +138,7 @@ class RegistrationView(BaseRegistrationView):
template_name = "public/register.html" template_name = "public/register.html"
email_body_template = "registration/activation_email.txt" email_body_template = "registration/activation_email.txt"
email_subject_template = "registration/activation_email_subject.txt" email_subject_template = "registration/activation_email_subject.txt"
success_url = reverse_lazy('registration_complete') success_url = reverse_lazy('registration_complete')
def get_success_url(self, user): def get_success_url(self, user):
if not getattr(settings, 'REGISTRATION_VERIFY_EMAIL', True): if not getattr(settings, 'REGISTRATION_VERIFY_EMAIL', True):
@ -181,12 +181,12 @@ class RegistrationView(BaseRegistrationView):
# Step 3 # Step 3
class ActivationView(BaseActivationView): class ActivationView(BaseActivationView):
template_name = "registration/activate.html" template_name = "registration/activate.html"
success_url = reverse_lazy('registration_activation_complete') success_url = reverse_lazy('registration_activation_complete')
def validate_key(self, activation_key): def validate_key(self, activation_key):
try: try:
dump = signing.loads(activation_key, salt=REGISTRATION_SALT, dump = signing.loads(activation_key, salt=REGISTRATION_SALT,
max_age=settings.ACCOUNT_ACTIVATION_DAYS * 86400) max_age=settings.ACCOUNT_ACTIVATION_DAYS * 86400)
return dump return dump
except signing.BadSignature: except signing.BadSignature:
return None return None

View File

@ -3,4 +3,4 @@ from django.contrib import admin
from .models import CorpStats, CorpMember from .models import CorpStats, CorpMember
admin.site.register(CorpStats) admin.site.register(CorpStats)
admin.site.register(CorpMember) admin.site.register(CorpMember)

View File

@ -6,11 +6,13 @@ from allianceauth.corputils import urls
class CorpStats(MenuItemHook): class CorpStats(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, MenuItemHook.__init__(
_('Corporation Stats'), self,
'fas fa-share-alt fa-fw', _('Corporation Stats'),
'corputils:view', 'fas fa-share-alt fa-fw',
navactive=['corputils:']) 'corputils:view',
navactive=['corputils:']
)
def render(self, request): def render(self, request):
if request.user.has_perm('corputils.view_corp_corpstats') or request.user.has_perm( if request.user.has_perm('corputils.view_corp_corpstats') or request.user.has_perm(

View File

@ -37,7 +37,7 @@ class CorpStatsQuerySet(models.QuerySet):
return self.filter(query) return self.filter(query)
except AssertionError: except AssertionError:
logger.debug('User %s has no main character. No corpstats visible.' % user) logger.debug('User %s has no main character. No corpstats visible.' % user)
return self.none() return self.none()
class CorpStatsManager(models.Manager): class CorpStatsManager(models.Manager):

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-12-14 21:36 # Generated by Django 1.10.1 on 2016-12-14 21:36
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-12-14 21:48 # Generated by Django 1.10.1 on 2016-12-14 21:48
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-03-22 23:35 # Generated by Django 1.10.5 on 2017-03-22 23:35
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-03-26 20:13 # Generated by Django 1.10.5 on 2017-03-26 20:13
from __future__ import unicode_literals from __future__ import unicode_literals
@ -13,8 +12,7 @@ def convert_json_to_members(apps, schema_editor):
for cs in CorpStats.objects.all(): for cs in CorpStats.objects.all():
members = json.loads(cs._members) members = json.loads(cs._members)
CorpMember.objects.bulk_create( CorpMember.objects.bulk_create(
[CorpMember(corpstats=cs, character_id=member_id, character_name=member_name) for member_id, member_name in [CorpMember(corpstats=cs, character_id=member_id, character_name=member_name) for member_id, member_name in members.items()]
members.items()]
) )

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.2 on 2017-06-10 15:34 # Generated by Django 1.11.2 on 2017-06-10 15:34
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -6,8 +6,7 @@ from bravado.exception import HTTPForbidden
from django.db import models from django.db import models
from esi.errors import TokenError from esi.errors import TokenError
from esi.models import Token from esi.models import Token
from allianceauth.eveonline.models import EveCorporationInfo, EveCharacter,\ from allianceauth.eveonline.models import EveCorporationInfo, EveCharacter, EveAllianceInfo
EveAllianceInfo
from allianceauth.notifications import notify from allianceauth.notifications import notify
from allianceauth.corputils.managers import CorpStatsManager from allianceauth.corputils.managers import CorpStatsManager
@ -49,8 +48,7 @@ class CorpStats(models.Model):
def update(self): def update(self):
try: try:
c = self.token.get_esi_client(spec_file=SWAGGER_SPEC_PATH) c = self.token.get_esi_client(spec_file=SWAGGER_SPEC_PATH)
assert c.Character.get_characters_character_id(character_id=self.token.character_id).result()[ assert c.Character.get_characters_character_id(character_id=self.token.character_id).result()['corporation_id'] == int(self.corp.corporation_id)
'corporation_id'] == int(self.corp.corporation_id)
member_ids = c.Corporation.get_corporations_corporation_id_members( member_ids = c.Corporation.get_corporations_corporation_id_members(
corporation_id=self.corp.corporation_id).result() corporation_id=self.corp.corporation_id).result()
@ -58,18 +56,15 @@ class CorpStats(models.Model):
# the swagger spec doesn't have a maxItems count # the swagger spec doesn't have a maxItems count
# manual testing says we can do over 350, but let's not risk it # manual testing says we can do over 350, but let's not risk it
member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)] member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)]
member_name_chunks = [c.Universe.post_universe_names(ids=id_chunk).result() for id_chunk in member_name_chunks = [c.Universe.post_universe_names(ids=id_chunk).result() for id_chunk in member_id_chunks]
member_id_chunks]
member_list = {} member_list = {}
for name_chunk in member_name_chunks: for name_chunk in member_name_chunks:
member_list.update({m['id']: m['name'] for m in name_chunk}) member_list.update({m['id']: m['name'] for m in name_chunk})
# bulk create new member models # bulk create new member models
missing_members = [m_id for m_id in member_ids if missing_members = [m_id for m_id in member_ids if not CorpMember.objects.filter(corpstats=self, character_id=m_id).exists()]
not CorpMember.objects.filter(corpstats=self, character_id=m_id).exists()]
CorpMember.objects.bulk_create( CorpMember.objects.bulk_create(
[CorpMember(character_id=m_id, character_name=member_list[m_id], corpstats=self) for m_id in [CorpMember(character_id=m_id, character_name=member_list[m_id], corpstats=self) for m_id in missing_members])
missing_members])
# purge old members # purge old members
self.members.exclude(character_id__in=member_ids).delete() self.members.exclude(character_id__in=member_ids).delete()
@ -80,21 +75,22 @@ class CorpStats(models.Model):
except TokenError as e: except TokenError as e:
logger.warning("%s failed to update: %s" % (self, e)) logger.warning("%s failed to update: %s" % (self, e))
if self.token.user: if self.token.user:
notify(self.token.user, "%s failed to update with your ESI token." % self, notify(
message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.", self.token.user, "%s failed to update with your ESI token." % self,
level="error") message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.",
level="error")
self.delete() self.delete()
except HTTPForbidden as e: except HTTPForbidden as e:
logger.warning("%s failed to update: %s" % (self, e)) logger.warning("%s failed to update: %s" % (self, e))
if self.token.user: if self.token.user:
notify(self.token.user, "%s failed to update with your ESI token." % self, notify(self.token.user, "%s failed to update with your ESI token." % self, message="%s: %s" % (e.status_code, e.message), level="error")
message="%s: %s" % (e.status_code, e.message), level="error")
self.delete() self.delete()
except AssertionError: except AssertionError:
logger.warning("%s token character no longer in corp." % self) logger.warning("%s token character no longer in corp." % self)
if self.token.user: if self.token.user:
notify(self.token.user, "%s cannot update with your ESI token." % self, notify(
message="%s cannot update with your ESI token as you have left corp." % self, level="error") self.token.user, "%s cannot update with your ESI token." % self,
message="%s cannot update with your ESI token as you have left corp." % self, level="error")
self.delete() self.delete()
@property @property
@ -127,9 +123,7 @@ class CorpStats(models.Model):
@property @property
def mains(self): def mains(self):
return self.members.filter(pk__in=[m.pk for m in self.members.all() if return self.members.filter(pk__in=[m.pk for m in self.members.all() if m.main_character and int(m.main_character.character_id) == int(m.character_id)])
m.main_character and int(m.main_character.character_id) == int(
m.character_id)])
def visible_to(self, user): def visible_to(self, user):
return CorpStats.objects.filter(pk=self.pk).visible_to(user).exists() return CorpStats.objects.filter(pk=self.pk).visible_to(user).exists()

File diff suppressed because one or more lines are too long

View File

@ -34,4 +34,4 @@
{% block member_data %}{% endblock %} {% block member_data %}{% endblock %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -58,8 +58,7 @@
{% for id, main in mains.items %} {% for id, main in mains.items %}
<tr> <tr>
<td class="text-center" style="vertical-align:middle"> <td class="text-center" style="vertical-align:middle">
<div class="thumbnail" <div class="thumbnail" style="border: 0 none; box-shadow: none; background: transparent;">
style="border: 0 none; box-shadow: none; background: transparent;">
<img src="{{ main.main.portrait_url_64 }}" class="img-circle"> <img src="{{ main.main.portrait_url_64 }}" class="img-circle">
<div class="caption text-center"> <div class="caption text-center">
{{ main.main }} {{ main.main }}
@ -88,8 +87,7 @@
<td class="text-center" style="width:30%">{{ alt.corporation_name }}</td> <td class="text-center" style="width:30%">{{ alt.corporation_name }}</td>
<td class="text-center" style="width:30%">{{ alt.alliance_name }}</td> <td class="text-center" style="width:30%">{{ alt.alliance_name }}</td>
<td class="text-center" style="width:5%"> <td class="text-center" style="width:5%">
<a href="https://zkillboard.com/character/{{ alt.character_id }}/" <a href="https://zkillboard.com/character/{{ alt.character_id }}/" class="label label-danger" target="_blank">
class="label label-danger" target="_blank">
{% trans "Killboard" %} {% trans "Killboard" %}
</a> </a>
</td> </td>
@ -123,10 +121,9 @@
<tr> <tr>
<td><img src="{{ member.portrait_url }}" class="img-circle"></td> <td><img src="{{ member.portrait_url }}" class="img-circle"></td>
<td class="text-center">{{ member }}</td> <td class="text-center">{{ member }}</td>
<td class="text-center"><a <td class="text-center">
href="https://zkillboard.com/character/{{ member.character_id }}/" <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="label label-danger" target="_blank">{% trans "Killboard" %}</a>
class="label label-danger" </td>
target="_blank">{% trans "Killboard" %}</a></td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.character_name }}</td> <td class="text-center">{{ member.character_ownership.user.profile.main_character.character_name }}</td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.corporation_name }}</td> <td class="text-center">{{ member.character_ownership.user.profile.main_character.corporation_name }}</td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.alliance_name }}</td> <td class="text-center">{{ member.character_ownership.user.profile.main_character.alliance_name }}</td>
@ -136,10 +133,9 @@
<tr class="danger"> <tr class="danger">
<td><img src="{{ member.portrait_url }}" class="img-circle"></td> <td><img src="{{ member.portrait_url }}" class="img-circle"></td>
<td class="text-center">{{ member.character_name }}</td> <td class="text-center">{{ member.character_name }}</td>
<td class="text-center"><a <td class="text-center">
href="https://zkillboard.com/character/{{ member.character_id }}/" <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="label label-danger" target="_blank">{% trans "Killboard" %}</a>
class="label label-danger" </td>
target="_blank">{% trans "Killboard" %}</a></td>
<td class="text-center"></td> <td class="text-center"></td>
<td class="text-center"></td> <td class="text-center"></td>
<td class="text-center"></td> <td class="text-center"></td>
@ -167,9 +163,7 @@
<td><img src="{{ member.portrait_url }}" class="img-circle"></td> <td><img src="{{ member.portrait_url }}" class="img-circle"></td>
<td class="text-center">{{ member.character_name }}</td> <td class="text-center">{{ member.character_name }}</td>
<td class="text-center"> <td class="text-center">
<a href="https://zkillboard.com/character/{{ member.character_id }}/" <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="label label-danger" target="_blank">
class="label label-danger"
target="_blank">
{% trans "Killboard" %} {% trans "Killboard" %}
</a> </a>
</td> </td>

View File

@ -45,4 +45,4 @@
$(document).ready(function(){ $(document).ready(function(){
$('#table-search').DataTable(); $('#table-search').DataTable();
}); });
{% endblock %} {% endblock %}

View File

@ -96,7 +96,7 @@ def corpstats_view(request, corp_id=None):
character_ownership__user__profile__main_character__corporation_id=corpstats.corp.corporation_id) character_ownership__user__profile__main_character__corporation_id=corpstats.corp.corporation_id)
linked_chars = linked_chars.select_related('character_ownership', linked_chars = linked_chars.select_related('character_ownership',
'character_ownership__user__profile__main_character') \ 'character_ownership__user__profile__main_character') \
.prefetch_related('character_ownership__user__character_ownerships') \ .prefetch_related('character_ownership__user__character_ownerships') \
.prefetch_related('character_ownership__user__character_ownerships__character') .prefetch_related('character_ownership__user__character_ownerships__character')

View File

@ -97,7 +97,7 @@ class EveAllianceForm(EveEntityForm):
@admin.register(EveCorporationInfo) @admin.register(EveCorporationInfo)
class EveCorporationInfoAdmin(admin.ModelAdmin): class EveCorporationInfoAdmin(admin.ModelAdmin):
search_fields = ['corporation_name'] search_fields = ['corporation_name']
list_display = ('corporation_name', 'alliance') list_display = ('corporation_name', 'alliance')
list_select_related = ('alliance',) list_select_related = ('alliance',)
list_filter = (('alliance', admin.RelatedOnlyFieldListFilter),) list_filter = (('alliance', admin.RelatedOnlyFieldListFilter),)
ordering = ('corporation_name',) ordering = ('corporation_name',)
@ -114,9 +114,9 @@ class EveCorporationInfoAdmin(admin.ModelAdmin):
@admin.register(EveAllianceInfo) @admin.register(EveAllianceInfo)
class EveAllianceInfoAdmin(admin.ModelAdmin): class EveAllianceInfoAdmin(admin.ModelAdmin):
search_fields = ['alliance_name'] search_fields = ['alliance_name']
list_display = ('alliance_name',) list_display = ('alliance_name',)
ordering = ('alliance_name',) ordering = ('alliance_name',)
def has_change_permission(self, request, obj=None): def has_change_permission(self, request, obj=None):
return False return False
@ -129,9 +129,9 @@ class EveAllianceInfoAdmin(admin.ModelAdmin):
@admin.register(EveCharacter) @admin.register(EveCharacter)
class EveCharacterAdmin(admin.ModelAdmin): class EveCharacterAdmin(admin.ModelAdmin):
search_fields = [ search_fields = [
'character_name', 'character_name',
'corporation_name', 'corporation_name',
'alliance_name', 'alliance_name',
'character_ownership__user__username' 'character_ownership__user__username'
] ]
list_display = ( list_display = (
@ -141,10 +141,10 @@ class EveCharacterAdmin(admin.ModelAdmin):
'character_ownership', 'character_ownership__user__profile__main_character' 'character_ownership', 'character_ownership__user__profile__main_character'
) )
list_filter = ( list_filter = (
'corporation_name', 'corporation_name',
'alliance_name', 'alliance_name',
( (
'character_ownership__user__profile__main_character', 'character_ownership__user__profile__main_character',
admin.RelatedOnlyFieldListFilter admin.RelatedOnlyFieldListFilter
), ),
) )

View File

@ -31,12 +31,11 @@ class AutogroupsConfigAdmin(admin.ModelAdmin):
def get_actions(self, request): def get_actions(self, request):
actions = super(AutogroupsConfigAdmin, self).get_actions(request) actions = super(AutogroupsConfigAdmin, self).get_actions(request)
actions['sync_user_groups'] = (sync_user_groups, actions['sync_user_groups'] = (sync_user_groups,
'sync_user_groups', 'sync_user_groups',
'Sync all users groups for this Autogroup Config') 'Sync all users groups for this Autogroup Config')
return actions return actions
admin.site.register(AutogroupsConfig, AutogroupsConfigAdmin) admin.site.register(AutogroupsConfig, AutogroupsConfigAdmin)
admin.site.register(ManagedCorpGroup) admin.site.register(ManagedCorpGroup)
admin.site.register(ManagedAllianceGroup) admin.site.register(ManagedAllianceGroup)

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-12-23 04:30 # Generated by Django 1.11.6 on 2017-12-23 04:30
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -57,25 +57,21 @@ class AutogroupsConfig(models.Model):
states = models.ManyToManyField(State, related_name='autogroups') states = models.ManyToManyField(State, related_name='autogroups')
corp_groups = models.BooleanField(default=False, corp_groups = models.BooleanField(default=False, help_text="Setting this to false will delete all the created groups.")
help_text="Setting this to false will delete all the created groups.")
corp_group_prefix = models.CharField(max_length=50, default='Corp ', blank=True) corp_group_prefix = models.CharField(max_length=50, default='Corp ', blank=True)
corp_name_source = models.CharField(max_length=20, choices=NAME_OPTIONS, default=OPT_NAME) corp_name_source = models.CharField(max_length=20, choices=NAME_OPTIONS, default=OPT_NAME)
alliance_groups = models.BooleanField(default=False, alliance_groups = models.BooleanField(default=False, help_text="Setting this to false will delete all the created groups.")
help_text="Setting this to false will delete all the created groups.")
alliance_group_prefix = models.CharField(max_length=50, default='Alliance ', blank=True) alliance_group_prefix = models.CharField(max_length=50, default='Alliance ', blank=True)
alliance_name_source = models.CharField(max_length=20, choices=NAME_OPTIONS, default=OPT_NAME) alliance_name_source = models.CharField(max_length=20, choices=NAME_OPTIONS, default=OPT_NAME)
corp_managed_groups = models.ManyToManyField( corp_managed_groups = models.ManyToManyField(
Group, through='ManagedCorpGroup', related_name='corp_managed_config', Group, through='ManagedCorpGroup', related_name='corp_managed_config',
help_text='A list of corporation groups created and maintained by this AutogroupConfig. ' help_text='A list of corporation groups created and maintained by this AutogroupConfig. You should not edit this list unless you know what you\'re doing.')
'You should not edit this list unless you know what you\'re doing.')
alliance_managed_groups = models.ManyToManyField( alliance_managed_groups = models.ManyToManyField(
Group, through='ManagedAllianceGroup', related_name='alliance_managed_config', Group, through='ManagedAllianceGroup', related_name='alliance_managed_config',
help_text='A list of alliance groups created and maintained by this AutogroupConfig. ' help_text='A list of alliance groups created and maintained by this AutogroupConfig. You should not edit this list unless you know what you\'re doing.')
'You should not edit this list unless you know what you\'re doing.')
replace_spaces = models.BooleanField(default=False) replace_spaces = models.BooleanField(default=False)
replace_spaces_with = models.CharField( replace_spaces_with = models.CharField(

View File

@ -44,7 +44,7 @@ class AutogroupsConfigManagerTestCase(TestCase):
with patch('.models.AutogroupsConfig.update_group_membership_for_user') \ with patch('.models.AutogroupsConfig.update_group_membership_for_user') \
as update_group_membership_for_user: as update_group_membership_for_user:
AutogroupsConfig.objects.update_groups_for_user( AutogroupsConfig.objects.update_groups_for_user(
user=member, user=member,
state=member.profile.state state=member.profile.state
) )

View File

@ -52,8 +52,8 @@ class AutogroupsConfigTestCase(TestCase):
@patch('.models.AutogroupsConfig.update_alliance_group_membership') @patch('.models.AutogroupsConfig.update_alliance_group_membership')
@patch('.models.AutogroupsConfig.update_corp_group_membership') @patch('.models.AutogroupsConfig.update_corp_group_membership')
def test_update_group_membership_for_user( def test_update_group_membership_for_user(
self, self,
update_corp, update_corp,
update_alliance update_alliance
): ):
agc = AutogroupsConfig.objects.create() agc = AutogroupsConfig.objects.create()
@ -123,9 +123,9 @@ class AutogroupsConfigTestCase(TestCase):
alliance_ticker='alliance_ticker', alliance_ticker='alliance_ticker',
executor_corp_id='2345' executor_corp_id='2345'
) )
mock_create_alliance.side_effect = mock_create_alliance_side_effect mock_create_alliance.side_effect = mock_create_alliance_side_effect
obj = AutogroupsConfig.objects.create(alliance_groups=True) obj = AutogroupsConfig.objects.create(alliance_groups=True)
obj.states.add(AuthUtils.get_member_state()) obj.states.add(AuthUtils.get_member_state())
char = EveCharacter.objects.create( char = EveCharacter.objects.create(
@ -140,7 +140,7 @@ class AutogroupsConfigTestCase(TestCase):
self.member.profile.main_character = char self.member.profile.main_character = char
self.member.profile.save() self.member.profile.save()
# Act # Act
obj.update_alliance_group_membership(self.member) obj.update_alliance_group_membership(self.member)
group = obj.get_alliance_group(self.alliance) group = obj.get_alliance_group(self.alliance)

View File

@ -1,4 +1,4 @@
# this package generates profile URL for eve entities # this package generates profile URL for eve entities
# on 3rd party websites like evewho and zKillboard # on 3rd party websites like evewho and zKillboard
# #
# It contains of modules for views and templatetags for templates # It contains of modules for views and templatetags for templates

View File

@ -3,9 +3,9 @@
from urllib.parse import urljoin, quote from urllib.parse import urljoin, quote
from . import ( from . import (
_ESI_CATEGORY_ALLIANCE, _ESI_CATEGORY_ALLIANCE,
_ESI_CATEGORY_CORPORATION, _ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_REGION, _ESI_CATEGORY_REGION,
_ESI_CATEGORY_SOLARSYSTEM _ESI_CATEGORY_SOLARSYSTEM
) )
@ -15,28 +15,28 @@ _BASE_URL = 'http://evemaps.dotlan.net'
def _build_url(category: str, name: str) -> str: def _build_url(category: str, name: str) -> str:
"""return url to profile page for an eve entity""" """return url to profile page for an eve entity"""
if category == _ESI_CATEGORY_ALLIANCE: if category == _ESI_CATEGORY_ALLIANCE:
partial = 'alliance' partial = 'alliance'
elif category == _ESI_CATEGORY_CORPORATION: elif category == _ESI_CATEGORY_CORPORATION:
partial = 'corp' partial = 'corp'
elif category == _ESI_CATEGORY_REGION: elif category == _ESI_CATEGORY_REGION:
partial = 'map' partial = 'map'
elif category == _ESI_CATEGORY_SOLARSYSTEM: elif category == _ESI_CATEGORY_SOLARSYSTEM:
partial = 'system' partial = 'system'
else: else:
raise NotImplementedError( raise NotImplementedError(
"Not implemented yet for category:" + category "Not implemented yet for category:" + category
) )
url = urljoin( url = urljoin(
_BASE_URL, _BASE_URL,
'{}/{}'.format(partial, quote(str(name).replace(" ", "_"))) '{}/{}'.format(partial, quote(str(name).replace(" ", "_")))
) )
return url return url

View File

@ -1,7 +1,7 @@
from . import ( from . import (
_ESI_CATEGORY_ALLIANCE, _ESI_CATEGORY_ALLIANCE,
_ESI_CATEGORY_CHARACTER, _ESI_CATEGORY_CHARACTER,
_ESI_CATEGORY_CORPORATION, _ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_INVENTORYTYPE _ESI_CATEGORY_INVENTORYTYPE
) )
@ -10,7 +10,7 @@ _EVE_IMAGE_SERVER_URL = 'https://images.evetech.net'
_DEFAULT_IMAGE_SIZE = 32 _DEFAULT_IMAGE_SIZE = 32
def _eve_entity_image_url( def _eve_entity_image_url(
category: str, category: str,
entity_id: int, entity_id: int,
size: int = 32, size: int = 32,
@ -19,7 +19,7 @@ def _eve_entity_image_url(
) -> str: ) -> str:
"""returns image URL for an Eve Online ID. """returns image URL for an Eve Online ID.
Supported categories: alliance, corporation, character, inventory_type Supported categories: alliance, corporation, character, inventory_type
Arguments: Arguments:
- category: category of the ID, see ESI category constants - category: category of the ID, see ESI category constants
- entity_id: Eve ID of the entity - entity_id: Eve ID of the entity
@ -33,7 +33,7 @@ def _eve_entity_image_url(
Exceptions: Exceptions:
- Throws ValueError on invalid input - Throws ValueError on invalid input
""" """
# input validations # input validations
categories = { categories = {
_ESI_CATEGORY_ALLIANCE: { _ESI_CATEGORY_ALLIANCE: {
@ -54,15 +54,15 @@ def _eve_entity_image_url(
} }
} }
tenants = ['tranquility', 'singularity'] tenants = ['tranquility', 'singularity']
if not entity_id: if not entity_id:
raise ValueError('Invalid entity_id: {}'.format(entity_id)) raise ValueError('Invalid entity_id: {}'.format(entity_id))
else: else:
entity_id = int(entity_id) entity_id = int(entity_id)
if not size or size < 32 or size > 1024 or (size & (size - 1) != 0): if not size or size < 32 or size > 1024 or (size & (size - 1) != 0):
raise ValueError('Invalid size: {}'.format(size)) raise ValueError('Invalid size: {}'.format(size))
if category not in categories: if category not in categories:
raise ValueError('Invalid category {}'.format(category)) raise ValueError('Invalid category {}'.format(category))
else: else:
@ -79,7 +79,7 @@ def _eve_entity_image_url(
if tenant and tenant not in tenants: if tenant and tenant not in tenants:
raise ValueError('Invalid tenant {}'.format(tenant)) raise ValueError('Invalid tenant {}'.format(tenant))
# compose result URL # compose result URL
result = '{}/{}/{}/{}?size={}'.format( result = '{}/{}/{}/{}?size={}'.format(
_EVE_IMAGE_SERVER_URL, _EVE_IMAGE_SERVER_URL,
@ -90,7 +90,7 @@ def _eve_entity_image_url(
) )
if tenant: if tenant:
result += '&tenant={}'.format(tenant) result += '&tenant={}'.format(tenant)
return result return result

View File

@ -3,9 +3,9 @@
from urllib.parse import urljoin from urllib.parse import urljoin
from . import ( from . import (
_ESI_CATEGORY_ALLIANCE, _ESI_CATEGORY_ALLIANCE,
_ESI_CATEGORY_CORPORATION, _ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_CHARACTER, _ESI_CATEGORY_CHARACTER,
) )
@ -14,21 +14,21 @@ _BASE_URL = 'https://evewho.com'
def _build_url(category: str, eve_id: int) -> str: def _build_url(category: str, eve_id: int) -> str:
"""return url to profile page for an eve entity""" """return url to profile page for an eve entity"""
if category == _ESI_CATEGORY_ALLIANCE: if category == _ESI_CATEGORY_ALLIANCE:
partial = 'alliance' partial = 'alliance'
elif category == _ESI_CATEGORY_CORPORATION: elif category == _ESI_CATEGORY_CORPORATION:
partial = 'corporation' partial = 'corporation'
elif category == _ESI_CATEGORY_CHARACTER: elif category == _ESI_CATEGORY_CHARACTER:
partial = 'character' partial = 'character'
else: else:
raise NotImplementedError( raise NotImplementedError(
"Not implemented yet for category:" + category "Not implemented yet for category:" + category
) )
url = urljoin( url = urljoin(
_BASE_URL, _BASE_URL,
'{}/{}'.format(partial, int(eve_id)) '{}/{}'.format(partial, int(eve_id))

View File

@ -12,12 +12,12 @@ class TestEveWho(TestCase):
evewho.alliance_url(12345678), evewho.alliance_url(12345678),
'https://evewho.com/alliance/12345678' 'https://evewho.com/alliance/12345678'
) )
def test_corporation_url(self): def test_corporation_url(self):
self.assertEqual( self.assertEqual(
evewho.corporation_url(12345678), evewho.corporation_url(12345678),
'https://evewho.com/corporation/12345678' 'https://evewho.com/corporation/12345678'
) )
def test_character_url(self): def test_character_url(self):
self.assertEqual( self.assertEqual(
@ -49,7 +49,7 @@ class TestDotlan(TestCase):
dotlan.region_url('Black Rise'), dotlan.region_url('Black Rise'),
'http://evemaps.dotlan.net/map/Black_Rise' 'http://evemaps.dotlan.net/map/Black_Rise'
) )
def test_solar_system_url(self): def test_solar_system_url(self):
self.assertEqual( self.assertEqual(
dotlan.solar_system_url('Jita'), dotlan.solar_system_url('Jita'),
@ -69,14 +69,14 @@ class TestZkillboard(TestCase):
self.assertEqual( self.assertEqual(
zkillboard.corporation_url(12345678), zkillboard.corporation_url(12345678),
'https://zkillboard.com/corporation/12345678/' 'https://zkillboard.com/corporation/12345678/'
) )
def test_character_url(self): def test_character_url(self):
self.assertEqual( self.assertEqual(
zkillboard.character_url(12345678), zkillboard.character_url(12345678),
'https://zkillboard.com/character/12345678/' 'https://zkillboard.com/character/12345678/'
) )
def test_region_url(self): def test_region_url(self):
self.assertEqual( self.assertEqual(
@ -93,34 +93,34 @@ class TestZkillboard(TestCase):
class TestEveImageServer(TestCase): class TestEveImageServer(TestCase):
"""unit test for eveimageserver""" """unit test for eveimageserver"""
def test_sizes(self): def test_sizes(self):
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42), eveimageserver._eve_entity_image_url('character', 42),
'https://images.evetech.net/characters/42/portrait?size=32' 'https://images.evetech.net/characters/42/portrait?size=32'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, size=32), eveimageserver._eve_entity_image_url('character', 42, size=32),
'https://images.evetech.net/characters/42/portrait?size=32' 'https://images.evetech.net/characters/42/portrait?size=32'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, size=64), eveimageserver._eve_entity_image_url('character', 42, size=64),
'https://images.evetech.net/characters/42/portrait?size=64' 'https://images.evetech.net/characters/42/portrait?size=64'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, size=128), eveimageserver._eve_entity_image_url('character', 42, size=128),
'https://images.evetech.net/characters/42/portrait?size=128' 'https://images.evetech.net/characters/42/portrait?size=128'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, size=256), eveimageserver._eve_entity_image_url('character', 42, size=256),
'https://images.evetech.net/characters/42/portrait?size=256' 'https://images.evetech.net/characters/42/portrait?size=256'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, size=512), eveimageserver._eve_entity_image_url('character', 42, size=512),
'https://images.evetech.net/characters/42/portrait?size=512' 'https://images.evetech.net/characters/42/portrait?size=512'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, size=1024), eveimageserver._eve_entity_image_url('character', 42, size=1024),
'https://images.evetech.net/characters/42/portrait?size=1024' 'https://images.evetech.net/characters/42/portrait?size=1024'
) )
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
@ -128,10 +128,10 @@ class TestEveImageServer(TestCase):
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
eveimageserver._eve_entity_image_url('corporation', 42, size=0) eveimageserver._eve_entity_image_url('corporation', 42, size=0)
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
eveimageserver._eve_entity_image_url('corporation', 42, size=31) eveimageserver._eve_entity_image_url('corporation', 42, size=31)
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
eveimageserver._eve_entity_image_url('corporation', 42, size=1025) eveimageserver._eve_entity_image_url('corporation', 42, size=1025)
@ -141,28 +141,28 @@ class TestEveImageServer(TestCase):
def test_variant(self): def test_variant(self):
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, variant='portrait'), eveimageserver._eve_entity_image_url('character', 42, variant='portrait'),
'https://images.evetech.net/characters/42/portrait?size=32' 'https://images.evetech.net/characters/42/portrait?size=32'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('alliance', 42, variant='logo'), eveimageserver._eve_entity_image_url('alliance', 42, variant='logo'),
'https://images.evetech.net/alliances/42/logo?size=32' 'https://images.evetech.net/alliances/42/logo?size=32'
) )
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
eveimageserver._eve_entity_image_url('character', 42, variant='logo') eveimageserver._eve_entity_image_url('character', 42, variant='logo')
def test_alliance(self): def test_alliance(self):
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('alliance', 42), eveimageserver._eve_entity_image_url('alliance', 42),
'https://images.evetech.net/alliances/42/logo?size=32' 'https://images.evetech.net/alliances/42/logo?size=32'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('corporation', 42), eveimageserver._eve_entity_image_url('corporation', 42),
'https://images.evetech.net/corporations/42/logo?size=32' 'https://images.evetech.net/corporations/42/logo?size=32'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42), eveimageserver._eve_entity_image_url('character', 42),
'https://images.evetech.net/characters/42/portrait?size=32' 'https://images.evetech.net/characters/42/portrait?size=32'
) )
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
@ -171,16 +171,16 @@ class TestEveImageServer(TestCase):
def test_tenants(self): def test_tenants(self):
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, tenant='tranquility'), eveimageserver._eve_entity_image_url('character', 42, tenant='tranquility'),
'https://images.evetech.net/characters/42/portrait?size=32&tenant=tranquility' 'https://images.evetech.net/characters/42/portrait?size=32&tenant=tranquility'
) )
self.assertEqual( self.assertEqual(
eveimageserver._eve_entity_image_url('character', 42, tenant='singularity'), eveimageserver._eve_entity_image_url('character', 42, tenant='singularity'),
'https://images.evetech.net/characters/42/portrait?size=32&tenant=singularity' 'https://images.evetech.net/characters/42/portrait?size=32&tenant=singularity'
) )
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
eveimageserver._eve_entity_image_url('character', 42, tenant='xxx') eveimageserver._eve_entity_image_url('character', 42, tenant='xxx')
def test_alliance_logo_url(self): def test_alliance_logo_url(self):
expected = 'https://images.evetech.net/alliances/42/logo?size=128' expected = 'https://images.evetech.net/alliances/42/logo?size=128'
self.assertEqual(eveimageserver.alliance_logo_url(42, 128), expected) self.assertEqual(eveimageserver.alliance_logo_url(42, 128), expected)
@ -201,4 +201,4 @@ class TestEveImageServer(TestCase):
def test_type_render_url(self): def test_type_render_url(self):
expected = 'https://images.evetech.net/types/42/render?size=128' expected = 'https://images.evetech.net/types/42/render?size=128'
self.assertEqual(eveimageserver.type_render_url(42, 128), expected) self.assertEqual(eveimageserver.type_render_url(42, 128), expected)

View File

@ -38,15 +38,15 @@ class TestTemplateTags(TestCase):
member_count=42, member_count=42,
alliance=self.my_alliance alliance=self.my_alliance
) )
self.my_region_id = 8001 self.my_region_id = 8001
self.my_region_name = 'Southpark' self.my_region_name = 'Southpark'
self.my_solar_system_id = 9001 self.my_solar_system_id = 9001
self.my_solar_system_name = 'Gotham' self.my_solar_system_name = 'Gotham'
def test_evewho_character_url(self):
def test_evewho_character_url(self):
self.assertEqual( self.assertEqual(
evelinks.evewho_character_url(self.my_character), evelinks.evewho_character_url(self.my_character),
evewho.character_url(self.my_character.character_id), evewho.character_url(self.my_character.character_id),
@ -59,9 +59,9 @@ class TestTemplateTags(TestCase):
evelinks.evewho_character_url(self.my_character.character_id), evelinks.evewho_character_url(self.my_character.character_id),
evewho.character_url(self.my_character.character_id), evewho.character_url(self.my_character.character_id),
) )
def test_evewho_corporation_url(self): def test_evewho_corporation_url(self):
self.assertEqual( self.assertEqual(
evelinks.evewho_corporation_url(self.my_character), evelinks.evewho_corporation_url(self.my_character),
evewho.corporation_url(self.my_character.corporation_id), evewho.corporation_url(self.my_character.corporation_id),
@ -80,7 +80,7 @@ class TestTemplateTags(TestCase):
) )
def test_evewho_alliance_url(self): def test_evewho_alliance_url(self):
self.assertEqual( self.assertEqual(
evelinks.evewho_alliance_url(self.my_character), evelinks.evewho_alliance_url(self.my_character),
evewho.alliance_url(self.my_character.alliance_id), evewho.alliance_url(self.my_character.alliance_id),
@ -100,12 +100,12 @@ class TestTemplateTags(TestCase):
self.assertEqual( self.assertEqual(
evelinks.evewho_alliance_url(self.my_character.alliance_id), evelinks.evewho_alliance_url(self.my_character.alliance_id),
evewho.alliance_url(self.my_character.alliance_id), evewho.alliance_url(self.my_character.alliance_id),
) )
# dotlan # dotlan
def test_dotlan_corporation_url(self): def test_dotlan_corporation_url(self):
self.assertEqual( self.assertEqual(
evelinks.dotlan_corporation_url(self.my_character), evelinks.dotlan_corporation_url(self.my_character),
dotlan.corporation_url(self.my_character.corporation_name), dotlan.corporation_url(self.my_character.corporation_name),
@ -121,10 +121,10 @@ class TestTemplateTags(TestCase):
self.assertEqual( self.assertEqual(
evelinks.dotlan_corporation_url(self.my_character.corporation_name), evelinks.dotlan_corporation_url(self.my_character.corporation_name),
dotlan.corporation_url(self.my_character.corporation_name), dotlan.corporation_url(self.my_character.corporation_name),
) )
def test_dotlan_alliance_url(self): def test_dotlan_alliance_url(self):
self.assertEqual( self.assertEqual(
evelinks.dotlan_alliance_url(self.my_character), evelinks.dotlan_alliance_url(self.my_character),
dotlan.alliance_url(self.my_character.alliance_name), dotlan.alliance_url(self.my_character.alliance_name),
@ -144,32 +144,32 @@ class TestTemplateTags(TestCase):
self.assertEqual( self.assertEqual(
evelinks.dotlan_alliance_url(self.my_character.alliance_name), evelinks.dotlan_alliance_url(self.my_character.alliance_name),
dotlan.alliance_url(self.my_character.alliance_name), dotlan.alliance_url(self.my_character.alliance_name),
) )
def test_dotlan_region_url(self): def test_dotlan_region_url(self):
self.assertEqual( self.assertEqual(
evelinks.dotlan_region_url(self.my_region_name), evelinks.dotlan_region_url(self.my_region_name),
dotlan.region_url(self.my_region_name), dotlan.region_url(self.my_region_name),
) )
self.assertEqual( self.assertEqual(
evelinks.dotlan_region_url(None), evelinks.dotlan_region_url(None),
'' ''
) )
def test_dotlan_solar_system_url(self): def test_dotlan_solar_system_url(self):
self.assertEqual( self.assertEqual(
evelinks.dotlan_solar_system_url(self.my_solar_system_name), evelinks.dotlan_solar_system_url(self.my_solar_system_name),
dotlan.solar_system_url(self.my_solar_system_name), dotlan.solar_system_url(self.my_solar_system_name),
) )
self.assertEqual( self.assertEqual(
evelinks.dotlan_solar_system_url(None), evelinks.dotlan_solar_system_url(None),
'' ''
) )
# zkillboard # zkillboard
def test_zkillboard_character_url(self): def test_zkillboard_character_url(self):
self.assertEqual( self.assertEqual(
evelinks.zkillboard_character_url(self.my_character), evelinks.zkillboard_character_url(self.my_character),
zkillboard.character_url(self.my_character.character_id), zkillboard.character_url(self.my_character.character_id),
@ -182,9 +182,9 @@ class TestTemplateTags(TestCase):
evelinks.zkillboard_character_url(self.my_character.character_id), evelinks.zkillboard_character_url(self.my_character.character_id),
zkillboard.character_url(self.my_character.character_id), zkillboard.character_url(self.my_character.character_id),
) )
def test_zkillboard_corporation_url(self): def test_zkillboard_corporation_url(self):
self.assertEqual( self.assertEqual(
evelinks.zkillboard_corporation_url(self.my_character), evelinks.zkillboard_corporation_url(self.my_character),
zkillboard.corporation_url(self.my_character.corporation_id), zkillboard.corporation_url(self.my_character.corporation_id),
@ -200,10 +200,10 @@ class TestTemplateTags(TestCase):
self.assertEqual( self.assertEqual(
evelinks.zkillboard_corporation_url(self.my_character.corporation_id), evelinks.zkillboard_corporation_url(self.my_character.corporation_id),
zkillboard.corporation_url(self.my_character.corporation_id), zkillboard.corporation_url(self.my_character.corporation_id),
) )
def test_zkillboard_alliance_url(self): def test_zkillboard_alliance_url(self):
self.assertEqual( self.assertEqual(
evelinks.zkillboard_alliance_url(self.my_character), evelinks.zkillboard_alliance_url(self.my_character),
zkillboard.alliance_url(self.my_character.alliance_id), zkillboard.alliance_url(self.my_character.alliance_id),
@ -223,29 +223,29 @@ class TestTemplateTags(TestCase):
self.assertEqual( self.assertEqual(
evelinks.zkillboard_alliance_url(self.my_character.alliance_id), evelinks.zkillboard_alliance_url(self.my_character.alliance_id),
zkillboard.alliance_url(self.my_character.alliance_id), zkillboard.alliance_url(self.my_character.alliance_id),
) )
def test_zkillboard_region_url(self): def test_zkillboard_region_url(self):
self.assertEqual( self.assertEqual(
evelinks.zkillboard_region_url(self.my_region_id), evelinks.zkillboard_region_url(self.my_region_id),
zkillboard.region_url(self.my_region_id), zkillboard.region_url(self.my_region_id),
) )
self.assertEqual( self.assertEqual(
evelinks.zkillboard_region_url(None), evelinks.zkillboard_region_url(None),
'' ''
) )
def test_zkillboard_solar_system_url(self): def test_zkillboard_solar_system_url(self):
self.assertEqual( self.assertEqual(
evelinks.zkillboard_solar_system_url(self.my_solar_system_id), evelinks.zkillboard_solar_system_url(self.my_solar_system_id),
zkillboard.solar_system_url(self.my_solar_system_id), zkillboard.solar_system_url(self.my_solar_system_id),
) )
self.assertEqual( self.assertEqual(
evelinks.zkillboard_solar_system_url(None), evelinks.zkillboard_solar_system_url(None),
'' ''
) )
# image URLs # image URLs
@ -254,12 +254,12 @@ class TestTemplateTags(TestCase):
self.assertEqual( self.assertEqual(
evelinks.character_portrait_url(123), evelinks.character_portrait_url(123),
EveCharacter.generic_portrait_url(123) EveCharacter.generic_portrait_url(123)
), ),
self.assertEqual( self.assertEqual(
evelinks.character_portrait_url(123, 128), evelinks.character_portrait_url(123, 128),
EveCharacter.generic_portrait_url(123, 128) EveCharacter.generic_portrait_url(123, 128)
) )
self.assertEqual( self.assertEqual(
evelinks.character_portrait_url(123, 99), evelinks.character_portrait_url(123, 99),
@ -267,7 +267,7 @@ class TestTemplateTags(TestCase):
) )
self.assertEqual( self.assertEqual(
evelinks.character_portrait_url(self.my_character), evelinks.character_portrait_url(self.my_character),
self.my_character.portrait_url() self.my_character.portrait_url()
) )
self.assertEqual( self.assertEqual(
evelinks.character_portrait_url(None), evelinks.character_portrait_url(None),
@ -286,7 +286,7 @@ class TestTemplateTags(TestCase):
) )
self.assertEqual( self.assertEqual(
evelinks.corporation_logo_url(123, 99), evelinks.corporation_logo_url(123, 99),
'' ''
) )
self.assertEqual( self.assertEqual(
evelinks.corporation_logo_url(self.my_corporation), evelinks.corporation_logo_url(self.my_corporation),
@ -303,7 +303,7 @@ class TestTemplateTags(TestCase):
def test_alliance_logo_url(self): def test_alliance_logo_url(self):
self.assertEqual( self.assertEqual(
evelinks.alliance_logo_url(123), evelinks.alliance_logo_url(123),
EveAllianceInfo.generic_logo_url(123) EveAllianceInfo.generic_logo_url(123)
), ),
@ -314,7 +314,7 @@ class TestTemplateTags(TestCase):
self.assertEqual( self.assertEqual(
evelinks.alliance_logo_url(123, 99), evelinks.alliance_logo_url(123, 99),
'' ''
) )
self.assertEqual( self.assertEqual(
evelinks.alliance_logo_url(self.my_alliance), evelinks.alliance_logo_url(self.my_alliance),
self.my_alliance.logo_url() self.my_alliance.logo_url()
@ -338,10 +338,10 @@ class TestTemplateTags(TestCase):
expected = eveimageserver.type_icon_url(123, 128) expected = eveimageserver.type_icon_url(123, 128)
self.assertEqual(evelinks.type_icon_url(123, 128), expected) self.assertEqual(evelinks.type_icon_url(123, 128), expected)
expected = '' expected = ''
self.assertEqual(evelinks.type_icon_url(123, 99), expected) self.assertEqual(evelinks.type_icon_url(123, 99), expected)
expected = '' expected = ''
self.assertEqual(evelinks.type_icon_url(None), expected) self.assertEqual(evelinks.type_icon_url(None), expected)
@ -351,9 +351,9 @@ class TestTemplateTags(TestCase):
expected = eveimageserver.type_render_url(123, 128) expected = eveimageserver.type_render_url(123, 128)
self.assertEqual(evelinks.type_render_url(123, 128), expected) self.assertEqual(evelinks.type_render_url(123, 128), expected)
expected = '' expected = ''
self.assertEqual(evelinks.type_render_url(123, 99), expected) self.assertEqual(evelinks.type_render_url(123, 99), expected)
expected = '' expected = ''
self.assertEqual(evelinks.type_render_url(None), expected) self.assertEqual(evelinks.type_render_url(None), expected)

View File

@ -3,10 +3,10 @@
from urllib.parse import urljoin from urllib.parse import urljoin
from . import ( from . import (
_ESI_CATEGORY_ALLIANCE, _ESI_CATEGORY_ALLIANCE,
_ESI_CATEGORY_CORPORATION, _ESI_CATEGORY_CORPORATION,
_ESI_CATEGORY_CHARACTER, _ESI_CATEGORY_CHARACTER,
_ESI_CATEGORY_REGION, _ESI_CATEGORY_REGION,
_ESI_CATEGORY_SOLARSYSTEM _ESI_CATEGORY_SOLARSYSTEM
) )
@ -16,11 +16,11 @@ _BASE_URL = 'https://zkillboard.com'
def _build_url(category: str, eve_id: int) -> str: def _build_url(category: str, eve_id: int) -> str:
"""return url to profile page for an eve entity""" """return url to profile page for an eve entity"""
if category == _ESI_CATEGORY_ALLIANCE: if category == _ESI_CATEGORY_ALLIANCE:
partial = 'alliance' partial = 'alliance'
elif category == _ESI_CATEGORY_CORPORATION: elif category == _ESI_CATEGORY_CORPORATION:
partial = 'corporation' partial = 'corporation'
elif category == _ESI_CATEGORY_CHARACTER: elif category == _ESI_CATEGORY_CHARACTER:
@ -31,12 +31,12 @@ def _build_url(category: str, eve_id: int) -> str:
elif category == _ESI_CATEGORY_SOLARSYSTEM: elif category == _ESI_CATEGORY_SOLARSYSTEM:
partial = 'system' partial = 'system'
else: else:
raise NotImplementedError( raise NotImplementedError(
"Not implemented yet for category:" + category "Not implemented yet for category:" + category
) )
url = urljoin( url = urljoin(
_BASE_URL, _BASE_URL,
'{}/{}/'.format(partial, int(eve_id)) '{}/{}/'.format(partial, int(eve_id))

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-05 21:39 # Generated by Django 1.10.1 on 2016-09-05 21:39
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-10 20:20 # Generated by Django 1.10.1 on 2016-09-10 20:20
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-10-26 01:49 # Generated by Django 1.10.2 on 2016-10-26 01:49
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.2 on 2016-11-01 04:20 # Generated by Django 1.10.2 on 2016-11-01 04:20
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-12-16 23:22 # Generated by Django 1.10.1 on 2016-12-16 23:22
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2017-01-02 19:23 # Generated by Django 1.10.1 on 2017-01-02 19:23
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-01-18 13:20 # Generated by Django 1.10.5 on 2017-01-18 13:20
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-03-22 23:09 # Generated by Django 1.10.5 on 2017-03-22 23:09
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.11.5 on 2017-09-28 02:16 # Generated by Django 1.11.5 on 2017-09-28 02:16
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -51,7 +51,7 @@ class EveAllianceInfo(models.Model):
) -> str: ) -> str:
"""image URL for the given alliance ID""" """image URL for the given alliance ID"""
return eveimageserver.alliance_logo_url(alliance_id, size) return eveimageserver.alliance_logo_url(alliance_id, size)
def logo_url(self, size: int = _DEFAULT_IMAGE_SIZE) -> str: def logo_url(self, size: int = _DEFAULT_IMAGE_SIZE) -> str:
"""image URL of this alliance""" """image URL of this alliance"""
return self.generic_logo_url(self.alliance_id, size) return self.generic_logo_url(self.alliance_id, size)
@ -91,9 +91,7 @@ class EveCorporationInfo(models.Model):
provider = EveCorporationProviderManager() provider = EveCorporationProviderManager()
class Meta: class Meta:
indexes = [ indexes = [models.Index(fields=['ceo_id',]),]
models.Index(fields=['ceo_id',]),
]
def update_corporation(self, corp: providers.Corporation = None): def update_corporation(self, corp: providers.Corporation = None):
if corp is None: if corp is None:
@ -157,11 +155,11 @@ class EveCharacter(models.Model):
class Meta: class Meta:
indexes = [ indexes = [
models.Index(fields=['corporation_id',]), models.Index(fields=['corporation_id',]),
models.Index(fields=['alliance_id',]), models.Index(fields=['alliance_id',]),
models.Index(fields=['corporation_name',]), models.Index(fields=['corporation_name',]),
models.Index(fields=['alliance_name',]), models.Index(fields=['alliance_name',]),
] ]
@property @property
def alliance(self) -> Union[EveAllianceInfo, None]: def alliance(self) -> Union[EveAllianceInfo, None]:
@ -224,7 +222,7 @@ class EveCharacter(models.Model):
def portrait_url_128(self) -> str: def portrait_url_128(self) -> str:
"""image URL for this character""" """image URL for this character"""
return self.portrait_url(128) return self.portrait_url(128)
@property @property
def portrait_url_256(self) -> str: def portrait_url_256(self) -> str:
"""image URL for this character""" """image URL for this character"""
@ -275,7 +273,7 @@ class EveCharacter(models.Model):
def alliance_logo_url_128(self) -> str: def alliance_logo_url_128(self) -> str:
"""image URL for alliance of this character or empty string""" """image URL for alliance of this character or empty string"""
return self.alliance_logo_url(128) return self.alliance_logo_url(128)
@property @property
def alliance_logo_url_256(self) -> str: def alliance_logo_url_256(self) -> str:
"""image URL for alliance of this character or empty string""" """image URL for alliance of this character or empty string"""

View File

@ -159,7 +159,7 @@ class EveProvider(object):
class EveSwaggerProvider(EveProvider): class EveSwaggerProvider(EveProvider):
def __init__(self, token=None, adapter=None): def __init__(self, token=None, adapter=None):
if settings.DEBUG: if settings.DEBUG:
self._client = None self._client = None
logger.info( logger.info(

View File

@ -40,7 +40,7 @@ def update_character(character_id):
@shared_task @shared_task
def run_model_update(): def run_model_update():
"""Update all alliances, corporations and characters from ESI""" """Update all alliances, corporations and characters from ESI"""
# update existing corp models # update existing corp models
for corp in EveCorporationInfo.objects.all().values('corporation_id'): for corp in EveCorporationInfo.objects.all().values('corporation_id'):
update_corp.apply_async( update_corp.apply_async(
@ -54,7 +54,7 @@ def run_model_update():
) )
# update existing character models # update existing character models
character_ids = EveCharacter.objects.all().values_list('character_id', flat=True) character_ids = EveCharacter.objects.all().values_list('character_id', flat=True)
for character_ids_chunk in chunks(character_ids, CHUNK_SIZE): for character_ids_chunk in chunks(character_ids, CHUNK_SIZE):
affiliations_raw = providers.provider.client.Character\ affiliations_raw = providers.provider.client.Character\
.post_characters_affiliation(characters=character_ids_chunk).result() .post_characters_affiliation(characters=character_ids_chunk).result()
@ -62,39 +62,39 @@ def run_model_update():
.post_universe_names(ids=character_ids_chunk).result() .post_universe_names(ids=character_ids_chunk).result()
affiliations = { affiliations = {
affiliation.get('character_id'): affiliation affiliation.get('character_id'): affiliation
for affiliation in affiliations_raw for affiliation in affiliations_raw
} }
# add character names to affiliations # add character names to affiliations
for character in character_names: for character in character_names:
character_id = character.get('id') character_id = character.get('id')
if character_id in affiliations: if character_id in affiliations:
affiliations[character_id]['name'] = character.get('name') affiliations[character_id]['name'] = character.get('name')
# fetch current characters # fetch current characters
characters = EveCharacter.objects.filter(character_id__in=character_ids_chunk)\ characters = EveCharacter.objects.filter(character_id__in=character_ids_chunk)\
.values('character_id', 'corporation_id', 'alliance_id', 'character_name') .values('character_id', 'corporation_id', 'alliance_id', 'character_name')
for character in characters: for character in characters:
character_id = character.get('character_id') character_id = character.get('character_id')
if character_id in affiliations: if character_id in affiliations:
affiliation = affiliations[character_id] affiliation = affiliations[character_id]
corp_changed = ( corp_changed = (
character.get('corporation_id') != affiliation.get('corporation_id') character.get('corporation_id') != affiliation.get('corporation_id')
) )
alliance_id = character.get('alliance_id') alliance_id = character.get('alliance_id')
if not alliance_id: if not alliance_id:
alliance_id = None alliance_id = None
alliance_changed = alliance_id != affiliation.get('alliance_id') alliance_changed = alliance_id != affiliation.get('alliance_id')
name_changed = False name_changed = False
fetched_name = affiliation.get('name', False) fetched_name = affiliation.get('name', False)
if fetched_name: if fetched_name:
name_changed = character.get('character_name') != fetched_name name_changed = character.get('character_name') != fetched_name
if corp_changed or alliance_changed or name_changed: if corp_changed or alliance_changed or name_changed:
update_character.apply_async( update_character.apply_async(
args=[character.get('character_id')], priority=TASK_PRIORITY args=[character.get('character_id')], priority=TASK_PRIORITY
) )

View File

@ -1,14 +1,14 @@
# This module defines template tags for evelinks URLs and eve image URLs # This module defines template tags for evelinks URLs and eve image URLs
# #
# Many tags will work both with their respective eveonline object # Many tags will work both with their respective eveonline object
# and their respective eve entity ID # and their respective eve entity ID
# #
# Example: # Example:
# character URL on evewho: {{ my_character|evewho_character_url}} # character URL on evewho: {{ my_character|evewho_character_url}}
# character URL on evewho: {{ 1456384556|evewho_character_url}} # character URL on evewho: {{ 1456384556|evewho_character_url}}
# #
# For more examples see examples.html # For more examples see examples.html
# #
# To add templatetags for additional providers just add the respective # To add templatetags for additional providers just add the respective
# template functions and let them call the generic functions # template functions and let them call the generic functions
@ -25,59 +25,59 @@ _DEFAULT_IMAGE_SIZE = 32
# generic functions # generic functions
def _generic_character_url( def _generic_character_url(
provider: object, provider: object,
obj_prop: str, obj_prop: str,
eve_obj: EveCharacter eve_obj: EveCharacter
) -> str: ) -> str:
"""returns character URL for given provider and object""" """returns character URL for given provider and object"""
my_func = getattr(provider, 'character_url') my_func = getattr(provider, 'character_url')
if isinstance(eve_obj, EveCharacter): if isinstance(eve_obj, EveCharacter):
return my_func(getattr(eve_obj, obj_prop)) return my_func(getattr(eve_obj, obj_prop))
elif eve_obj is None: elif eve_obj is None:
return '' return ''
else: else:
return my_func(eve_obj) return my_func(eve_obj)
def _generic_corporation_url( def _generic_corporation_url(
provider: object, provider: object,
obj_prop: str, obj_prop: str,
eve_obj: object eve_obj: object
) -> str: ) -> str:
"""returns corporation URL for given provider and object""" """returns corporation URL for given provider and object"""
my_func = getattr(provider, 'corporation_url') my_func = getattr(provider, 'corporation_url')
if isinstance(eve_obj, (EveCharacter, EveCorporationInfo)): if isinstance(eve_obj, (EveCharacter, EveCorporationInfo)):
return my_func(getattr(eve_obj, obj_prop)) return my_func(getattr(eve_obj, obj_prop))
elif eve_obj is None: elif eve_obj is None:
return '' return ''
else: else:
return my_func(eve_obj) return my_func(eve_obj)
def _generic_alliance_url( def _generic_alliance_url(
provider: object, provider: object,
obj_prop: str, obj_prop: str,
eve_obj: object eve_obj: object
) -> str: ) -> str:
"""returns alliance URL for given provider and object""" """returns alliance URL for given provider and object"""
my_func = getattr(provider, 'alliance_url') my_func = getattr(provider, 'alliance_url')
if isinstance(eve_obj, EveCharacter): if isinstance(eve_obj, EveCharacter):
if eve_obj.alliance_id: if eve_obj.alliance_id:
return my_func(getattr(eve_obj, obj_prop)) return my_func(getattr(eve_obj, obj_prop))
else: else:
return '' return ''
elif isinstance(eve_obj, EveAllianceInfo): elif isinstance(eve_obj, EveAllianceInfo):
return my_func(getattr(eve_obj, obj_prop)) return my_func(getattr(eve_obj, obj_prop))
elif eve_obj is None: elif eve_obj is None:
return '' return ''
else: else:
return my_func(eve_obj) return my_func(eve_obj)
@ -91,7 +91,7 @@ def _generic_evelinks_url(
my_func = getattr(provider, provider_func) my_func = getattr(provider, provider_func)
if eve_obj is None: if eve_obj is None:
return '' return ''
else: else:
return my_func(eve_obj) return my_func(eve_obj)
@ -99,29 +99,29 @@ def _generic_evelinks_url(
# evewho # evewho
@register.filter @register.filter
def evewho_character_url(eve_obj: EveCharacter) -> str: def evewho_character_url(eve_obj: EveCharacter) -> str:
"""generates an evewho URL for the given object """generates an evewho URL for the given object
Works with allianceauth.eveonline objects and eve entity IDs Works with allianceauth.eveonline objects and eve entity IDs
Returns URL or empty string Returns URL or empty string
""" """
return _generic_character_url(evewho, 'character_id', eve_obj) return _generic_character_url(evewho, 'character_id', eve_obj)
@register.filter @register.filter
def evewho_corporation_url(eve_obj: object) -> str: def evewho_corporation_url(eve_obj: object) -> str:
"""generates an evewho URL for the given object """generates an evewho URL for the given object
Works with allianceauth.eveonline objects and eve entity IDs Works with allianceauth.eveonline objects and eve entity IDs
Returns URL or empty string Returns URL or empty string
""" """
return _generic_corporation_url(evewho, 'corporation_id', eve_obj) return _generic_corporation_url(evewho, 'corporation_id', eve_obj)
@register.filter @register.filter
def evewho_alliance_url(eve_obj: object) -> str: def evewho_alliance_url(eve_obj: object) -> str:
"""generates an evewho URL for the given object """generates an evewho URL for the given object
Works with allianceauth.eveonline objects and eve entity IDs Works with allianceauth.eveonline objects and eve entity IDs
Returns URL or empty string Returns URL or empty string
""" """
return _generic_alliance_url(evewho, 'alliance_id', eve_obj) return _generic_alliance_url(evewho, 'alliance_id', eve_obj)
@ -131,69 +131,69 @@ def evewho_alliance_url(eve_obj: object) -> str:
def dotlan_corporation_url(eve_obj: object) -> str: def dotlan_corporation_url(eve_obj: object) -> str:
"""generates a dotlan URL for the given object """generates a dotlan URL for the given object
Works with allianceauth.eveonline objects and eve entity names Works with allianceauth.eveonline objects and eve entity names
Returns URL or empty string Returns URL or empty string
""" """
return _generic_corporation_url(dotlan, 'corporation_name', eve_obj) return _generic_corporation_url(dotlan, 'corporation_name', eve_obj)
@register.filter @register.filter
def dotlan_alliance_url(eve_obj: object) -> str: def dotlan_alliance_url(eve_obj: object) -> str:
"""generates a dotlan URL for the given object """generates a dotlan URL for the given object
Works with allianceauth.eveonline objects and eve entity names Works with allianceauth.eveonline objects and eve entity names
Returns URL or empty string Returns URL or empty string
""" """
return _generic_alliance_url(dotlan, 'alliance_name', eve_obj) return _generic_alliance_url(dotlan, 'alliance_name', eve_obj)
@register.filter @register.filter
def dotlan_region_url(eve_obj: object) -> str: def dotlan_region_url(eve_obj: object) -> str:
"""generates a dotlan URL for the given object """generates a dotlan URL for the given object
Works with eve entity names Works with eve entity names
Returns URL or empty string Returns URL or empty string
""" """
return _generic_evelinks_url(dotlan, 'region_url', eve_obj) return _generic_evelinks_url(dotlan, 'region_url', eve_obj)
@register.filter @register.filter
def dotlan_solar_system_url(eve_obj: object) -> str: def dotlan_solar_system_url(eve_obj: object) -> str:
"""generates a dotlan URL for the given object """generates a dotlan URL for the given object
Works with eve entity names Works with eve entity names
Returns URL or empty string Returns URL or empty string
""" """
return _generic_evelinks_url(dotlan, 'solar_system_url', eve_obj) return _generic_evelinks_url(dotlan, 'solar_system_url', eve_obj)
# zkillboard # zkillboard
@register.filter @register.filter
def zkillboard_character_url(eve_obj: EveCharacter) -> str: def zkillboard_character_url(eve_obj: EveCharacter) -> str:
"""generates a zkillboard URL for the given object """generates a zkillboard URL for the given object
Works with allianceauth.eveonline objects and eve entity IDs Works with allianceauth.eveonline objects and eve entity IDs
Returns URL or empty string Returns URL or empty string
""" """
return _generic_character_url(zkillboard, 'character_id', eve_obj) return _generic_character_url(zkillboard, 'character_id', eve_obj)
@register.filter @register.filter
def zkillboard_corporation_url(eve_obj: object) -> str: def zkillboard_corporation_url(eve_obj: object) -> str:
"""generates a zkillboard URL for the given object """generates a zkillboard URL for the given object
Works with allianceauth.eveonline objects and eve entity IDs Works with allianceauth.eveonline objects and eve entity IDs
Returns URL or empty string Returns URL or empty string
""" """
return _generic_corporation_url(zkillboard, 'corporation_id', eve_obj) return _generic_corporation_url(zkillboard, 'corporation_id', eve_obj)
@register.filter @register.filter
def zkillboard_alliance_url(eve_obj: object) -> str: def zkillboard_alliance_url(eve_obj: object) -> str:
"""generates a zkillboard URL for the given object """generates a zkillboard URL for the given object
Works with allianceauth.eveonline objects and eve entity IDs Works with allianceauth.eveonline objects and eve entity IDs
Returns URL or empty string Returns URL or empty string
""" """
return _generic_alliance_url(zkillboard, 'alliance_id', eve_obj) return _generic_alliance_url(zkillboard, 'alliance_id', eve_obj)
@register.filter @register.filter
def zkillboard_region_url(eve_obj: object) -> str: def zkillboard_region_url(eve_obj: object) -> str:
"""generates a zkillboard URL for the given object """generates a zkillboard URL for the given object
Works with eve entity IDs Works with eve entity IDs
Returns URL or empty string Returns URL or empty string
@ -202,7 +202,7 @@ def zkillboard_region_url(eve_obj: object) -> str:
@register.filter @register.filter
def zkillboard_solar_system_url(eve_obj: object) -> str: def zkillboard_solar_system_url(eve_obj: object) -> str:
"""generates zkillboard URL for the given object """generates zkillboard URL for the given object
Works with eve entity IDs Works with eve entity IDs
Returns URL or empty string Returns URL or empty string
@ -214,20 +214,20 @@ def zkillboard_solar_system_url(eve_obj: object) -> str:
@register.filter @register.filter
def character_portrait_url( def character_portrait_url(
eve_obj: object, eve_obj: object,
size: int = _DEFAULT_IMAGE_SIZE size: int = _DEFAULT_IMAGE_SIZE
) -> str: ) -> str:
"""generates an image URL for the given object """generates an image URL for the given object
Works with EveCharacter objects or character IDs Works with EveCharacter objects or character IDs
Returns URL or empty string Returns URL or empty string
""" """
if isinstance(eve_obj, EveCharacter): if isinstance(eve_obj, EveCharacter):
return eve_obj.portrait_url(size) return eve_obj.portrait_url(size)
elif eve_obj is None: elif eve_obj is None:
return '' return ''
else: else:
try: try:
return EveCharacter.generic_portrait_url(eve_obj, size) return EveCharacter.generic_portrait_url(eve_obj, size)
except ValueError: except ValueError:
@ -236,23 +236,23 @@ def character_portrait_url(
@register.filter @register.filter
def corporation_logo_url( def corporation_logo_url(
eve_obj: object, eve_obj: object,
size: int = _DEFAULT_IMAGE_SIZE size: int = _DEFAULT_IMAGE_SIZE
) -> str: ) -> str:
"""generates image URL for the given object """generates image URL for the given object
Works with EveCharacter, EveCorporationInfo objects or corporation IDs Works with EveCharacter, EveCorporationInfo objects or corporation IDs
Returns URL or empty string Returns URL or empty string
""" """
if isinstance(eve_obj, EveCorporationInfo): if isinstance(eve_obj, EveCorporationInfo):
return eve_obj.logo_url(size) return eve_obj.logo_url(size)
elif isinstance(eve_obj, EveCharacter): elif isinstance(eve_obj, EveCharacter):
return eve_obj.corporation_logo_url(size) return eve_obj.corporation_logo_url(size)
elif eve_obj is None: elif eve_obj is None:
return '' return ''
else: else:
try: try:
return EveCorporationInfo.generic_logo_url(eve_obj, size) return EveCorporationInfo.generic_logo_url(eve_obj, size)
except ValueError: except ValueError:
@ -261,23 +261,23 @@ def corporation_logo_url(
@register.filter @register.filter
def alliance_logo_url( def alliance_logo_url(
eve_obj: object, eve_obj: object,
size: int = _DEFAULT_IMAGE_SIZE size: int = _DEFAULT_IMAGE_SIZE
) -> str: ) -> str:
"""generates image URL for the given object """generates image URL for the given object
Works with EveCharacter, EveAllianceInfo objects or alliance IDs Works with EveCharacter, EveAllianceInfo objects or alliance IDs
Returns URL or empty string Returns URL or empty string
""" """
if isinstance(eve_obj, EveAllianceInfo): if isinstance(eve_obj, EveAllianceInfo):
return eve_obj.logo_url(size) return eve_obj.logo_url(size)
elif isinstance(eve_obj, EveCharacter): elif isinstance(eve_obj, EveCharacter):
return eve_obj.alliance_logo_url(size) return eve_obj.alliance_logo_url(size)
elif eve_obj is None: elif eve_obj is None:
return '' return ''
else: else:
try: try:
return EveAllianceInfo.generic_logo_url(eve_obj, size) return EveAllianceInfo.generic_logo_url(eve_obj, size)
except ValueError: except ValueError:
@ -286,10 +286,10 @@ def alliance_logo_url(
@register.filter @register.filter
def type_icon_url( def type_icon_url(
type_id: int, type_id: int,
size: int = _DEFAULT_IMAGE_SIZE size: int = _DEFAULT_IMAGE_SIZE
) -> str: ) -> str:
"""generates a icon image URL for the given type ID """generates a icon image URL for the given type ID
Returns URL or empty string Returns URL or empty string
""" """
try: try:
@ -300,10 +300,10 @@ def type_icon_url(
@register.filter @register.filter
def type_render_url( def type_render_url(
type_id: int, type_id: int,
size: int = _DEFAULT_IMAGE_SIZE size: int = _DEFAULT_IMAGE_SIZE
) -> str: ) -> str:
"""generates a render image URL for the given type ID """generates a render image URL for the given type ID
Returns URL or empty string Returns URL or empty string
""" """
try: try:

View File

@ -1,4 +1,4 @@
<!-- This is an example template for the evelinks template tags <!-- This is an example template for the evelinks template tags
Needs to be called with a context containing three objects: Needs to be called with a context containing three objects:
@ -18,15 +18,15 @@ Needs to be called with a context containing three objects:
<div class="col-lg-12"> <div class="col-lg-12">
<h1 class="page-header text-center">Evelinks templatetags examples</h1> <h1 class="page-header text-center">Evelinks templatetags examples</h1>
<div class="col-lg-12 container"> <div class="col-lg-12 container">
<h2>profile URLs</h2> <h2>profile URLs</h2>
<div class="rows"> <div class="rows">
<div class="col-md-4"> <div class="col-md-4">
<h3>evewho</h3> <h3>evewho</h3>
<p><a href="{{ my_character|evewho_character_url}}">character from character object</a></p> <p><a href="{{ my_character|evewho_character_url}}">character from character object</a></p>
<p><a href="{{ my_corporation|evewho_corporation_url}}">corporation form corporation object</a></p> <p><a href="{{ my_corporation|evewho_corporation_url}}">corporation form corporation object</a></p>
<p><a href="{{ my_character|evewho_corporation_url}}">corporation from charachter object</a></p> <p><a href="{{ my_character|evewho_corporation_url}}">corporation from charachter object</a></p>
<p><a href="{{ my_alliance|evewho_alliance_url}}">alliance from alliance object</a></p> <p><a href="{{ my_alliance|evewho_alliance_url}}">alliance from alliance object</a></p>
<p><a href="{{ my_character|evewho_alliance_url}}">alliance from character object</a></p> <p><a href="{{ my_character|evewho_alliance_url}}">alliance from character object</a></p>
@ -42,23 +42,23 @@ Needs to be called with a context containing three objects:
<p><a href="{{ 'Tama'|dotlan_solar_system_url}}">solar system from name string</a></p> <p><a href="{{ 'Tama'|dotlan_solar_system_url}}">solar system from name string</a></p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<h3>zkillboard</h3> <h3>zkillboard</h3>
<p><a href="{{ my_character|zkillboard_character_url}}">character from character object</a></p> <p><a href="{{ my_character|zkillboard_character_url}}">character from character object</a></p>
<p><a href="{{ my_character|zkillboard_corporation_url}}">corporation from character object</a></p> <p><a href="{{ my_character|zkillboard_corporation_url}}">corporation from character object</a></p>
<p><a href="{{ my_corporation|zkillboard_corporation_url}}">corporation form corporation object</a></p> <p><a href="{{ my_corporation|zkillboard_corporation_url}}">corporation form corporation object</a></p>
<p><a href="{{ my_character|zkillboard_alliance_url}}">alliance from character object</a></p> <p><a href="{{ my_character|zkillboard_alliance_url}}">alliance from character object</a></p>
<p><a href="{{ my_alliance|zkillboard_alliance_url}}">alliance from alliance object</a></p> <p><a href="{{ my_alliance|zkillboard_alliance_url}}">alliance from alliance object</a></p>
<p><a href="{{ 10000069|zkillboard_region_url}}">region from ID</a></p> <p><a href="{{ 10000069|zkillboard_region_url}}">region from ID</a></p>
<p><a href="{{ 30002813|zkillboard_solar_system_url}}">solar sytem from ID</a></p> <p><a href="{{ 30002813|zkillboard_solar_system_url}}">solar sytem from ID</a></p>
</div> </div>
</div> </div>
</div> </div>
<h2>image URLs</h2> <h2>image URLs</h2>
<div class="rows"> <div class="rows">
<div class="col-md-4"> <div class="col-md-4">
<p>character from ID: <img src="{{ my_character.character_id|character_portrait_url:128}}"></p> <p>character from ID: <img src="{{ my_character.character_id|character_portrait_url:128}}"></p>
<p>character from character object: <img src="{{ my_character|character_portrait_url:128}}"></p> <p>character from character object: <img src="{{ my_character|character_portrait_url:128}}"></p>
@ -67,18 +67,18 @@ Needs to be called with a context containing three objects:
<div class="col-md-4"> <div class="col-md-4">
<p>corporation from ID: <img src="{{ my_character.corporation_id|corporation_logo_url:128}}"></p> <p>corporation from ID: <img src="{{ my_character.corporation_id|corporation_logo_url:128}}"></p>
<p>corporation from character object: <img src="{{ my_character|corporation_logo_url:128}}"></p> <p>corporation from character object: <img src="{{ my_character|corporation_logo_url:128}}"></p>
<p>corporation from corporation object: <img src="{{ my_corporation|corporation_logo_url:128}}"></p> <p>corporation from corporation object: <img src="{{ my_corporation|corporation_logo_url:128}}"></p>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<p>alliance from ID: <img src="{{ my_character.alliance_id|alliance_logo_url:128}}"></p> <p>alliance from ID: <img src="{{ my_character.alliance_id|alliance_logo_url:128}}"></p>
<p>alliance from character object: <img src="{{ my_character|alliance_logo_url:128}}"></p> <p>alliance from character object: <img src="{{ my_character|alliance_logo_url:128}}"></p>
<p>alliance from alliance object: <img src="{{ my_alliance|alliance_logo_url:128}}"></p> <p>alliance from alliance object: <img src="{{ my_alliance|alliance_logo_url:128}}"></p>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -1,18 +1,18 @@
import logging import logging
import os import os
def set_logger(logger_name: str, name: str) -> object: def set_logger(logger_name: str, name: str) -> object:
"""set logger for current test module """set logger for current test module
Args: Args:
- logger: current logger object - logger: current logger object
- name: name of current module, e.g. __file__ - name: name of current module, e.g. __file__
Returns: Returns:
- amended logger - amended logger
""" """
# reconfigure logger so we get logging from tested module # reconfigure logger so we get logging from tested module
f_format = logging.Formatter( f_format = logging.Formatter(
'%(asctime)s - %(levelname)s - %(module)s:%(funcName)s - %(message)s' '%(asctime)s - %(levelname)s - %(module)s:%(funcName)s - %(message)s'

File diff suppressed because one or more lines are too long

View File

@ -27,9 +27,9 @@ class EveCharacterManagerTestCase(TestCase):
@property @property
def corp(self): def corp(self):
return Corporation( return Corporation(
id=2345, id=2345,
name='Test Corp', name='Test Corp',
alliance_id=3456, alliance_id=3456,
ticker='0BUGS' #lies, blatant lies! ticker='0BUGS' #lies, blatant lies!
) )
@ -37,9 +37,9 @@ class EveCharacterManagerTestCase(TestCase):
def test_create_character(self, provider): def test_create_character(self, provider):
# Also covers create_character_obj # Also covers create_character_obj
expected = self.TestCharacter( expected = self.TestCharacter(
id=1234, id=1234,
name='Test Character', name='Test Character',
corp_id=2345, corp_id=2345,
alliance_id=3456 alliance_id=3456
) )
@ -69,9 +69,9 @@ class EveCharacterManagerTestCase(TestCase):
) )
expected = self.TestCharacter( expected = self.TestCharacter(
id=1234, id=1234,
name='Test Character', name='Test Character',
corp_id=2345, corp_id=2345,
alliance_id=3456 alliance_id=3456
) )
provider.get_character.return_value = expected provider.get_character.return_value = expected
@ -104,7 +104,7 @@ class EveCharacterManagerTestCase(TestCase):
self.assertEqual(result.character_id, 1234) self.assertEqual(result.character_id, 1234)
self.assertEqual(result.character_name, 'character.name') self.assertEqual(result.character_name, 'character.name')
# try to get non existing character # try to get non existing character
self.assertIsNone(EveCharacter.objects.get_character_by_id(9999)) self.assertIsNone(EveCharacter.objects.get_character_by_id(9999))
@ -130,10 +130,10 @@ class EveAllianceManagerTestCase(TestCase):
def test_create_alliance(self, provider, populate_alliance): def test_create_alliance(self, provider, populate_alliance):
# Also covers create_alliance_obj # Also covers create_alliance_obj
expected = self.TestAlliance( expected = self.TestAlliance(
id=3456, id=3456,
name='Test Alliance', name='Test Alliance',
ticker='TEST', ticker='TEST',
corp_ids=[2345], corp_ids=[2345],
executor_corp_id=2345 executor_corp_id=2345
) )
@ -157,10 +157,10 @@ class EveAllianceManagerTestCase(TestCase):
executor_corp_id=2345, executor_corp_id=2345,
) )
expected = self.TestAlliance( expected = self.TestAlliance(
id=3456, id=3456,
name='Test Alliance', name='Test Alliance',
ticker='TEST', ticker='TEST',
corp_ids=[2345], corp_ids=[2345],
executor_corp_id=2345 executor_corp_id=2345
) )
@ -189,19 +189,19 @@ class EveCorporationManagerTestCase(TestCase):
@property @property
def alliance(self): def alliance(self):
return EveAllianceManagerTestCase.TestAlliance( return EveAllianceManagerTestCase.TestAlliance(
id=3456, id=3456,
name='Test Alliance', name='Test Alliance',
ticker='TEST', ticker='TEST',
corp_ids=[2345], corp_ids=[2345],
executor_corp_id=2345 executor_corp_id=2345
) )
@property @property
def ceo(self): def ceo(self):
return EveCharacterManagerTestCase.TestCharacter( return EveCharacterManagerTestCase.TestCharacter(
id=1234, id=1234,
name='Test Character', name='Test Character',
corp_id=2345, corp_id=2345,
alliance_id=3456 alliance_id=3456
) )
@ -216,11 +216,11 @@ class EveCorporationManagerTestCase(TestCase):
) )
expected = self.TestCorporation( expected = self.TestCorporation(
id=2345, id=2345,
name='Test Corp', name='Test Corp',
ticker='0BUGS', ticker='0BUGS',
ceo_id=1234, ceo_id=1234,
members=1, members=1,
alliance_id=3456 alliance_id=3456
) )
@ -237,13 +237,13 @@ class EveCorporationManagerTestCase(TestCase):
@mock.patch('allianceauth.eveonline.managers.providers.provider') @mock.patch('allianceauth.eveonline.managers.providers.provider')
def test_create_corporation_no_alliance(self, provider): def test_create_corporation_no_alliance(self, provider):
# variant to test no alliance case # variant to test no alliance case
# Also covers create_corp_obj # Also covers create_corp_obj
expected = self.TestCorporation( expected = self.TestCorporation(
id=2345, id=2345,
name='Test Corp', name='Test Corp',
ticker='0BUGS', ticker='0BUGS',
ceo_id=1234, ceo_id=1234,
members=1, members=1,
alliance_id=3456 alliance_id=3456
) )
@ -276,11 +276,11 @@ class EveCorporationManagerTestCase(TestCase):
) )
expected = self.TestCorporation( expected = self.TestCorporation(
id=2345, id=2345,
name='Test Corp', name='Test Corp',
ticker='0BUGS', ticker='0BUGS',
ceo_id=1234, ceo_id=1234,
members=1, members=1,
alliance_id=3456 alliance_id=3456
) )

View File

@ -133,9 +133,9 @@ class EveCharacterTestCase(TestCase):
name='Dummy Corp 2', name='Dummy Corp 2',
ticker='DC2', ticker='DC2',
ceo_id=1001, ceo_id=1001,
members=34, members=34,
) )
my_character = EveCharacter.objects.create( my_character = EveCharacter.objects.create(
character_id=1001, character_id=1001,
character_name='Bruce Wayne', character_name='Bruce Wayne',
@ -144,7 +144,7 @@ class EveCharacterTestCase(TestCase):
corporation_ticker='DC1', corporation_ticker='DC1',
alliance_id=3001, alliance_id=3001,
alliance_name='Dummy Alliance 1', alliance_name='Dummy Alliance 1',
) )
my_updated_character = Character( my_updated_character = Character(
name='Bruce X. Wayne', name='Bruce X. Wayne',
corp_id=2002 corp_id=2002
@ -169,8 +169,8 @@ class EveCharacterTestCase(TestCase):
character_id=42, character_id=42,
character_name='character.name', character_name='character.name',
corporation_id=123, corporation_id=123,
corporation_name='corporation.name', corporation_name='corporation.name',
corporation_ticker='ABC', corporation_ticker='ABC',
) )
self.assertEqual( self.assertEqual(
x.portrait_url(), x.portrait_url(),
@ -179,7 +179,7 @@ class EveCharacterTestCase(TestCase):
self.assertEqual( self.assertEqual(
x.portrait_url(64), x.portrait_url(64),
eveimageserver._eve_entity_image_url('character', 42, size=64) eveimageserver._eve_entity_image_url('character', 42, size=64)
) )
self.assertEqual( self.assertEqual(
x.portrait_url_32, x.portrait_url_32,
eveimageserver._eve_entity_image_url('character', 42, size=32) eveimageserver._eve_entity_image_url('character', 42, size=32)
@ -202,8 +202,8 @@ class EveCharacterTestCase(TestCase):
character_id=42, character_id=42,
character_name='character.name', character_name='character.name',
corporation_id=123, corporation_id=123,
corporation_name='corporation.name', corporation_name='corporation.name',
corporation_ticker='ABC', corporation_ticker='ABC',
) )
self.assertEqual( self.assertEqual(
x.corporation_logo_url(), x.corporation_logo_url(),
@ -235,9 +235,9 @@ class EveCharacterTestCase(TestCase):
character_id=42, character_id=42,
character_name='character.name', character_name='character.name',
corporation_id=123, corporation_id=123,
corporation_name='corporation.name', corporation_name='corporation.name',
corporation_ticker='ABC', corporation_ticker='ABC',
) )
self.assertEqual( self.assertEqual(
x.alliance_logo_url(), x.alliance_logo_url(),
'' ''
@ -286,7 +286,7 @@ class EveCharacterTestCase(TestCase):
class EveAllianceTestCase(TestCase): class EveAllianceTestCase(TestCase):
def test_str(self): def test_str(self):
my_alliance = EveAllianceInfo( my_alliance = EveAllianceInfo(
alliance_id=3001, alliance_id=3001,
@ -295,12 +295,12 @@ class EveAllianceTestCase(TestCase):
executor_corp_id=2001 executor_corp_id=2001
) )
self.assertEqual(str(my_alliance), 'Dummy Alliance 1') self.assertEqual(str(my_alliance), 'Dummy Alliance 1')
@patch( @patch(
'allianceauth.eveonline.models.EveCorporationInfo.objects.create_corporation' 'allianceauth.eveonline.models.EveCorporationInfo.objects.create_corporation'
) )
def test_populate_alliance(self, mock_create_corporation): def test_populate_alliance(self, mock_create_corporation):
def create_corp(corp_id): def create_corp(corp_id):
if corp_id == 2002: if corp_id == 2002:
EveCorporationInfo.objects.create( EveCorporationInfo.objects.create(
@ -311,23 +311,23 @@ class EveAllianceTestCase(TestCase):
) )
else: else:
raise ValueError() raise ValueError()
mock_EveAllianceProviderManager = Mock() mock_EveAllianceProviderManager = Mock()
mock_EveAllianceProviderManager.get_alliance.return_value = \ mock_EveAllianceProviderManager.get_alliance.return_value = \
Alliance( Alliance(
id=3001, id=3001,
name='Dummy Alliance 1', name='Dummy Alliance 1',
corp_ids=[2001, 2002] corp_ids=[2001, 2002]
) )
mock_create_corporation.side_effect = create_corp mock_create_corporation.side_effect = create_corp
EveCorporationInfo.objects.create( EveCorporationInfo.objects.create(
corporation_id=2001, corporation_id=2001,
corporation_name='Dummy Corporation 1', corporation_name='Dummy Corporation 1',
corporation_ticker='DC1', corporation_ticker='DC1',
member_count=42, member_count=42,
) )
my_alliance = EveAllianceInfo( my_alliance = EveAllianceInfo(
alliance_id=3001, alliance_id=3001,
alliance_name='Dummy Alliance 1', alliance_name='Dummy Alliance 1',
@ -336,13 +336,13 @@ class EveAllianceTestCase(TestCase):
) )
my_alliance.provider = mock_EveAllianceProviderManager my_alliance.provider = mock_EveAllianceProviderManager
my_alliance.save() my_alliance.save()
my_alliance.populate_alliance() my_alliance.populate_alliance()
for corporation in EveCorporationInfo.objects\ for corporation in EveCorporationInfo.objects\
.filter(corporation_id__in=[2001, 2002] .filter(corporation_id__in=[2001, 2002]
): ):
self.assertEqual(corporation.alliance, my_alliance) self.assertEqual(corporation.alliance, my_alliance)
def test_update_alliance_with_object(self): def test_update_alliance_with_object(self):
my_alliance = EveAllianceInfo.objects.create( my_alliance = EveAllianceInfo.objects.create(
alliance_id=3001, alliance_id=3001,
@ -351,9 +351,9 @@ class EveAllianceTestCase(TestCase):
executor_corp_id=2001 executor_corp_id=2001
) )
updated_alliance = Alliance( updated_alliance = Alliance(
id=3002, id=3002,
name='Dummy Alliance 2', name='Dummy Alliance 2',
corp_ids=[2004], corp_ids=[2004],
executor_corp_id=2004 executor_corp_id=2004
) )
my_alliance.update_alliance(updated_alliance) my_alliance.update_alliance(updated_alliance)
@ -367,7 +367,7 @@ class EveAllianceTestCase(TestCase):
mock_EveAllianceProviderManager = Mock() mock_EveAllianceProviderManager = Mock()
mock_EveAllianceProviderManager.get_alliance.return_value = \ mock_EveAllianceProviderManager.get_alliance.return_value = \
Alliance( Alliance(
id=3002, id=3002,
name='Dummy Alliance 2', name='Dummy Alliance 2',
corp_ids=[2004], corp_ids=[2004],
executor_corp_id=2004 executor_corp_id=2004
@ -381,15 +381,15 @@ class EveAllianceTestCase(TestCase):
) )
my_alliance.provider = mock_EveAllianceProviderManager my_alliance.provider = mock_EveAllianceProviderManager
my_alliance.save() my_alliance.save()
Alliance( Alliance(
name='Dummy Alliance 2', name='Dummy Alliance 2',
corp_ids=[2004], corp_ids=[2004],
executor_corp_id=2004 executor_corp_id=2004
) )
my_alliance.update_alliance() my_alliance.update_alliance()
my_alliance.refresh_from_db() my_alliance.refresh_from_db()
self.assertEqual(int(my_alliance.executor_corp_id), 2004) self.assertEqual(int(my_alliance.executor_corp_id), 2004)
# potential bug # potential bug
# update_alliance() is only updateting executor_corp_id nothing else ??? # update_alliance() is only updateting executor_corp_id nothing else ???
@ -417,7 +417,7 @@ class EveAllianceTestCase(TestCase):
self.assertEqual( self.assertEqual(
x.logo_url(64), x.logo_url(64),
'https://images.evetech.net/alliances/42/logo?size=64' 'https://images.evetech.net/alliances/42/logo?size=64'
) )
self.assertEqual( self.assertEqual(
x.logo_url_32, x.logo_url_32,
'https://images.evetech.net/alliances/42/logo?size=32' 'https://images.evetech.net/alliances/42/logo?size=32'
@ -434,10 +434,10 @@ class EveAllianceTestCase(TestCase):
x.logo_url_256, x.logo_url_256,
'https://images.evetech.net/alliances/42/logo?size=256' 'https://images.evetech.net/alliances/42/logo?size=256'
) )
class EveCorporationTestCase(TestCase): class EveCorporationTestCase(TestCase):
def setUp(self): def setUp(self):
my_alliance = EveAllianceInfo.objects.create( my_alliance = EveAllianceInfo.objects.create(
alliance_id=3001, alliance_id=3001,
@ -451,9 +451,9 @@ class EveCorporationTestCase(TestCase):
corporation_ticker='DC1', corporation_ticker='DC1',
member_count=42, member_count=42,
alliance=my_alliance alliance=my_alliance
) )
def test_str(self): def test_str(self):
self.assertEqual(str(self.my_corp), 'Dummy Corporation 1') self.assertEqual(str(self.my_corp), 'Dummy Corporation 1')
def test_update_corporation_from_object_w_alliance(self): def test_update_corporation_from_object_w_alliance(self):
@ -465,15 +465,15 @@ class EveCorporationTestCase(TestCase):
# potential bug # potential bug
# update_corporation updates member_count only # update_corporation updates member_count only
def test_update_corporation_no_object_w_alliance(self): def test_update_corporation_no_object_w_alliance(self):
mock_provider = Mock() mock_provider = Mock()
mock_provider.get_corporation.return_value = Corporation(members=87) mock_provider.get_corporation.return_value = Corporation(members=87)
self.my_corp.provider = mock_provider self.my_corp.provider = mock_provider
self.my_corp.update_corporation() self.my_corp.update_corporation()
self.assertEqual(self.my_corp.member_count, 87) self.assertEqual(self.my_corp.member_count, 87)
def test_update_corporation_from_object_wo_alliance(self): def test_update_corporation_from_object_wo_alliance(self):
my_corp2 = EveCorporationInfo( my_corp2 = EveCorporationInfo(
corporation_id=2011, corporation_id=2011,
@ -498,7 +498,7 @@ class EveCorporationTestCase(TestCase):
eveimageserver._eve_entity_image_url('corporation', 42, 256) eveimageserver._eve_entity_image_url('corporation', 42, 256)
) )
def test_logo_url(self): def test_logo_url(self):
self.assertEqual( self.assertEqual(
self.my_corp.logo_url(), self.my_corp.logo_url(),
'https://images.evetech.net/corporations/2001/logo?size=32' 'https://images.evetech.net/corporations/2001/logo?size=32'

View File

@ -8,13 +8,13 @@ from django.test import TestCase
from . import set_logger from . import set_logger
from ..providers import ( from ..providers import (
ObjectNotFound, ObjectNotFound,
Entity, Entity,
Character, Character,
Corporation, Corporation,
Alliance, Alliance,
ItemType, ItemType,
EveProvider, EveProvider,
EveSwaggerProvider EveSwaggerProvider
) )
@ -92,12 +92,12 @@ class TestCorporation(TestCase):
executor_corp_id=2001 executor_corp_id=2001
) )
mock_provider_get_alliance.return_value = my_alliance mock_provider_get_alliance.return_value = my_alliance
x = Corporation(alliance_id=3001) x = Corporation(alliance_id=3001)
self.assertEqual( self.assertEqual(
x.alliance, x.alliance,
my_alliance my_alliance
) )
self.assertEqual( self.assertEqual(
x.alliance, x.alliance,
my_alliance my_alliance
@ -106,25 +106,25 @@ class TestCorporation(TestCase):
self.assertEqual(mock_provider_get_alliance.call_count, 1) self.assertEqual(mock_provider_get_alliance.call_count, 1)
@patch(MODULE_PATH + '.EveSwaggerProvider.get_alliance') @patch(MODULE_PATH + '.EveSwaggerProvider.get_alliance')
def test_alliance_not_defined(self, mock_provider_get_alliance): def test_alliance_not_defined(self, mock_provider_get_alliance):
mock_provider_get_alliance.return_value = None mock_provider_get_alliance.return_value = None
x = Corporation() x = Corporation()
self.assertEqual( self.assertEqual(
x.alliance, x.alliance,
Entity(None, None) Entity(None, None)
) )
@patch(MODULE_PATH + '.EveSwaggerProvider.get_character') @patch(MODULE_PATH + '.EveSwaggerProvider.get_character')
def test_ceo(self, mock_provider_get_character): def test_ceo(self, mock_provider_get_character):
my_ceo = Character( my_ceo = Character(
id=1001, id=1001,
name='Bruce Wayne', name='Bruce Wayne',
corp_id=2001, corp_id=2001,
alliance_id=3001 alliance_id=3001
) )
mock_provider_get_character.return_value = my_ceo mock_provider_get_character.return_value = my_ceo
# fetch from provider if not defined # fetch from provider if not defined
x = Corporation() x = Corporation()
self.assertEqual( self.assertEqual(
@ -142,7 +142,7 @@ class TestCorporation(TestCase):
# bug in ceo(): will try to fetch character even if ceo_id is None # bug in ceo(): will try to fetch character even if ceo_id is None
class TestAlliance(TestCase): class TestAlliance(TestCase):
def setUp(self): def setUp(self):
@ -155,48 +155,48 @@ class TestAlliance(TestCase):
) )
@staticmethod @staticmethod
def _get_corp(corp_id): def _get_corp(corp_id):
corps = { corps = {
2001: Corporation( 2001: Corporation(
id=2001, id=2001,
name='Dummy Corp 1', name='Dummy Corp 1',
alliance_id=3001 alliance_id=3001
), ),
2002: Corporation( 2002: Corporation(
id=2002, id=2002,
name='Dummy Corp 2', name='Dummy Corp 2',
alliance_id=3001 alliance_id=3001
), ),
2003: Corporation( 2003: Corporation(
id=2003, id=2003,
name='Dummy Corp 3', name='Dummy Corp 3',
alliance_id=3001 alliance_id=3001
), ),
} }
if corp_id: if corp_id:
return corps[int(corp_id)] return corps[int(corp_id)]
@patch(MODULE_PATH + '.EveSwaggerProvider.get_corp') @patch(MODULE_PATH + '.EveSwaggerProvider.get_corp')
def test_corp(self, mock_provider_get_corp): def test_corp(self, mock_provider_get_corp):
mock_provider_get_corp.side_effect = TestAlliance._get_corp mock_provider_get_corp.side_effect = TestAlliance._get_corp
# should fetch corp if not in the object # should fetch corp if not in the object
self.assertEqual( self.assertEqual(
self.my_alliance.corp(2001), self.my_alliance.corp(2001),
TestAlliance._get_corp(2001) TestAlliance._get_corp(2001)
) )
# should fetch corp if not in the object # should fetch corp if not in the object
self.assertEqual( self.assertEqual(
self.my_alliance.corp(2002), self.my_alliance.corp(2002),
TestAlliance._get_corp(2002) TestAlliance._get_corp(2002)
) )
# should return from the object if its there # should return from the object if its there
self.assertEqual( self.assertEqual(
self.my_alliance.corp(2001), self.my_alliance.corp(2001),
TestAlliance._get_corp(2001) TestAlliance._get_corp(2001)
) )
# should return from the object if its there # should return from the object if its there
self.assertEqual( self.assertEqual(
self.my_alliance.corp(2002), self.my_alliance.corp(2002),
TestAlliance._get_corp(2002) TestAlliance._get_corp(2002)
@ -220,7 +220,7 @@ class TestAlliance(TestCase):
@patch(MODULE_PATH + '.EveSwaggerProvider.get_corp') @patch(MODULE_PATH + '.EveSwaggerProvider.get_corp')
def test_executor_corp(self, mock_provider_get_corp): def test_executor_corp(self, mock_provider_get_corp):
mock_provider_get_corp.side_effect = TestAlliance._get_corp mock_provider_get_corp.side_effect = TestAlliance._get_corp
self.assertEqual( self.assertEqual(
self.my_alliance.executor_corp, self.my_alliance.executor_corp,
TestAlliance._get_corp(2001), TestAlliance._get_corp(2001),
@ -248,7 +248,7 @@ class TestCharacter(TestCase):
my_corp = Corporation( my_corp = Corporation(
id=2001, id=2001,
name='Dummy Corp 1' name='Dummy Corp 1'
) )
mock_provider_get_corp.return_value = my_corp mock_provider_get_corp.return_value = my_corp
self.assertEqual(self.my_character.corp, my_corp) self.assertEqual(self.my_character.corp, my_corp)
@ -256,11 +256,11 @@ class TestCharacter(TestCase):
# should call the provider one time only # should call the provider one time only
self.assertEqual(mock_provider_get_corp.call_count, 1) self.assertEqual(mock_provider_get_corp.call_count, 1)
@patch(MODULE_PATH + '.EveSwaggerProvider.get_alliance') @patch(MODULE_PATH + '.EveSwaggerProvider.get_alliance')
@patch(MODULE_PATH + '.EveSwaggerProvider.get_corp') @patch(MODULE_PATH + '.EveSwaggerProvider.get_corp')
def test_alliance_has_one( def test_alliance_has_one(
self, self,
mock_provider_get_corp, mock_provider_get_corp,
mock_provider_get_alliance, mock_provider_get_alliance,
): ):
@ -268,14 +268,14 @@ class TestCharacter(TestCase):
id=2001, id=2001,
name='Dummy Corp 1', name='Dummy Corp 1',
alliance_id=3001 alliance_id=3001
) )
mock_provider_get_corp.return_value = my_corp mock_provider_get_corp.return_value = my_corp
my_alliance = Alliance( my_alliance = Alliance(
id=3001, id=3001,
name='Dummy Alliance 1', name='Dummy Alliance 1',
executor_corp_id=2001, executor_corp_id=2001,
corp_ids=[2001, 2002] corp_ids=[2001, 2002]
) )
mock_provider_get_alliance.return_value = my_alliance mock_provider_get_alliance.return_value = my_alliance
self.assertEqual(self.my_character.alliance, my_alliance) self.assertEqual(self.my_character.alliance, my_alliance)
@ -301,7 +301,7 @@ class TestEveProvider(TestCase):
def setUp(self): def setUp(self):
self.my_provider = EveProvider() self.my_provider = EveProvider()
def test_get_alliance(self): def test_get_alliance(self):
with self.assertRaises(NotImplementedError): with self.assertRaises(NotImplementedError):
self.my_provider.get_alliance(3001) self.my_provider.get_alliance(3001)
@ -315,7 +315,7 @@ class TestEveProvider(TestCase):
self.my_provider.get_character(1001) self.my_provider.get_character(1001)
# bug: should be calling NotImplementedError() not NotImplemented # bug: should be calling NotImplementedError() not NotImplemented
""" """
def test_get_itemtype(self): def test_get_itemtype(self):
with self.assertRaises(NotImplementedError): with self.assertRaises(NotImplementedError):
self.my_provider.get_itemtype(4001) self.my_provider.get_itemtype(4001)
@ -323,7 +323,7 @@ class TestEveProvider(TestCase):
class TestEveSwaggerProvider(TestCase): class TestEveSwaggerProvider(TestCase):
@staticmethod @staticmethod
def esi_get_alliances_alliance_id(alliance_id): def esi_get_alliances_alliance_id(alliance_id):
alliances = { alliances = {
@ -404,11 +404,11 @@ class TestEveSwaggerProvider(TestCase):
@staticmethod @staticmethod
def esi_post_characters_affiliation(characters): def esi_post_characters_affiliation(characters):
character_data = { character_data = {
1001: { 1001: {
'corporation_id': 2001, 'corporation_id': 2001,
'alliance_id': 3001 'alliance_id': 3001
}, },
1002: { 1002: {
'corporation_id': 2101 'corporation_id': 2101
} }
} }
@ -424,7 +424,7 @@ class TestEveSwaggerProvider(TestCase):
return mock_result return mock_result
else: else:
raise TypeError() raise TypeError()
@staticmethod @staticmethod
def esi_get_universe_types_type_id(type_id): def esi_get_universe_types_type_id(type_id):
types = { types = {
@ -443,7 +443,7 @@ class TestEveSwaggerProvider(TestCase):
raise HTTPNotFound(Mock()) raise HTTPNotFound(Mock())
@patch(MODULE_PATH + '.esi_client_factory') @patch(MODULE_PATH + '.esi_client_factory')
def test_str(self, mock_esi_client_factory): def test_str(self, mock_esi_client_factory):
my_provider = EveSwaggerProvider() my_provider = EveSwaggerProvider()
self.assertEqual(str(my_provider), 'esi') self.assertEqual(str(my_provider), 'esi')
@ -457,7 +457,7 @@ class TestEveSwaggerProvider(TestCase):
= TestEveSwaggerProvider.esi_get_alliances_alliance_id_corporations = TestEveSwaggerProvider.esi_get_alliances_alliance_id_corporations
my_provider = EveSwaggerProvider() my_provider = EveSwaggerProvider()
# fully defined alliance # fully defined alliance
my_alliance = my_provider.get_alliance(3001) my_alliance = my_provider.get_alliance(3001)
self.assertEqual(my_alliance.id, 3001) self.assertEqual(my_alliance.id, 3001)
@ -494,13 +494,13 @@ class TestEveSwaggerProvider(TestCase):
# corporation wo/ alliance # corporation wo/ alliance
my_corp = my_provider.get_corp(2002) my_corp = my_provider.get_corp(2002)
self.assertEqual(my_corp.id, 2002) self.assertEqual(my_corp.id, 2002)
self.assertEqual(my_corp.alliance_id, None) self.assertEqual(my_corp.alliance_id, None)
# corporation not found # corporation not found
with self.assertRaises(ObjectNotFound): with self.assertRaises(ObjectNotFound):
my_provider.get_corp(2999) my_provider.get_corp(2999)
@patch(MODULE_PATH + '.esi_client_factory') @patch(MODULE_PATH + '.esi_client_factory')
def test_get_character(self, mock_esi_client_factory): def test_get_character(self, mock_esi_client_factory):
mock_esi_client_factory.return_value\ mock_esi_client_factory.return_value\
@ -540,7 +540,7 @@ class TestEveSwaggerProvider(TestCase):
my_type = my_provider.get_itemtype(4001) my_type = my_provider.get_itemtype(4001)
self.assertEqual(my_type.id, 4001) self.assertEqual(my_type.id, 4001)
self.assertEqual(my_type.name, 'Dummy Type 1') self.assertEqual(my_type.name, 'Dummy Type 1')
# type not found # type not found
with self.assertRaises(ObjectNotFound): with self.assertRaises(ObjectNotFound):
my_provider.get_itemtype(4999) my_provider.get_itemtype(4999)
@ -551,7 +551,7 @@ class TestEveSwaggerProvider(TestCase):
my_provider = EveSwaggerProvider() my_provider = EveSwaggerProvider()
self.assertTrue(mock_esi_client_factory.called) self.assertTrue(mock_esi_client_factory.called)
self.assertIsNotNone(my_provider._client) self.assertIsNotNone(my_provider._client)
@patch(MODULE_PATH + '.SWAGGER_SPEC_PATH', SWAGGER_OLD_SPEC_PATH) @patch(MODULE_PATH + '.SWAGGER_SPEC_PATH', SWAGGER_OLD_SPEC_PATH)
@patch(MODULE_PATH + '.settings.DEBUG', False) @patch(MODULE_PATH + '.settings.DEBUG', False)
@patch('socket.socket') @patch('socket.socket')
@ -559,8 +559,8 @@ class TestEveSwaggerProvider(TestCase):
self, mock_socket self, mock_socket
): ):
mock_socket.side_effect = Exception('Network blocked for testing') mock_socket.side_effect = Exception('Network blocked for testing')
my_provider = EveSwaggerProvider() my_provider = EveSwaggerProvider()
self.assertIsNone(my_provider._client) self.assertIsNone(my_provider._client)
@patch(MODULE_PATH + '.settings.DEBUG', True) @patch(MODULE_PATH + '.settings.DEBUG', True)
@patch(MODULE_PATH + '.esi_client_factory') @patch(MODULE_PATH + '.esi_client_factory')

View File

@ -4,9 +4,9 @@ from django.test import TestCase
from ..models import EveCharacter, EveCorporationInfo, EveAllianceInfo from ..models import EveCharacter, EveCorporationInfo, EveAllianceInfo
from ..tasks import ( from ..tasks import (
update_alliance, update_alliance,
update_corp, update_corp,
update_character, update_character,
run_model_update run_model_update
) )
@ -22,7 +22,7 @@ class TestTasks(TestCase):
self.assertEqual( self.assertEqual(
mock_EveCorporationInfo.objects.update_corporation.call_args[0][0], 42 mock_EveCorporationInfo.objects.update_corporation.call_args[0][0], 42
) )
@patch('allianceauth.eveonline.tasks.EveAllianceInfo') @patch('allianceauth.eveonline.tasks.EveAllianceInfo')
def test_update_alliance(self, mock_EveAllianceInfo): def test_update_alliance(self, mock_EveAllianceInfo):
update_alliance(42) update_alliance(42)
@ -58,7 +58,7 @@ class TestRunModelUpdate(TestCase):
EveCorporationInfo.objects.all().delete() EveCorporationInfo.objects.all().delete()
EveAllianceInfo.objects.all().delete() EveAllianceInfo.objects.all().delete()
EveCharacter.objects.all().delete() EveCharacter.objects.all().delete()
EveCorporationInfo.objects.create( EveCorporationInfo.objects.create(
corporation_id=2345, corporation_id=2345,
corporation_name='corp.name', corporation_name='corp.name',
@ -71,13 +71,13 @@ class TestRunModelUpdate(TestCase):
alliance_name='alliance.name', alliance_name='alliance.name',
alliance_ticker='a.t', alliance_ticker='a.t',
executor_corp_id=5, executor_corp_id=5,
) )
EveCharacter.objects.create( EveCharacter.objects.create(
character_id=1, character_id=1,
character_name='character.name1', character_name='character.name1',
corporation_id=2345, corporation_id=2345,
corporation_name='character.corp.name', corporation_name='character.corp.name',
corporation_ticker='c.c.t', # max 5 chars corporation_ticker='c.c.t', # max 5 chars
alliance_id=None alliance_id=None
) )
EveCharacter.objects.create( EveCharacter.objects.create(
@ -85,7 +85,7 @@ class TestRunModelUpdate(TestCase):
character_name='character.name2', character_name='character.name2',
corporation_id=9876, corporation_id=9876,
corporation_name='character.corp.name', corporation_name='character.corp.name',
corporation_ticker='c.c.t', # max 5 chars corporation_ticker='c.c.t', # max 5 chars
alliance_id=3456, alliance_id=3456,
alliance_name='character.alliance.name', alliance_name='character.alliance.name',
) )
@ -94,7 +94,7 @@ class TestRunModelUpdate(TestCase):
character_name='character.name3', character_name='character.name3',
corporation_id=9876, corporation_id=9876,
corporation_name='character.corp.name', corporation_name='character.corp.name',
corporation_ticker='c.c.t', # max 5 chars corporation_ticker='c.c.t', # max 5 chars
alliance_id=3456, alliance_id=3456,
alliance_name='character.alliance.name', alliance_name='character.alliance.name',
) )
@ -103,7 +103,7 @@ class TestRunModelUpdate(TestCase):
character_name='character.name4', character_name='character.name4',
corporation_id=9876, corporation_id=9876,
corporation_name='character.corp.name', corporation_name='character.corp.name',
corporation_ticker='c.c.t', # max 5 chars corporation_ticker='c.c.t', # max 5 chars
alliance_id=3456, alliance_id=3456,
alliance_name='character.alliance.name', alliance_name='character.alliance.name',
) )
@ -113,12 +113,12 @@ class TestRunModelUpdate(TestCase):
character_name='character.name5', character_name='character.name5',
corporation_id=9876, corporation_id=9876,
corporation_name='character.corp.name', corporation_name='character.corp.name',
corporation_ticker='c.c.t', # max 5 chars corporation_ticker='c.c.t', # max 5 chars
alliance_id=3456, alliance_id=3456,
alliance_name='character.alliance.name', alliance_name='character.alliance.name',
) )
""" """
def setUp(self): def setUp(self):
self.affiliations = [ self.affiliations = [
{'character_id': 1, 'corporation_id': 5}, {'character_id': 1, 'corporation_id': 5},
@ -152,14 +152,14 @@ class TestRunModelUpdate(TestCase):
mock_provider.client.Character.post_characters_affiliation.side_effect \ mock_provider.client.Character.post_characters_affiliation.side_effect \
= get_affiliations = get_affiliations
mock_provider.client.Universe.post_universe_names.side_effect = get_names mock_provider.client.Universe.post_universe_names.side_effect = get_names
run_model_update() run_model_update()
self.assertEqual( self.assertEqual(
mock_provider.client.Character.post_characters_affiliation.call_count, 2 mock_provider.client.Character.post_characters_affiliation.call_count, 2
) )
self.assertEqual( self.assertEqual(
mock_provider.client.Universe.post_universe_names.call_count, 2 mock_provider.client.Universe.post_universe_names.call_count, 2
) )
@ -175,7 +175,7 @@ class TestRunModelUpdate(TestCase):
self.assertEqual(mock_update_alliance.apply_async.call_count, 1) self.assertEqual(mock_update_alliance.apply_async.call_count, 1)
self.assertEqual( self.assertEqual(
int(mock_update_alliance.apply_async.call_args[1]['args'][0]), 3456 int(mock_update_alliance.apply_async.call_args[1]['args'][0]), 3456
) )
characters_updated = { characters_updated = {
x[1]['args'][0] for x in mock_update_character.apply_async.call_args_list x[1]['args'][0] for x in mock_update_character.apply_async.call_args_list
} }
@ -203,9 +203,9 @@ class TestRunModelUpdate(TestCase):
mock_provider.client.Character.post_characters_affiliation.side_effect \ mock_provider.client.Character.post_characters_affiliation.side_effect \
= get_affiliations = get_affiliations
mock_provider.client.Universe.post_universe_names.side_effect = get_names mock_provider.client.Universe.post_universe_names.side_effect = get_names
run_model_update() run_model_update()
characters_updated = { characters_updated = {
x[1]['args'][0] for x in mock_update_character.apply_async.call_args_list x[1]['args'][0] for x in mock_update_character.apply_async.call_args_list
@ -234,9 +234,9 @@ class TestRunModelUpdate(TestCase):
mock_provider.client.Character.post_characters_affiliation.side_effect \ mock_provider.client.Character.post_characters_affiliation.side_effect \
= get_affiliations = get_affiliations
mock_provider.client.Universe.post_universe_names.side_effect = get_names mock_provider.client.Universe.post_universe_names.side_effect = get_names
run_model_update() run_model_update()
characters_updated = { characters_updated = {
x[1]['args'][0] for x in mock_update_character.apply_async.call_args_list x[1]['args'][0] for x in mock_update_character.apply_async.call_args_list

View File

@ -1,2 +0,0 @@

View File

@ -5,6 +5,4 @@ from django.utils.translation import ugettext_lazy as _
class FatlinkForm(forms.Form): class FatlinkForm(forms.Form):
fleet = forms.CharField(label=_("Fleet Name"), max_length=50) fleet = forms.CharField(label=_("Fleet Name"), max_length=50)
duration = forms.IntegerField(label=_("Duration of fat-link"), required=True, initial=30, min_value=1, duration = forms.IntegerField(label=_("Duration of fat-link"), required=True, initial=30, min_value=1, max_value=2147483647, help_text=_('minutes'))
max_value=2147483647, help_text=_('minutes'))

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-05 21:39 # Generated by Django 1.10.1 on 2016-09-05 21:39
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-05 22:20 # Generated by Django 1.10.1 on 2016-09-05 22:20
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.1 on 2016-09-06 23:54 # Generated by Django 1.10.1 on 2016-09-06 23:54
from __future__ import unicode_literals from __future__ import unicode_literals

View File

@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.10.5 on 2017-03-22 23:35 # Generated by Django 1.10.5 on 2017-03-22 23:35
from __future__ import unicode_literals from __future__ import unicode_literals

File diff suppressed because one or more lines are too long

View File

@ -12,7 +12,7 @@
<div class="panel-heading">{{ character_name }}</div> <div class="panel-heading">{{ character_name }}</div>
<div class="panel-body"> <div class="panel-body">
<div class="col-lg-2 col-sm-2"> <div class="col-lg-2 col-sm-2">
<img class="ra-avatar img-responsive" src="{{ character_portrait_url }}"> <img class="ra-avatar img-responsive" src="{{ character_portrait_url }}">
</div> </div>
<div class="col-lg-10 col-sm-2"> <div class="col-lg-10 col-sm-2">
<div class="alert alert-danger" role="alert">{% trans "Character not registered!" %}</div> <div class="alert alert-danger" role="alert">{% trans "Character not registered!" %}</div>

View File

@ -30,4 +30,3 @@
</div> </div>
{% endblock content %} {% endblock content %}

View File

@ -23,7 +23,7 @@
<th class="col-md-2 text-center">{% trans "Characters" %}</th> <th class="col-md-2 text-center">{% trans "Characters" %}</th>
<th class="col-md-2 text-center">{% trans "Fats" %}</th> <th class="col-md-2 text-center">{% trans "Fats" %}</th>
<th class="col-md-2 text-center">{% trans "Average fats" %} <th class="col-md-2 text-center">{% trans "Average fats" %}
<i class="glyphicon glyphicon-question-sign" rel="tooltip" title="Fats ÷ Characters"></i> <i class="glyphicon glyphicon-question-sign" rel="tooltip" title="Fats ÷ Characters"></i>
</th> </th>
</tr> </tr>
{% for memberStat in fatStats %} {% for memberStat in fatStats %}

Some files were not shown because too many files have changed in this diff Show More