Compare commits

..

50 Commits

Author SHA1 Message Date
Ariel Rin
8980d8d32f Version bump to 2.8.0 Stable 2020-10-13 05:33:54 +00:00
Ariel Rin
9d6cf9a62e Merge branch 'transifex' into 'master'
Add French and Japanese Translations + QoL Translation Fixes

See merge request allianceauth/allianceauth!1263
2020-10-13 04:17:37 +00:00
Ariel Rin
0fabb2b368 Add French and Japanese Translations + QoL Translation Fixes 2020-10-13 04:17:37 +00:00
Ariel Rin
9801ca0314 Merge branch 'emailoverrideredirect' into 'master'
Fix Redirect to dashboard if not verifying email

See merge request allianceauth/allianceauth!1268
2020-10-13 04:08:15 +00:00
Ariel Rin
fd86b26b39 Redirect to dashboard if not verifying email 2020-10-13 13:25:00 +10:00
Ariel Rin
b0dbef1587 Merge branch 'master' into 'master'
Expand mumble pwhash field to allow for passlib 1.7.3+

See merge request allianceauth/allianceauth!1267
2020-10-11 10:34:44 +00:00
Ariel Rin
a6e60bc23b expand mumble certhash to allow for hmac-sha-256 2020-10-11 20:11:56 +10:00
Ariel Rin
137e8a876d Merge branch 'add-corp-and-alliance-tags-to-srp' into 'master'
Add alliance and corp ticker to pilot name

See merge request allianceauth/allianceauth!1265
2020-10-11 03:42:56 +00:00
Ariel Rin
fe9538253f Merge branch 'highlight-active-menu-item' into 'master'
Highlight active menu item

See merge request allianceauth/allianceauth!1266
2020-10-11 03:41:17 +00:00
Peter Pfeufer
edda2c248e highlight active menu item 2020-10-02 20:12:21 +02:00
Peter Pfeufer
62275639e3 Added alliance and corp ticker to pilot name
Takes care of https://gitlab.com/allianceauth/allianceauth/-/issues/1228
2020-10-01 20:14:54 +02:00
Ariel Rin
d0c68b82f4 Merge branch 'docs' into 'master'
Docs Sphinx Upgrades

See merge request allianceauth/allianceauth!1264
2020-10-01 09:17:36 +00:00
Ariel Rin
78b5953bdf Merge branch 'master' of https://gitlab.com/allianceauth/allianceauth into docs 2020-10-01 18:59:14 +10:00
Ariel Rin
25e565b099 Docs Requirement upgrades 2020-10-01 18:54:04 +10:00
Ariel Rin
1fe0f78ad7 Exclude django-redis-cache 2.1.3 2020-10-01 01:59:48 +00:00
Ariel Rin
fc8b68156f Merge branch 'patch-4' into 'master'
Fixing FA icon

See merge request allianceauth/allianceauth!1262
2020-09-29 05:10:30 +00:00
Peter Pfeufer
b47cd197ce Fixing FA icon 2020-09-28 21:07:08 +00:00
Ariel Rin
3943426c4c Version Bump 2.8.0a2 2020-09-21 06:25:16 +00:00
Ariel Rin
08a9bd42a3 Merge branch 'django3' into 'master'
Django 3.1.1 bring up

See merge request allianceauth/allianceauth!1256
2020-09-21 06:16:44 +00:00
Ariel Rin
b2ff339efe Merge branch 'gitlabci2' into 'master'
Update Gitlab Deploy Python Version, Debian Distro to Stable

See merge request allianceauth/allianceauth!1260
2020-09-21 06:15:40 +00:00
Ariel Rin
c604131e04 Update Deploy Runner 2020-09-21 12:12:02 +10:00
Ariel Rin
f17607f126 Merge branch 'transifex' into 'master'
Update From Transifex

See merge request allianceauth/allianceauth!1258
2020-09-21 01:45:16 +00:00
Ariel Rin
94e455a57b Update From Transifex 2020-09-21 01:45:16 +00:00
Ariel Rin
3c9149db4a Merge branch 'improve_authtuilts_add_permission' into 'master'
Improve auth utils for permissions

See merge request allianceauth/allianceauth!1255
2020-09-21 01:09:03 +00:00
Ariel Rin
96cc615c07 Merge branch 'docs_mumbleavatars' into 'master'
Docs: Mumble Avatars Feature

See merge request allianceauth/allianceauth!1250
2020-09-21 00:01:35 +00:00
Ariel Rin
cd1f4a1c2b Docs: Mumble Avatars Feature 2020-09-21 00:01:35 +00:00
Ariel Rin
e0f99a42db Merge branch 'exiom-srp-update' into 'master'
SRP Module - Added Datatables & Sorting, Standardized Date/Time for Overall AA Consistency

See merge request allianceauth/allianceauth!1254
2020-09-20 23:55:22 +00:00
Exiom
3506e417d4 SRP Module - Added Datatables & Sorting, Standardized Date/Time for Overall AA Consistency 2020-09-20 23:55:22 +00:00
AaronKable
36197e2212 swap to reverse_lazy 2020-09-18 23:32:36 +08:00
AaronKable
fc5f42d01e remove whitespace in setup.py 2020-09-18 22:16:49 +08:00
AaronKable
e26d3767e0 update models as NullBooleanField is deprecated. 2020-09-18 22:16:24 +08:00
AaronKable
046b37c76a update auth and group model admins for django 3.1 2020-09-18 22:04:59 +08:00
AaronKable
925ff3e116 remove django req's from tox, they are managed in setup.py 2020-09-18 22:04:05 +08:00
AaronKable
e5ede4f7b6 Cant Reference what is already deleted 2020-09-18 22:03:16 +08:00
AaronKable
ded9301527 initial django3 bringup 2020-09-18 11:45:37 +08:00
ErikKalkoken
bd1ed6ff73 Add user as return value to add permission methods 2020-09-15 12:35:58 +02:00
Ariel Rin
feb65980d4 Merge branch 'fix_group_count_badge' into 'master'
Fix group count badge showing at zero

Closes #1258

See merge request allianceauth/allianceauth!1253
2020-09-12 02:05:22 +00:00
Ariel Rin
e81d75a782 Merge branch 'docs_settings_fix' into 'master'
Remove erroneous indents from settings in service module docs

See merge request allianceauth/allianceauth!1252
2020-09-12 02:04:37 +00:00
ErikKalkoken
ff305d13ae Fix group count badge showing at zero 2020-09-11 23:54:56 +02:00
colcrunch
8bcbc1a779 Remove erroneous indents from settings in service module docs. (Checked other docs, and there do not appear to be any more errors of this type) 2020-09-11 12:51:17 -04:00
Ariel Rin
3874aa6fee Version Bump 2.8.0a1 2020-09-11 11:52:20 +00:00
Ariel Rin
103e9f3a11 Merge branch 'discourse_beta' into 'master'
Discourse API with external package

See merge request allianceauth/allianceauth!1251
2020-09-11 11:33:19 +00:00
Ariel Rin
d02c25f421 Merge branch 'feature_menu_item_badges' into 'master'
Add menu item badge feature and update group icons

See merge request allianceauth/allianceauth!1240
2020-09-11 11:33:14 +00:00
Erik Kalkoken
228af38a4a Add menu item badge feature and update group icons 2020-09-11 11:33:14 +00:00
AaronKable
051a48885c discourse API with external package 2020-09-11 17:19:54 +08:00
Ariel Rin
6bcdc6052f Merge branch 'local-delivery' into 'master'
JS/CSS/Font Refactoring for use with AA-GDPR Package

Closes #1217

See merge request allianceauth/allianceauth!1247
2020-09-11 04:13:01 +00:00
Ariel Rin
af3527e64f Revert "load bootswatch less locally #1217"
This reverts commit 3a9a7267ea8734ba0a5cf1d0fea632eb2276d45c.
2020-09-11 04:13:01 +00:00
Ariel Rin
17ef3dd07a Merge branch 'srp_fix' into 'master'
Use request.scheme to get the http/https for the site

See merge request allianceauth/allianceauth!1249
2020-09-11 03:05:06 +00:00
AaronKable
1f165ecd2a use request.scheme to get the http/https for the site 2020-09-07 19:10:58 +08:00
Ariel Rin
70d1d450a9 Add Korean and Russian as features 2020-09-03 12:24:23 +00:00
126 changed files with 5552 additions and 1007 deletions

View File

@@ -41,7 +41,7 @@ test-3.8-all:
deploy_production: deploy_production:
stage: deploy stage: deploy
image: python:3.6-stretch image: python:3.8-buster
before_script: before_script:
- pip install twine - pip install twine

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) - 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)
- Chinese :cn:, English :us:, German :de: and Spanish :es: localization - English :flag_gb:, Chinese :flag_cn:, German :flag_de:, Spanish :flag_es:, Korean :flag_kr: and Russian :flag_ru: 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). 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).

View File

@@ -1,7 +1,7 @@
# This will make sure the app is always imported when # This will make sure the app is always imported when
# Django starts so that shared_task will use this app. # Django starts so that shared_task will use this app.
__version__ = '2.7.5' __version__ = '2.8.0'
__title__ = 'Alliance Auth' __title__ = 'Alliance Auth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth' __url__ = 'https://gitlab.com/allianceauth/allianceauth'
NAME = '%s v%s' % (__title__, __version__) NAME = '%s v%s' % (__title__, __version__)

View File

@@ -100,7 +100,7 @@ class UserProfileInline(admin.StackedInline):
formset.get_form_kwargs = get_kwargs formset.get_form_kwargs = get_kwargs
return formset return formset
def has_add_permission(self, request): def has_add_permission(self, request, obj=None):
return False return False
def has_delete_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None):
@@ -549,7 +549,7 @@ class PermissionAdmin(admin.ModelAdmin):
def admin_name(obj): def admin_name(obj):
return str(obj) return str(obj)
def has_add_permission(self, request): def has_add_permission(self, request, obj=None):
return False return False
def has_delete_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None):

View File

@@ -1,6 +1,8 @@
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth.authentication.models import User
class RegistrationForm(forms.Form): class RegistrationForm(forms.Form):
email = forms.EmailField(label=_('Email'), max_length=254, required=True) email = forms.EmailField(label=_('Email'), max_length=254, required=True)
class _meta:
model = User

View File

@@ -10,5 +10,5 @@ urlpatterns = [
url(r'^register/$', views.RegistrationView.as_view(), name='registration_register'), url(r'^register/$', views.RegistrationView.as_view(), name='registration_register'),
url(r'^register/complete/$', views.registration_complete, name='registration_complete'), url(r'^register/complete/$', views.registration_complete, name='registration_complete'),
url(r'^register/closed/$', views.registration_closed, name='registration_disallowed'), url(r'^register/closed/$', views.registration_closed, name='registration_disallowed'),
url(r'', include('registration.auth_urls')), url(r'', include('django.contrib.auth.urls')),
] ]

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Dashboard" %}{% endblock %} {% block page_title %}{% trans "Dashboard" %}{% endblock %}

View File

@@ -1,7 +1,7 @@
{% load staticfiles %} {% extends 'public/base.html' %}
{% load static %}
{% load bootstrap %} {% load bootstrap %}
{% load i18n %} {% load i18n %}
{% extends 'public/base.html' %}
{% block page_title %}Registration{% endblock %} {% block page_title %}Registration{% endblock %}
{% block extra_include %} {% block extra_include %}
{% include 'bundles/bootstrap-css.html' %} {% include 'bundles/bootstrap-css.html' %}

View File

@@ -6,7 +6,7 @@ from django.contrib.auth import login, authenticate
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.core import signing from django.core import signing
from django.urls import reverse from django.urls import reverse, reverse_lazy
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
@@ -14,12 +14,12 @@ from allianceauth.eveonline.models import EveCharacter
from esi.decorators import token_required from esi.decorators import token_required
from esi.models import Token from esi.models import Token
from registration.backends.hmac.views import ( from django_registration.backends.activation.views import (
RegistrationView as BaseRegistrationView, RegistrationView as BaseRegistrationView,
ActivationView as BaseActivationView, ActivationView as BaseActivationView,
REGISTRATION_SALT REGISTRATION_SALT
) )
from registration.signals import user_registered from django_registration.signals import user_registered
from .models import CharacterOwnership from .models import CharacterOwnership
from .forms import RegistrationForm from .forms import RegistrationForm
@@ -134,11 +134,14 @@ def sso_login(request, token):
# Step 2 # Step 2
class RegistrationView(BaseRegistrationView): class RegistrationView(BaseRegistrationView):
form_class = RegistrationForm form_class = RegistrationForm
success_url = 'authentication:dashboard' template_name = "public/register.html"
email_body_template = "registration/activation_email.txt"
email_subject_template = "registration/activation_email_subject.txt"
success_url = reverse_lazy('registration_complete')
def get_success_url(self, user): def get_success_url(self, user):
if not getattr(settings, 'REGISTRATION_VERIFY_EMAIL', True): if not getattr(settings, 'REGISTRATION_VERIFY_EMAIL', True):
return 'authentication:dashboard', (), {} return reverse_lazy('authentication:dashboard')
return super().get_success_url(user) return super().get_success_url(user)
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
@@ -176,6 +179,9 @@ class RegistrationView(BaseRegistrationView):
# Step 3 # Step 3
class ActivationView(BaseActivationView): class ActivationView(BaseActivationView):
template_name = "registration/activate.html"
success_url = reverse_lazy('registration_activation_complete')
def validate_key(self, activation_key): def validate_key(self, activation_key):
try: try:
dump = signing.loads(activation_key, salt=REGISTRATION_SALT, dump = signing.loads(activation_key, salt=REGISTRATION_SALT,
@@ -207,5 +213,5 @@ def activation_complete(request):
def registration_closed(request): def registration_closed(request):
messages.error(request, _('Registraion of new accounts it not allowed at this time.')) messages.error(request, _('Registration of new accounts is not allowed at this time.'))
return redirect('authentication:login') return redirect('authentication:login')

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -41,7 +41,7 @@ class AuthGroupInlineAdmin(admin.StackedInline):
kwargs["queryset"] = Group.objects.order_by(Lower('name')) kwargs["queryset"] = Group.objects.order_by(Lower('name'))
return super().formfield_for_manytomany(db_field, request, **kwargs) return super().formfield_for_manytomany(db_field, request, **kwargs)
def has_add_permission(self, request): def has_add_permission(self, request, obj=None):
return False return False
def has_delete_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None):

View File

@@ -0,0 +1,38 @@
from django.utils.translation import ugettext_lazy as _
from allianceauth.services.hooks import MenuItemHook, UrlHook
from allianceauth import hooks
from . import urls
from .managers import GroupManager
class GroupManagementMenuItem(MenuItemHook):
""" This class ensures only authorized users will see the menu entry """
def __init__(self):
# setup menu entry for sidebar
MenuItemHook.__init__(
self,
text=_('Group Management'),
classes='fas fa-users-cog fa-fw',
url_name='groupmanagement:management',
order=50,
navactive=['groupmanagement:management']
)
def render(self, request):
if GroupManager.can_manage_groups(request.user):
app_count = GroupManager.pending_requests_count_for_user(request.user)
self.count = app_count if app_count and app_count > 0 else None
return MenuItemHook.render(self, request)
return ''
@hooks.register('menu_item_hook')
def register_menu():
return GroupManagementMenuItem()
@hooks.register('url_hook')
def register_urls():
return UrlHook(urls, 'group', r'^group/')

View File

@@ -4,6 +4,7 @@ from django.contrib.auth.models import Group, User
from django.db.models import Q, QuerySet from django.db.models import Q, QuerySet
from allianceauth.authentication.models import State from allianceauth.authentication.models import State
from .models import GroupRequest
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -101,3 +102,18 @@ class GroupManager:
if user.is_authenticated: if user.is_authenticated:
return cls.has_management_permission(user) or cls.get_group_leaders_groups(user).filter(pk=group.pk).exists() return cls.has_management_permission(user) or cls.get_group_leaders_groups(user).filter(pk=group.pk).exists()
return False return False
@classmethod
def pending_requests_count_for_user(cls, user: User) -> int:
"""Returns the number of pending group requests for the given user"""
if cls.has_management_permission(user):
return GroupRequest.objects.filter(status="pending").count()
else:
return (
GroupRequest.objects
.filter(status="pending")
.filter(group__authgroup__group_leaders__exact=user)
.select_related("group__authgroup__group_leaders")
.count()
)

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1.1 on 2020-09-18 14:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('groupmanagement', '0013_fix_requestlog_date_field'),
]
operations = [
migrations.AlterField(
model_name='requestlog',
name='request_type',
field=models.BooleanField(null=True),
),
]

View File

@@ -4,7 +4,6 @@ from django.db import models
from django.db.models.signals import post_save from django.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver
from allianceauth.authentication.models import State from allianceauth.authentication.models import State
from datetime import datetime
class GroupRequest(models.Model): class GroupRequest(models.Model):
@@ -26,7 +25,7 @@ class GroupRequest(models.Model):
class RequestLog(models.Model): class RequestLog(models.Model):
request_type = models.NullBooleanField(default=0) request_type = models.BooleanField(null=True)
group = models.ForeignKey(Group, on_delete=models.CASCADE) group = models.ForeignKey(Group, on_delete=models.CASCADE)
request_info = models.CharField(max_length=254) request_info = models.CharField(max_length=254)
action = models.BooleanField(default=0) action = models.BooleanField(default=0)

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{{ group }} {% trans "Audit Log" %}{% endblock page_title %} {% block page_title %}{{ group }} {% trans "Audit Log" %}{% endblock page_title %}
@@ -66,8 +66,8 @@
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %} {% include 'bundles/datatables-js.html' %}
{% include 'bundles/moment-js.html' %} {% include 'bundles/moment-js.html' with locale=True %}
<script type="text/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script> <script type="application/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script>
{% endblock %} {% endblock %}
{% block extra_css %} {% block extra_css %}

View File

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

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Groups Membership" %}{% endblock page_title %} {% block page_title %}{% trans "Groups Membership" %}{% endblock page_title %}
@@ -73,7 +73,7 @@
</div> </div>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.4/clipboard.min.js"></script> {% include 'bundles/clipboard-js.html' %}
<script> <script>
new ClipboardJS('#clipboard-copy'); new ClipboardJS('#clipboard-copy');
</script> </script>

View File

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

View File

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

View File

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

View File

@@ -1,15 +0,0 @@
from django import template
from django.contrib.auth.models import User
from allianceauth.groupmanagement.managers import GroupManager
register = template.Library()
@register.filter
def can_manage_groups(user: User) -> bool:
"""returns True if the given user can manage groups. Returns False otherwise."""
if not isinstance(user, User):
return False
return GroupManager.can_manage_groups(user)

View File

@@ -7,7 +7,7 @@ from django.urls import reverse
from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo from allianceauth.eveonline.models import EveCorporationInfo, EveAllianceInfo
from allianceauth.tests.auth_utils import AuthUtils from allianceauth.tests.auth_utils import AuthUtils
from ..models import AuthGroup from ..models import GroupRequest
from ..managers import GroupManager from ..managers import GroupManager
@@ -15,6 +15,7 @@ class MockUserNotAuthenticated():
def __init__(self): def __init__(self):
self.is_authenticated = False self.is_authenticated = False
class GroupManagementVisibilityTestCase(TestCase): class GroupManagementVisibilityTestCase(TestCase):
@classmethod @classmethod
def setUpTestData(cls): def setUpTestData(cls):
@@ -37,22 +38,20 @@ class GroupManagementVisibilityTestCase(TestCase):
def _refresh_user(self): def _refresh_user(self):
self.user = User.objects.get(pk=self.user.pk) self.user = User.objects.get(pk=self.user.pk)
def test_get_group_leaders_groups(self): def test_get_group_leaders_groups(self):
self.group1.authgroup.group_leaders.add(self.user) self.group1.authgroup.group_leaders.add(self.user)
self.group2.authgroup.group_leader_groups.add(self.group1) self.group2.authgroup.group_leader_groups.add(self.group1)
self._refresh_user() self._refresh_user()
groups = GroupManager.get_group_leaders_groups(self.user) groups = GroupManager.get_group_leaders_groups(self.user)
self.assertIn(self.group1, groups) #avail due to user self.assertIn(self.group1, groups) #avail due to user
self.assertNotIn(self.group2, groups) #not avail due to group self.assertNotIn(self.group2, groups) #not avail due to group
self.assertNotIn(self.group3, groups) #not avail at all self.assertNotIn(self.group3, groups) #not avail at all
self.user.groups.add(self.group1) self.user.groups.add(self.group1)
self._refresh_user() self._refresh_user()
groups = GroupManager.get_group_leaders_groups(self.user) groups = GroupManager.get_group_leaders_groups(self.user)
def test_can_manage_group(self): def test_can_manage_group(self):
self.group1.authgroup.group_leaders.add(self.user) self.group1.authgroup.group_leaders.add(self.user)
self.user.groups.add(self.group1) self.user.groups.add(self.group1)
@@ -182,7 +181,6 @@ class TestGroupManager(TestCase):
]: ]:
self.assertFalse(GroupManager.joinable_group(x, member_state)) self.assertFalse(GroupManager.joinable_group(x, member_state))
def test_joinable_group_guest(self): def test_joinable_group_guest(self):
guest_state = AuthUtils.get_guest_state() guest_state = AuthUtils.get_guest_state()
for x in [ for x in [
@@ -200,7 +198,6 @@ class TestGroupManager(TestCase):
]: ]:
self.assertFalse(GroupManager.joinable_group(x, guest_state)) self.assertFalse(GroupManager.joinable_group(x, guest_state))
def test_get_all_non_internal_groups(self): def test_get_all_non_internal_groups(self):
result = GroupManager.get_all_non_internal_groups() result = GroupManager.get_all_non_internal_groups()
expected = { expected = {
@@ -224,7 +221,7 @@ class TestGroupManager(TestCase):
def test_get_joinable_groups_for_user_no_permission(self): def test_get_joinable_groups_for_user_no_permission(self):
AuthUtils.assign_state(self.user, AuthUtils.get_guest_state()) AuthUtils.assign_state(self.user, AuthUtils.get_guest_state())
result = GroupManager.get_joinable_groups_for_user(self.user) result = GroupManager.get_joinable_groups_for_user(self.user)
expected= {self.group_public_1, self.group_public_2} expected = {self.group_public_1, self.group_public_2}
self.assertSetEqual(set(result), expected) self.assertSetEqual(set(result), expected)
def test_get_joinable_groups_for_user_guest_w_permission_(self): def test_get_joinable_groups_for_user_guest_w_permission_(self):
@@ -335,3 +332,96 @@ class TestGroupManager(TestCase):
self.assertFalse( self.assertFalse(
GroupManager.can_manage_group(user, self.group_default) GroupManager.can_manage_group(user, self.group_default)
) )
class TestPendingRequestsCountForUser(TestCase):
def setUp(self) -> None:
self.group_1 = Group.objects.create(name="Group 1")
self.group_2 = Group.objects.create(name="Group 2")
self.user_leader_1 = AuthUtils.create_member('Clark Kent')
self.group_1.authgroup.group_leaders.add(self.user_leader_1)
self.user_leader_2 = AuthUtils.create_member('Peter Parker')
self.group_2.authgroup.group_leaders.add(self.user_leader_2)
self.user_requestor = AuthUtils.create_member('Bruce Wayne')
def test_single_request_for_leader(self):
# given user_leader_1 is leader of group_1
# and user_leader_2 is leader of group_2
# when user_requestor is requesting access to group 1
# then return 1 for user_leader 1 and 0 for user_leader_2
GroupRequest.objects.create(
status="pending", user=self.user_requestor, group=self.group_1
)
self.assertEqual(
GroupManager.pending_requests_count_for_user(self.user_leader_1), 1
)
self.assertEqual(
GroupManager.pending_requests_count_for_user(self.user_leader_2), 0
)
def test_return_none_for_none_leader(self):
# given user_requestor is leader of no group
# when user_requestor is requesting access to group 1
# then return 0 for user_requestor
GroupRequest.objects.create(
status="pending", user=self.user_requestor, group=self.group_1
)
self.assertEqual(
GroupManager.pending_requests_count_for_user(self.user_requestor), 0
)
def test_single_leave_request(self):
# given user_leader_2 is leader of group_2
# and user_requestor is member of group 2
# when user_requestor is requesting to leave group 2
# then return 1 for user_leader_2
self.user_requestor.groups.add(self.group_2)
GroupRequest.objects.create(
status="pending",
user=self.user_requestor,
group=self.group_2,
leave_request=True
)
self.assertEqual(
GroupManager.pending_requests_count_for_user(self.user_leader_2), 1
)
def test_join_and_leave_request(self):
# given user_leader_2 is leader of group_2
# and user_requestor is member of group 2
# when user_requestor is requesting to leave group 2
# and user_requestor_2 is requesting to join group 2
# then return 2 for user_leader_2
self.user_requestor.groups.add(self.group_2)
user_requestor_2 = AuthUtils.create_member("Lex Luther")
GroupRequest.objects.create(
status="pending",
user=user_requestor_2,
group=self.group_2
)
GroupRequest.objects.create(
status="pending",
user=self.user_requestor,
group=self.group_2,
leave_request=True
)
self.assertEqual(
GroupManager.pending_requests_count_for_user(self.user_leader_2), 2
)
def test_single_request_for_user_with_management_perm(self):
# given user_leader_4 which is leafer of no group
# but has the management permissions
# when user_requestor is requesting access to group 1
# then return 1 for user_leader_4
user_leader_4 = AuthUtils.create_member("Lex Luther")
AuthUtils.add_permission_to_user_by_name("auth.group_management", user_leader_4)
user_leader_4 = User.objects.get(pk=user_leader_4.pk)
GroupRequest.objects.create(
status="pending", user=self.user_requestor, group=self.group_1
)
self.assertEqual(
GroupManager.pending_requests_count_for_user(self.user_leader_1), 1
)

View File

@@ -1,27 +0,0 @@
from unittest.mock import patch
from django.test import TestCase
from allianceauth.tests.auth_utils import AuthUtils
from ..templatetags.groupmanagement import can_manage_groups
MODULE_PATH = 'allianceauth.groupmanagement.templatetags.groupmanagement'
@patch(MODULE_PATH + '.GroupManager.can_manage_groups')
class TestCanManageGroups(TestCase):
def setUp(self):
self.user = AuthUtils.create_user('Bruce Wayne')
def test_return_normal_result(self, mock_can_manage_groups):
mock_can_manage_groups.return_value = True
self.assertTrue(can_manage_groups(self.user))
self.assertTrue(mock_can_manage_groups.called)
def test_return_false_if_not_user(self, mock_can_manage_groups):
mock_can_manage_groups.return_value = True
self.assertFalse(can_manage_groups('invalid'))
self.assertFalse(mock_can_manage_groups.called)

View File

@@ -1,32 +1,29 @@
from . import views from . import views
from django.conf.urls import include, url from django.conf.urls import url
app_name = 'groupmanagement' app_name = 'groupmanagement'
urlpatterns = [ urlpatterns = [
url(r'^groups/', views.groups_view, name='groups'), url(r'^groups/', views.groups_view, name='groups'),
url(r'^group/', include([ url(r'^management/', views.group_management,
url(r'^management/', views.group_management, name='management'),
name='management'), url(r'^membership/$', views.group_membership,
url(r'^membership/$', views.group_membership, name='membership'),
name='membership'), url(r'^membership/(\w+)/$', views.group_membership_list,
url(r'^membership/(\w+)/$', views.group_membership_list, name='membership_list'),
name='membership_list'), url(r'^membership/(\w+)/audit/$', views.group_membership_audit, name="audit_log"),
url(r'^membership/(\w+)/audit/$', views.group_membership_audit, name="audit_log"), url(r'^membership/(\w+)/remove/(\w+)/$', views.group_membership_remove,
url(r'^membership/(\w+)/remove/(\w+)/$', views.group_membership_remove, name='membership_remove'),
name='membership_remove'), url(r'^request_add/(\w+)', views.group_request_add,
url(r'^request_add/(\w+)', views.group_request_add, name='request_add'),
name='request_add'), url(r'^request/accept/(\w+)', views.group_accept_request,
url(r'^request/accept/(\w+)', views.group_accept_request, name='accept_request'),
name='accept_request'), url(r'^request/reject/(\w+)', views.group_reject_request,
url(r'^request/reject/(\w+)', views.group_reject_request, name='reject_request'),
name='reject_request'), url(r'^request_leave/(\w+)', views.group_request_leave,
name='request_leave'),
url(r'^request_leave/(\w+)', views.group_request_leave, url(r'leave_request/accept/(\w+)', views.group_leave_accept_request,
name='request_leave'), name='leave_accept_request'),
url(r'leave_request/accept/(\w+)', views.group_leave_accept_request, url(r'^leave_request/reject/(\w+)', views.group_leave_reject_request,
name='leave_accept_request'), name='leave_reject_request'),
url(r'^leave_request/reject/(\w+)', views.group_leave_reject_request,
name='leave_reject_request'),
])),
] ]

View File

@@ -1,7 +1,10 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks from allianceauth import hooks
from allianceauth.hrapplications import urls from allianceauth.services.hooks import MenuItemHook, UrlHook
from . import urls
from .models import Application
class ApplicationsMenu(MenuItemHook): class ApplicationsMenu(MenuItemHook):
@@ -12,6 +15,11 @@ class ApplicationsMenu(MenuItemHook):
'hrapplications:index', 'hrapplications:index',
navactive=['hrapplications:']) navactive=['hrapplications:'])
def render(self, request):
app_count = Application.objects.pending_requests_count_for_user(request.user)
self.count = app_count if app_count and app_count > 0 else None
return MenuItemHook.render(self, request)
@hooks.register('menu_item_hook') @hooks.register('menu_item_hook')
def register_menu(): def register_menu():

View File

@@ -0,0 +1,25 @@
from django.contrib.auth.models import User
from django.db import models
from typing import Optional
class ApplicationManager(models.Manager):
def pending_requests_count_for_user(self, user: User) -> Optional[int]:
"""Returns the number of pending group requests for the given user"""
if user.is_superuser:
return self.filter(approved__isnull=True).count()
elif user.has_perm("auth.human_resources"):
main_character = user.profile.main_character
if main_character:
return (
self
.select_related("form__corp")
.filter(form__corp__corporation_id=main_character.corporation_id)
.filter(approved__isnull=True)
.count()
)
else:
return None
else:
return None

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1.1 on 2020-09-18 14:12
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hrapplications', '0006_remove_legacy_models'),
]
operations = [
migrations.AlterField(
model_name='application',
name='approved',
field=models.BooleanField(blank=True, default=None, null=True),
),
]

View File

@@ -2,8 +2,9 @@ from django.contrib.auth.models import User
from django.db import models from django.db import models
from sortedm2m.fields import SortedManyToManyField from sortedm2m.fields import SortedManyToManyField
from allianceauth.eveonline.models import EveCharacter from allianceauth.eveonline.models import EveCharacter, EveCorporationInfo
from allianceauth.eveonline.models import EveCorporationInfo
from .managers import ApplicationManager
class ApplicationQuestion(models.Model): class ApplicationQuestion(models.Model):
@@ -22,6 +23,7 @@ class ApplicationChoice(models.Model):
def __str__(self): def __str__(self):
return self.choice_text return self.choice_text
class ApplicationForm(models.Model): class ApplicationForm(models.Model):
questions = SortedManyToManyField(ApplicationQuestion) questions = SortedManyToManyField(ApplicationQuestion)
corp = models.OneToOneField(EveCorporationInfo, on_delete=models.CASCADE) corp = models.OneToOneField(EveCorporationInfo, on_delete=models.CASCADE)
@@ -33,11 +35,13 @@ class ApplicationForm(models.Model):
class Application(models.Model): class Application(models.Model):
form = models.ForeignKey(ApplicationForm, on_delete=models.CASCADE, related_name='applications') form = models.ForeignKey(ApplicationForm, on_delete=models.CASCADE, related_name='applications')
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='applications') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='applications')
approved = models.NullBooleanField(blank=True, null=True, default=None) approved = models.BooleanField(blank=True, null=True, default=None)
reviewer = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True) reviewer = models.ForeignKey(User, on_delete=models.SET_NULL, blank=True, null=True)
reviewer_character = models.ForeignKey(EveCharacter, on_delete=models.SET_NULL, blank=True, null=True) reviewer_character = models.ForeignKey(EveCharacter, on_delete=models.SET_NULL, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
objects = ApplicationManager()
def __str__(self): def __str__(self):
return str(self.user) + " Application To " + str(self.form) return str(self.user) + " Application To " + str(self.form)

View File

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

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Apply To" %} {{ corp.corporation_name }}{% endblock page_title %} {% block page_title %}{% trans "Apply To" %} {{ corp.corporation_name }}{% endblock page_title %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "HR Application Management" %}{% endblock page_title %} {% block page_title %}{% trans "HR Application Management" %}{% endblock page_title %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}HR Application Management{% endblock page_title %} {% block page_title %}HR Application Management{% endblock page_title %}

View File

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

View File

@@ -1 +1,103 @@
# Create your tests here. from django.contrib.auth.models import User
from django.test import TestCase
from allianceauth.eveonline.models import EveCorporationInfo
from allianceauth.tests.auth_utils import AuthUtils
from .models import Application, ApplicationForm, ApplicationQuestion, ApplicationChoice
class TestApplicationManagersPendingRequestsCountForUser(TestCase):
def setUp(self) -> None:
self.corporation_1 = EveCorporationInfo.objects.create(
corporation_id=2001, corporation_name="Wayne Tech", member_count=42
)
self.corporation_2 = EveCorporationInfo.objects.create(
corporation_id=2011, corporation_name="Lex Corp", member_count=666
)
question = ApplicationQuestion.objects.create(title="Dummy Question")
ApplicationChoice.objects.create(question=question, choice_text="yes")
ApplicationChoice.objects.create(question=question, choice_text="no")
self.form_corporation_1 = ApplicationForm.objects.create(
corp=self.corporation_1
)
self.form_corporation_1.questions.add(question)
self.form_corporation_2 = ApplicationForm.objects.create(
corp=self.corporation_2
)
self.form_corporation_2.questions.add(question)
self.user_requestor = AuthUtils.create_member("Peter Parker")
self.user_manager = AuthUtils.create_member("Bruce Wayne")
AuthUtils.add_main_character_2(
self.user_manager,
self.user_manager.username,
1001,
self.corporation_1.corporation_id,
self.corporation_1.corporation_name,
)
AuthUtils.add_permission_to_user_by_name(
"auth.human_resources", self.user_manager
)
self.user_manager = User.objects.get(pk=self.user_manager.pk)
def test_no_pending_application(self):
# given manager of corporation 1 has permission
# when no application is pending for corporation 1
# return 0
self.assertEqual(
Application.objects.pending_requests_count_for_user(self.user_manager), 0
)
def test_single_pending_application(self):
# given manager of corporation 1 has permission
# when 1 application is pending for corporation 1
# return 1
Application.objects.create(
form=self.form_corporation_1, user=self.user_requestor
)
self.assertEqual(
Application.objects.pending_requests_count_for_user(self.user_manager), 1
)
def test_user_has_no_permission(self):
# given user has no permission
# when 1 application is pending
# return None
self.assertIsNone(
Application.objects.pending_requests_count_for_user(self.user_requestor)
)
def test_two_pending_applications_for_different_corporations_normal_manager(self):
# given manager of corporation 1 has permission
# when 1 application is pending for corporation 1
# and 1 application is pending for corporation 2
# return 1
Application.objects.create(
form=self.form_corporation_1, user=self.user_requestor
)
Application.objects.create(
form=self.form_corporation_2, user=self.user_requestor
)
self.assertEqual(
Application.objects.pending_requests_count_for_user(self.user_manager), 1
)
def test_two_pending_applications_for_different_corporations_manager_is_super(self):
# given manager of corporation 1 has permission
# when 1 application is pending for corporation 1
# and 1 application is pending for corporation 2
# return 1
Application.objects.create(
form=self.form_corporation_1, user=self.user_requestor
)
Application.objects.create(
form=self.form_corporation_2, user=self.user_requestor
)
superuser = User.objects.create_superuser(
"Superman", "superman@example.com", "password"
)
self.assertEqual(
Application.objects.pending_requests_count_for_user(superuser), 2
)

View File

@@ -6,16 +6,16 @@
# Translators: # Translators:
# Erik Kalkoken <erik.kalkoken@gmail.com>, 2020 # Erik Kalkoken <erik.kalkoken@gmail.com>, 2020
# Joel Falknau <ozirascal@gmail.com>, 2020 # Joel Falknau <ozirascal@gmail.com>, 2020
# Rounon Dax <rounon.dax@terra-nanotech.de>, 2020 # Peter Pfeufer <rounon.dax@terra-nanotech.de>, 2020
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-07-29 04:56+0000\n" "POT-Creation-Date: 2020-10-11 03:43+0000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Rounon Dax <rounon.dax@terra-nanotech.de>, 2020\n" "Last-Translator: Peter Pfeufer <rounon.dax@terra-nanotech.de>, 2020\n"
"Language-Team: German (https://www.transifex.com/alliance-auth/teams/107430/de/)\n" "Language-Team: German (https://www.transifex.com/alliance-auth/teams/107430/de/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -28,7 +28,7 @@ msgid "A main character is required to perform that action. Add one below."
msgstr "" msgstr ""
"Für diese Aktion wird ein Hauptcharacter benötigt. Bitte füge einen hinzu." "Für diese Aktion wird ein Hauptcharacter benötigt. Bitte füge einen hinzu."
#: allianceauth/authentication/forms.py:6 #: allianceauth/authentication/forms.py:5
msgid "Email" msgid "Email"
msgstr "E-Mail" msgstr "E-Mail"
@@ -44,7 +44,7 @@ msgstr "Dein Nutzerstatus ist nun %(state)s"
#: allianceauth/authentication/templates/authentication/dashboard.html:5 #: allianceauth/authentication/templates/authentication/dashboard.html:5
#: allianceauth/authentication/templates/authentication/dashboard.html:8 #: allianceauth/authentication/templates/authentication/dashboard.html:8
#: allianceauth/templates/allianceauth/side-menu.html:12 #: allianceauth/templates/allianceauth/side-menu.html:11
msgid "Dashboard" msgid "Dashboard"
msgstr "Dashboard" msgstr "Dashboard"
@@ -168,11 +168,11 @@ msgstr ""
msgid "Unable to authenticate as the selected character." msgid "Unable to authenticate as the selected character."
msgstr "Authentifizierung mit dem ausgewählten Charakter nicht möglich." msgstr "Authentifizierung mit dem ausgewählten Charakter nicht möglich."
#: allianceauth/authentication/views.py:148 #: allianceauth/authentication/views.py:146
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "Token zur Registrierung ist abgelaufen." msgstr "Token zur Registrierung ist abgelaufen."
#: allianceauth/authentication/views.py:200 #: allianceauth/authentication/views.py:201
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
@@ -180,12 +180,12 @@ msgstr ""
"Bestätigungsmail gesendet. Bitte folge dem Link in der E-Mail zur " "Bestätigungsmail gesendet. Bitte folge dem Link in der E-Mail zur "
"Bestätigung." "Bestätigung."
#: allianceauth/authentication/views.py:205 #: allianceauth/authentication/views.py:206
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "" msgstr ""
"Deine E-Mail Adresse wurde bestätigt. Bitte log Dich ein um fortzufahren." "Deine E-Mail Adresse wurde bestätigt. Bitte log Dich ein um fortzufahren."
#: allianceauth/authentication/views.py:210 #: allianceauth/authentication/views.py:211
msgid "Registraion of new accounts it not allowed at this time." msgid "Registraion of new accounts it not allowed at this time."
msgstr "Registrierung von neuen Konten ist zur Zeit nicht erlaubt." msgstr "Registrierung von neuen Konten ist zur Zeit nicht erlaubt."
@@ -552,6 +552,11 @@ msgstr "Flottenteilnahme registriert."
msgid "FAT link has expired." msgid "FAT link has expired."
msgstr "FAT-Link ist abgelaufen." msgstr "FAT-Link ist abgelaufen."
#: allianceauth/groupmanagement/auth_hooks.py:16
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
msgid "Group Management"
msgstr "Gruppenverwaltung"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
msgid "Audit Log" msgid "Audit Log"
@@ -624,7 +629,7 @@ msgstr "Gruppenmitgliedschaft"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40
#: allianceauth/templates/allianceauth/side-menu.html:17 #: allianceauth/templates/allianceauth/side-menu.html:16
msgid "Groups" msgid "Groups"
msgstr "Gruppen" msgstr "Gruppen"
@@ -638,7 +643,7 @@ msgstr "Beschreibung"
#: allianceauth/hrapplications/templates/hrapplications/management.html:85 #: allianceauth/hrapplications/templates/hrapplications/management.html:85
#: allianceauth/hrapplications/templates/hrapplications/management.html:130 #: allianceauth/hrapplications/templates/hrapplications/management.html:130
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/srp/templates/srp/data.html:97 #: allianceauth/srp/templates/srp/data.html:98
msgid "Status" msgid "Status"
msgstr "Status" msgstr "Status"
@@ -738,11 +743,6 @@ msgstr "Keine Gruppenaustrittsanfragen"
msgid "Toggle navigation" msgid "Toggle navigation"
msgstr "Toggle Navigation" msgstr "Toggle Navigation"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
#: allianceauth/templates/allianceauth/side-menu.html:25
msgid "Group Management"
msgstr "Gruppenverwaltung"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21 #: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21
msgid "Group Requests" msgid "Group Requests"
msgstr "Gruppenanfragen" msgstr "Gruppenanfragen"
@@ -825,7 +825,7 @@ msgstr "Du hast Dich bereits für diese Gruppe beworben."
#: allianceauth/hrapplications/templates/hrapplications/management.html:144 #: allianceauth/hrapplications/templates/hrapplications/management.html:144
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:38 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:38
#: allianceauth/hrapplications/templates/hrapplications/view.html:20 #: allianceauth/hrapplications/templates/hrapplications/view.html:20
#: allianceauth/srp/templates/srp/data.html:125 #: allianceauth/srp/templates/srp/data.html:134
#: allianceauth/srp/templates/srp/management.html:81 #: allianceauth/srp/templates/srp/management.html:81
msgid "Pending" msgid "Pending"
msgstr "Beantragt" msgstr "Beantragt"
@@ -852,7 +852,7 @@ msgstr "Du hast bereits ein ausstehendes Austrittsgesuch für diese Gruppe."
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "Austrittsgesuch für Gruppe %(group)s gesendet." msgstr "Austrittsgesuch für Gruppe %(group)s gesendet."
#: allianceauth/hrapplications/auth_hooks.py:10 #: allianceauth/hrapplications/auth_hooks.py:13
msgid "Applications" msgid "Applications"
msgstr "Bewerbungen" msgstr "Bewerbungen"
@@ -909,7 +909,7 @@ msgstr "Benutzername"
#: allianceauth/hrapplications/templates/hrapplications/management.html:131 #: allianceauth/hrapplications/templates/hrapplications/management.html:131
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:28 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:28
#: allianceauth/hrapplications/templates/hrapplications/view.html:75 #: allianceauth/hrapplications/templates/hrapplications/view.html:75
#: allianceauth/srp/templates/srp/data.html:99 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:46
msgid "Actions" msgid "Actions"
msgstr "Aktionen" msgstr "Aktionen"
@@ -919,7 +919,7 @@ msgstr "Aktionen"
#: allianceauth/hrapplications/templates/hrapplications/management.html:147 #: allianceauth/hrapplications/templates/hrapplications/management.html:147
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:40 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:40
#: allianceauth/hrapplications/templates/hrapplications/view.html:16 #: allianceauth/hrapplications/templates/hrapplications/view.html:16
#: allianceauth/srp/templates/srp/data.html:117 #: allianceauth/srp/templates/srp/data.html:126
msgid "Approved" msgid "Approved"
msgstr "Akzeptiert" msgstr "Akzeptiert"
@@ -927,7 +927,7 @@ msgstr "Akzeptiert"
#: allianceauth/hrapplications/templates/hrapplications/management.html:104 #: allianceauth/hrapplications/templates/hrapplications/management.html:104
#: allianceauth/hrapplications/templates/hrapplications/management.html:149 #: allianceauth/hrapplications/templates/hrapplications/management.html:149
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:42 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:42
#: allianceauth/srp/templates/srp/data.html:121 #: allianceauth/srp/templates/srp/data.html:130
msgid "Rejected" msgid "Rejected"
msgstr "Abgelehnt" msgstr "Abgelehnt"
@@ -1033,7 +1033,7 @@ msgstr "Ungelesen"
#: allianceauth/notifications/templates/notifications/list.html:18 #: allianceauth/notifications/templates/notifications/list.html:18
msgid "Read" msgid "Read"
msgstr "Lesen" msgstr "Gelesen"
#: allianceauth/notifications/templates/notifications/list.html:22 #: allianceauth/notifications/templates/notifications/list.html:22
msgid "Mark All Read" msgid "Mark All Read"
@@ -1310,11 +1310,11 @@ msgstr "Passwort"
msgid "Password must be at least 8 characters long." msgid "Password must be at least 8 characters long."
msgstr "Passwort muss mindestens 8 Zeichen lang sein" msgstr "Passwort muss mindestens 8 Zeichen lang sein"
#: allianceauth/services/modules/discord/models.py:224 #: allianceauth/services/modules/discord/models.py:225
msgid "Discord Account Disabled" msgid "Discord Account Disabled"
msgstr "Discord Konto deaktiviert" msgstr "Discord Konto deaktiviert"
#: allianceauth/services/modules/discord/models.py:226 #: allianceauth/services/modules/discord/models.py:227
msgid "" msgid ""
"Your Discord account was disabeled automatically by Auth. If you think this " "Your Discord account was disabeled automatically by Auth. If you think this "
"was a mistake, please contact an admin." "was a mistake, please contact an admin."
@@ -1628,7 +1628,7 @@ msgstr "Dienst"
msgid "Domain" msgid "Domain"
msgstr "Domain" msgstr "Domain"
#: allianceauth/srp/auth_hooks.py:9 #: allianceauth/srp/auth_hooks.py:12
msgid "Ship Replacement" msgid "Ship Replacement"
msgstr "Schiffserstattung" msgstr "Schiffserstattung"
@@ -1642,7 +1642,7 @@ msgstr "Flottenzeit"
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "Flottendoktrin" msgstr "Flottendoktrin"
#: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:89 #: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:90
msgid "Additional Info" msgid "Additional Info"
msgstr "Zusätzliche Info" msgstr "Zusätzliche Info"
@@ -1671,65 +1671,65 @@ msgstr "SRP-Flotte erstellen"
msgid "Give this link to the line members" msgid "Give this link to the line members"
msgstr "Gib diesen Link an Deine Piloten weiter" msgstr "Gib diesen Link an Deine Piloten weiter"
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:49
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "SRP-Flotte Daten" msgstr "SRP-Flotte Daten"
#: allianceauth/srp/templates/srp/data.html:53 #: allianceauth/srp/templates/srp/data.html:54
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "Als unvollständig markieren" msgstr "Als unvollständig markieren"
#: allianceauth/srp/templates/srp/data.html:57 #: allianceauth/srp/templates/srp/data.html:58
msgid "Mark Completed" msgid "Mark Completed"
msgstr "Als vollständig markieren" msgstr "Als vollständig markieren"
#: allianceauth/srp/templates/srp/data.html:69 #: allianceauth/srp/templates/srp/data.html:70
#: allianceauth/srp/templates/srp/data.html:145 #: allianceauth/srp/templates/srp/data.html:156
msgid "Total Losses:" msgid "Total Losses:"
msgstr "Verluste insgesamt:" msgstr "Verluste insgesamt:"
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:71
#: allianceauth/srp/templates/srp/data.html:146 #: allianceauth/srp/templates/srp/data.html:157
#: allianceauth/srp/templates/srp/management.html:30 #: allianceauth/srp/templates/srp/management.html:30
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "ISK-Kosten insgesamt:" msgstr "ISK-Kosten insgesamt:"
#: allianceauth/srp/templates/srp/data.html:78 #: allianceauth/srp/templates/srp/data.html:79
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:165
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "Bist Du sicher das Du SRP Anfragen löschen willst?" msgstr "Bist Du sicher das Du SRP Anfragen löschen willst?"
#: allianceauth/srp/templates/srp/data.html:87 #: allianceauth/srp/templates/srp/data.html:88
msgid "Pilot Name" msgid "Pilot Name"
msgstr "Name des Piloten" msgstr "Name des Piloten"
#: allianceauth/srp/templates/srp/data.html:88 #: allianceauth/srp/templates/srp/data.html:89
msgid "Killboard Link" msgid "Killboard Link"
msgstr "Killboard Link" msgstr "Killboard Link"
#: allianceauth/srp/templates/srp/data.html:90 #: allianceauth/srp/templates/srp/data.html:91
msgid "Ship Type" msgid "Ship Type"
msgstr "Schiffstyp" msgstr "Schiffstyp"
#: allianceauth/srp/templates/srp/data.html:91 #: allianceauth/srp/templates/srp/data.html:92
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "Summe Killboard Verluste" msgstr "Summe Killboard Verluste"
#: allianceauth/srp/templates/srp/data.html:92 #: allianceauth/srp/templates/srp/data.html:93
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "SRP ISK-Kosten" msgstr "SRP ISK-Kosten"
#: allianceauth/srp/templates/srp/data.html:93 #: allianceauth/srp/templates/srp/data.html:94
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "" msgstr ""
"Klicke auf den Wert um diesen zu bearbeiten, Enter zum Speichern und um zum " "Klicke auf den Wert um diesen zu bearbeiten, Enter zum Speichern und um zum "
"nächsten Wert zu springen, ESC zum Beenden." "nächsten Wert zu springen, ESC zum Beenden."
#: allianceauth/srp/templates/srp/data.html:96 #: allianceauth/srp/templates/srp/data.html:97
msgid "Post Time" msgid "Post Time"
msgstr "Veröffentlichungszeit" msgstr "Veröffentlichungszeit"
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:174
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "Keine SRP Anfragen für diese Flotte." msgstr "Keine SRP Anfragen für diese Flotte."

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-07-29 04:56+0000\n" "POT-Creation-Date: 2020-10-01 02:59+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -22,7 +22,7 @@ msgstr ""
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "" msgstr ""
#: allianceauth/authentication/forms.py:6 #: allianceauth/authentication/forms.py:5
msgid "Email" msgid "Email"
msgstr "" msgstr ""
@@ -38,7 +38,7 @@ msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:5 #: allianceauth/authentication/templates/authentication/dashboard.html:5
#: allianceauth/authentication/templates/authentication/dashboard.html:8 #: allianceauth/authentication/templates/authentication/dashboard.html:8
#: allianceauth/templates/allianceauth/side-menu.html:12 #: allianceauth/templates/allianceauth/side-menu.html:11
msgid "Dashboard" msgid "Dashboard"
msgstr "" msgstr ""
@@ -154,22 +154,22 @@ msgstr ""
msgid "Unable to authenticate as the selected character." msgid "Unable to authenticate as the selected character."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:148 #: allianceauth/authentication/views.py:146
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:200 #: allianceauth/authentication/views.py:201
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:205 #: allianceauth/authentication/views.py:206
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "" msgstr ""
#: allianceauth/authentication/views.py:210 #: allianceauth/authentication/views.py:211
msgid "Registraion of new accounts it not allowed at this time." msgid "Registration of new accounts is not allowed at this time."
msgstr "" msgstr ""
#: allianceauth/corputils/auth_hooks.py:10 #: allianceauth/corputils/auth_hooks.py:10
@@ -535,6 +535,11 @@ msgstr ""
msgid "FAT link has expired." msgid "FAT link has expired."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/auth_hooks.py:16
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
msgid "Group Management"
msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
msgid "Audit Log" msgid "Audit Log"
@@ -607,7 +612,7 @@ msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40
#: allianceauth/templates/allianceauth/side-menu.html:17 #: allianceauth/templates/allianceauth/side-menu.html:16
msgid "Groups" msgid "Groups"
msgstr "" msgstr ""
@@ -621,7 +626,7 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:85 #: allianceauth/hrapplications/templates/hrapplications/management.html:85
#: allianceauth/hrapplications/templates/hrapplications/management.html:130 #: allianceauth/hrapplications/templates/hrapplications/management.html:130
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/srp/templates/srp/data.html:97 #: allianceauth/srp/templates/srp/data.html:98
msgid "Status" msgid "Status"
msgstr "" msgstr ""
@@ -721,11 +726,6 @@ msgstr ""
msgid "Toggle navigation" msgid "Toggle navigation"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
#: allianceauth/templates/allianceauth/side-menu.html:25
msgid "Group Management"
msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21 #: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21
msgid "Group Requests" msgid "Group Requests"
msgstr "" msgstr ""
@@ -804,7 +804,7 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:144 #: allianceauth/hrapplications/templates/hrapplications/management.html:144
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:38 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:38
#: allianceauth/hrapplications/templates/hrapplications/view.html:20 #: allianceauth/hrapplications/templates/hrapplications/view.html:20
#: allianceauth/srp/templates/srp/data.html:125 #: allianceauth/srp/templates/srp/data.html:128
#: allianceauth/srp/templates/srp/management.html:81 #: allianceauth/srp/templates/srp/management.html:81
msgid "Pending" msgid "Pending"
msgstr "" msgstr ""
@@ -831,7 +831,7 @@ msgstr ""
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "" msgstr ""
#: allianceauth/hrapplications/auth_hooks.py:10 #: allianceauth/hrapplications/auth_hooks.py:13
msgid "Applications" msgid "Applications"
msgstr "" msgstr ""
@@ -888,7 +888,7 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:131 #: allianceauth/hrapplications/templates/hrapplications/management.html:131
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:28 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:28
#: allianceauth/hrapplications/templates/hrapplications/view.html:75 #: allianceauth/hrapplications/templates/hrapplications/view.html:75
#: allianceauth/srp/templates/srp/data.html:99 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:46
msgid "Actions" msgid "Actions"
msgstr "" msgstr ""
@@ -898,7 +898,7 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:147 #: allianceauth/hrapplications/templates/hrapplications/management.html:147
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:40 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:40
#: allianceauth/hrapplications/templates/hrapplications/view.html:16 #: allianceauth/hrapplications/templates/hrapplications/view.html:16
#: allianceauth/srp/templates/srp/data.html:117 #: allianceauth/srp/templates/srp/data.html:120
msgid "Approved" msgid "Approved"
msgstr "" msgstr ""
@@ -906,7 +906,7 @@ msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/management.html:104 #: allianceauth/hrapplications/templates/hrapplications/management.html:104
#: allianceauth/hrapplications/templates/hrapplications/management.html:149 #: allianceauth/hrapplications/templates/hrapplications/management.html:149
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:42 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:42
#: allianceauth/srp/templates/srp/data.html:121 #: allianceauth/srp/templates/srp/data.html:124
msgid "Rejected" msgid "Rejected"
msgstr "" msgstr ""
@@ -1289,13 +1289,13 @@ msgstr ""
msgid "Password must be at least 8 characters long." msgid "Password must be at least 8 characters long."
msgstr "" msgstr ""
#: allianceauth/services/modules/discord/models.py:224 #: allianceauth/services/modules/discord/models.py:225
msgid "Discord Account Disabled" msgid "Discord Account Disabled"
msgstr "" msgstr ""
#: allianceauth/services/modules/discord/models.py:226 #: allianceauth/services/modules/discord/models.py:227
msgid "" msgid ""
"Your Discord account was disabeled automatically by Auth. If you think this " "Your Discord account was disabled automatically by Auth. If you think this "
"was a mistake, please contact an admin." "was a mistake, please contact an admin."
msgstr "" msgstr ""
@@ -1595,7 +1595,7 @@ msgstr ""
msgid "Domain" msgid "Domain"
msgstr "" msgstr ""
#: allianceauth/srp/auth_hooks.py:9 #: allianceauth/srp/auth_hooks.py:12
msgid "Ship Replacement" msgid "Ship Replacement"
msgstr "" msgstr ""
@@ -1607,7 +1607,7 @@ msgstr ""
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "" msgstr ""
#: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:89 #: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:90
msgid "Additional Info" msgid "Additional Info"
msgstr "" msgstr ""
@@ -1636,63 +1636,63 @@ msgstr ""
msgid "Give this link to the line members" msgid "Give this link to the line members"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:49
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:53 #: allianceauth/srp/templates/srp/data.html:54
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:57 #: allianceauth/srp/templates/srp/data.html:58
msgid "Mark Completed" msgid "Mark Completed"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:69 #: allianceauth/srp/templates/srp/data.html:70
#: allianceauth/srp/templates/srp/data.html:145 #: allianceauth/srp/templates/srp/data.html:150
msgid "Total Losses:" msgid "Total Losses:"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:71
#: allianceauth/srp/templates/srp/data.html:146 #: allianceauth/srp/templates/srp/data.html:151
#: allianceauth/srp/templates/srp/management.html:30 #: allianceauth/srp/templates/srp/management.html:30
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:78 #: allianceauth/srp/templates/srp/data.html:79
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:159
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:87 #: allianceauth/srp/templates/srp/data.html:88
msgid "Pilot Name" msgid "Pilot Name"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:88 #: allianceauth/srp/templates/srp/data.html:89
msgid "Killboard Link" msgid "Killboard Link"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:90 #: allianceauth/srp/templates/srp/data.html:91
msgid "Ship Type" msgid "Ship Type"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:91 #: allianceauth/srp/templates/srp/data.html:92
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:92 #: allianceauth/srp/templates/srp/data.html:93
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:93 #: allianceauth/srp/templates/srp/data.html:94
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:96 #: allianceauth/srp/templates/srp/data.html:97
msgid "Post Time" msgid "Post Time"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:168
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "" msgstr ""

View File

@@ -4,17 +4,17 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Joel Falknau <ozirascal@gmail.com>, 2020
# frank1210 <francolopez_16@hotmail.com>, 2020 # frank1210 <francolopez_16@hotmail.com>, 2020
# Joel Falknau <ozirascal@gmail.com>, 2020
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-08 00:57+0000\n" "POT-Creation-Date: 2020-10-11 03:43+0000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: frank1210 <francolopez_16@hotmail.com>, 2020\n" "Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2020\n"
"Language-Team: Spanish (https://www.transifex.com/alliance-auth/teams/107430/es/)\n" "Language-Team: Spanish (https://www.transifex.com/alliance-auth/teams/107430/es/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -27,59 +27,57 @@ msgid "A main character is required to perform that action. Add one below."
msgstr "" msgstr ""
"Un personaje principal es requerido para completar esta accion. Agregue uno" "Un personaje principal es requerido para completar esta accion. Agregue uno"
#: allianceauth/authentication/forms.py:6 #: allianceauth/authentication/forms.py:5
msgid "Email" msgid "Email"
msgstr "E-mail" msgstr "E-mail"
#: allianceauth/authentication/models.py:76 #: allianceauth/authentication/models.py:78
msgid "State Changed"
msgstr "Estado Cambiado"
#: allianceauth/authentication/models.py:77
#, python-format #, python-format
msgid "Your user state has been changed to %(state)s" msgid "State changed to: %s"
msgstr "Tu estado de usuario fue cambiado a %(state)s" msgstr ""
#: allianceauth/authentication/models.py:79
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:5 #: allianceauth/authentication/templates/authentication/dashboard.html:5
#: allianceauth/authentication/templates/authentication/dashboard.html:8 #: allianceauth/authentication/templates/authentication/dashboard.html:8
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:11
msgid "Dashboard" msgid "Dashboard"
msgstr "Pagina Principal" msgstr "Pagina Principal"
#: allianceauth/authentication/templates/authentication/dashboard.html:17 #: allianceauth/authentication/templates/authentication/dashboard.html:18
#: allianceauth/corputils/templates/corputils/corpstats.html:116 #, python-format
#: allianceauth/corputils/templates/corputils/search.html:16 msgid ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:22 "\n"
#: allianceauth/hrapplications/templates/hrapplications/management.html:83 " Main Character (State: %(state)s)\n"
#: allianceauth/hrapplications/templates/hrapplications/management.html:128 " "
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:25 msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/view.html:32
msgid "Main Character"
msgstr "Personaje Principal"
#: allianceauth/authentication/templates/authentication/dashboard.html:77 #: allianceauth/authentication/templates/authentication/dashboard.html:81
msgid "No main character set." msgid "No main character set."
msgstr "No se ha seleccionado un personaje principal." msgstr "No se ha seleccionado un personaje principal."
#: allianceauth/authentication/templates/authentication/dashboard.html:84 #: allianceauth/authentication/templates/authentication/dashboard.html:88
msgid "Add Character" msgid "Add Character"
msgstr "Agregar Personaje" msgstr "Agregar Personaje"
#: allianceauth/authentication/templates/authentication/dashboard.html:88 #: allianceauth/authentication/templates/authentication/dashboard.html:92
msgid "Change Main" msgid "Change Main"
msgstr "Cambiar Personaje Principal" msgstr "Cambiar Personaje Principal"
#: allianceauth/authentication/templates/authentication/dashboard.html:97 #: allianceauth/authentication/templates/authentication/dashboard.html:101
msgid "Group Memberships" msgid "Group Memberships"
msgstr "" msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:117 #: allianceauth/authentication/templates/authentication/dashboard.html:121
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:41 #: allianceauth/hrapplications/templates/hrapplications/view.html:41
msgid "Characters" msgid "Characters"
msgstr "Personajes" msgstr "Personajes"
#: allianceauth/authentication/templates/authentication/dashboard.html:125 #: allianceauth/authentication/templates/authentication/dashboard.html:129
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:73 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:73
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:22 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:22
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:15 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:15
@@ -88,13 +86,13 @@ msgstr "Personajes"
msgid "Name" msgid "Name"
msgstr "Nombre" msgstr "Nombre"
#: allianceauth/authentication/templates/authentication/dashboard.html:126 #: allianceauth/authentication/templates/authentication/dashboard.html:130
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:46 #: allianceauth/hrapplications/templates/hrapplications/view.html:46
msgid "Corp" msgid "Corp"
msgstr "Corporación" msgstr "Corporación"
#: allianceauth/authentication/templates/authentication/dashboard.html:127 #: allianceauth/authentication/templates/authentication/dashboard.html:131
#: allianceauth/corputils/templates/corputils/corpstats.html:77 #: allianceauth/corputils/templates/corputils/corpstats.html:77
#: allianceauth/hrapplications/templates/hrapplications/view.html:47 #: allianceauth/hrapplications/templates/hrapplications/view.html:47
msgid "Alliance" msgid "Alliance"
@@ -163,24 +161,24 @@ msgstr ""
msgid "Unable to authenticate as the selected character." msgid "Unable to authenticate as the selected character."
msgstr "Imposible validar con el personaje seleccionado." msgstr "Imposible validar con el personaje seleccionado."
#: allianceauth/authentication/views.py:148 #: allianceauth/authentication/views.py:146
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "El token de registracion expiro." msgstr "El token de registracion expiro."
#: allianceauth/authentication/views.py:200 #: allianceauth/authentication/views.py:201
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "" msgstr ""
"Confirmacion de mail enviada. Por favor siga el enlace para confirmar " "Confirmacion de mail enviada. Por favor siga el enlace para confirmar "
#: allianceauth/authentication/views.py:205 #: allianceauth/authentication/views.py:206
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "" msgstr ""
"Se ha confirmado su direccion de mail. Por favor igrese su token para " "Se ha confirmado su direccion de mail. Por favor igrese su token para "
"continuar." "continuar."
#: allianceauth/authentication/views.py:210 #: allianceauth/authentication/views.py:211
msgid "Registraion of new accounts it not allowed at this time." msgid "Registraion of new accounts it not allowed at this time."
msgstr "Registracion de nuevas cuentas no es permitido por el momento." msgstr "Registracion de nuevas cuentas no es permitido por el momento."
@@ -231,8 +229,8 @@ msgstr "Ultima Actualizacion:"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:28 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:28
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:27 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:27
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:37 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:51
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:96 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:110
msgid "Character" msgid "Character"
msgstr "Personaje" msgstr "Personaje"
@@ -254,6 +252,16 @@ msgstr "Corporacion"
msgid "Killboard" msgid "Killboard"
msgstr "Killboard" msgstr "Killboard"
#: allianceauth/corputils/templates/corputils/corpstats.html:116
#: allianceauth/corputils/templates/corputils/search.html:16
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:22
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:128
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:25
#: allianceauth/hrapplications/templates/hrapplications/view.html:32
msgid "Main Character"
msgstr "Personaje Principal"
#: allianceauth/corputils/templates/corputils/corpstats.html:117 #: allianceauth/corputils/templates/corputils/corpstats.html:117
#: allianceauth/corputils/templates/corputils/search.html:17 #: allianceauth/corputils/templates/corputils/search.html:17
msgid "Main Corporation" msgid "Main Corporation"
@@ -538,6 +546,11 @@ msgstr "Participacion de flota registrada."
msgid "FAT link has expired." msgid "FAT link has expired."
msgstr "Enlace de participacion expirado." msgstr "Enlace de participacion expirado."
#: allianceauth/groupmanagement/auth_hooks.py:16
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
msgid "Group Management"
msgstr "Manejo de Grupo"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
msgid "Audit Log" msgid "Audit Log"
@@ -590,8 +603,8 @@ msgid "Portrait"
msgstr "Retrato" msgstr "Retrato"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:30 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:38 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:52
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:97 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:111
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:23 #: allianceauth/permissions_tool/templates/permissions_tool/audit.html:23
msgid "Organization" msgid "Organization"
msgstr "" msgstr ""
@@ -610,7 +623,7 @@ msgstr "Membresia de grupos"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40
#: allianceauth/templates/allianceauth/side-menu.html:15 #: allianceauth/templates/allianceauth/side-menu.html:16
msgid "Groups" msgid "Groups"
msgstr "Grupos" msgstr "Grupos"
@@ -624,7 +637,7 @@ msgstr "Descripcion"
#: allianceauth/hrapplications/templates/hrapplications/management.html:85 #: allianceauth/hrapplications/templates/hrapplications/management.html:85
#: allianceauth/hrapplications/templates/hrapplications/management.html:130 #: allianceauth/hrapplications/templates/hrapplications/management.html:130
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/srp/templates/srp/data.html:97 #: allianceauth/srp/templates/srp/data.html:98
msgid "Status" msgid "Status"
msgstr "Estado" msgstr "Estado"
@@ -654,7 +667,7 @@ msgid "Audit Members"
msgstr "Auditar Miembros" msgstr "Auditar Miembros"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:56 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:56
msgid "Copy Direrct Join Link" msgid "Copy Direct Join Link"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:68 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:68
@@ -686,37 +699,37 @@ msgstr "No hay grupos disponibles"
msgid "Groups Management" msgid "Groups Management"
msgstr "Manejo de Grupos" msgstr "Manejo de Grupos"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:23 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:25
msgid "Join Requests" msgid "Join Requests"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:24 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:33
msgid "Leave Requests" msgid "Leave Requests"
msgstr "" msgstr ""
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:39 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:53
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:98 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:20 #: allianceauth/permissions_tool/templates/permissions_tool/audit.html:20
#: allianceauth/services/modules/openfire/forms.py:6 #: allianceauth/services/modules/openfire/forms.py:6
msgid "Group" msgid "Group"
msgstr "Grupo" msgstr "Grupo"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:71 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:85
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:130 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:144
msgid "Accept" msgid "Accept"
msgstr "Aceptar" msgstr "Aceptar"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:74 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:88
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:133 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:147
#: allianceauth/hrapplications/templates/hrapplications/view.html:85 #: allianceauth/hrapplications/templates/hrapplications/view.html:85
msgid "Reject" msgid "Reject"
msgstr "Rechazar" msgstr "Rechazar"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:83 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:97
msgid "No group add requests." msgid "No group add requests."
msgstr "No hay solicitudes de ingreso." msgstr "No hay solicitudes de ingreso."
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:142 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:156
msgid "No group leave requests." msgid "No group leave requests."
msgstr "No hay solicitudes paradejar el grupo." msgstr "No hay solicitudes paradejar el grupo."
@@ -724,11 +737,6 @@ msgstr "No hay solicitudes paradejar el grupo."
msgid "Toggle navigation" msgid "Toggle navigation"
msgstr "Navegacion" msgstr "Navegacion"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
#: allianceauth/templates/allianceauth/side-menu.html:23
msgid "Group Management"
msgstr "Manejo de Grupo"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21 #: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21
msgid "Group Requests" msgid "Group Requests"
msgstr "Solicitudes de Grupo" msgstr "Solicitudes de Grupo"
@@ -737,26 +745,26 @@ msgstr "Solicitudes de Grupo"
msgid "Group Membership" msgid "Group Membership"
msgstr "Membresia de Grupo" msgstr "Membresia de Grupo"
#: allianceauth/groupmanagement/views.py:166 #: allianceauth/groupmanagement/views.py:162
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "El usuario %(user)s fue removido del grupo %(group)s" msgstr "El usuario %(user)s fue removido del grupo %(group)s"
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:164
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "El usuario no existe en ese grupos" msgstr "El usuario no existe en ese grupos"
#: allianceauth/groupmanagement/views.py:171 #: allianceauth/groupmanagement/views.py:167
msgid "Group does not exist" msgid "Group does not exist"
msgstr "El grupo no existe" msgstr "El grupo no existe"
#: allianceauth/groupmanagement/views.py:198 #: allianceauth/groupmanagement/views.py:194
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "Solicitud aceptada de %(mainchar)s a %(group)s" msgstr "Solicitud aceptada de %(mainchar)s a %(group)s"
#: allianceauth/groupmanagement/views.py:205 #: allianceauth/groupmanagement/views.py:201
#: allianceauth/groupmanagement/views.py:238 #: allianceauth/groupmanagement/views.py:234
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
@@ -765,79 +773,79 @@ msgstr ""
"Ocurrio un error cuando se intento procesar la informacion de %(mainchar)s " "Ocurrio un error cuando se intento procesar la informacion de %(mainchar)s "
"al grupo %(group)s." "al grupo %(group)s."
#: allianceauth/groupmanagement/views.py:231 #: allianceauth/groupmanagement/views.py:227
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "Se rechazo la solicitud de %(mainchar)s al grupo %(group)s." msgstr "Se rechazo la solicitud de %(mainchar)s al grupo %(group)s."
#: allianceauth/groupmanagement/views.py:267 #: allianceauth/groupmanagement/views.py:263
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "Se acepto la solicitud de %(mainchar)s para dejar el grupo %(group)s." msgstr "Se acepto la solicitud de %(mainchar)s para dejar el grupo %(group)s."
#: allianceauth/groupmanagement/views.py:273 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:307 #: allianceauth/groupmanagement/views.py:303
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to leave %(group)s." "%(mainchar)s to leave %(group)s."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:300 #: allianceauth/groupmanagement/views.py:296
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "" msgstr ""
"Se rechazo la solicitud de %(mainchar)s para dejar el grupo %(group)s." "Se rechazo la solicitud de %(mainchar)s para dejar el grupo %(group)s."
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:342
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:354
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "No puedes unirte a ese grupo" msgstr "No puedes unirte a ese grupo"
#: allianceauth/groupmanagement/views.py:352 #: allianceauth/groupmanagement/views.py:348
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:363
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:370 #: allianceauth/groupmanagement/views.py:366
#: allianceauth/groupmanagement/views.py:408 #: allianceauth/groupmanagement/views.py:404
#: allianceauth/hrapplications/templates/hrapplications/management.html:37 #: allianceauth/hrapplications/templates/hrapplications/management.html:37
#: allianceauth/hrapplications/templates/hrapplications/management.html:72 #: allianceauth/hrapplications/templates/hrapplications/management.html:72
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:144 #: allianceauth/hrapplications/templates/hrapplications/management.html:144
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:38 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:38
#: allianceauth/hrapplications/templates/hrapplications/view.html:20 #: allianceauth/hrapplications/templates/hrapplications/view.html:20
#: allianceauth/srp/templates/srp/data.html:125 #: allianceauth/srp/templates/srp/data.html:134
#: allianceauth/srp/templates/srp/management.html:81 #: allianceauth/srp/templates/srp/management.html:81
msgid "Pending" msgid "Pending"
msgstr "Pendiente" msgstr "Pendiente"
#: allianceauth/groupmanagement/views.py:376 #: allianceauth/groupmanagement/views.py:372
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "Solicitud enviada al grupo %(group)s." msgstr "Solicitud enviada al grupo %(group)s."
#: allianceauth/groupmanagement/views.py:387 #: allianceauth/groupmanagement/views.py:383
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "No puedes dejar el grupos" msgstr "No puedes dejar el grupos"
#: allianceauth/groupmanagement/views.py:392 #: allianceauth/groupmanagement/views.py:388
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "No eres miembro de ese grupo" msgstr "No eres miembro de ese grupo"
#: allianceauth/groupmanagement/views.py:401 #: allianceauth/groupmanagement/views.py:397
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "" msgstr ""
#: allianceauth/groupmanagement/views.py:414 #: allianceauth/groupmanagement/views.py:410
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "Solicitaste dejar el grupo %(group)s." msgstr "Solicitaste dejar el grupo %(group)s."
#: allianceauth/hrapplications/auth_hooks.py:10 #: allianceauth/hrapplications/auth_hooks.py:13
msgid "Applications" msgid "Applications"
msgstr "Solicitudes" msgstr "Solicitudes"
@@ -894,7 +902,7 @@ msgstr "Usuario"
#: allianceauth/hrapplications/templates/hrapplications/management.html:131 #: allianceauth/hrapplications/templates/hrapplications/management.html:131
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:28 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:28
#: allianceauth/hrapplications/templates/hrapplications/view.html:75 #: allianceauth/hrapplications/templates/hrapplications/view.html:75
#: allianceauth/srp/templates/srp/data.html:99 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:46
msgid "Actions" msgid "Actions"
msgstr "Acciones" msgstr "Acciones"
@@ -904,7 +912,7 @@ msgstr "Acciones"
#: allianceauth/hrapplications/templates/hrapplications/management.html:147 #: allianceauth/hrapplications/templates/hrapplications/management.html:147
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:40 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:40
#: allianceauth/hrapplications/templates/hrapplications/view.html:16 #: allianceauth/hrapplications/templates/hrapplications/view.html:16
#: allianceauth/srp/templates/srp/data.html:117 #: allianceauth/srp/templates/srp/data.html:126
msgid "Approved" msgid "Approved"
msgstr "Aprovado" msgstr "Aprovado"
@@ -912,7 +920,7 @@ msgstr "Aprovado"
#: allianceauth/hrapplications/templates/hrapplications/management.html:104 #: allianceauth/hrapplications/templates/hrapplications/management.html:104
#: allianceauth/hrapplications/templates/hrapplications/management.html:149 #: allianceauth/hrapplications/templates/hrapplications/management.html:149
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:42 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:42
#: allianceauth/srp/templates/srp/data.html:121 #: allianceauth/srp/templates/srp/data.html:130
msgid "Rejected" msgid "Rejected"
msgstr "Rechazado" msgstr "Rechazado"
@@ -1295,22 +1303,49 @@ msgstr "Contraseña"
msgid "Password must be at least 8 characters long." msgid "Password must be at least 8 characters long."
msgstr "La contraseña tiene que tener 8 caracteres de largo minimo" msgstr "La contraseña tiene que tener 8 caracteres de largo minimo"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:23 #: allianceauth/services/modules/discord/models.py:225
msgid "Discord Account Disabled"
msgstr ""
#: allianceauth/services/modules/discord/models.py:227
msgid ""
"Your Discord account was disabeled automatically by Auth. If you think this "
"was a mistake, please contact an admin."
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:18
msgid "Join the Discord server"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:22
msgid "Leave- and rejoin the Discord Server (Reset)"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:25
msgid "Leave the Discord server"
msgstr ""
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
msgid "Link Discord Server" msgid "Link Discord Server"
msgstr "Enlace a servidor de Discord" msgstr "Enlace a servidor de Discord"
#: allianceauth/services/modules/discord/views.py:26 #: allianceauth/services/modules/discord/views.py:30
msgid "Deactivated Discord account." msgid "Deactivated Discord account."
msgstr "" msgstr ""
#: allianceauth/services/modules/discord/views.py:29 #: allianceauth/services/modules/discord/views.py:36
#: allianceauth/services/modules/discord/views.py:41 #: allianceauth/services/modules/discord/views.py:59
#: allianceauth/services/modules/discord/views.py:65
msgid "An error occurred while processing your Discord account." msgid "An error occurred while processing your Discord account."
msgstr "" msgstr ""
#: allianceauth/services/modules/discord/views.py:62 #: allianceauth/services/modules/discord/views.py:102
msgid "Activated Discord account." msgid "Your Discord account has been successfully activated."
msgstr ""
#: allianceauth/services/modules/discord/views.py:108
msgid ""
"An error occurred while trying to activate your Discord account. Please try "
"again."
msgstr "" msgstr ""
#: allianceauth/services/modules/discourse/views.py:37 #: allianceauth/services/modules/discourse/views.py:37
@@ -1575,7 +1610,7 @@ msgstr "Servicio"
msgid "Domain" msgid "Domain"
msgstr "Dominio" msgstr "Dominio"
#: allianceauth/srp/auth_hooks.py:9 #: allianceauth/srp/auth_hooks.py:12
msgid "Ship Replacement" msgid "Ship Replacement"
msgstr "Reemplazo de Nave" msgstr "Reemplazo de Nave"
@@ -1589,7 +1624,7 @@ msgstr "Hora de flota"
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "Doctrina" msgstr "Doctrina"
#: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:89 #: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:90
msgid "Additional Info" msgid "Additional Info"
msgstr "Informacion Adicional" msgstr "Informacion Adicional"
@@ -1618,63 +1653,63 @@ msgstr "Crear SRP"
msgid "Give this link to the line members" msgid "Give this link to the line members"
msgstr "Entregar este enlace a los miembros" msgstr "Entregar este enlace a los miembros"
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:49
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "Informacion de SRP de la flota" msgstr "Informacion de SRP de la flota"
#: allianceauth/srp/templates/srp/data.html:53 #: allianceauth/srp/templates/srp/data.html:54
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "Marcar como Incompleto" msgstr "Marcar como Incompleto"
#: allianceauth/srp/templates/srp/data.html:57 #: allianceauth/srp/templates/srp/data.html:58
msgid "Mark Completed" msgid "Mark Completed"
msgstr "Marcar como Completo" msgstr "Marcar como Completo"
#: allianceauth/srp/templates/srp/data.html:69 #: allianceauth/srp/templates/srp/data.html:70
#: allianceauth/srp/templates/srp/data.html:145 #: allianceauth/srp/templates/srp/data.html:156
msgid "Total Losses:" msgid "Total Losses:"
msgstr "Perdidas Totales:" msgstr "Perdidas Totales:"
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:71
#: allianceauth/srp/templates/srp/data.html:146 #: allianceauth/srp/templates/srp/data.html:157
#: allianceauth/srp/templates/srp/management.html:30 #: allianceauth/srp/templates/srp/management.html:30
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "Costo Total:" msgstr "Costo Total:"
#: allianceauth/srp/templates/srp/data.html:78 #: allianceauth/srp/templates/srp/data.html:79
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:165
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "Estas seguro que quiere borrar las solicitudes de SRP" msgstr "Estas seguro que quiere borrar las solicitudes de SRP"
#: allianceauth/srp/templates/srp/data.html:87 #: allianceauth/srp/templates/srp/data.html:88
msgid "Pilot Name" msgid "Pilot Name"
msgstr "Nombre del Piloto" msgstr "Nombre del Piloto"
#: allianceauth/srp/templates/srp/data.html:88 #: allianceauth/srp/templates/srp/data.html:89
msgid "Killboard Link" msgid "Killboard Link"
msgstr "Enlace de la Muerte" msgstr "Enlace de la Muerte"
#: allianceauth/srp/templates/srp/data.html:90 #: allianceauth/srp/templates/srp/data.html:91
msgid "Ship Type" msgid "Ship Type"
msgstr "Tipo" msgstr "Tipo"
#: allianceauth/srp/templates/srp/data.html:91 #: allianceauth/srp/templates/srp/data.html:92
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "Monto de la perdida en ZKB" msgstr "Monto de la perdida en ZKB"
#: allianceauth/srp/templates/srp/data.html:92 #: allianceauth/srp/templates/srp/data.html:93
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "Costo del SRP" msgstr "Costo del SRP"
#: allianceauth/srp/templates/srp/data.html:93 #: allianceauth/srp/templates/srp/data.html:94
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "" msgstr ""
#: allianceauth/srp/templates/srp/data.html:96 #: allianceauth/srp/templates/srp/data.html:97
msgid "Post Time" msgid "Post Time"
msgstr "Tiempo" msgstr "Tiempo"
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:174
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "No hay solicitudes de SRP para esta flota." msgstr "No hay solicitudes de SRP para esta flota."
@@ -1866,32 +1901,30 @@ msgid "Current"
msgstr "Actual" msgstr "Actual"
#: allianceauth/templates/allianceauth/admin-status/overview.html:40 #: allianceauth/templates/allianceauth/admin-status/overview.html:40
msgid "Latest Major" msgid "Latest Stable"
msgstr "Ultimo Importante" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:46 #: allianceauth/templates/allianceauth/admin-status/overview.html:46
#: allianceauth/templates/allianceauth/admin-status/overview.html:56
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
msgid "Update available" msgid "Update available"
msgstr "Actualizacion Disponible" msgstr "Actualizacion Disponible"
#: allianceauth/templates/allianceauth/admin-status/overview.html:50 #: allianceauth/templates/allianceauth/admin-status/overview.html:51
msgid "Latest Minor" msgid "Latest Pre-Release"
msgstr "Ultimo no importante" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:60 #: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Latest Patch" msgid "Pre-Release available"
msgstr "Ultimo Parche" msgstr ""
#: allianceauth/templates/allianceauth/admin-status/overview.html:73 #: allianceauth/templates/allianceauth/admin-status/overview.html:65
msgid "Task Queue" msgid "Task Queue"
msgstr "Cola de Tareas" msgstr "Cola de Tareas"
#: allianceauth/templates/allianceauth/admin-status/overview.html:90 #: allianceauth/templates/allianceauth/admin-status/overview.html:82
msgid "Error retrieving task queue length" msgid "Error retrieving task queue length"
msgstr "Error al conseguir la cola de tareas" msgstr "Error al conseguir la cola de tareas"
#: allianceauth/templates/allianceauth/admin-status/overview.html:92 #: allianceauth/templates/allianceauth/admin-status/overview.html:84
#, python-format #, python-format
msgid "%(tasks)s task" msgid "%(tasks)s task"
msgid_plural "%(tasks)s tasks" msgid_plural "%(tasks)s tasks"

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -4,19 +4,19 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Lahty <js03js70@gmail.com>, 2020 # None None <khd1226543@gmail.com>, 2020
# Kim Hyundong <khd1226543@gmail.com>, 2020
# Seowon Jung <seowon@hawaii.edu>, 2020
# Olgeda Choi <undead.choi@gmail.com>, 2020 # Olgeda Choi <undead.choi@gmail.com>, 2020
# Seowon Jung <seowon@hawaii.edu>, 2020
# Lahty <js03js70@gmail.com>, 2020
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-05-08 00:57+0000\n" "POT-Creation-Date: 2020-10-11 03:43+0000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Olgeda Choi <undead.choi@gmail.com>, 2020\n" "Last-Translator: Lahty <js03js70@gmail.com>, 2020\n"
"Language-Team: Korean (Korea) (https://www.transifex.com/alliance-auth/teams/107430/ko_KR/)\n" "Language-Team: Korean (Korea) (https://www.transifex.com/alliance-auth/teams/107430/ko_KR/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -28,59 +28,60 @@ msgstr ""
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "해당 기능을 수행하려면 주 캐릭터가 요구됨. 아래에 하나를 추가하시오." msgstr "해당 기능을 수행하려면 주 캐릭터가 요구됨. 아래에 하나를 추가하시오."
#: allianceauth/authentication/forms.py:6 #: allianceauth/authentication/forms.py:5
msgid "Email" msgid "Email"
msgstr "이메일" msgstr "이메일"
#: allianceauth/authentication/models.py:76 #: allianceauth/authentication/models.py:78
msgid "State Changed"
msgstr "상태 변경됨"
#: allianceauth/authentication/models.py:77
#, python-format #, python-format
msgid "Your user state has been changed to %(state)s" msgid "State changed to: %s"
msgstr "사용자의 상태가 %(state)s변경됨" msgstr "상태가 %s로 변경됐습니다."
#: allianceauth/authentication/models.py:79
#, python-format
msgid "Your user's state is now: %(state)s"
msgstr "사용자의 상태는 %(state)s입니다."
#: allianceauth/authentication/templates/authentication/dashboard.html:5 #: allianceauth/authentication/templates/authentication/dashboard.html:5
#: allianceauth/authentication/templates/authentication/dashboard.html:8 #: allianceauth/authentication/templates/authentication/dashboard.html:8
#: allianceauth/templates/allianceauth/side-menu.html:10 #: allianceauth/templates/allianceauth/side-menu.html:11
msgid "Dashboard" msgid "Dashboard"
msgstr "대시보드" msgstr "대시보드"
#: allianceauth/authentication/templates/authentication/dashboard.html:17 #: allianceauth/authentication/templates/authentication/dashboard.html:18
#: allianceauth/corputils/templates/corputils/corpstats.html:116 #, python-format
#: allianceauth/corputils/templates/corputils/search.html:16 msgid ""
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:22 "\n"
#: allianceauth/hrapplications/templates/hrapplications/management.html:83 " Main Character (State: %(state)s)\n"
#: allianceauth/hrapplications/templates/hrapplications/management.html:128 " "
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:25 msgstr ""
#: allianceauth/hrapplications/templates/hrapplications/view.html:32 "\n"
msgid "Main Character" " 메인 캐릭터 (상태: %(state)s)\n"
msgstr "주 캐릭터" " "
#: allianceauth/authentication/templates/authentication/dashboard.html:77 #: allianceauth/authentication/templates/authentication/dashboard.html:81
msgid "No main character set." msgid "No main character set."
msgstr "주 캐릭터가 지정되지 않음" msgstr "주 캐릭터가 지정되지 않음"
#: allianceauth/authentication/templates/authentication/dashboard.html:84 #: allianceauth/authentication/templates/authentication/dashboard.html:88
msgid "Add Character" msgid "Add Character"
msgstr "캐릭터 추가" msgstr "캐릭터 추가"
#: allianceauth/authentication/templates/authentication/dashboard.html:88 #: allianceauth/authentication/templates/authentication/dashboard.html:92
msgid "Change Main" msgid "Change Main"
msgstr "주 캐릭터 변경" msgstr "주 캐릭터 변경"
#: allianceauth/authentication/templates/authentication/dashboard.html:97 #: allianceauth/authentication/templates/authentication/dashboard.html:101
msgid "Group Memberships" msgid "Group Memberships"
msgstr "그룹 멤버쉽" msgstr "그룹 멤버쉽"
#: allianceauth/authentication/templates/authentication/dashboard.html:117 #: allianceauth/authentication/templates/authentication/dashboard.html:121
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:41 #: allianceauth/hrapplications/templates/hrapplications/view.html:41
msgid "Characters" msgid "Characters"
msgstr "캐릭터" msgstr "캐릭터"
#: allianceauth/authentication/templates/authentication/dashboard.html:125 #: allianceauth/authentication/templates/authentication/dashboard.html:129
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:73 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:73
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:22 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:22
#: allianceauth/groupmanagement/templates/groupmanagement/groups.html:15 #: allianceauth/groupmanagement/templates/groupmanagement/groups.html:15
@@ -89,13 +90,13 @@ msgstr "캐릭터"
msgid "Name" msgid "Name"
msgstr "이름" msgstr "이름"
#: allianceauth/authentication/templates/authentication/dashboard.html:126 #: allianceauth/authentication/templates/authentication/dashboard.html:130
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticsview.html:23
#: allianceauth/hrapplications/templates/hrapplications/view.html:46 #: allianceauth/hrapplications/templates/hrapplications/view.html:46
msgid "Corp" msgid "Corp"
msgstr "콥" msgstr "콥"
#: allianceauth/authentication/templates/authentication/dashboard.html:127 #: allianceauth/authentication/templates/authentication/dashboard.html:131
#: allianceauth/corputils/templates/corputils/corpstats.html:77 #: allianceauth/corputils/templates/corputils/corpstats.html:77
#: allianceauth/hrapplications/templates/hrapplications/view.html:47 #: allianceauth/hrapplications/templates/hrapplications/view.html:47
msgid "Alliance" msgid "Alliance"
@@ -151,32 +152,32 @@ msgstr "주 캐릭터가 %(char)s로 변경됨"
#: allianceauth/authentication/views.py:89 #: allianceauth/authentication/views.py:89
#, python-format #, python-format
msgid "Added %(name)s to your account." msgid "Added %(name)s to your account."
msgstr "%(name)s을(를) 계정에 추가함" msgstr "계정에 %(name)s를 추가했습니다."
#: allianceauth/authentication/views.py:91 #: allianceauth/authentication/views.py:91
#, python-format #, python-format
msgid "Failed to add %(name)s to your account: they already have an account." msgid "Failed to add %(name)s to your account: they already have an account."
msgstr "%(name)s을(를) 계정에 추가하는데 실패함. 이미 추가되어있음." msgstr "계정에 %(name)s를 추가하지 못했습니다. 이미 추가된 계정입니다."
#: allianceauth/authentication/views.py:130 #: allianceauth/authentication/views.py:130
msgid "Unable to authenticate as the selected character." msgid "Unable to authenticate as the selected character."
msgstr "선택한 캐릭터로 인증을 수행할 수 없음" msgstr "선택한 캐릭터로 인증을 수행할 수 없음"
#: allianceauth/authentication/views.py:148 #: allianceauth/authentication/views.py:146
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "등록토큰 만료" msgstr "등록토큰 만료"
#: allianceauth/authentication/views.py:200 #: allianceauth/authentication/views.py:201
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "확인 메일 전송됨. 다음 링크를 눌러 이메일 주소를 확인하세요." msgstr "확인 메일 전송됨. 다음 링크를 눌러 이메일 주소를 확인하세요."
#: allianceauth/authentication/views.py:205 #: allianceauth/authentication/views.py:206
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "이메일 주소가 확인되었습니다. 로그인 해주세요." msgstr "이메일 주소가 확인되었습니다. 로그인 해주세요."
#: allianceauth/authentication/views.py:210 #: allianceauth/authentication/views.py:211
msgid "Registraion of new accounts it not allowed at this time." msgid "Registraion of new accounts it not allowed at this time."
msgstr "현재 새로운 계정 등록은 받지않습니다." msgstr "현재 새로운 계정 등록은 받지않습니다."
@@ -227,8 +228,8 @@ msgstr "마지막 업데이트"
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:28 #: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkview.html:28
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:27 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:27
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:29
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:37 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:51
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:96 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:110
msgid "Character" msgid "Character"
msgstr "캐릭터" msgstr "캐릭터"
@@ -250,6 +251,16 @@ msgstr "콥"
msgid "Killboard" msgid "Killboard"
msgstr "킬보드" msgstr "킬보드"
#: allianceauth/corputils/templates/corputils/corpstats.html:116
#: allianceauth/corputils/templates/corputils/search.html:16
#: allianceauth/fleetactivitytracking/templates/fleetactivitytracking/fatlinkstatisticscorpview.html:22
#: allianceauth/hrapplications/templates/hrapplications/management.html:83
#: allianceauth/hrapplications/templates/hrapplications/management.html:128
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:25
#: allianceauth/hrapplications/templates/hrapplications/view.html:32
msgid "Main Character"
msgstr "주 캐릭터"
#: allianceauth/corputils/templates/corputils/corpstats.html:117 #: allianceauth/corputils/templates/corputils/corpstats.html:117
#: allianceauth/corputils/templates/corputils/search.html:17 #: allianceauth/corputils/templates/corputils/search.html:17
msgid "Main Corporation" msgid "Main Corporation"
@@ -531,6 +542,11 @@ msgstr "플릿 참여 등록됨"
msgid "FAT link has expired." msgid "FAT link has expired."
msgstr "플릿활동추적 링크 기한만료" msgstr "플릿활동추적 링크 기한만료"
#: allianceauth/groupmanagement/auth_hooks.py:16
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
msgid "Group Management"
msgstr "그룹 관리"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
msgid "Audit Log" msgid "Audit Log"
@@ -583,8 +599,8 @@ msgid "Portrait"
msgstr "포트레잇" msgstr "포트레잇"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:30 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembers.html:30
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:38 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:52
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:97 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:111
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:23 #: allianceauth/permissions_tool/templates/permissions_tool/audit.html:23
msgid "Organization" msgid "Organization"
msgstr "조직" msgstr "조직"
@@ -603,7 +619,7 @@ msgstr "그룹 멤버쉽"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40
#: allianceauth/templates/allianceauth/side-menu.html:15 #: allianceauth/templates/allianceauth/side-menu.html:16
msgid "Groups" msgid "Groups"
msgstr "그룹" msgstr "그룹"
@@ -617,7 +633,7 @@ msgstr "설명"
#: allianceauth/hrapplications/templates/hrapplications/management.html:85 #: allianceauth/hrapplications/templates/hrapplications/management.html:85
#: allianceauth/hrapplications/templates/hrapplications/management.html:130 #: allianceauth/hrapplications/templates/hrapplications/management.html:130
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/srp/templates/srp/data.html:97 #: allianceauth/srp/templates/srp/data.html:98
msgid "Status" msgid "Status"
msgstr "상태" msgstr "상태"
@@ -647,8 +663,8 @@ msgid "Audit Members"
msgstr "멤버 검사" msgstr "멤버 검사"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:56 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:56
msgid "Copy Direrct Join Link" msgid "Copy Direct Join Link"
msgstr "" msgstr "직접 참여 링크 복사"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:68 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:68
msgid "No groups to list." msgid "No groups to list."
@@ -679,37 +695,37 @@ msgstr "사용 가능한 그룹 없음."
msgid "Groups Management" msgid "Groups Management"
msgstr "그룹 관리" msgstr "그룹 관리"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:23 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:25
msgid "Join Requests" msgid "Join Requests"
msgstr "가입 요청" msgstr "가입 요청"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:24 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:33
msgid "Leave Requests" msgid "Leave Requests"
msgstr "탈퇴 요청" msgstr "탈퇴 요청"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:39 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:53
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:98 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:112
#: allianceauth/permissions_tool/templates/permissions_tool/audit.html:20 #: allianceauth/permissions_tool/templates/permissions_tool/audit.html:20
#: allianceauth/services/modules/openfire/forms.py:6 #: allianceauth/services/modules/openfire/forms.py:6
msgid "Group" msgid "Group"
msgstr "그룹" msgstr "그룹"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:71 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:85
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:130 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:144
msgid "Accept" msgid "Accept"
msgstr "수락" msgstr "수락"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:74 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:88
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:133 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:147
#: allianceauth/hrapplications/templates/hrapplications/view.html:85 #: allianceauth/hrapplications/templates/hrapplications/view.html:85
msgid "Reject" msgid "Reject"
msgstr "거절" msgstr "거절"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:83 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:97
msgid "No group add requests." msgid "No group add requests."
msgstr "가입 요청 없음" msgstr "가입 요청 없음"
#: allianceauth/groupmanagement/templates/groupmanagement/index.html:142 #: allianceauth/groupmanagement/templates/groupmanagement/index.html:156
msgid "No group leave requests." msgid "No group leave requests."
msgstr "탈퇴 요청 없음" msgstr "탈퇴 요청 없음"
@@ -717,11 +733,6 @@ msgstr "탈퇴 요청 없음"
msgid "Toggle navigation" msgid "Toggle navigation"
msgstr "네비게이션 전환" msgstr "네비게이션 전환"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
#: allianceauth/templates/allianceauth/side-menu.html:23
msgid "Group Management"
msgstr "그룹 관리"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21 #: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21
msgid "Group Requests" msgid "Group Requests"
msgstr "그룹 요청" msgstr "그룹 요청"
@@ -730,104 +741,104 @@ msgstr "그룹 요청"
msgid "Group Membership" msgid "Group Membership"
msgstr "그룹 멤버쉽" msgstr "그룹 멤버쉽"
#: allianceauth/groupmanagement/views.py:166 #: allianceauth/groupmanagement/views.py:162
#, python-format #, python-format
msgid "Removed user %(user)s from group %(group)s." msgid "Removed user %(user)s from group %(group)s."
msgstr "유저 %(user)s이(가) %(group)s에서 제거됨." msgstr "유저 %(user)s이(가) %(group)s에서 제거됨."
#: allianceauth/groupmanagement/views.py:168 #: allianceauth/groupmanagement/views.py:164
msgid "User does not exist in that group" msgid "User does not exist in that group"
msgstr "유저가 해당 그룹에 존재하지 않음." msgstr "유저가 해당 그룹에 존재하지 않음."
#: allianceauth/groupmanagement/views.py:171 #: allianceauth/groupmanagement/views.py:167
msgid "Group does not exist" msgid "Group does not exist"
msgstr "그룹이 존재하지 않음." msgstr "그룹이 존재하지 않음."
#: allianceauth/groupmanagement/views.py:198 #: allianceauth/groupmanagement/views.py:194
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to %(group)s." msgid "Accepted application from %(mainchar)s to %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 신청 수락" msgstr "%(mainchar)s의 %(group)s 그룹 신청 수락"
#: allianceauth/groupmanagement/views.py:205 #: allianceauth/groupmanagement/views.py:201
#: allianceauth/groupmanagement/views.py:238 #: allianceauth/groupmanagement/views.py:234
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to %(group)s." "%(mainchar)s to %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 신청을 처리하는 중 알 수 없는 에러 발생" msgstr "%(mainchar)s의 %(group)s 그룹 신청을 처리하는 중 알 수 없는 에러 발생"
#: allianceauth/groupmanagement/views.py:231 #: allianceauth/groupmanagement/views.py:227
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to %(group)s." msgid "Rejected application from %(mainchar)s to %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 신청 거절" msgstr "%(mainchar)s의 %(group)s 그룹 신청 거절"
#: allianceauth/groupmanagement/views.py:267 #: allianceauth/groupmanagement/views.py:263
#, python-format #, python-format
msgid "Accepted application from %(mainchar)s to leave %(group)s." msgid "Accepted application from %(mainchar)s to leave %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴 수락" msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴 수락"
#: allianceauth/groupmanagement/views.py:273 #: allianceauth/groupmanagement/views.py:269
#: allianceauth/groupmanagement/views.py:307 #: allianceauth/groupmanagement/views.py:303
#, python-format #, python-format
msgid "" msgid ""
"An unhandled error occurred while processing the application from " "An unhandled error occurred while processing the application from "
"%(mainchar)s to leave %(group)s." "%(mainchar)s to leave %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴를 처리하는 중 알 수 없는 에러 발생" msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴를 처리하는 중 알 수 없는 에러 발생"
#: allianceauth/groupmanagement/views.py:300 #: allianceauth/groupmanagement/views.py:296
#, python-format #, python-format
msgid "Rejected application from %(mainchar)s to leave %(group)s." msgid "Rejected application from %(mainchar)s to leave %(group)s."
msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴 거절" msgstr "%(mainchar)s의 %(group)s 그룹 탈퇴 거절"
#: allianceauth/groupmanagement/views.py:346 #: allianceauth/groupmanagement/views.py:342
#: allianceauth/groupmanagement/views.py:358 #: allianceauth/groupmanagement/views.py:354
msgid "You cannot join that group" msgid "You cannot join that group"
msgstr "해당 그룹에 참여할 수 없습니다." msgstr "해당 그룹에 참여할 수 없습니다."
#: allianceauth/groupmanagement/views.py:352 #: allianceauth/groupmanagement/views.py:348
msgid "You are already a member of that group." msgid "You are already a member of that group."
msgstr "이미 해당 그룹에 가입되어 있습니다." msgstr "이미 해당 그룹에 가입되어 있습니다."
#: allianceauth/groupmanagement/views.py:367 #: allianceauth/groupmanagement/views.py:363
msgid "You already have a pending application for that group." msgid "You already have a pending application for that group."
msgstr "해당 그룹에 대한 참여신청이 보류되었습니다." msgstr "해당 그룹에 대한 참여신청이 보류되었습니다."
#: allianceauth/groupmanagement/views.py:370 #: allianceauth/groupmanagement/views.py:366
#: allianceauth/groupmanagement/views.py:408 #: allianceauth/groupmanagement/views.py:404
#: allianceauth/hrapplications/templates/hrapplications/management.html:37 #: allianceauth/hrapplications/templates/hrapplications/management.html:37
#: allianceauth/hrapplications/templates/hrapplications/management.html:72 #: allianceauth/hrapplications/templates/hrapplications/management.html:72
#: allianceauth/hrapplications/templates/hrapplications/management.html:99 #: allianceauth/hrapplications/templates/hrapplications/management.html:99
#: allianceauth/hrapplications/templates/hrapplications/management.html:144 #: allianceauth/hrapplications/templates/hrapplications/management.html:144
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:38 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:38
#: allianceauth/hrapplications/templates/hrapplications/view.html:20 #: allianceauth/hrapplications/templates/hrapplications/view.html:20
#: allianceauth/srp/templates/srp/data.html:125 #: allianceauth/srp/templates/srp/data.html:134
#: allianceauth/srp/templates/srp/management.html:81 #: allianceauth/srp/templates/srp/management.html:81
msgid "Pending" msgid "Pending"
msgstr "보류 중" msgstr "보류 중"
#: allianceauth/groupmanagement/views.py:376 #: allianceauth/groupmanagement/views.py:372
#, python-format #, python-format
msgid "Applied to group %(group)s." msgid "Applied to group %(group)s."
msgstr "%(group)s그룹에 지원하였음." msgstr "%(group)s그룹에 지원하였음."
#: allianceauth/groupmanagement/views.py:387 #: allianceauth/groupmanagement/views.py:383
msgid "You cannot leave that group" msgid "You cannot leave that group"
msgstr "해당 그룹을 떠날 수 없습니다." msgstr "해당 그룹을 떠날 수 없습니다."
#: allianceauth/groupmanagement/views.py:392 #: allianceauth/groupmanagement/views.py:388
msgid "You are not a member of that group" msgid "You are not a member of that group"
msgstr "해당그룹의 멤버가 아닙니다." msgstr "해당그룹의 멤버가 아닙니다."
#: allianceauth/groupmanagement/views.py:401 #: allianceauth/groupmanagement/views.py:397
msgid "You already have a pending leave request for that group." msgid "You already have a pending leave request for that group."
msgstr "해당 그룹의 탈퇴 신청이 접수된 상태입니다." msgstr "해당 그룹의 탈퇴 신청이 접수된 상태입니다."
#: allianceauth/groupmanagement/views.py:414 #: allianceauth/groupmanagement/views.py:410
#, python-format #, python-format
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "%(group)s그룹의 탈퇴가 신청됨." msgstr "%(group)s그룹의 탈퇴가 신청됨."
#: allianceauth/hrapplications/auth_hooks.py:10 #: allianceauth/hrapplications/auth_hooks.py:13
msgid "Applications" msgid "Applications"
msgstr "지원" msgstr "지원"
@@ -884,7 +895,7 @@ msgstr "사용자명"
#: allianceauth/hrapplications/templates/hrapplications/management.html:131 #: allianceauth/hrapplications/templates/hrapplications/management.html:131
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:28 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:28
#: allianceauth/hrapplications/templates/hrapplications/view.html:75 #: allianceauth/hrapplications/templates/hrapplications/view.html:75
#: allianceauth/srp/templates/srp/data.html:99 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:46
msgid "Actions" msgid "Actions"
msgstr "활동" msgstr "활동"
@@ -894,7 +905,7 @@ msgstr "활동"
#: allianceauth/hrapplications/templates/hrapplications/management.html:147 #: allianceauth/hrapplications/templates/hrapplications/management.html:147
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:40 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:40
#: allianceauth/hrapplications/templates/hrapplications/view.html:16 #: allianceauth/hrapplications/templates/hrapplications/view.html:16
#: allianceauth/srp/templates/srp/data.html:117 #: allianceauth/srp/templates/srp/data.html:126
msgid "Approved" msgid "Approved"
msgstr "승인" msgstr "승인"
@@ -902,7 +913,7 @@ msgstr "승인"
#: allianceauth/hrapplications/templates/hrapplications/management.html:104 #: allianceauth/hrapplications/templates/hrapplications/management.html:104
#: allianceauth/hrapplications/templates/hrapplications/management.html:149 #: allianceauth/hrapplications/templates/hrapplications/management.html:149
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:42 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:42
#: allianceauth/srp/templates/srp/data.html:121 #: allianceauth/srp/templates/srp/data.html:130
msgid "Rejected" msgid "Rejected"
msgstr "거절" msgstr "거절"
@@ -1285,23 +1296,50 @@ msgstr "비밀번호"
msgid "Password must be at least 8 characters long." msgid "Password must be at least 8 characters long."
msgstr "비밀번호는 8글자 이상이어야 합니다." msgstr "비밀번호는 8글자 이상이어야 합니다."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:23 #: allianceauth/services/modules/discord/models.py:225
msgid "Discord Account Disabled"
msgstr "디스코드 계정 비활성화"
#: allianceauth/services/modules/discord/models.py:227
msgid ""
"Your Discord account was disabeled automatically by Auth. If you think this "
"was a mistake, please contact an admin."
msgstr "Auth에 의해 자동으로 디스코드 계정이 비활성화됐습니다. 원치 않는 사항일 경우, 관리자에게 문의해 주세요."
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:18
msgid "Join the Discord server"
msgstr "디스코드 서버 입장"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:22
msgid "Leave- and rejoin the Discord Server (Reset)"
msgstr "디스코드 서버를 나가고 다시 입장하기 (리셋)"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:25
msgid "Leave the Discord server"
msgstr "디스코드 서버 나가기"
#: allianceauth/services/modules/discord/templates/services/discord/discord_service_ctrl.html:32
msgid "Link Discord Server" msgid "Link Discord Server"
msgstr "디스코드 서버 링크" msgstr "디스코드 서버 링크"
#: allianceauth/services/modules/discord/views.py:26 #: allianceauth/services/modules/discord/views.py:30
msgid "Deactivated Discord account." msgid "Deactivated Discord account."
msgstr "디스코드 계정 해제 완료" msgstr "디스코드 계정 해제 완료"
#: allianceauth/services/modules/discord/views.py:29 #: allianceauth/services/modules/discord/views.py:36
#: allianceauth/services/modules/discord/views.py:41 #: allianceauth/services/modules/discord/views.py:59
#: allianceauth/services/modules/discord/views.py:65
msgid "An error occurred while processing your Discord account." msgid "An error occurred while processing your Discord account."
msgstr "디스코드 계정 처리 중 오류가 발생했습니다." msgstr "디스코드 계정 처리 중 오류가 발생했습니다."
#: allianceauth/services/modules/discord/views.py:62 #: allianceauth/services/modules/discord/views.py:102
msgid "Activated Discord account." msgid "Your Discord account has been successfully activated."
msgstr "디스코드 계정 활성화 완료" msgstr "디스코드 계정과 성공적으로 연동됐습니다."
#: allianceauth/services/modules/discord/views.py:108
msgid ""
"An error occurred while trying to activate your Discord account. Please try "
"again."
msgstr "디스코드 계정 연동 중 오류가 발생했습니다. 다시 시도해 주세요."
#: allianceauth/services/modules/discourse/views.py:37 #: allianceauth/services/modules/discourse/views.py:37
msgid "You are not authorized to access Discourse." msgid "You are not authorized to access Discourse."
@@ -1565,7 +1603,7 @@ msgstr "서드파티"
msgid "Domain" msgid "Domain"
msgstr "도메인" msgstr "도메인"
#: allianceauth/srp/auth_hooks.py:9 #: allianceauth/srp/auth_hooks.py:12
msgid "Ship Replacement" msgid "Ship Replacement"
msgstr "SRP" msgstr "SRP"
@@ -1579,7 +1617,7 @@ msgstr "플릿 시간"
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "플릿 독트린" msgstr "플릿 독트린"
#: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:89 #: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:90
msgid "Additional Info" msgid "Additional Info"
msgstr "추가 기재 사항" msgstr "추가 기재 사항"
@@ -1608,63 +1646,63 @@ msgstr "SRP 보상 플릿 생성"
msgid "Give this link to the line members" msgid "Give this link to the line members"
msgstr "이 링크를 직계 멤버들에게 전달" msgstr "이 링크를 직계 멤버들에게 전달"
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:49
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "SRP 보상 플릿 데이터" msgstr "SRP 보상 플릿 데이터"
#: allianceauth/srp/templates/srp/data.html:53 #: allianceauth/srp/templates/srp/data.html:54
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "표시 미완료" msgstr "표시 미완료"
#: allianceauth/srp/templates/srp/data.html:57 #: allianceauth/srp/templates/srp/data.html:58
msgid "Mark Completed" msgid "Mark Completed"
msgstr "표시 완료" msgstr "표시 완료"
#: allianceauth/srp/templates/srp/data.html:69 #: allianceauth/srp/templates/srp/data.html:70
#: allianceauth/srp/templates/srp/data.html:145 #: allianceauth/srp/templates/srp/data.html:156
msgid "Total Losses:" msgid "Total Losses:"
msgstr "전체 손실:" msgstr "전체 손실:"
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:71
#: allianceauth/srp/templates/srp/data.html:146 #: allianceauth/srp/templates/srp/data.html:157
#: allianceauth/srp/templates/srp/management.html:30 #: allianceauth/srp/templates/srp/management.html:30
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "전체 ISK 비용:" msgstr "전체 ISK 비용:"
#: allianceauth/srp/templates/srp/data.html:78 #: allianceauth/srp/templates/srp/data.html:79
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:165
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "SRP 보상 요청을 삭제하시겠습니까?" msgstr "SRP 보상 요청을 삭제하시겠습니까?"
#: allianceauth/srp/templates/srp/data.html:87 #: allianceauth/srp/templates/srp/data.html:88
msgid "Pilot Name" msgid "Pilot Name"
msgstr "파일럿 이름" msgstr "파일럿 이름"
#: allianceauth/srp/templates/srp/data.html:88 #: allianceauth/srp/templates/srp/data.html:89
msgid "Killboard Link" msgid "Killboard Link"
msgstr "킬보드 링크" msgstr "킬보드 링크"
#: allianceauth/srp/templates/srp/data.html:90 #: allianceauth/srp/templates/srp/data.html:91
msgid "Ship Type" msgid "Ship Type"
msgstr "함선 종류" msgstr "함선 종류"
#: allianceauth/srp/templates/srp/data.html:91 #: allianceauth/srp/templates/srp/data.html:92
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "킬보드상 손실 금액" msgstr "킬보드상 손실 금액"
#: allianceauth/srp/templates/srp/data.html:92 #: allianceauth/srp/templates/srp/data.html:93
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "SRP 보상 비용" msgstr "SRP 보상 비용"
#: allianceauth/srp/templates/srp/data.html:93 #: allianceauth/srp/templates/srp/data.html:94
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "금액을 수정하려면 클릭, 저장을 하고 다음으로 가려면 엔터, 취소를 하려면 ESC를 누르세요. " msgstr "금액을 수정하려면 클릭, 저장을 하고 다음으로 가려면 엔터, 취소를 하려면 ESC를 누르세요. "
#: allianceauth/srp/templates/srp/data.html:96 #: allianceauth/srp/templates/srp/data.html:97
msgid "Post Time" msgid "Post Time"
msgstr "작성 시간" msgstr "작성 시간"
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:174
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "이 플릿에는 SRP 보상 요청이 없습니다." msgstr "이 플릿에는 SRP 보상 요청이 없습니다."
@@ -1856,32 +1894,30 @@ msgid "Current"
msgstr "현재" msgstr "현재"
#: allianceauth/templates/allianceauth/admin-status/overview.html:40 #: allianceauth/templates/allianceauth/admin-status/overview.html:40
msgid "Latest Major" msgid "Latest Stable"
msgstr "최근 주요 사항" msgstr "최신 안정화 버전"
#: allianceauth/templates/allianceauth/admin-status/overview.html:46 #: allianceauth/templates/allianceauth/admin-status/overview.html:46
#: allianceauth/templates/allianceauth/admin-status/overview.html:56
#: allianceauth/templates/allianceauth/admin-status/overview.html:66
msgid "Update available" msgid "Update available"
msgstr "업데이트 가능" msgstr "업데이트 가능"
#: allianceauth/templates/allianceauth/admin-status/overview.html:50 #: allianceauth/templates/allianceauth/admin-status/overview.html:51
msgid "Latest Minor" msgid "Latest Pre-Release"
msgstr "최근 기타 사항" msgstr "최신 사전 출시 버전"
#: allianceauth/templates/allianceauth/admin-status/overview.html:60 #: allianceauth/templates/allianceauth/admin-status/overview.html:57
msgid "Latest Patch" msgid "Pre-Release available"
msgstr "최근 패치" msgstr "사전 출시 사용 가능"
#: allianceauth/templates/allianceauth/admin-status/overview.html:73 #: allianceauth/templates/allianceauth/admin-status/overview.html:65
msgid "Task Queue" msgid "Task Queue"
msgstr "대기 중인 할 일" msgstr "대기 중인 할 일"
#: allianceauth/templates/allianceauth/admin-status/overview.html:90 #: allianceauth/templates/allianceauth/admin-status/overview.html:82
msgid "Error retrieving task queue length" msgid "Error retrieving task queue length"
msgstr "대기 중인 할 일 목록 회수 에러" msgstr "대기 중인 할 일 목록 회수 에러"
#: allianceauth/templates/allianceauth/admin-status/overview.html:92 #: allianceauth/templates/allianceauth/admin-status/overview.html:84
#, python-format #, python-format
msgid "%(tasks)s task" msgid "%(tasks)s task"
msgid_plural "%(tasks)s tasks" msgid_plural "%(tasks)s tasks"

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-07-29 04:56+0000\n" "POT-Creation-Date: 2020-10-11 03:43+0000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Alexander Gess <de.alex.gess@gmail.com>, 2020\n" "Last-Translator: Alexander Gess <de.alex.gess@gmail.com>, 2020\n"
"Language-Team: Russian (https://www.transifex.com/alliance-auth/teams/107430/ru/)\n" "Language-Team: Russian (https://www.transifex.com/alliance-auth/teams/107430/ru/)\n"
@@ -25,7 +25,7 @@ msgstr ""
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "Необходимо указать основного персонажа. Добавим?" msgstr "Необходимо указать основного персонажа. Добавим?"
#: allianceauth/authentication/forms.py:6 #: allianceauth/authentication/forms.py:5
msgid "Email" msgid "Email"
msgstr "Email" msgstr "Email"
@@ -41,7 +41,7 @@ msgstr "Статус пилота: %(state)s"
#: allianceauth/authentication/templates/authentication/dashboard.html:5 #: allianceauth/authentication/templates/authentication/dashboard.html:5
#: allianceauth/authentication/templates/authentication/dashboard.html:8 #: allianceauth/authentication/templates/authentication/dashboard.html:8
#: allianceauth/templates/allianceauth/side-menu.html:12 #: allianceauth/templates/allianceauth/side-menu.html:11
msgid "Dashboard" msgid "Dashboard"
msgstr "Панель показателей" msgstr "Панель показателей"
@@ -163,21 +163,21 @@ msgstr "Персонаж %(name)s уже добавлен."
msgid "Unable to authenticate as the selected character." msgid "Unable to authenticate as the selected character."
msgstr "Невозможно авторизировать этого персонажа. " msgstr "Невозможно авторизировать этого персонажа. "
#: allianceauth/authentication/views.py:148 #: allianceauth/authentication/views.py:146
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "Регистрационный токен просрочен." msgstr "Регистрационный токен просрочен."
#: allianceauth/authentication/views.py:200 #: allianceauth/authentication/views.py:201
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "Отправить подтверждающее письмо. Пожалуйста, подтвердите почту. " msgstr "Отправить подтверждающее письмо. Пожалуйста, подтвердите почту. "
#: allianceauth/authentication/views.py:205 #: allianceauth/authentication/views.py:206
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "Подтвердите Ваш email адрес. Зайти для подтверждения. " msgstr "Подтвердите Ваш email адрес. Зайти для подтверждения. "
#: allianceauth/authentication/views.py:210 #: allianceauth/authentication/views.py:211
msgid "Registraion of new accounts it not allowed at this time." msgid "Registraion of new accounts it not allowed at this time."
msgstr "Регистрация нового аккаунта сейчас невозможна." msgstr "Регистрация нового аккаунта сейчас невозможна."
@@ -548,6 +548,11 @@ msgstr "Флотовое участие зарегистрированно."
msgid "FAT link has expired." msgid "FAT link has expired."
msgstr "ФлАк ссылка устарела" msgstr "ФлАк ссылка устарела"
#: allianceauth/groupmanagement/auth_hooks.py:16
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
msgid "Group Management"
msgstr "Управление Группой"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
msgid "Audit Log" msgid "Audit Log"
@@ -620,7 +625,7 @@ msgstr "Участники группы"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40
#: allianceauth/templates/allianceauth/side-menu.html:17 #: allianceauth/templates/allianceauth/side-menu.html:16
msgid "Groups" msgid "Groups"
msgstr "Группы" msgstr "Группы"
@@ -634,7 +639,7 @@ msgstr "Описание"
#: allianceauth/hrapplications/templates/hrapplications/management.html:85 #: allianceauth/hrapplications/templates/hrapplications/management.html:85
#: allianceauth/hrapplications/templates/hrapplications/management.html:130 #: allianceauth/hrapplications/templates/hrapplications/management.html:130
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/srp/templates/srp/data.html:97 #: allianceauth/srp/templates/srp/data.html:98
msgid "Status" msgid "Status"
msgstr "Статус" msgstr "Статус"
@@ -734,11 +739,6 @@ msgstr "Нет групповых запросов на выход"
msgid "Toggle navigation" msgid "Toggle navigation"
msgstr "Проложить маршрут" msgstr "Проложить маршрут"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
#: allianceauth/templates/allianceauth/side-menu.html:25
msgid "Group Management"
msgstr "Управление Группой"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21 #: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21
msgid "Group Requests" msgid "Group Requests"
msgstr "Групповой запрос" msgstr "Групповой запрос"
@@ -821,7 +821,7 @@ msgstr "Вы уже подали заявку на вступление этой
#: allianceauth/hrapplications/templates/hrapplications/management.html:144 #: allianceauth/hrapplications/templates/hrapplications/management.html:144
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:38 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:38
#: allianceauth/hrapplications/templates/hrapplications/view.html:20 #: allianceauth/hrapplications/templates/hrapplications/view.html:20
#: allianceauth/srp/templates/srp/data.html:125 #: allianceauth/srp/templates/srp/data.html:134
#: allianceauth/srp/templates/srp/management.html:81 #: allianceauth/srp/templates/srp/management.html:81
msgid "Pending" msgid "Pending"
msgstr "Ожидание" msgstr "Ожидание"
@@ -848,7 +848,7 @@ msgstr "Ваш запрос находится на рассмотрении"
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "Запрос на выход из группы %(group)s." msgstr "Запрос на выход из группы %(group)s."
#: allianceauth/hrapplications/auth_hooks.py:10 #: allianceauth/hrapplications/auth_hooks.py:13
msgid "Applications" msgid "Applications"
msgstr "Запросы" msgstr "Запросы"
@@ -905,7 +905,7 @@ msgstr "Пользователь"
#: allianceauth/hrapplications/templates/hrapplications/management.html:131 #: allianceauth/hrapplications/templates/hrapplications/management.html:131
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:28 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:28
#: allianceauth/hrapplications/templates/hrapplications/view.html:75 #: allianceauth/hrapplications/templates/hrapplications/view.html:75
#: allianceauth/srp/templates/srp/data.html:99 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:46
msgid "Actions" msgid "Actions"
msgstr "Действия" msgstr "Действия"
@@ -915,7 +915,7 @@ msgstr "Действия"
#: allianceauth/hrapplications/templates/hrapplications/management.html:147 #: allianceauth/hrapplications/templates/hrapplications/management.html:147
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:40 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:40
#: allianceauth/hrapplications/templates/hrapplications/view.html:16 #: allianceauth/hrapplications/templates/hrapplications/view.html:16
#: allianceauth/srp/templates/srp/data.html:117 #: allianceauth/srp/templates/srp/data.html:126
msgid "Approved" msgid "Approved"
msgstr "Проверено" msgstr "Проверено"
@@ -923,7 +923,7 @@ msgstr "Проверено"
#: allianceauth/hrapplications/templates/hrapplications/management.html:104 #: allianceauth/hrapplications/templates/hrapplications/management.html:104
#: allianceauth/hrapplications/templates/hrapplications/management.html:149 #: allianceauth/hrapplications/templates/hrapplications/management.html:149
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:42 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:42
#: allianceauth/srp/templates/srp/data.html:121 #: allianceauth/srp/templates/srp/data.html:130
msgid "Rejected" msgid "Rejected"
msgstr "Отменено " msgstr "Отменено "
@@ -1306,11 +1306,11 @@ msgstr "Пароль"
msgid "Password must be at least 8 characters long." msgid "Password must be at least 8 characters long."
msgstr "Пароль должен быть не менее 8 символов." msgstr "Пароль должен быть не менее 8 символов."
#: allianceauth/services/modules/discord/models.py:224 #: allianceauth/services/modules/discord/models.py:225
msgid "Discord Account Disabled" msgid "Discord Account Disabled"
msgstr "Discord персонаж отключен" msgstr "Discord персонаж отключен"
#: allianceauth/services/modules/discord/models.py:226 #: allianceauth/services/modules/discord/models.py:227
msgid "" msgid ""
"Your Discord account was disabeled automatically by Auth. If you think this " "Your Discord account was disabeled automatically by Auth. If you think this "
"was a mistake, please contact an admin." "was a mistake, please contact an admin."
@@ -1623,7 +1623,7 @@ msgstr "Сервис"
msgid "Domain" msgid "Domain"
msgstr "Домен" msgstr "Домен"
#: allianceauth/srp/auth_hooks.py:9 #: allianceauth/srp/auth_hooks.py:12
msgid "Ship Replacement" msgid "Ship Replacement"
msgstr "Замена корабля" msgstr "Замена корабля"
@@ -1637,7 +1637,7 @@ msgstr "Флотовое время"
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "Флотовая Доктрина" msgstr "Флотовая Доктрина"
#: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:89 #: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:90
msgid "Additional Info" msgid "Additional Info"
msgstr "Дополнительная информация" msgstr "Дополнительная информация"
@@ -1666,63 +1666,63 @@ msgstr "Создать SRP Флот"
msgid "Give this link to the line members" msgid "Give this link to the line members"
msgstr "Поделиться ссылкой с рядовыми участниками" msgstr "Поделиться ссылкой с рядовыми участниками"
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:49
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "SRP данные флота" msgstr "SRP данные флота"
#: allianceauth/srp/templates/srp/data.html:53 #: allianceauth/srp/templates/srp/data.html:54
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "Пометить незаконченным" msgstr "Пометить незаконченным"
#: allianceauth/srp/templates/srp/data.html:57 #: allianceauth/srp/templates/srp/data.html:58
msgid "Mark Completed" msgid "Mark Completed"
msgstr "Пометить законченным" msgstr "Пометить законченным"
#: allianceauth/srp/templates/srp/data.html:69 #: allianceauth/srp/templates/srp/data.html:70
#: allianceauth/srp/templates/srp/data.html:145 #: allianceauth/srp/templates/srp/data.html:156
msgid "Total Losses:" msgid "Total Losses:"
msgstr "Суммарные потери:" msgstr "Суммарные потери:"
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:71
#: allianceauth/srp/templates/srp/data.html:146 #: allianceauth/srp/templates/srp/data.html:157
#: allianceauth/srp/templates/srp/management.html:30 #: allianceauth/srp/templates/srp/management.html:30
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "Оценочная стоимость (ISK):" msgstr "Оценочная стоимость (ISK):"
#: allianceauth/srp/templates/srp/data.html:78 #: allianceauth/srp/templates/srp/data.html:79
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:165
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "Вы уверенны что хотите удалить запрос на SRP?" msgstr "Вы уверенны что хотите удалить запрос на SRP?"
#: allianceauth/srp/templates/srp/data.html:87 #: allianceauth/srp/templates/srp/data.html:88
msgid "Pilot Name" msgid "Pilot Name"
msgstr "Имя Пилота" msgstr "Имя Пилота"
#: allianceauth/srp/templates/srp/data.html:88 #: allianceauth/srp/templates/srp/data.html:89
msgid "Killboard Link" msgid "Killboard Link"
msgstr "zKillBoard ссылка" msgstr "zKillBoard ссылка"
#: allianceauth/srp/templates/srp/data.html:90 #: allianceauth/srp/templates/srp/data.html:91
msgid "Ship Type" msgid "Ship Type"
msgstr "Тип корабля" msgstr "Тип корабля"
#: allianceauth/srp/templates/srp/data.html:91 #: allianceauth/srp/templates/srp/data.html:92
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "потерь по zKillBoard на данный момент" msgstr "потерь по zKillBoard на данный момент"
#: allianceauth/srp/templates/srp/data.html:92 #: allianceauth/srp/templates/srp/data.html:93
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "SRP ISK Стоимость" msgstr "SRP ISK Стоимость"
#: allianceauth/srp/templates/srp/data.html:93 #: allianceauth/srp/templates/srp/data.html:94
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "Нажмите на значение для редактирования и ESC для отмены" msgstr "Нажмите на значение для редактирования и ESC для отмены"
#: allianceauth/srp/templates/srp/data.html:96 #: allianceauth/srp/templates/srp/data.html:97
msgid "Post Time" msgid "Post Time"
msgstr "Опубликованно" msgstr "Опубликованно"
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:174
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "SRP запросы отсутствуют" msgstr "SRP запросы отсутствуют"

View File

@@ -4,18 +4,18 @@
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
# Translators: # Translators:
# Joel Falknau <ozirascal@gmail.com>, 2020
# Jesse . <sgeine@hotmail.com>, 2020 # Jesse . <sgeine@hotmail.com>, 2020
# Aaron BuBu <351793078@qq.com>, 2020 # Aaron BuBu <351793078@qq.com>, 2020
# Joel Falknau <ozirascal@gmail.com>, 2020
# #
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-07-29 03:24+0000\n" "POT-Creation-Date: 2020-10-11 03:43+0000\n"
"PO-Revision-Date: 2020-02-18 03:14+0000\n" "PO-Revision-Date: 2020-02-18 03:14+0000\n"
"Last-Translator: Aaron BuBu <351793078@qq.com>, 2020\n" "Last-Translator: Joel Falknau <ozirascal@gmail.com>, 2020\n"
"Language-Team: Chinese Simplified (https://www.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n" "Language-Team: Chinese Simplified (https://www.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@@ -27,7 +27,7 @@ msgstr ""
msgid "A main character is required to perform that action. Add one below." msgid "A main character is required to perform that action. Add one below."
msgstr "只有主要角色才能执行这个操作。在下面添加一个" msgstr "只有主要角色才能执行这个操作。在下面添加一个"
#: allianceauth/authentication/forms.py:6 #: allianceauth/authentication/forms.py:5
msgid "Email" msgid "Email"
msgstr "电子邮箱" msgstr "电子邮箱"
@@ -43,7 +43,7 @@ msgstr ""
#: allianceauth/authentication/templates/authentication/dashboard.html:5 #: allianceauth/authentication/templates/authentication/dashboard.html:5
#: allianceauth/authentication/templates/authentication/dashboard.html:8 #: allianceauth/authentication/templates/authentication/dashboard.html:8
#: allianceauth/templates/allianceauth/side-menu.html:12 #: allianceauth/templates/allianceauth/side-menu.html:11
msgid "Dashboard" msgid "Dashboard"
msgstr "账户总览" msgstr "账户总览"
@@ -159,21 +159,21 @@ msgstr "添加%(name)s到您的账户失败他们已经在一个账户中了"
msgid "Unable to authenticate as the selected character." msgid "Unable to authenticate as the selected character."
msgstr "无法作为选定的角色进行身份验证" msgstr "无法作为选定的角色进行身份验证"
#: allianceauth/authentication/views.py:148 #: allianceauth/authentication/views.py:146
msgid "Registration token has expired." msgid "Registration token has expired."
msgstr "注册令牌过期。" msgstr "注册令牌过期。"
#: allianceauth/authentication/views.py:200 #: allianceauth/authentication/views.py:201
msgid "" msgid ""
"Sent confirmation email. Please follow the link to confirm your email " "Sent confirmation email. Please follow the link to confirm your email "
"address." "address."
msgstr "已经发送了确认邮件。请按照链接确定您的电邮地址" msgstr "已经发送了确认邮件。请按照链接确定您的电邮地址"
#: allianceauth/authentication/views.py:205 #: allianceauth/authentication/views.py:206
msgid "Confirmed your email address. Please login to continue." msgid "Confirmed your email address. Please login to continue."
msgstr "已确认您的电邮地址。请登录以继续" msgstr "已确认您的电邮地址。请登录以继续"
#: allianceauth/authentication/views.py:210 #: allianceauth/authentication/views.py:211
msgid "Registraion of new accounts it not allowed at this time." msgid "Registraion of new accounts it not allowed at this time."
msgstr "现在不允许注册新账户。" msgstr "现在不允许注册新账户。"
@@ -538,6 +538,11 @@ msgstr "成功注册舰队PAP"
msgid "FAT link has expired." msgid "FAT link has expired."
msgstr "PAP链接已过期" msgstr "PAP链接已过期"
#: allianceauth/groupmanagement/auth_hooks.py:16
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
msgid "Group Management"
msgstr "用户组管理"
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:5
#: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13 #: allianceauth/groupmanagement/templates/groupmanagement/audit.html:13
msgid "Audit Log" msgid "Audit Log"
@@ -610,7 +615,7 @@ msgstr "用户组成员"
#: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14 #: allianceauth/groupmanagement/templates/groupmanagement/groupmembership.html:14
#: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40 #: allianceauth/permissions_tool/templates/permissions_tool/overview.html:40
#: allianceauth/templates/allianceauth/side-menu.html:17 #: allianceauth/templates/allianceauth/side-menu.html:16
msgid "Groups" msgid "Groups"
msgstr "群组" msgstr "群组"
@@ -624,7 +629,7 @@ msgstr "描述"
#: allianceauth/hrapplications/templates/hrapplications/management.html:85 #: allianceauth/hrapplications/templates/hrapplications/management.html:85
#: allianceauth/hrapplications/templates/hrapplications/management.html:130 #: allianceauth/hrapplications/templates/hrapplications/management.html:130
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:27 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:27
#: allianceauth/srp/templates/srp/data.html:97 #: allianceauth/srp/templates/srp/data.html:98
msgid "Status" msgid "Status"
msgstr "状态" msgstr "状态"
@@ -724,11 +729,6 @@ msgstr "没有离开用户组的请求,小老弟你人缘可以啊?"
msgid "Toggle navigation" msgid "Toggle navigation"
msgstr "打开导航栏" msgstr "打开导航栏"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:15
#: allianceauth/templates/allianceauth/side-menu.html:25
msgid "Group Management"
msgstr "用户组管理"
#: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21 #: allianceauth/groupmanagement/templates/groupmanagement/menu.html:21
msgid "Group Requests" msgid "Group Requests"
msgstr "用户组请求" msgstr "用户组请求"
@@ -807,7 +807,7 @@ msgstr "你已经有了该组的未决申请"
#: allianceauth/hrapplications/templates/hrapplications/management.html:144 #: allianceauth/hrapplications/templates/hrapplications/management.html:144
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:38 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:38
#: allianceauth/hrapplications/templates/hrapplications/view.html:20 #: allianceauth/hrapplications/templates/hrapplications/view.html:20
#: allianceauth/srp/templates/srp/data.html:125 #: allianceauth/srp/templates/srp/data.html:134
#: allianceauth/srp/templates/srp/management.html:81 #: allianceauth/srp/templates/srp/management.html:81
msgid "Pending" msgid "Pending"
msgstr "待定" msgstr "待定"
@@ -834,7 +834,7 @@ msgstr "你已经有了该组的未决离开请求"
msgid "Applied to leave group %(group)s." msgid "Applied to leave group %(group)s."
msgstr "已经离开群组%(group)s" msgstr "已经离开群组%(group)s"
#: allianceauth/hrapplications/auth_hooks.py:10 #: allianceauth/hrapplications/auth_hooks.py:13
msgid "Applications" msgid "Applications"
msgstr "申请" msgstr "申请"
@@ -891,7 +891,7 @@ msgstr "用户名"
#: allianceauth/hrapplications/templates/hrapplications/management.html:131 #: allianceauth/hrapplications/templates/hrapplications/management.html:131
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:28 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:28
#: allianceauth/hrapplications/templates/hrapplications/view.html:75 #: allianceauth/hrapplications/templates/hrapplications/view.html:75
#: allianceauth/srp/templates/srp/data.html:99 #: allianceauth/srp/templates/srp/data.html:100
#: allianceauth/srp/templates/srp/management.html:46 #: allianceauth/srp/templates/srp/management.html:46
msgid "Actions" msgid "Actions"
msgstr "操作" msgstr "操作"
@@ -901,7 +901,7 @@ msgstr "操作"
#: allianceauth/hrapplications/templates/hrapplications/management.html:147 #: allianceauth/hrapplications/templates/hrapplications/management.html:147
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:40 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:40
#: allianceauth/hrapplications/templates/hrapplications/view.html:16 #: allianceauth/hrapplications/templates/hrapplications/view.html:16
#: allianceauth/srp/templates/srp/data.html:117 #: allianceauth/srp/templates/srp/data.html:126
msgid "Approved" msgid "Approved"
msgstr "通过" msgstr "通过"
@@ -909,7 +909,7 @@ msgstr "通过"
#: allianceauth/hrapplications/templates/hrapplications/management.html:104 #: allianceauth/hrapplications/templates/hrapplications/management.html:104
#: allianceauth/hrapplications/templates/hrapplications/management.html:149 #: allianceauth/hrapplications/templates/hrapplications/management.html:149
#: allianceauth/hrapplications/templates/hrapplications/searchview.html:42 #: allianceauth/hrapplications/templates/hrapplications/searchview.html:42
#: allianceauth/srp/templates/srp/data.html:121 #: allianceauth/srp/templates/srp/data.html:130
msgid "Rejected" msgid "Rejected"
msgstr "拒绝" msgstr "拒绝"
@@ -1292,11 +1292,11 @@ msgstr "密码"
msgid "Password must be at least 8 characters long." msgid "Password must be at least 8 characters long."
msgstr "密码至少要有8个字符啊你也太不注重安全啦" msgstr "密码至少要有8个字符啊你也太不注重安全啦"
#: allianceauth/services/modules/discord/models.py:224 #: allianceauth/services/modules/discord/models.py:225
msgid "Discord Account Disabled" msgid "Discord Account Disabled"
msgstr "" msgstr ""
#: allianceauth/services/modules/discord/models.py:226 #: allianceauth/services/modules/discord/models.py:227
msgid "" msgid ""
"Your Discord account was disabeled automatically by Auth. If you think this " "Your Discord account was disabeled automatically by Auth. If you think this "
"was a mistake, please contact an admin." "was a mistake, please contact an admin."
@@ -1599,7 +1599,7 @@ msgstr "服务"
msgid "Domain" msgid "Domain"
msgstr "域名" msgstr "域名"
#: allianceauth/srp/auth_hooks.py:9 #: allianceauth/srp/auth_hooks.py:12
msgid "Ship Replacement" msgid "Ship Replacement"
msgstr "补损" msgstr "补损"
@@ -1613,7 +1613,7 @@ msgstr "集结时间"
msgid "Fleet Doctrine" msgid "Fleet Doctrine"
msgstr "舰队船型" msgstr "舰队船型"
#: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:89 #: allianceauth/srp/form.py:12 allianceauth/srp/templates/srp/data.html:90
msgid "Additional Info" msgid "Additional Info"
msgstr "其他信息" msgstr "其他信息"
@@ -1642,63 +1642,63 @@ msgstr "创建补损舰队"
msgid "Give this link to the line members" msgid "Give this link to the line members"
msgstr "把这个链接发送给火力狗们" msgstr "把这个链接发送给火力狗们"
#: allianceauth/srp/templates/srp/data.html:48 #: allianceauth/srp/templates/srp/data.html:49
msgid "SRP Fleet Data" msgid "SRP Fleet Data"
msgstr "舰队补损信息" msgstr "舰队补损信息"
#: allianceauth/srp/templates/srp/data.html:53 #: allianceauth/srp/templates/srp/data.html:54
msgid "Mark Incomplete" msgid "Mark Incomplete"
msgstr "标记为未完成" msgstr "标记为未完成"
#: allianceauth/srp/templates/srp/data.html:57 #: allianceauth/srp/templates/srp/data.html:58
msgid "Mark Completed" msgid "Mark Completed"
msgstr "标记为已完成" msgstr "标记为已完成"
#: allianceauth/srp/templates/srp/data.html:69 #: allianceauth/srp/templates/srp/data.html:70
#: allianceauth/srp/templates/srp/data.html:145 #: allianceauth/srp/templates/srp/data.html:156
msgid "Total Losses:" msgid "Total Losses:"
msgstr "损失总额:" msgstr "损失总额:"
#: allianceauth/srp/templates/srp/data.html:70 #: allianceauth/srp/templates/srp/data.html:71
#: allianceauth/srp/templates/srp/data.html:146 #: allianceauth/srp/templates/srp/data.html:157
#: allianceauth/srp/templates/srp/management.html:30 #: allianceauth/srp/templates/srp/management.html:30
msgid "Total ISK Cost:" msgid "Total ISK Cost:"
msgstr "ISK花费总额" msgstr "ISK花费总额"
#: allianceauth/srp/templates/srp/data.html:78 #: allianceauth/srp/templates/srp/data.html:79
#: allianceauth/srp/templates/srp/data.html:154 #: allianceauth/srp/templates/srp/data.html:165
msgid "Are you sure you want to delete SRP requests?" msgid "Are you sure you want to delete SRP requests?"
msgstr "老哥,你确定要删了补损请求么?" msgstr "老哥,你确定要删了补损请求么?"
#: allianceauth/srp/templates/srp/data.html:87 #: allianceauth/srp/templates/srp/data.html:88
msgid "Pilot Name" msgid "Pilot Name"
msgstr "玩家ID" msgstr "玩家ID"
#: allianceauth/srp/templates/srp/data.html:88 #: allianceauth/srp/templates/srp/data.html:89
msgid "Killboard Link" msgid "Killboard Link"
msgstr "KB网链接" msgstr "KB网链接"
#: allianceauth/srp/templates/srp/data.html:90 #: allianceauth/srp/templates/srp/data.html:91
msgid "Ship Type" msgid "Ship Type"
msgstr "船型" msgstr "船型"
#: allianceauth/srp/templates/srp/data.html:91 #: allianceauth/srp/templates/srp/data.html:92
msgid "Killboard Loss Amt" msgid "Killboard Loss Amt"
msgstr "KB网总损失" msgstr "KB网总损失"
#: allianceauth/srp/templates/srp/data.html:92 #: allianceauth/srp/templates/srp/data.html:93
msgid "SRP ISK Cost" msgid "SRP ISK Cost"
msgstr "补损ISK花费" msgstr "补损ISK花费"
#: allianceauth/srp/templates/srp/data.html:93 #: allianceauth/srp/templates/srp/data.html:94
msgid "Click value to edit Enter to save & next ESC to cancel" msgid "Click value to edit Enter to save & next ESC to cancel"
msgstr "点击数值就可以编辑啦按回车确认按ESC取消" msgstr "点击数值就可以编辑啦按回车确认按ESC取消"
#: allianceauth/srp/templates/srp/data.html:96 #: allianceauth/srp/templates/srp/data.html:97
msgid "Post Time" msgid "Post Time"
msgstr "发布时间" msgstr "发布时间"
#: allianceauth/srp/templates/srp/data.html:163 #: allianceauth/srp/templates/srp/data.html:174
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "这次起队没有补损请求!大捷" msgstr "这次起队没有补损请求!大捷"

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
@@ -36,9 +36,15 @@
{% block extra_script %} {% block extra_script %}
$('#id_start').datetimepicker({ $('#id_start').datetimepicker({
lang: '{{ LANGUAGE_CODE }}', setlocale: '{{ LANGUAGE_CODE }}',
maskInput: true, {% if NIGHT_MODE %}
format: 'Y-m-d H:i',minDate:0 theme: 'dark',
{% else %}
theme: 'default',
{% endif %}
mask: true,
format: 'Y-m-d H:i',
minDate: 0
}); });
{% endblock extra_script %} {% endblock extra_script %}

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
@@ -41,7 +41,7 @@
{% include 'bundles/moment-js.html' with locale=True %} {% include 'bundles/moment-js.html' with locale=True %}
<script src="{% static 'js/timers.js' %}"></script> <script src="{% static 'js/timers.js' %}"></script>
<script type="text/javascript"> <script type="application/javascript">
// Data // Data
var timers = [ var timers = [
{% for op in optimer %} {% for op in optimer %}
@@ -53,7 +53,7 @@
{% endfor %} {% endfor %}
]; ];
</script> </script>
<script type="text/javascript"> <script type="application/javascript">
timedUpdate(); timedUpdate();
setAllLocalTimes(); setAllLocalTimes();

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
@@ -44,9 +44,15 @@
{% block extra_script %} {% block extra_script %}
$('#id_start').datetimepicker({ $('#id_start').datetimepicker({
lang: '{{ LANGUAGE_CODE }}', setlocale: '{{ LANGUAGE_CODE }}',
maskInput: true, {% if NIGHT_MODE %}
format: 'Y-m-d H:i',minDate:0 theme: 'dark',
{% else %}
theme: 'default',
{% endif %}
mask: true,
format: 'Y-m-d H:i',
minDate: 0
}); });
{% endblock extra_script %} {% endblock extra_script %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{{ permission.permission.codename }} - {% trans "Permissions Audit" %}{% endblock page_title %} {% block page_title %}{{ permission.permission.codename }} - {% trans "Permissions Audit" %}{% endblock page_title %}
@@ -47,7 +47,7 @@
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %} {% include 'bundles/datatables-js.html' %}
<script type="text/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script> <script type="application/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script>
{% endblock %} {% endblock %}
{% block extra_css %} {% block extra_css %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Permissions Overview" %}{% endblock page_title %} {% block page_title %}{% trans "Permissions Overview" %}{% endblock page_title %}
@@ -80,7 +80,7 @@
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %} {% include 'bundles/datatables-js.html' %}
<script type="text/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script> <script type="application/javascript" src="{% static 'js/filterDropDown/filterDropDown.min.js' %}"></script>
{% endblock %} {% endblock %}
{% block extra_css %} {% block extra_css %}

View File

@@ -64,12 +64,12 @@ BASE_DIR = os.path.dirname(PROJECT_DIR)
MIDDLEWARE = [ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.locale.LocaleMiddleware',
] ]
ROOT_URLCONF = 'allianceauth.urls' ROOT_URLCONF = 'allianceauth.urls'
@@ -86,6 +86,8 @@ LANGUAGES = (
('zh-hans', ugettext('Chinese Simplified')), ('zh-hans', ugettext('Chinese Simplified')),
('ru', ugettext('Russian')), ('ru', ugettext('Russian')),
('ko', ugettext('Korean')), ('ko', ugettext('Korean')),
('fr', ugettext('French')),
('ja', ugettext('Japanese')),
) )
TEMPLATES = [ TEMPLATES = [
@@ -138,6 +140,8 @@ AUTHENTICATION_BACKENDS = ['allianceauth.authentication.backends.StateBackend',
LANGUAGE_CODE = 'en-us' LANGUAGE_CODE = 'en-us'
LANGUAGE_COOKIE_AGE = 1209600
TIME_ZONE = 'UTC' TIME_ZONE = 'UTC'
USE_I18N = True USE_I18N = True

View File

@@ -139,6 +139,11 @@ class MenuItemHook:
self.url_name = url_name self.url_name = url_name
self.template = 'public/menuitem.html' self.template = 'public/menuitem.html'
self.order = order if order is not None else 9999 self.order = order if order is not None else 9999
# count is an integer shown next to the menu item as badge when count != None
# apps need to set the count in their child class, e.g. in render() method
self.count = None
navactive = navactive or [] navactive = navactive or []
navactive.append(url_name) navactive.append(url_name)
self.navactive = navactive self.navactive = navactive

View File

@@ -211,6 +211,7 @@ class DiscordUser(models.Model):
Return None if user does no longer exist Return None if user does no longer exist
""" """
try: try:
_user = self.user
client = DiscordUser.objects._bot_client(is_rate_limited=is_rate_limited) client = DiscordUser.objects._bot_client(is_rate_limited=is_rate_limited)
success = client.remove_guild_member( success = client.remove_guild_member(
guild_id=DISCORD_GUILD_ID, user_id=self.uid guild_id=DISCORD_GUILD_ID, user_id=self.uid
@@ -220,31 +221,31 @@ class DiscordUser(models.Model):
if deleted_count > 0: if deleted_count > 0:
if notify_user: if notify_user:
notify( notify(
user=self.user, user=_user,
title=gettext_lazy('Discord Account Disabled'), title=gettext_lazy('Discord Account Disabled'),
message=gettext_lazy( message=gettext_lazy(
'Your Discord account was disabeled automatically ' 'Your Discord account was disabled automatically '
'by Auth. If you think this was a mistake, ' 'by Auth. If you think this was a mistake, '
'please contact an admin.' 'please contact an admin.'
), ),
level='warning' level='warning'
) )
logger.info('Account for user %s was deleted.', self.user) logger.info('Account for user %s was deleted.', _user)
return True return True
else: else:
logger.debug('Account for user %s was already deleted.', self.user) logger.debug('Account for user %s was already deleted.', _user)
return None return None
else: else:
logger.warning( logger.warning(
'Failed to remove user %s from the Discord server', self.user 'Failed to remove user %s from the Discord server', _user
) )
return False return False
except (HTTPError, ConnectionError, DiscordApiBackoff) as ex: except (HTTPError, ConnectionError, DiscordApiBackoff) as ex:
if handle_api_exceptions: if handle_api_exceptions:
logger.exception( logger.exception(
'Failed to remove user %s from Discord server: %s', self.user, ex 'Failed to remove user %s from Discord server: %s',self.user, ex
) )
return False return False
else: else:

View File

@@ -4,7 +4,7 @@ import re
from django.conf import settings from django.conf import settings
from django.core.cache import cache from django.core.cache import cache
from hashlib import md5 from hashlib import md5
from . import providers
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
GROUP_CACHE_MAX_AGE = getattr(settings, 'DISCOURSE_GROUP_CACHE_MAX_AGE', 2 * 60 * 60) # default 2 hours GROUP_CACHE_MAX_AGE = getattr(settings, 'DISCOURSE_GROUP_CACHE_MAX_AGE', 2 * 60 * 60) # default 2 hours
@@ -19,128 +19,8 @@ class DiscourseError(Exception):
return "API execution failed.\nErrors: %s\nEndpoint: %s" % (self.errors, self.endpoint) return "API execution failed.\nErrors: %s\nEndpoint: %s" % (self.errors, self.endpoint)
# not exhaustive, only the ones we need
ENDPOINTS = {
'groups': {
'list': {
'path': "/groups/search.json",
'method': 'get',
'args': {
'required': [],
'optional': [],
},
},
'create': {
'path': "/admin/groups",
'method': 'post',
'args': {
'required': ['name'],
'optional': ['visible'],
}
},
'add_user': {
'path': "/admin/groups/%s/members.json",
'method': 'put',
'args': {
'required': ['usernames'],
'optional': [],
},
},
'remove_user': {
'path': "/admin/groups/%s/members.json",
'method': 'delete',
'args': {
'required': ['username'],
'optional': [],
},
},
'delete': {
'path': "/admin/groups/%s.json",
'method': 'delete',
'args': {
'required': [],
'optional': [],
},
},
},
'users': {
'create': {
'path': "/users",
'method': 'post',
'args': {
'required': ['name', 'email', 'password', 'username'],
'optional': ['active'],
},
},
'update': {
'path': "/users/%s.json",
'method': 'put',
'args': {
'required': ['params'],
'optional': [],
}
},
'get': {
'path': "/users/%s.json",
'method': 'get',
'args': {
'required': [],
'optional': [],
},
},
'activate': {
'path': "/admin/users/%s/activate",
'method': 'put',
'args': {
'required': [],
'optional': [],
},
},
'set_email': {
'path': "/users/%s/preferences/email",
'method': 'put',
'args': {
'required': ['email'],
'optional': [],
},
},
'suspend': {
'path': "/admin/users/%s/suspend",
'method': 'put',
'args': {
'required': ['duration', 'reason'],
'optional': [],
},
},
'unsuspend': {
'path': "/admin/users/%s/unsuspend",
'method': 'put',
'args': {
'required': [],
'optional': [],
},
},
'logout': {
'path': "/admin/users/%s/log_out",
'method': 'post',
'args': {
'required': [],
'optional': [],
},
},
'external': {
'path': "/users/by-external/%s.json",
'method': 'get',
'args': {
'required': [],
'optional': [],
},
},
},
}
class DiscourseManager: class DiscourseManager:
def __init__(self): def __init__(self):
pass pass
@@ -148,55 +28,14 @@ class DiscourseManager:
SUSPEND_DAYS = 99999 SUSPEND_DAYS = 99999
SUSPEND_REASON = "Disabled by auth." SUSPEND_REASON = "Disabled by auth."
@staticmethod
def __exc(endpoint, *args, **kwargs):
params = {
'api_key': settings.DISCOURSE_API_KEY,
'api_username': settings.DISCOURSE_API_USERNAME,
}
silent = kwargs.pop('silent', False)
if args:
endpoint['parsed_url'] = endpoint['path'] % args
else:
endpoint['parsed_url'] = endpoint['path']
data = {}
for arg in endpoint['args']['required']:
data[arg] = kwargs[arg]
for arg in endpoint['args']['optional']:
if arg in kwargs:
data[arg] = kwargs[arg]
for arg in kwargs:
if arg not in endpoint['args']['required'] and arg not in endpoint['args']['optional'] and not silent:
logger.warn("Received unrecognized kwarg %s for endpoint %s" % (arg, endpoint))
r = getattr(requests, endpoint['method'])(settings.DISCOURSE_URL + endpoint['parsed_url'], headers=params,
json=data)
try:
if 'errors' in r.json() and not silent:
logger.error("Discourse execution failed.\nEndpoint: %s\nErrors: %s" % (endpoint, r.json()['errors']))
raise DiscourseError(endpoint, r.json()['errors'])
if 'success' in r.json():
if not r.json()['success'] and not silent:
raise DiscourseError(endpoint, None)
out = r.json()
except ValueError:
out = r.text
finally:
try:
r.raise_for_status()
except requests.exceptions.HTTPError as e:
raise DiscourseError(endpoint, e.response.status_code)
return out
@staticmethod @staticmethod
def _get_groups(): def _get_groups():
endpoint = ENDPOINTS['groups']['list'] data = providers.discourse.client.groups()
data = DiscourseManager.__exc(endpoint)
return [g for g in data if not g['automatic']] return [g for g in data if not g['automatic']]
@staticmethod @staticmethod
def _create_group(name): def _create_group(name):
endpoint = ENDPOINTS['groups']['create'] return providers.discourse.client.create_group(name=name[:20], visible=True)['basic_group']
return DiscourseManager.__exc(endpoint, name=name[:20], visible=True)['basic_group']
@staticmethod @staticmethod
def _generate_cache_group_name_key(name): def _generate_cache_group_name_key(name):
@@ -234,13 +73,11 @@ class DiscourseManager:
@staticmethod @staticmethod
def __add_user_to_group(g_id, username): def __add_user_to_group(g_id, username):
endpoint = ENDPOINTS['groups']['add_user'] providers.discourse.client.add_group_member(g_id, username)
DiscourseManager.__exc(endpoint, g_id, usernames=username)
@staticmethod @staticmethod
def __remove_user_from_group(g_id, username): def __remove_user_from_group(g_id, uid):
endpoint = ENDPOINTS['groups']['remove_user'] providers.discourse.client.delete_group_member(g_id, uid)
DiscourseManager.__exc(endpoint, g_id, username=username)
@staticmethod @staticmethod
def __generate_group_dict(names): def __generate_group_dict(names):
@@ -252,39 +89,35 @@ class DiscourseManager:
@staticmethod @staticmethod
def __get_user_groups(username): def __get_user_groups(username):
data = DiscourseManager.__get_user(username) data = DiscourseManager.__get_user(username)
return [g['id'] for g in data['user']['groups'] if not g['automatic']] return [g['id'] for g in data['groups'] if not g['automatic']]
@staticmethod @staticmethod
def __user_name_to_id(name, silent=False): def __user_name_to_id(name, silent=False):
data = DiscourseManager.__get_user(name, silent=silent) data = DiscourseManager.__get_user(name)
return data['user']['id'] return data['user']['id']
@staticmethod @staticmethod
def __get_user(username, silent=False): def __get_user(username, silent=False):
endpoint = ENDPOINTS['users']['get'] return providers.discourse.client.user(username)
return DiscourseManager.__exc(endpoint, username, silent=silent)
@staticmethod @staticmethod
def __activate_user(username): def __activate_user(username):
endpoint = ENDPOINTS['users']['activate']
u_id = DiscourseManager.__user_name_to_id(username) u_id = DiscourseManager.__user_name_to_id(username)
DiscourseManager.__exc(endpoint, u_id) providers.discourse.client.activate(u_id)
@staticmethod @staticmethod
def __update_user(username, **kwargs): def __update_user(username, **kwargs):
endpoint = ENDPOINTS['users']['update']
u_id = DiscourseManager.__user_name_to_id(username) u_id = DiscourseManager.__user_name_to_id(username)
DiscourseManager.__exc(endpoint, u_id, params=kwargs) providers.discourse.client.update_user(endpoint, u_id, **kwargs)
@staticmethod @staticmethod
def __create_user(username, email, password): def __create_user(username, email, password):
endpoint = ENDPOINTS['users']['create'] providers.discourse.client.create_user(username, username, email, password)
DiscourseManager.__exc(endpoint, name=username, username=username, email=email, password=password, active=True)
@staticmethod @staticmethod
def __check_if_user_exists(username): def __check_if_user_exists(username):
try: try:
DiscourseManager.__user_name_to_id(username, silent=True) DiscourseManager.__user_name_to_id(username)
return True return True
except DiscourseError: except DiscourseError:
return False return False
@@ -292,30 +125,26 @@ class DiscourseManager:
@staticmethod @staticmethod
def __suspend_user(username): def __suspend_user(username):
u_id = DiscourseManager.__user_name_to_id(username) u_id = DiscourseManager.__user_name_to_id(username)
endpoint = ENDPOINTS['users']['suspend'] return providers.discourse.client.suspend(u_id, DiscourseManager.SUSPEND_DAYS,
return DiscourseManager.__exc(endpoint, u_id, duration=DiscourseManager.SUSPEND_DAYS, DiscourseManager.SUSPEND_REASON)
reason=DiscourseManager.SUSPEND_REASON)
@staticmethod @staticmethod
def __unsuspend(username): def __unsuspend(username):
u_id = DiscourseManager.__user_name_to_id(username) u_id = DiscourseManager.__user_name_to_id(username)
endpoint = ENDPOINTS['users']['unsuspend'] return providers.discourse.client.unsuspend(u_id)
return DiscourseManager.__exc(endpoint, u_id)
@staticmethod @staticmethod
def __set_email(username, email): def __set_email(username, email):
endpoint = ENDPOINTS['users']['set_email'] return providers.discourse.client.update_email(username, email)
return DiscourseManager.__exc(endpoint, username, email=email)
@staticmethod @staticmethod
def __logout(u_id): def __logout(u_id):
endpoint = ENDPOINTS['users']['logout'] return providers.discourse.client.log_out(u_id)
return DiscourseManager.__exc(endpoint, u_id)
@staticmethod @staticmethod
def __get_user_by_external(u_id): def __get_user_by_external(u_id):
endpoint = ENDPOINTS['users']['external'] data = providers.discourse.client.user_by_external_id(u_id)
return DiscourseManager.__exc(endpoint, u_id) return data
@staticmethod @staticmethod
def __user_id_by_external_id(u_id): def __user_id_by_external_id(u_id):
@@ -351,7 +180,9 @@ class DiscourseManager:
logger.debug("Updating discourse user %s groups to %s" % (user, groups)) logger.debug("Updating discourse user %s groups to %s" % (user, groups))
group_dict = DiscourseManager.__generate_group_dict(groups) group_dict = DiscourseManager.__generate_group_dict(groups)
inv_group_dict = {v: k for k, v in group_dict.items()} inv_group_dict = {v: k for k, v in group_dict.items()}
username = DiscourseManager.__get_user_by_external(user.pk)['user']['username'] discord_user = DiscourseManager.__get_user_by_external(user.pk)
username = discord_user['username']
uid = discord_user['id']
user_groups = DiscourseManager.__get_user_groups(username) user_groups = DiscourseManager.__get_user_groups(username)
add_groups = [group_dict[x] for x in group_dict if not group_dict[x] in user_groups] add_groups = [group_dict[x] for x in group_dict if not group_dict[x] in user_groups]
rem_groups = [x for x in user_groups if x not in inv_group_dict] rem_groups = [x for x in user_groups if x not in inv_group_dict]
@@ -364,7 +195,7 @@ class DiscourseManager:
logger.info( logger.info(
"Updating discourse user %s groups: removing %s" % (username, rem_groups)) "Updating discourse user %s groups: removing %s" % (username, rem_groups))
for g in rem_groups: for g in rem_groups:
DiscourseManager.__remove_user_from_group(g, username) DiscourseManager.__remove_user_from_group(g, uid)
@staticmethod @staticmethod
def disable_user(user): def disable_user(user):

View File

@@ -16,3 +16,4 @@ class DiscourseUser(models.Model):
permissions = ( permissions = (
("access_discourse", u"Can access the Discourse service"), ("access_discourse", u"Can access the Discourse service"),
) )

View File

@@ -0,0 +1,19 @@
from pydiscourse import DiscourseClient
from django.conf import settings
class DiscourseAPIClient():
_client = None
def __init__(self):
pass
@property
def client(self):
if not self._client:
self._client = DiscourseClient(
settings.DISCOURSE_URL,
api_username=settings.DISCOURSE_API_USERNAME,
api_key=settings.DISCOURSE_API_KEY)
return self._client
discourse = DiscourseAPIClient()

View File

@@ -47,7 +47,8 @@ class DiscourseTasks:
logger.debug("Updating discourse groups for user %s" % user) logger.debug("Updating discourse groups for user %s" % user)
try: try:
DiscourseManager.update_groups(user) DiscourseManager.update_groups(user)
except: except Exception as e:
logger.exception(e)
logger.warn("Discourse group sync failed for %s, retrying in 10 mins" % user) logger.warn("Discourse group sync failed for %s, retrying in 10 mins" % user)
raise self.retry(countdown=60 * 10) raise self.retry(countdown=60 * 10)
logger.debug("Updated user %s discourse groups." % user) logger.debug("Updated user %s discourse groups." % user)
@@ -63,3 +64,4 @@ class DiscourseTasks:
def get_username(user): def get_username(user):
from .auth_hooks import DiscourseService from .auth_hooks import DiscourseService
return NameFormatter(DiscourseService(), user).format_name() return NameFormatter(DiscourseService(), user).format_name()

View File

@@ -0,0 +1,18 @@
# Generated by Django 3.1.2 on 2020-10-11 10:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mumble', '0010_mumbleuser_certhash'),
]
operations = [
migrations.AlterField(
model_name='mumbleuser',
name='pwhash',
field=models.CharField(max_length=90),
),
]

View File

@@ -63,7 +63,7 @@ class MumbleManager(models.Manager):
class MumbleUser(AbstractServiceModel): class MumbleUser(AbstractServiceModel):
username = models.CharField(max_length=254, unique=True) username = models.CharField(max_length=254, unique=True)
pwhash = models.CharField(max_length=80) pwhash = models.CharField(max_length=90)
hashfn = models.CharField(max_length=20, default='sha1') hashfn = models.CharField(max_length=20, default='sha1')
groups = models.TextField(blank=True, null=True) groups = models.TextField(blank=True, null=True)
certhash = models.CharField( certhash = models.CharField(

View File

@@ -211,4 +211,4 @@ class MumbleManagerTestCase(TestCase):
pwhash = self.manager.gen_pwhash('test') pwhash = self.manager.gen_pwhash('test')
self.assertEqual(pwhash[:15], '$bcrypt-sha256$') self.assertEqual(pwhash[:15], '$bcrypt-sha256$')
self.assertEqual(len(pwhash), 75) self.assertEqual(len(pwhash), 83)

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Jabber Broadcast" %}{% endblock page_title %} {% block page_title %}{% trans "Jabber Broadcast" %}{% endblock page_title %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Verify Teamspeak" %}{% endblock page_title %} {% block page_title %}{% trans "Verify Teamspeak" %}{% endblock page_title %}

View File

@@ -2,7 +2,10 @@
{% load navactive %} {% load navactive %}
<li> <li>
<a class="{% navactive request item.navactive|join:" " %}" href="{% url item.url_name %}"> <a class="{% navactive request item.navactive|join:' ' %}" href="{% url item.url_name %}">
<i class="{{ item.classes }}"></i> {% trans item.text %} <i class="{{ item.classes }}"></i> {% trans item.text %}
{% if item.count != None %}
<span class="badge">{{ item.count }}</span>
{% endif %}
</a> </a>
</li> </li>

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Fleet Formatter Tool" %}{% endblock page_title %} {% block page_title %}{% trans "Fleet Formatter Tool" %}{% endblock page_title %}

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% blocktrans with service_name=view.service_name|title %}{{ service_name }} Credentials{% endblocktrans %}{% endblock page_title %} {% block page_title %}{% blocktrans with service_name=view.service_name|title %}{{ service_name }} Credentials{% endblocktrans %}{% endblock page_title %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% blocktrans with service_name=view.service_name|title %}{{ service_name }} Password Change{% endblocktrans %}{% endblock page_title %} {% block page_title %}{% blocktrans with service_name=view.service_name|title %}{{ service_name }} Password Change{% endblocktrans %}{% endblock page_title %}

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Services Management" %}{% endblock page_title %} {% block page_title %}{% trans "Services Management" %}{% endblock page_title %}

View File

@@ -1,7 +1,10 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks from allianceauth import hooks
from allianceauth.services.hooks import MenuItemHook, UrlHook
from . import urls from . import urls
from .managers import SRPManager
class SrpMenu(MenuItemHook): class SrpMenu(MenuItemHook):
@@ -13,6 +16,8 @@ class SrpMenu(MenuItemHook):
def render(self, request): def render(self, request):
if request.user.has_perm('srp.access_srp'): if request.user.has_perm('srp.access_srp'):
app_count = SRPManager.pending_requests_count_for_user(request.user)
self.count = app_count if app_count and app_count > 0 else None
return MenuItemHook.render(self, request) return MenuItemHook.render(self, request)
return '' return ''

View File

@@ -1,11 +1,13 @@
import logging import logging
import os
import requests import requests
from django.contrib.auth.models import User
from allianceauth import NAME from allianceauth import NAME
from allianceauth.eveonline.providers import provider from allianceauth.eveonline.providers import provider
from .models import SrpUserRequest
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -50,3 +52,12 @@ class SRPManager:
return ship_type, ship_value, victim_id return ship_type, ship_value, victim_id
else: else:
raise ValueError("Invalid Kill ID or Hash.") raise ValueError("Invalid Kill ID or Hash.")
@staticmethod
def pending_requests_count_for_user(user: User):
"""returns the number of open SRP requests for given user
or None if user has no permission"""
if user.has_perm("auth.srp_management"):
return SrpUserRequest.objects.filter(srp_status="pending").count()
else:
return None

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "SRP Fleet Create" %}{% endblock page_title %} {% block page_title %}{% trans "SRP Fleet Create" %}{% endblock page_title %}
@@ -26,7 +26,7 @@
{% else %} {% else %}
<div class="alert alert-info" role="alert">{% blocktrans %}Give this link to the line members{% endblocktrans %}.</div> <div class="alert alert-info" role="alert">{% blocktrans %}Give this link to the line members{% endblocktrans %}.</div>
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
http://{{ request.get_host }}{% url 'srp:request' completed_srp_code %}</div> {{ request.scheme }}://{{ request.get_host }}{% url 'srp:request' completed_srp_code %}</div>
<div class="text-center"> <div class="text-center">
<a href="{% url 'srp:management' %}" class="btn btn-primary btn-lg">{% trans "Continue" %}</a> <a href="{% url 'srp:management' %}" class="btn btn-primary btn-lg">{% trans "Continue" %}</a>
</div> </div>
@@ -34,7 +34,6 @@
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock content %} {% endblock content %}
@@ -46,8 +45,15 @@
{% block extra_script %} {% block extra_script %}
$('#id_fleet_time').datetimepicker({ $('#id_fleet_time').datetimepicker({
maskInput: true, setlocale: '{{ LANGUAGE_CODE }}',
format: 'Y-m-d H:i' {% if NIGHT_MODE %}
theme: 'dark',
{% else %}
theme: 'default',
{% endif %}
mask: true,
format: 'Y-m-d H:i',
minDate: 0
}); });
{% endblock extra_script %} {% endblock extra_script %}

View File

@@ -1,12 +1,13 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% load humanize %} {% load humanize %}
{% block page_title %}Srp Fleet Data{% endblock page_title %} {% block page_title %}Srp Fleet Data{% endblock page_title %}
{% block extra_css %} {% block extra_css %}
{% include 'bundles/x-editable.css.html' %} {% include 'bundles/datatables-css.html' %}
{% include 'bundles/x-editable.css.html' %}
<link href="{% static 'css/checkbox.css' %}" rel="stylesheet" type="text/css"> <link href="{% static 'css/checkbox.css' %}" rel="stylesheet" type="text/css">
<style> <style>
.radio label, .checkbox label { .radio label, .checkbox label {
@@ -60,7 +61,7 @@
{% endif %} {% endif %}
</div> </div>
</h1> </h1>
{% if srpfleetrequests %} {% if srpfleetrequests %}
<form method="POST"> <form method="POST">
{% csrf_token %} {% csrf_token %}
@@ -82,8 +83,8 @@
</div> </div>
</div> </div>
<div class="table-responsive"> <div class="table-responsive">
<table class="table"> <table class="table srplist">
<tr> <thead>
<th class="text-center">{% trans "Pilot Name" %}</th> <th class="text-center">{% trans "Pilot Name" %}</th>
<th class="text-center">{% trans "Killboard Link" %}</th> <th class="text-center">{% trans "Killboard Link" %}</th>
<th class="text-center">{% trans "Additional Info" %}</th> <th class="text-center">{% trans "Additional Info" %}</th>
@@ -98,19 +99,27 @@ ESC to cancel{% endblocktrans %}"id="blah"></i></th>
{% if perms.auth.srp_management %} {% if perms.auth.srp_management %}
<th class="text-center">{% trans "Actions" %}</th> <th class="text-center">{% trans "Actions" %}</th>
{% endif %} {% endif %}
</tr> </thead>
<tbody>
{% for srpfleetrequest in srpfleetrequests %} {% for srpfleetrequest in srpfleetrequests %}
<tr> <tr>
<td class="text-center">{{ srpfleetrequest.character.character_name }}</td> <td class="text-center">
{% if srpfleetrequest.character.alliance.alliance_ticker %}
{{ srpfleetrequest.character.alliance.alliance_ticker }}
{% endif %}
[{{ srpfleetrequest.character.corporation.corporation_ticker }}]
{{ srpfleetrequest.character.character_name }}
</td>
<td class="text-center"> <td class="text-center">
<a href="{{ srpfleetrequest.killboard_link }}" <a href="{{ srpfleetrequest.killboard_link }}"
target="_blank" class="label label-warning">Link</a> target="_blank" class="label label-warning">Link</a>
</td> </td>
<td class="text-center">{{ srpfleetrequest.additional_info }}</td> <td class="text-center">{{ srpfleetrequest.additional_info }}</td>
<td class="text-center">{{ srpfleetrequest.srp_ship_name }}</td> <td class="text-center">{{ srpfleetrequest.srp_ship_name }}</td>
<td class="text-center">{{ srpfleetrequest.kb_total_loss | intcomma }} ISK</td> <td class="text-center" data-sort="{{ srpfleetrequest.kb_total_loss }}">{{ srpfleetrequest.kb_total_loss | intcomma }} ISK</td>
<td class="srp" data-name="srp_total_amount" data-type="number" data-pk="{{srpfleetrequest.id}}" data-url="{% url 'srp:request_update_amount' srpfleetrequest.id %}" data-params="{csrfmiddlewaretoken:'{{csrf_token}}'}" class="text-center">{{ srpfleetrequest.srp_total_amount | intcomma }} ISK</td> <td class="srp text-center" data-name="srp_total_amount" data-type="number" data-pk="{{srpfleetrequest.id}}" data-url="{% url 'srp:request_update_amount' srpfleetrequest.id %}" data-params="{csrfmiddlewaretoken:'{{csrf_token}}'}" data-sort="{{ srpfleetrequest.srp_total_amount }}">{{ srpfleetrequest.srp_total_amount | intcomma }} ISK</td>
<td class="text-center">{{ srpfleetrequest.post_time | date:"Y-m-d H:i" }}</td> <td class="text-center" data-sort="{{ srpfleetrequest.post_time | date:"Y-m-d H:i" }}">{{ srpfleetrequest.post_time | date:"Y-M-d H:i" }}</td>
<td class="text-center"> <td class="text-center">
{% if srpfleetrequest.srp_status == "Approved" %} {% if srpfleetrequest.srp_status == "Approved" %}
<div class="label label-success"> <div class="label label-success">
@@ -133,11 +142,13 @@ ESC to cancel{% endblocktrans %}"id="blah"></i></th>
<input type="checkbox" name="{{srpfleetrequest.id}}"> <input type="checkbox" name="{{srpfleetrequest.id}}">
<span class="cr"><i class="cr-icon fas fa-check"></i></span> <span class="cr"><i class="cr-icon fas fa-check"></i></span>
</label> </label>
</div> </div>
</td> </td>
{% endif %} {% endif %}
</tr> </tr>
{% endfor %} {% endfor %}
<tbody>
</table> </table>
</div> </div>
<div class="alert alert-info" role="alert"> <div class="alert alert-info" role="alert">
@@ -168,7 +179,9 @@ ESC to cancel{% endblocktrans %}"id="blah"></i></th>
{% endblock content %} {% endblock content %}
{% block extra_javascript %} {% block extra_javascript %}
{% include 'bundles/datatables-js.html' %}
{% include 'bundles/x-editable-js.html' %} {% include 'bundles/x-editable-js.html' %}
{% include 'bundles/moment-js.html' %}
{% endblock %} {% endblock %}
{% block extra_script %} {% block extra_script %}
@@ -198,11 +211,47 @@ ESC to cancel{% endblocktrans %}"id="blah"></i></th>
var $next = $(this).closest('tr').next().find('.editable'); var $next = $(this).closest('tr').next().find('.editable');
setTimeout(function() { setTimeout(function() {
$next.editable('show'); $next.editable('show');
}, 400); }, 400);
} }
}); });
}); });
$(document).ready(function(){ $(document).ready(function(){
$("[rel=tooltip]").tooltip({ placement: 'top'}); $("[rel=tooltip]").tooltip({ placement: 'top'});
}); });
$.fn.dataTable.moment = function(format, locale) {
var types = $.fn.dataTable.ext.type;
// Add type detection
types.detect.unshift(function(d) {
return moment(d, format, locale, true).isValid() ?
'moment-'+format :
null;
} );
// Add sorting method - use an integer for the sorting
types.order[ 'moment-'+format+'-pre' ] = function(d) {
return moment(d, format, locale, true).unix();
};
};
$(document).ready( function(){
$.fn.dataTable.moment('YYYY-MMM-D, HH:mm');
$('table.srplist').DataTable({
"order": [[ 6, "asc" ]],
"paging": false,
"columnDefs": [{
"targets": [1, 8],
"orderable": false
},
{
"targets": [4, 5],
"type": "num"
}]
});
});
{% endblock extra_script %} {% endblock extra_script %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% load humanize %} {% load humanize %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "SRP Request" %}{% endblock page_title %} {% block page_title %}{% trans "SRP Request" %}{% endblock page_title %}

View File

@@ -1,6 +1,6 @@
{% extends "allianceauth/base.html" %} {% extends "allianceauth/base.html" %}
{% load bootstrap %} {% load bootstrap %}
{% load staticfiles %} {% load static %}
{% load i18n %} {% load i18n %}
{% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %} {% block page_title %}{% trans "Update AAR Link" %}{% endblock page_title %}

View File

@@ -1,11 +1,16 @@
import inspect import inspect
import json import json
import os import os
from unittest.mock import patch, Mock from unittest.mock import patch
from django.contrib.auth.models import User
from django.utils.timezone import now
from django.test import TestCase from django.test import TestCase
from allianceauth.tests.auth_utils import AuthUtils
from ..managers import SRPManager from ..managers import SRPManager
from ..models import SrpUserRequest, SrpFleetMain
MODULE_PATH = 'allianceauth.srp.managers' MODULE_PATH = 'allianceauth.srp.managers'
@@ -13,6 +18,7 @@ currentdir = os.path.dirname(os.path.abspath(inspect.getfile(
inspect.currentframe() inspect.currentframe()
))) )))
def load_data(filename): def load_data(filename):
"""loads given JSON file from `testdata` sub folder and returns content""" """loads given JSON file from `testdata` sub folder and returns content"""
with open( with open(
@@ -52,7 +58,7 @@ class TestSrpManager(TestCase):
mock_get.return_value.json.return_value = [''] mock_get.return_value.json.return_value = ['']
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
ship_type, ship_value, victim_id = SRPManager.get_kill_data(81973979) SRPManager.get_kill_data(81973979)
@patch(MODULE_PATH + '.provider') @patch(MODULE_PATH + '.provider')
@patch(MODULE_PATH + '.requests.get') @patch(MODULE_PATH + '.requests.get')
@@ -67,6 +73,34 @@ class TestSrpManager(TestCase):
result.return_value = None result.return_value = None
with self.assertRaises(ValueError): with self.assertRaises(ValueError):
ship_type, ship_value, victim_id = SRPManager.get_kill_data(81973979) SRPManager.get_kill_data(81973979)
def test_pending_requests_count_for_user(self):
user = AuthUtils.create_member("Bruce Wayne")
# when no permission to approve SRP requests
# then return None
self.assertIsNone(SRPManager.pending_requests_count_for_user(user))
# given permission to approve SRP requests
# when no open requests
# then return 0
AuthUtils.add_permission_to_user_by_name("auth.srp_management", user)
user = User.objects.get(pk=user.pk)
self.assertEqual(SRPManager.pending_requests_count_for_user(user), 0)
# given permission to approve SRP requests
# when 1 pending request
# then return 1
fleet = SrpFleetMain.objects.create(fleet_time=now())
SrpUserRequest.objects.create(
killboard_link="https://zkillboard.com/kill/79111612/",
srp_status="Pending",
srp_fleet_main=fleet,
)
SrpUserRequest.objects.create(
killboard_link="https://zkillboard.com/kill/79111612/",
srp_status="Approved",
srp_fleet_main=fleet,
)
self.assertEqual(SRPManager.pending_requests_count_for_user(user), 1)

View File

@@ -53,7 +53,7 @@ def srp_fleet_view(request, fleet_id):
except SrpFleetMain.DoesNotExist: except SrpFleetMain.DoesNotExist:
raise Http404 raise Http404
context = {"fleet_id": fleet_id, "fleet_status": fleet_main.fleet_srp_status, context = {"fleet_id": fleet_id, "fleet_status": fleet_main.fleet_srp_status,
"srpfleetrequests": fleet_main.srpuserrequest_set.select_related('character').order_by('srp_ship_name'), "srpfleetrequests": fleet_main.srpuserrequest_set.select_related('character'),
"totalcost": fleet_main.total_cost} "totalcost": fleet_main.total_cost}
return render(request, 'srp/data.html', context=context) return render(request, 'srp/data.html', context=context)

View File

@@ -53,22 +53,34 @@ ul.list-group.list-group-horizontal > li.list-group-item {
.table-aa > thead > tr > th{ .table-aa > thead > tr > th{
border-bottom: 1px solid #f2f2f2; border-bottom: 1px solid #f2f2f2;
} }
.table-aa > thead > tr > th{ .table-aa > thead > tr > th{
vertical-align: middle; vertical-align: middle;
} }
.table-aa > tbody > tr > td{ .table-aa > tbody > tr > td{
border-bottom: 1px solid #f2f2f2; border-bottom: 1px solid #f2f2f2;
} }
.table-aa > tbody > tr > td { .table-aa > tbody > tr > td {
vertical-align: middle; vertical-align: middle;
} }
.table-aa > tbody > tr:last-child { .table-aa > tbody > tr:last-child {
border-bottom: none; border-bottom: none;
} }
/* highlight active menu items
--------------------------------------------------------------------------------------------------------------------- */
@media all {
.template-light-mode .nav-pills > li > a.active {
background-color: rgb(236, 240, 241);
}
.template-dark-mode .nav-pills > li > a.active {
background-color: rgb(48, 48, 48);
}
}
/* Small devices (tablets, 768px and up) */ /* Small devices (tablets, 768px and up) */
@media (min-width: 768px) { @media (min-width: 768px) {
/* class for vertically aligning columns in a bootstrap row */ /* class for vertically aligning columns in a bootstrap row */
.row.vertical-flexbox-row2 { .row.vertical-flexbox-row2 {
display: -webkit-box; display: -webkit-box;
@@ -77,7 +89,7 @@ ul.list-group.list-group-horizontal > li.list-group-item {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
} }
.row.vertical-flexbox-row2 > [class*='col-'] { .row.vertical-flexbox-row2 > [class*='col-'] {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -89,4 +101,4 @@ ul.list-group.list-group-horizontal > li.list-group-item {
.button-wrapper .btn { .button-wrapper .btn {
margin-bottom:5px; margin-bottom:5px;
} }
} }

View File

@@ -1,10 +1,10 @@
// Import the fonts from CDN // Import the fonts from CDN
@font-face { @font-face {
font-family: 'Glyphicons Halflings'; font-family: 'Glyphicons Halflings';
src: url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/fonts/glyphicons-halflings-regular.eot'); src: url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/fonts/glyphicons-halflings-regular.eot');
src: url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), src: url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),
url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/fonts/glyphicons-halflings-regular.woff2') format('woff2'),
url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/fonts/glyphicons-halflings-regular.woff') format('woff'), url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/fonts/glyphicons-halflings-regular.woff') format('woff'),
url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/fonts/glyphicons-halflings-regular.ttf') format('truetype'),
url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/fonts/glyphicons-halflings-regular.svg#@{icon-font-svg-id}') format('svg'); url('https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.4.0/fonts/glyphicons-halflings-regular.svg#@{icon-font-svg-id}') format('svg');
} }

View File

@@ -2,8 +2,8 @@
// To build a new CSS file you need to `npm install -g less less-plugin-clean-css` // To build a new CSS file you need to `npm install -g less less-plugin-clean-css`
// Then `lessc --clean-css darkly.less darkly.min.css` // Then `lessc --clean-css darkly.less darkly.min.css`
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/gh-pages/bower_components/bootstrap/less/bootstrap.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/bower_components/bootstrap/less/bootstrap.less";
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/gh-pages/darkly/variables.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/darkly/variables.less";
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/gh-pages/darkly/bootswatch.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/darkly/bootswatch.less";
@import "../bootstrap-locals.less"; @import "../bootstrap-locals.less";
@import "../flatly-shared.less"; @import "../flatly-shared.less";

File diff suppressed because one or more lines are too long

View File

@@ -2,9 +2,9 @@
// To build a new CSS file you need to `npm install -g less less-plugin-clean-css` // To build a new CSS file you need to `npm install -g less less-plugin-clean-css`
// Then `lessc --clean-css flatly.less flatly.min.css` // Then `lessc --clean-css flatly.less flatly.min.css`
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/gh-pages/bower_components/bootstrap/less/bootstrap.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/bower_components/bootstrap/less/bootstrap.less";
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/gh-pages/flatly/variables.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/flatly/variables.less";
@import "https://raw.githubusercontent.com/thomaspark/bootswatch/gh-pages/flatly/bootswatch.less"; @import "https://raw.githubusercontent.com/thomaspark/bootswatch/v3/flatly/bootswatch.less";
@import "../bootstrap-locals.less"; @import "../bootstrap-locals.less";
@import "../flatly-shared.less"; @import "../flatly-shared.less";

File diff suppressed because one or more lines are too long

View File

@@ -3,52 +3,60 @@
{% load navactive %} {% load navactive %}
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content=""> <meta name="description" content="">
<meta name="author" content=""> <meta name="author" content="">
{% include 'allianceauth/icons.html' %}
<title>{% block title %}{% block page_title %}{% endblock page_title %} - Alliance Auth{% endblock title %}</title> {% include 'allianceauth/icons.html' %}
{% include 'bundles/bootstrap-css.html' %} <title>{% block title %}{% block page_title %}{% endblock page_title %} - Alliance Auth{% endblock title %}</title>
{% include 'bundles/fontawesome.html' %}
<link href="{% static 'css/auth-base.css' %}" type="text/css" rel="stylesheet"> {% include 'bundles/bootstrap-css.html' %}
{% block extra_css %}{% endblock extra_css %} {% include 'bundles/fontawesome.html' %}
</head>
<body> <link href="{% static 'css/auth-base.css' %}" type="text/css" rel="stylesheet">
{% if user.is_authenticated %}
<div id="wrapper" class="container"> {% block extra_css %}{% endblock extra_css %}
<!-- Navigation --> </head>
{% include 'allianceauth/top-menu.html' %}
<div class="row" id="site-body-wrapper"> <body class="{% if NIGHT_MODE %}template-dark-mode{% else %}template-light-mode{% endif %}">
{% include 'allianceauth/side-menu.html' %} {% if user.is_authenticated %}
<div class="col-sm-10"> <div id="wrapper" class="container">
{% if messages %} <!-- Navigation -->
<br> {% include 'allianceauth/top-menu.html' %}
{% for message in messages %}
<div class="alert alert-{{ message.level_tag }}">{{ message }}</div> <div class="row" id="site-body-wrapper">
{% if not forloop.last %} {% include 'allianceauth/side-menu.html' %}
<div class="col-sm-10">
{% if messages %}
<br> <br>
{% for message in messages %}
<div class="alert alert-{{ message.level_tag }}">{{ message }}</div>
{% if not forloop.last %}
<br>
{% endif %}
{% endfor %}
{% endif %} {% endif %}
{% endfor %}
{% endif %} {% block content %}
{% block content %} {% endblock content %}
{% endblock content %} </div>
<div class="clearfix"></div>
</div>
</div> </div>
<div class="clearfix"></div> {% endif %}
</div>
</div> {% include 'bundles/bootstrap-js.html' %}
{% endif %}
{% include 'bundles/bootstrap-js.html' %} {% block extra_javascript %}
{% block extra_javascript %} {% endblock extra_javascript %}
{% endblock extra_javascript %}
<script> <script>
{% block extra_script %} {% block extra_script %}
{% endblock extra_script %} {% endblock extra_script %}
</script> </script>
</body> </body>
</html> </html>

View File

@@ -1,5 +1,5 @@
{% load i18n %} {% load i18n %}
<a href="{% url 'nightmode' %}?next={{ request.path|urlencode }}"> <a href="{% url 'nightmode' %}?next={{ request.path|urlencode }}">
{% trans "Night" %} {% trans "Night" %}
<i class="fa {% if NIGHT_MODE %}fa-toggle-on{% else %}fa-toggle-off{% endif %}" aria-hidden="true"></i> <i class="fas {% if NIGHT_MODE %}fa-toggle-on{% else %}fa-toggle-off{% endif %}" aria-hidden="true"></i>
</a> </a>

View File

@@ -1,7 +1,6 @@
{% load i18n %} {% load i18n %}
{% load navactive %} {% load navactive %}
{% load menu_items %} {% load menu_items %}
{% load groupmanagement %}
<div class="col-sm-2 auth-side-navbar" role="navigation"> <div class="col-sm-2 auth-side-navbar" role="navigation">
<div class="collapse navbar-collapse auth-menus-collapse auth-side-navbar-collapse"> <div class="collapse navbar-collapse auth-menus-collapse auth-side-navbar-collapse">
@@ -14,18 +13,9 @@
</li> </li>
<li> <li>
<a class="{% navactive request 'groupmanagement:groups' %}" href="{% url 'groupmanagement:groups' %}"> <a class="{% navactive request 'groupmanagement:groups' %}" href="{% url 'groupmanagement:groups' %}">
<i class="fas fa-sitemap fa-fw"></i> {% trans "Groups" %} <i class="fas fa-users fa-fw"></i> {% trans "Groups" %}
</a> </a>
</li> </li>
{% if request.user|can_manage_groups %}
<li>
<a class="{% navactive request 'groupmanagement:management groupmanagement:membership groupmanagement:membership_list' %}"
href="{% url 'groupmanagement:management' %}">
<i class="fas fa-sitemap fa-fw"></i> {% trans "Group Management" %}
</a>
</li>
{% endif %}
{% menu_items %} {% menu_items %}

View File

@@ -35,7 +35,7 @@
{% if user.is_staff %} {% if user.is_staff %}
<li><a href="{% url 'admin:index' %}">{% trans "Admin" %}</a></li> <li><a href="{% url 'admin:index' %}">{% trans "Admin" %}</a></li>
{% endif %} {% endif %}
<li><a href="{% url 'auth_logout' %}">{% trans "Logout" %}</a></li> <li><a href="{% url 'logout' %}">{% trans "Logout" %}</a></li>
{% else %} {% else %}
<li><a href="{% url 'authentication:login' %}">{% trans "Login" %}</a></li> <li><a href="{% url 'authentication:login' %}">{% trans "Login" %}</a></li>
{% endif %} {% endif %}

View File

@@ -1,20 +1,20 @@
{% load staticfiles %} {% load static %}
<!-- Bootstrap CSS --> <!-- Bootstrap CSS -->
{% if NIGHT_MODE %} {% if NIGHT_MODE %}
{% if debug %} {% if debug %}
<!-- In template debug, loading less file instead of CSS --> <!-- In template debug, loading less file instead of CSS -->
<link rel="stylesheet/less" type="text/css" href="{% static 'css/themes/darkly/darkly.less' %}" /> <link rel="stylesheet/less" type="text/css" href="{% static 'css/themes/darkly/darkly.less' %}" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.3/less.min.js"></script>
{% else %} {% else %}
<link rel="stylesheet" href="{% static 'css/themes/darkly/darkly.min.css' %}" /> <link rel="stylesheet" type="text/css" href="{% static 'css/themes/darkly/darkly.min.css' %}" />
{% endif %} {% endif %}
{% else %} {% else %}
{% if debug %} {% if debug %}
<!-- In template debug, loading less file instead of CSS --> <!-- In template debug, loading less file instead of CSS -->
<link rel="stylesheet/less" type="text/css" href="{% static 'css/themes/flatly/flatly.less' %}" /> <link rel="stylesheet/less" type="text/css" href="{% static 'css/themes/flatly/flatly.less' %}" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.2/less.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/less.js/2.7.3/less.min.js"></script>
{% else %} {% else %}
<link rel="stylesheet" href="{% static 'css/themes/flatly/flatly.min.css' %}" /> <link rel="stylesheet" type="text/css" href="{% static 'css/themes/flatly/flatly.min.css' %}" />
{% endif %} {% endif %}
{% endif %} {% endif %}
<!-- End Bootstrap CSS --> <!-- End Bootstrap CSS -->

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