Compare commits

...

8 Commits

Author SHA1 Message Date
Adarnof
6d6a3a3d6b Allow viewing corpstats added by the user.
Order corpstats by corp name.
2018-05-10 14:25:57 -04:00
colcrunch
5006246cf1 Build TS perm key using State Information (#1044)
Build permkey with state group id
Pass user object to add_user instead of just username

Fixes #1043
2018-05-09 20:39:14 -04:00
Basraah
6187fb9b86 Timer JS fixes (#1054)
Add months to duration output
Update momentjs
Move EVE time generation function to shared source

Fixes timerboard showing EVE time as local time.
Changed to show 24 hour time.
2018-05-09 20:31:02 -04:00
Adarnof
86f57ccd56 Allow reversing service migrations.
This is probably the wrong way as we should really take care of removing the permission we added, but I don't see a reason anyone would need to migrate back that far as auth wouldn't work anymore without XML api (and even so newer installs don't have the settings referenced so permissions are not automagically added by the migration). So noop is bad but acceptable to me.

Thanks @mmolitor87
2018-05-08 10:06:58 -04:00
colcrunch
854096bac7 fix alliancelogo on corp stats page 2018-05-07 23:26:37 -04:00
Adarnof
9d2b3bb157 Include compiled messages.
It doesn't work without these if DEBUG is False. And users can't compile them outside the allianceauth source directory.

When editing translations, compile with: django-admin compilemessages --settings=allianceauth.project_template.project_name.settings.base
2018-05-02 21:42:26 -04:00
Adarnof
22bda62e59 Spanish translations courtesy of @frank1210
Fixed a few problems with translating the menu links - they had leading spaces.
2018-05-02 20:49:21 -04:00
Adarnof
7212a7a328 Example supervisor config for authenticator. Ensure ICE is active in config. 2018-05-01 16:40:37 -04:00
33 changed files with 2146 additions and 87 deletions

1
.gitignore vendored
View File

@@ -42,7 +42,6 @@ nosetests.xml
coverage.xml
# Translations
*.mo
*.pot
# Django stuff:

View File

@@ -1,7 +1,7 @@
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
__version__ = '2.0.1'
__version__ = '2.0.2'
NAME = 'Alliance Auth v%s' % __version__
default_app_config = 'allianceauth.apps.AllianceAuthConfig'

View File

@@ -1,5 +1,5 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook
from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks
from allianceauth.corputils import urls
@@ -7,7 +7,7 @@ from allianceauth.corputils import urls
class CorpStats(MenuItemHook):
def __init__(self):
MenuItemHook.__init__(self,
'Corporation Stats',
_('Corporation Stats'),
'fa fa-share-alt fa-fw',
'corputils:view',
navactive=['corputils:'])

View File

@@ -11,7 +11,7 @@
{% if corpstats.corp.alliance %}{% else %}col-lg-offset-3{% endif %}"><img
class="ra-avatar" src="{{ corpstats.corp.logo_url_128 }}"></td>
{% if corpstats.corp.alliance %}
<td class="text-center col-lg-6"><img class="ra-avatar" src="{{ corpstats.alliance.logo_url_128 }}">
<td class="text-center col-lg-6"><img class="ra-avatar" src="{{ corpstats.corp.alliance.logo_url_128 }}">
</td>
{% endif %}
</tr>
@@ -202,4 +202,4 @@
});
});
{% endblock %}
{% endblock %}

View File

@@ -17,7 +17,8 @@ SWAGGER_SPEC_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sw
def access_corpstats_test(user):
return user.has_perm('corputils.view_corp_corpstats') or user.has_perm(
'corputils.view_alliance_corpstats') or user.has_perm('corputils.view_state_corpstats')
'corputils.view_alliance_corpstats') or user.has_perm('corputils.view_state_corpstats') or user.has_perm(
'corputils.add_corpstats')
@login_required
@@ -62,7 +63,7 @@ def corpstats_view(request, corp_id=None):
corpstats = get_object_or_404(CorpStats, corp=corp)
# get available models
available = CorpStats.objects.visible_to(request.user)
available = CorpStats.objects.visible_to(request.user).order_by('corp__corporation_name')
# ensure we can see the requested model
if corpstats and corpstats not in available:

View File

@@ -1,12 +1,12 @@
from . import urls
from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks
from allianceauth.services.hooks import MenuItemHook, UrlHook
@hooks.register('menu_item_hook')
def register_menu():
return MenuItemHook('Fleet Activity Tracking', 'fa fa-users fa-lightbulb-o fa-fw', 'fatlink:view',
return MenuItemHook(_('Fleet Activity Tracking'), 'fa fa-users fa-lightbulb-o fa-fw', 'fatlink:view',
navactive=['fatlink:'])

View File

@@ -1,5 +1,5 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook
from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks
from allianceauth.hrapplications import urls
@@ -7,7 +7,7 @@ from allianceauth.hrapplications import urls
class ApplicationsMenu(MenuItemHook):
def __init__(self):
MenuItemHook.__init__(self,
'Applications',
_('Applications'),
'fa fa-file-o fa-fw',
'hrapplications:index',
navactive=['hrapplications:'])

Binary file not shown.

View File

@@ -1096,52 +1096,57 @@ msgid "Main Navigation"
msgstr "Haupmenü"
#: stock/templates/registered/base.html:106
msgid " Dashboard"
msgstr " Dashboard"
#: stock/templates/registered/dashboard.html:5
#: stock/templates/registered/dashboard.html:9
msgid "Dashboard"
msgstr "Dashboard"
#: stock/templates/registered/base.html:113
msgid " Groups"
msgstr " Gruppen"
#: stock/templates/registered/dashboard.html:52
msgid "Groups"
msgstr "Gruppen"
#: stock/templates/registered/base.html:120
msgid " Help"
msgstr " Hilfe"
msgid "Help"
msgstr "Hilfe"
#: stock/templates/registered/base.html:126
msgid "Aux Navigation"
msgstr "Zusatz Navigation"
#: stock/templates/registered/base.html:131
msgid " Services"
msgstr " Dienste"
msgid "Services"
msgstr "Dienste"
#: stock/templates/registered/base.html:140
msgid " Applications"
msgstr " Bewerbungen"
msgid "Applications"
msgstr "Bewerbungen"
#: stock/templates/registered/base.html:148
msgid " Corporation Stats"
msgstr " Korporationsstatistiken"
msgid "Corporation Stats"
msgstr "Korporationsstatistiken"
#: stock/templates/registered/base.html:156
msgid " Group Management"
msgstr " Gruppenverwaltung"
#: stock/templates/registered/groupmanagementmenu.html:14
msgid "Group Management"
msgstr "Gruppenverwaltung"
#: stock/templates/registered/base.html:174
msgid " Fleet Operations"
msgstr " Flottenoperationen"
msgid "Fleet Operations"
msgstr "Flottenoperationen"
#: stock/templates/registered/base.html:181
msgid " Structure Timers"
msgstr " Strukturen Timer"
#: stock/templates/registered/timermanagement.html:13
msgid "Structure Timers"
msgstr "Strukturen Timer"
#: stock/templates/registered/base.html:188
msgid " Fleet Activity Tracking"
msgstr " Flottenaktivitäts-Tracking"
msgid "Fleet Activity Tracking"
msgstr "Flottenaktivitäts-Tracking"
#: stock/templates/registered/base.html:194
msgid " Ship Replacement"
msgstr " Schiffs erstattung"
msgid "Ship Replacement"
msgstr "Schiffs erstattung"
#: stock/templates/registered/base.html:200
msgid "Util"
@@ -1156,7 +1161,7 @@ msgid "Change Password"
msgstr "Passwort ändern"
#: stock/templates/registered/base.html:211
msgid " Fleet Broadcast Formatter"
msgid "Fleet Broadcast Formatter"
msgstr "Flottenübertragungen Formatierer "
#: stock/templates/public/login.html:57
@@ -1293,11 +1298,6 @@ msgstr "Corporation: "
msgid "Corporation Ticker: "
msgstr "Corporation Ticker: "
#: stock/templates/registered/dashboard.html:5
#: stock/templates/registered/dashboard.html:9
msgid "Dashboard"
msgstr "Dashboard"
#: stock/templates/registered/dashboard.html:38
msgid "Missing main character model."
msgstr "Hauptcharakter model fehlt"
@@ -1310,10 +1310,6 @@ msgstr "API Key hinzufügen"
msgid "Change Main"
msgstr "Hauptcharakter ändern"
#: stock/templates/registered/dashboard.html:52
msgid "Groups"
msgstr "Gruppen"
#: stock/templates/registered/dashboard.html:71
msgid "API Key requires EVE SSO verification"
msgstr "API Key benötigt EVE SSO bestätigung"
@@ -1601,10 +1597,6 @@ msgstr "Keine Gruppenbeitrittsanfragen."
msgid "No group leave requests."
msgstr "Keine Gruppenaustrittsanfragen"
#: stock/templates/registered/groupmanagementmenu.html:14
msgid "Group Management"
msgstr "Gruppenmanagement"
#: stock/templates/registered/groupmanagementmenu.html:19
msgid "Group Requests"
msgstr "Gruppen anfragen"
@@ -2171,10 +2163,6 @@ msgstr "Server beitreten"
msgid "Structure Timer Management"
msgstr "Struktur-Timer Verwaltung"
#: stock/templates/registered/timermanagement.html:13
msgid "Structure Timers"
msgstr "Struktur-Timer"
#: stock/templates/registered/timermanagement.html:26
msgid "Corp Timers"
msgstr "Corp Timer"

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,12 +1,12 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook
from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks
from . import urls
class OpTimerboardMenu(MenuItemHook):
def __init__(self):
MenuItemHook.__init__(self, 'Fleet Operations',
MenuItemHook.__init__(self, _('Fleet Operations'),
'fa fa-exclamation fa-fw',
'optimer:view',
navactive=['optimer:'])

View File

@@ -19,7 +19,8 @@
<div class="col-lg-12 text-center row">
<div class="label label-info text-left">
<b>{% trans "Current Eve Time:" %} </b>
</div><div class="label label-info text-left" id="current-time"></div>
</div>
<strong class="label label-info text-left" id="current-time"></strong>
<br />
</div>
@@ -111,7 +112,7 @@
}
function updateClock() {
document.getElementById("current-time").innerHTML = "<b>" + moment.utc().format('LLLL') + "</b>";
document.getElementById("current-time").innerHTML = getCurrentEveTimeString();
}
</script>
{% endblock content %}

View File

@@ -82,6 +82,7 @@ ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('de', ugettext('German')),
('es', ugettext('Spanish')),
)
TEMPLATES = [

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='discorduser',
options={'permissions': (('access_discord', 'Can access the Discord service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -58,5 +58,5 @@ class Migration(migrations.Migration):
name='discourseuser',
options={'permissions': (('access_discourse', 'Can access the Discourse service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='ips4user',
options={'permissions': (('access_ips4', 'Can access the IPS4 service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='marketuser',
options={'permissions': (('access_market', 'Can access the Evernus Market service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='mumbleuser',
options={'permissions': (('access_mumble', 'Can access the Mumble service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='openfireuser',
options={'permissions': (('access_openfire', 'Can access the Openfire service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='phpbb3user',
options={'permissions': (('access_phpbb3', 'Can access the phpBB3 service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='smfuser',
options={'permissions': (('access_smf', 'Can access the SMF service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -179,18 +179,19 @@ class Teamspeak3Manager:
except:
logger.exception("An unhandled exception has occured while syncing TS groups.")
def add_user(self, username):
username_clean = self.__santatize_username(username[:30])
def add_user(self, user, fmt_name):
username_clean = self.__santatize_username(fmt_name[:30])
logger.debug("Adding user to TS3 server with cleaned username %s" % username_clean)
server_groups = self._group_list()
if 'Member' not in server_groups:
self._create_group('Member')
state = user.profile.state.name
if state not in server_groups:
self._create_group(state)
alliance_group_id = self._group_id_by_name('Member')
state_group_id = self._group_id_by_name(state)
try:
ret = self.server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': alliance_group_id, 'tokenid2': 0,
ret = self.server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': state_group_id, 'tokenid2': 0,
'tokendescription': username_clean,
'tokencustomset': "ident=sso_uid value=%s" % username_clean})
except TeamspeakError as e:

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='teamspeak3user',
options={'permissions': (('access_teamspeak3', 'Can access the Teamspeak3 service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -22,7 +22,7 @@ def activate_teamspeak3(request):
character = request.user.profile.main_character
with Teamspeak3Manager() as ts3man:
logger.debug("Adding TS3 user for user %s with main character %s" % (request.user, character))
result = ts3man.add_user(Teamspeak3Tasks.get_username(request.user))
result = ts3man.add_user(request.user, Teamspeak3Tasks.get_username(request.user))
# if its empty we failed
if result[0] is not "":

View File

@@ -57,5 +57,5 @@ class Migration(migrations.Migration):
name='xenforouser',
options={'permissions': (('access_xenforo', 'Can access the XenForo service'),)},
),
migrations.RunPython(migrate_service_enabled),
migrations.RunPython(migrate_service_enabled, migrations.RunPython.noop),
]

View File

@@ -1,12 +1,12 @@
from allianceauth.services.hooks import MenuItemHook, UrlHook
from django.utils.translation import ugettext_lazy as _
from allianceauth import hooks
from . import urls
class SrpMenu(MenuItemHook):
def __init__(self):
MenuItemHook.__init__(self, 'Ship Replacement',
MenuItemHook.__init__(self, _('Ship Replacement'),
'fa fa-money fa-fw',
'srp:management',
navactive=['srp:'])

View File

@@ -8,8 +8,16 @@ function getDurationString(duration) {
if (duration.years()) {
out += duration.years() + 'y ';
}
if (duration.months()) {
out += duration.months() + 'm ';
}
if (duration.days()) {
out += duration.days() + 'd ';
}
return out + duration.hours() + "h " + duration.minutes() + "m " + duration.seconds() + "s";
}
function getCurrentEveTimeString() {
return moment().utc().format('dddd LL HH:mm:ss')
}

View File

@@ -1,11 +1,12 @@
{% extends "allianceauth/base.html" %}
{% load i18n %}
{% block page_title %}Help{% endblock page_title %}
{% block page_title %}{% trans "Help" %}{% endblock page_title %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">Help</h1>
<h1 class="page-header text-center">{% trans "Help" %}</h1>
<div class="container-fluid">
<div class="embed-responsive embed-responsive-16by9">

View File

@@ -7,12 +7,12 @@
<li>
<a class="{% navactive request 'authentication:dashboard' %}"
href="{% url 'authentication:dashboard' %}">
<i class="fa fa-dashboard fa-fw"></i>{% trans " Dashboard" %}
<i class="fa fa-dashboard fa-fw"></i> {% trans "Dashboard" %}
</a>
</li>
<li>
<a class="{% navactive request 'groupmanagement:groups' %}" href="{% url 'groupmanagement:groups' %}">
<i class="fa fa-cogs fa-fw fa-sitemap"></i>{% trans " Groups" %}
<i class="fa fa-cogs fa-fw fa-sitemap"></i> {% trans "Groups" %}
</a>
</li>
@@ -20,7 +20,7 @@
<li>
<a class="{% navactive request 'groupmanagement:management groupmanagement:membership groupmanagement:membership_list' %}"
href="{% url 'groupmanagement:management' %}">
<i class="fa fa-lock fa-sitemap fa-fw"></i>{% trans " Group Management" %}
<i class="fa fa-lock fa-sitemap fa-fw"></i> {% trans "Group Management" %}
</a>
</li>
{% endif %}
@@ -30,7 +30,7 @@
<li>
<a class="{% navactive request 'authentication:help' %}"
href="{% url 'authentication:help' %}">
<i class="fa fa-question fa-fw"></i>{% trans " Help" %}
<i class="fa fa-question fa-fw"></i> {% trans "Help" %}
</a>
</li>
</ul>

View File

@@ -1,4 +1,4 @@
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
{% if locale and LANGUAGE_CODE != 'en' %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/locale/{{ LANGUAGE_CODE }}.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/locale/{{ LANGUAGE_CODE }}.js"></script>
{% endif %}

View File

@@ -18,7 +18,8 @@
<div class="col-lg-12 text-center">
<div class="label label-info text-left">
<b>{% trans "Current Eve Time:" %} </b>
</div><div class="label label-info text-left" id="current-time"></div>
</div>
<strong class="label label-info text-left" id="current-time"></strong>
</div>
{% if corp_timers %}
<h4><b>{% trans "Corp Timers" %}</b></h4>
@@ -555,7 +556,7 @@
}
function updateClock() {
document.getElementById("current-time").innerHTML = "<b>" + moment().format('LLLL') + "</b>";
document.getElementById("current-time").innerHTML = getCurrentEveTimeString();
}
</script>
{% endblock content %}

View File

@@ -34,6 +34,7 @@ Mumble ships with a configuration file that needs customization. By default it
REQUIRED: To enable the ICE authenticator, edit the following:
- `icesecretwrite=MY_CLEVER_PASSWORD`, obviously choosing a secure password
- ensure the line containing `Ice="tcp -h 127.0.0.1 -p 6502"` is uncommented
By default mumble operates on SQLite which is fine, but slower than a dedicated MySQL server. To customize the database, edit the following:
@@ -46,7 +47,7 @@ By default mumble operates on SQLite which is fine, but slower than a dedicated
To name your root channel, uncomment and set `registerName=` to whatever cool name you want
Save and close the file (control + O, control + X).
Save and close the file.
To get Mumble superuser account credentials, run the following:
@@ -80,7 +81,21 @@ Test your configuration by starting it: `python authenticator.py`
## Running the Authenticator
The authenticator needs to be running 24/7 to validate users on Mumble. You should check the [supervisor docs](../auth/supervisor.md) on how to achieve this.
The authenticator needs to be running 24/7 to validate users on Mumble. This can be achieved by adding a section to your auth project's supervisor config file like the following example:
```
[program:authenticator]
command=/path/to/venv/bin/python authenticator.py
directory=/path/to/authenticator/directory/
user=allianceserver
stdout_logfile=/path/to/authenticator/directory/authenticator.log
stderr_logfile=/path/to/authenticator/directory/authenticator.log
autostart=true
autorestart=true
startsecs=10
priority=998
```
Note that groups will only be created on Mumble automatically when a user joins who is in the group.