Compare commits

..

12 Commits

Author SHA1 Message Date
Ariel Rin
297f98f046 Version Bump 2.15.1 2022-07-19 19:07:47 +10:00
Ariel Rin
27dad05927 Merge branch 'fix-discord-update-username' into 'master'
Fix discord update username

See merge request allianceauth/allianceauth!1442
2022-07-19 08:48:26 +00:00
Erik Kalkoken
697e9dd772 Fix discord update username 2022-07-19 08:48:25 +00:00
Ariel Rin
65f2efc890 Version Bump 2.15.0 2022-07-18 19:22:50 +10:00
Ariel Rin
def30900b4 Merge branch 'discord_bugfixes_and_refactor' into 'master'
Fix managed roles and reserved groups bugs in Discord Service and more

Closes #1345 and #1334

See merge request allianceauth/allianceauth!1429
2022-07-18 09:12:32 +00:00
Erik Kalkoken
d7fabccddd Fix managed roles and reserved groups bugs in Discord Service and more 2022-07-18 09:12:32 +00:00
Ariel Rin
45289e1d17 Merge branch 'fix-filterdropdown-bug' into 'master'
Fix filterdropdown bug

See merge request allianceauth/allianceauth!1439
2022-07-18 09:04:35 +00:00
ErikKalkoken
7b9bf08aa3 Fix bug in filterDropDown bundle 2022-07-15 13:39:48 +02:00
Ariel Rin
def6431052 Version Bump 2.14.0 2022-07-11 14:27:49 +10:00
Ariel Rin
22a270aedb Merge branch 'filterdropdown-backwards-compatibility' into 'master'
Add filterdropdown bundle to AA2 to ensure backwards compatibility

See merge request allianceauth/allianceauth!1437
2022-07-11 04:15:25 +00:00
Peter Pfeufer
c930f7bbeb Also adds timers.js, eve-time.js and refresh_notifications.js
As these seem to be used in some apps as well
2022-07-09 15:57:43 +02:00
Peter Pfeufer
64ee273953 Add filterdropdown bundle to AA2 to ensure backwards compatibility 2022-07-09 13:43:05 +02:00
249 changed files with 3758 additions and 2873 deletions

View File

@@ -5,16 +5,15 @@
- merge_requests - merge_requests
stages: stages:
- pre-commit - pre-commit
- gitlab - gitlab
- test - test
- deploy - deploy
- docker - docker
include: include:
- template: Dependency-Scanning.gitlab-ci.yml - template: Dependency-Scanning.gitlab-ci.yml
- template: Security/SAST.gitlab-ci.yml - template: Security/SAST.gitlab-ci.yml
- template: Security/Secret-Detection.gitlab-ci.yml
before_script: before_script:
- apt-get update && apt-get install redis-server -y - apt-get update && apt-get install redis-server -y
@@ -25,7 +24,7 @@ before_script:
pre-commit-check: pre-commit-check:
<<: *only-default <<: *only-default
stage: pre-commit stage: pre-commit
image: python:3.8-bullseye image: python:3.6-buster
variables: variables:
PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
cache: cache:
@@ -42,20 +41,28 @@ sast:
dependency_scanning: dependency_scanning:
stage: gitlab stage: gitlab
before_script: before_script:
- apt-get update && apt-get install redis-server libmariadb-dev -y - apt-get update && apt-get install redis-server libmariadb-dev -y
- redis-server --daemonize yes - redis-server --daemonize yes
- python -V - python -V
- pip install wheel tox - pip install wheel tox
secret_detection: test-3.7-core:
stage: gitlab <<: *only-default
before_script: [] image: python:3.7-bullseye
script:
- tox -e py37-core
artifacts:
when: always
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml
test-3.8-core: test-3.8-core:
<<: *only-default <<: *only-default
image: python:3.8-bullseye image: python:3.8-bullseye
script: script:
- tox -e py38-core - tox -e py38-core
artifacts: artifacts:
when: always when: always
reports: reports:
@@ -67,7 +74,7 @@ test-3.9-core:
<<: *only-default <<: *only-default
image: python:3.9-bullseye image: python:3.9-bullseye
script: script:
- tox -e py39-core - tox -e py39-core
artifacts: artifacts:
when: always when: always
reports: reports:
@@ -79,7 +86,7 @@ test-3.10-core:
<<: *only-default <<: *only-default
image: python:3.10-bullseye image: python:3.10-bullseye
script: script:
- tox -e py310-core - tox -e py310-core
artifacts: artifacts:
when: always when: always
reports: reports:
@@ -91,7 +98,7 @@ test-3.11-core:
<<: *only-default <<: *only-default
image: python:3.11-rc-bullseye image: python:3.11-rc-bullseye
script: script:
- tox -e py311-core - tox -e py311-core
artifacts: artifacts:
when: always when: always
reports: reports:
@@ -100,11 +107,23 @@ test-3.11-core:
path: coverage.xml path: coverage.xml
allow_failure: true allow_failure: true
test-3.7-all:
<<: *only-default
image: python:3.7-bullseye
script:
- tox -e py37-all
artifacts:
when: always
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml
test-3.8-all: test-3.8-all:
<<: *only-default <<: *only-default
image: python:3.8-bullseye image: python:3.8-bullseye
script: script:
- tox -e py38-all - tox -e py38-all
artifacts: artifacts:
when: always when: always
reports: reports:
@@ -116,7 +135,7 @@ test-3.9-all:
<<: *only-default <<: *only-default
image: python:3.9-bullseye image: python:3.9-bullseye
script: script:
- tox -e py39-all - tox -e py39-all
artifacts: artifacts:
when: always when: always
reports: reports:
@@ -128,7 +147,7 @@ test-3.10-all:
<<: *only-default <<: *only-default
image: python:3.10-bullseye image: python:3.10-bullseye
script: script:
- tox -e py310-all - tox -e py310-all
artifacts: artifacts:
when: always when: always
reports: reports:
@@ -140,7 +159,7 @@ test-3.11-all:
<<: *only-default <<: *only-default
image: python:3.11-rc-bullseye image: python:3.11-rc-bullseye
script: script:
- tox -e py311-all - tox -e py311-all
artifacts: artifacts:
when: always when: always
reports: reports:
@@ -149,28 +168,9 @@ test-3.11-all:
path: coverage.xml path: coverage.xml
allow_failure: true allow_failure: true
build-test:
stage: test
image: python:3.10-bullseye
before_script:
- python -m pip install --upgrade pip
- python -m pip install --upgrade build
- python -m pip install --upgrade setuptools wheel
script:
- python -m build
artifacts:
when: always
name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
paths:
- dist/*
expire_in: 1 year
test-docs: test-docs:
<<: *only-default <<: *only-default
image: python:3.10-bullseye image: python:3.9-bullseye
script: script:
- tox -e docs - tox -e docs
@@ -179,13 +179,11 @@ deploy_production:
image: python:3.10-bullseye image: python:3.10-bullseye
before_script: before_script:
- python -m pip install --upgrade pip - pip install twine wheel
- python -m pip install --upgrade build
- python -m pip install --upgrade setuptools wheel twine
script: script:
- python -m build - python setup.py sdist bdist_wheel
- python -m twine upload dist/* - twine upload dist/*
rules: rules:
- if: $CI_COMMIT_TAG - if: $CI_COMMIT_TAG

View File

@@ -5,7 +5,7 @@
repos: repos:
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0 rev: v4.0.1
hooks: hooks:
- id: check-case-conflict - id: check-case-conflict
- id: check-json - id: check-json
@@ -22,18 +22,13 @@ repos:
args: [ '--remove' ] args: [ '--remove' ]
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python - repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 2.4.0 rev: 2.3.54
hooks: hooks:
- id: editorconfig-checker - id: editorconfig-checker
exclude: ^(LICENSE|allianceauth\/static\/allianceauth\/css\/themes\/bootstrap-locals.less|allianceauth\/eveonline\/swagger.json|(.*.po)|(.*.mo)) exclude: ^(LICENSE|allianceauth\/static\/css\/themes\/bootstrap-locals.less|allianceauth\/eveonline\/swagger.json|(.*.po)|(.*.mo))
- repo: https://github.com/asottile/pyupgrade - repo: https://github.com/asottile/pyupgrade
rev: v2.34.0 rev: v2.29.0
hooks: hooks:
- id: pyupgrade - id: pyupgrade
args: [ --py38-plus ] args: [ --py37-plus ]
- repo: https://github.com/asottile/setup-cfg-fmt
rev: v1.20.1
hooks:
- id: setup-cfg-fmt

View File

@@ -5,22 +5,19 @@
# Required # Required
version: 2 version: 2
# Set the version of Python and other tools you might need
build:
os: ubuntu-20.04
apt_packages:
- redis
tools:
python: "3.10"
# Build documentation in the docs/ directory with Sphinx # Build documentation in the docs/ directory with Sphinx
sphinx: sphinx:
configuration: docs/conf.py configuration: docs/conf.py
# Build documentation with MkDocs
#mkdocs:
# configuration: mkdocs.yml
# Optionally build your docs in additional formats such as PDF and ePub # Optionally build your docs in additional formats such as PDF and ePub
formats: all formats: all
# Optionally set the version of Python and requirements required to build your docs # Optionally set the version of Python and requirements required to build your docs
python: python:
version: 3.7
install: install:
- requirements: docs/requirements.txt - requirements: docs/requirements.txt

7
MANIFEST.in Normal file
View File

@@ -0,0 +1,7 @@
include LICENSE
include README.md
include MANIFEST.in
graft allianceauth
global-exclude __pycache__
global-exclude *.py[co]

View File

@@ -1,7 +1,8 @@
# This will make sure the app is always imported when # This will make sure the app is always imported when
# Django starts so that shared_task will use this app. # Django starts so that shared_task will use this app.
__version__ = '3.0.0b3' __version__ = '2.15.1'
__title__ = 'Alliance Auth' __title__ = 'Alliance Auth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth' __url__ = 'https://gitlab.com/allianceauth/allianceauth'
NAME = f'{__title__} v{__version__}' NAME = f'{__title__} v{__version__}'
default_app_config = 'allianceauth.apps.AllianceAuthConfig'

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.analytics.apps.AnalyticsConfig'

View File

@@ -3,16 +3,17 @@ from urllib.parse import parse_qs
import requests_mock import requests_mock
from django.test import TestCase, override_settings from django.test import override_settings
from allianceauth.analytics.tasks import ANALYTICS_URL from allianceauth.analytics.tasks import ANALYTICS_URL
from allianceauth.eveonline.tasks import update_character from allianceauth.eveonline.tasks import update_character
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from allianceauth.utils.testing import NoSocketsTestCase
@override_settings(CELERY_ALWAYS_EAGER=True) @override_settings(CELERY_ALWAYS_EAGER=True)
@requests_mock.mock() @requests_mock.mock()
class TestAnalyticsForViews(TestCase): class TestAnalyticsForViews(NoSocketsTestCase):
@override_settings(ANALYTICS_DISABLED=False) @override_settings(ANALYTICS_DISABLED=False)
def test_should_run_analytics(self, requests_mocker): def test_should_run_analytics(self, requests_mocker):
# given # given
@@ -40,7 +41,7 @@ class TestAnalyticsForViews(TestCase):
@override_settings(CELERY_ALWAYS_EAGER=True) @override_settings(CELERY_ALWAYS_EAGER=True)
@requests_mock.mock() @requests_mock.mock()
class TestAnalyticsForTasks(TestCase): class TestAnalyticsForTasks(NoSocketsTestCase):
@override_settings(ANALYTICS_DISABLED=False) @override_settings(ANALYTICS_DISABLED=False)
@patch("allianceauth.eveonline.models.EveCharacter.objects.update_character") @patch("allianceauth.eveonline.models.EveCharacter.objects.update_character")
def test_should_run_analytics_for_successful_task( def test_should_run_analytics_for_successful_task(

View File

@@ -1,6 +1,5 @@
from allianceauth.analytics.middleware import AnalyticsMiddleware from allianceauth.analytics.middleware import AnalyticsMiddleware
from unittest.mock import Mock from unittest.mock import Mock
from django.http import HttpResponse
from django.test.testcases import TestCase from django.test.testcases import TestCase
@@ -8,7 +7,7 @@ from django.test.testcases import TestCase
class TestAnalyticsMiddleware(TestCase): class TestAnalyticsMiddleware(TestCase):
def setUp(self): def setUp(self):
self.middleware = AnalyticsMiddleware(HttpResponse) self.middleware = AnalyticsMiddleware()
self.request = Mock() self.request = Mock()
self.request.headers = { self.request.headers = {
"User-Agent": "AUTOMATED TEST" "User-Agent": "AUTOMATED TEST"

View File

@@ -1,12 +1,22 @@
import requests_mock
from django.test.utils import override_settings
from allianceauth.analytics.tasks import ( from allianceauth.analytics.tasks import (
analytics_event, analytics_event,
send_ga_tracking_celery_event, send_ga_tracking_celery_event,
send_ga_tracking_web_view) send_ga_tracking_web_view)
from django.test.testcases import TestCase from allianceauth.utils.testing import NoSocketsTestCase
class TestAnalyticsTasks(TestCase): GOOGLE_ANALYTICS_DEBUG_URL = 'https://www.google-analytics.com/debug/collect'
def test_analytics_event(self):
@override_settings(CELERY_ALWAYS_EAGER=True, CELERY_EAGER_PROPAGATES_EXCEPTIONS=True)
@requests_mock.Mocker()
class TestAnalyticsTasks(NoSocketsTestCase):
def test_analytics_event(self, requests_mocker):
requests_mocker.register_uri('POST', GOOGLE_ANALYTICS_DEBUG_URL)
analytics_event( analytics_event(
category='allianceauth.analytics', category='allianceauth.analytics',
action='send_tests', action='send_tests',
@@ -14,15 +24,19 @@ class TestAnalyticsTasks(TestCase):
value=1, value=1,
event_type='Stats') event_type='Stats')
def test_send_ga_tracking_web_view_sent(self): def test_send_ga_tracking_web_view_sent(self, requests_mocker):
# This test sends if the event SENDS to google """This test sends if the event SENDS to google.
# Not if it was successful Not if it was successful.
"""
# given
requests_mocker.register_uri('POST', GOOGLE_ANALYTICS_DEBUG_URL)
tracking_id = 'UA-186249766-2' tracking_id = 'UA-186249766-2'
client_id = 'ab33e241fbf042b6aa77c7655a768af7' client_id = 'ab33e241fbf042b6aa77c7655a768af7'
page = '/index/' page = '/index/'
title = 'Hello World' title = 'Hello World'
locale = 'en' locale = 'en'
useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
# when
response = send_ga_tracking_web_view( response = send_ga_tracking_web_view(
tracking_id, tracking_id,
client_id, client_id,
@@ -30,15 +44,23 @@ class TestAnalyticsTasks(TestCase):
title, title,
locale, locale,
useragent) useragent)
# then
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_send_ga_tracking_web_view_success(self): def test_send_ga_tracking_web_view_success(self, requests_mocker):
# given
requests_mocker.register_uri(
'POST',
GOOGLE_ANALYTICS_DEBUG_URL,
json={"hitParsingResult":[{'valid': True}]}
)
tracking_id = 'UA-186249766-2' tracking_id = 'UA-186249766-2'
client_id = 'ab33e241fbf042b6aa77c7655a768af7' client_id = 'ab33e241fbf042b6aa77c7655a768af7'
page = '/index/' page = '/index/'
title = 'Hello World' title = 'Hello World'
locale = 'en' locale = 'en'
useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
# when
json_response = send_ga_tracking_web_view( json_response = send_ga_tracking_web_view(
tracking_id, tracking_id,
client_id, client_id,
@@ -46,15 +68,42 @@ class TestAnalyticsTasks(TestCase):
title, title,
locale, locale,
useragent).json() useragent).json()
# then
self.assertTrue(json_response["hitParsingResult"][0]["valid"]) self.assertTrue(json_response["hitParsingResult"][0]["valid"])
def test_send_ga_tracking_web_view_invalid_token(self): def test_send_ga_tracking_web_view_invalid_token(self, requests_mocker):
# given
requests_mocker.register_uri(
'POST',
GOOGLE_ANALYTICS_DEBUG_URL,
json={
"hitParsingResult":[
{
'valid': False,
'parserMessage': [
{
'messageType': 'INFO',
'description': 'IP Address from this hit was anonymized to 1.132.110.0.',
'messageCode': 'VALUE_MODIFIED'
},
{
'messageType': 'ERROR',
'description': "The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details.",
'messageCode': 'VALUE_INVALID', 'parameter': 'tid'
}
],
'hit': '/debug/collect?v=1&tid=UA-IntentionallyBadTrackingID-2&cid=ab33e241fbf042b6aa77c7655a768af7&t=pageview&dp=/index/&dt=Hello World&ul=en&ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36&aip=1&an=allianceauth&av=2.9.0a2'
}
]
}
)
tracking_id = 'UA-IntentionallyBadTrackingID-2' tracking_id = 'UA-IntentionallyBadTrackingID-2'
client_id = 'ab33e241fbf042b6aa77c7655a768af7' client_id = 'ab33e241fbf042b6aa77c7655a768af7'
page = '/index/' page = '/index/'
title = 'Hello World' title = 'Hello World'
locale = 'en' locale = 'en'
useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36" useragent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
# when
json_response = send_ga_tracking_web_view( json_response = send_ga_tracking_web_view(
tracking_id, tracking_id,
client_id, client_id,
@@ -62,18 +111,25 @@ class TestAnalyticsTasks(TestCase):
title, title,
locale, locale,
useragent).json() useragent).json()
# then
self.assertFalse(json_response["hitParsingResult"][0]["valid"]) self.assertFalse(json_response["hitParsingResult"][0]["valid"])
self.assertEqual(json_response["hitParsingResult"][0]["parserMessage"][1]["description"], "The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details.") self.assertEqual(
json_response["hitParsingResult"][0]["parserMessage"][1]["description"],
"The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details."
)
# [{'valid': False, 'parserMessage': [{'messageType': 'INFO', 'description': 'IP Address from this hit was anonymized to 1.132.110.0.', 'messageCode': 'VALUE_MODIFIED'}, {'messageType': 'ERROR', 'description': "The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details.", 'messageCode': 'VALUE_INVALID', 'parameter': 'tid'}], 'hit': '/debug/collect?v=1&tid=UA-IntentionallyBadTrackingID-2&cid=ab33e241fbf042b6aa77c7655a768af7&t=pageview&dp=/index/&dt=Hello World&ul=en&ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36&aip=1&an=allianceauth&av=2.9.0a2'}] # [{'valid': False, 'parserMessage': [{'messageType': 'INFO', 'description': 'IP Address from this hit was anonymized to 1.132.110.0.', 'messageCode': 'VALUE_MODIFIED'}, {'messageType': 'ERROR', 'description': "The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details.", 'messageCode': 'VALUE_INVALID', 'parameter': 'tid'}], 'hit': '/debug/collect?v=1&tid=UA-IntentionallyBadTrackingID-2&cid=ab33e241fbf042b6aa77c7655a768af7&t=pageview&dp=/index/&dt=Hello World&ul=en&ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36&aip=1&an=allianceauth&av=2.9.0a2'}]
def test_send_ga_tracking_celery_event_sent(self): def test_send_ga_tracking_celery_event_sent(self, requests_mocker):
# given
requests_mocker.register_uri('POST', GOOGLE_ANALYTICS_DEBUG_URL)
tracking_id = 'UA-186249766-2' tracking_id = 'UA-186249766-2'
client_id = 'ab33e241fbf042b6aa77c7655a768af7' client_id = 'ab33e241fbf042b6aa77c7655a768af7'
category = 'test' category = 'test'
action = 'test' action = 'test'
label = 'test' label = 'test'
value = '1' value = '1'
# when
response = send_ga_tracking_celery_event( response = send_ga_tracking_celery_event(
tracking_id, tracking_id,
client_id, client_id,
@@ -81,15 +137,23 @@ class TestAnalyticsTasks(TestCase):
action, action,
label, label,
value) value)
# then
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_send_ga_tracking_celery_event_success(self): def test_send_ga_tracking_celery_event_success(self, requests_mocker):
# given
requests_mocker.register_uri(
'POST',
GOOGLE_ANALYTICS_DEBUG_URL,
json={"hitParsingResult":[{'valid': True}]}
)
tracking_id = 'UA-186249766-2' tracking_id = 'UA-186249766-2'
client_id = 'ab33e241fbf042b6aa77c7655a768af7' client_id = 'ab33e241fbf042b6aa77c7655a768af7'
category = 'test' category = 'test'
action = 'test' action = 'test'
label = 'test' label = 'test'
value = '1' value = '1'
# when
json_response = send_ga_tracking_celery_event( json_response = send_ga_tracking_celery_event(
tracking_id, tracking_id,
client_id, client_id,
@@ -97,15 +161,42 @@ class TestAnalyticsTasks(TestCase):
action, action,
label, label,
value).json() value).json()
# then
self.assertTrue(json_response["hitParsingResult"][0]["valid"]) self.assertTrue(json_response["hitParsingResult"][0]["valid"])
def test_send_ga_tracking_celery_event_invalid_token(self): def test_send_ga_tracking_celery_event_invalid_token(self, requests_mocker):
# given
requests_mocker.register_uri(
'POST',
GOOGLE_ANALYTICS_DEBUG_URL,
json={
"hitParsingResult":[
{
'valid': False,
'parserMessage': [
{
'messageType': 'INFO',
'description': 'IP Address from this hit was anonymized to 1.132.110.0.',
'messageCode': 'VALUE_MODIFIED'
},
{
'messageType': 'ERROR',
'description': "The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details.",
'messageCode': 'VALUE_INVALID', 'parameter': 'tid'
}
],
'hit': '/debug/collect?v=1&tid=UA-IntentionallyBadTrackingID-2&cid=ab33e241fbf042b6aa77c7655a768af7&t=pageview&dp=/index/&dt=Hello World&ul=en&ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36&aip=1&an=allianceauth&av=2.9.0a2'
}
]
}
)
tracking_id = 'UA-IntentionallyBadTrackingID-2' tracking_id = 'UA-IntentionallyBadTrackingID-2'
client_id = 'ab33e241fbf042b6aa77c7655a768af7' client_id = 'ab33e241fbf042b6aa77c7655a768af7'
category = 'test' category = 'test'
action = 'test' action = 'test'
label = 'test' label = 'test'
value = '1' value = '1'
# when
json_response = send_ga_tracking_celery_event( json_response = send_ga_tracking_celery_event(
tracking_id, tracking_id,
client_id, client_id,
@@ -113,7 +204,9 @@ class TestAnalyticsTasks(TestCase):
action, action,
label, label,
value).json() value).json()
# then
self.assertFalse(json_response["hitParsingResult"][0]["valid"]) self.assertFalse(json_response["hitParsingResult"][0]["valid"])
self.assertEqual(json_response["hitParsingResult"][0]["parserMessage"][1]["description"], "The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details.") self.assertEqual(
json_response["hitParsingResult"][0]["parserMessage"][1]["description"],
# [{'valid': False, 'parserMessage': [{'messageType': 'INFO', 'description': 'IP Address from this hit was anonymized to 1.132.110.0.', 'messageCode': 'VALUE_MODIFIED'}, {'messageType': 'ERROR', 'description': "The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details.", 'messageCode': 'VALUE_INVALID', 'parameter': 'tid'}], 'hit': '/debug/collect?v=1&tid=UA-IntentionallyBadTrackingID-2&cid=ab33e241fbf042b6aa77c7655a768af7&t=pageview&dp=/index/&dt=Hello World&ul=en&ua=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36&aip=1&an=allianceauth&av=2.9.0a2'}] "The value provided for parameter 'tid' is invalid. Please see http://goo.gl/a8d4RP#tid for details."
)

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.authentication.apps.AuthenticationConfig'

View File

@@ -322,7 +322,7 @@ class UserAdmin(BaseUserAdmin):
class Media: class Media:
css = { css = {
"all": ("allianceauth/authentication/css/admin.css",) "all": ("authentication/css/admin.css",)
} }
def get_queryset(self, request): def get_queryset(self, request):
@@ -542,7 +542,7 @@ class BaseOwnershipAdmin(admin.ModelAdmin):
class Media: class Media:
css = { css = {
"all": ("allianceauth/authentication/css/admin.css",) "all": ("authentication/css/admin.css",)
} }
def get_readonly_fields(self, request, obj=None): def get_readonly_fields(self, request, obj=None):

View File

@@ -1,16 +1,14 @@
from django.conf.urls import include from django.conf.urls import url, include
from allianceauth.authentication import views from allianceauth.authentication import views
from django.urls import re_path
from django.urls import path
urlpatterns = [ urlpatterns = [
path('activate/complete/', views.activation_complete, name='registration_activation_complete'), url(r'^activate/complete/$', views.activation_complete, name='registration_activation_complete'),
# The activation key can make use of any character from the # The activation key can make use of any character from the
# URL-safe base64 alphabet, plus the colon as a separator. # URL-safe base64 alphabet, plus the colon as a separator.
re_path(r'^activate/(?P<activation_key>[-:\w]+)/$', views.ActivationView.as_view(), name='registration_activate'), url(r'^activate/(?P<activation_key>[-:\w]+)/$', views.ActivationView.as_view(), name='registration_activate'),
path('register/', views.RegistrationView.as_view(), name='registration_register'), url(r'^register/$', views.RegistrationView.as_view(), name='registration_register'),
path('register/complete/', views.registration_complete, name='registration_complete'), url(r'^register/complete/$', views.registration_complete, name='registration_complete'),
path('register/closed/', views.registration_closed, name='registration_disallowed'), url(r'^register/closed/$', views.registration_closed, name='registration_disallowed'),
path('', include('django.contrib.auth.urls')), url(r'', include('django.contrib.auth.urls')),
] ]

View File

@@ -1,45 +0,0 @@
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
import logging
logger = logging.getLogger(__name__)
class UserSettingsMiddleware(MiddlewareMixin):
def process_response(self, request, response):
"""Django Middleware: User Settings."""
# Intercept the built in django /setlang/ view and also save it to Database.
# Note the annoymous user check, only logged in users will ever hit the DB here
if request.path == '/i18n/setlang/' and not request.user.is_anonymous:
try:
request.user.profile.language = request.POST['language']
request.user.profile.save()
except Exception as e:
logger.exception(e)
# Only act during the login flow, _after_ user is activated (step 2: post-sso)
elif request.path == '/sso/login' and not request.user.is_anonymous:
# Set the Language Cookie, if it doesnt match the DB
# Null = hasnt been set by the user ever, dont act.
try:
if request.user.profile.language != request.LANGUAGE_CODE and request.user.profile.language is not None:
response.set_cookie(key=settings.LANGUAGE_COOKIE_NAME,
value=request.user.profile.language,
max_age=settings.LANGUAGE_COOKIE_AGE)
except Exception as e:
logger.exception(e)
# Set our Night mode flag from the DB
# Null = hasnt been set by the user ever, dont act.
#
# Night mode intercept is not needed in this middleware.
# is saved direct to DB in NightModeRedirectView
try:
if request.user.profile.night_mode is not None:
request.session["NIGHT_MODE"] = request.user.profile.night_mode
except Exception as e:
logger.exception(e)
return response

View File

@@ -1,23 +0,0 @@
# Generated by Django 4.0.2 on 2022-02-26 03:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('authentication', '0019_merge_20211026_0919'),
]
operations = [
migrations.AddField(
model_name='userprofile',
name='language',
field=models.CharField(blank=True, choices=[('en', 'English'), ('de', 'German'), ('es', 'Spanish'), ('zh-hans', 'Chinese Simplified'), ('ru', 'Russian'), ('ko', 'Korean'), ('fr', 'French'), ('ja', 'Japanese'), ('it', 'Italian')], default='', max_length=10, verbose_name='Language'),
),
migrations.AddField(
model_name='userprofile',
name='night_mode',
field=models.BooleanField(blank=True, null=True, verbose_name='Night Mode'),
),
]

View File

@@ -2,10 +2,9 @@ import logging
from django.contrib.auth.models import User, Permission from django.contrib.auth.models import User, Permission
from django.db import models, transaction from django.db import models, transaction
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo, EveAllianceInfo, EveFactionInfo from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo, EveAllianceInfo, EveFactionInfo
from allianceauth.notifications import notify from allianceauth.notifications import notify
from django.conf import settings
from .managers import CharacterOwnershipManager, StateManager from .managers import CharacterOwnershipManager, StateManager
@@ -63,39 +62,9 @@ class UserProfile(models.Model):
class Meta: class Meta:
default_permissions = ('change',) default_permissions = ('change',)
user = models.OneToOneField( user = models.OneToOneField(User, related_name='profile', on_delete=models.CASCADE)
User, main_character = models.OneToOneField(EveCharacter, blank=True, null=True, on_delete=models.SET_NULL)
related_name='profile', state = models.ForeignKey(State, on_delete=models.SET_DEFAULT, default=get_guest_state_pk)
on_delete=models.CASCADE)
main_character = models.OneToOneField(
EveCharacter,
blank=True,
null=True,
on_delete=models.SET_NULL)
state = models.ForeignKey(
State,
on_delete=models.SET_DEFAULT,
default=get_guest_state_pk)
LANGUAGE_CHOICES = [
('en', _('English')),
('de', _('German')),
('es', _('Spanish')),
('zh-hans', _('Chinese Simplified')),
('ru', _('Russian')),
('ko', _('Korean')),
('fr', _('French')),
('ja', _('Japanese')),
('it', _('Italian')),
]
language = models.CharField(
_("Language"), max_length=10,
choices=LANGUAGE_CHOICES,
blank=True,
default='')
night_mode = models.BooleanField(
_("Night Mode"),
blank=True,
null=True)
def assign_state(self, state=None, commit=True): def assign_state(self, state=None, commit=True):
if not state: if not state:
@@ -124,6 +93,8 @@ class UserProfile(models.Model):
def __str__(self): def __str__(self):
return str(self.user) return str(self.user)
class CharacterOwnership(models.Model): class CharacterOwnership(models.Model):
class Meta: class Meta:
default_permissions = ('change', 'delete') default_permissions = ('change', 'delete')

View File

@@ -1,11 +1,6 @@
import logging import logging
from .models import ( from .models import CharacterOwnership, UserProfile, get_guest_state, State, OwnershipRecord
CharacterOwnership,
UserProfile,
get_guest_state,
State,
OwnershipRecord)
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db.models import Q from django.db.models import Q
from django.db.models.signals import pre_save, post_save, pre_delete, post_delete, m2m_changed from django.db.models.signals import pre_save, post_save, pre_delete, post_delete, m2m_changed
@@ -16,7 +11,7 @@ from allianceauth.eveonline.models import EveCharacter
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
state_changed = Signal() state_changed = Signal(providing_args=['user', 'state'])
def trigger_state_check(state): def trigger_state_check(state):
@@ -76,7 +71,7 @@ def reassess_on_profile_save(sender, instance, created, *args, **kwargs):
@receiver(post_save, sender=User) @receiver(post_save, sender=User)
def create_required_models(sender, instance, created, *args, **kwargs): def create_required_models(sender, instance, created, *args, **kwargs):
# ensure all users have our Sub-Models # ensure all users have a model
if created: if created:
logger.debug(f'User {instance} created. Creating default UserProfile.') logger.debug(f'User {instance} created. Creating default UserProfile.')
UserProfile.objects.get_or_create(user=instance) UserProfile.objects.get_or_create(user=instance)

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Dashboard" %}{% endblock %} {% block page_title %}{% translate "Dashboard" %}{% endblock %}
@@ -27,7 +28,7 @@
<table class="table"> <table class="table">
<tr> <tr>
<td class="text-center"> <td class="text-center">
<img class="ra-avatar" src="{{ main.portrait_url_128 }}"> <img class="ra-avatar"src="{{ main.portrait_url_128 }}">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -39,7 +40,7 @@
<table class="table"> <table class="table">
<tr> <tr>
<td class="text-center"> <td class="text-center">
<img class="ra-avatar" src="{{ main.corporation_logo_url_128 }}"> <img class="ra-avatar"src="{{ main.corporation_logo_url_128 }}">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -52,7 +53,7 @@
<table class="table"> <table class="table">
<tr> <tr>
<td class="text-center"> <td class="text-center">
<img class="ra-avatar" src="{{ main.alliance_logo_url_128 }}"> <img class="ra-avatar"src="{{ main.alliance_logo_url_128 }}">
</td> </td>
</tr> </tr>
<tr> <tr>
@@ -63,7 +64,7 @@
<table class="table"> <table class="table">
<tr> <tr>
<td class="text-center"> <td class="text-center">
<img class="ra-avatar" src="{{ main.faction_logo_url_128 }}"> <img class="ra-avatar"src="{{ main.faction_logo_url_128 }}">
</td> </td>
</tr> </tr>
<tr> <tr>

View File

@@ -7,7 +7,7 @@
<meta name="description" content=""> <meta name="description" content="">
<meta name="author" content=""> <meta name="author" content="">
<meta property="og:title" content="{{ SITE_NAME }}"> <meta property="og:title" content="{{ SITE_NAME }}">
<meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}{% static 'allianceauth/icons/apple-touch-icon.png' %}"> <meta property="og:image" content="{{ request.scheme }}://{{ request.get_host }}{% static 'icons/apple-touch-icon.png' %}">
<meta property="og:description" content="Alliance Auth - An auth system for EVE Online to help in-game organizations manage online service access."> <meta property="og:description" content="Alliance Auth - An auth system for EVE Online to help in-game organizations manage online service access.">
{% include 'allianceauth/icons.html' %} {% include 'allianceauth/icons.html' %}
@@ -21,7 +21,7 @@
<style> <style>
body { body {
background: url('{% static 'allianceauth/authentication/img/background.jpg' %}') no-repeat center center fixed; background: url('{% static 'authentication/img/background.jpg' %}') no-repeat center center fixed;
-webkit-background-size: cover; -webkit-background-size: cover;
-moz-background-size: cover; -moz-background-size: cover;
-o-background-size: cover; -o-background-size: cover;

View File

@@ -7,6 +7,6 @@
{% 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 'allianceauth/authentication/img/sso/EVE_SSO_Login_Buttons_Large_Black.png' %}"> <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

@@ -1,4 +1,5 @@
{% extends 'public/base.html' %} {% extends 'public/base.html' %}
{% load static %}
{% block content %} {% block content %}
<div class="col-md-4 col-md-offset-4"> <div class="col-md-4 col-md-offset-4">
{% if messages %} {% if messages %}

View File

@@ -1,5 +1,6 @@
{% extends 'public/base.html' %} {% extends 'public/base.html' %}
{% load static %}
{% load bootstrap %} {% load bootstrap %}
{% load i18n %} {% load i18n %}

View File

@@ -0,0 +1,15 @@
{% load i18n %}{% autoescape off %}
{% blocktrans trimmed %}You're receiving this email because you requested a password reset for your
user account.{% endblocktrans %}
{% translate "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{domain}}{% url 'password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
{% translate "Your username, in case you've forgotten:" %} {{ user.get_username }}
{% translate "Thanks for using our site!" %}
{% blocktrans %}Your IT Team{% endblocktrans %}
{% endautoescape %}

View File

@@ -0,0 +1,14 @@
{% extends 'public/middle_box.html' %}
{% load bootstrap %}
{% load i18n %}
{% load static %}
{% block page_title %}{% translate "Register" %}{% endblock %}
{% block middle_box_content %}
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %}
{{ form|bootstrap }}
<br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Submit" %}</button>
<br/>
</form>
{% endblock %}

View File

@@ -1,17 +1,4 @@
from django.db.models.signals import (
m2m_changed,
post_save,
pre_delete,
pre_save
)
from django.urls import reverse from django.urls import reverse
from unittest import mock
MODULE_PATH = 'allianceauth.authentication'
def patch(target, *args, **kwargs):
return mock.patch(f'{MODULE_PATH}{target}', *args, **kwargs)
def get_admin_change_view_url(obj: object) -> str: def get_admin_change_view_url(obj: object) -> str:

View File

@@ -1,175 +0,0 @@
from unittest import mock
from allianceauth.authentication.middleware import UserSettingsMiddleware
from unittest.mock import Mock
from django.http import HttpResponse
from django.test.testcases import TestCase
class TestUserSettingsMiddlewareSaveLang(TestCase):
def setUp(self):
self.middleware = UserSettingsMiddleware(HttpResponse)
self.request = Mock()
self.request.headers = {
"User-Agent": "AUTOMATED TEST"
}
self.request.path = '/i18n/setlang/'
self.request.POST = {
'language': 'fr'
}
self.request.user.profile.language = 'de'
self.request.user.is_anonymous = False
self.response = Mock()
self.response.content = 'hello world'
def test_middleware_passthrough(self):
"""
Simply tests the middleware runs cleanly
"""
response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.response, response)
def test_middleware_save_language_false_anonymous(self):
"""
Ensures the middleware wont change the usersettings
of a non-existent (anonymous) user
"""
self.request.user.is_anonymous = True
response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.request.user.profile.language, 'de')
self.assertFalse(self.request.user.profile.save.called)
self.assertEqual(self.request.user.profile.save.call_count, 0)
def test_middleware_save_language_new(self):
"""
does the middleware change a language not set in the DB
"""
self.request.user.profile.language = None
response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.request.user.profile.language, 'fr')
self.assertTrue(self.request.user.profile.save.called)
self.assertEqual(self.request.user.profile.save.call_count, 1)
def test_middleware_save_language_changed(self):
"""
Tests the middleware will change a language setting
"""
response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.request.user.profile.language, 'fr')
self.assertTrue(self.request.user.profile.save.called)
self.assertEqual(self.request.user.profile.save.call_count, 1)
class TestUserSettingsMiddlewareLoginFlow(TestCase):
def setUp(self):
self.middleware = UserSettingsMiddleware(HttpResponse)
self.request = Mock()
self.request.headers = {
"User-Agent": "AUTOMATED TEST"
}
self.request.path = '/sso/login'
self.request.session = {
'NIGHT_MODE': False
}
self.request.LANGUAGE_CODE = 'en'
self.request.user.profile.language = 'de'
self.request.user.profile.night_mode = True
self.request.user.is_anonymous = False
self.response = Mock()
self.response.content = 'hello world'
def test_middleware_passthrough(self):
"""
Simply tests the middleware runs cleanly
"""
middleware_response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.response, middleware_response)
def test_middleware_sets_language_cookie_true_no_cookie(self):
"""
tests the middleware will set a cookie, while none is set
"""
self.request.LANGUAGE_CODE = None
middleware_response = self.middleware.process_response(
self.request,
self.response
)
self.assertTrue(middleware_response.set_cookie.called)
self.assertEqual(middleware_response.set_cookie.call_count, 1)
args, kwargs = middleware_response.set_cookie.call_args
self.assertEqual(kwargs['value'], 'de')
def test_middleware_sets_language_cookie_true_wrong_cookie(self):
"""
tests the middleware will set a cookie, while a different value is set
"""
middleware_response = self.middleware.process_response(
self.request,
self.response
)
self.assertTrue(middleware_response.set_cookie.called)
self.assertEqual(middleware_response.set_cookie.call_count, 1)
args, kwargs = middleware_response.set_cookie.call_args
self.assertEqual(kwargs['value'], 'de')
def test_middleware_sets_language_cookie_false_anonymous(self):
"""
ensures the middleware wont set a value for a non existent user (anonymous)
"""
self.request.user.is_anonymous = True
middleware_response = self.middleware.process_response(
self.request,
self.response
)
self.assertFalse = middleware_response.set_cookie.called
self.assertEqual(middleware_response.set_cookie.call_count, 0)
def test_middleware_sets_language_cookie_false_already_set(self):
"""
tests the middleware skips setting the cookie, if its already set correctly
"""
self.request.user.profile.language = 'en'
middleware_response = self.middleware.process_response(
self.request,
self.response
)
self.assertFalse = middleware_response.set_cookie.called
self.assertEqual(middleware_response.set_cookie.call_count, 0)
def test_middleware_sets_night_mode_not_set(self):
"""
tests the middleware will set night_mode if not set
"""
self.request.session = {}
response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.request.session["NIGHT_MODE"], True)
def test_middleware_sets_night_mode_set(self):
"""
tests the middleware will set night_mode if set.
"""
response = self.middleware.process_response(
self.request,
self.response
)
self.assertEqual(self.request.session["NIGHT_MODE"], True)

View File

@@ -1,94 +0,0 @@
from allianceauth.authentication.models import User, UserProfile
from allianceauth.eveonline.models import (
EveCharacter,
EveCorporationInfo,
EveAllianceInfo
)
from django.db.models.signals import (
pre_save,
post_save,
pre_delete,
m2m_changed
)
from allianceauth.tests.auth_utils import AuthUtils
from django.test.testcases import TestCase
from unittest.mock import Mock
from . import patch
class TestUserProfileSignals(TestCase):
def setUp(self):
state = AuthUtils.get_member_state()
self.char = EveCharacter.objects.create(
character_id='1234',
character_name='test character',
corporation_id='2345',
corporation_name='test corp',
corporation_ticker='tickr',
alliance_id='3456',
alliance_name='alliance name',
)
self.alliance = EveAllianceInfo.objects.create(
alliance_id='3456',
alliance_name='alliance name',
alliance_ticker='TIKR',
executor_corp_id='2345',
)
self.corp = EveCorporationInfo.objects.create(
corporation_id='2345',
corporation_name='corp name',
corporation_ticker='TIKK',
member_count=10,
alliance=self.alliance,
)
state.member_alliances.add(self.alliance)
state.member_corporations.add(self.corp)
self.member = AuthUtils.create_user('test user')
self.member.profile.main_character = self.char
self.member.profile.save()
@patch('.signals.create_required_models')
def test_create_required_models_triggered_true(
self, create_required_models):
"""
Create a User object here,
to generate UserProfile models
"""
post_save.connect(create_required_models, sender=User)
AuthUtils.create_user('test_create_required_models_triggered')
self.assertTrue = create_required_models.called
self.assertEqual(create_required_models.call_count, 1)
user = User.objects.get(username='test_create_required_models_triggered')
self.assertIsNot(UserProfile.objects.get(user=user), False)
@patch('.signals.create_required_models')
def test_create_required_models_triggered_false(
self, create_required_models):
"""
Only call a User object Update here,
which does not need to generate UserProfile models
"""
post_save.connect(create_required_models, sender=User)
char = EveCharacter.objects.create(
character_id='1266',
character_name='test character2',
corporation_id='2345',
corporation_name='test corp',
corporation_ticker='tickr',
alliance_id='3456',
alliance_name='alliance name',
)
self.member.profile.main_character = char
self.member.profile.save()
self.assertTrue = create_required_models.called
self.assertEqual(create_required_models.call_count, 0)
self.assertIsNot(UserProfile.objects.get(user=self.member), False)

View File

@@ -1,4 +1,5 @@
from django.urls import path from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
from . import views from . import views
@@ -6,21 +7,21 @@ from . import views
app_name = 'authentication' app_name = 'authentication'
urlpatterns = [ urlpatterns = [
path('', views.index, name='index'), url(r'^$', views.index, name='index'),
path( url(
'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'
), ),
path( url(
'account/characters/main/', r'^account/characters/main/$',
views.main_character_change, views.main_character_change,
name='change_main_character' name='change_main_character'
), ),
path( url(
'account/characters/add/', r'^account/characters/add/$',
views.add_character, views.add_character,
name='add_character' name='add_character'
), ),
path('dashboard/', views.dashboard, name='dashboard'), url(r'^dashboard/$', views.dashboard, name='dashboard'),
] ]

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.corputils.apps.CorpUtilsConfig'

View File

@@ -1,5 +1,5 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook from allianceauth.services.hooks import MenuItemHook, UrlHook
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks from allianceauth import hooks
from allianceauth.corputils import urls from allianceauth.corputils import urls

View File

@@ -1,11 +1,12 @@
from django.urls import path from django.conf.urls import url
from . import views from . import views
app_name = 'corputils' app_name = 'corputils'
urlpatterns = [ urlpatterns = [
path('', views.corpstats_view, name='view'), url(r'^$', views.corpstats_view, name='view'),
path('add/', views.corpstats_add, name='add'), url(r'^add/$', views.corpstats_add, name='add'),
path('<int:corp_id>/', views.corpstats_view, name='view_corp'), url(r'^(?P<corp_id>(\d)*)/$', views.corpstats_view, name='view_corp'),
path('<int:corp_id>/update/', views.corpstats_update, name='update'), url(r'^(?P<corp_id>(\d)+)/update/$', views.corpstats_update, name='update'),
path('search/', views.corpstats_search, name='search'), url(r'^search/$', views.corpstats_search, name='search'),
] ]

View File

@@ -6,7 +6,7 @@ from django.contrib.auth.decorators import login_required, permission_required,
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
from django.db import IntegrityError from django.db import IntegrityError
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from esi.decorators import token_required from esi.decorators import token_required
from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.eveonline.apps.EveonlineConfig'

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.eveonline.autogroups.apps.EveAutogroupsConfig'

View File

@@ -1,18 +0,0 @@
# Generated by Django 3.2.10 on 2022-01-05 18:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('eveonline', '0015_factions'),
]
operations = [
migrations.AlterField(
model_name='evecharacter',
name='character_name',
field=models.CharField(db_index=True, max_length=254),
),
]

View File

@@ -25,8 +25,6 @@ DOOMHEIM_CORPORATION_ID = 1000001
class EveFactionInfo(models.Model): class EveFactionInfo(models.Model):
"""A faction in Eve Online."""
faction_id = models.PositiveIntegerField(unique=True, db_index=True) faction_id = models.PositiveIntegerField(unique=True, db_index=True)
faction_name = models.CharField(max_length=254, unique=True) faction_name = models.CharField(max_length=254, unique=True)
@@ -68,8 +66,6 @@ class EveFactionInfo(models.Model):
class EveAllianceInfo(models.Model): class EveAllianceInfo(models.Model):
"""An alliance in Eve Online."""
alliance_id = models.PositiveIntegerField(unique=True) alliance_id = models.PositiveIntegerField(unique=True)
alliance_name = models.CharField(max_length=254, unique=True) alliance_name = models.CharField(max_length=254, unique=True)
alliance_ticker = models.CharField(max_length=254) alliance_ticker = models.CharField(max_length=254)
@@ -136,8 +132,6 @@ class EveAllianceInfo(models.Model):
class EveCorporationInfo(models.Model): class EveCorporationInfo(models.Model):
"""A corporation in Eve Online."""
corporation_id = models.PositiveIntegerField(unique=True) corporation_id = models.PositiveIntegerField(unique=True)
corporation_name = models.CharField(max_length=254, unique=True) corporation_name = models.CharField(max_length=254, unique=True)
corporation_ticker = models.CharField(max_length=254) corporation_ticker = models.CharField(max_length=254)
@@ -201,10 +195,9 @@ class EveCorporationInfo(models.Model):
class EveCharacter(models.Model): class EveCharacter(models.Model):
"""A character in Eve Online.""" """Character in Eve Online"""
character_id = models.PositiveIntegerField(unique=True) character_id = models.PositiveIntegerField(unique=True)
character_name = models.CharField(max_length=254, db_index=True) character_name = models.CharField(max_length=254, unique=True)
corporation_id = models.PositiveIntegerField() corporation_id = models.PositiveIntegerField()
corporation_name = models.CharField(max_length=254) corporation_name = models.CharField(max_length=254)
corporation_ticker = models.CharField(max_length=5) corporation_ticker = models.CharField(max_length=5)

View File

@@ -40,7 +40,7 @@ def update_character(character_id: int) -> None:
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(args=[corp['corporation_id']], priority=TASK_PRIORITY) update_corp.apply_async(args=[corp['corporation_id']], priority=TASK_PRIORITY)

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.fleetactivitytracking.apps.FatConfig'

View File

@@ -1,5 +1,5 @@
from . import urls from . import urls
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks from allianceauth import hooks
from allianceauth.services.hooks import MenuItemHook, UrlHook from allianceauth.services.hooks import MenuItemHook, UrlHook

View File

@@ -1,5 +1,5 @@
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
class FatlinkForm(forms.Form): class FatlinkForm(forms.Form):

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Create Fatlink" %}{% endblock page_title %} {% block page_title %}{% translate "Create Fatlink" %}{% endblock page_title %}
@@ -20,7 +21,7 @@
<form class="form-signin" role="form" action="" method="POST"> <form class="form-signin" role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }} {{ form|bootstrap }}
<br> <br/>
<button class="btn btn-lg btn-primary btn-block" type="submit" name="submit_fat">{% translate "Create fatlink" %}</button> <button class="btn btn-lg btn-primary btn-block" type="submit" name="submit_fat">{% translate "Create fatlink" %}</button>
</form> </form>
</div> </div>

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Fatlink view" %}{% endblock page_title %} {% block page_title %}{% translate "Fatlink view" %}{% endblock page_title %}

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Personal fatlink statistics" %}{% endblock page_title %} {% block page_title %}{% translate "Personal fatlink statistics" %}{% endblock page_title %}

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Personal fatlink statistics" %}{% endblock page_title %} {% block page_title %}{% translate "Personal fatlink statistics" %}{% endblock page_title %}

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Fatlink Corp Statistics" %}{% endblock page_title %} {% block page_title %}{% translate "Fatlink Corp Statistics" %}{% endblock page_title %}

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Fatlink statistics" %}{% endblock page_title %} {% block page_title %}{% translate "Fatlink statistics" %}{% endblock page_title %}

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Fatlink view" %}{% endblock page_title %} {% block page_title %}{% translate "Fatlink view" %}{% endblock page_title %}

View File

@@ -1,30 +1,30 @@
from django.urls import path from django.conf.urls import url
from . import views from . import views
app_name = 'fleetactivitytracking' app_name = 'fleetactivitytracking'
urlpatterns = [ urlpatterns = [
# FleetActivityTracking (FAT) # FleetActivityTracking (FAT)
path('', views.fatlink_view, name='view'), url(r'^$', views.fatlink_view, name='view'),
path('statistics/', views.fatlink_statistics_view, name='statistics'), url(r'^statistics/$', views.fatlink_statistics_view, name='statistics'),
path('statistics/corp/<int:corpid>/', views.fatlink_statistics_corp_view, url(r'^statistics/corp/(\w+)$', views.fatlink_statistics_corp_view,
name='statistics_corp'), name='statistics_corp'),
path('statistics/corp/<int:corpid>/<int:year>/<int:month>/', url(r'^statistics/corp/(?P<corpid>\w+)/(?P<year>[0-9]+)/(?P<month>[0-9]+)/',
views.fatlink_statistics_corp_view, views.fatlink_statistics_corp_view,
name='statistics_corp_month'), name='statistics_corp_month'),
path('statistics/<int:year>/<int:month>/', views.fatlink_statistics_view, url(r'^statistics/(?P<year>[0-9]+)/(?P<month>[0-9]+)/$', views.fatlink_statistics_view,
name='statistics_month'), name='statistics_month'),
path('user/statistics/', views.fatlink_personal_statistics_view, url(r'^user/statistics/$', views.fatlink_personal_statistics_view,
name='personal_statistics'), name='personal_statistics'),
path('user/statistics/<int:year>/', views.fatlink_personal_statistics_view, url(r'^user/statistics/(?P<year>[0-9]+)/$', views.fatlink_personal_statistics_view,
name='personal_statistics_year'), name='personal_statistics_year'),
path('user/statistics/<int:year>/<int:month>/', url(r'^user/statistics/(?P<year>[0-9]+)/(?P<month>[0-9]+)/$',
views.fatlink_monthly_personal_statistics_view, views.fatlink_monthly_personal_statistics_view,
name='personal_statistics_month'), name='personal_statistics_month'),
path('user/<int:char_id>/statistics/<int:year>/<int:month>/', url(r'^user/(?P<char_id>[0-9]+)/statistics/(?P<year>[0-9]+)/(?P<month>[0-9]+)/$',
views.fatlink_monthly_personal_statistics_view, views.fatlink_monthly_personal_statistics_view,
name='user_statistics_month'), name='user_statistics_month'),
path('create/', views.create_fatlink_view, name='create'), url(r'^create/$', views.create_fatlink_view, name='create'),
path('modify/<str:fat_hash>/', views.modify_fatlink_view, name='modify'), url(r'^modify/(?P<fat_hash>[a-zA-Z0-9_-]+)/$', views.modify_fatlink_view, name='modify'),
path('link/<str:fat_hash>/', views.click_fatlink_view, name='click'), url(r'^link/(?P<fat_hash>[a-zA-Z0-9]+)/$', views.click_fatlink_view, name='click'),
] ]

View File

@@ -10,7 +10,7 @@ from django.contrib.auth.models import User
from django.core.exceptions import ValidationError, ObjectDoesNotExist from django.core.exceptions import ValidationError, ObjectDoesNotExist
from django.shortcuts import render, redirect, get_object_or_404, Http404 from django.shortcuts import render, redirect, get_object_or_404, Http404
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from esi.decorators import token_required from esi.decorators import token_required
from allianceauth.eveonline.providers import provider from allianceauth.eveonline.providers import provider
from .forms import FatlinkForm from .forms import FatlinkForm

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.groupmanagement.apps.GroupManagementConfig'

View File

@@ -1,4 +1,4 @@
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth.services.hooks import MenuItemHook, UrlHook from allianceauth.services.hooks import MenuItemHook, UrlHook
from allianceauth import hooks from allianceauth import hooks

View File

@@ -25,15 +25,13 @@
<div class="table-responsive"> <div class="table-responsive">
<table class="table table-striped" id="log-entries"> <table class="table table-striped" id="log-entries">
<thead> <thead>
<tr> <th scope="col">{% translate "Date/Time" %}</th>
<th scope="col">{% translate "Date/Time" %}</th> <th scope="col">{% translate "Requestor" %}</th>
<th scope="col">{% translate "Requestor" %}</th> <th scope="col">{% translate "Character" %}</th>
<th scope="col">{% translate "Character" %}</th> <th scope="col">{% translate "Corporation" %}</th>
<th scope="col">{% translate "Corporation" %}</th> <th scope="col">{% translate "Type" %}</th>
<th scope="col">{% translate "Type" %}</th> <th scope="col">{% translate "Action" %}</th>
<th scope="col">{% translate "Action" %}</th> <th scope="col">{% translate "Actor" %}</th>
<th scope="col">{% translate "Actor" %}</th>
</tr>
</thead> </thead>
<tbody> <tbody>
@@ -76,7 +74,7 @@
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %} {% include 'bundles/datatables-js.html' %}
{% include 'bundles/moment-js.html' with locale=True %} {% include 'bundles/moment-js.html' with locale=True %}
{% include 'bundles/filterdropdown-js.html' %} <script type="application/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script>
{% endblock %} {% endblock %}
{% block extra_css %} {% block extra_css %}

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% load evelinks %} {% load evelinks %}

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Groups Membership" %}{% endblock page_title %} {% block page_title %}{% translate "Groups Membership" %}{% endblock page_title %}

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Available Groups" %}{% endblock page_title %} {% block page_title %}{% translate "Available Groups" %}{% endblock page_title %}

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% load evelinks %} {% load evelinks %}

View File

@@ -1,3 +1,4 @@
{% load static %}
{% load i18n %} {% load i18n %}
{% load navactive %} {% load navactive %}

View File

@@ -1,50 +1,51 @@
from django.urls import path
from . import views from . import views
from django.conf.urls import url
app_name = "groupmanagement" app_name = "groupmanagement"
urlpatterns = [ urlpatterns = [
# groups # groups
path("groups", views.groups_view, name="groups"), url(r"^groups/$", views.groups_view, name="groups"),
path("group/request/join/<int:group_id>/", views.group_request_add, name="request_add"), url(r"^group/request/join/(\w+)/$", views.group_request_add, name="request_add"),
path( url(
"group/request/leave/<int:group_id>/", views.group_request_leave, name="request_leave" r"^group/request/leave/(\w+)/$", views.group_request_leave, name="request_leave"
), ),
# group management # group management
path("groupmanagement/requests/", views.group_management, name="management"), url(r"^groupmanagement/requests/$", views.group_management, name="management"),
path("groupmanagement/membership/", views.group_membership, name="membership"), url(r"^groupmanagement/membership/$", views.group_membership, name="membership"),
path( url(
"groupmanagement/membership/<int:group_id>/", r"^groupmanagement/membership/(\w+)/$",
views.group_membership_list, views.group_membership_list,
name="membership", name="membership",
), ),
path( url(
"groupmanagement/membership/<int:group_id>/audit-log/", r"^groupmanagement/membership/(\w+)/audit-log/$",
views.group_membership_audit, views.group_membership_audit,
name="audit_log", name="audit_log",
), ),
path( url(
"groupmanagement/membership/<int:group_id>/remove/<int:user_id>/", r"^groupmanagement/membership/(\w+)/remove/(\w+)/$",
views.group_membership_remove, views.group_membership_remove,
name="membership_remove", name="membership_remove",
), ),
path( url(
"groupmanagement/request/join/accept/<int:group_request_id>/", r"^groupmanagement/request/join/accept/(\w+)/$",
views.group_accept_request, views.group_accept_request,
name="accept_request", name="accept_request",
), ),
path( url(
"groupmanagement/request/join/reject/<int:group_request_id>/", r"^groupmanagement/request/join/reject/(\w+)/$",
views.group_reject_request, views.group_reject_request,
name="reject_request", name="reject_request",
), ),
path( url(
"groupmanagement/request/leave/accept/<int:group_request_id>/", r"^groupmanagement/request/leave/accept/(\w+)/$",
views.group_leave_accept_request, views.group_leave_accept_request,
name="leave_accept_request", name="leave_accept_request",
), ),
path( url(
"groupmanagement/request/leave/reject/<int:group_request_id>/", r"^groupmanagement/request/leave/reject/(\w+)/$",
views.group_leave_reject_request, views.group_leave_reject_request,
name="leave_reject_request", name="leave_reject_request",
), ),

View File

@@ -9,7 +9,7 @@ from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.db.models import Count from django.db.models import Count
from django.http import Http404 from django.http import Http404
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth.notifications import notify from allianceauth.notifications import notify

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.hrapplications.apps.HRApplicationsConfig'

View File

@@ -1,4 +1,4 @@
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks from allianceauth import hooks
from allianceauth.services.hooks import MenuItemHook, UrlHook from allianceauth.services.hooks import MenuItemHook, UrlHook

View File

@@ -1,5 +1,5 @@
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
class HRApplicationCommentForm(forms.Form): class HRApplicationCommentForm(forms.Form):

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Choose a Corp" %}{% endblock page_title %} {% block page_title %}{% translate "Choose a Corp" %}{% endblock page_title %}

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Apply To" %} {{ corp.corporation_name }}{% endblock page_title %} {% block page_title %}{% translate "Apply To" %} {{ corp.corporation_name }}{% endblock page_title %}
@@ -18,8 +19,8 @@
<div cass="text-center">{{ question.help_text }}</div> <div cass="text-center">{{ question.help_text }}</div>
{% endif %} {% endif %}
{% for choice in question.choices.all %} {% for choice in question.choices.all %}
<input type={% if question.multi_select == False %}"radio"{% else %}"checkbox"{% endif %} name="{{ question.pk }}" id="id_{{ question.pk }}" value="{{ choice.choice_text }}"> <input type={% if question.multi_select == False %}"radio"{% else %}"checkbox"{% endif %} name="{{ question.pk }}" id="id_{{ question.pk }}" value="{{ choice.choice_text }}" />
<label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br> <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% empty %} {% empty %}
<textarea class="form-control" cols="30" id="id_{{ question.pk }}" name="{{ question.pk }}" rows="4"></textarea> <textarea class="form-control" cols="30" id="id_{{ question.pk }}" name="{{ question.pk }}" rows="4"></textarea>
{% endfor %} {% endfor %}

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "HR Application Management" %}{% endblock page_title %} {% block page_title %}{% translate "HR Application Management" %}{% endblock page_title %}
@@ -180,7 +181,7 @@
<form class="form-signin" role="form" action={% url 'hrapplications:search' %} method="POST"> <form class="form-signin" role="form" action={% url 'hrapplications:search' %} method="POST">
{% csrf_token %} {% csrf_token %}
{{ search_form|bootstrap }} {{ search_form|bootstrap }}
<br> <br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Search" %}</button> <button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Search" %}</button>
</form> </form>
</div> </div>

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "HR Application Management" %}{% endblock page_title %} {% block page_title %}{% translate "HR Application Management" %}{% endblock page_title %}
@@ -66,7 +67,7 @@
<form class="form-signin" role="form" action={% url 'hrapplications:search' %} method="POST"> <form class="form-signin" role="form" action={% url 'hrapplications:search' %} method="POST">
{% csrf_token %} {% csrf_token %}
{{ search_form|bootstrap }} {{ search_form|bootstrap }}
<br> <br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Search" %}</button> <button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Search" %}</button>
</form> </form>
</div> </div>

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load bootstrap %} {% load bootstrap %}
{% load i18n %} {% load i18n %}
@@ -139,7 +140,7 @@
<form class="form-signin" role="form" action="" method="POST"> <form class="form-signin" role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ comment_form|bootstrap }} {{ comment_form|bootstrap }}
<br> <br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Add Comment" %}</button> <button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Add Comment" %}</button>
</form> </form>
</div> </div>

View File

@@ -1,31 +1,31 @@
from django.urls import path from django.conf.urls import url
from . import views from . import views
app_name = 'hrapplications' app_name = 'hrapplications'
urlpatterns = [ urlpatterns = [
path('', views.hr_application_management_view, url(r'^$', views.hr_application_management_view,
name="index"), name="index"),
path('create/', views.hr_application_create_view, url(r'^create/$', views.hr_application_create_view,
name="create_view"), name="create_view"),
path('create/<int:form_id>/', views.hr_application_create_view, url(r'^create/(\d+)', views.hr_application_create_view,
name="create_view"), name="create_view"),
path('remove/<int:app_id>/', views.hr_application_remove, url(r'^remove/(\w+)', views.hr_application_remove,
name="remove"), name="remove"),
path('view/<int:app_id>/', views.hr_application_view, url(r'^view/(\w+)', views.hr_application_view,
name="view"), name="view"),
path('personal/view/<int:app_id>/', views.hr_application_personal_view, url(r'^personal/view/(\w+)', views.hr_application_personal_view,
name="personal_view"), name="personal_view"),
path('personal/removal/<int:app_id>/', url(r'^personal/removal/(\w+)',
views.hr_application_personal_removal, views.hr_application_personal_removal,
name="personal_removal"), name="personal_removal"),
path('approve/<int:app_id>/', views.hr_application_approve, url(r'^approve/(\w+)', views.hr_application_approve,
name="approve"), name="approve"),
path('reject/<int:app_id>/', views.hr_application_reject, url(r'^reject/(\w+)', views.hr_application_reject,
name="reject"), name="reject"),
path('search/', views.hr_application_search, url(r'^search/', views.hr_application_search,
name="search"), name="search"),
path('mark_in_progress/<int:app_id>/', views.hr_application_mark_in_progress, url(r'^mark_in_progress/(\w+)', views.hr_application_mark_in_progress,
name="mark_in_progress"), name="mark_in_progress"),
] ]

View File

@@ -20,7 +20,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: es\n" "Language: es\n"
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: allianceauth/analytics/models.py:29 #: allianceauth/analytics/models.py:29
msgid "Google Analytics Universal" msgid "Google Analytics Universal"
@@ -450,7 +450,6 @@ msgid "%(user)s has collected one link this month."
msgid_plural "%(user)s has collected %(links)s links this month." msgid_plural "%(user)s has collected %(links)s links this month."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgstr[2] ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:28 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:28
msgid "Times used" msgid "Times used"
@@ -462,7 +461,6 @@ msgid "%(user)s has created one link this month."
msgid_plural "%(user)s has created %(links)s links this month." msgid_plural "%(user)s has created %(links)s links this month."
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgstr[2] ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:48 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:48
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:27 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:27
@@ -2143,7 +2141,6 @@ msgid "%(tasks)s task"
msgid_plural "%(tasks)s tasks" msgid_plural "%(tasks)s tasks"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgstr[2] ""
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"

View File

@@ -5,11 +5,11 @@
# #
# Translators: # Translators:
# François LACROIX-DURANT <umbre@fallenstarscreations.com>, 2020 # François LACROIX-DURANT <umbre@fallenstarscreations.com>, 2020
# Philippe Querin-Laporte <philippe.querin@hotmail.com>, 2020
# Keven D. <theenarki@gmail.com>, 2020 # Keven D. <theenarki@gmail.com>, 2020
# Idea ., 2021 # Idea ., 2021
# Mickael PATTE, 2021 # Mickael PATTE, 2021
# Geoffrey Fabbro, 2021 # Geoffrey Fabbro, 2021
# Philippe Querin-Laporte <philippe.querin@hotmail.com>, 2022
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
@@ -18,13 +18,13 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-29 01:03+1000\n" "POT-Creation-Date: 2021-11-29 01:03+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Philippe Querin-Laporte <philippe.querin@hotmail.com>, 2022\n" "Last-Translator: Geoffrey Fabbro, 2021\n"
"Language-Team: French (France) (https://www.transifex.com/alliance-auth/teams/107430/fr_FR/)\n" "Language-Team: French (France) (https://www.transifex.com/alliance-auth/teams/107430/fr_FR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: fr_FR\n" "Language: fr_FR\n"
"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n"
#: allianceauth/analytics/models.py:29 #: allianceauth/analytics/models.py:29
msgid "Google Analytics Universal" msgid "Google Analytics Universal"
@@ -460,7 +460,6 @@ msgid "%(user)s has collected one link this month."
msgid_plural "%(user)s has collected %(links)s links this month." msgid_plural "%(user)s has collected %(links)s links this month."
msgstr[0] "%(user)s a obtenu un lien ce mois." msgstr[0] "%(user)s a obtenu un lien ce mois."
msgstr[1] "%(user)s a obtenu %(links)s liens ce mois." msgstr[1] "%(user)s a obtenu %(links)s liens ce mois."
msgstr[2] "%(user)s a obtenu %(links)s liens ce mois."
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:28 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:28
msgid "Times used" msgid "Times used"
@@ -472,7 +471,6 @@ msgid "%(user)s has created one link this month."
msgid_plural "%(user)s has created %(links)s links this month." msgid_plural "%(user)s has created %(links)s links this month."
msgstr[0] "%(user)s a créé un lien ce mois." msgstr[0] "%(user)s a créé un lien ce mois."
msgstr[1] "%(user)s a créé %(links)s liens ce mois." msgstr[1] "%(user)s a créé %(links)s liens ce mois."
msgstr[2] "%(user)s a créé %(links)s liens ce mois."
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:48 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:48
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:27 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:27
@@ -2169,7 +2167,6 @@ msgid "%(tasks)s task"
msgid_plural "%(tasks)s tasks" msgid_plural "%(tasks)s tasks"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgstr[2] ""
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"

View File

@@ -5,7 +5,7 @@
# #
# Translators: # Translators:
# Alessandro Cresti, 2021 # Alessandro Cresti, 2021
# Linus Hope, 2022 # Linus Hope, 2021
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
@@ -14,13 +14,13 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-29 01:03+1000\n" "POT-Creation-Date: 2021-11-29 01:03+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Linus Hope, 2022\n" "Last-Translator: Linus Hope, 2021\n"
"Language-Team: Italian (Italy) (https://www.transifex.com/alliance-auth/teams/107430/it_IT/)\n" "Language-Team: Italian (Italy) (https://www.transifex.com/alliance-auth/teams/107430/it_IT/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Language: it_IT\n" "Language: it_IT\n"
"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: allianceauth/analytics/models.py:29 #: allianceauth/analytics/models.py:29
msgid "Google Analytics Universal" msgid "Google Analytics Universal"
@@ -460,7 +460,6 @@ msgid "%(user)s has collected one link this month."
msgid_plural "%(user)s has collected %(links)s links this month." msgid_plural "%(user)s has collected %(links)s links this month."
msgstr[0] "%(user)s ha ottenuto un link per questo mese." msgstr[0] "%(user)s ha ottenuto un link per questo mese."
msgstr[1] "%(user)s ha ottenuto %(links)s links questo mese." msgstr[1] "%(user)s ha ottenuto %(links)s links questo mese."
msgstr[2] "%(user)s ha ottenuto %(links)s links questo mese."
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:28 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:28
msgid "Times used" msgid "Times used"
@@ -472,7 +471,6 @@ msgid "%(user)s has created one link this month."
msgid_plural "%(user)s has created %(links)s links this month." msgid_plural "%(user)s has created %(links)s links this month."
msgstr[0] "%(user)s ha creato un link questo mese." msgstr[0] "%(user)s ha creato un link questo mese."
msgstr[1] "%(user)s ha creato %(links)s links questo mese." msgstr[1] "%(user)s ha creato %(links)s links questo mese."
msgstr[2] "%(user)s ha creato %(links)s links questo mese."
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:48 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:48
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:27 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:27
@@ -2157,7 +2155,6 @@ msgid "%(tasks)s task"
msgid_plural "%(tasks)s tasks" msgid_plural "%(tasks)s tasks"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
msgstr[2] ""
#: allianceauth/templates/allianceauth/night-toggle.html:6 #: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode" msgid "Night Mode"

View File

@@ -9,7 +9,6 @@
# Olgeda Choi <undead.choi@gmail.com>, 2020 # Olgeda Choi <undead.choi@gmail.com>, 2020
# Lahty <js03js70@gmail.com>, 2020 # Lahty <js03js70@gmail.com>, 2020
# Joel Falknau <ozirascal@gmail.com>, 2020 # Joel Falknau <ozirascal@gmail.com>, 2020
# ThatRagingKid, 2022
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
@@ -18,7 +17,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-11-29 01:03+1000\n" "POT-Creation-Date: 2021-11-29 01:03+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: ThatRagingKid, 2022\n" "Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2020\n"
"Language-Team: Korean (Korea) (https://www.transifex.com/alliance-auth/teams/107430/ko_KR/)\n" "Language-Team: Korean (Korea) (https://www.transifex.com/alliance-auth/teams/107430/ko_KR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -28,15 +27,15 @@ msgstr ""
#: allianceauth/analytics/models.py:29 #: allianceauth/analytics/models.py:29
msgid "Google Analytics Universal" msgid "Google Analytics Universal"
msgstr "구글 애널리틱스 유니버설" msgstr ""
#: allianceauth/analytics/models.py:30 #: allianceauth/analytics/models.py:30
msgid "Google Analytics V4" msgid "Google Analytics V4"
msgstr "구글 애널리틱스 V4" msgstr ""
#: allianceauth/authentication/decorators.py:37 #: allianceauth/authentication/decorators.py:37
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "해당 기능을 수행하려면 주 캐릭터가 요구됨. 아래에 하나를 추가하시오." msgstr "해당 기능을 수행하려면 주 캐릭터가 요구됨. 아래에 하나를 추가하시오."
#: allianceauth/authentication/forms.py:5 #: allianceauth/authentication/forms.py:5
msgid "Email" msgid "Email"
@@ -66,7 +65,7 @@ msgid ""
" " " "
msgstr "" msgstr ""
"\n" "\n"
" 캐릭터 (상태: %(state)s)\n" " 메인 캐릭터 (상태: %(state)s)\n"
" " " "
#: allianceauth/authentication/templates/authentication/dashboard.html:102 #: allianceauth/authentication/templates/authentication/dashboard.html:102
@@ -104,7 +103,7 @@ msgstr "이름"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:46 #: allianceauth/hrapplications/templates/hrapplications/view.html:46
msgid "Corp" msgid "Corp"
msgstr "코퍼레이션" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:152 #: allianceauth/authentication/templates/authentication/dashboard.html:152
#: allianceauth/corputils/templates/corputils/corpstats.html:76 #: allianceauth/corputils/templates/corputils/corpstats.html:76
@@ -119,7 +118,7 @@ msgstr "로그인"
#: allianceauth/authentication/templates/public/register.html:7 #: allianceauth/authentication/templates/public/register.html:7
msgid "Registration" msgid "Registration"
msgstr "가입" msgstr ""
#: allianceauth/authentication/templates/public/register.html:22 #: allianceauth/authentication/templates/public/register.html:22
#: allianceauth/authentication/templates/registration/registration_form.html:5 #: allianceauth/authentication/templates/registration/registration_form.html:5
@@ -138,7 +137,7 @@ msgstr "계정 패스워드 리셋을 요청하여 이 이메일을 보내드립
#: allianceauth/authentication/templates/registration/password_reset_email.html:5 #: allianceauth/authentication/templates/registration/password_reset_email.html:5
msgid "Please go to the following page and choose a new password:" msgid "Please go to the following page and choose a new password:"
msgstr "다음 페이지로 이동하여 새로운 패스워드를 입력하세요:" msgstr "다음 페이지로 이동하여 새로운 패스워드를 입력하세요."
#: allianceauth/authentication/templates/registration/password_reset_email.html:9 #: allianceauth/authentication/templates/registration/password_reset_email.html:9
msgid "Your username, in case you've forgotten:" msgid "Your username, in case you've forgotten:"
@@ -177,7 +176,7 @@ msgstr "계정에 %(name)s를 추가했습니다."
#: allianceauth/authentication/views.py:94 #: allianceauth/authentication/views.py:94
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "계정에 %(name)s를 추가하지 못했습니다. 이미 다른 계정에 추가되었습니다." msgstr "계정에 %(name)s를 추가하지 못했습니다. 이미 추가된 계정입니다."
#: allianceauth/authentication/views.py:133 #: allianceauth/authentication/views.py:133
msgid "Unable to authenticate as the selected character." msgid "Unable to authenticate as the selected character."
@@ -185,7 +184,7 @@ msgstr "선택한 캐릭터로 인증을 수행할 수 없음"
#: allianceauth/authentication/views.py:197 #: allianceauth/authentication/views.py:197
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "가입 토큰 만료되었습니다." msgstr "등록토큰 만료"
#: allianceauth/authentication/views.py:252 #: allianceauth/authentication/views.py:252
msgid "" msgid ""
@@ -203,16 +202,16 @@ msgstr "현재 새로운 계정 등록은 받지않습니다."
#: allianceauth/corputils/auth_hooks.py:11 #: allianceauth/corputils/auth_hooks.py:11
msgid "Corporation Stats" msgid "Corporation Stats"
msgstr "코퍼레이션 상태" msgstr " 상태"
#: allianceauth/corputils/templates/corputils/base.html:3 #: allianceauth/corputils/templates/corputils/base.html:3
#: allianceauth/corputils/templates/corputils/base.html:6 #: allianceauth/corputils/templates/corputils/base.html:6
msgid "Corporation Member Data" msgid "Corporation Member Data"
msgstr "코퍼레이션 멤버 정보" msgstr " 멤버 데이터"
#: allianceauth/corputils/templates/corputils/base.html:12 #: allianceauth/corputils/templates/corputils/base.html:12
msgid "Corporations" msgid "Corporations"
msgstr "코퍼레이션" msgstr ""
#: allianceauth/corputils/templates/corputils/base.html:23 #: allianceauth/corputils/templates/corputils/base.html:23
msgid "Add" msgid "Add"
@@ -220,7 +219,7 @@ msgstr "추가"
#: allianceauth/corputils/templates/corputils/base.html:29 #: allianceauth/corputils/templates/corputils/base.html:29
msgid "Search all corporations..." msgid "Search all corporations..."
msgstr "모든 코퍼레이션 검색" msgstr "모든 검색"
#: allianceauth/corputils/templates/corputils/corpstats.html:33 #: allianceauth/corputils/templates/corputils/corpstats.html:33
msgid "Mains" msgid "Mains"
@@ -238,7 +237,7 @@ msgstr "미등록"
#: allianceauth/corputils/templates/corputils/corpstats.html:38 #: allianceauth/corputils/templates/corputils/corpstats.html:38
msgid "Last update:" msgid "Last update:"
msgstr "마지막 업데이트:" msgstr "마지막 업데이트"
#: allianceauth/corputils/templates/corputils/corpstats.html:74 #: allianceauth/corputils/templates/corputils/corpstats.html:74
#: allianceauth/corputils/templates/corputils/corpstats.html:112 #: allianceauth/corputils/templates/corputils/corpstats.html:112
@@ -261,7 +260,7 @@ msgstr "캐릭터"
#: allianceauth/hrapplications/templates/hrapplications/management.html:126 #: allianceauth/hrapplications/templates/hrapplications/management.html:126
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:26 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:26
msgid "Corporation" msgid "Corporation"
msgstr "코퍼레이션" msgstr ""
#: allianceauth/corputils/templates/corputils/corpstats.html:91 #: allianceauth/corputils/templates/corputils/corpstats.html:91
#: allianceauth/corputils/templates/corputils/corpstats.html:125 #: allianceauth/corputils/templates/corputils/corpstats.html:125
@@ -269,7 +268,7 @@ msgstr "코퍼레이션"
#: allianceauth/corputils/templates/corputils/corpstats.html:167 #: allianceauth/corputils/templates/corputils/corpstats.html:167
#: allianceauth/corputils/templates/corputils/search.html:27 #: allianceauth/corputils/templates/corputils/search.html:27
msgid "Killboard" msgid "Killboard"
msgstr "사살권" msgstr "킬보드"
#: allianceauth/corputils/templates/corputils/corpstats.html:114 #: allianceauth/corputils/templates/corputils/corpstats.html:114
#: allianceauth/corputils/templates/corputils/search.html:16 #: allianceauth/corputils/templates/corputils/search.html:16
@@ -284,12 +283,12 @@ msgstr "주 캐릭터"
#: allianceauth/corputils/templates/corputils/corpstats.html:115 #: allianceauth/corputils/templates/corputils/corpstats.html:115
#: allianceauth/corputils/templates/corputils/search.html:17 #: allianceauth/corputils/templates/corputils/search.html:17
msgid "Main Corporation" msgid "Main Corporation"
msgstr "주 코퍼레이션" msgstr "메인콥"
#: allianceauth/corputils/templates/corputils/corpstats.html:116 #: allianceauth/corputils/templates/corputils/corpstats.html:116
#: allianceauth/corputils/templates/corputils/search.html:18 #: allianceauth/corputils/templates/corputils/search.html:18
msgid "Main Alliance" msgid "Main Alliance"
msgstr " 얼라이언스" msgstr "메인 얼라이언스"
#: allianceauth/corputils/templates/corputils/search.html:6 #: allianceauth/corputils/templates/corputils/search.html:6
msgid "Search Results" msgid "Search Results"
@@ -297,28 +296,28 @@ msgstr "검색결과"
#: allianceauth/corputils/templates/corputils/search.html:15 #: allianceauth/corputils/templates/corputils/search.html:15
msgid "zKillboard" msgid "zKillboard"
msgstr "zKillboard" msgstr "킬보드"
#: allianceauth/corputils/views.py:54 #: allianceauth/corputils/views.py:54
msgid "Selected corp already has a statistics module." msgid "Selected corp already has a statistics module."
msgstr "선택한 코퍼레이션은 이미 통계 모듈을 갖고 있습니다." msgstr "선택한 은 이미 통계 모듈을 갖고있습니다."
#: allianceauth/corputils/views.py:56 #: allianceauth/corputils/views.py:56
msgid "Failed to gather corporation statistics with selected token." msgid "Failed to gather corporation statistics with selected token."
msgstr "선택한 토큰으로 코퍼레이션 통계 수집 실패했습니다." msgstr "선택한 토큰으로 통계 수집 실패"
#: allianceauth/fleetactivitytracking/auth_hooks.py:9 #: allianceauth/fleetactivitytracking/auth_hooks.py:9
msgid "Fleet Activity Tracking" msgid "Fleet Activity Tracking"
msgstr "함대 활동" msgstr "플릿활동 추적"
#: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8 #: allianceauth/fleetactivitytracking/forms.py:6 allianceauth/srp/form.py:8
#: allianceauth/srp/templates/srp/management.html:37 #: allianceauth/srp/templates/srp/management.html:37
msgid "Fleet Name" msgid "Fleet Name"
msgstr "함대 이름" msgstr "플릿 이름"
#: allianceauth/fleetactivitytracking/forms.py:7 #: allianceauth/fleetactivitytracking/forms.py:7
msgid "Duration of fat-link" msgid "Duration of fat-link"
msgstr "함대 활동 링크 주기" msgstr "플릿활동추적 링크 주기"
#: allianceauth/fleetactivitytracking/forms.py:7 #: allianceauth/fleetactivitytracking/forms.py:7
msgid "minutes" msgid "minutes"
@@ -326,7 +325,7 @@ msgstr "분"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:3 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:3
msgid "Fleet Participation" msgid "Fleet Participation"
msgstr "함대 참여" msgstr "플릿 참여"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:7 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:7
msgid "Character not found!" msgid "Character not found!"
@@ -338,25 +337,25 @@ msgstr "캐릭터가 등록되지 않음!"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:19 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:19
msgid "This character is not associated with an auth account." msgid "This character is not associated with an auth account."
msgstr "해당 캐릭터는 본 계정에 연결되어 있지 않습니다." msgstr "해당 캐릭터는 본 계정에 연결되어있지 않."
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:19 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:19
msgid "Add it here" msgid "Add it here"
msgstr "여기 추가하시오" msgstr "여기 추가"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:19 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/characternotexisting.html:19
msgid "before attempting to click fleet attendance links." msgid "before attempting to click fleet attendance links."
msgstr "함대 참여 링크를 클릭하기 전" msgstr "플릿 참여 링크를 클릭하기 전"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:6
msgid "Create Fatlink" msgid "Create Fatlink"
msgstr "함대 활동 링크 생성" msgstr "플릿활동추적 생성"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:10 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:10
#: allianceauth/optimer/templates/optimer/add.html:14 #: allianceauth/optimer/templates/optimer/add.html:14
#: allianceauth/optimer/templates/optimer/add.html:23 #: allianceauth/optimer/templates/optimer/add.html:23
msgid "Create Fleet Operation" msgid "Create Fleet Operation"
msgstr "함대 오퍼레이션 생성" msgstr "플릿 옵 생성"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:14 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:14
msgid "Bad request!" msgid "Bad request!"
@@ -365,20 +364,20 @@ msgstr "잘못된 요청!"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:25 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:25
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:65 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:65
msgid "Create fatlink" msgid "Create fatlink"
msgstr "함대 활동 링크 생성" msgstr "플릿활동추적 링크 생성"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:5 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:5
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:6
msgid "Fatlink view" msgid "Fatlink view"
msgstr "함대 활동 링크 보기" msgstr "플릿활동추적 링크 보기"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:9 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:9
msgid "Edit fatlink" msgid "Edit fatlink"
msgstr "함대 활동 링크 수정" msgstr "플릿활동추적 수정"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:13 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:13
msgid "Delete fat" msgid "Delete fat"
msgstr "함대 활동 링크 삭제" msgstr "플릿활동추적 수정"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:19 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:19
msgid "Registered characters" msgid "Registered characters"
@@ -402,7 +401,7 @@ msgstr "시스템"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:27 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:27
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:30 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:30
msgid "Ship" msgid "Ship"
msgstr "함선" msgstr ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:27 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkmodify.html:27
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:50 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:50
@@ -423,7 +422,7 @@ msgstr "도킹"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:6
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:6
msgid "Personal fatlink statistics" msgid "Personal fatlink statistics"
msgstr "개인별 함대 활동 링크 통계" msgstr "개인별 플릿활동추적 통계"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:10 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:10
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:10 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:10
@@ -493,11 +492,11 @@ msgstr "%(year)s년 동안의 참여 통계자료"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:12 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:12
msgid "Previous year" msgid "Previous year"
msgstr "작년" msgstr "지난 해"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:14 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:14
msgid "Next year" msgid "Next year"
msgstr "내년" msgstr "다음 해"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:21 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalstatisticsview.html:21
msgid "Month" msgid "Month"
@@ -507,20 +506,20 @@ msgstr "달"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:24 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:24
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:25 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:25
msgid "Fats" msgid "Fats"
msgstr "함대 활동" msgstr "플릿활동추적"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:6
msgid "Fatlink Corp Statistics" msgid "Fatlink Corp Statistics"
msgstr "코퍼레이션별 함대 활동 통계" msgstr "콥별 플릿활동추적 통계"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:25 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:25
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:26 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:26
msgid "Average fats" msgid "Average fats"
msgstr "평균 함대 활동" msgstr "평균 플릿활동추적"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:6 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:6
msgid "Fatlink statistics" msgid "Fatlink statistics"
msgstr "함대 활동 통계" msgstr "플릿활동추적 통계"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:22 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:22
msgid "Ticker" msgid "Ticker"
@@ -532,7 +531,7 @@ msgstr "참여 자료"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:14 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:14
msgid "Most recent clicked fatlinks" msgid "Most recent clicked fatlinks"
msgstr "가장 최근에 클릭한 함대 활동 링크" msgstr "가장 최근에 클릭한 플릿활동추적 링크"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:19 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:19
msgid "Personal statistics" msgid "Personal statistics"
@@ -540,11 +539,11 @@ msgstr "개인별 통계"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:48 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:48
msgid "No fleet activity on record." msgid "No fleet activity on record."
msgstr "함대 활동 기록이 없음" msgstr "플릿 활동기록이 없음"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:55 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:55
msgid "Most recent fatlinks" msgid "Most recent fatlinks"
msgstr "가장 최근의 함대 활동 링크" msgstr "가장 최근의 플릿활동추적 링크"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:60 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:60
msgid "View statistics" msgid "View statistics"
@@ -552,27 +551,27 @@ msgstr "통계 보기"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:97 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:97
msgid "No created fatlinks on record." msgid "No created fatlinks on record."
msgstr "생성된 함대 활동 링크 기록이 없음" msgstr "생성된 플릿활동추적 링크 기록이 없음"
#: allianceauth/fleetactivitytracking/views.py:280 #: allianceauth/fleetactivitytracking/views.py:280
msgid "Fleet participation registered." msgid "Fleet participation registered."
msgstr "함대 참여 등록됨" msgstr "플릿 참여 등록됨"
#: allianceauth/fleetactivitytracking/views.py:296 #: allianceauth/fleetactivitytracking/views.py:296
msgid "FAT link has expired." msgid "FAT link has expired."
msgstr "함대 활동 링크 기한만료" msgstr "플릿활동추적 링크 기한만료"
#: allianceauth/groupmanagement/admin.py:104 #: allianceauth/groupmanagement/admin.py:104
msgid "This name has been reserved and can not be used for groups." msgid "This name has been reserved and can not be used for groups."
msgstr "이 이름은 이미 할당되었고 그룹의 이름으로 사용될 수 없습니다." msgstr ""
#: allianceauth/groupmanagement/admin.py:230 #: allianceauth/groupmanagement/admin.py:230
msgid "(auto)" msgid "(auto)"
msgstr "(자동)" msgstr ""
#: allianceauth/groupmanagement/admin.py:239 #: allianceauth/groupmanagement/admin.py:239
msgid "There already exists a group with that name." msgid "There already exists a group with that name."
msgstr "이 이름을 가진 그룹이 이미 있습니다." msgstr ""
#: allianceauth/groupmanagement/auth_hooks.py:17 #: allianceauth/groupmanagement/auth_hooks.py:17
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:14 #: allianceauth/groupmanagement/templates/groupmanagement/menu.html:14
@@ -585,12 +584,10 @@ msgid ""
"group.<br>Used for groups such as Members, Corp_*, Alliance_* " "group.<br>Used for groups such as Members, Corp_*, Alliance_* "
"etc.<br><b>Overrides Hidden and Open options when selected.</b>" "etc.<br><b>Overrides Hidden and Open options when selected.</b>"
msgstr "" msgstr ""
"시스템 그룹, 유저들은 이 그룹을 보거나, 참여하거나, 지원할 수 없습니다. <br>멤버, 코퍼레이션_*, 얼라이언스_* 등에 "
"사용됨.<br><b>선택된 경우 비공개와 공개 옵션을 무시함.</b>"
#: allianceauth/groupmanagement/models.py:110 #: allianceauth/groupmanagement/models.py:110
msgid "Group is hidden from users but can still join with the correct link." msgid "Group is hidden from users but can still join with the correct link."
msgstr "비공개 그룹이지만 링크를 통해 참여할 수 있음." msgstr ""
#: allianceauth/groupmanagement/models.py:116 #: allianceauth/groupmanagement/models.py:116
msgid "" msgid ""
@@ -673,7 +670,7 @@ msgstr "감사 기록"
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:13 #: allianceauth/permissions_tool/templates/permissions_tool/audit.html:13
#: allianceauth/timerboard/templates/timerboard/index_button.html:3 #: allianceauth/timerboard/templates/timerboard/index_button.html:3
msgid "Back" msgid "Back"
msgstr "뒤로" msgstr "돌아가기"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:28 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:28
msgid "Date/Time" msgid "Date/Time"
@@ -987,15 +984,15 @@ msgstr "문자열 검색"
#: allianceauth/hrapplications/templates/hrapplications/corpchoice.html:5 #: allianceauth/hrapplications/templates/hrapplications/corpchoice.html:5
#: allianceauth/hrapplications/templates/hrapplications/corpchoice.html:8 #: allianceauth/hrapplications/templates/hrapplications/corpchoice.html:8
msgid "Choose a Corp" msgid "Choose a Corp"
msgstr "코퍼레이션 선택" msgstr " 선택"
#: allianceauth/hrapplications/templates/hrapplications/corpchoice.html:11 #: allianceauth/hrapplications/templates/hrapplications/corpchoice.html:11
msgid "Available Corps" msgid "Available Corps"
msgstr "사용 가능한 코퍼레이션" msgstr "사용 가능한 "
#: allianceauth/hrapplications/templates/hrapplications/corpchoice.html:23 #: allianceauth/hrapplications/templates/hrapplications/corpchoice.html:23
msgid "No corps are accepting applications at this time." msgid "No corps are accepting applications at this time."
msgstr "현재 입사지원 가능한 코퍼레이션이 없습니다." msgstr "현재 입사지원 가능한 이 없습니다."
#: allianceauth/hrapplications/templates/hrapplications/create.html:5 #: allianceauth/hrapplications/templates/hrapplications/create.html:5
#: allianceauth/hrapplications/templates/hrapplications/create.html:8 #: allianceauth/hrapplications/templates/hrapplications/create.html:8
@@ -1225,7 +1222,7 @@ msgstr "모든 읽은 알림을 삭제했습니다."
#: allianceauth/optimer/auth_hooks.py:10 #: allianceauth/optimer/auth_hooks.py:10
msgid "Fleet Operations" msgid "Fleet Operations"
msgstr "함대 옵" msgstr "플릿 옵"
#: allianceauth/optimer/form.py:12 #: allianceauth/optimer/form.py:12
#: allianceauth/optimer/templates/optimer/fleetoptable.html:11 #: allianceauth/optimer/templates/optimer/fleetoptable.html:11
@@ -1249,7 +1246,7 @@ msgstr ""
#: allianceauth/optimer/form.py:17 #: allianceauth/optimer/form.py:17
#: allianceauth/srp/templates/srp/management.html:40 #: allianceauth/srp/templates/srp/management.html:40
msgid "Fleet Commander" msgid "Fleet Commander"
msgstr "함대 커맨더" msgstr "플릿 커맨더"
#: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14 #: allianceauth/optimer/form.py:22 allianceauth/srp/form.py:14
#: allianceauth/srp/templates/srp/data.html:93 #: allianceauth/srp/templates/srp/data.html:93
@@ -1282,11 +1279,11 @@ msgstr "FC"
#: allianceauth/optimer/templates/optimer/management.html:6 #: allianceauth/optimer/templates/optimer/management.html:6
msgid "Fleet Operation Management" msgid "Fleet Operation Management"
msgstr "함대 옵 관리" msgstr "플릿 옵 관리"
#: allianceauth/optimer/templates/optimer/management.html:11 #: allianceauth/optimer/templates/optimer/management.html:11
msgid "Fleet Operation Timers" msgid "Fleet Operation Timers"
msgstr "함대 옵 타이머" msgstr "플릿 옵 타이머"
#: allianceauth/optimer/templates/optimer/management.html:21 #: allianceauth/optimer/templates/optimer/management.html:21
#: allianceauth/timerboard/templates/timerboard/view.html:23 #: allianceauth/timerboard/templates/timerboard/view.html:23
@@ -1315,11 +1312,11 @@ msgstr "최근 지나간 옵 타이머가 없습니다."
#: allianceauth/optimer/templates/optimer/update.html:16 #: allianceauth/optimer/templates/optimer/update.html:16
#: allianceauth/optimer/templates/optimer/update.html:28 #: allianceauth/optimer/templates/optimer/update.html:28
msgid "Update Fleet Operation" msgid "Update Fleet Operation"
msgstr "함대 옵 수정" msgstr "플릿 옵 수정"
#: allianceauth/optimer/templates/optimer/update.html:22 #: allianceauth/optimer/templates/optimer/update.html:22
msgid "Fleet Operation Does Not Exist" msgid "Fleet Operation Does Not Exist"
msgstr "존재하지 않는 함대 옵" msgstr "존재하지 않는 플릿 옵"
#: allianceauth/optimer/views.py:69 #: allianceauth/optimer/views.py:69
#, python-format #, python-format
@@ -1437,23 +1434,23 @@ msgstr "서드파티"
#: allianceauth/services/forms.py:6 #: allianceauth/services/forms.py:6
msgid "Name of Fleet:" msgid "Name of Fleet:"
msgstr "함대 이름:" msgstr "플릿 이름:"
#: allianceauth/services/forms.py:7 #: allianceauth/services/forms.py:7
msgid "Fleet Commander:" msgid "Fleet Commander:"
msgstr "함대 커맨더:" msgstr "플릿 커맨더:"
#: allianceauth/services/forms.py:8 #: allianceauth/services/forms.py:8
msgid "Fleet Comms:" msgid "Fleet Comms:"
msgstr "함대 음성 채널:" msgstr "플릿 음성 채널:"
#: allianceauth/services/forms.py:9 #: allianceauth/services/forms.py:9
msgid "Fleet Type:" msgid "Fleet Type:"
msgstr "함대 타입:" msgstr "플릿 타입:"
#: allianceauth/services/forms.py:10 #: allianceauth/services/forms.py:10
msgid "Ship Priorities:" msgid "Ship Priorities:"
msgstr "함대 우선도:" msgstr "플릿 우선도:"
#: allianceauth/services/forms.py:11 #: allianceauth/services/forms.py:11
msgid "Formup Location:" msgid "Formup Location:"
@@ -1598,7 +1595,7 @@ msgstr "재버 방송"
#: allianceauth/services/modules/openfire/auth_hooks.py:94 #: allianceauth/services/modules/openfire/auth_hooks.py:94
msgid "Fleet Broadcast Formatter" msgid "Fleet Broadcast Formatter"
msgstr "함대 신호 설정" msgstr "플릿 신호 설정"
#: allianceauth/services/modules/openfire/forms.py:7 #: allianceauth/services/modules/openfire/forms.py:7
msgid "Message" msgid "Message"
@@ -1752,11 +1749,11 @@ msgstr "XenForo 비밀번호 변경 완료"
#: allianceauth/services/templates/services/fleetformattertool.html:6 #: allianceauth/services/templates/services/fleetformattertool.html:6
msgid "Fleet Formatter Tool" msgid "Fleet Formatter Tool"
msgstr "함대 구성 도구" msgstr "플릿 구성 도구"
#: allianceauth/services/templates/services/fleetformattertool.html:11 #: allianceauth/services/templates/services/fleetformattertool.html:11
msgid "Fleet Broadcast Formatter Tool" msgid "Fleet Broadcast Formatter Tool"
msgstr "함대 브로드캐스트 설정 도구" msgstr "플릿 브로드캐스트 설정 도구"
#: allianceauth/services/templates/services/fleetformattertool.html:24 #: allianceauth/services/templates/services/fleetformattertool.html:24
msgid "Format" msgid "Format"
@@ -1817,12 +1814,12 @@ msgstr "SRP"
#: allianceauth/srp/form.py:9 #: allianceauth/srp/form.py:9
#: allianceauth/srp/templates/srp/management.html:38 #: allianceauth/srp/templates/srp/management.html:38
msgid "Fleet Time" msgid "Fleet Time"
msgstr "함대 시간" msgstr "플릿 시간"
#: allianceauth/srp/form.py:10 #: allianceauth/srp/form.py:10
#: allianceauth/srp/templates/srp/management.html:39 #: allianceauth/srp/templates/srp/management.html:39
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "함대 독트린" msgstr "플릿 독트린"
#: allianceauth/srp/form.py:16 #: allianceauth/srp/form.py:16
msgid "Killboard Link (zkillboard.com or kb.evetools.org)" msgid "Killboard Link (zkillboard.com or kb.evetools.org)"
@@ -1842,12 +1839,12 @@ msgstr "사후조치 보고서 링크"
#: allianceauth/srp/templates/srp/add.html:6 #: allianceauth/srp/templates/srp/add.html:6
msgid "SRP Fleet Create" msgid "SRP Fleet Create"
msgstr "SRP 보상 함대 생성" msgstr "SRP 보상 플릿 생성"
#: allianceauth/srp/templates/srp/add.html:14 #: allianceauth/srp/templates/srp/add.html:14
#: allianceauth/srp/templates/srp/add.html:24 #: allianceauth/srp/templates/srp/add.html:24
msgid "Create SRP Fleet" msgid "Create SRP Fleet"
msgstr "SRP 보상 함대 생성" msgstr "SRP 보상 플릿 생성"
#: allianceauth/srp/templates/srp/add.html:27 #: allianceauth/srp/templates/srp/add.html:27
msgid "Give this link to the line members" msgid "Give this link to the line members"
@@ -1855,7 +1852,7 @@ msgstr "이 링크를 직계 멤버들에게 전달"
#: allianceauth/srp/templates/srp/data.html:52 #: allianceauth/srp/templates/srp/data.html:52
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "SRP 보상 함대 데이터" msgstr "SRP 보상 플릿 데이터"
#: allianceauth/srp/templates/srp/data.html:57 #: allianceauth/srp/templates/srp/data.html:57
msgid "Mark Incomplete" msgid "Mark Incomplete"
@@ -1911,7 +1908,7 @@ msgstr "작성 시간"
#: allianceauth/srp/templates/srp/data.html:178 #: allianceauth/srp/templates/srp/data.html:178
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "이 함대에는 SRP 보상 요청이 없습니다." msgstr "이 플릿에는 SRP 보상 요청이 없습니다."
#: allianceauth/srp/templates/srp/management.html:8 #: allianceauth/srp/templates/srp/management.html:8
msgid "Srp Management" msgid "Srp Management"
@@ -1927,19 +1924,19 @@ msgstr "모두 조회하기"
#: allianceauth/srp/templates/srp/management.html:23 #: allianceauth/srp/templates/srp/management.html:23
msgid "Add SRP Fleet" msgid "Add SRP Fleet"
msgstr "SRP 보상 함대 추가" msgstr "SRP 보상 플릿 추가"
#: allianceauth/srp/templates/srp/management.html:41 #: allianceauth/srp/templates/srp/management.html:41
msgid "Fleet AAR" msgid "Fleet AAR"
msgstr "함대 사후처리 보고서" msgstr "플릿 사후처리 보고서"
#: allianceauth/srp/templates/srp/management.html:42 #: allianceauth/srp/templates/srp/management.html:42
msgid "Fleet SRP Code" msgid "Fleet SRP Code"
msgstr "함대 SRP 보상 코드" msgstr "플릿 SRP 보상 코드"
#: allianceauth/srp/templates/srp/management.html:43 #: allianceauth/srp/templates/srp/management.html:43
msgid "Fleet ISK Cost" msgid "Fleet ISK Cost"
msgstr "함대 ISK 비용" msgstr "플릿 ISK 비용"
#: allianceauth/srp/templates/srp/management.html:44 #: allianceauth/srp/templates/srp/management.html:44
msgid "SRP Status" msgid "SRP Status"
@@ -1986,37 +1983,37 @@ msgstr "사후처리 보고서 링크 업데이트"
#: allianceauth/srp/templates/srp/update.html:17 #: allianceauth/srp/templates/srp/update.html:17
msgid "SRP Fleet Does Not Exist" msgid "SRP Fleet Does Not Exist"
msgstr "SRP 보상 함대이 존재하지 않습니다." msgstr "SRP 보상 플릿이 존재하지 않습니다."
#: allianceauth/srp/views.py:85 #: allianceauth/srp/views.py:85
#, python-format #, python-format
msgid "Created SRP fleet %(fleetname)s." msgid "Created SRP fleet %(fleetname)s."
msgstr "SRP 보상 함대 %(fleetname)s 생성 완료" msgstr "SRP 보상 플릿 %(fleetname)s 생성 완료"
#: allianceauth/srp/views.py:103 #: allianceauth/srp/views.py:103
#, python-format #, python-format
msgid "Removed SRP fleet %(fleetname)s." msgid "Removed SRP fleet %(fleetname)s."
msgstr "SRP 보상 함대 %(fleetname)s삭제 완료" msgstr "SRP 보상 플릿 %(fleetname)s삭제 완료"
#: allianceauth/srp/views.py:115 #: allianceauth/srp/views.py:115
#, python-format #, python-format
msgid "Disabled SRP fleet %(fleetname)s." msgid "Disabled SRP fleet %(fleetname)s."
msgstr "SRP 보상 함대 %(fleetname)s비활성화 완료" msgstr "SRP 보상 플릿 %(fleetname)s비활성화 완료"
#: allianceauth/srp/views.py:127 #: allianceauth/srp/views.py:127
#, python-format #, python-format
msgid "Enabled SRP fleet %(fleetname)s." msgid "Enabled SRP fleet %(fleetname)s."
msgstr "SRP 보상 함대 %(fleetname)s 활성화 완료" msgstr "SRP 보상 플릿 %(fleetname)s 활성화 완료"
#: allianceauth/srp/views.py:140 #: allianceauth/srp/views.py:140
#, python-format #, python-format
msgid "Marked SRP fleet %(fleetname)s as completed." msgid "Marked SRP fleet %(fleetname)s as completed."
msgstr "SRP 보상 함대 %(fleetname)s 을 완료된 것으로 표시" msgstr "SRP 보상 플릿 %(fleetname)s 을 완료된 것으로 표시"
#: allianceauth/srp/views.py:153 #: allianceauth/srp/views.py:153
#, python-format #, python-format
msgid "Marked SRP fleet %(fleetname)s as incomplete." msgid "Marked SRP fleet %(fleetname)s as incomplete."
msgstr "SRP 보상 함대 %(fleetname)s 을 미완료된 것으로 표시" msgstr "SRP 보상 플릿 %(fleetname)s 을 미완료된 것으로 표시"
#: allianceauth/srp/views.py:165 #: allianceauth/srp/views.py:165
#, python-format #, python-format
@@ -2082,7 +2079,7 @@ msgstr "SRP 보상 요청 %(requestid)s을 찾을 수 없습니다. "
#: allianceauth/srp/views.py:360 #: allianceauth/srp/views.py:360
#, python-format #, python-format
msgid "Saved changes to SRP fleet %(fleetname)s" msgid "Saved changes to SRP fleet %(fleetname)s"
msgstr "SRP 보상 요청 함대 %(fleetname)s의 변경 사항이 저장되었습니다." msgstr "SRP 보상 요청 플릿 %(fleetname)s의 변경 사항이 저장되었습니다."
#: allianceauth/templates/allianceauth/admin-status/overview.html:6 #: allianceauth/templates/allianceauth/admin-status/overview.html:6
msgid "Alliance Auth Notifications" msgid "Alliance Auth Notifications"
@@ -2232,7 +2229,7 @@ msgstr "중요"
#: allianceauth/timerboard/form.py:70 #: allianceauth/timerboard/form.py:70
msgid "Corp-Restricted" msgid "Corp-Restricted"
msgstr "코퍼레이션 제한" msgstr " 제한"
#: allianceauth/timerboard/models.py:14 #: allianceauth/timerboard/models.py:14
msgid "Not Specified" msgid "Not Specified"
@@ -2297,7 +2294,7 @@ msgstr "스트럭처 타이머"
#: allianceauth/timerboard/templates/timerboard/view.html:28 #: allianceauth/timerboard/templates/timerboard/view.html:28
msgid "Corp Timers" msgid "Corp Timers"
msgstr "코퍼레이션 타이머" msgstr " 타이머"
#: allianceauth/timerboard/templates/timerboard/view.html:35 #: allianceauth/timerboard/templates/timerboard/view.html:35
#: allianceauth/timerboard/templates/timerboard/view.html:202 #: allianceauth/timerboard/templates/timerboard/view.html:202

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "Notifications" %}{% endblock %} {% block page_title %}{% translate "Notifications" %}{% endblock %}

View File

@@ -1,4 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% translate "View Notification" %}{% endblock page_title %} {% block page_title %}{% translate "View Notification" %}{% endblock page_title %}

View File

@@ -1,16 +1,16 @@
from django.urls import path from django.conf.urls import url
from . import views from . import views
app_name = 'notifications' app_name = 'notifications'
# Notifications # Notifications
urlpatterns = [ urlpatterns = [
path('remove_notifications/<int:notif_id>/', views.remove_notification, name='remove'), url(r'^remove_notifications/(\w+)/$', views.remove_notification, name='remove'),
path('notifications/mark_all_read/', views.mark_all_read, name='mark_all_read'), url(r'^notifications/mark_all_read/$', views.mark_all_read, name='mark_all_read'),
path('notifications/delete_all_read/', views.delete_all_read, name='delete_all_read'), url(r'^notifications/delete_all_read/$', views.delete_all_read, name='delete_all_read'),
path('notifications/', views.notification_list, name='list'), url(r'^notifications/$', views.notification_list, name='list'),
path('notifications/<int:notif_id>/', views.notification_view, name='view'), url(r'^notifications/(\w+)/$', views.notification_view, name='view'),
path( url(
'user_notifications_count/<int:user_pk>/', r'^user_notifications_count/(?P<user_pk>\d+)/$',
views.user_notifications_count, views.user_notifications_count,
name='user_notifications_count' name='user_notifications_count'
), ),

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.optimer.apps.OptimerConfig'

View File

@@ -1,5 +1,5 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook from allianceauth.services.hooks import MenuItemHook, UrlHook
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks from allianceauth import hooks
from . import urls from . import urls

View File

@@ -1,5 +1,5 @@
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth.optimer.form_widgets import DataListWidget from allianceauth.optimer.form_widgets import DataListWidget

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
@@ -18,7 +19,7 @@
<form class="form-signin" role="form" action="" method="POST"> <form class="form-signin" role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }} {{ form|bootstrap }}
<br> <br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Create Fleet Operation" %}</button> <button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Create Fleet Operation" %}</button>
</form> </form>
</div> </div>

View File

@@ -21,7 +21,7 @@
<b>{% translate "Current Eve Time:" %} </b> <b>{% translate "Current Eve Time:" %} </b>
</div> </div>
<strong class="label label-info text-left" id="current-time"></strong> <strong class="label label-info text-left" id="current-time"></strong>
<br> <br />
</div> </div>
<h4><b>{% translate "Next Fleet Operations" %}</b></h4> <h4><b>{% translate "Next Fleet Operations" %}</b></h4>
@@ -40,7 +40,7 @@
</div> </div>
{% include 'bundles/moment-js.html' with locale=True %} {% include 'bundles/moment-js.html' with locale=True %}
{% include 'bundles/timers-js.html' %} <script src="{% static 'js/timers.js' %}"></script>
<script type="application/javascript"> <script type="application/javascript">
// Data // Data

View File

@@ -1,5 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load static %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
@@ -23,7 +24,7 @@
<form class="form-signin" role="form" action="" method="POST"> <form class="form-signin" role="form" action="" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }} {{ form|bootstrap }}
<br> <br/>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Update Fleet Operation" %} <button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Update Fleet Operation" %}
</button> </button>
</form> </form>

View File

@@ -1,12 +1,12 @@
from django.urls import path from django.conf.urls import url
from . import views from . import views
app_name = 'optimer' app_name = 'optimer'
urlpatterns = [ urlpatterns = [
path('', views.optimer_view, name='view'), url(r'^$', views.optimer_view, name='view'),
path('add/', views.add_optimer_view, name='add'), url(r'^add$', views.add_optimer_view, name='add'),
path('<int:optimer_id>/remove/', views.remove_optimer, name='remove'), url(r'^(\w+)/remove$', views.remove_optimer, name='remove'),
path('<int:optimer_id>/edit/', views.edit_optimer, name='edit'), url(r'^(\w+)/edit$', views.edit_optimer, name='edit'),
] ]

View File

@@ -6,7 +6,7 @@ from django.contrib.auth.decorators import permission_required
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from .form import OpForm from .form import OpForm
from .models import OpTimer, OpTimerType from .models import OpTimer, OpTimerType

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.permissions_tool.apps.PermissionsToolConfig'

View File

@@ -47,7 +47,7 @@
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %} {% include 'bundles/datatables-js.html' %}
{% include 'bundles/filterdropdown-js.html' %} <script type="application/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script>
{% endblock %} {% endblock %}
{% block extra_css %} {% block extra_css %}

View File

@@ -80,7 +80,7 @@
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %} {% include 'bundles/datatables-js.html' %}
{% include 'bundles/filterdropdown-js.html' %} <script type="application/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script>
{% endblock %} {% endblock %}
{% block extra_css %} {% block extra_css %}

View File

@@ -1,12 +1,11 @@
from django.urls import re_path from django.conf.urls import url
from django.urls import path
from . import views from . import views
app_name = 'permissions_tool' app_name = 'permissions_tool'
urlpatterns = [ urlpatterns = [
path('overview/', views.permissions_overview, name='overview'), url(r'^overview/$', views.permissions_overview, name='overview'),
re_path(r'^audit/(?P<app_label>[\w\-_]+)/(?P<model>[\w\-_]+)/(?P<codename>[\w\-_]+)/$', views.permissions_audit, url(r'^audit/(?P<app_label>[\w\-_]+)/(?P<model>[\w\-_]+)/(?P<codename>[\w\-_]+)/$', views.permissions_audit,
name='audit'), name='audit'),
] ]

View File

@@ -68,7 +68,6 @@ BASE_DIR = os.path.dirname(PROJECT_DIR)
MIDDLEWARE = [ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'allianceauth.authentication.middleware.UserSettingsMiddleware',
'django.middleware.locale.LocaleMiddleware', 'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
@@ -154,6 +153,8 @@ TIME_ZONE = 'UTC'
USE_I18N = True USE_I18N = True
USE_L10N = True
USE_TZ = True USE_TZ = True
# Static files (CSS, JavaScript, Images) # Static files (CSS, JavaScript, Images)
@@ -171,8 +172,11 @@ MESSAGE_TAGS = {
CACHES = { CACHES = {
"default": { "default": {
"BACKEND": "django_redis.cache.RedisCache", "BACKEND": "redis_cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1" # change the 1 here to change the database used "LOCATION": "localhost:6379",
"OPTIONS": {
"DB": 1,
}
} }
} }

View File

@@ -61,13 +61,6 @@ EMAIL_HOST_PASSWORD = ''
EMAIL_USE_TLS = True EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = '' DEFAULT_FROM_EMAIL = ''
# Cache compression can help on bigger auths where ram starts to become an issue.
# Uncomment the following 3 lines to enable.
#CACHES["default"]["OPTIONS"] = {
# "COMPRESSOR": "django_redis.compressors.lzma.LzmaCompressor",
#}
####################################### #######################################
# Add any custom settings below here. # # Add any custom settings below here. #
####################################### #######################################

View File

@@ -1,9 +1,8 @@
from django.conf.urls import include from django.conf.urls import include, url
from allianceauth import urls from allianceauth import urls
from django.urls import re_path
urlpatterns = [ urlpatterns = [
re_path(r'', include(urls)), url(r'', include(urls)),
] ]
handler500 = 'allianceauth.views.Generic500Redirect' handler500 = 'allianceauth.views.Generic500Redirect'

View File

@@ -0,0 +1 @@
default_app_config = 'allianceauth.services.apps.ServicesConfig'

View File

@@ -3,11 +3,11 @@ from django.contrib import admin
from allianceauth import hooks from allianceauth import hooks
from allianceauth.authentication.admin import ( from allianceauth.authentication.admin import (
MainAllianceFilter,
MainCorporationsFilter,
user_main_organization,
user_profile_pic, user_profile_pic,
user_username, user_username,
user_main_organization,
MainCorporationsFilter,
MainAllianceFilter
) )
from .models import NameFormatConfig from .models import NameFormatConfig
@@ -17,7 +17,7 @@ class ServicesUserAdmin(admin.ModelAdmin):
"""Parent class for UserAdmin classes for all services""" """Parent class for UserAdmin classes for all services"""
class Media: class Media:
css = { css = {
"all": ("allianceauth/services/admin.css",) "all": ("services/admin.css",)
} }
search_fields = ('user__username',) search_fields = ('user__username',)
@@ -36,19 +36,18 @@ class ServicesUserAdmin(admin.ModelAdmin):
MainAllianceFilter, MainAllianceFilter,
'user__date_joined', 'user__date_joined',
) )
list_select_related = (
'user', 'user__profile__main_character', 'user__profile__state'
)
@admin.display(ordering='user__profile__state__name')
def _state(self, obj): def _state(self, obj):
return obj.user.profile.state.name return obj.user.profile.state.name
_state.short_description = 'state' @admin.display(ordering='user__date_joined')
_state.admin_order_field = 'user__profile__state__name'
def _date_joined(self, obj): def _date_joined(self, obj):
return obj.user.date_joined return obj.user.date_joined
_date_joined.short_description = 'date joined'
_date_joined.admin_order_field = 'user__date_joined'
class NameFormatConfigForm(forms.ModelForm): class NameFormatConfigForm(forms.ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@@ -62,6 +61,7 @@ class NameFormatConfigForm(forms.ModelForm):
self.fields['service_name'] = forms.ChoiceField(choices=SERVICE_CHOICES) self.fields['service_name'] = forms.ChoiceField(choices=SERVICE_CHOICES)
@admin.register(NameFormatConfig)
class NameFormatConfigAdmin(admin.ModelAdmin): class NameFormatConfigAdmin(admin.ModelAdmin):
form = NameFormatConfigForm form = NameFormatConfigForm
list_display = ('service_name', 'get_state_display_string') list_display = ('service_name', 'get_state_display_string')
@@ -69,6 +69,3 @@ class NameFormatConfigAdmin(admin.ModelAdmin):
def get_state_display_string(self, obj): def get_state_display_string(self, obj):
return ', '.join([state.name for state in obj.states.all()]) return ', '.join([state.name for state in obj.states.all()])
get_state_display_string.short_description = 'States' get_state_display_string.short_description = 'States'
admin.site.register(NameFormatConfig, NameFormatConfigAdmin)

View File

@@ -1,5 +1,5 @@
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import ugettext_lazy as _
class FleetFormatterForm(forms.Form): class FleetFormatterForm(forms.Form):

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