Compare commits

..

33 Commits

Author SHA1 Message Date
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
112 changed files with 1251 additions and 894 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.0a2'
__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,12 +134,10 @@ 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"
def get_success_url(self, user): email_subject_template = "registration/activation_email_subject.txt"
if not getattr(settings, 'REGISTRATION_VERIFY_EMAIL', True): success_url = reverse_lazy('registration_complete')
return 'authentication:dashboard', (), {}
return super().get_success_url(user)
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
# We're storing a key in the session to pass user information from OAuth response. Make sure it's there. # We're storing a key in the session to pass user information from OAuth response. Make sure it's there.
@@ -176,6 +174,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,

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

@@ -13,7 +13,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-09-21 01:35+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: Rounon Dax <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"
@@ -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"
@@ -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:128
#: 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:120
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:124
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"
@@ -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:150
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:151
#: 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:159
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:168
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-09-21 01:41+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"
@@ -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 ""
@@ -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 ""
@@ -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

@@ -12,7 +12,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-05-08 00:57+0000\n" "POT-Creation-Date: 2020-09-21 01:35+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: frank1210 <francolopez_16@hotmail.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"
@@ -31,55 +31,53 @@ msgstr ""
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"
@@ -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:128
#: 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:120
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:124
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:224
msgid "Discord Account Disabled"
msgstr ""
#: allianceauth/services/modules/discord/models.py:226
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:150
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:151
#: 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:159
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:168
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"

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 # Seowon Jung <seowon@hawaii.edu>, 2020
# Olgeda Choi <undead.choi@gmail.com>, 2020 # Olgeda Choi <undead.choi@gmail.com>, 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-09-21 01:35+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"
@@ -32,55 +32,56 @@ msgstr "해당 기능을 수행하려면 주 캐릭터가 요구됨. 아래에
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,12 +152,12 @@ 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."
@@ -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:128
#: 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:120
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:124
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:224
msgid "Discord Account Disabled"
msgstr "디스코드 계정 비활성화"
#: allianceauth/services/modules/discord/models.py:226
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: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 "전체 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:159
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:168
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-09-21 01:35+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"
@@ -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 "Панель показателей"
@@ -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:128
#: 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:120
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:124
msgid "Rejected" msgid "Rejected"
msgstr "Отменено " msgstr "Отменено "
@@ -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: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 "Оценочная стоимость (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:159
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:168
msgid "No SRP requests for this fleet." msgid "No SRP requests for this fleet."
msgstr "SRP запросы отсутствуют" msgstr "SRP запросы отсутствуют"

View File

@@ -13,7 +13,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 03:24+0000\n" "POT-Creation-Date: 2020-09-21 01:35+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: Aaron BuBu <351793078@qq.com>, 2020\n"
"Language-Team: Chinese Simplified (https://www.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n" "Language-Team: Chinese Simplified (https://www.transifex.com/alliance-auth/teams/107430/zh-Hans/)\n"
@@ -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 "账户总览"
@@ -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:128
#: 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:120
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:124
msgid "Rejected" msgid "Rejected"
msgstr "拒绝" msgstr "拒绝"
@@ -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: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 "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: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 "玩家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:168
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

@@ -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,7 +221,7 @@ 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 disabeled automatically '
@@ -229,22 +230,22 @@ class DiscordUser(models.Model):
), ),
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

@@ -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 {
@@ -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,7 +99,9 @@ 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">{{ srpfleetrequest.character.character_name }}</td>
@@ -108,9 +111,9 @@ ESC to cancel{% endblocktrans %}"id="blah"></i></th>
</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">
@@ -138,6 +141,8 @@ ESC to cancel{% endblocktrans %}"id="blah"></i></th>
{% 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 +173,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 %}
@@ -202,7 +209,43 @@ ESC to cancel{% endblocktrans %}"id="blah"></i></th>
} }
}); });
}); });
$(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

@@ -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

@@ -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,19 +13,10 @@
</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 %}
</ul> </ul>

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 -->

View File

@@ -1,6 +1,4 @@
{% load static %} <!-- Start Bootstrap + jQuery js from cdnjs -->
<!-- Start Bootstrap + jQuery js --> <script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> <script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
<!-- End Bootstrap + jQuery js from cdnjs -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<!-- End Bootstrap + jQuery js -->

View File

@@ -0,0 +1,3 @@
<!-- Start Clipboard.js js from cdnjs -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/2.0.6/clipboard.min.js"></script>
<!-- End Clipboard.js js from cdnjs -->

View File

@@ -1,3 +1,3 @@
<!-- Start DataTables-css --> <!-- Start Datatables-css from cdnjs -->
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.15/css/dataTables.bootstrap.min.css"/> <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/css/dataTables.bootstrap.min.css"/>
<!-- End DataTables-css --> <!-- End Datatables-css from cdnjs -->

View File

@@ -1,4 +1,4 @@
<!-- Start DataTables-js --> <!-- Start Datatables-js from cdnjs -->
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.15/js/jquery.dataTables.min.js"></script> <script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.15/js/dataTables.bootstrap.min.js"></script> <script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/datatables/1.10.21/js/dataTables.bootstrap.min.js"></script>
<!-- End DataTables-js --> <!-- End Datatables-js from cdnjs -->

View File

@@ -1,4 +1,3 @@
{% load staticfiles %} <!-- Start FontAwesome CSS from cdnjs -->
<!-- Font Awesome Bundle --> <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.14.0/css/all.min.css" rel="stylesheet" type="text/css"> <!-- End FontAwesome CSS from cdnjs -->
<!-- End Font Awesome Bundle -->

View File

@@ -1,4 +1,3 @@
{% load static %} <!-- Start jQuery-DateTimePicker CSS from cdnjs -->
<!-- Start jQuery datetimepicker CSS --> <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.min.css"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.3.7/jquery.datetimepicker.min.css" rel="stylesheet" type="text/css"> <!-- End jQuery-DateTimePicker CSS from cdnjs -->
<!-- End jQuery datetimepicker CSS -->

View File

@@ -1,4 +1,3 @@
{% load static %} <!-- Start jQuery-DateTimePicker JS from cdnjs -->
<!-- Start jQuery datetimepicker js --> <script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.5.20/jquery.datetimepicker.full.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-datetimepicker/2.3.7/jquery.datetimepicker.min.js"></script> <!-- End jQuery-DateTimePicker JS from cdnjs -->
<!-- End jQuery datetimepicker js -->

View File

@@ -1,4 +1,7 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script> <!-- Start Moment.js from cdnjs -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/moment.min.js"></script>
{% if locale and LANGUAGE_CODE != 'en' %} {% if locale and LANGUAGE_CODE != 'en' %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/locale/{{ LANGUAGE_CODE }}.js"></script> <!-- Moment.JS Not EN-en -->
<script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.27.0/locale/{{ LANGUAGE_CODE }}.js"></script>
{% endif %} {% endif %}
<!-- End Moment JS from cdnjs -->

View File

@@ -1,4 +1,3 @@
{% load static %} <!-- Start X-editable JS from cdnjs -->
<!-- Start X-Editablle js --> <script type="application/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/js/bootstrap-editable.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/js/bootstrap-editable.min.js"></script> <!-- End X-editable JS from cdnjs -->
<!-- End X-Editable js -->

View File

@@ -1,4 +1,3 @@
{% load staticfiles %} <!-- Start X-editable CSS from cdnjs -->
<!-- X-Editable Core CSS --> <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/css/bootstrap-editable.css"/>
<link href="https://cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.1/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet"> <!-- End X-editable CSS from cdnjs -->
<!-- End Bootstrap CSS -->

View File

@@ -146,7 +146,7 @@ class AuthUtils:
if alliance_id: if alliance_id:
try: try:
alliance_id = int(alliance_id) alliance_id = int(alliance_id)
except: except Exception:
alliance_id = None alliance_id = None
char = EveCharacter.objects.create( char = EveCharacter.objects.create(
@@ -180,7 +180,7 @@ class AuthUtils:
if alliance_id: if alliance_id:
try: try:
alliance_id = int(alliance_id) alliance_id = int(alliance_id)
except: except Exception:
alliance_id = None alliance_id = None
char = EveCharacter.objects.create( char = EveCharacter.objects.create(
@@ -220,7 +220,7 @@ class AuthUtils:
) )
@classmethod @classmethod
def add_permissions_to_user(cls, perms, user, disconnect_signals=True): def add_permissions_to_user(cls, perms, user, disconnect_signals=True) -> User:
"""add list of permissions to user """add list of permissions to user
perms: list of Permission objects perms: list of Permission objects
@@ -239,10 +239,12 @@ class AuthUtils:
if disconnect_signals: if disconnect_signals:
cls.connect_signals() cls.connect_signals()
return user
@classmethod @classmethod
def add_permission_to_user_by_name( def add_permission_to_user_by_name(
cls, perm, user, disconnect_signals=True cls, perm, user, disconnect_signals=True
): ) -> User:
"""returns permission specified by qualified name """returns permission specified by qualified name
perm: Permission name as 'app_label.codename' perm: Permission name as 'app_label.codename'
@@ -252,7 +254,7 @@ class AuthUtils:
disconnect_signals: whether to run process without signals disconnect_signals: whether to run process without signals
""" """
p = cls.get_permission_by_name(perm) p = cls.get_permission_by_name(perm)
cls.add_permissions_to_user([p], user, disconnect_signals) return cls.add_permissions_to_user([p], user, disconnect_signals)
@staticmethod @staticmethod
def get_permission_by_name(perm: str) -> Permission: def get_permission_by_name(perm: str) -> Permission:
@@ -270,6 +272,7 @@ class AuthUtils:
content_type__app_label=perm_parts[0], codename=perm_parts[1] content_type__app_label=perm_parts[0], codename=perm_parts[1]
) )
class BaseViewTestCase(TestCase): class BaseViewTestCase(TestCase):
def setUp(self): def setUp(self):
self.member = AuthUtils.create_member('auth_member') self.member = AuthUtils.create_member('auth_member')

View File

@@ -39,7 +39,7 @@ class TestAuthUtils(TestCase):
def test_can_add_permission_to_user_by_name(self): def test_can_add_permission_to_user_by_name(self):
user = AuthUtils.create_user('Bruce Wayne') user = AuthUtils.create_user('Bruce Wayne')
AuthUtils.add_permission_to_user_by_name( user = AuthUtils.add_permission_to_user_by_name(
'auth.timer_management', user 'auth.timer_management', user
) )
self.assertTrue(user.has_perm('auth.timer_management')) self.assertTrue(user.has_perm('auth.timer_management'))

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