Compare commits

...

97 Commits

Author SHA1 Message Date
Ariel Rin
5e14ea4573 Version Bump 3.5.0 2023-07-11 13:01:50 +10:00
Ariel Rin
c743eca0f7 Merge branch 'fix-use-of-deprecated-function-calls' into 'master'
[FIX] Use of deprecated `logger.warn()` function calls

See merge request allianceauth/allianceauth!1516
2023-07-11 02:36:59 +00:00
Ariel Rin
2002f24178 Merge branch 'limit-django-registration' into 'master'
[COMPATIBILITY] Limit `django-registration` to <3.4

See merge request allianceauth/allianceauth!1512
2023-07-07 23:57:30 +00:00
Ariel Rin
6412aedf53 Merge branch 'add-docs-for-external-link' into 'master'
Add customization example to docs

See merge request allianceauth/allianceauth!1511
2023-07-07 23:56:07 +00:00
Erik Kalkoken
939df08b95 Add customization example to docs 2023-07-07 23:56:07 +00:00
Ariel Rin
d8506aa753 Merge branch 'pkg-config' into 'master'
add pkg-config to our system package dependencies, for mysqlclient 2.2.0

Closes #1376

See merge request allianceauth/allianceauth!1509
2023-07-07 23:54:41 +00:00
Ariel Rin
3f2cdac658 Merge branch 'devdocs-1' into 'master'
Add pkg-config install to dev setup and expand python downgrade note.

See merge request allianceauth/allianceauth!1510
2023-07-07 23:54:39 +00:00
Peter Pfeufer
d57ab01ff3 [FIX] Use of deprecated logger.warn() function calls 2023-07-07 17:51:55 +02:00
Peter Pfeufer
91b62bbe9d [COMPATIBILITY] Limit django-registration to <3.4 2023-07-04 12:51:12 +02:00
Max Tsero
557a52e3c8 Add pkg-config install to dev setup and expand python downgrade note. 2023-07-02 10:39:23 +00:00
Ariel Rin
f8fefd92a5 add pkg-config to our system package dependencies, for mysqlclient 2.2.0 2023-06-27 11:08:59 +10:00
Ariel Rin
f2c43ee921 Merge branch 'add-docs-app-unintall' into 'master'
Improve documentation for app removal

See merge request allianceauth/allianceauth!1508
2023-06-20 14:34:32 +00:00
Erik Kalkoken
99945b0146 Improve documentation for app removal 2023-06-20 14:34:32 +00:00
Ariel Rin
abb9dc4db6 Merge branch 'master' into 'master'
Add utf8mb4 unicode option to mysql config in local.py

See merge request allianceauth/allianceauth!1503
2023-06-03 07:04:52 +00:00
Valiantiam
eba5b80cde Add utf8mb4 unicode option to mysql config in local.py 2023-06-03 07:04:52 +00:00
Ariel Rin
5b39c887a5 Merge branch 'master' into 'master'
Add Grafana datasoure and dashboard provisioning

See merge request allianceauth/allianceauth!1501
2023-06-03 05:06:23 +00:00
Ariel Rin
183363e789 Merge branch 'add-ukrainian-to-userprofile-language-selection' into 'master'
[ADDED] Ukrainian to `UserProfile.LANGUAGE_CHOICES`

See merge request allianceauth/allianceauth!1505
2023-06-03 05:04:34 +00:00
Ariel Rin
d8704f4d8f Merge branch 'add-ipv6-to-nginx-config' into 'master'
[ADDED] IPv6 to Nginx config

See merge request allianceauth/allianceauth!1506
2023-06-03 05:03:17 +00:00
Peter Pfeufer
165ee44a63 [ADDED] IPv6 to Nginx config
IPv6 is almost 25 years old, time to add it to our config …
2023-05-31 09:29:04 +02:00
Peter Pfeufer
e8f508cecb [CHANGE] Switched to more modern models.TextChoices class for languages 2023-05-28 18:31:50 +02:00
Peter Pfeufer
3044f18900 [ADDED] Ukrainian to UserProfile.LANGUAGE_CHOICES 2023-05-28 17:38:51 +02:00
MillerUk
79637020f3 add grafana datasoure and dashboard provisioning 2023-05-16 22:14:11 +00:00
MillerUk
2d34422e2d add grafana datasoure and dashboard provisioning 2023-04-30 20:32:40 +00:00
Ariel Rin
6b932b1188 Version Bump 3.4.0 2023-04-25 20:57:26 +10:00
Ariel Rin
f62153c746 Bump grafana minor for new installs 2023-04-25 20:38:48 +10:00
Ariel Rin
88216c3f81 Merge branch 'improve-dependency-bounds' into 'master'
Reduce upper bound version constraints

See merge request allianceauth/allianceauth!1498
2023-04-25 10:07:06 +00:00
Erik Kalkoken
dc983c31e3 Reduce upper bound version constraints 2023-04-25 10:07:06 +00:00
Ariel Rin
4204c44bde Merge branch 'transifex' into 'master'
Update from Transifex

See merge request allianceauth/allianceauth!1497
2023-04-25 10:05:38 +00:00
Ariel Rin
8da0122d17 Update from Transifex 2023-04-25 10:05:38 +00:00
Ariel Rin
c9fcf6e6bf Merge branch 'dev-team-update' into 'master'
[Change] Dev Team updated in readme

See merge request allianceauth/allianceauth!1499
2023-04-25 10:05:23 +00:00
Peter Pfeufer
36866cc59b [ADDED] snipere4agle1 to the list of active developers 2023-04-24 09:56:40 +02:00
Peter Pfeufer
298bdd98ed [Change] Dev Team updated in readme 2023-04-24 09:50:47 +02:00
Ariel Rin
819018748d Merge branch 'fix-dev-docs-mysql' into 'master'
Fix mysql Django config for developers

See merge request allianceauth/allianceauth!1483
2023-04-12 03:40:50 +00:00
Erik Kalkoken
32e8e0fdd0 Fix mysql Django config for developers 2023-04-12 03:40:50 +00:00
Ariel Rin
7625060a12 Merge branch 'improve-installation-docs' into 'master'
Improve installation guide database section for Ubuntu

See merge request allianceauth/allianceauth!1494
2023-04-12 01:52:54 +00:00
Erik Kalkoken
672cb13bfe Improve installation guide database section for Ubuntu 2023-04-12 01:52:54 +00:00
Ariel Rin
7170f75b89 Merge branch 'add-docs-copy-button' into 'master'
Add copy button to  bash snippets in docs

See merge request allianceauth/allianceauth!1493
2023-04-12 01:47:43 +00:00
Erik Kalkoken
8f60c7a00a Add copy button to bash snippets in docs 2023-04-12 01:47:43 +00:00
Ariel Rin
34ae6e402c Merge branch 'tsTests' into 'master'
Fix TS Tests when testing against a real MySQL backend

See merge request allianceauth/allianceauth!1495
2023-04-12 01:42:48 +00:00
Aaron Kable
0905e48994 Merge remote-tracking branch 'origin/master' into tsTests 2023-04-10 19:49:33 +08:00
Aaron Kable
02fcf7d500 fix TS Tests with mySql 2023-04-10 19:45:28 +08:00
Ariel Rin
8d8da50946 Merge branch '1481-alt' into 'master'
!1481 - Alternate

See merge request allianceauth/allianceauth!1489
2023-04-04 01:47:27 +00:00
Ariel Rin
c1499d173f !1481 - Alternate 2023-04-04 01:47:26 +00:00
Ariel Rin
b149baa4e5 Merge branch 'combine-imports' into 'master'
Combining imports

See merge request allianceauth/allianceauth!1478
2023-02-13 03:21:24 +00:00
Ariel Rin
4807c69b5e Merge branch 'isort' into 'master'
Standardise isort

See merge request allianceauth/allianceauth!1485
2023-02-13 03:11:32 +00:00
Ariel Rin
ebefa0e307 Standardise isort 2023-02-13 03:11:32 +00:00
Ariel Rin
468e7433f9 Merge branch 'py3.11' into 'master'
Add Python 3.11 Support

See merge request allianceauth/allianceauth!1487
2023-02-13 03:06:03 +00:00
Ariel Rin
3ca313f907 Add Python 3.11 Support 2023-02-13 03:06:03 +00:00
Ariel Rin
820065fc04 Merge branch 'update-install-docu' into 'master'
Improve installation guide

See merge request allianceauth/allianceauth!1488
2023-02-13 03:05:41 +00:00
Erik Kalkoken
3eddeefe28 Improve installation guide 2023-02-13 03:05:41 +00:00
Ariel Rin
82d7d7e3bf Merge branch 'arielcode' into 'master'
Extra < in bundle

See merge request allianceauth/allianceauth!1486
2023-02-02 03:27:34 +00:00
Ariel Rin
93194b4f2d pesky < 2023-01-25 16:17:29 +10:00
Ariel Rin
fa335253d3 Merge branch 'pypy' into 'master'
Add pypy testing

See merge request allianceauth/allianceauth!1474
2023-01-25 05:00:16 +00:00
Ariel Rin
d1af9416b3 Add pypy testing 2023-01-25 05:00:16 +00:00
Ariel Rin
f4ac2ea400 Merge branch 'faster-commands' into 'master'
Faster management commands

See merge request allianceauth/allianceauth!1484
2023-01-25 03:25:47 +00:00
Erik Kalkoken
31c1f8bb7d Faster management commands 2023-01-25 03:25:47 +00:00
Ariel Rin
57f7178f1e Merge branch 'docker_docs' into 'master'
Update Docker Docs and fix custom.dockerfile

See merge request allianceauth/allianceauth!1477
2022-12-31 09:37:54 +00:00
Ariel Rin
17d4a4c415 Merge branch 'change-packaging-dependency' into 'master'
Don't limit `packaging` to versions below 22.0

See merge request allianceauth/allianceauth!1479
2022-12-20 10:01:50 +00:00
Peter Pfeufer
18ce433fa0 Don't limit packaging to versions below 22.0 2022-12-20 10:01:50 +00:00
Ariel Rin
1eadb1d934 Merge branch 'fix-tox-4-issue' into 'master'
Adopt docs section to work with tox 4

See merge request allianceauth/allianceauth!1480
2022-12-20 08:38:59 +00:00
Erik Kalkoken
59a8f8a967 Adopt docs section to work with tox 4 2022-12-20 08:38:59 +00:00
Peter Pfeufer
2dc07b5519 Combining imports 2022-12-09 23:48:17 +01:00
Aaron Kable
3454520dfe update docker docs and fix custom.dockerfile 2022-11-24 21:56:33 +08:00
Ariel Rin
7a195d4158 Merge branch 'docs' into 'master'
Tuning Docs - Redis Compression

See merge request allianceauth/allianceauth!1475
2022-11-03 10:33:25 +00:00
Ariel Rin
b73072dec0 Tuning Docs - Redis Compression 2022-11-03 10:33:24 +00:00
Ariel Rin
1ca5e38bd9 Merge branch 'fix-docker-tag' into 'master'
fix missing v in tag

See merge request allianceauth/allianceauth!1476
2022-11-03 10:32:29 +00:00
Matteo Ghia
ecb737c6a5 fix missing v in tag 2022-11-01 13:45:44 +01:00
Ariel Rin
7063f53cdf Merge branch 'coverage' into 'master'
Adding Coverage % to MRs

See merge request allianceauth/allianceauth!1473
2022-10-25 10:10:33 +00:00
Ariel Rin
017424b9d4 Adding Coverage % to MRs 2022-10-25 10:10:33 +00:00
Ariel Rin
f6c26cf2ec Merge branch 'py3.11' into 'master'
Python 3.11 Stable Tests

See merge request allianceauth/allianceauth!1471
2022-10-25 02:51:12 +00:00
Ariel Rin
9a422bd4ca Python 3.11 Stable Tests 2022-10-25 02:51:12 +00:00
Ariel Rin
47fec23f2e cap django for docs 2022-10-23 16:42:16 +10:00
Ariel Rin
399ef1917d Version Bump 3.3.0 2022-10-14 21:46:28 +10:00
Ariel Rin
9db443ba54 Merge branch 'tokens-and-alts' into 'master'
CCP SSO Issues, Mitigations

See merge request allianceauth/allianceauth!1472
2022-10-14 11:44:18 +00:00
Ariel Rin
0f2f5ea0ba nowrap to stop buttons moving around 2022-10-14 20:21:07 +10:00
Ariel Rin
1f781c5037 datatables statesave 2022-10-12 20:52:59 +10:00
Ariel Rin
36dedfcbd2 add disclaimer 2022-10-12 20:51:36 +10:00
Ariel Rin
13a05606fb Scopes Typo 2022-10-12 20:29:42 +10:00
Ariel Rin
90ad7790e1 rename revoke to delete to be clearer 2022-10-12 20:22:20 +10:00
Ariel Rin
6b8341ab5a Add FA icon to user dropdown 2022-10-12 20:21:27 +10:00
Ariel Rin
d15f42b3fd Merge branch 'tokens-and-alts' of https://gitlab.com/aaronkable/allianceauth into tokens-and-alts 2022-10-12 20:07:49 +10:00
Aaron Kable
cc60b26f5a add token management link to user dropdown 2022-10-12 17:57:12 +08:00
Aaron Kable
36ff0af993 Add token management and restrict logins to mains only 2022-10-12 17:50:41 +08:00
Aaron Kable
f17c94a9e1 Add token management and restrict logins to mains only 2022-10-12 17:49:28 +08:00
Ariel Rin
7e3ba476f3 Merge branch 'docs' into 'master'
Discord Credential Clarification

See merge request allianceauth/allianceauth!1470
2022-10-12 08:07:02 +00:00
Ariel Rin
dd1313a2a9 Merge branch 'remove-unnecessary-lambda-statement' into 'master'
[REMOVED] Unnecessary `lambda` statement

See merge request allianceauth/allianceauth!1465
2022-10-09 08:17:46 +00:00
Ariel Rin
763003bd7d Clarify new discord developers layout 2022-10-09 17:41:41 +10:00
Ariel Rin
f3217443dd Merge branch 'remove-celery-backend-from-docker' into 'master'
[REMOVED] Celery backend from docker config

See merge request allianceauth/allianceauth!1466
2022-10-09 07:16:04 +00:00
Ariel Rin
a713ae1914 Merge branch 'fix-default-perms-for-static-files' into 'master'
[FIX] Default permissions for static files

See merge request allianceauth/allianceauth!1469
2022-10-09 06:15:18 +00:00
Peter Pfeufer
5815bac0df [FIX] Default permissions for static files
A little fallacy on my end in the docs.

655 is enough for files in those directories, but the directories themselves need to be traversal, so 755 for the directories ...
2022-09-22 19:54:58 +02:00
Ariel Rin
6154d2c2e7 Merge branch 'better-exclude-regex' into 'master'
[CHANGE] Better regex for exclusion in pre-commit

See merge request allianceauth/allianceauth!1468
2022-09-18 08:26:22 +00:00
Peter Pfeufer
b34661b35d [CHANGE] Better regex for exclusion in pre-commit 2022-09-18 08:26:22 +00:00
Ariel Rin
a9a7e03b80 Merge branch 'capntack-master-patch-07678' into 'master'
Update switch_to_non_root.md

See merge request allianceauth/allianceauth!1467
2022-09-16 14:48:08 +00:00
Tack
23c797ef64 Update switch_to_non_root.md
chmod requires "-R" to be Recursive, not "-r"
2022-09-14 16:51:10 +00:00
Peter Pfeufer
9133232c20 [REMOVED] Celery backend from docker config 2022-09-14 13:06:30 +02:00
Peter Pfeufer
9cbabee126 [CHANGE] Language names always start with a capital letter 2022-09-13 21:00:31 +02:00
Peter Pfeufer
4026523a2e [REMOVED] Unnecessary lambda statement
The `lambda` statement in `base.py` is unnecessary and has no effect.

```py
ugettext = lambda s: s
LANGUAGES = (
    ("en", ugettext("English")),
    ("de", ugettext("German")),
    ("es", ugettext("Spanish")),
    ("zh-hans", ugettext("Chinese Simplified")),
    ("ru", ugettext("Russian")),
    ("ko", ugettext("Korean")),
    ("fr", ugettext("French")),
    ("ja", ugettext("Japanese")),
    ("it", ugettext("Italian")),
)
```

In this case `ugettext = lambda s: s` is pretty much the same as:
```py
def ugettext(s):
    return s
```
And would simply return the string the function receives as parameter.

So we can omit this completely and simplify the `LANGUAGES` list to:

```py
LANGUAGES = (
    ("en", "English"),
    ("de", "German"),
    ("es", "Spanish"),
    ("zh-hans", "Chinese Simplified"),
    ("ru", "Russian"),
    ("ko", "Korean"),
    ("fr", "French"),
    ("ja", "Japanese"),
    ("it", "Italian"),
)
```
2022-09-13 20:59:14 +02:00
72 changed files with 4064 additions and 944 deletions

4
.gitignore vendored
View File

@@ -69,11 +69,7 @@ celerybeat-schedule
#gitlab configs
.gitlab/
#transifex
.tx/
#other
.flake8
.pylintrc
Makefile
.isort.cfg

View File

@@ -25,7 +25,7 @@ before_script:
pre-commit-check:
<<: *only-default
stage: pre-commit
image: python:3.8-bullseye
image: python:3.10-bullseye
variables:
PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
cache:
@@ -89,7 +89,7 @@ test-3.10-core:
test-3.11-core:
<<: *only-default
image: python:3.11-rc-bullseye
image: python:3.11-bullseye
script:
- tox -e py311-core
artifacts:
@@ -98,6 +98,18 @@ test-3.11-core:
coverage_report:
coverage_format: cobertura
path: coverage.xml
test-pvpy-core:
<<: *only-default
image: pypy:3.9-bullseye
script:
- tox -e pypy-all
artifacts:
when: always
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml
allow_failure: true
test-3.8-all:
@@ -138,7 +150,7 @@ test-3.10-all:
test-3.11-all:
<<: *only-default
image: python:3.11-rc-bullseye
image: python:3.11-bullseye
script:
- tox -e py311-all
artifacts:
@@ -147,6 +159,19 @@ test-3.11-all:
coverage_report:
coverage_format: cobertura
path: coverage.xml
coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
test-pvpy-all:
<<: *only-default
image: pypy:3.9-bullseye
script:
- tox -e pypy-all
artifacts:
when: always
reports:
coverage_report:
coverage_format: cobertura
path: coverage.xml
allow_failure: true
build-test:

6
.isort.cfg Normal file
View File

@@ -0,0 +1,6 @@
[settings]
profile=django
sections=FUTURE,STDLIB,THIRDPARTY,DJANGO,ESI,FIRSTPARTY,LOCALFOLDER
known_esi=esi
known_django=django
skip_gitignore=true

View File

@@ -5,7 +5,7 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.3.0
rev: v4.4.0
hooks:
- id: check-case-conflict
- id: check-json
@@ -13,27 +13,49 @@ repos:
- id: check-yaml
- id: fix-byte-order-marker
- id: trailing-whitespace
exclude: (\.min\.css|\.min\.js|\.mo|\.po|swagger\.json)$
exclude: |
(?x)(
\.min\.css|
\.min\.js|
\.po|
\.mo|
swagger\.json
)
- id: end-of-file-fixer
exclude: (\.min\.css|\.min\.js|\.mo|\.po|swagger\.json)$
exclude: |
(?x)(
\.min\.css|
\.min\.js|
\.po|
\.mo|
swagger\.json
)
- id: mixed-line-ending
args: [ '--fix=lf' ]
- id: fix-encoding-pragma
args: [ '--remove' ]
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 2.4.0
rev: 2.7.1
hooks:
- id: editorconfig-checker
exclude: ^(LICENSE|allianceauth\/static\/allianceauth\/css\/themes\/bootstrap-locals.less|allianceauth\/eveonline\/swagger.json|(.*.po)|(.*.mo))
exclude: |
(?x)(
LICENSE|
allianceauth\/static\/allianceauth\/css\/themes\/bootstrap-locals.less|
\.po|
\.mo|
swagger\.json
)
- repo: https://github.com/asottile/pyupgrade
rev: v2.34.0
rev: v3.3.1
hooks:
- id: pyupgrade
args: [ --py38-plus ]
- repo: https://github.com/asottile/setup-cfg-fmt
rev: v1.20.1
rev: v2.2.0
hooks:
- id: setup-cfg-fmt
args: [ --include-version-classifiers ]

10
.tx/config Normal file
View File

@@ -0,0 +1,10 @@
[main]
host = https://www.transifex.com
lang_map = zh-Hans: zh_Hans
[o:alliance-auth:p:alliance-auth:r:django-po]
file_filter = allianceauth/locale/<lang>/LC_MESSAGES/django.po
source_file = allianceauth/locale/en/LC_MESSAGES/django.po
source_lang = en
type = PO
minimum_perc = 0

10
.tx/config_20230406134150.bak Executable file
View File

@@ -0,0 +1,10 @@
[main]
host = https://www.transifex.com
lang_map = zh-Hans:zh_Hans
[alliance-auth.django-po]
file_filter = allianceauth/locale/<lang>/LC_MESSAGES/django.po
minimum_perc = 0
source_file = allianceauth/locale/en/LC_MESSAGES/django.po
source_lang = en
type = PO

View File

@@ -36,7 +36,7 @@ Main features:
- Can be easily extended with additional services and apps. Many are provided by the community and can be found here: [Community Creations](https://gitlab.com/allianceauth/community-creations)
- English :flag_gb:, Chinese :flag_cn:, German :flag_de:, Spanish :flag_es:, Korean :flag_kr: and Russian :flag_ru: localization
- English :flag_gb:, Chinese :flag_cn:, German :flag_de:, Spanish :flag_es:, Korean :flag_kr:, Russian :flag_ru:, Italian :flag_it:, French :flag_fr:, Japanese :flag_jp: and Ukrainian :flag_ua: Localization
For further details about AA - including an installation guide and a full list of included services and plugin apps - please see the [official documentation](http://allianceauth.rtfd.io).
@@ -56,13 +56,15 @@ Here is an example of the Alliance Auth web site with some plug-ins apps and ser
- [Aaron Kable](https://gitlab.com/aaronkable/)
- [Ariel Rin](https://gitlab.com/soratidus999/)
- [Basraah](https://gitlab.com/basraah/)
- [Col Crunch](https://gitlab.com/colcrunch/)
- [Erik Kalkoken](https://gitlab.com/ErikKalkoken/)
- [Rounon Dax](https://gitlab.com/ppfeufer)
- [snipereagle1](https://gitlab.com/mckernanin)
### Former Developers
- [Adarnof](https://gitlab.com/adarnof/)
- [Basraah](https://gitlab.com/basraah/)
### Beta Testers / Bug Fixers

View File

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

View File

@@ -8,13 +8,13 @@ from uuid import uuid4
class AnalyticsIdentifier(models.Model):
identifier = models.UUIDField(default=uuid4,
editable=False)
editable=False)
def save(self, *args, **kwargs):
if not self.pk and AnalyticsIdentifier.objects.exists():
# Force a single object
raise ValidationError('There is can be only one \
AnalyticsIdentifier instance')
AnalyticsIdentifier instance')
self.pk = self.id = 1 # If this happens to be deleted and recreated, force it to be 1
return super().save(*args, **kwargs)

View File

@@ -2,6 +2,7 @@ import logging
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User, Permission
from django.contrib import messages
from .models import UserProfile, CharacterOwnership, OwnershipRecord
@@ -37,7 +38,13 @@ class StateBackend(ModelBackend):
ownership = CharacterOwnership.objects.get(character__character_id=token.character_id)
if ownership.owner_hash == token.character_owner_hash:
logger.debug(f'Authenticating {ownership.user} by ownership of character {token.character_name}')
return ownership.user
if ownership.user.profile.main_character:
if ownership.user.profile.main_character.character_id == token.character_id:
return ownership.user
else: ## this is an alt, enforce main only.
if request:
messages.error("Unable to authenticate with this Character, Please log in with the main character associated with this account.")
return None
else:
logger.debug(f'{token.character_name} has changed ownership. Creating new user account.')
ownership.delete()
@@ -57,13 +64,20 @@ class StateBackend(ModelBackend):
if records.exists():
# we've seen this character owner before. Re-attach to their old user account
user = records[0].user
if user.profile.main_character:
if ownership.user.profile.main_character.character_id != token.character_id:
## this is an alt, enforce main only due to trust issues in SSO.
if request:
messages.error("Unable to authenticate with this Character, Please log in with the main character associated with this account. Then add this character from the dashboard.")
return None
token.user = user
co = CharacterOwnership.objects.create_by_token(token)
logger.debug(f'Authenticating {user} by matching owner hash record of character {co.character}')
if not user.profile.main_character:
# set this as their main by default if they have none
user.profile.main_character = co.character
user.profile.save()
# set this as their main by default as they have none
user.profile.main_character = co.character
user.profile.save()
return user
logger.debug(f'Unable to authenticate character {token.character_name}. Creating new user.')
return self.create_user(token)

View File

@@ -0,0 +1,34 @@
# Generated by Django 4.0.10 on 2023-05-28 15:36
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentication", "0020_userprofile_language_userprofile_night_mode"),
]
operations = [
migrations.AlterField(
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"),
("uk", "Ukrainian"),
],
default="",
max_length=10,
verbose_name="Language",
),
),
]

View File

@@ -18,13 +18,13 @@ class State(models.Model):
priority = models.IntegerField(unique=True, help_text="Users get assigned the state with the highest priority available to them.")
member_characters = models.ManyToManyField(EveCharacter, blank=True,
help_text="Characters to which this state is available.")
help_text="Characters to which this state is available.")
member_corporations = models.ManyToManyField(EveCorporationInfo, blank=True,
help_text="Corporations to whose members this state is available.")
help_text="Corporations to whose members this state is available.")
member_alliances = models.ManyToManyField(EveAllianceInfo, blank=True,
help_text="Alliances to whose members this state is available.")
help_text="Alliances to whose members this state is available.")
member_factions = models.ManyToManyField(EveFactionInfo, blank=True,
help_text="Factions to whose members this state is available.")
help_text="Factions to whose members this state is available.")
public = models.BooleanField(default=False, help_text="Make this state available to any character.")
objects = StateManager()
@@ -63,6 +63,22 @@ class UserProfile(models.Model):
class Meta:
default_permissions = ('change',)
class Language(models.TextChoices):
"""
Choices for UserProfile.language
"""
ENGLISH = 'en', _('English')
GERMAN = 'de', _('German')
SPANISH = 'es', _('Spanish')
CHINESE = 'zh-hans', _('Chinese Simplified')
RUSSIAN = 'ru', _('Russian')
KOREAN = 'ko', _('Korean')
FRENCH = 'fr', _('French')
JAPANESE = 'ja', _('Japanese')
ITALIAN = 'it', _('Italian')
UKRAINIAN = 'uk', _('Ukrainian')
user = models.OneToOneField(
User,
related_name='profile',
@@ -76,20 +92,9 @@ class UserProfile(models.Model):
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,
choices=Language.choices,
blank=True,
default='')
night_mode = models.BooleanField(

View File

@@ -0,0 +1,62 @@
{% extends "allianceauth/base.html" %}
{% load i18n %}
{% block page_title %}{% translate "Dashboard" %}{% endblock %}
{% block content %}
<h1 class="page-header text-center">{% translate "Token Management" %}</h1>
<div class="col-sm-12">
<table class="table table-aa" id="table_tokens" style="width:100%">
<thead>
<tr>
<th>{% translate "Scopes" %}</th>
<th class="text-right">{% translate "Actions" %}</th>
<th>{% translate "Character" %}</th>
</tr>
</thead>
<tbody>
{% for t in tokens %}
<tr>
<td styl="white-space:initial;">{% for s in t.scopes.all %}<span class="label label-default">{{s.name}}</span> {% endfor %}</td>
<td nowrap class="text-right"><a href="{% url 'authentication:token_delete' t.id %}" class="btn btn-danger"><i class="fas fa-trash"></i></a> <a href="{% url 'authentication:token_refresh' t.id %}" class="btn btn-success"><i class="fas fa-sync-alt"></i></a></td>
<td>{{t.character_name}}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% translate "This page is a best attempt, but backups or database logs can still contain your tokens. Always revoke tokens on https://community.eveonline.com/support/third-party-applications/ where possible."|urlize %}
</div>
{% endblock %}
{% block extra_javascript %}
{% include 'bundles/datatables-js.html' %}
{% endblock %}
{% block extra_css %}
{% include 'bundles/datatables-css.html' %}
{% endblock %}
{% block extra_script %}
$(document).ready(function(){
let grp = 2;
var table = $('#table_tokens').DataTable({
"columnDefs": [{ orderable: false, targets: [0,1] },{ "visible": false, "targets": grp }],
"order": [[grp, 'asc']],
"drawCallback": function (settings) {
var api = this.api();
var rows = api.rows({ page: 'current' }).nodes();
var last = null;
api.column(grp, { page: 'current' })
.data()
.each(function (group, i) {
if (last !== group) {
$(rows).eq(i).before('<tr class="info"><td colspan="3">' + group + '</td></tr>');
last = group;
}
});
},
"stateSave": true,
});
});
{% endblock %}

View File

@@ -6,7 +6,7 @@
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local }} ({{ language.code }})
{{ language.name_local|capfirst }} ({{ language.code }})
</option>
{% endfor %}
</select>

View File

@@ -116,10 +116,17 @@ class TestAuthenticate(TestCase):
user = StateBackend().authenticate(token=t)
self.assertEqual(user, self.user)
""" Alt Login disabled
def test_authenticate_alt_character(self):
t = Token(character_id=self.alt_character.character_id, character_owner_hash='2')
user = StateBackend().authenticate(token=t)
self.assertEqual(user, self.user)
"""
def test_authenticate_alt_character_fail(self):
t = Token(character_id=self.alt_character.character_id, character_owner_hash='2')
user = StateBackend().authenticate(token=t)
self.assertEqual(user, None)
def test_authenticate_unclaimed_character(self):
t = Token(character_id=self.unclaimed_character.character_id, character_name=self.unclaimed_character.character_name, character_owner_hash='3')
@@ -128,6 +135,7 @@ class TestAuthenticate(TestCase):
self.assertEqual(user.username, 'Unclaimed_Character')
self.assertEqual(user.profile.main_character, self.unclaimed_character)
""" Alt Login disabled
def test_authenticate_character_record(self):
t = Token(character_id=self.unclaimed_character.character_id, character_name=self.unclaimed_character.character_name, character_owner_hash='4')
OwnershipRecord.objects.create(user=self.old_user, character=self.unclaimed_character, owner_hash='4')
@@ -135,6 +143,15 @@ class TestAuthenticate(TestCase):
self.assertEqual(user, self.old_user)
self.assertTrue(CharacterOwnership.objects.filter(owner_hash='4', user=self.old_user).exists())
self.assertTrue(user.profile.main_character)
"""
def test_authenticate_character_record_fails(self):
t = Token(character_id=self.unclaimed_character.character_id, character_name=self.unclaimed_character.character_name, character_owner_hash='4')
OwnershipRecord.objects.create(user=self.old_user, character=self.unclaimed_character, owner_hash='4')
user = StateBackend().authenticate(token=t)
self.assertEqual(user, self.old_user)
self.assertTrue(CharacterOwnership.objects.filter(owner_hash='4', user=self.old_user).exists())
self.assertTrue(user.profile.main_character)
def test_iterate_username(self):
t = Token(character_id=self.unclaimed_character.character_id,

View File

@@ -22,5 +22,20 @@ urlpatterns = [
views.add_character,
name='add_character'
),
path(
'account/tokens/manage/',
views.token_management,
name='token_management'
),
path(
'account/tokens/delete/<int:token_id>',
views.token_delete,
name='token_delete'
),
path(
'account/tokens/refresh/<int:token_id>',
views.token_refresh,
name='token_refresh'
),
path('dashboard/', views.dashboard, name='dashboard'),
]

View File

@@ -61,6 +61,44 @@ def dashboard(request):
}
return render(request, 'authentication/dashboard.html', context)
@login_required
def token_management(request):
tokens = request.user.token_set.all()
context = {
'tokens': tokens
}
return render(request, 'authentication/tokens.html', context)
@login_required
def token_delete(request, token_id=None):
try:
token = Token.objects.get(id=token_id)
if request.user == token.user:
token.delete()
messages.success(request, "Token Deleted.")
else:
messages.error(request, "This token does not belong to you.")
except Token.DoesNotExist:
messages.warning(request, "Token does not exist")
return redirect('authentication:token_management')
@login_required
def token_refresh(request, token_id=None):
try:
token = Token.objects.get(id=token_id)
if request.user == token.user:
try:
token.refresh()
messages.success(request, "Token refreshed.")
except Exception as e:
messages.warning(request, f"Failed to refresh token. {e}")
else:
messages.error(request, "This token does not belong to you.")
except Token.DoesNotExist:
messages.warning(request, "Token does not exist")
return redirect('authentication:token_management')
@login_required
@token_required(scopes=settings.LOGIN_TOKEN_SCOPES)

View File

@@ -8,6 +8,7 @@ from django.conf import settings
from esi.clients import esi_client_factory
from allianceauth import __version__
from allianceauth.utils.django import StartupCommand
SWAGGER_SPEC_PATH = os.path.join(os.path.dirname(
@@ -175,15 +176,16 @@ class EveProvider:
class EveSwaggerProvider(EveProvider):
def __init__(self, token=None, adapter=None):
if settings.DEBUG:
if settings.DEBUG or StartupCommand().is_management_command:
self._client = None
logger.info(
'DEBUG mode detected: ESI client will be loaded on-demand.'
)
logger.info('ESI client will be loaded on-demand')
else:
logger.info('Loading ESI client')
try:
self._client = esi_client_factory(
token=token, spec_file=SWAGGER_SPEC_PATH, app_info_text=("allianceauth v" + __version__)
token=token,
spec_file=SWAGGER_SPEC_PATH,
app_info_text=f"allianceauth v{__version__}"
)
except (HTTPError, RefResolutionError):
logger.exception(

View File

@@ -57,7 +57,7 @@ def hr_application_create_view(request, form_id=None):
app_form = get_object_or_404(ApplicationForm, id=form_id)
if request.method == "POST":
if Application.objects.filter(user=request.user).filter(form=app_form).exists():
logger.warn(f"User {request.user} attempting to duplicate application to {app_form.corp}")
logger.warning(f"User {request.user} attempting to duplicate application to {app_form.corp}")
else:
application = Application(user=request.user, form=app_form)
application.save()
@@ -92,7 +92,7 @@ def hr_application_personal_view(request, app_id):
}
return render(request, 'hrapplications/view.html', context=context)
else:
logger.warn(f"User {request.user} not authorized to view {app}")
logger.warning(f"User {request.user} not authorized to view {app}")
return redirect('hrapplications:personal_view')
@@ -105,9 +105,9 @@ def hr_application_personal_removal(request, app_id):
logger.info(f"User {request.user} deleting {app}")
app.delete()
else:
logger.warn(f"User {request.user} attempting to delete reviewed app {app}")
logger.warning(f"User {request.user} attempting to delete reviewed app {app}")
else:
logger.warn(f"User {request.user} not authorized to delete {app}")
logger.warning(f"User {request.user} not authorized to delete {app}")
return redirect('hrapplications:index')
@@ -132,7 +132,7 @@ def hr_application_view(request, app_id):
logger.info(f"Saved comment by user {request.user} to {app}")
return redirect('hrapplications:view', app_id)
else:
logger.warn("User %s does not have permission to add ApplicationComments" % request.user)
logger.warning("User %s does not have permission to add ApplicationComments" % request.user)
return redirect('hrapplications:view', app_id)
else:
logger.debug("Returning blank HRApplication comment form.")
@@ -171,7 +171,7 @@ def hr_application_approve(request, app_id):
app.save()
notify(app.user, "Application Accepted", message="Your application to %s has been approved." % app.form.corp, level="success")
else:
logger.warn(f"User {request.user} not authorized to approve {app}")
logger.warning(f"User {request.user} not authorized to approve {app}")
return redirect('hrapplications:index')
@@ -187,7 +187,7 @@ def hr_application_reject(request, app_id):
app.save()
notify(app.user, "Application Rejected", message="Your application to %s has been rejected." % app.form.corp, level="danger")
else:
logger.warn(f"User {request.user} not authorized to reject {app}")
logger.warning(f"User {request.user} not authorized to reject {app}")
return redirect('hrapplications:index')
@@ -208,7 +208,7 @@ def hr_application_search(request):
app_list = app_list.filter(
form__corp__corporation_id=request.user.profile.main_character.corporation_id)
except AttributeError:
logger.warn(
logger.warning(
"User %s missing main character model: unable to filter applications to search" % request.user)
applications = app_list.filter(
@@ -246,6 +246,6 @@ def hr_application_mark_in_progress(request, app_id):
app.save()
notify(app.user, "Application In Progress", message=f"Your application to {app.form.corp} is being reviewed by {app.reviewer_str}")
else:
logger.warn(
logger.warning(
f"User {request.user} unable to mark {app} in progress: already being reviewed by {app.reviewer}")
return redirect("hrapplications:view", app_id)

View File

@@ -6,17 +6,17 @@
# Translators:
# Erik Kalkoken <erik.kalkoken@gmail.com>, 2020
# Joel Falknau <ozirascal@gmail.com>, 2021
# Peter Pfeufer <rounon.dax@terra-nanotech.de>, 2022
# Peter Pfeufer, 2022
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-14 23:17+1000\n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Peter Pfeufer <rounon.dax@terra-nanotech.de>, 2022\n"
"Language-Team: German (https://www.transifex.com/alliance-auth/teams/107430/de/)\n"
"Last-Translator: Peter Pfeufer, 2022\n"
"Language-Team: German (https://app.transifex.com/alliance-auth/teams/107430/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -47,47 +47,38 @@ msgstr ""
"Du kannst diese eingeschränkten Gruppen nicht hinzufügen oder entfernen: %s"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:89
msgid "English"
msgstr "Englisch"
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:90
msgid "German"
msgstr "Deutsch"
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:91
msgid "Spanish"
msgstr "Spanisch"
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:92
msgid "Chinese Simplified"
msgstr "Chinesisch vereinfacht"
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:93
msgid "Russian"
msgstr "Russisch"
#: allianceauth/authentication/models.py:85
#: allianceauth/project_template/project_name/settings/base.py:94
msgid "Korean"
msgstr "Koreanisch"
#: allianceauth/authentication/models.py:86
#: allianceauth/project_template/project_name/settings/base.py:95
msgid "French"
msgstr "Französisch"
#: allianceauth/authentication/models.py:87
#: allianceauth/project_template/project_name/settings/base.py:96
msgid "Japanese"
msgstr "Japanisch"
#: allianceauth/authentication/models.py:88
#: allianceauth/project_template/project_name/settings/base.py:97
msgid "Italian"
msgstr "Italienisch"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-14 23:17+1000\n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -40,47 +40,38 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:89
msgid "English"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:90
msgid "German"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:91
msgid "Spanish"
msgstr ""
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:92
msgid "Chinese Simplified"
msgstr ""
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:93
msgid "Russian"
msgstr ""
#: allianceauth/authentication/models.py:85
#: allianceauth/project_template/project_name/settings/base.py:94
msgid "Korean"
msgstr ""
#: allianceauth/authentication/models.py:86
#: allianceauth/project_template/project_name/settings/base.py:95
msgid "French"
msgstr ""
#: allianceauth/authentication/models.py:87
#: allianceauth/project_template/project_name/settings/base.py:96
msgid "Japanese"
msgstr ""
#: allianceauth/authentication/models.py:88
#: allianceauth/project_template/project_name/settings/base.py:97
msgid "Italian"
msgstr ""

View File

@@ -6,16 +6,19 @@
# Translators:
# frank1210 <francolopez_16@hotmail.com>, 2021
# Joel Falknau <ozirascal@gmail.com>, 2021
# Young Anexo, 2023
# Fegpawn Kaundur, 2023
# trenus, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-14 23:17+1000\n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2021\n"
"Language-Team: Spanish (https://www.transifex.com/alliance-auth/teams/107430/es/)\n"
"Last-Translator: trenus, 2023\n"
"Language-Team: Spanish (https://app.transifex.com/alliance-auth/teams/107430/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -24,16 +27,17 @@ msgstr ""
#: allianceauth/analytics/models.py:29
msgid "Google Analytics Universal"
msgstr ""
msgstr "Google Analytics Universal"
#: allianceauth/analytics/models.py:30
msgid "Google Analytics V4"
msgstr ""
msgstr "Google Analytics V4"
#: allianceauth/authentication/decorators.py:37
msgid "A main character is required to perform that action. Add one below."
msgstr ""
"Un personaje principal es requerido para completar esta accion. Agregue uno"
"Se necesita un personaje principal para realizar esa acción. Añade uno a "
"continuación."
#: allianceauth/authentication/forms.py:12
msgid "Email"
@@ -42,77 +46,68 @@ msgstr "E-mail"
#: allianceauth/authentication/forms.py:62
#, python-format
msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
msgstr "No puedes añadir o eliminar estos grupos restringidos: %s"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:89
msgid "English"
msgstr "Ingles"
msgstr "Inglés"
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:90
msgid "German"
msgstr "Aleman"
msgstr "Alemán"
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:91
msgid "Spanish"
msgstr "Español"
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:92
msgid "Chinese Simplified"
msgstr ""
msgstr "Chino Simplificado"
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:93
msgid "Russian"
msgstr "Ruso"
#: allianceauth/authentication/models.py:85
#: allianceauth/project_template/project_name/settings/base.py:94
msgid "Korean"
msgstr ""
msgstr "Coreano"
#: allianceauth/authentication/models.py:86
#: allianceauth/project_template/project_name/settings/base.py:95
msgid "French"
msgstr ""
msgstr "Francés"
#: allianceauth/authentication/models.py:87
#: allianceauth/project_template/project_name/settings/base.py:96
msgid "Japanese"
msgstr ""
msgstr "Japonés"
#: allianceauth/authentication/models.py:88
#: allianceauth/project_template/project_name/settings/base.py:97
msgid "Italian"
msgstr ""
msgstr "Italiano"
#: allianceauth/authentication/models.py:91
msgid "Language"
msgstr ""
msgstr "Idioma"
#: allianceauth/authentication/models.py:96
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr ""
msgstr "Modo Nocturno"
#: allianceauth/authentication/models.py:110
#, python-format
msgid "State changed to: %s"
msgstr ""
msgstr "Estado cambiado a: %s"
#: allianceauth/authentication/models.py:111
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr ""
msgstr "El estado de su usuario es ahora: %(state)s"
#: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7
#: allianceauth/templates/allianceauth/side-menu.html:10
msgid "Dashboard"
msgstr "Pagina Principal"
msgstr "Página principal"
#: allianceauth/authentication/templates/authentication/dashboard.html:17
#, python-format
@@ -121,6 +116,8 @@ msgid ""
" Main Character (State: %(state)s)\n"
" "
msgstr ""
"\n"
"Personaje Principal (estado: %(state)s)"
#: allianceauth/authentication/templates/authentication/dashboard.html:101
msgid "No main character set."
@@ -136,7 +133,7 @@ msgstr "Cambiar Personaje Principal"
#: allianceauth/authentication/templates/authentication/dashboard.html:125
msgid "Group Memberships"
msgstr ""
msgstr "Membresia de Grupos"
#: allianceauth/authentication/templates/authentication/dashboard.html:145
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:21
@@ -172,23 +169,25 @@ msgstr "Ingresar"
#: allianceauth/authentication/templates/public/login.html:10
msgid "Login with Eve SSO"
msgstr ""
msgstr "Iniciar Sesión con Eve SSO"
#: allianceauth/authentication/templates/public/middle_box.html:24
msgid "For information on SSO, ESI and security read the CCP Dev Blog"
msgstr ""
"Para más información sobre SSO, ESI y seguridad, lea el blog de desarrollo "
"de CCP."
#: allianceauth/authentication/templates/public/middle_box.html:26
msgid "Introducing ESI - A New API For Eve Online"
msgstr ""
msgstr "Presentación de ESI - Una nueva API para Eve Online"
#: allianceauth/authentication/templates/public/middle_box.html:32
msgid "Manage ESI Applications"
msgstr ""
msgstr "Gestionar aplicaciones ESI"
#: allianceauth/authentication/templates/public/register.html:6
msgid "Registration"
msgstr ""
msgstr "Registro"
#: allianceauth/authentication/templates/public/register.html:21
msgid "Register"
@@ -204,6 +203,8 @@ msgid ""
"Cannot change main character to %(char)s: character owned by a different "
"account."
msgstr ""
"No se puede cambiar de personaje principal a %(char)s: personaje "
"perteneciente a otra cuenta."
#: allianceauth/authentication/views.py:83
#, python-format
@@ -245,7 +246,7 @@ msgstr ""
#: allianceauth/authentication/views.py:262
msgid "Registration of new accounts is not allowed at this time."
msgstr ""
msgstr "En este momento no se permite el registro de nuevas cuentas."
#: allianceauth/corputils/auth_hooks.py:11
msgid "Corporation Stats"
@@ -495,9 +496,9 @@ msgstr "Mes Siguiente"
#, python-format
msgid "%(user)s has collected one link this month."
msgid_plural "%(user)s has collected %(links)s links this month."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "%(user)s ha recopilado un enlace este mes."
msgstr[1] " %(user)s ha recopilado %(links)s enlaces este mes."
msgstr[2] "%(user)s ha recopilado %(links)s enlaces este mes."
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:26
msgid "Times used"
@@ -507,9 +508,9 @@ msgstr "Utilizado"
#, python-format
msgid "%(user)s has created one link this month."
msgid_plural "%(user)s has created %(links)s links this month."
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[0] "%(user)s ha creado un enlace este mes."
msgstr[1] "%(user)s ha creado %(links)s enlaces este mes."
msgstr[2] "%(user)s ha creado %(links)s enlaces este mes."
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:46
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:25
@@ -607,11 +608,11 @@ msgstr "No hay fatlinks creados recientemente"
#: allianceauth/fleetactivitytracking/views.py:218
msgid "Character does not exist"
msgstr ""
msgstr "Personaje no existe"
#: allianceauth/fleetactivitytracking/views.py:221
msgid "User does not exist"
msgstr ""
msgstr "Usuario no existe"
#: allianceauth/fleetactivitytracking/views.py:299
msgid "Fleet participation registered."
@@ -627,6 +628,8 @@ msgid ""
"Cannot register the fleet participation for {character.character_name}. The "
"character needs to be online."
msgstr ""
"No se puede registrar la participación en la flota para "
"{character.character_name}. El personaje debe estar en línea."
#: allianceauth/groupmanagement/auth_hooks.py:17
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:13
@@ -635,15 +638,15 @@ msgstr "Manejo de Grupo"
#: allianceauth/groupmanagement/forms.py:15
msgid "This name has been reserved and can not be used for groups."
msgstr ""
msgstr "Este nombre ha sido reservado y no puede utilizarse para grupos."
#: allianceauth/groupmanagement/forms.py:25
msgid "(auto)"
msgstr ""
msgstr "(auto)"
#: allianceauth/groupmanagement/forms.py:34
msgid "There already exists a group with that name."
msgstr ""
msgstr "Ya existe un grupo con ese nombre."
#: allianceauth/groupmanagement/models.py:105
msgid ""
@@ -651,16 +654,24 @@ msgid ""
"group.<br>Used for groups such as Members, Corp_*, Alliance_* "
"etc.<br><b>Overrides Hidden and Open options when selected.</b>"
msgstr ""
"Grupo interno, los usuarios no pueden ver, unirse o solicitar unirse a este "
"grupo.<br>Se utiliza para grupos como Miembros, Corp_*, Alliance_*, "
"etc.<br><b>Anula las opciones Oculto y Abierto cuando se selecciona.</b>"
#: allianceauth/groupmanagement/models.py:113
msgid "Group is hidden from users but can still join with the correct link."
msgstr ""
"El grupo está oculto para los usuarios, pero aún pueden unirse con el enlace"
" correcto."
#: allianceauth/groupmanagement/models.py:119
msgid ""
"Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved."
msgstr ""
"El grupo está abierto y los usuarios se añadirán automáticamente cuando lo "
"soliciten.<br>Si el grupo no está abierto, los usuarios necesitarán que su "
"solicitud sea aprobada manualmente."
#: allianceauth/groupmanagement/models.py:126
msgid ""
@@ -669,12 +680,18 @@ msgid ""
"remove users from this group automatically when they are no longer "
"authenticated."
msgstr ""
"El grupo es público. Cualquier usuario registrado puede unirse a este grupo,"
" con visibilidad basada en las otras opciones establecidas para este "
"grupo.<br>Auth no eliminará automáticamente a los usuarios de este grupo "
"cuando ya no estén autenticados."
#: allianceauth/groupmanagement/models.py:135
msgid ""
"Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin."
msgstr ""
"El grupo está restringido. Esto significa que para añadir o eliminar "
"usuarios de este grupo se requiere un superusuario administrador."
#: allianceauth/groupmanagement/models.py:144
msgid ""
@@ -682,6 +699,9 @@ msgid ""
"<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>"
msgstr ""
"Los líderes de grupo pueden procesar solicitudes para este grupo. Utilice el"
" permiso <code>auth.group_management</code> para permitir que un usuario "
"gestione todos los grupos.<br>"
#: allianceauth/groupmanagement/models.py:154
msgid ""
@@ -689,49 +709,56 @@ msgid ""
"<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>"
msgstr ""
"Los miembros de los grupos líderes pueden procesar solicitudes para este "
"grupo. Utilice el <code>permiso auth.group_management</code> para permitir "
"que un usuario gestione todos los grupos.<br>"
#: allianceauth/groupmanagement/models.py:163
msgid ""
"States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>"
msgstr ""
"Los estados que figuren en esta lista podrán unirse a este grupo siempre que"
" dispongan de los permisos adecuados.<br>"
#: allianceauth/groupmanagement/models.py:171
msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr ""
"Breve descripción <i>(máx. 512 caracteres)</i> del grupo que se muestra a "
"los usuarios."
#: allianceauth/groupmanagement/models.py:178
msgid "Can request non-public groups"
msgstr ""
msgstr "Se pueden solicitar grupos no públicos"
#: allianceauth/groupmanagement/models.py:209
msgid "name"
msgstr ""
msgstr "nombre"
#: allianceauth/groupmanagement/models.py:212
msgid "Name that can not be used for groups."
msgstr ""
msgstr "Nombre que no se puede utilizar para los grupos."
#: allianceauth/groupmanagement/models.py:215
msgid "reason"
msgstr ""
msgstr "razón"
#: allianceauth/groupmanagement/models.py:215
msgid "Reason why this name is reserved."
msgstr ""
msgstr "Razón por la que este nombre está reservado."
#: allianceauth/groupmanagement/models.py:218
msgid "created by"
msgstr ""
msgstr "creado por"
#: allianceauth/groupmanagement/models.py:223
msgid "created at"
msgstr ""
msgstr "creado en"
#: allianceauth/groupmanagement/models.py:223
msgid "Date when this entry was created"
msgstr ""
msgstr "Fecha de creación de esta entrada"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:4
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
@@ -773,11 +800,11 @@ msgstr "Actor"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:48
msgid "Removed"
msgstr ""
msgstr "Eliminado"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:60
msgid "All times displayed are EVE/UTC."
msgstr ""
msgstr "Todas las horas indicadas son EVE/UTC."
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:67
msgid "No entries found for this group."
@@ -792,18 +819,18 @@ msgstr "Miembros del Grupo"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:113
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:21
msgid "Organization"
msgstr ""
msgstr "Organización"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:49
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:75
msgid "Group leader"
msgstr ""
msgstr "Líder de grupo"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:60
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:82
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:139
msgid "(unknown)"
msgstr ""
msgstr "(desconocido)"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:65
msgid "Remove from group"
@@ -865,7 +892,7 @@ msgstr "Auditar Miembros"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:63
msgid "Copy Direct Join Link"
msgstr ""
msgstr "Copiar enlace directo"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:74
msgid "No groups to list."
@@ -911,11 +938,11 @@ msgstr "Manejo de Grupos"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:24
msgid "Join Requests"
msgstr ""
msgstr "Solicitudes de ingreso"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:35
msgid "Leave Requests"
msgstr ""
msgstr "Abandonar solicitudes"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:57
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:114
@@ -1001,6 +1028,8 @@ msgid ""
"An unhandled error occurred while processing the application from "
"%(mainchar)s to leave %(group)s."
msgstr ""
"Se ha producido un error al procesar la solicitud de %(mainchar)s para "
"abandonar %(group)s."
#: allianceauth/groupmanagement/views.py:292
#, python-format
@@ -1015,11 +1044,11 @@ msgstr "No puedes unirte a ese grupo"
#: allianceauth/groupmanagement/views.py:341
msgid "You are already a member of that group."
msgstr ""
msgstr "Ya eres miembro de ese grupo."
#: allianceauth/groupmanagement/views.py:358
msgid "You already have a pending application for that group."
msgstr ""
msgstr "Ya tiene una solicitud pendiente para ese grupo."
#: allianceauth/groupmanagement/views.py:367
#, python-format
@@ -1036,7 +1065,7 @@ msgstr "No eres miembro de ese grupo"
#: allianceauth/groupmanagement/views.py:393
msgid "You already have a pending leave request for that group."
msgstr ""
msgstr "Ya tiene una solicitud de baja pendiente para ese grupo."
#: allianceauth/groupmanagement/views.py:409
#, python-format
@@ -1220,19 +1249,19 @@ msgstr "Agregar comentario"
#: allianceauth/notifications/models.py:21
msgid "danger"
msgstr ""
msgstr "peligro"
#: allianceauth/notifications/models.py:22
msgid "warning"
msgstr ""
msgstr "advertencia"
#: allianceauth/notifications/models.py:23
msgid "info"
msgstr ""
msgstr "info"
#: allianceauth/notifications/models.py:24
msgid "success"
msgstr ""
msgstr "éxito"
#: allianceauth/notifications/templates/notifications/list.html:4
#: allianceauth/notifications/templates/notifications/list.html:7
@@ -1266,7 +1295,7 @@ msgstr "Titulo"
#: allianceauth/notifications/templates/notifications/list_partial.html:28
msgid "No notifications."
msgstr ""
msgstr "No hay notificaciones."
#: allianceauth/notifications/templates/notifications/view.html:4
#: allianceauth/notifications/templates/notifications/view.html:8
@@ -1314,7 +1343,7 @@ msgstr "Nombre de la operacion"
#: allianceauth/optimer/form.py:16
msgid "Operation Type"
msgstr ""
msgstr "Tipo de operación"
#: allianceauth/optimer/form.py:17
#: allianceauth/srp/templates/srp/management.html:38
@@ -1328,7 +1357,7 @@ msgstr "Informacion Adicional"
#: allianceauth/optimer/form.py:23
msgid "(Optional) Describe the operation with a couple of short words."
msgstr ""
msgstr "(Opcional) Describa la operación con un par de palabras breves."
#: allianceauth/optimer/templates/optimer/add.html:6
#: allianceauth/optimer/templates/optimer/management.html:13
@@ -1365,7 +1394,7 @@ msgstr "Tipo en EVE actual:"
#: allianceauth/optimer/templates/optimer/management.html:26
msgid "Next Fleet Operations"
msgstr ""
msgstr "Próximas operaciones de flota"
#: allianceauth/optimer/templates/optimer/management.html:30
#: allianceauth/timerboard/templates/timerboard/view.html:362
@@ -1374,7 +1403,7 @@ msgstr "No hay proximos timers."
#: allianceauth/optimer/templates/optimer/management.html:33
msgid "Past Fleet Operations"
msgstr ""
msgstr "Operaciones de flota pasadas"
#: allianceauth/optimer/templates/optimer/management.html:37
#: allianceauth/timerboard/templates/timerboard/view.html:535
@@ -1413,7 +1442,7 @@ msgstr "Auditar Permisos"
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:20
msgid "User / Character"
msgstr ""
msgstr "Usuario / Personaje"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:4
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:8
@@ -1458,16 +1487,16 @@ msgstr "Estados"
#: allianceauth/services/abstract.py:72
msgid "That service account already exists"
msgstr ""
msgstr "Esa cuenta de servicio ya existe"
#: allianceauth/services/abstract.py:103
#, python-brace-format
msgid "Successfully set your {self.service_name} password"
msgstr ""
msgstr "Ha establecido correctamente su contraseña {self.service_name}."
#: allianceauth/services/auth_hooks.py:12
msgid "Services"
msgstr ""
msgstr "Servicios"
#: allianceauth/services/forms.py:6
msgid "Name of Fleet:"
@@ -1531,29 +1560,31 @@ msgstr "La contraseña tiene que tener 8 caracteres de largo minimo"
#: allianceauth/services/modules/discord/models.py:187
msgid "Discord Account Disabled"
msgstr ""
msgstr "Cuenta de Discord desactivada"
#: allianceauth/services/modules/discord/models.py:189
msgid ""
"Your Discord account was disabled automatically by Auth. If you think this "
"was a mistake, please contact an admin."
msgstr ""
"Tu cuenta de Discord ha sido desactivada automáticamente por Auth. Si crees "
"que se trata de un error, ponte en contacto con un administrador."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:5
msgid "Discord"
msgstr ""
msgstr "Discord"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:18
msgid "Join the Discord server"
msgstr ""
msgstr "Unirse al servidor Discord"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:22
msgid "Leave- and rejoin the Discord Server (Reset)"
msgstr ""
msgstr "Salir y volver al servidor Discord (Reiniciar)"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:25
msgid "Leave the Discord server"
msgstr ""
msgstr "Abandonar el servidor de Discord"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
msgid "Link Discord Server"
@@ -1561,68 +1592,74 @@ msgstr "Enlace a servidor de Discord"
#: allianceauth/services/modules/discord/views.py:30
msgid "Deactivated Discord account."
msgstr ""
msgstr "Cuenta de Discord desactivada."
#: allianceauth/services/modules/discord/views.py:36
#: allianceauth/services/modules/discord/views.py:59
msgid "An error occurred while processing your Discord account."
msgstr ""
msgstr "Se ha producido un error al procesar tu cuenta de Discord."
#: allianceauth/services/modules/discord/views.py:102
msgid "Your Discord account has been successfully activated."
msgstr ""
msgstr "Tu cuenta de Discord se ha activado correctamente."
#: allianceauth/services/modules/discord/views.py:108
msgid ""
"An error occurred while trying to activate your Discord account. Please try "
"again."
msgstr ""
"Se ha producido un error al intentar activar tu cuenta de Discord. Inténtalo"
" de nuevo."
#: allianceauth/services/modules/discourse/views.py:29
msgid "You are not authorized to access Discourse."
msgstr ""
msgstr "No estás autorizado a acceder a Discourse."
#: allianceauth/services/modules/discourse/views.py:34
msgid "You must have a main character set to access Discourse."
msgstr ""
msgstr "Para acceder a Discourse es necesario tener un personaje principal."
#: allianceauth/services/modules/discourse/views.py:44
msgid ""
"No SSO payload or signature. Please contact support if this problem "
"persists."
msgstr ""
"No existe contenido ni firma SSO. Póngase en contacto con el servicio de "
"asistencia si este problema persiste."
#: allianceauth/services/modules/discourse/views.py:54
#: allianceauth/services/modules/discourse/views.py:62
msgid "Invalid payload. Please contact support if this problem persists."
msgstr ""
"Contenido no válido. Póngase en contacto con el servicio de asistencia si "
"este problema persiste."
#: allianceauth/services/modules/ips4/views.py:31
msgid "Activated IPSuite4 account."
msgstr ""
msgstr "Cuenta IPSuite4 activada."
#: allianceauth/services/modules/ips4/views.py:39
#: allianceauth/services/modules/ips4/views.py:60
#: allianceauth/services/modules/ips4/views.py:81
#: allianceauth/services/modules/ips4/views.py:101
msgid "An error occurred while processing your IPSuite4 account."
msgstr ""
msgstr "Se ha producido un error al procesar su cuenta IPSuite4."
#: allianceauth/services/modules/ips4/views.py:52
msgid "Reset IPSuite4 password."
msgstr ""
msgstr "Restablecer la contraseña de IPSuite4."
#: allianceauth/services/modules/ips4/views.py:78
msgid "Set IPSuite4 password."
msgstr ""
msgstr "Establecer contraseña de IPSuite4."
#: allianceauth/services/modules/ips4/views.py:98
msgid "Deactivated IPSuite4 account."
msgstr ""
msgstr "Cuenta IPSuite4 desactivada."
#: allianceauth/services/modules/openfire/auth_hooks.py:26
msgid "Jabber"
msgstr ""
msgstr "Jabber"
#: allianceauth/services/modules/openfire/auth_hooks.py:79
#: allianceauth/services/modules/openfire/templates/services/openfire/broadcast.html:5
@@ -1632,7 +1669,7 @@ msgstr "Anuncio por Jabber"
#: allianceauth/services/modules/openfire/auth_hooks.py:94
msgid "Fleet Broadcast Formatter"
msgstr ""
msgstr "Formateador de difusión de flota"
#: allianceauth/services/modules/openfire/forms.py:7
msgid "Message"
@@ -1648,73 +1685,73 @@ msgstr "Anuncio"
#: allianceauth/services/modules/openfire/views.py:35
msgid "Activated jabber account."
msgstr ""
msgstr "Cuenta jabber activada."
#: allianceauth/services/modules/openfire/views.py:43
#: allianceauth/services/modules/openfire/views.py:56
#: allianceauth/services/modules/openfire/views.py:76
#: allianceauth/services/modules/openfire/views.py:147
msgid "An error occurred while processing your jabber account."
msgstr ""
msgstr "Se ha producido un error al procesar su cuenta jabber."
#: allianceauth/services/modules/openfire/views.py:69
msgid "Reset jabber password."
msgstr ""
msgstr "Restablecer contraseña jabber."
#: allianceauth/services/modules/openfire/views.py:115
#, python-format
msgid "Sent jabber broadcast to %s"
msgstr ""
msgstr "Enviar difusión jabber a %s"
#: allianceauth/services/modules/openfire/views.py:144
msgid "Set jabber password."
msgstr ""
msgstr "Establecer contraseña jabber."
#: allianceauth/services/modules/phpbb3/views.py:34
msgid "Activated forum account."
msgstr ""
msgstr "Cuenta del foro activada."
#: allianceauth/services/modules/phpbb3/views.py:42
#: allianceauth/services/modules/phpbb3/views.py:56
#: allianceauth/services/modules/phpbb3/views.py:78
#: allianceauth/services/modules/phpbb3/views.py:101
msgid "An error occurred while processing your forum account."
msgstr ""
msgstr "Se ha producido un error al procesar su cuenta del foro."
#: allianceauth/services/modules/phpbb3/views.py:53
msgid "Deactivated forum account."
msgstr ""
msgstr "Cuenta del foro desactivada."
#: allianceauth/services/modules/phpbb3/views.py:70
msgid "Reset forum password."
msgstr ""
msgstr "Restablecer contraseña del foro."
#: allianceauth/services/modules/phpbb3/views.py:98
msgid "Set forum password."
msgstr ""
msgstr "Establecer contraseña del foro."
#: allianceauth/services/modules/smf/views.py:52
msgid "Activated SMF account."
msgstr ""
msgstr "Cuenta SMF activada."
#: allianceauth/services/modules/smf/views.py:65
#: allianceauth/services/modules/smf/views.py:81
#: allianceauth/services/modules/smf/views.py:102
#: allianceauth/services/modules/smf/views.py:124
msgid "An error occurred while processing your SMF account."
msgstr ""
msgstr "Se ha producido un error al procesar tu cuenta SMF."
#: allianceauth/services/modules/smf/views.py:78
msgid "Deactivated SMF account."
msgstr ""
msgstr "Cuenta SMF desactivada."
#: allianceauth/services/modules/smf/views.py:95
msgid "Reset SMF password."
msgstr ""
msgstr "Restablecer contraseña de SMF."
#: allianceauth/services/modules/smf/views.py:121
msgid "Set SMF password."
msgstr ""
msgstr "Establecer contraseña de SMF."
#: allianceauth/services/modules/teamspeak3/forms.py:14
#, python-format
@@ -1723,7 +1760,7 @@ msgstr "No fue posible localizar tu usuario %s en el servidor"
#: allianceauth/services/modules/teamspeak3/templates/admin/teamspeak3/authts/change_list.html:8
msgid "Update TS3 groups"
msgstr ""
msgstr "Actualizar los grupos de TS3"
#: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:5
msgid "Verify Teamspeak"
@@ -1745,44 +1782,44 @@ msgstr "Continuar"
#: allianceauth/services/modules/teamspeak3/views.py:35
msgid "Activated TeamSpeak3 account."
msgstr ""
msgstr "Cuenta de TeamSpeak3 activada."
#: allianceauth/services/modules/teamspeak3/views.py:38
#: allianceauth/services/modules/teamspeak3/views.py:74
#: allianceauth/services/modules/teamspeak3/views.py:100
msgid "An error occurred while processing your TeamSpeak3 account."
msgstr ""
msgstr "Se ha producido un error al procesar tu cuenta de TeamSpeak3."
#: allianceauth/services/modules/teamspeak3/views.py:71
msgid "Deactivated TeamSpeak3 account."
msgstr ""
msgstr "Cuenta de TeamSpeak3 desactivada."
#: allianceauth/services/modules/teamspeak3/views.py:97
msgid "Reset TeamSpeak3 permission key."
msgstr ""
msgstr "Restablecer la clave de permiso de TeamSpeak3."
#: allianceauth/services/modules/xenforo/views.py:30
msgid "Activated XenForo account."
msgstr ""
msgstr "Cuenta de XenForo activada."
#: allianceauth/services/modules/xenforo/views.py:40
#: allianceauth/services/modules/xenforo/views.py:52
#: allianceauth/services/modules/xenforo/views.py:73
#: allianceauth/services/modules/xenforo/views.py:94
msgid "An error occurred while processing your XenForo account."
msgstr ""
msgstr "Se ha producido un error al procesar tu cuenta de XenForo."
#: allianceauth/services/modules/xenforo/views.py:50
msgid "Deactivated XenForo account."
msgstr ""
msgstr "Cuenta de XenForo desactivada."
#: allianceauth/services/modules/xenforo/views.py:65
msgid "Reset XenForo account password."
msgstr ""
msgstr "Restablecer la contraseña de la cuenta de XenForo."
#: allianceauth/services/modules/xenforo/views.py:91
msgid "Changed XenForo password."
msgstr ""
msgstr "Contraseña de XenForo cambiada."
#: allianceauth/services/templates/services/fleetformattertool.html:5
msgid "Fleet Formatter Tool"
@@ -1807,6 +1844,8 @@ msgstr "Eliminar tu cuenta en %(service_name)s ?"
msgid ""
"Are you sure you want to delete your %(service_name)s account %(object)s?"
msgstr ""
"¿Estás seguro de que quieres eliminar tu cuenta de %(service_name)s "
"%(object)s?"
#: allianceauth/services/templates/services/service_credentials.html:4
#: allianceauth/services/templates/services/service_credentials.html:8
@@ -1860,15 +1899,16 @@ msgstr "Doctrina"
#: allianceauth/srp/form.py:16
msgid "Killboard Link (zkillboard.com or kb.evetools.org)"
msgstr ""
msgstr "Enlace Killboard (zkillboard.com o kb.evetools.org)"
#: allianceauth/srp/form.py:34
msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org"
msgstr ""
msgstr "Enlace no válido. Por favor, utilice zkillboard.com o kb.evetools.org"
#: allianceauth/srp/form.py:46
msgid "Invalid Link. Please post a direct link to a killmail."
msgstr ""
"Enlace no válido. Por favor, proporcione un enlace directo a un killmail."
#: allianceauth/srp/form.py:53
msgid "After Action Report Link"
@@ -1889,7 +1929,7 @@ msgstr "Entregar este enlace a los miembros"
#: allianceauth/srp/templates/srp/data.html:5
msgid "Srp Fleet Data"
msgstr ""
msgstr "Informacion de SRP de la flota"
#: allianceauth/srp/templates/srp/data.html:50
msgid "SRP Fleet Data"
@@ -1942,6 +1982,8 @@ msgstr "Costo del SRP"
#: allianceauth/srp/templates/srp/data.html:95
msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr ""
"Haz clic en el valor para editar. Presiona Enter para guardar y continuar, o"
" ESC para cancelar"
#: allianceauth/srp/templates/srp/data.html:98
msgid "Post Time"
@@ -2063,7 +2105,7 @@ msgstr "Imposible localizar el SRP con el codigo %(srpfleetid)s"
#: allianceauth/srp/views.py:179
msgid "This kill mail has already been posted."
msgstr ""
msgstr "Este correo mortal ya ha sido publicado."
#: allianceauth/srp/views.py:200
msgid ""
@@ -2132,11 +2174,11 @@ msgstr "Cerrado"
#: allianceauth/templates/allianceauth/admin-status/overview.html:28
msgid "Powered by GitLab"
msgstr ""
msgstr "Desarrollado por GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:35
msgid "Support Discord"
msgstr ""
msgstr "Soporte Discord"
#: allianceauth/templates/allianceauth/admin-status/overview.html:43
msgid "Software Version"
@@ -2148,7 +2190,7 @@ msgstr "Actual"
#: allianceauth/templates/allianceauth/admin-status/overview.html:53
msgid "Latest Stable"
msgstr ""
msgstr "Último Estable"
#: allianceauth/templates/allianceauth/admin-status/overview.html:59
msgid "Update available"
@@ -2156,11 +2198,11 @@ msgstr "Actualizacion Disponible"
#: allianceauth/templates/allianceauth/admin-status/overview.html:64
msgid "Latest Pre-Release"
msgstr ""
msgstr "Último Pre-Lanzamiento"
#: allianceauth/templates/allianceauth/admin-status/overview.html:70
msgid "Pre-Release available"
msgstr ""
msgstr "Pre-Lanzamiento disponible"
#: allianceauth/templates/allianceauth/admin-status/overview.html:78
msgid "Task Queue"
@@ -2173,6 +2215,8 @@ msgid ""
" Status of %(total)s processed tasks • last %(latest)s\n"
" "
msgstr ""
"\n"
"Estado de %(total)s tareas procesadas • últimos %(latest)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format
@@ -2181,6 +2225,8 @@ msgid ""
" %(queue_length)s queued tasks\n"
" "
msgstr ""
"\n"
"%(queue_length)s tareas en cola"
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
@@ -2188,16 +2234,16 @@ msgstr "Administrador"
#: allianceauth/templates/allianceauth/top-menu-admin.html:19
msgid "AA Documentation"
msgstr ""
msgstr "Documentación AA"
#: allianceauth/templates/allianceauth/top-menu-admin.html:26
msgid "AA Support Discord"
msgstr ""
msgstr "Soporte Discord AA"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14
msgid "User Menu"
msgstr ""
msgstr "Menú de usuario"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56
msgid "Logout"
@@ -2245,7 +2291,7 @@ msgstr "Tipo de Estructura"
#: allianceauth/timerboard/form.py:62
msgid "Timer Type"
msgstr ""
msgstr "Tipo de temporizador"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/templates/timerboard/view.html:32
@@ -2276,15 +2322,15 @@ msgstr "Restringido a Corp"
#: allianceauth/timerboard/models.py:14
msgid "Not Specified"
msgstr ""
msgstr "Sin especificación"
#: allianceauth/timerboard/models.py:15
msgid "Shield"
msgstr ""
msgstr "Escudo"
#: allianceauth/timerboard/models.py:16
msgid "Armor"
msgstr ""
msgstr "Armadura"
#: allianceauth/timerboard/models.py:17
msgid "Hull"
@@ -2292,15 +2338,15 @@ msgstr "Tipo"
#: allianceauth/timerboard/models.py:18
msgid "Final"
msgstr ""
msgstr "Final"
#: allianceauth/timerboard/models.py:19
msgid "Anchoring"
msgstr ""
msgstr "Anclando"
#: allianceauth/timerboard/models.py:20
msgid "Unanchoring"
msgstr ""
msgstr "Desanclando"
#: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:11
msgid "Delete Timer"

View File

@@ -10,16 +10,18 @@
# Idea ., 2021
# Mickael PATTE, 2021
# Geoffrey Fabbro, 2021
# Mohssine Daghghar, 2023
# Ludovick Fortin, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-14 23:17+1000\n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Geoffrey Fabbro, 2021\n"
"Language-Team: French (France) (https://www.transifex.com/alliance-auth/teams/107430/fr_FR/)\n"
"Last-Translator: Ludovick Fortin, 2023\n"
"Language-Team: French (France) (https://app.transifex.com/alliance-auth/teams/107430/fr_FR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -28,7 +30,7 @@ msgstr ""
#: allianceauth/analytics/models.py:29
msgid "Google Analytics Universal"
msgstr ""
msgstr "Google Analytique Universelle"
#: allianceauth/analytics/models.py:30
msgid "Google Analytics V4"
@@ -48,55 +50,48 @@ msgstr "Email"
#, python-format
msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
"Vous n'avez pas lautorisation d'ajouter ou d'enlever ces groupes "
"restreints: %s"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:89
msgid "English"
msgstr "Anglais"
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:90
msgid "German"
msgstr "Allemand"
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:91
msgid "Spanish"
msgstr "Espagnol"
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:92
msgid "Chinese Simplified"
msgstr "Chinois simplifié"
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:93
msgid "Russian"
msgstr "Russe"
#: allianceauth/authentication/models.py:85
#: allianceauth/project_template/project_name/settings/base.py:94
msgid "Korean"
msgstr "Coréen"
#: allianceauth/authentication/models.py:86
#: allianceauth/project_template/project_name/settings/base.py:95
msgid "French"
msgstr "Français"
#: allianceauth/authentication/models.py:87
#: allianceauth/project_template/project_name/settings/base.py:96
msgid "Japanese"
msgstr "Japonais"
#: allianceauth/authentication/models.py:88
#: allianceauth/project_template/project_name/settings/base.py:97
msgid "Italian"
msgstr "Italien"
#: allianceauth/authentication/models.py:91
msgid "Language"
msgstr ""
msgstr "Langue"
#: allianceauth/authentication/models.py:96
#: allianceauth/templates/allianceauth/night-toggle.html:6
@@ -179,19 +174,21 @@ msgstr "Connexion"
#: allianceauth/authentication/templates/public/login.html:10
msgid "Login with Eve SSO"
msgstr ""
msgstr "Connexion avec Eve SSO"
#: allianceauth/authentication/templates/public/middle_box.html:24
msgid "For information on SSO, ESI and security read the CCP Dev Blog"
msgstr ""
"Pour de l'information sur le SSO, le ESI et la sécurité, lisez le blog de "
"développeur CCP"
#: allianceauth/authentication/templates/public/middle_box.html:26
msgid "Introducing ESI - A New API For Eve Online"
msgstr ""
msgstr "Présentation d'ESI, une nouvelle API pour Eve Online."
#: allianceauth/authentication/templates/public/middle_box.html:32
msgid "Manage ESI Applications"
msgstr ""
msgstr "Gestion des Application ESI"
#: allianceauth/authentication/templates/public/register.html:6
msgid "Registration"
@@ -614,11 +611,11 @@ msgstr "Aucun lien FAT enregistré"
#: allianceauth/fleetactivitytracking/views.py:218
msgid "Character does not exist"
msgstr ""
msgstr "Le personnage n'existe pas"
#: allianceauth/fleetactivitytracking/views.py:221
msgid "User does not exist"
msgstr ""
msgstr "L'utilisateur n'existe pas"
#: allianceauth/fleetactivitytracking/views.py:299
msgid "Fleet participation registered."
@@ -634,6 +631,8 @@ msgid ""
"Cannot register the fleet participation for {character.character_name}. The "
"character needs to be online."
msgstr ""
"Impossible d'enregistrer la participation pour {character.character_name}. "
"Le personnage doit être en ligne."
#: allianceauth/groupmanagement/auth_hooks.py:17
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:13
@@ -642,15 +641,15 @@ msgstr "Gestion de groupe"
#: allianceauth/groupmanagement/forms.py:15
msgid "This name has been reserved and can not be used for groups."
msgstr ""
msgstr "Ce nom a été réserver et il ne peut être utilisé pour les groupes."
#: allianceauth/groupmanagement/forms.py:25
msgid "(auto)"
msgstr ""
msgstr "(automatique)"
#: allianceauth/groupmanagement/forms.py:34
msgid "There already exists a group with that name."
msgstr ""
msgstr "Il existe déjà un groupe portant ce nom."
#: allianceauth/groupmanagement/models.py:105
msgid ""
@@ -658,16 +657,25 @@ msgid ""
"group.<br>Used for groups such as Members, Corp_*, Alliance_* "
"etc.<br><b>Overrides Hidden and Open options when selected.</b>"
msgstr ""
"Groupe interne, les utilisateurs ne peuvent pas voir, rejoindre ou demander "
"de rejoindre ce groupe.<br> Utilisé pour les groupes comme, Membres, "
"Corporations _*, Alliance etc.<br><b> Annule les options masquer et exposer "
"quand sélectionner."
#: allianceauth/groupmanagement/models.py:113
msgid "Group is hidden from users but can still join with the correct link."
msgstr ""
"Le groupe est caché aux utilisateurs, mais ils peuvent toujours rejoindre "
"avec le bon lien."
#: allianceauth/groupmanagement/models.py:119
msgid ""
"Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved."
msgstr ""
"Le groupe est ouvert, et les utilisateurs seront automatiquement ajoutés sur"
" demande. <br> Si le groupe nest pas ouvert, les utilisateurs auront besoin"
" que leurs demandes soit approuvées manuellement."
#: allianceauth/groupmanagement/models.py:126
msgid ""
@@ -676,12 +684,18 @@ msgid ""
"remove users from this group automatically when they are no longer "
"authenticated."
msgstr ""
"Le groupe est public. Tout utilisateur enregistré peut rejoindre ce groupe, "
"avec une visibilité basée sur les autres options définies pour ce "
"groupe.<br> L' Auth ne supprimera pas automatiquement les utilisateurs de ce"
" groupe lorsquils ne seront plus authentifiés."
#: allianceauth/groupmanagement/models.py:135
msgid ""
"Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin."
msgstr ""
"Le groupe est restreint. Cela signifie que lajout ou la suppression "
"dutilisateurs pour ce groupe nécessite un administrateur superutilisateur."
#: allianceauth/groupmanagement/models.py:144
msgid ""
@@ -707,38 +721,40 @@ msgstr ""
msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr ""
"Brève description <i> (512 caractères maximum) </i> du groupe présenté aux "
"utilisateurs."
#: allianceauth/groupmanagement/models.py:178
msgid "Can request non-public groups"
msgstr ""
msgstr "Peut demander des groupes non publics"
#: allianceauth/groupmanagement/models.py:209
msgid "name"
msgstr ""
msgstr "Nom"
#: allianceauth/groupmanagement/models.py:212
msgid "Name that can not be used for groups."
msgstr ""
msgstr "Nom qui ne peut pas être utilisé pour les groupes."
#: allianceauth/groupmanagement/models.py:215
msgid "reason"
msgstr ""
msgstr "raison"
#: allianceauth/groupmanagement/models.py:215
msgid "Reason why this name is reserved."
msgstr ""
msgstr "Raison pour laquelle ce nom est réservé."
#: allianceauth/groupmanagement/models.py:218
msgid "created by"
msgstr ""
msgstr "créé par"
#: allianceauth/groupmanagement/models.py:223
msgid "created at"
msgstr ""
msgstr "créé à"
#: allianceauth/groupmanagement/models.py:223
msgid "Date when this entry was created"
msgstr ""
msgstr "Date de création de cette entrée"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:4
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
@@ -868,7 +884,7 @@ msgstr "Voir les membres"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:59
msgid "Audit Members"
msgstr ""
msgstr "Membres de l'audit"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:63
msgid "Copy Direct Join Link"
@@ -1274,7 +1290,7 @@ msgstr "Titre"
#: allianceauth/notifications/templates/notifications/list_partial.html:28
msgid "No notifications."
msgstr ""
msgstr "Aucune notification."
#: allianceauth/notifications/templates/notifications/view.html:4
#: allianceauth/notifications/templates/notifications/view.html:8
@@ -1322,7 +1338,7 @@ msgstr "Nom de l'opération"
#: allianceauth/optimer/form.py:16
msgid "Operation Type"
msgstr ""
msgstr "Type d'opération"
#: allianceauth/optimer/form.py:17
#: allianceauth/srp/templates/srp/management.html:38
@@ -1336,7 +1352,7 @@ msgstr "Information additionnelle"
#: allianceauth/optimer/form.py:23
msgid "(Optional) Describe the operation with a couple of short words."
msgstr ""
msgstr "(Facultatif) Décrivez l'opération en quelques mots."
#: allianceauth/optimer/templates/optimer/add.html:6
#: allianceauth/optimer/templates/optimer/management.html:13
@@ -1373,7 +1389,7 @@ msgstr "Heure d'Eve actuelle:"
#: allianceauth/optimer/templates/optimer/management.html:26
msgid "Next Fleet Operations"
msgstr ""
msgstr "Prochaines opérations de la flotte"
#: allianceauth/optimer/templates/optimer/management.html:30
#: allianceauth/timerboard/templates/timerboard/view.html:362
@@ -1382,7 +1398,7 @@ msgstr "Aucun minuteur à venir."
#: allianceauth/optimer/templates/optimer/management.html:33
msgid "Past Fleet Operations"
msgstr ""
msgstr "Opérations passées de la flotte"
#: allianceauth/optimer/templates/optimer/management.html:37
#: allianceauth/timerboard/templates/timerboard/view.html:535
@@ -1830,7 +1846,7 @@ msgstr ""
#: allianceauth/services/templates/services/service_credentials.html:8
#, python-format
msgid "%(service_name)s Credentials"
msgstr ""
msgstr "%(service_name)sInformations d'identification"
#: allianceauth/services/templates/services/service_password.html:5
#, python-format
@@ -1890,7 +1906,7 @@ msgstr "Lien non valide. Veuillez poster un lien direct vers un Killmail."
#: allianceauth/srp/form.py:53
msgid "After Action Report Link"
msgstr ""
msgstr "Lien vers le rapport après action"
#: allianceauth/srp/templates/srp/add.html:5
msgid "SRP Fleet Create"
@@ -1907,7 +1923,7 @@ msgstr "Donner ce lien aux membres de la flotte"
#: allianceauth/srp/templates/srp/data.html:5
msgid "Srp Fleet Data"
msgstr ""
msgstr "Données de flotte SRP"
#: allianceauth/srp/templates/srp/data.html:50
msgid "SRP Fleet Data"
@@ -1965,7 +1981,7 @@ msgstr ""
#: allianceauth/srp/templates/srp/data.html:98
msgid "Post Time"
msgstr ""
msgstr "Heure de publication"
#: allianceauth/srp/templates/srp/data.html:175
msgid "No SRP requests for this fleet."
@@ -2069,17 +2085,17 @@ msgstr "Flotte SRP %(fleetname)sActive."
#: allianceauth/srp/views.py:140
#, python-format
msgid "Marked SRP fleet %(fleetname)s as completed."
msgstr ""
msgstr "Flotte SRP marquée %(fleetname)s comme terminée."
#: allianceauth/srp/views.py:153
#, python-format
msgid "Marked SRP fleet %(fleetname)s as incomplete."
msgstr ""
msgstr "Flotte SRP %(fleetname)smarquée comme incomplète."
#: allianceauth/srp/views.py:165
#, python-format
msgid "Unable to locate SRP code with ID %(srpfleetid)s"
msgstr ""
msgstr "Impossible de localiser le code SRP avec l'ID %(srpfleetid)s"
#: allianceauth/srp/views.py:179
msgid "This kill mail has already been posted."
@@ -2096,7 +2112,7 @@ msgstr ""
#: allianceauth/srp/views.py:212
#, python-format
msgid "Submitted SRP request for your %(ship)s."
msgstr ""
msgstr "Demande SRP soumise pour votre. %(ship)s"
#: allianceauth/srp/views.py:216
#, python-format
@@ -2104,6 +2120,8 @@ msgid ""
"Character %(charid)s does not belong to your Auth account. Please add the "
"API key for this character and try again"
msgstr ""
"Le personnage%(charid)s n'appartient pas à votre compte Auth. Ajoutez la clé"
" API pour ce personnage et réessayez"
#: allianceauth/srp/views.py:236 allianceauth/srp/views.py:262
#: allianceauth/srp/views.py:300
@@ -2131,17 +2149,17 @@ msgstr "Impossible à trouver, veuillez sélectionner une autre requête SRP"
#: allianceauth/srp/views.py:323
#, python-format
msgid "Rejected %(numrequests)s SRP requests."
msgstr ""
msgstr "Requêtes %(numrequests)s SRP rejetées."
#: allianceauth/srp/views.py:336
#, python-format
msgid "Unable to locate SRP request with ID %(requestid)s"
msgstr ""
msgstr "Impossible de localiser la demande SRP avec l'ID %(requestid)s"
#: allianceauth/srp/views.py:360
#, python-format
msgid "Saved changes to SRP fleet %(fleetname)s"
msgstr ""
msgstr "Modifications enregistrées de la flotte SRP%(fleetname)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:8
msgid "Alliance Auth Notifications"
@@ -2194,6 +2212,9 @@ msgid ""
" Status of %(total)s processed tasks • last %(latest)s\n"
" "
msgstr ""
"\n"
"État des tâches %(total)s traitées • dernier %(latest)s\n"
" "
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format
@@ -2202,6 +2223,9 @@ msgid ""
" %(queue_length)s queued tasks\n"
" "
msgstr ""
"\n"
" %(queue_length)stâches en file d'attente\n"
" "
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"

View File

@@ -5,17 +5,17 @@
#
# Translators:
# Alessandro Cresti, 2021
# Linus Hope, 2021
# Linus Hope, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-14 23:17+1000\n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Linus Hope, 2021\n"
"Language-Team: Italian (Italy) (https://www.transifex.com/alliance-auth/teams/107430/it_IT/)\n"
"Last-Translator: Linus Hope, 2023\n"
"Language-Team: Italian (Italy) (https://app.transifex.com/alliance-auth/teams/107430/it_IT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -24,11 +24,11 @@ msgstr ""
#: allianceauth/analytics/models.py:29
msgid "Google Analytics Universal"
msgstr ""
msgstr "Google Analytics Universal"
#: allianceauth/analytics/models.py:30
msgid "Google Analytics V4"
msgstr ""
msgstr "Google Analytics V4"
#: allianceauth/authentication/decorators.py:37
msgid "A main character is required to perform that action. Add one below."
@@ -38,76 +38,67 @@ msgstr ""
#: allianceauth/authentication/forms.py:12
msgid "Email"
msgstr ""
msgstr "Indirizzo di posta elettronica"
#: allianceauth/authentication/forms.py:62
#, python-format
msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
msgstr "Non ti è consentito aggiungere o rimuovere questi gruppi limitati:%s"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:89
msgid "English"
msgstr ""
msgstr "Inglese"
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:90
msgid "German"
msgstr ""
msgstr "Tedesco"
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:91
msgid "Spanish"
msgstr ""
msgstr "Spagnolo"
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:92
msgid "Chinese Simplified"
msgstr ""
msgstr "Cinese semplificato"
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:93
msgid "Russian"
msgstr ""
msgstr "Russo"
#: allianceauth/authentication/models.py:85
#: allianceauth/project_template/project_name/settings/base.py:94
msgid "Korean"
msgstr ""
msgstr "Coreano"
#: allianceauth/authentication/models.py:86
#: allianceauth/project_template/project_name/settings/base.py:95
msgid "French"
msgstr ""
msgstr "Francese"
#: allianceauth/authentication/models.py:87
#: allianceauth/project_template/project_name/settings/base.py:96
msgid "Japanese"
msgstr ""
msgstr "Giapponese"
#: allianceauth/authentication/models.py:88
#: allianceauth/project_template/project_name/settings/base.py:97
msgid "Italian"
msgstr ""
msgstr "Italiano"
#: allianceauth/authentication/models.py:91
msgid "Language"
msgstr ""
msgstr "Lingua"
#: allianceauth/authentication/models.py:96
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr ""
msgstr "Modalità scura"
#: allianceauth/authentication/models.py:110
#, python-format
msgid "State changed to: %s"
msgstr ""
msgstr "Stato modificato a: %s"
#: allianceauth/authentication/models.py:111
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr ""
msgstr "Il tuo stato utente è ora: %(state)s"
#: allianceauth/authentication/templates/authentication/dashboard.html:4
#: allianceauth/authentication/templates/authentication/dashboard.html:7
@@ -172,23 +163,25 @@ msgstr "Alleanza"
#: allianceauth/authentication/templates/public/login.html:6
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:58
msgid "Login"
msgstr ""
msgstr "Accedi"
#: allianceauth/authentication/templates/public/login.html:10
msgid "Login with Eve SSO"
msgstr ""
msgstr "Accedi con EVE SSO"
#: allianceauth/authentication/templates/public/middle_box.html:24
msgid "For information on SSO, ESI and security read the CCP Dev Blog"
msgstr ""
"Per ulteriori informazioni riguardo a SSO, ESI e sicurezza consulta il CCP "
"Dev Blog"
#: allianceauth/authentication/templates/public/middle_box.html:26
msgid "Introducing ESI - A New API For Eve Online"
msgstr ""
msgstr "Introducendo ESI - Una nuova API per Eve Online"
#: allianceauth/authentication/templates/public/middle_box.html:32
msgid "Manage ESI Applications"
msgstr ""
msgstr "Gestisci applicazioni ESI"
#: allianceauth/authentication/templates/public/register.html:6
msgid "Registration"
@@ -230,7 +223,7 @@ msgstr ""
#: allianceauth/authentication/views.py:133
msgid "Unable to authenticate as the selected character."
msgstr ""
msgstr "Impossibile autenticarsi con il personaggio selezioanto."
#: allianceauth/authentication/views.py:197
msgid "Registration token has expired."
@@ -322,7 +315,7 @@ msgstr "Corporazione"
#: allianceauth/corputils/templates/corputils/corpstats.html:167
#: allianceauth/corputils/templates/corputils/search.html:27
msgid "Killboard"
msgstr ""
msgstr "Killboard"
#: allianceauth/corputils/templates/corputils/corpstats.html:114
#: allianceauth/corputils/templates/corputils/search.html:16
@@ -350,11 +343,11 @@ msgstr "Cerca risultati"
#: allianceauth/corputils/templates/corputils/search.html:15
msgid "zKillboard"
msgstr ""
msgstr "zKillboard"
#: allianceauth/corputils/views.py:54
msgid "Selected corp already has a statistics module."
msgstr ""
msgstr "La corporazione selezionata dispone già di un modulo statistiche."
#: allianceauth/corputils/views.py:56
msgid "Failed to gather corporation statistics with selected token."
@@ -410,7 +403,7 @@ msgstr "Crea Fatlink"
#: allianceauth/optimer/templates/optimer/add.html:13
#: allianceauth/optimer/templates/optimer/add.html:22
msgid "Create Fleet Operation"
msgstr ""
msgstr "Crea Fleet Operation"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkformatter.html:13
msgid "Bad request!"
@@ -508,7 +501,7 @@ msgstr[2] "%(user)s ha ottenuto %(links)s links questo mese."
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:26
msgid "Times used"
msgstr ""
msgstr "Numero di volte utilizzato"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkpersonalmonthlystatisticsview.html:37
#, python-format
@@ -565,7 +558,7 @@ msgstr "Mese"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:22
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23
msgid "Fats"
msgstr ""
msgstr "Fats"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:4
msgid "Fatlink Corp Statistics"
@@ -614,11 +607,11 @@ msgstr "Nessun fatlink documentato."
#: allianceauth/fleetactivitytracking/views.py:218
msgid "Character does not exist"
msgstr ""
msgstr "Il personaggio non esiste"
#: allianceauth/fleetactivitytracking/views.py:221
msgid "User does not exist"
msgstr ""
msgstr "L'utente non esiste"
#: allianceauth/fleetactivitytracking/views.py:299
msgid "Fleet participation registered."
@@ -634,23 +627,25 @@ msgid ""
"Cannot register the fleet participation for {character.character_name}. The "
"character needs to be online."
msgstr ""
"Impossibile registrare la partecipazione alla flotta per "
"{character.character_name}. Il personaggio deve essere online."
#: allianceauth/groupmanagement/auth_hooks.py:17
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:13
msgid "Group Management"
msgstr ""
msgstr "Gestione gruppi"
#: allianceauth/groupmanagement/forms.py:15
msgid "This name has been reserved and can not be used for groups."
msgstr ""
msgstr "Questo nome è riservato e non può essere utilizzato per gruppi."
#: allianceauth/groupmanagement/forms.py:25
msgid "(auto)"
msgstr ""
msgstr "(auto)"
#: allianceauth/groupmanagement/forms.py:34
msgid "There already exists a group with that name."
msgstr ""
msgstr "Esiste già un gruppo con quel nome."
#: allianceauth/groupmanagement/models.py:105
msgid ""
@@ -658,16 +653,25 @@ msgid ""
"group.<br>Used for groups such as Members, Corp_*, Alliance_* "
"etc.<br><b>Overrides Hidden and Open options when selected.</b>"
msgstr ""
"Gruppo interno, gli utenti non possono vedere, unirsi o fare richiesta di "
"adesione a questo gruppo. <br>Utilizzato per gruppi come Membri, Corpazioni,"
" Alleanze, etc. <br><b>Sovrascrive opzioni nascoste e aperte quando "
"seleazionato."
#: allianceauth/groupmanagement/models.py:113
msgid "Group is hidden from users but can still join with the correct link."
msgstr ""
"Il gruppo è nascosto agli utenti ma questi vi possono aderire utilizzando il"
" link corretto. "
#: allianceauth/groupmanagement/models.py:119
msgid ""
"Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved."
msgstr ""
"Il gruppo è aperto e gli utenti saranno automaticamente aggiunti a seguito "
"richiesta. <br>Se il gruppo non è aperto gli utenti dovranno necessitare di "
"approvazione manuale."
#: allianceauth/groupmanagement/models.py:126
msgid ""

File diff suppressed because it is too large Load Diff

View File

@@ -17,10 +17,10 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-14 23:17+1000\n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: jackfrost, 2022\n"
"Language-Team: Korean (Korea) (https://www.transifex.com/alliance-auth/teams/107430/ko_KR/)\n"
"Language-Team: Korean (Korea) (https://app.transifex.com/alliance-auth/teams/107430/ko_KR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -49,47 +49,38 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:89
msgid "English"
msgstr "영어"
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:90
msgid "German"
msgstr "독일어"
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:91
msgid "Spanish"
msgstr "스페인어"
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:92
msgid "Chinese Simplified"
msgstr "간체자"
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:93
msgid "Russian"
msgstr "러시아어"
#: allianceauth/authentication/models.py:85
#: allianceauth/project_template/project_name/settings/base.py:94
msgid "Korean"
msgstr "한국어"
#: allianceauth/authentication/models.py:86
#: allianceauth/project_template/project_name/settings/base.py:95
msgid "French"
msgstr "프랑스어"
#: allianceauth/authentication/models.py:87
#: allianceauth/project_template/project_name/settings/base.py:96
msgid "Japanese"
msgstr "일본어"
#: allianceauth/authentication/models.py:88
#: allianceauth/project_template/project_name/settings/base.py:97
msgid "Italian"
msgstr "이탈리아어"

View File

@@ -7,16 +7,17 @@
# Alexander Gess <de.alex.gess@gmail.com>, 2020
# Yuriy K <thedjcooltv@gmail.com>, 2020
# Андрей Зубков <and.vareba81@gmail.com>, 2020
# Filipp Chertiev <f@fzfx.ru>, 2023
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-14 23:17+1000\n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Андрей Зубков <and.vareba81@gmail.com>, 2020\n"
"Language-Team: Russian (https://www.transifex.com/alliance-auth/teams/107430/ru/)\n"
"Last-Translator: Filipp Chertiev <f@fzfx.ru>, 2023\n"
"Language-Team: Russian (https://app.transifex.com/alliance-auth/teams/107430/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -25,15 +26,16 @@ msgstr ""
#: allianceauth/analytics/models.py:29
msgid "Google Analytics Universal"
msgstr ""
msgstr "Google Analytics Universal"
#: allianceauth/analytics/models.py:30
msgid "Google Analytics V4"
msgstr ""
msgstr "Google Analytics V4"
#: allianceauth/authentication/decorators.py:37
msgid "A main character is required to perform that action. Add one below."
msgstr "Необходимо указать основного персонажа. Добавим?"
msgstr ""
"Для продолжения следует указать основного персонажа. Выберите его ниже."
#: allianceauth/authentication/forms.py:12
msgid "Email"
@@ -42,61 +44,52 @@ msgstr "Email"
#: allianceauth/authentication/forms.py:62
#, python-format
msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
msgstr "Вам не разрешено добавлять или удалять эти ограниченные группы: %s"
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:89
msgid "English"
msgstr ""
msgstr "Английский"
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:90
msgid "German"
msgstr ""
msgstr "Немецкий"
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:91
msgid "Spanish"
msgstr ""
msgstr "Испанский"
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:92
msgid "Chinese Simplified"
msgstr ""
msgstr "Китайский упрощённый"
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:93
msgid "Russian"
msgstr ""
msgstr "Русский"
#: allianceauth/authentication/models.py:85
#: allianceauth/project_template/project_name/settings/base.py:94
msgid "Korean"
msgstr ""
msgstr "Корейский"
#: allianceauth/authentication/models.py:86
#: allianceauth/project_template/project_name/settings/base.py:95
msgid "French"
msgstr ""
msgstr "Французский"
#: allianceauth/authentication/models.py:87
#: allianceauth/project_template/project_name/settings/base.py:96
msgid "Japanese"
msgstr ""
msgstr "Японский"
#: allianceauth/authentication/models.py:88
#: allianceauth/project_template/project_name/settings/base.py:97
msgid "Italian"
msgstr ""
msgstr "Итальянский"
#: allianceauth/authentication/models.py:91
msgid "Language"
msgstr ""
msgstr "Язык"
#: allianceauth/authentication/models.py:96
#: allianceauth/templates/allianceauth/night-toggle.html:6
msgid "Night Mode"
msgstr ""
msgstr "Ночной режим"
#: allianceauth/authentication/models.py:110
#, python-format
@@ -122,7 +115,7 @@ msgid ""
" "
msgstr ""
"\n"
" Основной персонаж (статус: %(state)s)\n"
" Основной персонаж (статус: %(state)s)\n"
" "
#: allianceauth/authentication/templates/authentication/dashboard.html:101
@@ -175,23 +168,24 @@ msgstr "Вход"
#: allianceauth/authentication/templates/public/login.html:10
msgid "Login with Eve SSO"
msgstr ""
msgstr "Зайти с помощью EVE SSO"
#: allianceauth/authentication/templates/public/middle_box.html:24
msgid "For information on SSO, ESI and security read the CCP Dev Blog"
msgstr ""
"Информацию по SSO, ESI и вопросам безопасности читайте в блоге CCP Dev"
#: allianceauth/authentication/templates/public/middle_box.html:26
msgid "Introducing ESI - A New API For Eve Online"
msgstr ""
msgstr "Введение в ESI — новое API для EVE Online"
#: allianceauth/authentication/templates/public/middle_box.html:32
msgid "Manage ESI Applications"
msgstr ""
msgstr "Управление приложениями ESI"
#: allianceauth/authentication/templates/public/register.html:6
msgid "Registration"
msgstr ""
msgstr "Регистрация"
#: allianceauth/authentication/templates/public/register.html:21
msgid "Register"
@@ -314,7 +308,7 @@ msgstr "Корпорация"
#: allianceauth/corputils/templates/corputils/corpstats.html:167
#: allianceauth/corputils/templates/corputils/search.html:27
msgid "Killboard"
msgstr "zKillBoard"
msgstr "Killboard"
#: allianceauth/corputils/templates/corputils/corpstats.html:114
#: allianceauth/corputils/templates/corputils/search.html:16
@@ -342,7 +336,7 @@ msgstr "Результаты поиска:"
#: allianceauth/corputils/templates/corputils/search.html:15
msgid "zKillboard"
msgstr "zKillBoard"
msgstr "zKillboard"
#: allianceauth/corputils/views.py:54
msgid "Selected corp already has a statistics module."
@@ -607,11 +601,11 @@ msgstr "Нет закрепленных ФлАк ссылок в записи"
#: allianceauth/fleetactivitytracking/views.py:218
msgid "Character does not exist"
msgstr ""
msgstr "Персонаж не существует"
#: allianceauth/fleetactivitytracking/views.py:221
msgid "User does not exist"
msgstr ""
msgstr "Пользователь не существует"
#: allianceauth/fleetactivitytracking/views.py:299
msgid "Fleet participation registered."
@@ -627,6 +621,8 @@ msgid ""
"Cannot register the fleet participation for {character.character_name}. The "
"character needs to be online."
msgstr ""
"Не могу зарегистрировать ФлАк для {character.character_name}. Персонаж "
"должен быть онлайн."
#: allianceauth/groupmanagement/auth_hooks.py:17
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:13
@@ -636,14 +632,15 @@ msgstr "Управление Группой"
#: allianceauth/groupmanagement/forms.py:15
msgid "This name has been reserved and can not be used for groups."
msgstr ""
"Это имя является зарезервированным и не может быть использовано для групп."
#: allianceauth/groupmanagement/forms.py:25
msgid "(auto)"
msgstr ""
msgstr "(авто)"
#: allianceauth/groupmanagement/forms.py:34
msgid "There already exists a group with that name."
msgstr ""
msgstr "Группа с таким именем уже существует."
#: allianceauth/groupmanagement/models.py:105
msgid ""
@@ -651,16 +648,25 @@ msgid ""
"group.<br>Used for groups such as Members, Corp_*, Alliance_* "
"etc.<br><b>Overrides Hidden and Open options when selected.</b>"
msgstr ""
"Внутренняя группа, пользователи не могут видеть эту группу, присоединяться к"
" ней или подавать запрос на присоединение.<br>Используется таких групп как "
"Members, Corp_*, Alliance_* и т. п.<br><b>Будучи выбранной, отменяет "
"настройки \"Скрытая\" и \"Открытая\".</b>"
#: allianceauth/groupmanagement/models.py:113
msgid "Group is hidden from users but can still join with the correct link."
msgstr ""
"Группы скрыты от пользователей, но к ним всё ещё можно присоединиться с "
"помощью корректной ссылки."
#: allianceauth/groupmanagement/models.py:119
msgid ""
"Group is open and users will be automatically added upon request.<br>If the "
"group is not open users will need their request manually approved."
msgstr ""
"Группа является открытой, пользователи будут автоматически добавлены в неё "
"при отправке запроса.<br>Если группа не является открытой, запросы от "
"пользователей будут требовать ручного подтверждения."
#: allianceauth/groupmanagement/models.py:126
msgid ""
@@ -669,12 +675,18 @@ msgid ""
"remove users from this group automatically when they are no longer "
"authenticated."
msgstr ""
"Группа является публичной. Любые зарегистрированные пользователи могут "
"присоединиться к этой группе, настройки видимости будут основаны на других "
"настройках данной группы.<br>Auth не будет удалять пользователей из этой "
"группы автоматически при окончании срока их аутентификации."
#: allianceauth/groupmanagement/models.py:135
msgid ""
"Group is restricted. This means that adding or removing users for this group"
" requires a superuser admin."
msgstr ""
"Группа является ограниченной. Это значит что добавление пользователей в эту "
"группу или удаление из неё требует прав superuser admin."
#: allianceauth/groupmanagement/models.py:144
msgid ""
@@ -682,6 +694,9 @@ msgid ""
"<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>"
msgstr ""
"Лидеры группы могут обрабатывать запросы, относящиеся к этой группе. "
"Используйте разрешение <code>auth.group_management</code>, чтобы позволить "
"пользователю управлять всеми группами.<br>"
#: allianceauth/groupmanagement/models.py:154
msgid ""
@@ -689,49 +704,56 @@ msgid ""
"<code>auth.group_management</code> permission to allow a user to manage all "
"groups.<br>"
msgstr ""
"Члены групп лидеров могут обрабатывать запросы, относящиеся к этой группе. "
"Используйте разрешение <code>auth.group_management</code>, чтобы позволить "
"пользователю управлять всеми группами.<br>"
#: allianceauth/groupmanagement/models.py:163
msgid ""
"States listed here will have the ability to join this group provided they "
"have the proper permissions.<br>"
msgstr ""
"Статусы, перечисленные здесь, смогут присоединиться к группе, если у них "
"есть соответствующие разрешения.<br>"
#: allianceauth/groupmanagement/models.py:171
msgid ""
"Short description <i>(max. 512 characters)</i> of the group shown to users."
msgstr ""
"Краткое описание <i>(макс. 512 символов)</i> группы, отображаемое "
"пользователям."
#: allianceauth/groupmanagement/models.py:178
msgid "Can request non-public groups"
msgstr ""
msgstr "Можно отправлять запрос на непубличную группу."
#: allianceauth/groupmanagement/models.py:209
msgid "name"
msgstr ""
msgstr "имя"
#: allianceauth/groupmanagement/models.py:212
msgid "Name that can not be used for groups."
msgstr ""
msgstr "Имя, которое не может быть использовано для групп."
#: allianceauth/groupmanagement/models.py:215
msgid "reason"
msgstr ""
msgstr "причина"
#: allianceauth/groupmanagement/models.py:215
msgid "Reason why this name is reserved."
msgstr ""
msgstr "Причина, по которой это имя зарезервировано."
#: allianceauth/groupmanagement/models.py:218
msgid "created by"
msgstr ""
msgstr "создано кем"
#: allianceauth/groupmanagement/models.py:223
msgid "created at"
msgstr ""
msgstr "создано когда"
#: allianceauth/groupmanagement/models.py:223
msgid "Date when this entry was created"
msgstr ""
msgstr "Дата, когда данное содержимое было создано"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:4
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
@@ -773,11 +795,11 @@ msgstr "Исполнитель"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:48
msgid "Removed"
msgstr ""
msgstr "Удалено"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:60
msgid "All times displayed are EVE/UTC."
msgstr ""
msgstr "Все значения времени отображаются в EVE/ET/UTC."
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:67
msgid "No entries found for this group."
@@ -797,13 +819,13 @@ msgstr "Корпорация"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:49
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:75
msgid "Group leader"
msgstr ""
msgstr "Лидер группы"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:60
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:82
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:139
msgid "(unknown)"
msgstr ""
msgstr "(неизвестно)"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:65
msgid "Remove from group"
@@ -1221,19 +1243,19 @@ msgstr "Откомментировать"
#: allianceauth/notifications/models.py:21
msgid "danger"
msgstr ""
msgstr "опасн"
#: allianceauth/notifications/models.py:22
msgid "warning"
msgstr ""
msgstr "упрежд"
#: allianceauth/notifications/models.py:23
msgid "info"
msgstr ""
msgstr "инфо"
#: allianceauth/notifications/models.py:24
msgid "success"
msgstr ""
msgstr "успех"
#: allianceauth/notifications/templates/notifications/list.html:4
#: allianceauth/notifications/templates/notifications/list.html:7
@@ -1267,7 +1289,7 @@ msgstr "Заголовок"
#: allianceauth/notifications/templates/notifications/list_partial.html:28
msgid "No notifications."
msgstr ""
msgstr "Нет уведомлений."
#: allianceauth/notifications/templates/notifications/view.html:4
#: allianceauth/notifications/templates/notifications/view.html:8
@@ -1315,7 +1337,7 @@ msgstr "Название операции"
#: allianceauth/optimer/form.py:16
msgid "Operation Type"
msgstr ""
msgstr "Тип операции"
#: allianceauth/optimer/form.py:17
#: allianceauth/srp/templates/srp/management.html:38
@@ -1329,7 +1351,7 @@ msgstr "Дополнительная информация"
#: allianceauth/optimer/form.py:23
msgid "(Optional) Describe the operation with a couple of short words."
msgstr ""
msgstr "(Опционально) Опишите операцию несколькими короткими словами."
#: allianceauth/optimer/templates/optimer/add.html:6
#: allianceauth/optimer/templates/optimer/management.html:13
@@ -1366,7 +1388,7 @@ msgstr "Текущий EVE Time:"
#: allianceauth/optimer/templates/optimer/management.html:26
msgid "Next Fleet Operations"
msgstr ""
msgstr "Грядущие Флотовые операции"
#: allianceauth/optimer/templates/optimer/management.html:30
#: allianceauth/timerboard/templates/timerboard/view.html:362
@@ -1375,7 +1397,7 @@ msgstr "Нет предстоящих таймеров"
#: allianceauth/optimer/templates/optimer/management.html:33
msgid "Past Fleet Operations"
msgstr ""
msgstr "Прошлые Флотовые операции"
#: allianceauth/optimer/templates/optimer/management.html:37
#: allianceauth/timerboard/templates/timerboard/view.html:535
@@ -1455,7 +1477,7 @@ msgstr "Пользователи"
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:41
msgid "States"
msgstr "Состояния"
msgstr "Статусы"
#: allianceauth/services/abstract.py:72
msgid "That service account already exists"
@@ -1464,7 +1486,7 @@ msgstr "Этот сервис уже активирован"
#: allianceauth/services/abstract.py:103
#, python-brace-format
msgid "Successfully set your {self.service_name} password"
msgstr ""
msgstr "Успешно установлен пароль для вашего {self.setvice_name}"
#: allianceauth/services/auth_hooks.py:12
msgid "Services"
@@ -1508,7 +1530,7 @@ msgstr "Назначение:"
#: allianceauth/services/forms.py:15
msgid "Reimbursable?*"
msgstr "Конпенсировать?"
msgstr "Компенсировать?"
#: allianceauth/services/forms.py:15 allianceauth/services/forms.py:16
msgid "Yes"
@@ -1539,10 +1561,12 @@ msgid ""
"Your Discord account was disabled automatically by Auth. If you think this "
"was a mistake, please contact an admin."
msgstr ""
"Auth автоматически отключил ваш аккаунт Discord. Если вы думаете, что это "
"произошло по ошибке, пожалуйста свяжитесь с админом."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:5
msgid "Discord"
msgstr ""
msgstr "Discord"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:18
msgid "Join the Discord server"
@@ -1550,7 +1574,7 @@ msgstr "Подключиться к серверу Discord"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:22
msgid "Leave- and rejoin the Discord Server (Reset)"
msgstr "Переподключиться к серверу Discord. "
msgstr "Переподключиться к серверу Discord (сброс). "
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:25
msgid "Leave the Discord server"
@@ -1605,29 +1629,31 @@ msgstr ""
#: allianceauth/services/modules/discourse/views.py:62
msgid "Invalid payload. Please contact support if this problem persists."
msgstr ""
"Недопустимая \"полезная нагрузка\". Пожалуйста свяжитесь с поддержкой, если "
"данная проблема будет продолжаться."
#: allianceauth/services/modules/ips4/views.py:31
msgid "Activated IPSuite4 account."
msgstr ""
msgstr "Активирован аккаунт IPSuite4."
#: allianceauth/services/modules/ips4/views.py:39
#: allianceauth/services/modules/ips4/views.py:60
#: allianceauth/services/modules/ips4/views.py:81
#: allianceauth/services/modules/ips4/views.py:101
msgid "An error occurred while processing your IPSuite4 account."
msgstr ""
msgstr "Произошла ошибка при работе с вашим аккаунтом IPSuite4."
#: allianceauth/services/modules/ips4/views.py:52
msgid "Reset IPSuite4 password."
msgstr ""
msgstr "Сбросить пароль IPSuite4."
#: allianceauth/services/modules/ips4/views.py:78
msgid "Set IPSuite4 password."
msgstr ""
msgstr "Установить пароль IPSuite4."
#: allianceauth/services/modules/ips4/views.py:98
msgid "Deactivated IPSuite4 account."
msgstr ""
msgstr "Деактивированный аккаунт IPSuite4."
#: allianceauth/services/modules/openfire/auth_hooks.py:26
msgid "Jabber"
@@ -1641,7 +1667,7 @@ msgstr "Jabber Бродкаст"
#: allianceauth/services/modules/openfire/auth_hooks.py:94
msgid "Fleet Broadcast Formatter"
msgstr ""
msgstr "Флотовый Оповещатель"
#: allianceauth/services/modules/openfire/forms.py:7
msgid "Message"
@@ -1704,26 +1730,26 @@ msgstr "Установить пароль на Форум."
#: allianceauth/services/modules/smf/views.py:52
msgid "Activated SMF account."
msgstr ""
msgstr "Активированный аккаунт SMF."
#: allianceauth/services/modules/smf/views.py:65
#: allianceauth/services/modules/smf/views.py:81
#: allianceauth/services/modules/smf/views.py:102
#: allianceauth/services/modules/smf/views.py:124
msgid "An error occurred while processing your SMF account."
msgstr ""
msgstr "Произошла ошибка при работе с вашим аккаунтом SMF."
#: allianceauth/services/modules/smf/views.py:78
msgid "Deactivated SMF account."
msgstr ""
msgstr "Деактивированный аккаунт SMF."
#: allianceauth/services/modules/smf/views.py:95
msgid "Reset SMF password."
msgstr ""
msgstr "Сбросить пароль SMF."
#: allianceauth/services/modules/smf/views.py:121
msgid "Set SMF password."
msgstr ""
msgstr "Установить пароль SMF."
#: allianceauth/services/modules/teamspeak3/forms.py:14
#, python-format
@@ -1732,7 +1758,7 @@ msgstr "Не могу найти %s на сервере"
#: allianceauth/services/modules/teamspeak3/templates/admin/teamspeak3/authts/change_list.html:8
msgid "Update TS3 groups"
msgstr ""
msgstr "Обновить группы TS3"
#: allianceauth/services/modules/teamspeak3/templates/services/teamspeak3/teamspeakjoin.html:5
msgid "Verify Teamspeak"
@@ -1772,26 +1798,26 @@ msgstr "Сбросить TeamSpeak3 ключ доступа."
#: allianceauth/services/modules/xenforo/views.py:30
msgid "Activated XenForo account."
msgstr ""
msgstr "Активированный аккаунт XenForo."
#: allianceauth/services/modules/xenforo/views.py:40
#: allianceauth/services/modules/xenforo/views.py:52
#: allianceauth/services/modules/xenforo/views.py:73
#: allianceauth/services/modules/xenforo/views.py:94
msgid "An error occurred while processing your XenForo account."
msgstr ""
msgstr "Произошла ошибка при работе с вашим аккаунтом XenForo."
#: allianceauth/services/modules/xenforo/views.py:50
msgid "Deactivated XenForo account."
msgstr ""
msgstr "Деактивированный аккаунт XenForo."
#: allianceauth/services/modules/xenforo/views.py:65
msgid "Reset XenForo account password."
msgstr ""
msgstr "Сбросить пароль XenForo."
#: allianceauth/services/modules/xenforo/views.py:91
msgid "Changed XenForo password."
msgstr ""
msgstr "Изменённый пароль XenForo."
#: allianceauth/services/templates/services/fleetformattertool.html:5
msgid "Fleet Formatter Tool"
@@ -1799,7 +1825,7 @@ msgstr "ФлитФорматер"
#: allianceauth/services/templates/services/fleetformattertool.html:10
msgid "Fleet Broadcast Formatter Tool"
msgstr "Флотовый Бродкастер"
msgstr "Флотовый Оповещатель"
#: allianceauth/services/templates/services/fleetformattertool.html:23
msgid "Format"
@@ -1869,15 +1895,16 @@ msgstr "Флотовая Доктрина"
#: allianceauth/srp/form.py:16
msgid "Killboard Link (zkillboard.com or kb.evetools.org)"
msgstr ""
msgstr "Ссылка киллборды (zkillboard.com или kb.evetools.org)"
#: allianceauth/srp/form.py:34
msgid "Invalid Link. Please use zkillboard.com or kb.evetools.org"
msgstr ""
"Неверная ссылка. Пожалуйста используйте zkillboard.com или kb.evetools.org"
#: allianceauth/srp/form.py:46
msgid "Invalid Link. Please post a direct link to a killmail."
msgstr ""
msgstr "Неверная ссылка. Пожалуйста предоставьте прямую ссылку на киллмейл."
#: allianceauth/srp/form.py:53
msgid "After Action Report Link"
@@ -1898,7 +1925,7 @@ msgstr "Поделиться ссылкой с рядовыми участник
#: allianceauth/srp/templates/srp/data.html:5
msgid "Srp Fleet Data"
msgstr ""
msgstr "Данные флота по SRP"
#: allianceauth/srp/templates/srp/data.html:50
msgid "SRP Fleet Data"
@@ -1921,7 +1948,7 @@ msgstr "Суммарные потери:"
#: allianceauth/srp/templates/srp/data.html:158
#: allianceauth/srp/templates/srp/management.html:28
msgid "Total ISK Cost:"
msgstr "Оценочная стоимость (ISK):"
msgstr "Оценочная стоимость, ISK:"
#: allianceauth/srp/templates/srp/data.html:80
#: allianceauth/srp/templates/srp/data.html:166
@@ -1934,7 +1961,7 @@ msgstr "Имя Пилота"
#: allianceauth/srp/templates/srp/data.html:90
msgid "Killboard Link"
msgstr "zKillBoard ссылка"
msgstr "Killboard ссылка"
#: allianceauth/srp/templates/srp/data.html:92
msgid "Ship Type"
@@ -1942,7 +1969,7 @@ msgstr "Тип корабля"
#: allianceauth/srp/templates/srp/data.html:93
msgid "Killboard Loss Amt"
msgstr "потерь по zKillBoard на данный момент"
msgstr "Потерь по Killboard на данный момент"
#: allianceauth/srp/templates/srp/data.html:94
msgid "SRP ISK Cost"
@@ -1978,7 +2005,7 @@ msgstr "Добавить SRP флот"
#: allianceauth/srp/templates/srp/management.html:39
msgid "Fleet AAR"
msgstr "Флитовый AAR."
msgstr "Флитовый AAR"
#: allianceauth/srp/templates/srp/management.html:40
msgid "Fleet SRP Code"
@@ -2072,15 +2099,15 @@ msgstr "Не могу найти SRP код с ID %(srpfleetid)s"
#: allianceauth/srp/views.py:179
msgid "This kill mail has already been posted."
msgstr ""
msgstr "Этот киллмейл уже был предоставлен ранее."
#: allianceauth/srp/views.py:200
msgid ""
"Your SRP request Killmail link is invalid. Please make sure you are using "
"zKillboard."
msgstr ""
"Ваш SRP запрос Killmail неправильный. Пожалуйста убедитесь в правильности "
"ссылки. "
"Ссылка на киллмейл в вашем SRP запросе неправильная. Пожалуйста убедитесь в "
"правильности ссылки. "
#: allianceauth/srp/views.py:212
#, python-format
@@ -2144,11 +2171,11 @@ msgstr "Закрыт"
#: allianceauth/templates/allianceauth/admin-status/overview.html:28
msgid "Powered by GitLab"
msgstr ""
msgstr "При поддержке GitLab"
#: allianceauth/templates/allianceauth/admin-status/overview.html:35
msgid "Support Discord"
msgstr ""
msgstr "Поддержка Discord"
#: allianceauth/templates/allianceauth/admin-status/overview.html:43
msgid "Software Version"
@@ -2185,6 +2212,8 @@ msgid ""
" Status of %(total)s processed tasks • last %(latest)s\n"
" "
msgstr ""
"\n"
" Статус %(total)s обработанных задач • последние %(latest)s"
#: allianceauth/templates/allianceauth/admin-status/overview.html:95
#, python-format
@@ -2193,6 +2222,8 @@ msgid ""
" %(queue_length)s queued tasks\n"
" "
msgstr ""
"\n"
" %(queue_length)s запланированных задач"
#: allianceauth/templates/allianceauth/top-menu-admin.html:9
msgid "Admin"
@@ -2200,16 +2231,16 @@ msgstr "Администратор"
#: allianceauth/templates/allianceauth/top-menu-admin.html:19
msgid "AA Documentation"
msgstr ""
msgstr "Документация AA"
#: allianceauth/templates/allianceauth/top-menu-admin.html:26
msgid "AA Support Discord"
msgstr ""
msgstr "Discord поддержки AA"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:10
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:14
msgid "User Menu"
msgstr ""
msgstr "Меню пользователя"
#: allianceauth/templates/allianceauth/top-menu-user-dropdown.html:56
msgid "Logout"
@@ -2257,7 +2288,7 @@ msgstr "Тип структуры"
#: allianceauth/timerboard/form.py:62
msgid "Timer Type"
msgstr ""
msgstr "Тип таймера"
#: allianceauth/timerboard/form.py:63
#: allianceauth/timerboard/templates/timerboard/view.html:32
@@ -2288,31 +2319,31 @@ msgstr "Корпорация зарегистрированна"
#: allianceauth/timerboard/models.py:14
msgid "Not Specified"
msgstr ""
msgstr "Не указано"
#: allianceauth/timerboard/models.py:15
msgid "Shield"
msgstr ""
msgstr "Щит"
#: allianceauth/timerboard/models.py:16
msgid "Armor"
msgstr ""
msgstr "Броня"
#: allianceauth/timerboard/models.py:17
msgid "Hull"
msgstr ""
msgstr "Структура"
#: allianceauth/timerboard/models.py:18
msgid "Final"
msgstr ""
msgstr "Финальный"
#: allianceauth/timerboard/models.py:19
msgid "Anchoring"
msgstr ""
msgstr "Постановка на якорь"
#: allianceauth/timerboard/models.py:20
msgid "Unanchoring"
msgstr ""
msgstr "Снятие с якоря"
#: allianceauth/timerboard/templates/timerboard/timer_confirm_delete.html:11
msgid "Delete Timer"
@@ -2372,4 +2403,4 @@ msgstr "Добавлен таймер в %(system)s на %(time)s."
#: allianceauth/timerboard/views.py:82
msgid "Saved changes to the timer."
msgstr "Изменения сохранены"
msgstr "Изменения таймера сохранены."

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -13,10 +13,10 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-09-14 23:17+1000\n"
"POT-Creation-Date: 2022-10-09 18:20+1000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Aaron BuBu <351793078@qq.com>, 2020\n"
"Language-Team: Chinese Simplified (https://www.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
"Language-Team: Chinese Simplified (https://app.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -45,47 +45,38 @@ msgid "You are not allowed to add or remove these restricted groups: %s"
msgstr ""
#: allianceauth/authentication/models.py:80
#: allianceauth/project_template/project_name/settings/base.py:89
msgid "English"
msgstr ""
#: allianceauth/authentication/models.py:81
#: allianceauth/project_template/project_name/settings/base.py:90
msgid "German"
msgstr ""
#: allianceauth/authentication/models.py:82
#: allianceauth/project_template/project_name/settings/base.py:91
msgid "Spanish"
msgstr ""
#: allianceauth/authentication/models.py:83
#: allianceauth/project_template/project_name/settings/base.py:92
msgid "Chinese Simplified"
msgstr ""
#: allianceauth/authentication/models.py:84
#: allianceauth/project_template/project_name/settings/base.py:93
msgid "Russian"
msgstr ""
#: allianceauth/authentication/models.py:85
#: allianceauth/project_template/project_name/settings/base.py:94
msgid "Korean"
msgstr ""
#: allianceauth/authentication/models.py:86
#: allianceauth/project_template/project_name/settings/base.py:95
msgid "French"
msgstr ""
#: allianceauth/authentication/models.py:87
#: allianceauth/project_template/project_name/settings/base.py:96
msgid "Japanese"
msgstr ""
#: allianceauth/authentication/models.py:88
#: allianceauth/project_template/project_name/settings/base.py:97
msgid "Italian"
msgstr ""

View File

@@ -44,7 +44,7 @@ def notification_view(request, notif_id):
notif.mark_viewed()
return render(request, 'notifications/view.html', context)
else:
logger.warn(
logger.warning(
"User %s not authorized to view notif_id %s belonging to user %s",
request.user,
notif_id, notif.user

View File

@@ -34,7 +34,7 @@ class OpTimer(models.Model):
fc = models.CharField(max_length=254, default="")
post_time = models.DateTimeField(default=timezone.now)
eve_character = models.ForeignKey(EveCharacter, null=True,
on_delete=models.SET_NULL)
on_delete=models.SET_NULL)
description = models.TextField(blank=True, default="")
type = models.ForeignKey(OpTimerType, null=True, on_delete=models.SET_NULL)

View File

@@ -84,17 +84,17 @@ LOCALE_PATHS = (
os.path.join(BASE_DIR, 'locale/'),
)
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('de', ugettext('German')),
('es', ugettext('Spanish')),
('zh-hans', ugettext('Chinese Simplified')),
('ru', ugettext('Russian')),
('ko', ugettext('Korean')),
('fr', ugettext('French')),
('ja', ugettext('Japanese')),
('it', ugettext('Italian')),
("en", "English"),
("de", "German"),
("es", "Spanish"),
("zh-hans", "Chinese Simplified"),
("ru", "Russian"),
("ko", "Korean"),
("fr", "French"),
("ja", "Japanese"),
("it", "Italian"),
("uk", "Ukrainian"),
)
TEMPLATES = [

View File

@@ -49,7 +49,7 @@ class DiscourseTasks:
DiscourseManager.update_groups(user)
except Exception as e:
logger.exception(e)
logger.warn("Discourse group sync failed for %s, retrying in 10 mins" % user)
logger.warning("Discourse group sync failed for %s, retrying in 10 mins" % user)
raise self.retry(countdown=60 * 10)
logger.debug("Updated user %s discourse groups." % user)

View File

@@ -1,13 +1,16 @@
<tr>
<td class="text-center">{{ service_name }}</td>
<td class="text-center">{{ username }}</td>
<td class="text-center"><a href="mumble://{{ service_url }}">{{ service_url }}</a></td>
<td class="text-center">
{% if username == "" %}
<td class="text-center">{{ service_url }}</td>
<td class="text-center">
<a href="{% url 'mumble:activate' %}" title="Activate" class="btn btn-warning">
<span class="glyphicon glyphicon-ok"></span>
</a>
</td>
{% else %}
<td class="text-center"><a href="mumble://{{ connect_url }}">{{ service_url }}</a></td>
<td class="text-center">
<a href="{% url 'mumble:set_password' %}" title="Set Password" class="btn btn-warning">
<span class="glyphicon glyphicon-pencil"></span>
</a>
@@ -17,9 +20,9 @@
<a href="{% url 'mumble:deactivate' %}" title="Deactivate" class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span>
</a>
<a href="mumble://{{ connect_url }}" class="btn btn-success" title="Connect">
<a href="mumble://{{ connect_url }}" class="btn btn-success" title="Connect">
<span class="glyphicon glyphicon-arrow-right"></span>
</a>
</td>
{% endif %}
</td>
</tr>

View File

@@ -176,7 +176,7 @@ class Phpbb3Manager:
logger.debug(f"Proceeding to add phpbb user {username_clean} and pwhash starting with {pwhash[0:5]}")
# check if the username was simply revoked
if Phpbb3Manager.check_user(username_clean):
logger.warn("Unable to add phpbb user with username %s - already exists. Updating user instead." % username)
logger.warning("Unable to add phpbb user with username %s - already exists. Updating user instead." % username)
Phpbb3Manager.__update_user_info(username_clean, email, pwhash)
else:
try:

View File

@@ -457,7 +457,7 @@ class Teamspeak3AdminTestCase(TestCase):
cls.site = AdminSite()
cls.admin = AuthTSgroupAdmin(AuthTS, cls.site)
cls.group = Group.objects.create(name='test')
cls.ts_group = TSgroup.objects.create(ts_group_name='test')
cls.ts_group = TSgroup.objects.create(ts_group_id=1, ts_group_name='test')
def test_field_queryset_no_reserved_names(self):
"""Ensure all groups are listed when no reserved names"""

View File

@@ -44,7 +44,7 @@ def activate_teamspeak3(request):
def verify_teamspeak3(request):
logger.debug("verify_teamspeak3 called by user %s" % request.user)
if not Teamspeak3Tasks.has_account(request.user):
logger.warn("Unable to validate user %s teamspeak: no teamspeak data" % request.user)
logger.warning("Unable to validate user %s teamspeak: no teamspeak data" % request.user)
return redirect("services:services")
if request.method == "POST":
form = TeamspeakJoinForm(request.POST)

View File

@@ -53,6 +53,14 @@
<!-- logout / login -->
<li role="separator" class="divider"></li>
{% if user.is_authenticated %}
<li>
<a href="{% url 'authentication:token_management' %}">
<i class="fas fa-user-lock"></i>
{% translate "Token Management" %}
</a>
</li>
<li role="separator" class="divider"></li>
<li><a href="{% url 'logout' %}">{% translate "Logout" %}</a></li>
{% else %}
<li><a href="{% url 'authentication:login' %}">{% translate "Login" %}</a></li>

View File

@@ -1,3 +1,3 @@
<!-- Start X-editable JS from cdnjs -->
<<script src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/js/bootstrap-editable.min.js" integrity="sha512-Mvqhe3YIUElH6VT0CFmUeRgYMrLvCGd2mvYCnJOf2nL9FvRBK74qRgTn7u0zSqA5cHiGxy83bwuhl1ASbS9M/w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/js/bootstrap-editable.min.js" integrity="sha512-Mvqhe3YIUElH6VT0CFmUeRgYMrLvCGd2mvYCnJOf2nL9FvRBK74qRgTn7u0zSqA5cHiGxy83bwuhl1ASbS9M/w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- End X-editable JS from cdnjs -->

View File

@@ -4,8 +4,7 @@ from typing import Optional
import amqp.exceptions
import requests
from celery.app import app_or_default
from packaging.version import InvalidVersion
from packaging.version import Version as Pep440Version
from packaging.version import InvalidVersion, Version as Pep440Version
from django import template
from django.conf import settings

View File

@@ -0,0 +1,25 @@
import sys
from copy import copy
from pathlib import Path
class StartupCommand:
"""Information about the command this Django instance was started with."""
def __init__(self) -> None:
self._argv = copy(sys.argv)
@property
def argv(self) -> list:
"""Return raw list of command line arguments."""
return self._argv
@property
def script_name(self) -> str:
"""Return the base script name."""
path = Path(self._argv[0])
return path.name
@property
def is_management_command(self) -> bool:
return self.script_name == "manage.py"

View File

@@ -0,0 +1,25 @@
from unittest.mock import patch
from django.test import TestCase
from allianceauth.utils.django import StartupCommand
MODULE_PATH = "allianceauth.utils.django"
class TestStartupCommand(TestCase):
def test_should_detect_management_command(self):
# when
with patch(MODULE_PATH + ".sys") as m:
m.argv = ["manage.py", "check"]
info = StartupCommand()
# then
self.assertTrue(info.is_management_command)
def test_should_detect_not_a_management_command(self):
# when
with patch(MODULE_PATH + ".sys") as m:
m.argv = ['/home/python/allianceauth-dev/venv/bin/gunicorn', 'myauth.wsgi']
info = StartupCommand()
# then
self.assertFalse(info.is_management_command)

View File

@@ -1,7 +1,7 @@
PROTOCOL=https://
AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN%
DOMAIN=%DOMAIN%
AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:3.2.0
AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v3.5.0
# Nginx Proxy Manager
PROXY_HTTP_PORT=80
@@ -21,6 +21,7 @@ AA_DB_NAME=alliance_auth
AA_DB_USER=aauth
AA_DB_PASSWORD=%AA_DB_PASSWORD%
AA_DB_ROOT_PASSWORD=%AA_DB_ROOT_PASSWORD%
AA_DB_CHARSET=utf8mb4
AA_EMAIL_HOST=''
AA_EMAIL_PORT=587
AA_EMAIL_HOST_USER=''

View File

@@ -1,5 +1,5 @@
FROM python:3.9-slim
ARG AUTH_VERSION=v3.2.0
ARG AUTH_VERSION=v3.5.0
ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION}
ENV VIRTUAL_ENV=/opt/venv
ENV AUTH_USER=allianceauth

View File

@@ -49,7 +49,11 @@ Using a custom docker image is the preferred approach, as it gives you the stabi
1. Add each additional package that you want to install to a single line in `conf/requirements.txt`. It is recommended, but not required, that you include a version number as well. This will keep your packages from magically updating. You can lookup packages on https://package.wiki, and copy everything after `pip install` from the top of the page to use the most recent version. It should look something like `allianceauth-signal-pings==0.0.7`. Every entry in this file should be on a separate line
1. In `docker-compose.yml`, comment out the `image` line under `allianceauth` (line 36... ish) and uncomment the `build` section
1. Now run `docker-compose --env-file=.env up -d`, your custom container will be built, and auth will have your new packages. Make sure to follow the package's instructions on config values that go in `local.py`
1. run `docker-compose --env-file=.env up -d`, your custom container will be built, and auth will have your new packages. Make sure to follow the package's instructions on config values that go in `local.py`
1. run `docker-compose exec allianceauth bash` to open up a terminal inside your auth container
1. run `allianceauth update myauth`
1. run `auth migrate`
1. run `auth collectstatic`
_NOTE: It is recommended that you put any secret values (API keys, database credentials, etc) in an environment variable instead of hardcoding them into `local.py`. This gives you the ability to track your config in git without committing passwords. To do this, just add it to your `.env` file, and then reference in `local.py` with `os.environ.get("SECRET_NAME")`_
@@ -58,8 +62,12 @@ _NOTE: It is recommended that you put any secret values (API keys, database cred
### Base Image
Whether you're using a custom image or not, the version of auth is dictated by $AA_DOCKER_TAG in your `.env` file.
1. To update to a new version of auth, update the version number at the end (or replace the whole value with the tag in the release notes).
1. Next, run `docker-compose pull`
1. Finally, run `docker-compose --env-file=.env up -d`
1. run `docker-compose pull`
1. run `docker-compose --env-file=.env up -d`
1. run `docker-compose exec allianceauth bash` to open up a terminal inside your auth container
1. run `allianceauth update myauth`
1. run `auth migrate`
1. run `auth collectstatic`
_NOTE: If you specify a version of allianceauth in your `requirements.txt` in a custom image it will override the version from the base image. Not recommended unless you know what you're doing_

View File

@@ -17,6 +17,9 @@ DATABASES["default"] = {
"PASSWORD": os.environ.get("AA_DB_PASSWORD"),
"HOST": os.environ.get("AA_DB_HOST"),
"PORT": os.environ.get("AA_DB_PORT", "3306"),
"OPTIONS": {
"charset": os.environ.get("AA_DB_CHARSET", "utf8mb4")
}
}
# Register an application at https://developers.eveonline.com for Authentication
@@ -28,7 +31,9 @@ DATABASES["default"] = {
ESI_SSO_CLIENT_ID = os.environ.get("ESI_SSO_CLIENT_ID")
ESI_SSO_CLIENT_SECRET = os.environ.get("ESI_SSO_CLIENT_SECRET")
ESI_SSO_CALLBACK_URL = f"{SITE_URL}/sso/callback"
ESI_USER_CONTACT_EMAIL = os.environ.get("ESI_USER_CONTACT_EMAIL") # A server maintainer that CCP can contact in case of issues.
ESI_USER_CONTACT_EMAIL = os.environ.get(
"ESI_USER_CONTACT_EMAIL"
) # A server maintainer that CCP can contact in case of issues.
# By default emails are validated before new users can log in.
# It's recommended to use a free service like SparkPost or Elastic Email to send email.
@@ -48,7 +53,6 @@ ROOT_URLCONF = "myauth.urls"
WSGI_APPLICATION = "myauth.wsgi.application"
STATIC_ROOT = "/var/www/myauth/static/"
BROKER_URL = f"redis://{os.environ.get('AA_REDIS', 'redis:6379')}/0"
CELERY_RESULT_BACKEND = f"redis://{os.environ.get('AA_REDIS', 'redis:6379')}/0"
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
@@ -66,11 +70,15 @@ INSTALLED_APPS += [
# 'allianceauth.permissions_tool',
# 'allianceauth.srp',
# 'allianceauth.timerboard',
# https://allianceauth.readthedocs.io/en/latest/features/services/index.html
# 'allianceauth.services.modules.discord',
# 'allianceauth.services.modules.discourse',
# 'allianceauth.services.modules.ips4',
# 'allianceauth.services.modules.openfire',
# 'allianceauth.services.modules.mumble',
# An example of running mumble with authenticator in docker can be found here
# https://github.com/Solar-Helix-Independent-Transport/allianceauth-docker-mumble
# 'allianceauth.services.modules.phpbb3',
# 'allianceauth.services.modules.smf',
# 'allianceauth.services.modules.teamspeak3',

View File

@@ -4,5 +4,3 @@ FROM $AA_DOCKER_TAG
RUN cd /home/allianceauth
COPY /conf/requirements.txt requirements.txt
RUN pip install -r requirements.txt
RUN python $AUTH_HOME/myauth/manage.py collectstatic --noinput
RUN allianceauth update myauth

View File

@@ -52,12 +52,19 @@ services:
- auth_mysql
grafana:
image: grafana/grafana-oss:8.3.2
image: grafana/grafana-oss:8.5.22
restart: always
depends_on:
- auth_mysql
volumes:
- ./grafana-datasource.yml:/etc/grafana/provisioning/datasources/datasource.yaml
- ./grafana-dashboards.yml:/etc/grafana/provisioning/dashboards/datasource.yaml
- ./grafana/dashboards:/var/lib/grafana/dashboards:ro
- grafana-data:/var/lib/grafana
environment:
GF_INSTALL_PLUGINS: grafana-piechart-panel,grafana-clock-panel,grafana-simple-json-datasource
GF_AUTH_DATABASE_PASSWORD: ${GRAFANA_DB_PASSWORD}
proxy:
image: 'jc21/nginx-proxy-manager:latest'
restart: always

View File

@@ -0,0 +1,25 @@
apiVersion: 1
providers:
# <string> an unique provider name
- name: 'auth dashboards'
# <int> org id. will default to orgId 1 if not specified
orgId: 1
# <string, required> name of the dashboard folder. Required
folder: ''
# <string> folder UID. will be automatically generated if not specified
folderUid: ''
# <string, required> provider type. Required
type: file
# <bool> disable dashboard deletion
disableDeletion: false
# <bool> enable dashboard editing
editable: true
# <int> how often Grafana will scan for changed dashboards
updateIntervalSeconds: 10
# <bool> allow updating provisioned dashboards from the UI
allowUiUpdates: false
options:
# <string, required> path to dashboard files on disk. Required
path: /var/lib/grafana/dashboards
foldersFromFilesStructure: true

View File

@@ -0,0 +1,12 @@
apiVersion: 1
datasources:
- name: MySQL
type: mysql
url: auth_mysql
database: alliance_auth
user: grafana
editable: true
secureJsonData:
password: ${GF_AUTH_DATABASE_PASSWORD}

View File

@@ -46,6 +46,7 @@ extensions = [
'recommonmark',
'sphinxcontrib_django2',
'sphinx.ext.viewcode',
'sphinx_copybutton'
]
# Add any paths that contain templates here, relative to this directory.

View File

@@ -71,3 +71,51 @@ urlpatterns = [
re_path(r'', include(allianceauth.urls)),
]
```
## Example: Adding an external link to the sidebar
As an example we are adding an external links to the Alliance Auth sidebar using the template overrides feature. For our example let's add a link to Google's start page.
### Step 1 - Create the template override folder
First you need to create the folder for the template on your server. For AA to pick it up it has to match a specific structure.
If you have a default installation you can create the folder like this:
```sh
mkdir -p /home/allianceserver/myauth/myauth/templates/allianceauth
```
### Step 2 - Download the original template
Next you need to download a copy of the original template file we want to change. For that let's move into the above folder and then download the file into the current folder with:
```sh
cd /home/allianceserver/myauth/myauth/templates/allianceauth
wget <https://gitlab.com/allianceauth/allianceauth/-/raw/master/allianceauth/templates/allianceauth/side-menu.html>
```
### Step 3 - Modify the template
Now you can modify the template to add your custom link. To create the google link we can add this snippet *between* the `{% menu_items %}` and the `</ul>` tag:
```sh
nano /home/allianceserver/myauth/myauth/templates/allianceauth/side-menu.html
```
```jinja
<li>
<a href="https://www.google.com/" target="_blank">
<i class="fab fa-google fa-fw"></i>Google
</a>
</li>
```
```eval_rst
.. hint::
You can find other icons with a matching style on the `Font Awesome site <https://fontawesome.com/v5/search?m=free>`_ . AA currently uses Font Awesome version 5. You also want to keep the ``fa-fw`` tag to ensure all icons have the same width.
```
### Step 4 - Restart your AA services
Finally, restart your AA services and your custom link should appear in the sidebar.

View File

@@ -16,14 +16,14 @@ In addition all tools described in this guide are open source or free software.
The development environment consists of the following components:
- Visual Studio Code with Remote WSL and Python extension
- WSL with Ubuntu 18.04. LTS
- Python 3.7 environment on WSL
- WSL with Ubuntu (18.04. LTS or higher)
- Python environment on WSL (3.8 or higher)
- MySQL server on WSL
- Redis on WSL
- Alliance Auth on WSL
- Celery on WSL
We will use the build-in Django development webserver, so we don't need to setup a WSGI server or a web server.
We will use the build-in Django development web server, so we don't need to setup a WSGI server or a web server.
```eval_rst
.. note::
@@ -34,13 +34,13 @@ We will use the build-in Django development webserver, so we don't need to setup
The only requirement is a PC with Windows 10 and Internet connection in order to download the additional software components.
## Windows installation
## Installing Windows apps
### Windows Subsystem for Linux
- Install from here: [Microsoft docs](https://docs.microsoft.com/en-us/windows/wsl/install-win10)
- Choose Ubuntu 18.04. LTS
- Choose Ubuntu 18.04. LTS or higher
### Visual Studio Code
@@ -54,7 +54,7 @@ The only requirement is a PC with Windows 10 and Internet connection in order to
- Once connected to WSL install the Python extension on the WSL side
## WSL Installation
## Setting up WSL / Linux
Open a WSL bash and update all software packets:
@@ -71,7 +71,7 @@ sudo apt-get install gettext
### Install Python
For AA we want to develop with Python 3.7, because that provides the maximum compatibility with today's AA installations.
Next we need to install Python and related development tools.
```eval_rst
.. hint::
@@ -80,8 +80,12 @@ For AA we want to develop with Python 3.7, because that provides the maximum com
```eval_rst
.. note::
Should your Ubuntu come with a newer version of Python we recommend to still setup your dev environment with the oldest Python 3 version supported by AA, e.g Python 3.7
Should your Ubuntu come with a newer version of Python we recommend to still setup your dev environment with the oldest Python 3 version currently supported by AA (e.g Python 3.8 at this time of writing) to ensure your apps are compatible with all current AA installations
You an check out this `page <https://askubuntu.com/questions/682869/how-do-i-install-a-different-python-version-using-apt-get/1195153>`_ on how to install additional Python versions on Ubuntu.
If you install a different python version from the default you need to adjust some of the commands below to install appopriate versions of those packages for example using Python 3.8 you might need to run the following after using the setup steps for the repository mentioned in the AskUbuntu post above:
`sudo apt-get install python3.8 python3.8-dev python3.8-venv python3-setuptools python3-pip python-pip`
```
Use the following command to install Python 3 with all required libraries with the default version:
@@ -90,7 +94,19 @@ Use the following command to install Python 3 with all required libraries with t
sudo apt-get install python3 python3-dev python3-venv python3-setuptools python3-pip python-pip
```
### Installing the DBMS
### Install redis and other tools
```bash
sudo apt-get install unzip git redis-server curl libssl-dev libbz2-dev libffi-dev pkg-config
```
Start redis
```bash
sudo redis-server --daemonize yes
```
## Installing the DBMS
Install MySQL and required libraries with the following command:
@@ -122,35 +138,22 @@ sudo mysql -u root
```
```sql
CREATE USER 'aa_dev'@'localhost' IDENTIFIED BY 'PASSWORD';
CREATE DATABASE aa_dev CHARACTER SET utf8mb4;
GRANT ALL PRIVILEGES ON aa_dev . * TO 'aa_dev'@'localhost';
CREATE DATABASE test_aa_dev CHARACTER SET utf8mb4;
GRANT ALL PRIVILEGES ON test_aa_dev . * TO 'aa_dev'@'localhost';
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'YOUR-PASSWORD';
GRANT ALL PRIVILEGES ON * . * TO 'admin'@'localhost';
FLUSH PRIVILEGES;
exit;
```
Add timezone info to mysql
Add timezone info to mysql:
```bash
sudo mysql_tzinfo_to_sql /usr/share/zoneinfo | sudo mysql -u root mysql
```
### Install redis and other tools
```bash
sudo apt-get install unzip git redis-server curl libssl-dev libbz2-dev libffi-dev
```
Start redis
```bash
sudo redis-server --daemonize yes
```
```eval_rst
.. note::
WSL does not have an init.d service, so it will not automatically start your services such as MySQL and Redis when you boot your Windows machine. For convenience we recommend putting the commands for starting these services in a bash script. Here is an example:
If your WSL does not have an init.d service, it will not automatically start your services such as MySQL and Redis when you boot your Windows machine and you have to manually start them. For convenience we recommend putting these commands in a bash script. Here is an example:
::
@@ -159,7 +162,6 @@ sudo redis-server --daemonize yes
sudo service mysql start
sudo redis-server --daemonize yes
In addition it is possible to configure Windows to automatically start WSL services, but that procedure goes beyond the scopes of this guide.
```
### Setup dev folder on WSL
@@ -179,9 +181,14 @@ A good location for setting up this folder structure is your home folder or a su
Following this approach you can also setup additional AA projects, e.g. aa-dev-2, aa-dev-3 if needed.
Create the root folder aa-dev.
Create the root folder `aa-dev`.
### setup virtual Python environment for aa-dev
```eval_rst
.. hint::
The folders `venv` and `myauth` will be created automatically in later steps. Please do not create them manually as this would lead to errors.
```
### Setup virtual Python environment for aa-dev
Create the virtual environment. Run this in your aa-dev folder:
@@ -195,16 +202,15 @@ And activate your venv:
source venv/bin/activate
```
### install Python packages
### Install and update basic Python packages
```bash
pip install --upgrade pip
pip install wheel
pip install -U pip setuptools wheel
```
## Alliance Auth installation
## Installing Alliance Auth
## Install and create AA instance
### Install and create AA instance
```bash
pip install allianceauth
@@ -226,44 +232,55 @@ First you want to make sure exclude the venv folder from VSC as follows:
Open settings and go to Files:Exclude
Add pattern: `**/venv`
### Update settings
### Create EVE Online SSO App
Open the settings file with VSC. Its under `myauth/myauth/settings/local.py`
For the Eve Online related setup you need to create a SSO app on the developer site:
Make sure to have the settings of your Eve Online app ready.
- Create your Eve Online SSO App on the [Eve Online developer site](https://developers.eveonline.com/)
- Add all ESI scopes
- Set callback URL to: `http://127.0.0.1:8000/sso/callback`
Turn on DEBUG mode to ensure your static files get served by Django:
### Update Django settings
Open your local Django settings with VSC. The file is under `myauth/myauth/settings/local.py`
```eval_rst
.. hint::
There are two Django settings files: ``base.py`` and ``local.py``. The base settings file is controlled by the AA project and may change at any time. It is therefore recommended to only change the local settings file.
```
```python
DEBUG = True
```
Define URL and name of your site:
```python
SITE_URL = "http://127.0.0.1:8000"
...
SITE_NAME = "AA Dev"
```
Update name, user and password of your DATABASE configuration.
```python
DATABASES['default'] = {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'aa_dev',
'USER': 'aa_dev',
'PASSWORD': 'PASSWORD',
'USER': 'admin',
'PASSWORD': 'YOUR-PASSWORD',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'},
"TEST": {"CHARSET": "utf8mb4"},
}
```
For the Eve Online related setup you need to create a SSO app on the developer site:
- Create your Eve Online SSO App on the [Eve Online developer site](https://developers.eveonline.com/)
- Add all ESI scopes
- Set callback URL to: `http://localhost:8000/sso/callback`
Then update local.py with your settings:
Add the credentials for your Eve Online SSO app as defined above:
```python
ESI_SSO_CLIENT_ID = 'YOUR-ID'
ESI_SSO_CLIENT_SECRET = 'YOUR_SECRET'
ESI_SSO_CALLBACK_URL = 'http://localhost:8000/sso/callback'
```
Disable email registration:
@@ -340,17 +357,19 @@ In VSC click on Debug / Add Configuration and choose "Django". Should Django not
The result should look something like this:
```python
```json
{
"name": "Python: Django",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/myauth/manage.py",
"cwd": "${workspaceFolder}/myauth",
"args": [
"runserver",
"--noreload"
],
"django": true
"django": true,
"justMyCode": true,
}
```
@@ -360,7 +379,7 @@ For celery we need another debug config, so that we can run it in parallel to ou
Here is an example debug config for Celery:
```javascript
```json
{
"name": "Python: Celery",
"type": "python",
@@ -386,16 +405,16 @@ Here is an example debug config for Celery:
Finally it makes sense to have a dedicated debug config for running unit tests. Here is an example config for running all tests of the app `example`.
```javascript
```json
{
"name": "Python: myauth unit tests",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/myauth/manage.py",
"cwd": "${workspaceFolder}/myauth",
"args": [
"test",
"--keepdb",
"--debug-mode",
"--failfast",
"example",
],
@@ -410,7 +429,7 @@ You can also specify to run just a part of your test suite down to a test method
Finally you may also want to have a debug config to debug a non-Django Python script:
```javascript
```json
{
"name": "Python: Current File",
"type": "python",
@@ -424,37 +443,31 @@ Finally you may also want to have a debug config to debug a non-Django Python sc
The following additional tools are very helpful when developing for AA with VS Code:
### Pylance
### VS Code extensions
Pylance is an extension that works alongside Python in Visual Studio Code to provide performant language support: [Pylance](https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance)
### Code Spell Checker
Typos in your user facing comments can be quite embarrassing. This spell checker helps you avoid them: [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
### markdownlint
Extension for Visual Studio Code - Markdown linting and style checking for Visual Studio Code: [markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint)
### GitLens
Extension for Visual Studio Code - Supercharge the Git capabilities built into Visual Studio Code: [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
### RST preview
A VS Code extension to preview restructured text and provide syntax highlighting: [RST Preview](https://marketplace.visualstudio.com/items?itemName=tht13.rst-vscode)
### Django Template
#### Django Template
This extension adds language colorization support and user snippets for the Django template language to VS Code: [Django Template](https://marketplace.visualstudio.com/items?itemName=bibhasdn.django-html)
### DBeaver
#### Code Spell Checker
DBeaver is a free universal database tool and works with many different kinds of databases include MySQL. It can be installed on Windows 10 and will be able to help manage your MySQL databases running on WSL.
Typos in your user facing comments can be quite embarrassing. This spell checker helps you avoid them: [Code Spell Checker](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
Install from here. [DBeaver](https://dbeaver.io/)
#### Git History
### django-extensions
Very helpful to visualize the change history and compare different branches. [Git History](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory)
#### markdownlint
Extension for Visual Studio Code - Markdown linting and style checking for Visual Studio Code: [markdownlint](https://marketplace.visualstudio.com/items?itemName=DavidAnson.vscode-markdownlint)
#### Live Server
Live Server allows you to start a mini webserver for any file quickly. This can e.g. be useful for looking at changes to to Sphinx docs.: [Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer)
### Django apps
#### Django Extensions
[django-extensions](https://django-extensions.readthedocs.io/en/latest/) is a swiss army knife for django developers with adds a lot of very useful features to your Django site. Here are a few highlights:
@@ -462,6 +475,20 @@ Install from here. [DBeaver](https://dbeaver.io/)
- graph_models - Creates a dependency graph of Django models. Visualizing a model dependency structure can be very useful for trying to understand how an existing Django app works, or e.g. how all the AA models work together.
- runserver_plus - The standard runserver stuff but with the Werkzeug debugger baked in. This is a must have for any serious debugging.
#### Django Debug Toolbar
The [Django Debug Toolbar](https://github.com/jazzband/django-debug-toolbar) is a configurable set of panels that display various debug information about the current request/response and when clicked, display more details about the panel's content.
E.g. this tool is invaluable to debug and fix performance issues with Django queries.
### Windows applications
#### DBeaver
DBeaver is a free universal database tool and works with many different kinds of databases include MySQL. It can be installed on Windows 10 and will be able to help manage your MySQL databases running on WSL.
Install from here. [DBeaver](https://dbeaver.io/)
## Adding apps for development
The idea behind the particular folder structure of aa-dev is to have each and every app in its own folder and git repo. To integrate them with the AA instance they need to be installed once using the -e option that enabled editing of the package. And then added to the INSTALLED_APPS settings.

View File

@@ -65,9 +65,9 @@ On the application summary page, press Create a Bot User.
Update your auth project's settings file with these pieces of information from the summary page:
- From the App Details panel, `DISCORD_APP_ID` is the Client/Application ID
- From the App Details panel, `DISCORD_APP_SECRET` is the Secret
- From the App Bot Users panel, `DISCORD_BOT_TOKEN` is the Token
- From the General Information panel, `DISCORD_APP_ID` is the Client/Application ID
- From the OAuth2 > General panel, `DISCORD_APP_SECRET` is the Client Secret
- From the Bot panel, `DISCORD_BOT_TOKEN` is the Token
### Preparing Auth

View File

@@ -26,9 +26,10 @@ To install on your favorite flavour of Linux, identify and install equivalent pa
### OS Maintenance
It is reccommended to ensure your OS is fully up to date before proceeding. We may also add Package Repositories here, used later in the documentation.
It is recommended to ensure your OS is fully up to date before proceeding. We may also add Package Repositories here, used later in the documentation.
Ubuntu 1804, 2004, 2204:
```bash
sudo apt-get update
```
@@ -41,7 +42,7 @@ sudo apt-get upgrade
sudo do-dist-upgrade
```
CentOS 7
CentOS 7:
```bash
yum install epel-release
@@ -51,7 +52,7 @@ yum install epel-release
sudo yum upgrade
```
CentOS Stream 8
CentOS Stream 8:
```bash
sudo dnf config-manager --set-enabled powertools
@@ -65,7 +66,7 @@ sudo dnf install epel-release epel-next-release
sudo yum upgrade
```
CentOS Stream 9
CentOS Stream 9:
```bash
sudo dnf config-manager --set-enabled crb
@@ -78,15 +79,12 @@ dnf install epel-release epel-next-release
```bash
sudo yum upgrade
```
### Python
Alliance Auth requires Python 3.8 or higher. Ensure it is installed on your server before proceeding.
Install Python 3.10 and related tools on your system.
Ubuntu 1804, 2004:
```eval_rst
.. note::
Ubuntu 2204 ships with Python 3.10 already
```
```bash
sudo add-apt-repository ppa:deadsnakes/ppa
@@ -100,13 +98,25 @@ sudo apt-get update
sudo apt-get install python3.10 python3.10-dev python3.10-venv
```
Ubuntu 2204:
```eval_rst
.. note::
Ubuntu 2204 ships with Python 3.10 already, but some important tools are missing in the default installation.
```
```bash
sudo apt-get install python3.10-dev python3.10-venv
```
CentOS 7:
We need to build Python from source
Centos Stream 8/9:
```eval_rst
.. note::
A Python 3.9 Package is available for Stream 8 and 9. You _may_ use this instead of building your own package. But our documentation will assume Python3.10 and you may need to substitute as neccessary
A Python 3.9 Package is available for Stream 8 and 9. You _may_ use this instead of building your own package. But our documentation will assume Python3.10 and you may need to substitute as necessary
sudo dnf install python39 python39-devel
```
@@ -137,29 +147,34 @@ cd Python-3.10.5/
```bash
sudo make altinstall
```
### Database
It's recommended to use a database service instead of SQLite. Many options are available, but this guide will use MariaDB.
```eval_rst
.. note::
Many Ubuntu distributions come with an older version of Maria DB, which is not compatible with **Alliance Auth**. You need Maria DB 10.3 or higher!
Ubuntu distributions prior to 20.04 come with an older version of Maria DB, which is not compatible with **Alliance Auth**. You need Maria DB 10.3 or higher!
For 20.04 we still recommend to install Maria DB from the link below in order to get the newest stable version.
For 22.04 we recommend installing from the default Ubuntu distro, since it comes with the newest stable version.
```
Ubuntu 1804, 2004, 2204:
Ubuntu 1804, 2004:
```eval_rst
.. warning::
Please follow these steps to update MariaDB
https://mariadb.org/download/?t=repo-config&d=20.04+%22focal%22&v=10.6&r_m=osuosl
```
Ubuntu 1804, 2004, 2204
```bash
apt-get install mariadb-server mariadb-client libmysqlclient-dev
sudo apt-get install mariadb-server mariadb-client libmysqlclient-dev
```
CentOS 7
CentOS 7:
```eval_rst
.. warning::
Please follow these steps to update MariaDB
@@ -170,11 +185,11 @@ CentOS 7
sudo yum install MariaDB-server MariaDB-client MariaDB-devel MariaDB-shared
```
CentOS Stream 8/9
CentOS Stream 8/9:
```eval_rst
.. note::
We reccomend using the built in AppStream, as they are maintained by CentOS. Currently an AppStream is not available for 10.6
We recommend using the built in AppStream, as they are maintained by CentOS. Currently an AppStream is not available for 10.6
```
```bash
@@ -188,6 +203,7 @@ sudo dnf install mariadb mariadb-server mariadb-devel
```bash
sudo systemctl enable mariadb
```
```bash
sudo systemctl start mariadb
```
@@ -202,13 +218,15 @@ sudo systemctl start mariadb
A few extra utilities are also required for installation of packages.
Ubuntu 1804, 2004, 2204:
```bash
sudo apt-get install unzip git redis-server curl libssl-dev libbz2-dev libffi-dev build-essential
sudo apt-get install unzip git redis-server curl libssl-dev libbz2-dev libffi-dev build-essential pkg-config
```
CentOS 7:
```bash
sudo yum install gcc gcc-c++ unzip git redis curl bzip2-devel openssl-devel libffi-devel wget
sudo yum install gcc gcc-c++ unzip git redis curl bzip2-devel openssl-devel libffi-devel wget pkg-config
```
```bash
@@ -220,6 +238,7 @@ sudo systemctl start redis.service
```
CentOS Stream 8, Stream 9:
```bash
sudo dnf install gcc gcc-c++ unzip git redis curl bzip2-devel openssl-devel libffi-devel wget
```
@@ -231,6 +250,7 @@ sudo systemctl enable redis.service
```bash
sudo systemctl start redis.service
```
## Database Setup
Alliance Auth needs a MySQL user account and database. Open an SQL shell with
@@ -277,11 +297,13 @@ mysql_secure_installation
For security and permissions, its highly recommended you create a separate user to install auth under. Do not log in as this account.
Ubuntu 1804, 2004, 2204:
```bash
adduser --disabled-login allianceserver
sudo adduser --disabled-login allianceserver
```
CentOS 7, Stream 8, Stream 9:
```bash
sudo useradd -s /bin/bash allianceserver
```
@@ -289,6 +311,7 @@ sudo useradd -s /bin/bash allianceserver
```bash
sudo passwd -l allianceserver
```
### Prepare Directories
```bash
@@ -308,6 +331,23 @@ sudo chown -R allianceserver:allianceserver /var/www/myauth/static/
### Virtual Environment
Switch to the allianceserver user.
```bash
sudo su allianceserver
```
And switch to it's home directory:
```bash
cd
```
```eval_rst
.. note::
In general using the allianceserver user will greatly simplify permission management, when installing and performing maintenance on Alliance Auth.
```
Create a Python virtual environment and put it somewhere convenient (e.g. `/home/allianceserver/venv/auth/`)
```eval_rst
@@ -346,16 +386,17 @@ As **callback URL** you want to define the URL of your Alliance Auth site plus t
### Alliance Auth Project
Update Pip before installing python packages:
```bash
pip install -U pip setuptools
```eval_rst
.. warning::
Before installing any Python packages please double-check that you have activated in the virtual environment. This is usually indicated by your command line in the terminal starting with: `(auth)`.
```
Ensure wheel is available before continuing:
#### Install Python packages
Update & install basic tools before installing further Python packages:
```bash
pip install wheel
pip install -U pip setuptools wheel
```
You can install **Alliance Auth** with the following command. This will install AA and all its Python dependencies.
@@ -370,7 +411,9 @@ You should also install Gunicorn now unless you want to use another WSGI server
pip install gunicorn
```
Now you need to create the application that will run the **Alliance Auth** install. Ensure you are in the allianceserver home directory by issuing:
#### Create Alliance Auth project
Now you need to create the Django project that will run **Alliance Auth**. Ensure you are in the allianceserver home directory by issuing:
```bash
cd /home/allianceserver
@@ -382,16 +425,25 @@ The following command bootstraps a Django project which will run your **Alliance
allianceauth start myauth
```
The settings file needs configuring, edit the template at `myauth/myauth/settings/local.py`.
#### Update settings
Your settings file needs configuring:
```bash
nano myauth/myauth/settings/local.py
```
**Be sure to configure:**
* Your site URL as `SITE_URL`
* The Database account setup earlier in **Database Setup**
* `ESI_SSO_CLIENT_ID`, `ESI_SSO_CLIENT_SECRET` from the EVE Online Developers Portal earlier in **Eve Online Settings**
* `ESI_USER_CONTACT_EMAIL` to an email address to ensure that CCP has reliable contact information for you
* Valid Email server settings.
Django needs to install models to the database before it can start.
- Your site URL as `SITE_URL`
- The database user account setup from earlier in [Database Setup](#database-setup)
- `ESI_SSO_CLIENT_ID`, `ESI_SSO_CLIENT_SECRET` from the EVE Online Developers Portal from earlier in [Eve Online SSO](#eve-online-sso)
- `ESI_USER_CONTACT_EMAIL` to an email address to ensure that CCP has reliable contact information for you
- Valid email server settings
#### Install database & static files
Django needs to setup the database before it can start.
```bash
python /home/allianceserver/myauth/manage.py migrate
@@ -400,7 +452,7 @@ python /home/allianceserver/myauth/manage.py migrate
Now we need to round up all the static files required to render templates. Make a directory to serve them from and populate it.
```bash
python /home/allianceserver/myauth/manage.py collectstatic
python /home/allianceserver/myauth/manage.py collectstatic --noinput
```
Check to ensure your settings are valid.
@@ -409,7 +461,6 @@ Check to ensure your settings are valid.
python /home/allianceserver/myauth/manage.py check
```
```eval_rst
.. hint::
If you are using root, ensure the allianceserver user has read/write permissions to this directory before proceeding::
@@ -417,17 +468,7 @@ python /home/allianceserver/myauth/manage.py check
chown -R allianceserver:allianceserver /home/allianceserver/myauth
```
## Services
Alliance Auth needs some additional services to run, which we will set up and configure next.
### Gunicorn
To run the **Alliance Auth** website a [WSGI Server](https://www.fullstackpython.com/wsgi-servers.html) is required. For this [Gunicorn](http://gunicorn.org/) is highly recommended for its ease of configuring. It can be manually run from within your `myauth` base directory with `gunicorn --bind 0.0.0.0 myauth.wsgi` or automatically run using Supervisor.
The default configuration is good enough for most installations. Additional information is available in the [gunicorn](gunicorn.md) doc.
## Superuser
#### Setup superuser
Before using your auth site, it is essential to create a superuser account. This account will have all permissions in Alliance Auth. It's OK to use this as your personal auth account.
@@ -439,6 +480,16 @@ Once your install is complete, the superuser account is accessed by logging in v
If you intend to use this account as your personal auth account you need to add a main character. Navigate to the normal user dashboard (at `https://example.com`) after logging in via the admin site and select `Change Main`. Once a main character has been added, it is possible to use SSO to login to this account.
## Services
Alliance Auth needs some additional services to run, which we will set up and configure next.
### Gunicorn
To run the **Alliance Auth** website a [WSGI Server](https://www.fullstackpython.com/wsgi-servers.html) is required. For this [Gunicorn](http://gunicorn.org/) is highly recommended for its ease of configuring. It can be manually run from within your `myauth` base directory with `gunicorn --bind 0.0.0.0 myauth.wsgi` or automatically run using Supervisor.
The default configuration is good enough for most installations. Additional information is available in the [gunicorn](gunicorn.md) doc.
### Supervisor
[Supervisor](http://supervisord.org/) is a process watchdog service: it makes sure other processes are started automatically and kept running. It can be used to automatically start the WSGI server and Celery workers for background tasks.
@@ -461,9 +512,11 @@ CentOS 7:
```bash
sudo dnf install supervisor
```
```bash
sudo systemctl enable supervisord.service
```
```bash
sudo systemctl start supervisord.service
```
@@ -473,9 +526,11 @@ CentOS Stream 8, Stream 9:
```bash
sudo dnf install supervisor
```
```bash
sudo systemctl enable supervisord.service
```
```bash
sudo systemctl start supervisord.service
```
@@ -491,21 +546,21 @@ ln -s /home/allianceserver/myauth/supervisor.conf /etc/supervisor/conf.d/myauth.
CentOS:
```bash
ln -s /home/allianceserver/myauth/supervisor.conf /etc/supervisord.d/myauth.ini
sudo ln -s /home/allianceserver/myauth/supervisor.conf /etc/supervisord.d/myauth.ini
```
Activate it with `supervisorctl reload`.
Activate it with `sudo supervisorctl reload`.
You can check the status of the processes with `supervisorctl status`. Logs from these processes are available in `/home/allianceserver/myauth/log` named by process.
You can check the status of the processes with `sudo supervisorctl status`. Logs from these processes are available in `/home/allianceserver/myauth/log` named by process.
```eval_rst
.. note::
Any time the code or your settings change you'll need to restart Gunicorn and Celery. ::
supervisorctl restart myauth:
sudo supervisorctl restart myauth:
```
## Webserver
## Web server
Once installed, decide on whether you're going to use [NGINX](nginx.md) or [Apache](apache.md) and follow the respective guide.
@@ -530,7 +585,7 @@ source /home/allianceserver/venv/auth/bin/activate
and update with:
```bash
pip install --upgrade allianceauth
pip install -U allianceauth
```
Some releases come with changes to the base settings. Update your project's settings with:
@@ -548,7 +603,7 @@ python /home/allianceserver/myauth/manage.py migrate
Finally, some releases come with new or changed static files. Run the following command to update your static files folder:
```bash
python /home/allianceserver/myauth/manage.py collectstatic
python /home/allianceserver/myauth/manage.py collectstatic --noinput
```
Always restart AA, Celery and Gunicorn after updating:

View File

@@ -79,6 +79,8 @@ Copy this basic config into your config file. Make whatever changes you feel are
```
server {
listen 80;
listen [::]:80;
server_name example.com;
location = /favicon.ico { access_log off; log_not_found off; }
@@ -110,6 +112,7 @@ Your config will need a few additions once you've got your certificate.
```
listen 443 ssl http2; # Replace listen 80; with this
listen [::]:443 ssl http2; # Replace listen [::]:80; with this
ssl_certificate /path/to/your/cert.crt;
ssl_certificate_key /path/to/your/cert.key;
@@ -126,6 +129,8 @@ If you want to redirect all your non-SSL visitors to your secure site, below you
```
server {
listen 80;
listen [::]:80;
server_name example.com;
# Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.

View File

@@ -13,9 +13,15 @@ The migration itself is rather straightforward. The main idea is to change owner
First, log in as your sudo user and run the following commands in order:
```shell
# Set the right owner
sudo chown -R allianceserver: /home/allianceserver
sudo chown -R allianceserver: /var/www/myauth
sudo chmod -r 655 /var/www/myauth
# Remove static files, they will be re-added later
sudo rm -rf /var/www/mayauth/static/*
# Fix directory permissions
sudo chmod -R 755 /var/www/myauth
```
That's it. Your AA installation is now configured to be maintained with the `allianceserver` user.
@@ -45,6 +51,13 @@ Finally, switch to the main AA folder, from where you can run most commands dire
cd myauth
```
Now it's time to re-add the static files with the right permissions. To do so simply
run:
```shell
python manage.py collectstatic
```
When you want to restart myauth, you need to switch back to your sudo user, because `allianceserver` does not have sudo privileges:
```shell

View File

@@ -1,15 +1,95 @@
# App Maintenance
## Adding and Removing Apps
## Adding Apps
Your auth project is just a regular Django project - you can add in [other Django apps](https://djangopackages.org/) as desired. Most come with dedicated setup guides, but here is the general procedure:
1. add `'appname',` to your `INSTALLED_APPS` setting in `local.py`
2. run `python manage.py migrate`
3. run `python manage.py collectstatic`
3. run `python manage.py collectstatic --noinput`
4. restart AA with `supervisorctl restart myauth:`
If you ever want to remove an app, you should first clear it from the database to avoid dangling foreign keys: `python manage.py migrate appname zero`. Then you can remove it from your auth project's `INSTALLED_APPS` list.
## Removing Apps
The following instructions will explain how you can remove an app properly fom your Alliance Auth installation.
```eval_rst
.. note::
We recommend following these instructions to avoid dangling foreign keys or orphaned Python packages on your system, which might cause conflicts with other apps down the road.
```
### Step 1 - Removing database tables
First, we want to remove the app related tables from the database.
#### Automatic table removal
Let's first try the automatic approach by running the following command:
```sh
python manage.py migrate appname zero
```
If that worked you'll get a confirmation message.
If that did not work and you got error messages, you will need to remove the tables manually. This is pretty common btw, because many apps use sophisticated table setups, which can not be removed automatically by Django.
#### Manual table removal
First, tell Django that these migrations are no longer in effect (note the additional `--fake`):
```sh
python manage.py migrate appname zero --fake
```
Then, open the mysql tool and connect to your Alliance Auth database:
```sh
sudo mysql -u root
use alliance_auth;
```
Next disable foreign key check. This makes it much easier to drop tables in any order.
```sh
SET FOREIGN_KEY_CHECKS=0;
```
Then get a list of all tables. All tables belonging to the app in question will start with `appname_`.
```sh
show tables;
```
Now, drop the tables from the app one by one like so:
```sh
drop table appname_model_1;
drop table appname_model_2;
...
```
And finally, but very importantly, re-enable foreign key checks again and then exit:
```sh
SET FOREIGN_KEY_CHECKS=1;
exit;
```
### Step 2 - Remove the app from Alliance Auth
Once the tables have been removed, you you can remove the app from Alliance Auth. This is done by removing the applabel from the `INSTALLED_APPS` list in your local settings file.
### Step 3 - Remove the Python package
Finally, we want to remove the app's Python package. For that run the following command:
```sh
pip uninstall app-package-name
```
Congrats, you have now removed this app from your Alliance Auth installation.
## Permission Cleanup

View File

@@ -13,4 +13,5 @@ The official installation guide will install a stable version of Alliance Auth t
gunicorn
celery
redis
```

View File

@@ -0,0 +1,22 @@
# Redis
## Compression
Cache compression can help tame the memory usage of specialised installation configurations and Community Apps that heavily utilize Redis.
Various compression algorithms are supported, with various strengths. Our testing has shown that lzma works best with our use cases. You can read more at [Django-Redis Compression Support](https://github.com/jazzband/django-redis#compression-support)
Add the following lines to `local.py`
```python
import lzma
CACHES = {
"default": {
# ...
"OPTIONS": {
"COMPRESSOR": "django_redis.compressors.lzma.LzmaCompressor",
}
}
}
```

View File

@@ -5,11 +5,12 @@ recommonmark==0.7.1
Jinja2<3.1
docutils==0.16
sphinxcontrib-django2
sphinx-copybutton
# Autodoc dependencies
celery>=5.2.0,<6.0.0
celery_once>=3.0.1
django>=4.0.5,<5.0.0
django>=4.0.6,<4.1.0
django-bootstrap-form
django-celery-beat>=2.3.0
django-esi>=4.0.1

View File

@@ -7,7 +7,7 @@ long_description_content_type = text/markdown
author = Alliance Auth
author_email = adarnof@gmail.com
license = GPL-2.0
license_file = LICENSE
license_files = LICENSE
classifiers =
Environment :: Web Environment
Framework :: Django
@@ -17,9 +17,11 @@ classifiers =
Operating System :: POSIX :: Linux
Programming Language :: Python
Programming Language :: Python :: 3
Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Topic :: Internet :: WWW/HTTP
Topic :: Internet :: WWW/HTTP :: Dynamic Content
home_page = https://gitlab.com/allianceauth/allianceauth
@@ -35,28 +37,28 @@ packages = find_namespace:
install_requires =
bcrypt
beautifulsoup4
celery>=5.2.0,<6.0.0
celery>=5.2.0,<6
celery-once>=3.0.1
django>=4.0.6,<4.1.0
django>=4.0.9,<4.1.0
django-bootstrap-form
django-celery-beat>=2.3.0
django-esi>=4.0.1
django-redis>=5.2.0,<6.0.0
django-registration>=3.3
django-redis>=5.2.0
django-registration>=3.3,<3.4
django-sortedm2m
dnspython
mysqlclient>=2.1.0
openfire-restapi
packaging>=21.0,<22
packaging>=21.0
passlib
pydiscourse
python-slugify>=1.2
redis>=4.0.0,<5.0.0
requests>=2.9.1,<3.0.0
redis>=4.0.0
requests>=2.9.1
requests-oauthlib
semantic-version
slixmpp
python_requires = ~=3.8
python_requires = >=3.8
include_package_data = True
zip_safe = False

View File

@@ -2,18 +2,18 @@
isolated_build = True
skipsdist = true
usedevelop = true
envlist = py{38,39,310,311}-{all,core}, docs
envlist = py{38,39,310,311,py}-{all,core}, docs
[testenv]
setenv =
all: DJANGO_SETTINGS_MODULE = tests.settings_all
core: DJANGO_SETTINGS_MODULE = tests.settings_core
basepython =
py37: python3.7
py38: python3.8
py39: python3.9
py310: python3.10
py311: python3.11
pypy: pypy3
deps=
coverage
install_command = pip install -e ".[test]" -U {opts} {packages}
@@ -26,7 +26,8 @@ commands =
[testenv:docs]
description = invoke sphinx-build to build the HTML docs
basepython = python3.9
skip_install = True
deps = -r{toxinidir}/docs/requirements.txt
install_command =
install_command = python -I -m pip install {opts} {packages}
commands =
sphinx-build -T -E -b html -d "{toxworkdir}/docs_doctree" -D language=en docs "{toxworkdir}/docs_out" {posargs}