pre-commit fixes

This commit is contained in:
Joel Falknau 2024-12-04 22:08:47 +10:00
parent dc0c1a2818
commit 5e836c4285
No known key found for this signature in database
23 changed files with 97 additions and 91 deletions

View File

@ -70,7 +70,7 @@ def forward(apps, schema_editor):
perm.delete() perm.delete()
def reverse(apps, schema_editor): def reverse(apps, schema_editor): # noqa: C901
perm_dict = user_permissions_dict(apps) perm_dict = user_permissions_dict(apps)
corp_users = users_with_permission(apps, perm_dict['corpstats']['view_corp_corpstats']) corp_users = users_with_permission(apps, perm_dict['corpstats']['view_corp_corpstats'])

View File

@ -62,7 +62,7 @@ def corpstats_add(request, token):
@login_required @login_required
@user_passes_test(access_corpstats_test) @user_passes_test(access_corpstats_test)
def corpstats_view(request, corp_id=None): def corpstats_view(request, corp_id=None): # noqa: C901
corpstats = None corpstats = None
# get requested model # get requested model

View File

@ -49,8 +49,8 @@ class EveFactionForm(EveEntityForm):
def clean_id(self): def clean_id(self):
try: try:
assert self.Meta.model.provider.get_faction(self.cleaned_data['id']) assert self.Meta.model.provider.get_faction(self.cleaned_data['id'])
except (AssertionError, ObjectNotFound): except (AssertionError, ObjectNotFound) as e:
raise EveEntityNotFoundError('faction', self.cleaned_data['id']) raise EveEntityNotFoundError('faction', self.cleaned_data['id']) from e
if self.Meta.model.objects.filter(faction_id=self.cleaned_data['id']).exists(): if self.Meta.model.objects.filter(faction_id=self.cleaned_data['id']).exists():
raise EveEntityExistsError('faction', self.cleaned_data['id']) raise EveEntityExistsError('faction', self.cleaned_data['id'])
return self.cleaned_data['id'] return self.cleaned_data['id']
@ -70,8 +70,8 @@ class EveCharacterForm(EveEntityForm):
def clean_id(self): def clean_id(self):
try: try:
assert self.Meta.model.provider.get_character(self.cleaned_data['id']) assert self.Meta.model.provider.get_character(self.cleaned_data['id'])
except (AssertionError, ObjectNotFound): except (AssertionError, ObjectNotFound) as e:
raise EveEntityNotFoundError(self.entity_type_name, self.cleaned_data['id']) raise EveEntityNotFoundError(self.entity_type_name, self.cleaned_data['id']) from e
if self.Meta.model.objects.filter(character_id=self.cleaned_data['id']).exists(): if self.Meta.model.objects.filter(character_id=self.cleaned_data['id']).exists():
raise EveEntityExistsError(self.entity_type_name, self.cleaned_data['id']) raise EveEntityExistsError(self.entity_type_name, self.cleaned_data['id'])
return self.cleaned_data['id'] return self.cleaned_data['id']
@ -90,8 +90,8 @@ class EveCorporationForm(EveEntityForm):
def clean_id(self): def clean_id(self):
try: try:
assert self.Meta.model.provider.get_corporation(self.cleaned_data['id']) assert self.Meta.model.provider.get_corporation(self.cleaned_data['id'])
except (AssertionError, ObjectNotFound): except (AssertionError, ObjectNotFound) as e:
raise EveEntityNotFoundError(self.entity_type_name, self.cleaned_data['id']) raise EveEntityNotFoundError(self.entity_type_name, self.cleaned_data['id']) from e
if self.Meta.model.objects.filter(corporation_id=self.cleaned_data['id']).exists(): if self.Meta.model.objects.filter(corporation_id=self.cleaned_data['id']).exists():
raise EveEntityExistsError(self.entity_type_name, self.cleaned_data['id']) raise EveEntityExistsError(self.entity_type_name, self.cleaned_data['id'])
return self.cleaned_data['id'] return self.cleaned_data['id']
@ -110,8 +110,8 @@ class EveAllianceForm(EveEntityForm):
def clean_id(self): def clean_id(self):
try: try:
assert self.Meta.model.provider.get_alliance(self.cleaned_data['id']) assert self.Meta.model.provider.get_alliance(self.cleaned_data['id'])
except (AssertionError, ObjectNotFound): except (AssertionError, ObjectNotFound) as e:
raise EveEntityNotFoundError(self.entity_type_name, self.cleaned_data['id']) raise EveEntityNotFoundError(self.entity_type_name, self.cleaned_data['id']) from e
if self.Meta.model.objects.filter(alliance_id=self.cleaned_data['id']).exists(): if self.Meta.model.objects.filter(alliance_id=self.cleaned_data['id']).exists():
raise EveEntityExistsError(self.entity_type_name, self.cleaned_data['id']) raise EveEntityExistsError(self.entity_type_name, self.cleaned_data['id'])
return self.cleaned_data['id'] return self.cleaned_data['id']

View File

@ -223,8 +223,8 @@ class EveSwaggerProvider(EveProvider):
faction_id=data['faction_id'] if 'faction_id' in data else None, faction_id=data['faction_id'] if 'faction_id' in data else None,
) )
return model return model
except HTTPNotFound: except HTTPNotFound as e:
raise ObjectNotFound(alliance_id, 'alliance') raise ObjectNotFound(alliance_id, 'alliance') from e
def get_corp(self, corp_id: int) -> Corporation: def get_corp(self, corp_id: int) -> Corporation:
"""Fetch corporation from ESI.""" """Fetch corporation from ESI."""
@ -240,8 +240,8 @@ class EveSwaggerProvider(EveProvider):
faction_id=data['faction_id'] if 'faction_id' in data else None, faction_id=data['faction_id'] if 'faction_id' in data else None,
) )
return model return model
except HTTPNotFound: except HTTPNotFound as e:
raise ObjectNotFound(corp_id, 'corporation') raise ObjectNotFound(corp_id, 'corporation') from e
def get_character(self, character_id: int) -> Character: def get_character(self, character_id: int) -> Character:
"""Fetch character from ESI.""" """Fetch character from ESI."""
@ -256,8 +256,8 @@ class EveSwaggerProvider(EveProvider):
faction_id=affiliation['faction_id'] if 'faction_id' in affiliation else None, faction_id=affiliation['faction_id'] if 'faction_id' in affiliation else None,
) )
return model return model
except (HTTPNotFound, HTTPUnprocessableEntity, ObjectNotFound): except (HTTPNotFound, HTTPUnprocessableEntity, ObjectNotFound) as e:
raise ObjectNotFound(character_id, 'character') raise ObjectNotFound(character_id, 'character') from e
def _fetch_character_name(self, character_id: int) -> str: def _fetch_character_name(self, character_id: int) -> str:
"""Fetch character name from ESI.""" """Fetch character name from ESI."""
@ -288,16 +288,16 @@ class EveSwaggerProvider(EveProvider):
return Entity(id=f['faction_id'], name=f['name']) return Entity(id=f['faction_id'], name=f['name'])
else: else:
raise KeyError() raise KeyError()
except (HTTPNotFound, HTTPUnprocessableEntity, KeyError): except (HTTPNotFound, HTTPUnprocessableEntity, KeyError) as e:
raise ObjectNotFound(faction_id, 'faction') raise ObjectNotFound(faction_id, 'faction') from e
def get_itemtype(self, type_id: int) -> ItemType: def get_itemtype(self, type_id: int) -> ItemType:
"""Fetch inventory item from ESI.""" """Fetch inventory item from ESI."""
try: try:
data = self.client.Universe.get_universe_types_type_id(type_id=type_id).result() data = self.client.Universe.get_universe_types_type_id(type_id=type_id).result()
return ItemType(id=type_id, name=data['name']) return ItemType(id=type_id, name=data['name'])
except (HTTPNotFound, HTTPUnprocessableEntity): except (HTTPNotFound, HTTPUnprocessableEntity) as e:
raise ObjectNotFound(type_id, 'type') raise ObjectNotFound(type_id, 'type') from e
provider = EveSwaggerProvider() provider = EveSwaggerProvider()

View File

@ -57,11 +57,11 @@ class EsiClientStub:
} }
try: try:
return BravadoOperationStub(data[int(alliance_id)]) return BravadoOperationStub(data[int(alliance_id)])
except KeyError: except KeyError as e:
response = BravadoResponseStub( response = BravadoResponseStub(
404, f"Alliance with ID {alliance_id} not found" 404, f"Alliance with ID {alliance_id} not found"
) )
raise HTTPNotFound(response) raise HTTPNotFound(response) from e
@staticmethod @staticmethod
def get_alliances_alliance_id_corporations(alliance_id): def get_alliances_alliance_id_corporations(alliance_id):
@ -87,11 +87,11 @@ class EsiClientStub:
} }
try: try:
return BravadoOperationStub(data[int(character_id)]) return BravadoOperationStub(data[int(character_id)])
except KeyError: except KeyError as e:
response = BravadoResponseStub( response = BravadoResponseStub(
404, f"Character with ID {character_id} not found" 404, f"Character with ID {character_id} not found"
) )
raise HTTPNotFound(response) raise HTTPNotFound(response) from e
@staticmethod @staticmethod
def post_characters_affiliation(characters: list): def post_characters_affiliation(characters: list):
@ -147,11 +147,11 @@ class EsiClientStub:
} }
try: try:
return BravadoOperationStub(data[int(corporation_id)]) return BravadoOperationStub(data[int(corporation_id)])
except KeyError: except KeyError as e:
response = BravadoResponseStub( response = BravadoResponseStub(
404, f"Corporation with ID {corporation_id} not found" 404, f"Corporation with ID {corporation_id} not found"
) )
raise HTTPNotFound(response) raise HTTPNotFound(response) from e
class Universe: class Universe:
@staticmethod @staticmethod

View File

@ -143,7 +143,12 @@ def fatlink_statistics_corp_view(request, corpid, year=None, month=None):
@login_required @login_required
@permission_required('auth.fleetactivitytracking_statistics') @permission_required('auth.fleetactivitytracking_statistics')
def fatlink_statistics_view(request, year=datetime.date.today().year, month=datetime.date.today().month): def fatlink_statistics_view(request, year=None, month=None):
if year is None:
year = datetime.date.today().year
if month is None:
month = datetime.date.today().month
year = int(year) year = int(year)
month = int(month) month = int(month)
start_of_month = datetime.datetime(year, month, 1) start_of_month = datetime.datetime(year, month, 1)
@ -176,9 +181,12 @@ def fatlink_statistics_view(request, year=datetime.date.today().year, month=date
@login_required @login_required
def fatlink_personal_statistics_view(request, year=datetime.date.today().year): def fatlink_personal_statistics_view(request, year=None):
if year is None:
year = datetime.date.today().year
year = int(year) year = int(year)
logger.debug("Personal statistics view for year %i called by %s" % (year, request.user)) logger.debug(f"Personal statistics view for year {year} called by {request.user}")
user = request.user user = request.user
logger.debug(f"fatlink_personal_statistics_view called by user {request.user}") logger.debug(f"fatlink_personal_statistics_view called by user {request.user}")

View File

@ -87,8 +87,8 @@ def group_membership_audit(request, group_id):
logger.warning(f"User {request.user} attempted to view the membership of group {group_id} but permission was denied") logger.warning(f"User {request.user} attempted to view the membership of group {group_id} but permission was denied")
raise PermissionDenied raise PermissionDenied
except ObjectDoesNotExist: except ObjectDoesNotExist as e:
raise Http404("Group does not exist") raise Http404("Group does not exist") from e
render_items = {'group': group} render_items = {'group': group}
entries = RequestLog.objects.filter(group=group).order_by('-date') entries = RequestLog.objects.filter(group=group).order_by('-date')
render_items['entries'] = entries render_items['entries'] = entries
@ -117,8 +117,8 @@ def group_membership_list(request, group_id):
) )
raise PermissionDenied raise PermissionDenied
except ObjectDoesNotExist: except ObjectDoesNotExist as e:
raise Http404("Group does not exist") raise Http404("Group does not exist") from e
group_leaders = group.authgroup.group_leaders.all() group_leaders = group.authgroup.group_leaders.all()
members = [] members = []

View File

@ -111,8 +111,8 @@ def hr_application_view(request, app_id):
logger.debug(f"hr_application_view called by user {request.user} for app id {app_id}") logger.debug(f"hr_application_view called by user {request.user} for app id {app_id}")
try: try:
app = Application.objects.prefetch_related('responses', 'comments', 'comments__user').get(pk=app_id) app = Application.objects.prefetch_related('responses', 'comments', 'comments__user').get(pk=app_id)
except Application.DoesNotExist: except Application.DoesNotExist as e:
raise Http404 raise Http404 from e
if request.method == 'POST': if request.method == 'POST':
if request.user.has_perm('hrapplications.add_applicationcomment'): if request.user.has_perm('hrapplications.add_applicationcomment'):
form = HRApplicationCommentForm(request.POST) form = HRApplicationCommentForm(request.POST)

View File

@ -47,7 +47,7 @@ class MenuItem(models.Model):
) )
# app related properties # app related properties
hook_hash = models.CharField( hook_hash = models.CharField( # noqa: DJ001
max_length=64, max_length=64,
default=None, default=None,
null=True, null=True,

View File

@ -77,7 +77,7 @@ class RenderedMenuItem:
self.html_id = hook_obj.html_id self.html_id = hook_obj.html_id
def render_menu(request: HttpRequest) -> list[RenderedMenuItem]: def render_menu(request: HttpRequest) -> list[RenderedMenuItem]: # noqa: C901
"""Return the rendered side menu for including in a template. """Return the rendered side menu for including in a template.
This function is creating BS5 style menus. This function is creating BS5 style menus.

View File

@ -48,8 +48,8 @@ def permissions_audit(request, app_label, model, codename):
.prefetch_related('group_set', 'user_set', 'state_set', .prefetch_related('group_set', 'user_set', 'state_set',
'state_set__userprofile_set', 'group_set__user_set', 'state_set__userprofile_set__user')\ 'state_set__userprofile_set', 'group_set__user_set', 'state_set__userprofile_set__user')\
.get(content_type__app_label=app_label, content_type__model=model, codename=codename) .get(content_type__app_label=app_label, content_type__model=model, codename=codename)
except Permission.DoesNotExist: except Permission.DoesNotExist as e:
raise Http404 raise Http404 from e
context = {'permission': { context = {'permission': {
'permission': perm, 'permission': perm,

View File

@ -33,7 +33,6 @@ class AbstractServiceModel(models.Model):
related_name='%(app_label)s' related_name='%(app_label)s'
) )
class Meta: class Meta:
abstract = True abstract = True
@ -85,8 +84,8 @@ class ServicesCRUDMixin(SingleObjectMixin):
try: try:
return queryset.get(user__pk=self.request.user.pk) return queryset.get(user__pk=self.request.user.pk)
except ObjectDoesNotExist: except ObjectDoesNotExist as e:
raise Http404 raise Http404 from e
class BaseDeactivateServiceAccountView(ServicesCRUDMixin, BaseServiceView, DeleteView): class BaseDeactivateServiceAccountView(ServicesCRUDMixin, BaseServiceView, DeleteView):

View File

@ -44,26 +44,24 @@ MAX_JITTER_PER_RUN_SECS = 1.0
def worker(num: int): def worker(num: int):
"""worker function""" """worker function"""
worker_info = 'worker %d' % num worker_info = f'worker {num}'
logger.info('%s: started', worker_info) logger.info(f'{worker_info}: started')
client = DiscordClient(DISCORD_BOT_TOKEN) client = DiscordClient(DISCORD_BOT_TOKEN)
try: try:
runs = 0 runs = 0
while runs < NUMBER_OF_RUNS: while runs < NUMBER_OF_RUNS:
run_info = '%s: run %d' % (worker_info, runs + 1) run_info = f'{worker_info}: run {runs + 1}'
my_jitter_secs = random() * MAX_JITTER_PER_RUN_SECS my_jitter_secs = random() * MAX_JITTER_PER_RUN_SECS
logger.info('%s - waiting %s secs', run_info, f'{my_jitter_secs:.3f}') logger.info(f'{run_info} - waiting {my_jitter_secs:.3f} secs')
sleep(my_jitter_secs) sleep(my_jitter_secs)
logger.info('%s - started', run_info) logger.info(f'{run_info} - started')
try: try:
client.modify_guild_member( client.modify_guild_member(
DISCORD_GUILD_ID, DISCORD_USER_ID, nick=NICK DISCORD_GUILD_ID, DISCORD_USER_ID, nick=NICK
) )
runs += 1 runs += 1
except DiscordApiBackoff as bo: except DiscordApiBackoff as bo:
message = '%s - waiting out API backoff for %d ms' % ( message = f'{run_info} - waiting out API backoff for {bo.retry_after} ms'
run_info, bo.retry_after
)
logger.info(message) logger.info(message)
print() print()
print(message) print(message)

View File

@ -89,12 +89,12 @@ def _task_perform_user_action(self, user_pk: int, method: str, **kwargs) -> None
bo, bo,
bo.retry_after_seconds bo.retry_after_seconds
) )
raise self.retry(countdown=bo.retry_after_seconds) raise self.retry(exc=bo, countdown=bo.retry_after_seconds) from bo
except AttributeError: except AttributeError as e:
raise ValueError(f'{method} not a valid method for DiscordUser') raise ValueError(f'{method} not a valid method for DiscordUser') from e
except (HTTPError, ConnectionError): except (HTTPError, ConnectionError) as e:
logger.warning( logger.warning(
'%s failed for user %s, retrying in %d secs', '%s failed for user %s, retrying in %d secs',
method, method,
@ -103,7 +103,7 @@ def _task_perform_user_action(self, user_pk: int, method: str, **kwargs) -> None
exc_info=True exc_info=True
) )
if self.request.retries < DISCORD_TASKS_MAX_RETRIES: if self.request.retries < DISCORD_TASKS_MAX_RETRIES:
raise self.retry(countdown=DISCORD_TASKS_RETRY_PAUSE) raise self.retry(exc=e, countdown=DISCORD_TASKS_RETRY_PAUSE) from e
else: else:
logger.error( logger.error(
'%s failed for user %s after max retries', '%s failed for user %s after max retries',
@ -192,8 +192,8 @@ def _task_perform_users_action(self, method: str, **kwargs) -> Any:
try: try:
result = getattr(DiscordUser.objects, method)(**kwargs) result = getattr(DiscordUser.objects, method)(**kwargs)
except AttributeError: except AttributeError as e:
raise ValueError(f'{method} not a valid method for DiscordUser.objects') raise ValueError(f'{method} not a valid method for DiscordUser.objects') from e
except DiscordApiBackoff as bo: except DiscordApiBackoff as bo:
logger.info( logger.info(
@ -202,9 +202,9 @@ def _task_perform_users_action(self, method: str, **kwargs) -> Any:
bo, bo,
bo.retry_after_seconds bo.retry_after_seconds
) )
raise self.retry(countdown=bo.retry_after_seconds) raise self.retry(exc=bo, countdown=bo.retry_after_seconds) from bo
except (HTTPError, ConnectionError): except (HTTPError, ConnectionError)as e:
logger.warning( logger.warning(
'%s failed, retrying in %d secs', '%s failed, retrying in %d secs',
method, method,
@ -212,7 +212,7 @@ def _task_perform_users_action(self, method: str, **kwargs) -> Any:
exc_info=True exc_info=True
) )
if self.request.retries < DISCORD_TASKS_MAX_RETRIES: if self.request.retries < DISCORD_TASKS_MAX_RETRIES:
raise self.retry(countdown=DISCORD_TASKS_RETRY_PAUSE) raise self.retry(exc=e, countdown=DISCORD_TASKS_RETRY_PAUSE) from e
else: else:
logger.error('%s failed after max retries', method, exc_info=True) logger.error('%s failed after max retries', method, exc_info=True)

View File

@ -52,7 +52,7 @@ class DiscourseTasks:
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
logger.warning(f"Discourse group sync failed for {user}, retrying in 10 mins") logger.warning(f"Discourse group sync failed for {user}, retrying in 10 mins")
raise self.retry(countdown=60 * 10) raise self.retry(exc=e, countdown=60 * 10) from e
logger.debug(f"Updated user {user} discourse groups.") logger.debug(f"Updated user {user} discourse groups.")
@staticmethod @staticmethod

View File

@ -41,9 +41,9 @@ class MumbleTasks:
return True return True
except MumbleUser.DoesNotExist: except MumbleUser.DoesNotExist:
logger.info(f"Mumble group sync failed for {user}, user does not have a mumble account") logger.info(f"Mumble group sync failed for {user}, user does not have a mumble account")
except Exception: except Exception as e:
logger.exception(f"Mumble group sync failed for {user}, retrying in 10 mins") logger.exception(f"Mumble group sync failed for {user}, retrying in 10 mins")
raise self.retry(countdown=60 * 10) raise self.retry(exc=e, countdown=60 * 10) from e
else: else:
logger.debug(f"User {user} does not have a mumble account, skipping") logger.debug(f"User {user} does not have a mumble account, skipping")
return False return False
@ -61,9 +61,9 @@ class MumbleTasks:
return True return True
except MumbleUser.DoesNotExist: except MumbleUser.DoesNotExist:
logger.info(f"Mumble display name sync failed for {user}, user does not have a mumble account") logger.info(f"Mumble display name sync failed for {user}, user does not have a mumble account")
except Exception: except Exception as e:
logger.exception(f"Mumble display name sync failed for {user}, retrying in 10 mins") logger.exception(f"Mumble display name sync failed for {user}, retrying in 10 mins")
raise self.retry(countdown=60 * 10) raise self.retry(exc=e, countdown=60 * 10) from e
else: else:
logger.debug(f"User {user} does not have a mumble account, skipping") logger.debug(f"User {user} does not have a mumble account, skipping")
return False return False

View File

@ -54,9 +54,9 @@ class OpenfireTasks:
logger.debug(f"Updating user {user} jabber groups to {groups}") logger.debug(f"Updating user {user} jabber groups to {groups}")
try: try:
OpenfireManager.update_user_groups(user.openfire.username, groups) OpenfireManager.update_user_groups(user.openfire.username, groups)
except Exception: except Exception as e:
logger.exception(f"Jabber group sync failed for {user}, retrying in 10 mins") logger.exception(f"Jabber group sync failed for {user}, retrying in 10 mins")
raise self.retry(countdown=60 * 10) raise self.retry(exc=e, countdown=60 * 10) from e
logger.debug(f"Updated user {user} jabber groups.") logger.debug(f"Updated user {user} jabber groups.")
else: else:
logger.debug("User does not have an openfire account") logger.debug("User does not have an openfire account")

View File

@ -8,10 +8,10 @@ class Phpbb3User(models.Model):
related_name='phpbb3') related_name='phpbb3')
username = models.CharField(max_length=254) username = models.CharField(max_length=254)
def __str__(self):
return self.username
class Meta: class Meta:
permissions = ( permissions = (
("access_phpbb3", "Can access the phpBB3 service"), ("access_phpbb3", "Can access the phpBB3 service"),
) )
def __str__(self) -> str:
return self.username

View File

@ -49,9 +49,9 @@ class Phpbb3Tasks:
logger.debug(f"Updating user {user} phpbb3 groups to {groups}") logger.debug(f"Updating user {user} phpbb3 groups to {groups}")
try: try:
Phpbb3Manager.update_groups(user.phpbb3.username, groups) Phpbb3Manager.update_groups(user.phpbb3.username, groups)
except Exception: except Exception as e:
logger.exception(f"Phpbb group sync failed for {user}, retrying in 10 mins") logger.exception(f"Phpbb group sync failed for {user}, retrying in 10 mins")
raise self.retry(countdown=60 * 10) raise self.retry(exc=e, countdown=60 * 10) from e
logger.debug(f"Updated user {user} phpbb3 groups.") logger.debug(f"Updated user {user} phpbb3 groups.")
else: else:
logger.debug("User does not have a Phpbb3 account") logger.debug("User does not have a Phpbb3 account")

View File

@ -53,9 +53,9 @@ class SmfTasks:
logger.debug(f"Updating user {user} smf groups to {groups}") logger.debug(f"Updating user {user} smf groups to {groups}")
try: try:
SmfManager.update_groups(user.smf.username, groups) SmfManager.update_groups(user.smf.username, groups)
except Exception: except Exception as e:
logger.exception(f"smf group sync failed for {user}, retrying in 10 mins") logger.exception(f"smf group sync failed for {user}, retrying in 10 mins")
raise self.retry(countdown=60 * 10) raise self.retry(exc=e, countdown=60 * 10) from e
logger.debug(f"Updated user {user} smf groups.") logger.debug(f"Updated user {user} smf groups.")
else: else:
logger.debug("User does not have an smf account") logger.debug("User does not have an smf account")
@ -77,11 +77,11 @@ class SmfTasks:
f"SMF displayed name sync failed for {user}, " f"SMF displayed name sync failed for {user}, "
"user does not have a SMF account" "user does not have a SMF account"
) )
except Exception: except Exception as e:
logger.exception( logger.exception(
f"SMF displayed name sync failed for {user}, retrying in 10 mins" f"SMF displayed name sync failed for {user}, retrying in 10 mins"
) )
raise self.retry(countdown=60 * 10) raise self.retry(exc=e, countdown=60 * 10) from e
else: else:
logger.debug(f"User {user} does not have a SMF account, skipping") logger.debug(f"User {user} does not have a SMF account, skipping")

View File

@ -81,7 +81,7 @@ class Teamspeak3Tasks:
logger.debug(f"Updated user {user} teamspeak3 groups.") logger.debug(f"Updated user {user} teamspeak3 groups.")
except TeamspeakError as e: except TeamspeakError as e:
logger.error(f"Error occured while syncing TS groups for {user}: {str(e)}") logger.error(f"Error occured while syncing TS groups for {user}: {str(e)}")
raise self.retry(countdown=60*10) raise self.retry(exc=e, countdown=60 * 10) from e
else: else:
logger.debug("User does not have a teamspeak3 account") logger.debug("User does not have a teamspeak3 account")

View File

@ -182,7 +182,7 @@ class TS3Proto:
""" """
if isinstance(value, int): if isinstance(value, int):
return "%d" % value return f"{value}"
value = value.replace("\\", r'\\') value = value.replace("\\", r'\\')
for i, j in ts3_escape.items(): for i, j in ts3_escape.items():
value = value.replace(i, j) value = value.replace(i, j)
@ -197,7 +197,7 @@ class TS3Proto:
""" """
if isinstance(value, int): if isinstance(value, int):
return "%d" % value return f"{value}"
value = value.replace(r"\\", "\\") value = value.replace(r"\\", "\\")
for i, j in ts3_escape.items(): for i, j in ts3_escape.items():
value = value.replace(j, i) value = value.replace(j, i)

View File

@ -68,8 +68,8 @@ def m2m_changed_group_permissions(sender, instance, action, pk_set, *args, **kwa
logger.debug(f"Received m2m_changed from group {instance} permissions with action {action}") logger.debug(f"Received m2m_changed from group {instance} permissions with action {action}")
if instance.pk and (action == "post_remove" or action == "post_clear"): if instance.pk and (action == "post_remove" or action == "post_clear"):
logger.debug(f"Checking if service permission changed for group {instance}") logger.debug(f"Checking if service permission changed for group {instance}")
# As validating an entire groups service could lead to many thousands of permission checks # As validating an entire group's service could lead to many thousands of permission checks,
# first we check that one of the permissions changed is, in fact, a service permission. # first, we check that one of the permissions changed is, in fact, a service permission.
perms = Permission.objects.filter(pk__in=pk_set) perms = Permission.objects.filter(pk__in=pk_set)
got_change = False got_change = False
service_perms = [svc.access_perm for svc in ServicesHook.get_services()] service_perms = [svc.access_perm for svc in ServicesHook.get_services()]
@ -81,18 +81,19 @@ def m2m_changed_group_permissions(sender, instance, action, pk_set, *args, **kwa
continue continue
for svc in ServicesHook.get_services(): for svc in ServicesHook.get_services():
if svc.access_perm == path_perm: if svc.access_perm == path_perm:
logger.debug(f"Permissions changed for group {instance} on service {svc}, re-validating services for groups users") logger.debug(f"Permissions changed for group {instance} on service {svc}, re-validating services for group users")
def validate_all_groups_users_for_service(): def validate_all_groups_users_for_service(service):
logger.debug(f"Performing validation for service {svc}") logger.debug(f"Performing validation for service {service}")
for user in instance.user_set.all(): for user in instance.user_set.all():
svc.validate_user(user) service.validate_user(user)
transaction.on_commit(validate_all_groups_users_for_service) transaction.on_commit(lambda service=svc: validate_all_groups_users_for_service(service))
got_change = True got_change = True
break # Found service, break out of services iteration and go back to permission iteration break # Found service, break out of services iteration and go back to permission iteration
if not got_change: if not got_change:
logger.debug(f"Permission change for group {instance} was not service permission, ignoring") logger.debug(f"Permission change for group {instance} was not a service permission, ignoring")
@receiver(m2m_changed, sender=State.permissions.through) @receiver(m2m_changed, sender=State.permissions.through)
@ -115,12 +116,12 @@ def m2m_changed_state_permissions(sender, instance, action, pk_set, *args, **kwa
if svc.access_perm == path_perm: if svc.access_perm == path_perm:
logger.debug(f"Permissions changed for state {instance} on service {svc}, re-validating services for state users") logger.debug(f"Permissions changed for state {instance} on service {svc}, re-validating services for state users")
def validate_all_state_users_for_service(): def validate_all_state_users_for_service(service):
logger.debug(f"Performing validation for service {svc}") logger.debug(f"Performing validation for service {service}")
for profile in instance.userprofile_set.all(): for profile in instance.userprofile_set.all():
svc.validate_user(profile.user) service.validate_user(profile.user)
transaction.on_commit(validate_all_state_users_for_service) transaction.on_commit(lambda service=svc: validate_all_state_users_for_service(service))
got_change = True got_change = True
break # Found service, break out of services iteration and go back to permission iteration break # Found service, break out of services iteration and go back to permission iteration
if not got_change: if not got_change: