Compare commits

...

42 Commits

Author SHA1 Message Date
Ariel Rin
5de19c43df Version Bump 4.0.0a4 2023-11-09 00:13:45 +10:00
Ariel Rin
6a0ddc9a83 Merge branch 'docker-superlance' into 'v4.x'
Add superlance/memmon path to the project bootstrap

See merge request allianceauth/allianceauth!1560
2023-11-08 13:39:11 +00:00
Ariel Rin
03be66d11f multilines dont work in our yaml 2023-11-08 23:26:12 +10:00
Ariel Rin
7e312bb95f four args now 2023-11-08 20:25:24 +10:00
Ariel Rin
c92fee78e2 add superlance/memmon path to the bootstrap 2023-11-08 20:01:07 +10:00
Ariel Rin
658a8cd6ce Merge branch 'task-queue-progressbar-background' into 'v4.x'
[FIX] Celery task status bar background

See merge request allianceauth/allianceauth!1559
2023-11-08 03:31:48 +00:00
Peter Pfeufer
c1dc130766 [FIX] Celery task status bar background 2023-11-07 15:21:44 +01:00
Ariel Rin
35f5573b63 Merge branch 'js-fixes' into 'v4.x'
JS Fixes

See merge request allianceauth/allianceauth!1556
2023-11-06 13:49:31 +00:00
Peter Pfeufer
21f0a96422 [CHANGE] Modernize and convert to ES6+ 2023-10-31 22:00:43 +01:00
Peter Pfeufer
9e47d19337 [ADD] Missing semicolons 2023-10-31 21:48:18 +01:00
Peter Pfeufer
2c5972d0ab [ADD] Refresh notification icon script
Similar to what we have in AAv3 for the notification count
2023-10-31 21:47:40 +01:00
Ariel Rin
ee41d62c13 Merge branch 'quickfix-services-control-template' into 'v4.x'
[REMOVE] Deprecated overrides …

See merge request allianceauth/allianceauth!1555
2023-10-31 13:29:48 +00:00
Peter Pfeufer
346b4014a9 [ADD] Missing semicolon
Just for the sake of it …
2023-10-31 14:13:01 +01:00
Peter Pfeufer
9b56a441ed [REMOVE] Deprecated overrides … 2023-10-31 14:10:26 +01:00
Ariel Rin
068bf1ae7a Merge branch 'services-template-improvements' into 'v4.x'
Services template improvements

See merge request allianceauth/allianceauth!1553
2023-10-31 12:42:08 +00:00
Peter Pfeufer
5be686e3ca [FIX] Username check 2023-10-31 13:28:38 +01:00
Ariel Rin
a215b4411c Merge branch 'v4theme' into 'v4.x'
Missing Import on views

See merge request allianceauth/allianceauth!1554
2023-10-31 12:14:15 +00:00
Ariel Rin
e15cfa0fb1 Missing Import on views 2023-10-31 12:14:14 +00:00
Peter Pfeufer
46d51699f4 [CHANGE] Service delete confirm template converted to BS5 2023-10-31 11:59:12 +01:00
Peter Pfeufer
ff30a136d5 [CHANGE] Service credentials template converted to BS5 2023-10-31 11:56:18 +01:00
Peter Pfeufer
6dcf3304d5 Merge remote-tracking branch 'origin/services-template-improvements' into services-template-improvements 2023-10-31 11:49:49 +01:00
Peter Pfeufer
beddeea338 [CHANGE] Discourse service status badge text 2023-10-31 11:49:18 +01:00
Ariel Rin
69723937f7 Merge branch 'update-project-classifier' into 'v4.x'
[CHANGE] Update project classifier for Django

See merge request allianceauth/allianceauth!1551
2023-10-31 10:01:14 +00:00
Ariel Rin
c541f56ee2 Merge branch 'fix-dashboard-timers' into 'v4.x'
[FIX] EveCorporationInfo matching query does not exist

See merge request allianceauth/allianceauth!1552
2023-10-31 10:01:03 +00:00
Peter Pfeufer
7e887e5e34 [ADD] General template include for username line 2023-10-31 10:47:06 +01:00
Peter Pfeufer
072327c79f [CHANGE] Comment active section for nor for Discourse service
The Discourse service doesn't seem to have anything to determine weather it's active or not.
2023-10-31 10:38:01 +01:00
Peter Pfeufer
28af3ff11e [CHANGE] Sort service card information to be a bit more uniform in apperance 2023-10-31 10:27:49 +01:00
Peter Pfeufer
e3b151f2fb [CHANGE] Use BS5 forms 2023-10-31 10:25:04 +01:00
Peter Pfeufer
f87d7dbdf8 [FIX] Normalization of TeamSpeak3 service name 2023-10-31 10:12:02 +01:00
Peter Pfeufer
a04e6ae3d0 [FIX] Normalization of IPSuite4 service name 2023-10-31 10:09:43 +01:00
Peter Pfeufer
15042f5e77 [FIX] Capitalization of Discord service name 2023-10-31 10:07:47 +01:00
Peter Pfeufer
6e25361d5e [FIX] Capitalization of XenForo service name 2023-10-31 10:06:36 +01:00
Peter Pfeufer
9e639a0eeb [FIX] Capitalization of SMF service name 2023-10-31 10:04:55 +01:00
Peter Pfeufer
257fbdef36 [FIX] Capitalization of Jabber service name 2023-10-31 10:03:06 +01:00
Peter Pfeufer
df003c8ec5 [CHANGE] TS³ service template 2023-10-31 09:57:54 +01:00
Peter Pfeufer
ba22685eb8 [CHANGE] Discourse service template 2023-10-31 09:53:09 +01:00
Peter Pfeufer
773288072a [CHANGE] Discord service 2023-10-31 09:48:29 +01:00
Peter Pfeufer
63afb13d25 [CHANGE] Mumble service template 2023-10-31 09:48:07 +01:00
Peter Pfeufer
5dd286bbe7 [CHANGE] Set a default via status template 2023-10-31 09:47:22 +01:00
Peter Pfeufer
8aaa8172ca [CHANGE] Only show username when there is a username 2023-10-31 08:58:30 +01:00
Peter Pfeufer
b68b401146 [FIX] EveCorporationInfo matching query does not exist 2023-10-29 11:55:42 +01:00
Peter Pfeufer
a6526d6f78 [CHANGE] Update project classifier for Django 2023-10-28 00:12:40 +02:00
35 changed files with 362 additions and 230 deletions

View File

@@ -223,7 +223,7 @@ test-docs:
<<: *only-default
image: python:3.11-bullseye
script:
- tox -e docs
- tox -e docs
deploy_production:
stage: deploy
@@ -259,16 +259,7 @@ build-image:
docker run --privileged --rm tonistiigi/binfmt --uninstall qemu-*
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --use --name new-builder
docker buildx build .
--tag $IMAGE_TAG
--tag $CURRENT_TAG
--tag $MINOR_TAG
--tag $MAJOR_TAG
--tag $LATEST_TAG
--file docker/Dockerfile
--platform linux/amd64,linux/arm64
--push
--build-arg AUTH_VERSION=$(echo $CI_COMMIT_TAG | cut -c 2-)
docker buildx build . --tag $IMAGE_TAG --tag $CURRENT_TAG --tag $MINOR_TAG --tag $MAJOR_TAG --tag $LATEST_TAG --file docker/Dockerfile --platform linux/amd64,linux/arm64 --push --build-arg AUTH_VERSION=$(echo $CI_COMMIT_TAG | cut -c 2-)
rules:
- if: $CI_COMMIT_TAG
when: delayed
@@ -288,12 +279,7 @@ build-image-dev:
docker run --privileged --rm tonistiigi/binfmt --uninstall qemu-*
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --use --name new-builder
docker buildx build .
--tag $IMAGE_TAG
--file docker/Dockerfile
--platform linux/amd64,linux/arm64
--push
--build-arg AUTH_PACKAGE=git+https://gitlab.com/allianceauth/allianceauth@$CI_COMMIT_BRANCH
docker buildx build . --tag $IMAGE_TAG --file docker/Dockerfile --platform linux/amd64,linux/arm64 --push --build-arg AUTH_PACKAGE=git+https://gitlab.com/allianceauth/allianceauth@$CI_COMMIT_BRANCH
rules:
- if: '$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME == ""'
when: manual
@@ -314,12 +300,7 @@ build-image-mr:
docker run --privileged --rm tonistiigi/binfmt --uninstall qemu-*
docker run --privileged --rm tonistiigi/binfmt --install all
docker buildx create --use --name new-builder
docker buildx build .
--tag $IMAGE_TAG
--file docker/Dockerfile
--platform linux/amd64,linux/arm64
--push
--build-arg AUTH_PACKAGE=git+$CI_MERGE_REQUEST_SOURCE_PROJECT_URL@$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
docker buildx build . --tag $IMAGE_TAG --file docker/Dockerfile --platform linux/amd64,linux/arm64 --push --build-arg AUTH_PACKAGE=git+$CI_MERGE_REQUEST_SOURCE_PROJECT_URL@$CI_MERGE_REQUEST_SOURCE_BRANCH_NAME
rules:
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: manual

View File

@@ -5,7 +5,7 @@ manage online service access.
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
__version__ = '4.0.0a3'
__version__ = '4.0.0a4'
__title__ = 'Alliance Auth'
__url__ = 'https://gitlab.com/allianceauth/allianceauth'
NAME = f'{__title__} v{__version__}'

View File

@@ -12,13 +12,14 @@ class StartProject(BaseStartProject):
parser.add_argument('--python', help='The path to the python executable.')
parser.add_argument('--celery', help='The path to the celery executable.')
parser.add_argument('--gunicorn', help='The path to the gunicorn executable.')
parser.add_argument('--memmon', help='The path to the memmon executable.')
def create_project(parser, options, args):
# Validate args
if len(args) < 2:
parser.error("Please specify a name for your Alliance Auth installation.")
elif len(args) > 3:
elif len(args) > 4:
parser.error("Too many arguments.")
# First find the path to Alliance Auth

View File

@@ -70,22 +70,21 @@ class DiscordService(ServicesHook):
discord_username = self.get_discord_username(
username=username, discriminator=discriminator
)
# if username and discriminator:
# discord_username = f'{username}#{discriminator}'
#
# # New Discord user name format
# if discriminator == '0':
# discord_username = f'@{username}'
# else:
# discord_username = ''
else:
discord_username = ''
user_has_account = False
urls = self.Urls()
urls.auth_activate = 'discord:activate'
urls.auth_deactivate = 'discord:deactivate'
urls.auth_reset = 'discord:reset'
urls.auth_add_bot = 'discord:add_bot'
return render_to_string(
self.service_ctrl_template,
{
'service_name': self.title,
'urls': urls,
'server_name': server_name(),
'user_has_account': user_has_account,
'discord_username': discord_username

View File

@@ -1,34 +1,49 @@
{% extends "services/services_ctrl_base.html" %}
{% load i18n %}
<div class="card text-center m-4" style="min-width: 18rem; min-height: 18rem;">
<div class="card-body ">
<h5 class="card-title ">{% translate "Discord" %}</h5>
<p class="card-text">{% if server_name %}{{ server_name }}{% else %}{% translate "Unlinked Server" %}{% endif %}</p>
<p class="card-text"><span class="badge {% if user_has_account %}bg-success{% else %}bg-warning{% endif %}">{% if user_has_account %}{% translate "Active" %}{% else %}{% translate "Disabled" %}{% endif %}</span></p>
<p class="card-text">
{% if not user_has_account %}
{% translate "(not activated)" %}
{% else %}
{{ discord_username }}
{% endif %}
</p>
</div>
<div class="card-footer">
{% if not user_has_account %}
<a href="{% url 'discord:activate' %}" title="{% translate 'Join the Discord server' %}" class="btn btn-primary">
{% block title %}
{{ service_name }}
{% endblock %}
{% block url %}
{{ server_name }}
{% endblock %}
{% block active %}
{% include "services/service_status.html" with username=discord_username %}
{% endblock %}
{% block user %}
{% if discord_username %}
{{ discord_username }}
{% endif %}
{% endblock %}
{% block controls %}
{% if not user_has_account %}
{% if urls.auth_activate %}
<a class="btn btn-warning" href="{% url urls.auth_activate %}" title="{% translate 'Activate' %}">
<span class="fas fa-check fa-fw"></span>
</a>
{% else %}
<a href="{% url 'discord:reset' %}" title="{% translate 'Leave- and rejoin the Discord Server (Reset)' %}" class="btn btn-warning">
{% endif %}
{% else %}
{% if urls.auth_reset %}
<a class="btn btn-primary" href="{% url urls.auth_reset %}" title="{% translate 'Reset Password' %}">
<span class="fas fa-sync fa-fw"></span>
</a>
<a href="{% url 'discord:deactivate' %}" title="{% translate 'Leave the Discord server' %}" class="btn btn-danger">
{% endif %}
{% if urls.auth_deactivate %}
<a class="btn btn-danger" href="{% url urls.auth_deactivate %}" title="{% translate 'Deactivate' %}">
<span class="fas fa-times fa-fw"></span>
</a>
{% endif %}
{% if request.user.is_superuser %}
<a type="button" id="btnLinkDiscordServer" class="btn btn-primary" href="{% url 'discord:add_bot' %}">
<span class="fas fa-link fa-fw"></span>
</a>
{% endif %}
</div>
</div>
{% endif %}
{% if request.user.is_superuser %}
<a class="btn btn-primary" type="button" id="btnLinkDiscordServer" href="{% url urls.auth_add_bot %}" title="{% translate 'Link Discord Server' %}">
<span class="fas fa-link fa-fw"></span>
</a>
{% endif %}
{% endblock %}

View File

@@ -26,11 +26,11 @@ def deactivate_discord(request):
if request.user.discord.delete_user(
is_rate_limited=False, handle_api_exceptions=True
):
logger.info("Successfully deactivated discord for user %s", request.user)
logger.info("Successfully deactivated Discord for user %s", request.user)
messages.success(request, _('Deactivated Discord account.'))
else:
logger.error(
"Unsuccessful attempt to deactivate discord for user %s", request.user
"Unsuccessful attempt to deactivate Discord for user %s", request.user
)
messages.error(
request, _('An error occurred while processing your Discord account.')
@@ -46,14 +46,14 @@ def reset_discord(request):
is_rate_limited=False, handle_api_exceptions=True
):
logger.info(
"Successfully deleted discord user for user %s - "
"forwarding to discord activation.",
"Successfully deleted Discord user for user %s - "
"forwarding to Discord activation.",
request.user
)
return redirect("discord:activate")
logger.error(
"Unsuccessful attempt to reset discord for user %s", request.user
"Unsuccessful attempt to reset Discord for user %s", request.user
)
messages.error(
request, _('An error occurred while processing your Discord account.')

View File

@@ -10,11 +10,17 @@
{% endblock %}
{% block user %}
Username: {{ char.character_name }}
{% include "services/service_username.html" with username=char.character_name %}
{% endblock %}
{% block active %}
<span class="badge bg-success">
{% translate "SSO login active" %}
</span>
{% endblock %}
{% block controls %}
<a title="Go To Forums" href="{{ DISCOURSE_URL }}" class="btn btn-success">
<a class="btn btn-success" href="{{ DISCOURSE_URL }}" title="{% translate 'Go to forums' %}">
<span class="fas fa-arrow-right fa-fw"></span>
</a>
{% endblock %}

View File

@@ -25,9 +25,9 @@ def activate_ips4(request):
# if empty we failed
if result[0] != "" and not Ips4Tasks.has_account(request.user):
ips_user = Ips4User.objects.create(user=request.user, id=result[2], username=result[0])
logger.debug("Updated authserviceinfo for user %s with IPS4 credentials." % request.user)
logger.debug("Updated authserviceinfo for user %s with IPSuite4 credentials." % request.user)
# update_ips4_groups.delay(request.user.pk)
logger.info("Successfully activated IPS4 for user %s" % request.user)
logger.info("Successfully activated IPSuite4 for user %s" % request.user)
messages.success(request, _('Activated IPSuite4 account.'))
credentials = {
'username': result[0],
@@ -35,7 +35,7 @@ def activate_ips4(request):
}
return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'IPSuite4'})
else:
logger.error("Unsuccessful attempt to activate IPS4 for user %s" % request.user)
logger.error("Unsuccessful attempt to activate IPSuite4 for user %s" % request.user)
messages.error(request, _('An error occurred while processing your IPSuite4 account.'))
return redirect("services:services")
@@ -48,7 +48,7 @@ def reset_ips4_password(request):
result = Ips4Manager.update_user_password(request.user.ips4.username)
# false we failed
if result != "":
logger.info("Successfully reset IPS4 password for user %s" % request.user)
logger.info("Successfully reset IPSuite4 password for user %s" % request.user)
messages.success(request, _('Reset IPSuite4 password.'))
credentials = {
'username': request.user.ips4.username,
@@ -56,7 +56,7 @@ def reset_ips4_password(request):
}
return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'IPSuite4'})
logger.error("Unsuccessful attempt to reset IPS4 password for user %s" % request.user)
logger.error("Unsuccessful attempt to reset IPSuite4 password for user %s" % request.user)
messages.error(request, _('An error occurred while processing your IPSuite4 account.'))
return redirect("services:services")
@@ -74,10 +74,10 @@ def set_ips4_password(request):
logger.debug("Form contains password of length %s" % len(password))
result = Ips4Manager.update_custom_password(request.user.ips4.username, plain_password=password)
if result != "":
logger.info("Successfully set IPS4 password for user %s" % request.user)
logger.info("Successfully set IPSuite4 password for user %s" % request.user)
messages.success(request, _('Set IPSuite4 password.'))
else:
logger.error("Failed to install custom IPS4 password for user %s" % request.user)
logger.error("Failed to install custom IPSuite4 password for user %s" % request.user)
messages.error(request, _('An error occurred while processing your IPSuite4 account.'))
return redirect('services:services')
else:
@@ -94,9 +94,9 @@ def set_ips4_password(request):
def deactivate_ips4(request):
logger.debug("deactivate_ips4 called by user %s" % request.user)
if Ips4Tasks.delete_user(request.user):
logger.info("Successfully deactivated IPS4 for user %s" % request.user)
logger.info("Successfully deactivated IPSuite4 for user %s" % request.user)
messages.success(request, _('Deactivated IPSuite4 account.'))
else:
logger.error("Unsuccessful attempt to deactivate IPS4 for user %s" % request.user)
logger.error("Unsuccessful attempt to deactivate IPSuite4 for user %s" % request.user)
messages.error(request, _('An error occurred while processing your IPSuite4 account.'))
return redirect("services:services")

View File

@@ -1,34 +1,49 @@
{% load i18n %}
<div class="card text-center m-4" style="min-width: 18rem; min-height: 18rem;">
<div class="card-body ">
<h5 class="card-title ">{{ service_name }}</h5>
<p class="card-text"><a href="mumble://{{ service_url }}">{{ service_url }}</a></p>
<p class="card-text"><span class="badge {% if username != '' %}bg-success{% else %}bg-warning{% endif %}">{% if username != '' %}Active{% else %}Disabled{% endif %}</span></p>
<p class="card-text">Username: <span class="badge bg-secondary text-end">{{ username }}</span></p>
</div>
{% extends "services/services_ctrl_base.html" %}
<div class="card-footer">
{% if username == "" %}
<div class="text-center">
<a href="{% url 'mumble:activate' %}" title="Activate" class="btn btn-warning">
<span class="fas fa-check fa-fw"></span>
</a>
</div>
{% else %}
<div class="text-center">
<a href="{% url 'mumble:set_password' %}" title="Set Password" class="btn btn-warning">
<span class="fas fa-edit fa-fw"></span>
</a>
<a href="{% url 'mumble:reset_password' %}" title="Reset Password" class="btn btn-primary">
<span class="fas fa-sync fa-fw"></span>
</a>
<a href="{% url 'mumble:deactivate' %}" title="Deactivate" class="btn btn-danger">
<span class="fas fa-times fa-fw"></span>
</a>
<a href="mumble://{{ connect_url }}" class="btn btn-success" title="Connect">
<span class="fas fa-arrow-right fa-fw"></span>
</a>
</div>
{% load i18n %}
{% block title %}
{{ service_name }}
{% endblock %}
{% block url %}
<a href="{{ service_url }}">{{ service_url }}</a>
{% endblock %}
{% block user %}
{% include "services/service_username.html" with username=username %}
{% endblock %}
{% block controls %}
{% if username == "" %}
{% if urls.auth_activate %}
<a class="btn btn-warning" href="{% url urls.auth_activate %}" title="{% translate 'Activate' %}">
<span class="fas fa-check fa-fw"></span>
</a>
{% endif %}
</div>
</div>
{% else %}
{% if urls.auth_set_password %}
<a class="btn btn-warning" href="{% url urls.auth_set_password %}" title="{% translate 'Set Password' %}">
<span class="fas fa-edit fa-fw"></span>
</a>
{% endif %}
{% if urls.auth_reset_password %}
<a class="btn btn-primary" href="{% url urls.auth_reset_password %}" title="{% translate 'Reset Password' %}">
<span class="fas fa-sync fa-fw"></span>
</a>
{% endif %}
{% if urls.auth_deactivate %}
<a class="btn btn-danger" href="{% url urls.auth_deactivate %}" title="{% translate 'Deactivate' %}">
<span class="fas fa-times fa-fw"></span>
</a>
{% endif %}
{% if connect_url %}
<a class="btn btn-success" href="mumble://{{ connect_url }}" title="{% translate 'Connect' %}">
<span class="fas fa-arrow-right fa-fw"></span>
</a>
{% endif %}
{% endif %}
{% endblock %}

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %}
{% block page_title %}{% translate "Jabber Broadcast" %}{% endblock page_title %}
@@ -17,7 +17,7 @@
{% endif %}
<form class="form-signin" role="form" action="" method="POST" onsubmit="submitbutton.disabled = true; return true;">
{% csrf_token %}
{{ form|bootstrap }}
{% bootstrap_form form %}
<br>
<button class="btn btn-lg btn-primary btn-block" name="submitbutton" type="submit">{% translate "Broadcast" %}
</button>

View File

@@ -24,23 +24,23 @@ ACCESS_PERM = 'openfire.access_openfire'
def activate_jabber(request):
logger.debug("activate_jabber called by user %s" % request.user)
character = request.user.profile.main_character
logger.debug(f"Adding jabber user for user {request.user} with main character {character}")
logger.debug(f"Adding Jabber user for user {request.user} with main character {character}")
info = OpenfireManager.add_user(OpenfireTasks.get_username(request.user))
# If our username is blank means we already had a user
if info[0] != "":
OpenfireUser.objects.update_or_create(user=request.user, defaults={'username': info[0]})
logger.debug("Updated authserviceinfo for user %s with jabber credentials. Updating groups." % request.user)
logger.debug("Updated authserviceinfo for user %s with Jabber credentials. Updating groups." % request.user)
OpenfireTasks.update_groups.delay(request.user.pk)
logger.info("Successfully activated jabber for user %s" % request.user)
messages.success(request, _('Activated jabber account.'))
logger.info("Successfully activated Jabber for user %s" % request.user)
messages.success(request, _('Activated Jabber account.'))
credentials = {
'username': info[0],
'password': info[1],
}
return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'Jabber'})
else:
logger.error("Unsuccessful attempt to activate jabber for user %s" % request.user)
messages.error(request, _('An error occurred while processing your jabber account.'))
logger.error("Unsuccessful attempt to activate Jabber for user %s" % request.user)
messages.error(request, _('An error occurred while processing your Jabber account.'))
return redirect("services:services")
@@ -49,11 +49,11 @@ def activate_jabber(request):
def deactivate_jabber(request):
logger.debug("deactivate_jabber called by user %s" % request.user)
if OpenfireTasks.has_account(request.user) and OpenfireTasks.delete_user(request.user):
logger.info("Successfully deactivated jabber for user %s" % request.user)
messages.success(request, 'Deactivated jabber account.')
logger.info("Successfully deactivated Jabber for user %s" % request.user)
messages.success(request, 'Deactivated Jabber account.')
else:
logger.error("Unsuccessful attempt to deactivate jabber for user %s" % request.user)
messages.error(request, _('An error occurred while processing your jabber account.'))
logger.error("Unsuccessful attempt to deactivate Jabber for user %s" % request.user)
messages.error(request, _('An error occurred while processing your Jabber account.'))
return redirect("services:services")
@@ -65,15 +65,15 @@ def reset_jabber_password(request):
result = OpenfireManager.update_user_pass(request.user.openfire.username)
# If our username is blank means we failed
if result != "":
logger.info("Successfully reset jabber password for user %s" % request.user)
messages.success(request, _('Reset jabber password.'))
logger.info("Successfully reset Jabber password for user %s" % request.user)
messages.success(request, _('Reset Jabber password.'))
credentials = {
'username': request.user.openfire.username,
'password': result,
}
return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'Jabber'})
logger.error("Unsuccessful attempt to reset jabber for user %s" % request.user)
messages.error(request, _('An error occurred while processing your jabber account.'))
logger.error("Unsuccessful attempt to reset Jabber for user %s" % request.user)
messages.error(request, _('An error occurred while processing your Jabber account.'))
return redirect("services:services")
@@ -95,7 +95,7 @@ def jabber_broadcast_view(request):
logger.debug("Received POST request containing form, valid: %s" % form.is_valid())
if form.is_valid():
main_char = request.user.profile.main_character
logger.debug(f"Processing jabber broadcast for user {request.user} with main character {main_char}")
logger.debug(f"Processing Jabber broadcast for user {request.user} with main character {main_char}")
try:
if main_char is not None:
message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \
@@ -112,8 +112,8 @@ def jabber_broadcast_view(request):
OpenfireManager.send_broadcast_message(group_to_send, message_to_send)
messages.success(request, _('Sent jabber broadcast to %s' % group_to_send))
logger.info("Sent jabber broadcast on behalf of user %s" % request.user)
messages.success(request, _('Sent Jabber broadcast to %s' % group_to_send))
logger.info("Sent Jabber broadcast on behalf of user %s" % request.user)
except PingBotException as e:
messages.error(request, e)
@@ -140,11 +140,11 @@ def set_jabber_password(request):
logger.debug("Form contains password of length %s" % len(password))
result = OpenfireManager.update_user_pass(request.user.openfire.username, password=password)
if result != "":
logger.info("Successfully set jabber password for user %s" % request.user)
logger.info("Successfully set Jabber password for user %s" % request.user)
messages.success(request, _('Set jabber password.'))
else:
logger.error("Failed to install custom jabber password for user %s" % request.user)
messages.error(request, _('An error occurred while processing your jabber account.'))
logger.error("Failed to install custom Jabber password for user %s" % request.user)
messages.error(request, _('An error occurred while processing your Jabber account.'))
return redirect("services:services")
else:
logger.debug("Request is not type POST - providing empty form.")

View File

@@ -24,7 +24,7 @@ def activate_smf(request):
main_character = request.user.profile.main_character
logger.debug(
f"Adding smf user for user {request.user} with main character {main_character}"
f"Adding SMF user for user {request.user} with main character {main_character}"
)
result = SmfManager.add_user(
@@ -42,12 +42,12 @@ def activate_smf(request):
logger.debug(
f"Updated authserviceinfo for user {request.user} "
f"with smf credentials. Updating groups."
f"with SMF credentials. Updating groups."
)
SmfTasks.update_groups.delay(request.user.pk)
logger.info(f"Successfully activated smf for user {request.user}")
logger.info(f"Successfully activated SMF for user {request.user}")
messages.success(request, _('Activated SMF account.'))
credentials = {
@@ -61,7 +61,7 @@ def activate_smf(request):
context={'credentials': credentials, 'service': 'SMF'},
)
logger.error(f"Unsuccessful attempt to activate smf for user {request.user}")
logger.error(f"Unsuccessful attempt to activate SMF for user {request.user}")
messages.error(request, _('An error occurred while processing your SMF account.'))
return redirect("services:services")
@@ -74,10 +74,10 @@ def deactivate_smf(request):
result = SmfTasks.delete_user(request.user)
# false we failed
if result:
logger.info("Successfully deactivated smf for user %s" % request.user)
logger.info("Successfully deactivated SMF for user %s" % request.user)
messages.success(request, _('Deactivated SMF account.'))
else:
logger.error("Unsuccessful attempt to activate smf for user %s" % request.user)
logger.error("Unsuccessful attempt to activate SMF for user %s" % request.user)
messages.error(request, _('An error occurred while processing your SMF account.'))
return redirect("services:services")
@@ -91,14 +91,14 @@ def reset_smf_password(request):
result = SmfManager.update_user_password(request.user.smf.username, character.character_id)
# false we failed
if result != "":
logger.info("Successfully reset smf password for user %s" % request.user)
logger.info("Successfully reset SMF password for user %s" % request.user)
messages.success(request, _('Reset SMF password.'))
credentials = {
'username': request.user.smf.username,
'password': result,
}
return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'SMF'})
logger.error("Unsuccessful attempt to reset smf password for user %s" % request.user)
logger.error("Unsuccessful attempt to reset SMF password for user %s" % request.user)
messages.error(request, _('An error occurred while processing your SMF account.'))
return redirect("services:services")
@@ -117,10 +117,10 @@ def set_smf_password(request):
logger.debug("Form contains password of length %s" % len(password))
result = SmfManager.update_user_password(request.user.smf.username, character.character_id, password=password)
if result != "":
logger.info("Successfully set smf password for user %s" % request.user)
logger.info("Successfully set SMF password for user %s" % request.user)
messages.success(request, _('Set SMF password.'))
else:
logger.error("Failed to install custom smf password for user %s" % request.user)
logger.error("Failed to install custom SMF password for user %s" % request.user)
messages.error(request, _('An error occurred while processing your SMF account.'))
return redirect("services:services")
else:

View File

@@ -5,7 +5,7 @@
{{ block.super }}
<li>
<a href="{% url 'teamspeak3:admin_update_ts3_groups' %}" class="btn btn-high">
{% translate "Update TS3 groups" %}
{% translate "Update TeamSpeak3 groups" %}
</a>
</li>
{% endblock %}

View File

@@ -10,11 +10,11 @@
{% endblock %}
{% block active %}
<span class="badge {% if authinfo.teamspeak3_uid != '' %}bg-success{% else %}bg-warning{% endif %}">{% if authinfo.teamspeak3_uid != '' %}Active{% else %}Disabled{% endif %}</span>
{% include "services/service_status.html" with username=authinfo.teamspeak3_uid %}
{% endblock %}
{% block user %}
{{ authinfo.teamspeak3_uid }}
{% include "services/service_username.html" with username=authinfo.teamspeak3_uid %}
{% endblock %}
{% block controls %}

View File

@@ -1,20 +1,20 @@
{% extends "allianceauth/base.html" %}
{% load bootstrap %}
{% extends "allianceauth/base-bs5.html" %}
{% load django_bootstrap5 %}
{% load i18n %}
{% block page_title %}{% translate "Verify Teamspeak" %}{% endblock page_title %}
{% block page_title %}{% translate "Verify TeamSpeak3" %}{% endblock page_title %}
{% block extra_css %}{% endblock extra_css %}
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% translate "Verify Teamspeak Identity" %}</h1>
<h1 class="page-header text-center">{% translate "Verify TeamSpeak3 Identity" %}</h1>
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<a href="ts3server://{{ public_url }}?token={{ authinfo.teamspeak3_perm_key }}&nickname={{ authinfo.teamspeak3_uid }}" class="btn btn-primary btn-block btn-lg" title="Join">{% translate "Join Server" %}</a>
<br>
<form class="form-signin" role="form" action="{% url 'teamspeak3:verify' %}" method="POST">
{% csrf_token %}
{{ form|bootstrap }}
{% bootstrap_form form %}
<br>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Continue" %}</button>
</form>

View File

@@ -24,17 +24,17 @@ def activate_teamspeak3(request):
character = request.user.profile.main_character
with Teamspeak3Manager() as ts3man:
logger.debug(f"Adding TS3 user for user {request.user} with main character {character}")
logger.debug(f"Adding TeamSpeak3 user for user {request.user} with main character {character}")
result = ts3man.add_user(request.user, Teamspeak3Tasks.get_username(request.user))
# if its empty we failed
if result[0] != "":
Teamspeak3User.objects.update_or_create(user=request.user, defaults={'uid': result[0], 'perm_key': result[1]})
logger.debug("Updated authserviceinfo for user %s with TS3 credentials. Updating groups." % request.user)
logger.info("Successfully activated TS3 for user %s" % request.user)
logger.debug("Updated authserviceinfo for user %s with TeamSpeak3 credentials. Updating groups." % request.user)
logger.info("Successfully activated TeamSpeak3 for user %s" % request.user)
messages.success(request, _('Activated TeamSpeak3 account.'))
return redirect("teamspeak3:verify")
logger.error("Unsuccessful attempt to activate TS3 for user %s" % request.user)
logger.error("Unsuccessful attempt to activate TeamSpeak3 for user %s" % request.user)
messages.error(request, _('An error occurred while processing your TeamSpeak3 account.'))
return redirect("services:services")
@@ -67,10 +67,10 @@ def verify_teamspeak3(request):
def deactivate_teamspeak3(request):
logger.debug("deactivate_teamspeak3 called by user %s" % request.user)
if Teamspeak3Tasks.has_account(request.user) and Teamspeak3Tasks.delete_user(request.user):
logger.info("Successfully deactivated TS3 for user %s" % request.user)
logger.info("Successfully deactivated TeamSpeak3 for user %s" % request.user)
messages.success(request, _('Deactivated TeamSpeak3 account.'))
else:
logger.error("Unsuccessful attempt to deactivate TS3 for user %s" % request.user)
logger.error("Unsuccessful attempt to deactivate TeamSpeak3 for user %s" % request.user)
messages.error(request, _('An error occurred while processing your TeamSpeak3 account.'))
return redirect("services:services")
@@ -81,7 +81,7 @@ def reset_teamspeak3_perm(request):
logger.debug("reset_teamspeak3_perm called by user %s" % request.user)
if not Teamspeak3Tasks.has_account(request.user):
return redirect("services:services")
logger.debug("Deleting TS3 user for user %s" % request.user)
logger.debug("Deleting TeamSpeak3 user for user %s" % request.user)
with Teamspeak3Manager() as ts3man:
ts3man.delete_user(request.user.teamspeak3.uid)
@@ -91,12 +91,12 @@ def reset_teamspeak3_perm(request):
# if blank we failed
if result[0] != "":
Teamspeak3User.objects.update_or_create(user=request.user, defaults={'uid': result[0], 'perm_key': result[1]})
logger.debug("Updated authserviceinfo for user %s with TS3 credentials. Updating groups." % request.user)
logger.debug("Updated authserviceinfo for user %s with TeamSpeak3 credentials. Updating groups." % request.user)
Teamspeak3Tasks.update_groups.delay(request.user.pk)
logger.info("Successfully reset TS3 permission key for user %s" % request.user)
logger.info("Successfully reset TeamSpeak3 permission key for user %s" % request.user)
messages.success(request, _('Reset TeamSpeak3 permission key.'))
else:
logger.error("Unsuccessful attempt to reset TS3 permission key for user %s" % request.user)
logger.error("Unsuccessful attempt to reset TeamSpeak3 permission key for user %s" % request.user)
messages.error(request, _('An error occurred while processing your TeamSpeak3 account.'))
return redirect("services:services")
@@ -105,5 +105,5 @@ def reset_teamspeak3_perm(request):
@staff_member_required
def admin_update_ts3_groups(request):
Teamspeak3Tasks.run_ts3_group_update.delay()
messages.info(request, "Started updating TS3 server groups...")
messages.info(request, "Started updating TeamSpeak3 server groups...")
return redirect("admin:teamspeak3_authts_changelist")

View File

@@ -36,7 +36,7 @@ def activate_xenforo_forum(request):
context={'credentials': credentials, 'service': 'XenForo'})
else:
logger.error("Unsuccessful attempt to activate xenforo for user %s" % request.user)
logger.error("Unsuccessful attempt to activate XenForo for user %s" % request.user)
messages.error(request, _('An error occurred while processing your XenForo account.'))
return redirect("services:services")

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base-bs5.html" %}
{% load bootstrap %}
{% load django_bootstrap5 %}
{% load i18n %}
{% block page_title %}{% translate "Fleet Formatter Tool" %}{% endblock page_title %}
@@ -18,7 +18,7 @@
{% endif %}
<form class="form-signin" role="form" action="" method="POST">
{% csrf_token %}
{{ form|bootstrap }}
{% bootstrap_form form %}
<br>
<button class="btn btn-lg btn-primary btn-block" type="submit">{% translate "Format" %}</button>
<br>

View File

@@ -1,4 +1,4 @@
{% extends "allianceauth/base.html" %}
{% extends "allianceauth/base-bs5.html" %}
{% load i18n %}
@@ -11,9 +11,9 @@
<h1 class="page-header text-center">
{% blocktranslate with service_name=view.service_name|title %}Delete {{ service_name }} Account?{% endblocktranslate %}
</h1>
<div class="container-fluid">
<div class="col-md-2 col-md-offset-5">
<div class="row">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-4 align-self-center">
<form action="" method="post">
{% csrf_token %}
<p>

View File

@@ -1,4 +1,4 @@
{% extends "allianceauth/base.html" %}
{% extends "allianceauth/base-bs5.html" %}
{% load i18n %}
{% block page_title %}{% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Credentials{% endblocktranslate %}{% endblock page_title %}
@@ -6,17 +6,19 @@
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Credentials{% endblocktranslate %}</h1>
<div class="container-fluid">
<div class="col-lg-4 col-lg-offset-4">
<form class="form-signin">
{% for key, value in credentials.items %}
<div class="form-group">
<label class="control-label" for="id_{{ key }}">{{ key|capfirst }}</label>
<input class="form-control" value="{{ value }}" id="id_{{ key }}" readonly>
</div>
{% endfor %}
</form>
<a href="{% url 'services:services' %}" class="btn btn-lg btn-block btn-primary" title="Continue">{% translate "Continue" %}</a>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-4 align-self-center">
<form class="form-signin">
{% for key, value in credentials.items %}
<div class="mb-3">
<label class="form-label" for="id_{{ key }}">{{ key|capfirst }}</label>
<input class="form-control" value="{{ value }}" id="id_{{ key }}" readonly>
</div>
{% endfor %}
</form>
<a href="{% url 'services:services' %}" class="btn btn-lg btn-block btn-primary" title="Continue">{% translate "Continue" %}</a>
</div>
</div>
</div>
</div>

View File

@@ -1,5 +1,5 @@
{% extends "allianceauth/base.html" %}
{% load bootstrap %}
{% extends "allianceauth/base-bs5.html" %}
{% load django_bootstrap5 %}
{% load i18n %}
{% block page_title %}{% blocktranslate with service_name=view.service_name|title %}{{ service_name }} Password Change{% endblocktranslate %}{% endblock page_title %}
@@ -7,12 +7,12 @@
{% block content %}
<div class="col-lg-12">
<h1 class="page-header text-center">{% blocktranslate with service_name=view.service_name|title %}Set {{service_name}} Password{% endblocktranslate %}</h1>
<div class="container-fluid">
<div class="col-md-4 col-md-offset-4">
<div class="row">
<div class="container">
<div class="row justify-content-center">
<div class="col-md-4 align-self-center">
<form class="form-signin" role="form" action="" method="POST" onsubmit="submitbutton.disabled = true; return true;">
{% csrf_token %}
{{ form|bootstrap }}
{% bootstrap_form form %}
<br>
<button class="btn btn-lg btn-primary btn-block" name="submitbutton" type="submit">{% translate "Set Password" %}</button>
</form>
@@ -20,5 +20,4 @@
</div>
</div>
</div>
{% endblock content %}

View File

@@ -0,0 +1,9 @@
{% load i18n %}
<span class="badge {% if username != '' %}bg-success{% else %}bg-warning{% endif %}">
{% if username != '' %}
{% translate "Enabled" %}
{% else %}
{% translate "Disabled" %}
{% endif %}
</span>

View File

@@ -0,0 +1,5 @@
{% load i18n %}
{% if username != '' %}
{% translate "Username" %}: {{ username }}
{% endif %}

View File

@@ -9,14 +9,6 @@
<a href="{{ service_url }}">{{ service_url }}</a>
{% endblock %}
{% block active %}
<span class="badge {% if username != '' %}bg-success{% else %}bg-warning{% endif %}">{% if username != '' %}Active{% else %}Disabled{% endif %}</span>
{% endblock %}
{% block user %}
Username: <span class="badge bg-secondary">{{ username }}</span>
{% endblock %}
{% block controls %}
{% if username == "" %}
{% if urls.auth_activate %}

View File

@@ -1,15 +1,29 @@
{% load i18n %}
<div class="card text-center m-4" style="min-width: 18rem; min-height: 18rem">
<div class="card text-center m-4" style="min-width: 18rem; min-height: 18rem;">
<div class="card-body">
<h5 class="card-title">{% block title %}{% endblock title %}</h5>
<p class="card-text">{% block url %}{% endblock url %}</p>
<p class="card-text">
{% block active %}
<span class="badge bg-success">Active</span>
{% include "services/service_status.html" with username=username %}
{% endblock active %}
</p>
<p class="card-text">{% block user %}{% endblock user %}</p>
<p class="card-text">
{% block url %}{% endblock url %}
</p>
<p class="card-text">
{% block user %}
{% include "services/service_username.html" with username=username %}
{% endblock user %}
</p>
{% block extra %}{% endblock extra %}
</div>
<div class="card-footer">{% block controls %}{% endblock controls %}</div>
<div class="card-footer">
{% block controls %}{% endblock controls %}
</div>
</div>

View File

@@ -0,0 +1,81 @@
/* global notificationUpdateSettings */
/**
* This script refreshed the notification icon in the top menu
* on a regular basis so to keep the user apprised about newly arrived
* notifications without having to reload the page.
*
* The refresh rate can be changes via the Django setting NOTIFICATIONS_REFRESH_TIME.
* See documentation for details.
*/
$(() => {
'use strict';
const notificationsRefreshTime = notificationUpdateSettings.refreshTime;
const userNotificationsCountViewUrl = notificationUpdateSettings.userNotificationsCountViewUrl;
const elementNotificationIcon = $('#menu_item_notifications .fa-bell');
/**
* Update the notification icon in the top menu
*/
const updateNotificationIcon = () => {
fetch(userNotificationsCountViewUrl)
.then((response) => {
if (response.ok) {
return response.json();
}
throw new Error('Something went wrong');
})
.then((responseJson) => {
const unreadCount = responseJson.unread_count;
if (unreadCount > 0) {
elementNotificationIcon.addClass('text-danger');
} else {
elementNotificationIcon.removeClass('text-danger');
}
})
.catch((error) => {
console.log(`Failed to load HTMl to render notifications item. Error: ${error.message}`);
});
};
let myInterval;
/**
* Activate automatic refresh every x seconds
*/
const activateIconUpdate = () => {
if (notificationsRefreshTime > 0) {
myInterval = setInterval(
updateNotificationIcon, notificationsRefreshTime * 1000
);
}
};
/**
* Deactivate automatic refresh
*/
const deactivateIconUpdate = () => {
if ((notificationsRefreshTime > 0) && (typeof myInterval !== 'undefined')) {
clearInterval(myInterval);
}
};
/**
* Refresh only on active browser tabs
*/
$(window)
// Tab active
.focus(() => {
activateIconUpdate();
})
// Tab inactive
.blur(function() {
deactivateIconUpdate();
});
// Initial start of refreshing on script loading
activateIconUpdate();
});

View File

@@ -1,28 +1,28 @@
$(document).ready(() => {
'use strict';
const inputAbsoluteTime = $('input#id_absolute_time');
const inputCountdown = $('#id_days_left, #id_hours_left, #id_minutes_left');
//inputAbsoluteTime.prop('disabled', true);
inputAbsoluteTime.parent().hide()
inputAbsoluteTime.parent().prev('label').hide()
inputAbsoluteTime.parent().hide();
inputAbsoluteTime.parent().prev('label').hide();
inputCountdown.prop('required', true);
$('input#id_absolute_checkbox').change(function () {
if ($(this).prop("checked")) {
// check box enabled
inputAbsoluteTime.parent().show()
inputAbsoluteTime.parent().prev('label').show()
inputCountdown.parent().hide()
inputCountdown.parent().prev('label').hide()
$('input#id_absolute_checkbox').change((event) => {
if ($(event.target).prop('checked')) {
// Checkbox is checked
inputAbsoluteTime.parent().show();
inputAbsoluteTime.parent().prev('label').show();
inputCountdown.parent().hide();
inputCountdown.parent().prev('label').hide();
inputAbsoluteTime.prop('required', true);
inputCountdown.prop('required', false);
} else {
// Checkbox is not checked
inputAbsoluteTime.parent().hide()
inputAbsoluteTime.parent().prev('label').hide()
inputCountdown.parent().show()
inputCountdown.parent().prev('label').show()
inputAbsoluteTime.parent().hide();
inputAbsoluteTime.parent().prev('label').hide();
inputCountdown.parent().show();
inputCountdown.parent().prev('label').show();
inputAbsoluteTime.prop('required', false);
inputCountdown.prop('required', true);
}

View File

@@ -2,7 +2,7 @@
{% load admin_status %}
<div
class="progress-bar progress-bar-{{ level }} task-status-progress-bar"
class="progress-bar bg-{{ level }} task-status-progress-bar"
role="progressbar"
aria-valuenow="{% decimal_widthratio tasks_count tasks_total 100 %}"
aria-valuemin="0"

View File

@@ -122,13 +122,14 @@
{% theme_js %}
{% if user.is_authenticated %}
<script type="application/javascript">
let notificationUPdateSettings = {
notificationsListViewUrl: "{% url 'notifications:list' %}",
notificationsRefreshTime: "{% notifications_refresh_time %}",
<script>
const notificationUpdateSettings = {
refreshTime: "{% notifications_refresh_time %}",
userNotificationsCountViewUrl: "{% url 'notifications:user_notifications_count' request.user.pk %}"
};
</script>
{% include 'bundles/refresh-notification-icon-js.html' %}
{% endif %}
{% block extra_javascript %}

View File

@@ -0,0 +1,3 @@
{% load static %}
<script src="{% static 'allianceauth/js/refresh-notification-icon.js' %}"></script>

View File

@@ -13,8 +13,9 @@ from django.template.loader import render_to_string
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from .form import TimerForm
from .models import Timer
from allianceauth.timerboard.form import TimerForm
from allianceauth.timerboard.models import Timer
from allianceauth.eveonline.models import EveCorporationInfo
logger = logging.getLogger(__name__)
@@ -91,12 +92,18 @@ class RemoveTimerView(TimerManagementView, DeleteView):
def dashboard_timers(request):
corp = request.user.profile.main_character.corporation
try:
corp = request.user.profile.main_character.corporation
except EveCorporationInfo.DoesNotExist:
return ""
timers = Timer.objects.select_related('eve_character').filter((Q(eve_corp__isnull=True) | Q(eve_corp=corp)) ,eve_time__gte=timezone.now())[:5]
if timers.count():
context = {
'timers': timers,
}
return render_to_string('timerboard/dashboard.timers.html', context=context, request=request)
return render_to_string(template_name='timerboard/dashboard.timers.html', context=context, request=request)
else:
return ""

View File

@@ -1,10 +1,12 @@
import warnings
from django.views.generic.base import View
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect
from django.contrib import messages
from django.conf import settings
import logging
import warnings
from django.conf import settings
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.shortcuts import redirect, render
from django.utils.translation import gettext_lazy as _
from django.views.generic.base import View
logger = logging.getLogger(__name__)

View File

@@ -1,7 +1,7 @@
PROTOCOL=https://
AUTH_SUBDOMAIN=%AUTH_SUBDOMAIN%
DOMAIN=%DOMAIN%
AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.0.0a3
AA_DOCKER_TAG=registry.gitlab.com/allianceauth/allianceauth/auth:v4.0.0a4
# Nginx Proxy Manager
PROXY_HTTP_PORT=80

View File

@@ -1,5 +1,5 @@
FROM python:3.11-slim
ARG AUTH_VERSION=v4.0.0a3
ARG AUTH_VERSION=v4.0.0a4
ARG AUTH_PACKAGE=allianceauth==${AUTH_VERSION}
ENV AUTH_USER=allianceauth
ENV AUTH_GROUP=allianceauth

View File

@@ -18,7 +18,7 @@ keywords = [
classifiers = [
"Environment :: Web Environment",
"Framework :: Django",
"Framework :: Django :: 4.0",
"Framework :: Django :: 4.2",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU General Public License v2 (GPLv2)",
"Operating System :: POSIX :: Linux",