mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2026-02-05 06:36:19 +01:00
Bulk of the profile work is done.
This commit is contained in:
@@ -2,7 +2,6 @@ from __future__ import unicode_literals
|
||||
|
||||
import logging
|
||||
|
||||
from django.conf import settings
|
||||
from django.template.loader import render_to_string
|
||||
|
||||
from alliance_auth import hooks
|
||||
|
||||
@@ -7,7 +7,6 @@ from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
|
||||
from eveonline.managers import EveManager
|
||||
from notifications import notify
|
||||
from services.modules.discord.manager import DiscordOAuthManager
|
||||
from services.tasks import only_one
|
||||
@@ -60,6 +59,7 @@ class DiscordTasks:
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
@only_one
|
||||
@app.task(bind=True, name='discord.update_groups')
|
||||
def update_groups(task_self, pk):
|
||||
user = User.objects.get(pk=pk)
|
||||
@@ -98,18 +98,21 @@ class DiscordTasks:
|
||||
user = User.objects.get(pk=pk)
|
||||
logger.debug("Updating discord nickname for user %s" % user)
|
||||
if DiscordTasks.has_account(user):
|
||||
character = EveManager.get_main_character(user)
|
||||
logger.debug("Updating user %s discord nickname to %s" % (user, character.character_name))
|
||||
try:
|
||||
DiscordOAuthManager.update_nickname(user.discord.uid, character.character_name)
|
||||
except Exception as e:
|
||||
if self:
|
||||
logger.exception("Discord nickname sync failed for %s, retrying in 10 mins" % user)
|
||||
raise self.retry(countdown=60 * 10)
|
||||
else:
|
||||
# Rethrow
|
||||
raise e
|
||||
logger.debug("Updated user %s discord nickname." % user)
|
||||
if user.profile.main_character:
|
||||
character = user.profile.main_character
|
||||
logger.debug("Updating user %s discord nickname to %s" % (user, character.character_name))
|
||||
try:
|
||||
DiscordOAuthManager.update_nickname(user.discord.uid, character.character_name)
|
||||
except Exception as e:
|
||||
if self:
|
||||
logger.exception("Discord nickname sync failed for %s, retrying in 10 mins" % user)
|
||||
raise self.retry(countdown=60 * 10)
|
||||
else:
|
||||
# Rethrow
|
||||
raise e
|
||||
logger.debug("Updated user %s discord nickname." % user)
|
||||
else:
|
||||
logger.debug("User %s does not have a main character" % user)
|
||||
else:
|
||||
logger.debug("User %s does not have a discord account" % user)
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ class DiscourseService(ServicesHook):
|
||||
|
||||
def render_services_ctrl(self, request):
|
||||
return render_to_string(self.service_ctrl_template, {
|
||||
'char': EveManager.get_main_character(request.user)
|
||||
'char': request.user.profile.main_character
|
||||
}, request=request)
|
||||
|
||||
|
||||
|
||||
@@ -4,10 +4,6 @@ from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required
|
||||
from django.shortcuts import render, redirect
|
||||
from authentication.states import MEMBER_STATE, BLUE_STATE, NONE_STATE
|
||||
from eveonline.models import EveCharacter
|
||||
from eveonline.managers import EveManager
|
||||
from authentication.models import AuthServicesInfo
|
||||
|
||||
from .manager import DiscourseManager
|
||||
from .tasks import DiscourseTasks
|
||||
@@ -39,16 +35,15 @@ def discourse_sso(request):
|
||||
|
||||
## Check if user has access
|
||||
|
||||
auth = AuthServicesInfo.objects.get(user=request.user)
|
||||
if not request.user.has_perm(ACCESS_PERM):
|
||||
messages.error(request, 'You are not authorized to access Discourse.')
|
||||
return redirect('auth_dashboard')
|
||||
|
||||
if not auth.main_char_id:
|
||||
if not request.user.profile.main_character:
|
||||
messages.error(request, "You must have a main character set to access Discourse.")
|
||||
return redirect('auth_characters')
|
||||
|
||||
main_char = EveManager.get_main_character(request.user)
|
||||
main_char = request.user.profile.main_character
|
||||
if main_char is None:
|
||||
messages.error(request, "Your main character is missing a database model. Please select a new one.")
|
||||
return redirect('auth_characters')
|
||||
@@ -60,8 +55,7 @@ def discourse_sso(request):
|
||||
messages.error(request, 'No SSO payload or signature. Please contact support if this problem persists.')
|
||||
return redirect('auth_dashboard')
|
||||
|
||||
## Validate the payload
|
||||
|
||||
# Validate the payload
|
||||
try:
|
||||
payload = unquote(payload).encode('utf-8')
|
||||
decoded = base64.decodestring(payload).decode('utf-8')
|
||||
@@ -92,24 +86,23 @@ def discourse_sso(request):
|
||||
'name': username,
|
||||
}
|
||||
|
||||
if auth.main_char_id:
|
||||
params['avatar_url'] = 'https://image.eveonline.com/Character/%s_256.jpg' % auth.main_char_id
|
||||
if main_char:
|
||||
params['avatar_url'] = 'https://image.eveonline.com/Character/%s_256.jpg' % main_char.main_char_id
|
||||
|
||||
return_payload = base64.encodestring(urlencode(params).encode('utf-8'))
|
||||
h = hmac.new(key, return_payload, digestmod=hashlib.sha256)
|
||||
query_string = urlencode({'sso': return_payload, 'sig': h.hexdigest()})
|
||||
|
||||
## Record activation and queue group sync
|
||||
|
||||
# Record activation and queue group sync
|
||||
if not DiscourseTasks.has_account(request.user):
|
||||
discourse_user = DiscourseUser()
|
||||
discourse_user.user = request.user
|
||||
discourse_user.enabled = True
|
||||
discourse_user.save()
|
||||
DiscourseTasks.update_groups.apply_async(args=[request.user.pk], countdown=30) # wait 30s for new user creation on Discourse
|
||||
|
||||
## Redirect back to Discourse
|
||||
# wait 30s for new user creation on Discourse before triggering group sync
|
||||
DiscourseTasks.update_groups.apply_async(args=[request.user.pk], countdown=30)
|
||||
|
||||
# Redirect back to Discourse
|
||||
url = '%s/session/sso_login' % settings.DISCOURSE_URL
|
||||
return redirect('%s?%s' % (url, query_string))
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ ACCESS_PERM = 'ipboard.access_ipboard'
|
||||
@permission_required(ACCESS_PERM)
|
||||
def activate_ipboard_forum(request):
|
||||
logger.debug("activate_ipboard_forum called by user %s" % request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
logger.debug("Adding ipboard user for user %s with main character %s" % (request.user, character))
|
||||
result = IPBoardManager.add_user(character.character_name, request.user.email)
|
||||
if result[0] != "":
|
||||
|
||||
@@ -4,8 +4,6 @@ from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required, permission_required
|
||||
from django.shortcuts import render, redirect
|
||||
|
||||
from authentication.decorators import members_and_blues
|
||||
from eveonline.managers import EveManager
|
||||
from services.forms import ServicePasswordForm
|
||||
|
||||
from .manager import Ips4Manager
|
||||
@@ -23,7 +21,7 @@ ACCESS_PERM = 'ips4.access_ips4'
|
||||
@permission_required(ACCESS_PERM)
|
||||
def activate_ips4(request):
|
||||
logger.debug("activate_ips4 called by user %s" % request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
logger.debug("Adding IPS4 user for user %s with main character %s" % (request.user, character))
|
||||
result = Ips4Manager.add_user(character.character_name, request.user.email)
|
||||
# if empty we failed
|
||||
|
||||
@@ -22,7 +22,7 @@ ACCESS_PERM = 'market.access_market'
|
||||
@permission_required(ACCESS_PERM)
|
||||
def activate_market(request):
|
||||
logger.debug("activate_market called by user %s" % request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
if character is not None:
|
||||
logger.debug("Adding market user for user %s with main character %s" % (request.user, character))
|
||||
result = MarketManager.add_user(character.character_name, request.user.email, character.character_id,
|
||||
|
||||
@@ -3,16 +3,11 @@ from django.contrib.auth.decorators import login_required, permission_required
|
||||
from django.shortcuts import render, redirect
|
||||
from django.contrib import messages
|
||||
|
||||
from eveonline.managers import EveManager
|
||||
from eveonline.models import EveAllianceInfo
|
||||
from authentication.states import MEMBER_STATE, BLUE_STATE, NONE_STATE
|
||||
from authentication.models import AuthServicesInfo
|
||||
|
||||
from services.forms import ServicePasswordForm
|
||||
|
||||
from .manager import MumbleManager
|
||||
from .tasks import MumbleTasks
|
||||
from .models import MumbleUser
|
||||
|
||||
import logging
|
||||
|
||||
@@ -25,20 +20,11 @@ ACCESS_PERM = 'mumble.access_mumble'
|
||||
@permission_required(ACCESS_PERM)
|
||||
def activate_mumble(request):
|
||||
logger.debug("activate_mumble called by user %s" % request.user)
|
||||
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
ticker = character.corporation_ticker
|
||||
|
||||
if authinfo.state == BLUE_STATE:
|
||||
logger.debug("Adding mumble user for blue user %s with main character %s" % (request.user, character))
|
||||
# Blue members should have alliance ticker (if in alliance)
|
||||
if EveAllianceInfo.objects.filter(alliance_id=character.alliance_id).exists():
|
||||
alliance = EveAllianceInfo.objects.filter(alliance_id=character.alliance_id)[0]
|
||||
ticker = alliance.alliance_ticker
|
||||
result = MumbleManager.create_user(request.user, ticker, character.character_name, blue=True)
|
||||
else:
|
||||
logger.debug("Adding mumble user for user %s with main character %s" % (request.user, character))
|
||||
result = MumbleManager.create_user(request.user, ticker, character.character_name)
|
||||
logger.debug("Adding mumble user for %s with main character %s" % (request.user, character))
|
||||
result = MumbleManager.create_user(request.user, ticker, character.character_name)
|
||||
|
||||
if result:
|
||||
logger.debug("Updated authserviceinfo for user %s with mumble credentials. Updating groups." % request.user)
|
||||
|
||||
@@ -4,12 +4,7 @@ from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required, permission_required
|
||||
from django.contrib.auth.models import Group
|
||||
from django.shortcuts import render, redirect
|
||||
|
||||
from authentication.decorators import members_and_blues
|
||||
from eveonline.managers import EveManager
|
||||
from eveonline.models import EveCharacter
|
||||
from services.forms import ServicePasswordForm
|
||||
|
||||
from .manager import OpenfireManager
|
||||
from .tasks import OpenfireTasks
|
||||
from .forms import JabberBroadcastForm
|
||||
@@ -28,7 +23,7 @@ ACCESS_PERM = 'openfire.access_openfire'
|
||||
@permission_required(ACCESS_PERM)
|
||||
def activate_jabber(request):
|
||||
logger.debug("activate_jabber called by user %s" % request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
logger.debug("Adding jabber user for user %s with main character %s" % (request.user, character))
|
||||
info = OpenfireManager.add_user(character.character_name)
|
||||
# If our username is blank means we already had a user
|
||||
@@ -101,7 +96,7 @@ def jabber_broadcast_view(request):
|
||||
form.fields['group'].choices = allchoices
|
||||
logger.debug("Received POST request containing form, valid: %s" % form.is_valid())
|
||||
if form.is_valid():
|
||||
main_char = EveManager.get_main_character(request.user)
|
||||
main_char = request.user.profile.main_character
|
||||
logger.debug("Processing jabber broadcast for user %s with main character %s" % (request.user, main_char))
|
||||
if main_char is not None:
|
||||
message_to_send = form.cleaned_data[
|
||||
|
||||
@@ -19,7 +19,7 @@ class Phpbb3Service(ServicesHook):
|
||||
ServicesHook.__init__(self)
|
||||
self.name = 'phpbb3'
|
||||
self.urlpatterns = urlpatterns
|
||||
self.service_url = settings.FORUM_URL # TODO: This needs to be renamed at some point...
|
||||
self.service_url = settings.PHPBB3_URL
|
||||
self.access_perm = 'phpbb3.access_phpbb3'
|
||||
|
||||
@property
|
||||
|
||||
@@ -4,8 +4,6 @@ from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required, permission_required
|
||||
from django.shortcuts import render, redirect
|
||||
|
||||
from authentication.decorators import members_and_blues
|
||||
from eveonline.managers import EveManager
|
||||
from services.forms import ServicePasswordForm
|
||||
|
||||
from .manager import Phpbb3Manager
|
||||
@@ -24,7 +22,7 @@ ACCESS_PERM = 'phpbb3.access_phpbb3'
|
||||
def activate_forum(request):
|
||||
logger.debug("activate_forum called by user %s" % request.user)
|
||||
# Valid now we get the main characters
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
logger.debug("Adding phpbb user for user %s with main character %s" % (request.user, character))
|
||||
result = Phpbb3Manager.add_user(character.character_name, request.user.email, ['REGISTERED'],
|
||||
character.character_id)
|
||||
@@ -66,7 +64,7 @@ def deactivate_forum(request):
|
||||
def reset_forum_password(request):
|
||||
logger.debug("reset_forum_password called by user %s" % request.user)
|
||||
if Phpbb3Tasks.has_account(request.user):
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
result = Phpbb3Manager.update_user_password(request.user.phpbb3.username, character.character_id)
|
||||
# false we failed
|
||||
if result != "":
|
||||
@@ -95,7 +93,7 @@ def set_forum_password(request):
|
||||
if form.is_valid() and Phpbb3Tasks.has_account(request.user):
|
||||
password = form.cleaned_data['password']
|
||||
logger.debug("Form contains password of length %s" % len(password))
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
result = Phpbb3Manager.update_user_password(request.user.phpbb3.username, character.character_id,
|
||||
password=password)
|
||||
if result != "":
|
||||
|
||||
@@ -21,8 +21,7 @@ ACCESS_PERM = 'seat.access_seat'
|
||||
@permission_required(ACCESS_PERM)
|
||||
def activate_seat(request):
|
||||
logger.debug("activate_seat called by user %s" % request.user)
|
||||
# Valid now we get the main characters
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
logger.debug("Checking SeAT for inactive users with the same username")
|
||||
stat = SeatManager.check_user_status(character.character_name)
|
||||
if stat == {}:
|
||||
|
||||
@@ -23,7 +23,7 @@ ACCESS_PERM = 'smf.access_smf'
|
||||
def activate_smf(request):
|
||||
logger.debug("activate_smf called by user %s" % request.user)
|
||||
# Valid now we get the main characters
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
logger.debug("Adding smf user for user %s with main character %s" % (request.user, character))
|
||||
result = SmfManager.add_user(character.character_name, request.user.email, ['Member'], character.character_id)
|
||||
# if empty we failed
|
||||
@@ -64,7 +64,7 @@ def deactivate_smf(request):
|
||||
@permission_required(ACCESS_PERM)
|
||||
def reset_smf_password(request):
|
||||
logger.debug("reset_smf_password called by user %s" % request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
if SmfTasks.has_account(request.user) and character is not None:
|
||||
result = SmfManager.update_user_password(request.user.smf.username, character.character_id)
|
||||
# false we failed
|
||||
@@ -90,7 +90,7 @@ def set_smf_password(request):
|
||||
logger.debug("Received POST request with form.")
|
||||
form = ServicePasswordForm(request.POST)
|
||||
logger.debug("Form is valid: %s" % form.is_valid())
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
if form.is_valid() and SmfTasks.has_account(request.user) and character is not None:
|
||||
password = form.cleaned_data['password']
|
||||
logger.debug("Form contains password of length %s" % len(password))
|
||||
|
||||
@@ -33,11 +33,6 @@ class Teamspeak3Manager:
|
||||
sanatized = "[" + corp_ticker + "]" + username
|
||||
return sanatized[:30]
|
||||
|
||||
@staticmethod
|
||||
def __generate_username_blue(username, corp_ticker):
|
||||
sanatized = "[BLUE][" + corp_ticker + "]" + username
|
||||
return sanatized[:30]
|
||||
|
||||
@staticmethod
|
||||
def _get_userid(uid):
|
||||
logger.debug("Looking for uid %s on TS3 server." % uid)
|
||||
@@ -210,34 +205,6 @@ class Teamspeak3Manager:
|
||||
logger.exception("Failed to add teamspeak user %s - received response: %s" % (username_clean, ret))
|
||||
return "", ""
|
||||
|
||||
@staticmethod
|
||||
def add_blue_user(username, corp_ticker):
|
||||
username_clean = Teamspeak3Manager.__santatize_username(Teamspeak3Manager.__generate_username_blue(username,
|
||||
corp_ticker))
|
||||
server = Teamspeak3Manager.__get_created_server()
|
||||
logger.debug("Adding user to TS3 server with cleaned username %s" % username_clean)
|
||||
server_groups = Teamspeak3Manager._group_list()
|
||||
if settings.DEFAULT_BLUE_GROUP not in server_groups:
|
||||
Teamspeak3Manager._create_group(settings.DEFAULT_BLUE_GROUP)
|
||||
|
||||
blue_group_id = Teamspeak3Manager._group_id_by_name(settings.DEFAULT_BLUE_GROUP)
|
||||
|
||||
try:
|
||||
ret = server.send_command('tokenadd', {'tokentype': 0, 'tokenid1': blue_group_id, 'tokenid2': 0,
|
||||
'tokendescription': username_clean,
|
||||
'tokencustomset': "ident=sso_uid value=%s" % username_clean})
|
||||
except TeamspeakError as e:
|
||||
logger.error("Failed to add blue teamspeak user %s: %s" % (username, str(e)))
|
||||
return "",""
|
||||
|
||||
try:
|
||||
token = ret['keys']['token']
|
||||
logger.info("Created permission token for blue user %s on TS3 server" % username_clean)
|
||||
return username_clean, token
|
||||
except:
|
||||
logger.exception("Failed to add blue teamspeak user %s - received response: %s" % (username_clean, ret))
|
||||
return "", ""
|
||||
|
||||
@staticmethod
|
||||
def delete_user(uid):
|
||||
server = Teamspeak3Manager.__get_created_server()
|
||||
|
||||
@@ -3,13 +3,10 @@ from __future__ import unicode_literals
|
||||
import logging
|
||||
|
||||
from alliance_auth.celeryapp import app
|
||||
from celery.schedules import crontab
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from notifications import notify
|
||||
|
||||
from authentication.models import AuthServicesInfo
|
||||
from .util.ts3 import TeamspeakError
|
||||
from .manager import Teamspeak3Manager
|
||||
from .models import AuthTS, TSgroup, UserTSgroup, Teamspeak3User
|
||||
|
||||
@@ -4,11 +4,6 @@ from django.contrib import messages
|
||||
from django.contrib.auth.decorators import login_required, permission_required
|
||||
from django.shortcuts import render, redirect
|
||||
|
||||
from authentication.states import BLUE_STATE
|
||||
from authentication.models import AuthServicesInfo
|
||||
from eveonline.managers import EveManager
|
||||
from eveonline.models import EveAllianceInfo
|
||||
|
||||
from services.modules.teamspeak3.manager import Teamspeak3Manager
|
||||
|
||||
from .forms import TeamspeakJoinForm
|
||||
@@ -25,20 +20,11 @@ ACCESS_PERM = 'teamspeak3.access_teamspeak3'
|
||||
def activate_teamspeak3(request):
|
||||
logger.debug("activate_teamspeak3 called by user %s" % request.user)
|
||||
|
||||
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
ticker = character.corporation_ticker
|
||||
|
||||
if authinfo.state == BLUE_STATE:
|
||||
logger.debug("Adding TS3 user for blue user %s with main character %s" % (request.user, character))
|
||||
# Blue members should have alliance ticker (if in alliance)
|
||||
if EveAllianceInfo.objects.filter(alliance_id=character.alliance_id).exists():
|
||||
alliance = EveAllianceInfo.objects.filter(alliance_id=character.alliance_id)[0]
|
||||
ticker = alliance.alliance_ticker
|
||||
result = Teamspeak3Manager.add_blue_user(character.character_name, ticker)
|
||||
else:
|
||||
logger.debug("Adding TS3 user for user %s with main character %s" % (request.user, character))
|
||||
result = Teamspeak3Manager.add_user(character.character_name, ticker)
|
||||
logger.debug("Adding TS3 user for user %s with main character %s" % (request.user, character))
|
||||
result = Teamspeak3Manager.add_user(character.character_name, ticker)
|
||||
|
||||
# if its empty we failed
|
||||
if result[0] is not "":
|
||||
@@ -93,20 +79,12 @@ 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("auth_services")
|
||||
authinfo = AuthServicesInfo.objects.get(user=request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
logger.debug("Deleting TS3 user for user %s" % request.user)
|
||||
Teamspeak3Manager.delete_user(request.user.teamspeak3.uid)
|
||||
|
||||
if authinfo.state == BLUE_STATE:
|
||||
logger.debug(
|
||||
"Generating new permission key for blue user %s with main character %s" % (request.user, character))
|
||||
result = Teamspeak3Manager.generate_new_blue_permissionkey(request.user.teamspeak3.uid,
|
||||
character.character_name,
|
||||
character.corporation_ticker)
|
||||
else:
|
||||
logger.debug("Generating new permission key for user %s with main character %s" % (request.user, character))
|
||||
result = Teamspeak3Manager.generate_new_permissionkey(request.user.teamspeak3.uid, character.character_name,
|
||||
logger.debug("Generating new permission key for user %s with main character %s" % (request.user, character))
|
||||
result = Teamspeak3Manager.generate_new_permissionkey(request.user.teamspeak3.uid, character.character_name,
|
||||
character.corporation_ticker)
|
||||
|
||||
# if blank we failed
|
||||
|
||||
@@ -21,7 +21,7 @@ ACCESS_PERM = 'xenforo.access_xenforo'
|
||||
@permission_required(ACCESS_PERM)
|
||||
def activate_xenforo_forum(request):
|
||||
logger.debug("activate_xenforo_forum called by user %s" % request.user)
|
||||
character = EveManager.get_main_character(request.user)
|
||||
character = request.user.profile.main_character
|
||||
logger.debug("Adding XenForo user for user %s with main character %s" % (request.user, character))
|
||||
result = XenForoManager.add_user(character.character_name, request.user.email)
|
||||
# Based on XenAPI's response codes
|
||||
|
||||
Reference in New Issue
Block a user