editorconfig applied

This commit is contained in:
Peter Pfeufer 2021-05-17 11:42:28 +02:00
parent bad36a69e8
commit e6a4cea4de
No known key found for this signature in database
GPG Key ID: 6051D2C6AD4EBC27
99 changed files with 522 additions and 600 deletions

View File

@ -10,7 +10,7 @@ charset = utf-8
trim_trailing_whitespace = true trim_trailing_whitespace = true
insert_final_newline = true insert_final_newline = true
[*.{yaml,yml}] [*.{yaml,yml,less}]
indent_size = 2 indent_size = 2
[*.md] [*.md]
@ -19,3 +19,6 @@ indent_size = 2
# Makefiles always use tabs for indentation # Makefiles always use tabs for indentation
[Makefile] [Makefile]
indent_style = tab indent_style = tab
[*.bat]
indent_style = tab

View File

@ -13,10 +13,16 @@ repos:
- id: check-yaml - id: check-yaml
- id: fix-byte-order-marker - id: fix-byte-order-marker
- id: trailing-whitespace - id: trailing-whitespace
exclude: \.(min\.css|min\.js|po|mo)$ exclude: \.(min\.css|min\.js|mo)$
- id: end-of-file-fixer - id: end-of-file-fixer
exclude: \.(min\.css|min\.js|po|mo)$ exclude: \.(min\.css|min\.js|mo)$
- id: mixed-line-ending - id: mixed-line-ending
args: [ '--fix=lf' ] args: [ '--fix=lf' ]
- id: fix-encoding-pragma - id: fix-encoding-pragma
args: [ '--remove' ] args: [ '--remove' ]
- repo: https://github.com/editorconfig-checker/editorconfig-checker.python
rev: 2.3.5
hooks:
- id: editorconfig-checker
exclude: ^(LICENSE|allianceauth/static/css/themes/bootstrap-locals.less)

View File

@ -23,8 +23,7 @@ class CharacterOwnershipManager(Manager):
def create_by_token(self, token): def create_by_token(self, token):
if not EveCharacter.objects.filter(character_id=token.character_id).exists(): if not EveCharacter.objects.filter(character_id=token.character_id).exists():
EveCharacter.objects.create_character(token.character_id) EveCharacter.objects.create_character(token.character_id)
return self.create(character=EveCharacter.objects.get(character_id=token.character_id), user=token.user, return self.create(character=EveCharacter.objects.get(character_id=token.character_id), user=token.user, owner_hash=token.character_owner_hash)
owner_hash=token.character_owner_hash)
class StateQuerySet(QuerySet): class StateQuerySet(QuerySet):

View File

@ -170,8 +170,7 @@ def recreate_authservicesinfo(apps, schema_editor):
# repopulate main characters # repopulate main characters
for profile in UserProfile.objects.exclude(main_character__isnull=True).select_related('user', 'main_character'): for profile in UserProfile.objects.exclude(main_character__isnull=True).select_related('user', 'main_character'):
AuthServicesInfo.objects.update_or_create(user=profile.user, AuthServicesInfo.objects.update_or_create(user=profile.user, defaults={'main_char_id': profile.main_character.character_id})
defaults={'main_char_id': profile.main_character.character_id})
# repopulate states we understand # repopulate states we understand
for profile in UserProfile.objects.exclude(state__name='Guest').filter( for profile in UserProfile.objects.exclude(state__name='Guest').filter(

View File

@ -14,15 +14,11 @@ logger = logging.getLogger(__name__)
class State(models.Model): class State(models.Model):
name = models.CharField(max_length=20, unique=True) name = models.CharField(max_length=20, unique=True)
permissions = models.ManyToManyField(Permission, blank=True) permissions = models.ManyToManyField(Permission, blank=True)
priority = models.IntegerField(unique=True, priority = models.IntegerField(unique=True, help_text="Users get assigned the state with the highest priority available to them.")
help_text="Users get assigned the state with the highest priority available to them.")
member_characters = models.ManyToManyField(EveCharacter, blank=True, member_characters = models.ManyToManyField(EveCharacter, blank=True, help_text="Characters to which this state is available.")
help_text="Characters to which this state is available.") member_corporations = models.ManyToManyField(EveCorporationInfo, blank=True, help_text="Corporations to whose members this state is available.")
member_corporations = models.ManyToManyField(EveCorporationInfo, blank=True, member_alliances = models.ManyToManyField(EveAllianceInfo, blank=True, help_text="Alliances to whose members this state is available.")
help_text="Corporations to whose members this state is available.")
member_alliances = models.ManyToManyField(EveAllianceInfo, blank=True,
help_text="Alliances to whose members this state is available.")
public = models.BooleanField(default=False, help_text="Make this state available to any character.") public = models.BooleanField(default=False, help_text="Make this state available to any character.")
objects = StateManager() objects = StateManager()

View File

@ -75,8 +75,7 @@ def create_required_models(sender, instance, created, *args, **kwargs):
@receiver(post_save, sender=Token) @receiver(post_save, sender=Token)
def record_character_ownership(sender, instance, created, *args, **kwargs): def record_character_ownership(sender, instance, created, *args, **kwargs):
if created: if created:
logger.debug('New token for {0} character {1} saved. Evaluating ownership.'.format(instance.user, logger.debug('New token for {0} character {1} saved. Evaluating ownership.'.format(instance.user, instance.character_name))
instance.character_name))
if instance.user: if instance.user:
query = Q(owner_hash=instance.character_owner_hash) & Q(user=instance.user) query = Q(owner_hash=instance.character_owner_hash) & Q(user=instance.user)
else: else:
@ -85,18 +84,14 @@ def record_character_ownership(sender, instance, created, *args, **kwargs):
CharacterOwnership.objects.filter(character__character_id=instance.character_id).exclude(query).delete() CharacterOwnership.objects.filter(character__character_id=instance.character_id).exclude(query).delete()
# create character if needed # create character if needed
if EveCharacter.objects.filter(character_id=instance.character_id).exists() is False: if EveCharacter.objects.filter(character_id=instance.character_id).exists() is False:
logger.debug('Token is for a new character. Creating model for {0} ({1})'.format(instance.character_name, logger.debug('Token is for a new character. Creating model for {0} ({1})'.format(instance.character_name, instance.character_id))
instance.character_id))
EveCharacter.objects.create_character(instance.character_id) EveCharacter.objects.create_character(instance.character_id)
char = EveCharacter.objects.get(character_id=instance.character_id) char = EveCharacter.objects.get(character_id=instance.character_id)
# check if we need to create ownership # check if we need to create ownership
if instance.user and not CharacterOwnership.objects.filter( if instance.user and not CharacterOwnership.objects.filter(
character__character_id=instance.character_id).exists(): character__character_id=instance.character_id).exists():
logger.debug("Character {0} is not yet owned. Assigning ownership to {1}".format(instance.character_name, logger.debug("Character {0} is not yet owned. Assigning ownership to {1}".format(instance.character_name, instance.user))
instance.user)) CharacterOwnership.objects.update_or_create(character=char, defaults={'owner_hash': instance.character_owner_hash, 'user': instance.user})
CharacterOwnership.objects.update_or_create(character=char,
defaults={'owner_hash': instance.character_owner_hash,
'user': instance.user})
@receiver(pre_delete, sender=CharacterOwnership) @receiver(pre_delete, sender=CharacterOwnership)

View File

@ -6,11 +6,13 @@ from allianceauth.corputils import urls
class CorpStats(MenuItemHook): class CorpStats(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, MenuItemHook.__init__(
self,
_('Corporation Stats'), _('Corporation Stats'),
'fas fa-share-alt fa-fw', 'fas fa-share-alt fa-fw',
'corputils:view', 'corputils:view',
navactive=['corputils:']) navactive=['corputils:']
)
def render(self, request): def render(self, request):
if request.user.has_perm('corputils.view_corp_corpstats') or request.user.has_perm( if request.user.has_perm('corputils.view_corp_corpstats') or request.user.has_perm(

View File

@ -12,8 +12,7 @@ def convert_json_to_members(apps, schema_editor):
for cs in CorpStats.objects.all(): for cs in CorpStats.objects.all():
members = json.loads(cs._members) members = json.loads(cs._members)
CorpMember.objects.bulk_create( CorpMember.objects.bulk_create(
[CorpMember(corpstats=cs, character_id=member_id, character_name=member_name) for member_id, member_name in [CorpMember(corpstats=cs, character_id=member_id, character_name=member_name) for member_id, member_name in members.items()]
members.items()]
) )

View File

@ -6,8 +6,7 @@ from bravado.exception import HTTPForbidden
from django.db import models from django.db import models
from esi.errors import TokenError from esi.errors import TokenError
from esi.models import Token from esi.models import Token
from allianceauth.eveonline.models import EveCorporationInfo, EveCharacter,\ from allianceauth.eveonline.models import EveCorporationInfo, EveCharacter, EveAllianceInfo
EveAllianceInfo
from allianceauth.notifications import notify from allianceauth.notifications import notify
from allianceauth.corputils.managers import CorpStatsManager from allianceauth.corputils.managers import CorpStatsManager
@ -49,8 +48,7 @@ class CorpStats(models.Model):
def update(self): def update(self):
try: try:
c = self.token.get_esi_client(spec_file=SWAGGER_SPEC_PATH) c = self.token.get_esi_client(spec_file=SWAGGER_SPEC_PATH)
assert c.Character.get_characters_character_id(character_id=self.token.character_id).result()[ assert c.Character.get_characters_character_id(character_id=self.token.character_id).result()['corporation_id'] == int(self.corp.corporation_id)
'corporation_id'] == int(self.corp.corporation_id)
member_ids = c.Corporation.get_corporations_corporation_id_members( member_ids = c.Corporation.get_corporations_corporation_id_members(
corporation_id=self.corp.corporation_id).result() corporation_id=self.corp.corporation_id).result()
@ -58,18 +56,15 @@ class CorpStats(models.Model):
# the swagger spec doesn't have a maxItems count # the swagger spec doesn't have a maxItems count
# manual testing says we can do over 350, but let's not risk it # manual testing says we can do over 350, but let's not risk it
member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)] member_id_chunks = [member_ids[i:i + 255] for i in range(0, len(member_ids), 255)]
member_name_chunks = [c.Universe.post_universe_names(ids=id_chunk).result() for id_chunk in member_name_chunks = [c.Universe.post_universe_names(ids=id_chunk).result() for id_chunk in member_id_chunks]
member_id_chunks]
member_list = {} member_list = {}
for name_chunk in member_name_chunks: for name_chunk in member_name_chunks:
member_list.update({m['id']: m['name'] for m in name_chunk}) member_list.update({m['id']: m['name'] for m in name_chunk})
# bulk create new member models # bulk create new member models
missing_members = [m_id for m_id in member_ids if missing_members = [m_id for m_id in member_ids if not CorpMember.objects.filter(corpstats=self, character_id=m_id).exists()]
not CorpMember.objects.filter(corpstats=self, character_id=m_id).exists()]
CorpMember.objects.bulk_create( CorpMember.objects.bulk_create(
[CorpMember(character_id=m_id, character_name=member_list[m_id], corpstats=self) for m_id in [CorpMember(character_id=m_id, character_name=member_list[m_id], corpstats=self) for m_id in missing_members])
missing_members])
# purge old members # purge old members
self.members.exclude(character_id__in=member_ids).delete() self.members.exclude(character_id__in=member_ids).delete()
@ -80,20 +75,21 @@ class CorpStats(models.Model):
except TokenError as e: except TokenError as e:
logger.warning("%s failed to update: %s" % (self, e)) logger.warning("%s failed to update: %s" % (self, e))
if self.token.user: if self.token.user:
notify(self.token.user, "%s failed to update with your ESI token." % self, notify(
self.token.user, "%s failed to update with your ESI token." % self,
message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.", message="Your token has expired or is no longer valid. Please add a new one to create a new CorpStats.",
level="error") level="error")
self.delete() self.delete()
except HTTPForbidden as e: except HTTPForbidden as e:
logger.warning("%s failed to update: %s" % (self, e)) logger.warning("%s failed to update: %s" % (self, e))
if self.token.user: if self.token.user:
notify(self.token.user, "%s failed to update with your ESI token." % self, notify(self.token.user, "%s failed to update with your ESI token." % self, message="%s: %s" % (e.status_code, e.message), level="error")
message="%s: %s" % (e.status_code, e.message), level="error")
self.delete() self.delete()
except AssertionError: except AssertionError:
logger.warning("%s token character no longer in corp." % self) logger.warning("%s token character no longer in corp." % self)
if self.token.user: if self.token.user:
notify(self.token.user, "%s cannot update with your ESI token." % self, notify(
self.token.user, "%s cannot update with your ESI token." % self,
message="%s cannot update with your ESI token as you have left corp." % self, level="error") message="%s cannot update with your ESI token as you have left corp." % self, level="error")
self.delete() self.delete()
@ -127,9 +123,7 @@ class CorpStats(models.Model):
@property @property
def mains(self): def mains(self):
return self.members.filter(pk__in=[m.pk for m in self.members.all() if return self.members.filter(pk__in=[m.pk for m in self.members.all() if m.main_character and int(m.main_character.character_id) == int(m.character_id)])
m.main_character and int(m.main_character.character_id) == int(
m.character_id)])
def visible_to(self, user): def visible_to(self, user):
return CorpStats.objects.filter(pk=self.pk).visible_to(user).exists() return CorpStats.objects.filter(pk=self.pk).visible_to(user).exists()

View File

@ -58,8 +58,7 @@
{% for id, main in mains.items %} {% for id, main in mains.items %}
<tr> <tr>
<td class="text-center" style="vertical-align:middle"> <td class="text-center" style="vertical-align:middle">
<div class="thumbnail" <div class="thumbnail" style="border: 0 none; box-shadow: none; background: transparent;">
style="border: 0 none; box-shadow: none; background: transparent;">
<img src="{{ main.main.portrait_url_64 }}" class="img-circle"> <img src="{{ main.main.portrait_url_64 }}" class="img-circle">
<div class="caption text-center"> <div class="caption text-center">
{{ main.main }} {{ main.main }}
@ -88,8 +87,7 @@
<td class="text-center" style="width:30%">{{ alt.corporation_name }}</td> <td class="text-center" style="width:30%">{{ alt.corporation_name }}</td>
<td class="text-center" style="width:30%">{{ alt.alliance_name }}</td> <td class="text-center" style="width:30%">{{ alt.alliance_name }}</td>
<td class="text-center" style="width:5%"> <td class="text-center" style="width:5%">
<a href="https://zkillboard.com/character/{{ alt.character_id }}/" <a href="https://zkillboard.com/character/{{ alt.character_id }}/" class="label label-danger" target="_blank">
class="label label-danger" target="_blank">
{% trans "Killboard" %} {% trans "Killboard" %}
</a> </a>
</td> </td>
@ -123,10 +121,9 @@
<tr> <tr>
<td><img src="{{ member.portrait_url }}" class="img-circle"></td> <td><img src="{{ member.portrait_url }}" class="img-circle"></td>
<td class="text-center">{{ member }}</td> <td class="text-center">{{ member }}</td>
<td class="text-center"><a <td class="text-center">
href="https://zkillboard.com/character/{{ member.character_id }}/" <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="label label-danger" target="_blank">{% trans "Killboard" %}</a>
class="label label-danger" </td>
target="_blank">{% trans "Killboard" %}</a></td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.character_name }}</td> <td class="text-center">{{ member.character_ownership.user.profile.main_character.character_name }}</td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.corporation_name }}</td> <td class="text-center">{{ member.character_ownership.user.profile.main_character.corporation_name }}</td>
<td class="text-center">{{ member.character_ownership.user.profile.main_character.alliance_name }}</td> <td class="text-center">{{ member.character_ownership.user.profile.main_character.alliance_name }}</td>
@ -136,10 +133,9 @@
<tr class="danger"> <tr class="danger">
<td><img src="{{ member.portrait_url }}" class="img-circle"></td> <td><img src="{{ member.portrait_url }}" class="img-circle"></td>
<td class="text-center">{{ member.character_name }}</td> <td class="text-center">{{ member.character_name }}</td>
<td class="text-center"><a <td class="text-center">
href="https://zkillboard.com/character/{{ member.character_id }}/" <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="label label-danger" target="_blank">{% trans "Killboard" %}</a>
class="label label-danger" </td>
target="_blank">{% trans "Killboard" %}</a></td>
<td class="text-center"></td> <td class="text-center"></td>
<td class="text-center"></td> <td class="text-center"></td>
<td class="text-center"></td> <td class="text-center"></td>
@ -167,9 +163,7 @@
<td><img src="{{ member.portrait_url }}" class="img-circle"></td> <td><img src="{{ member.portrait_url }}" class="img-circle"></td>
<td class="text-center">{{ member.character_name }}</td> <td class="text-center">{{ member.character_name }}</td>
<td class="text-center"> <td class="text-center">
<a href="https://zkillboard.com/character/{{ member.character_id }}/" <a href="https://zkillboard.com/character/{{ member.character_id }}/" class="label label-danger" target="_blank">
class="label label-danger"
target="_blank">
{% trans "Killboard" %} {% trans "Killboard" %}
</a> </a>
</td> </td>

View File

@ -57,25 +57,21 @@ class AutogroupsConfig(models.Model):
states = models.ManyToManyField(State, related_name='autogroups') states = models.ManyToManyField(State, related_name='autogroups')
corp_groups = models.BooleanField(default=False, corp_groups = models.BooleanField(default=False, help_text="Setting this to false will delete all the created groups.")
help_text="Setting this to false will delete all the created groups.")
corp_group_prefix = models.CharField(max_length=50, default='Corp ', blank=True) corp_group_prefix = models.CharField(max_length=50, default='Corp ', blank=True)
corp_name_source = models.CharField(max_length=20, choices=NAME_OPTIONS, default=OPT_NAME) corp_name_source = models.CharField(max_length=20, choices=NAME_OPTIONS, default=OPT_NAME)
alliance_groups = models.BooleanField(default=False, alliance_groups = models.BooleanField(default=False, help_text="Setting this to false will delete all the created groups.")
help_text="Setting this to false will delete all the created groups.")
alliance_group_prefix = models.CharField(max_length=50, default='Alliance ', blank=True) alliance_group_prefix = models.CharField(max_length=50, default='Alliance ', blank=True)
alliance_name_source = models.CharField(max_length=20, choices=NAME_OPTIONS, default=OPT_NAME) alliance_name_source = models.CharField(max_length=20, choices=NAME_OPTIONS, default=OPT_NAME)
corp_managed_groups = models.ManyToManyField( corp_managed_groups = models.ManyToManyField(
Group, through='ManagedCorpGroup', related_name='corp_managed_config', Group, through='ManagedCorpGroup', related_name='corp_managed_config',
help_text='A list of corporation groups created and maintained by this AutogroupConfig. ' help_text='A list of corporation groups created and maintained by this AutogroupConfig. You should not edit this list unless you know what you\'re doing.')
'You should not edit this list unless you know what you\'re doing.')
alliance_managed_groups = models.ManyToManyField( alliance_managed_groups = models.ManyToManyField(
Group, through='ManagedAllianceGroup', related_name='alliance_managed_config', Group, through='ManagedAllianceGroup', related_name='alliance_managed_config',
help_text='A list of alliance groups created and maintained by this AutogroupConfig. ' help_text='A list of alliance groups created and maintained by this AutogroupConfig. You should not edit this list unless you know what you\'re doing.')
'You should not edit this list unless you know what you\'re doing.')
replace_spaces = models.BooleanField(default=False) replace_spaces = models.BooleanField(default=False)
replace_spaces_with = models.CharField( replace_spaces_with = models.CharField(

View File

@ -91,9 +91,7 @@ class EveCorporationInfo(models.Model):
provider = EveCorporationProviderManager() provider = EveCorporationProviderManager()
class Meta: class Meta:
indexes = [ indexes = [models.Index(fields=['ceo_id',]),]
models.Index(fields=['ceo_id',]),
]
def update_corporation(self, corp: providers.Corporation = None): def update_corporation(self, corp: providers.Corporation = None):
if corp is None: if corp is None:

View File

@ -5,5 +5,4 @@ from django.utils.translation import ugettext_lazy as _
class FatlinkForm(forms.Form): class FatlinkForm(forms.Form):
fleet = forms.CharField(label=_("Fleet Name"), max_length=50) fleet = forms.CharField(label=_("Fleet Name"), max_length=50)
duration = forms.IntegerField(label=_("Duration of fat-link"), required=True, initial=30, min_value=1, duration = forms.IntegerField(label=_("Duration of fat-link"), required=True, initial=30, min_value=1, max_value=2147483647, help_text=_('minutes'))
max_value=2147483647, help_text=_('minutes'))

View File

@ -135,8 +135,7 @@ def fatlink_statistics_corp_view(request, corpid, year=None, month=None):
stat_list.sort(key=lambda stat: stat.mainchar.character_name) stat_list.sort(key=lambda stat: stat.mainchar.character_name)
stat_list.sort(key=lambda stat: (stat.n_fats, stat.avg_fat), reverse=True) stat_list.sort(key=lambda stat: (stat.n_fats, stat.avg_fat), reverse=True)
context = {'fatStats': stat_list, 'month': start_of_month.strftime("%B"), 'year': year, context = {'fatStats': stat_list, 'month': start_of_month.strftime("%B"), 'year': year, 'previous_month': start_of_previous_month, 'corpid': corpid}
'previous_month': start_of_previous_month, 'corpid': corpid}
if datetime.datetime.now() > start_of_next_month: if datetime.datetime.now() > start_of_next_month:
context.update({'next_month': start_of_next_month}) context.update({'next_month': start_of_next_month})
@ -163,16 +162,14 @@ def fatlink_statistics_view(request, year=datetime.date.today().year, month=date
for fat in fats_in_span.exclude(character__corporation_id__in=fat_stats): for fat in fats_in_span.exclude(character__corporation_id__in=fat_stats):
if EveCorporationInfo.objects.filter(corporation_id=fat.character.corporation_id).exists(): if EveCorporationInfo.objects.filter(corporation_id=fat.character.corporation_id).exists():
fat_stats[fat.character.corporation_id] = CorpStat(fat.character.corporation_id, start_of_month, fat_stats[fat.character.corporation_id] = CorpStat(fat.character.corporation_id, start_of_month, start_of_next_month)
start_of_next_month)
# collect and sort stats # collect and sort stats
stat_list = [fat_stats[x] for x in fat_stats] stat_list = [fat_stats[x] for x in fat_stats]
stat_list.sort(key=lambda stat: stat.corp.corporation_name) stat_list.sort(key=lambda stat: stat.corp.corporation_name)
stat_list.sort(key=lambda stat: (stat.n_fats, stat.avg_fat), reverse=True) stat_list.sort(key=lambda stat: (stat.n_fats, stat.avg_fat), reverse=True)
context = {'fatStats': stat_list, 'month': start_of_month.strftime("%B"), 'year': year, context = {'fatStats': stat_list, 'month': start_of_month.strftime("%B"), 'year': year, 'previous_month': start_of_previous_month}
'previous_month': start_of_previous_month}
if datetime.datetime.now() > start_of_next_month: if datetime.datetime.now() > start_of_next_month:
context.update({'next_month': start_of_next_month}) context.update({'next_month': start_of_next_month})
@ -199,8 +196,7 @@ def fatlink_personal_statistics_view(request, year=datetime.date.today().year):
monthlystats = [(i + 1, datetime.date(year, i + 1, 1).strftime("%h"), monthlystats[i]) for i in range(12)] monthlystats = [(i + 1, datetime.date(year, i + 1, 1).strftime("%h"), monthlystats[i]) for i in range(12)]
if datetime.datetime.now() > datetime.datetime(year + 1, 1, 1): if datetime.datetime.now() > datetime.datetime(year + 1, 1, 1):
context = {'user': user, 'monthlystats': monthlystats, 'year': year, 'previous_year': year - 1, context = {'user': user, 'monthlystats': monthlystats, 'year': year, 'previous_year': year - 1, 'next_year': year + 1}
'next_year': year + 1}
else: else:
context = {'user': user, 'monthlystats': monthlystats, 'year': year, 'previous_year': year - 1} context = {'user': user, 'monthlystats': monthlystats, 'year': year, 'previous_year': year - 1}
@ -229,9 +225,11 @@ def fatlink_monthly_personal_statistics_view(request, year, month, char_id=None)
for fat in personal_fats: for fat in personal_fats:
ship_statistics[fat.shiptype] = ship_statistics.setdefault(fat.shiptype, 0) + 1 ship_statistics[fat.shiptype] = ship_statistics.setdefault(fat.shiptype, 0) + 1
n_fats += 1 n_fats += 1
context = {'user': user, 'shipStats': sorted(ship_statistics.items()), 'month': start_of_month.strftime("%h"), context = {
'user': user, 'shipStats': sorted(ship_statistics.items()), 'month': start_of_month.strftime("%h"),
'year': year, 'n_fats': n_fats, 'char_id': char_id, 'previous_month': start_of_previous_month, 'year': year, 'n_fats': n_fats, 'char_id': char_id, 'previous_month': start_of_previous_month,
'next_month': start_of_next_month} 'next_month': start_of_next_month
}
created_fats = Fatlink.objects.filter(creator=user).filter(fatdatetime__gte=start_of_month).filter( created_fats = Fatlink.objects.filter(creator=user).filter(fatdatetime__gte=start_of_month).filter(
fatdatetime__lt=start_of_next_month) fatdatetime__lt=start_of_next_month)
@ -257,8 +255,7 @@ def click_fatlink_view(request, token, fat_hash=None):
location = c.Location.get_characters_character_id_location(character_id=token.character_id).result() location = c.Location.get_characters_character_id_location(character_id=token.character_id).result()
ship = c.Location.get_characters_character_id_ship(character_id=token.character_id).result() ship = c.Location.get_characters_character_id_ship(character_id=token.character_id).result()
location['solar_system_name'] = \ location['solar_system_name'] = \
c.Universe.get_universe_systems_system_id(system_id=location['solar_system_id']).result()[ c.Universe.get_universe_systems_system_id(system_id=location['solar_system_id']).result()['name']
'name']
if location['station_id']: if location['station_id']:
location['station_name'] = \ location['station_name'] = \
c.Universe.get_universe_stations_station_id(station_id=location['station_id']).result()['name'] c.Universe.get_universe_stations_station_id(station_id=location['station_id']).result()['name']

View File

@ -60,8 +60,7 @@ def reverse_group_models(apps, schema_editor):
pass pass
if len(group.authgroup.description): if len(group.authgroup.description):
GroupDescription.objects.update_or_create(group=group, GroupDescription.objects.update_or_create(group=group, defaults={'description': group.authgroup.description})
defaults={'description': group.authgroup.description})
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -76,8 +75,7 @@ class Migration(migrations.Migration):
migrations.CreateModel( migrations.CreateModel(
name='AuthGroup', name='AuthGroup',
fields=[ fields=[
('group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, ('group', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='auth.Group')),
serialize=False, to='auth.Group')),
('internal', models.BooleanField(default=True, help_text='Internal group, users cannot see, join or request to join this group.<br>Used for groups such as Members, Corp_*, Alliance_* etc.<br><b>Overrides Hidden and Open options when selected.</b>')), ('internal', models.BooleanField(default=True, help_text='Internal group, users cannot see, join or request to join this group.<br>Used for groups such as Members, Corp_*, Alliance_* etc.<br><b>Overrides Hidden and Open options when selected.</b>')),
('hidden', models.BooleanField(default=True, help_text='Group is hidden from users but can still join with the correct link.')), ('hidden', models.BooleanField(default=True, help_text='Group is hidden from users but can still join with the correct link.')),
('open', models.BooleanField(default=False, help_text='Group is open and users will be automatically added upon request. <br>If the group is not open users will need their request manually approved.')), ('open', models.BooleanField(default=False, help_text='Group is open and users will be automatically added upon request. <br>If the group is not open users will need their request manually approved.')),

View File

@ -82,8 +82,7 @@ class AuthGroup(models.Model):
help_text="Internal group, users cannot see, join or request to join this group.<br>" help_text="Internal group, users cannot see, join or request to join this group.<br>"
"Used for groups such as Members, Corp_*, Alliance_* etc.<br>" "Used for groups such as Members, Corp_*, Alliance_* etc.<br>"
"<b>Overrides Hidden and Open options when selected.</b>") "<b>Overrides Hidden and Open options when selected.</b>")
hidden = models.BooleanField(default=True, hidden = models.BooleanField(default=True, help_text="Group is hidden from users but can still join with the correct link.")
help_text="Group is hidden from users but can still join with the correct link.")
open = models.BooleanField(default=False, open = models.BooleanField(default=False,
help_text="Group is open and users will be automatically added upon request. <br>" help_text="Group is open and users will be automatically added upon request. <br>"
"If the group is not open users will need their request manually approved.") "If the group is not open users will need their request manually approved.")

View File

@ -78,8 +78,7 @@ def group_membership_audit(request, group_id):
# Check its a joinable group i.e. not corp or internal # Check its a joinable group i.e. not corp or internal
# And the user has permission to manage it # And the user has permission to manage it
if not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group): if not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group):
logger.warning("User %s attempted to view the membership of group %s but permission was denied" % logger.warning("User %s attempted to view the membership of group %s but permission was denied" % (request.user, group_id))
(request.user, group_id))
raise PermissionDenied raise PermissionDenied
except ObjectDoesNotExist: except ObjectDoesNotExist:
@ -140,15 +139,13 @@ def group_membership_list(request, group_id):
@login_required @login_required
@user_passes_test(GroupManager.can_manage_groups) @user_passes_test(GroupManager.can_manage_groups)
def group_membership_remove(request, group_id, user_id): def group_membership_remove(request, group_id, user_id):
logger.debug("group_membership_remove called by user %s for group id %s on user id %s" % logger.debug("group_membership_remove called by user %s for group id %s on user id %s" % (request.user, group_id, user_id))
(request.user, group_id, user_id))
group = get_object_or_404(Group, id=group_id) group = get_object_or_404(Group, id=group_id)
try: try:
# Check its a joinable group i.e. not corp or internal # Check its a joinable group i.e. not corp or internal
# And the user has permission to manage it # And the user has permission to manage it
if not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group): if not GroupManager.check_internal_group(group) or not GroupManager.can_manage_group(request.user, group):
logger.warning("User %s attempted to remove a user from group %s but permission was denied" % (request.user, logger.warning("User %s attempted to remove a user from group %s but permission was denied" % (request.user, group_id))
group_id))
raise PermissionDenied raise PermissionDenied
try: try:
@ -194,8 +191,7 @@ def group_accept_request(request, group_request_id):
_('Accepted application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) _('Accepted application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group})
except PermissionDenied as p: except PermissionDenied as p:
logger.warning("User %s attempted to accept group join request %s but permission was denied" % logger.warning("User %s attempted to accept group join request %s but permission was denied" % (request.user, group_request_id))
(request.user, group_request_id))
raise p raise p
except: except:
messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group})
@ -221,14 +217,12 @@ def group_reject_request(request, group_request_id):
log = RequestLog(request_type=group_request.leave_request,group=group_request.group,request_info=group_request.__str__(),action=0,request_actor=request.user) log = RequestLog(request_type=group_request.leave_request,group=group_request.group,request_info=group_request.__str__(),action=0,request_actor=request.user)
log.save() log.save()
group_request.delete() group_request.delete()
notify(group_request.user, "Group Application Rejected", level="danger", notify(group_request.user, "Group Application Rejected", level="danger", message="Your application to %s has been rejected." % group_request.group)
message="Your application to %s has been rejected." % group_request.group)
messages.success(request, messages.success(request,
_('Rejected application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) _('Rejected application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group})
except PermissionDenied as p: except PermissionDenied as p:
logger.warning("User %s attempted to reject group join request %s but permission was denied" % logger.warning("User %s attempted to reject group join request %s but permission was denied" % (request.user, group_request_id))
(request.user, group_request_id))
raise p raise p
except: except:
messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group})
@ -262,8 +256,7 @@ def group_leave_accept_request(request, group_request_id):
messages.success(request, messages.success(request,
_('Accepted application from %(mainchar)s to leave %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group}) _('Accepted application from %(mainchar)s to leave %(group)s.') % {"mainchar": group_request.main_char, "group": group_request.group})
except PermissionDenied as p: except PermissionDenied as p:
logger.warning("User %s attempted to accept group leave request %s but permission was denied" % logger.warning("User %s attempted to accept group leave request %s but permission was denied" % (request.user, group_request_id))
(request.user, group_request_id))
raise p raise p
except: except:
messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s.') % { messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s.') % {
@ -291,13 +284,11 @@ def group_leave_reject_request(request, group_request_id):
group_request.delete() group_request.delete()
logger.info("User %s rejected group leave request from user %s for group %s" % ( logger.info("User %s rejected group leave request from user %s for group %s" % (
request.user, group_request.user, group_request.group.name)) request.user, group_request.user, group_request.group.name))
notify(group_request.user, "Group Leave Request Rejected", level="danger", notify(group_request.user, "Group Leave Request Rejected", level="danger", message="Your request to leave %s has been rejected." % group_request.group)
message="Your request to leave %s has been rejected." % group_request.group)
messages.success(request, _('Rejected application from %(mainchar)s to leave %(group)s.') % { messages.success(request, _('Rejected application from %(mainchar)s to leave %(group)s.') % {
"mainchar": group_request.main_char, "group": group_request.group}) "mainchar": group_request.main_char, "group": group_request.group})
except PermissionDenied as p: except PermissionDenied as p:
logger.warning("User %s attempted to reject group leave request %s but permission was denied" % logger.warning("User %s attempted to reject group leave request %s but permission was denied" % (request.user, group_request_id))
(request.user, group_request_id))
raise p raise p
except: except:
messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s.') % { messages.error(request, _('An unhandled error occurred while processing the application from %(mainchar)s to leave %(group)s.') % {
@ -337,20 +328,17 @@ def group_request_add(request, group_id):
group = Group.objects.get(id=group_id) group = Group.objects.get(id=group_id)
state = request.user.profile.state state = request.user.profile.state
if not GroupManager.joinable_group(group, state): if not GroupManager.joinable_group(group, state):
logger.warning("User %s attempted to join group id %s but it is not a joinable group" % logger.warning("User %s attempted to join group id %s but it is not a joinable group" % (request.user, group_id))
(request.user, group_id))
messages.warning(request, _("You cannot join that group")) messages.warning(request, _("You cannot join that group"))
return redirect('groupmanagement:groups') return redirect('groupmanagement:groups')
if group in request.user.groups.all(): if group in request.user.groups.all():
# User is already a member of this group. # User is already a member of this group.
logger.warning("User %s attempted to join group id %s but they are already a member." % logger.warning("User %s attempted to join group id %s but they are already a member." % (request.user, group_id))
(request.user, group_id))
messages.warning(request, _("You are already a member of that group.")) messages.warning(request, _("You are already a member of that group."))
return redirect('groupmanagement:groups') return redirect('groupmanagement:groups')
if not request.user.has_perm('groupmanagement.request_groups') and not group.authgroup.public: if not request.user.has_perm('groupmanagement.request_groups') and not group.authgroup.public:
# Does not have the required permission, trying to join a non-public group # Does not have the required permission, trying to join a non-public group
logger.warning("User %s attempted to join group id %s but it is not a public group" % logger.warning("User %s attempted to join group id %s but it is not a public group" % (request.user, group_id))
(request.user, group_id))
messages.warning(request, _("You cannot join that group")) messages.warning(request, _("You cannot join that group"))
return redirect('groupmanagement:groups') return redirect('groupmanagement:groups')
if group.authgroup.open: if group.authgroup.open:
@ -381,13 +369,11 @@ def group_request_leave(request, group_id):
logger.debug("group_request_leave called by user %s for group id %s" % (request.user, group_id)) logger.debug("group_request_leave called by user %s for group id %s" % (request.user, group_id))
group = Group.objects.get(id=group_id) group = Group.objects.get(id=group_id)
if not GroupManager.check_internal_group(group): if not GroupManager.check_internal_group(group):
logger.warning("User %s attempted to leave group id %s but it is not a joinable group" % logger.warning("User %s attempted to leave group id %s but it is not a joinable group" % (request.user, group_id))
(request.user, group_id))
messages.warning(request, _("You cannot leave that group")) messages.warning(request, _("You cannot leave that group"))
return redirect('groupmanagement:groups') return redirect('groupmanagement:groups')
if group not in request.user.groups.all(): if group not in request.user.groups.all():
logger.debug("User %s attempted to leave group id %s but they are not a member" % logger.debug("User %s attempted to leave group id %s but they are not a member" % (request.user, group_id))
(request.user, group_id))
messages.warning(request, _("You are not a member of that group")) messages.warning(request, _("You are not a member of that group"))
return redirect('groupmanagement:groups') return redirect('groupmanagement:groups')
if group.authgroup.open: if group.authgroup.open:

View File

@ -9,7 +9,8 @@ from .models import Application
class ApplicationsMenu(MenuItemHook): class ApplicationsMenu(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, MenuItemHook.__init__(
self,
_('Applications'), _('Applications'),
'far fa-file fa-fw', 'far fa-file fa-fw',
'hrapplications:index', 'hrapplications:index',

View File

@ -42,14 +42,12 @@
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'hrapplications:personal_view' personal_app.id %}" <a href="{% url 'hrapplications:personal_view' personal_app.id %}" class="btn btn-primary">
class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span> <span class="glyphicon glyphicon-eye-open"></span>
</a> </a>
{% if personal_app.approved == None %} {% if personal_app.approved == None %}
<a href="{% url 'hrapplications:personal_removal' personal_app.id %}" <a href="{% url 'hrapplications:personal_removal' personal_app.id %}" class="btn btn-danger">
class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span> <span class="glyphicon glyphicon-remove"></span>
</a> </a>
{% endif %} {% endif %}
@ -105,8 +103,7 @@
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'hrapplications:view' app.id %}" <a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary">
class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span> <span class="glyphicon glyphicon-eye-open"></span>
</a> </a>
</td> </td>
@ -150,13 +147,11 @@
{% endif %} {% endif %}
</td> </td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'hrapplications:view' app.id %}" <a href="{% url 'hrapplications:view' app.id %}" class="btn btn-primary">
class="btn btn-primary">
<span class="glyphicon glyphicon-eye-open"></span> <span class="glyphicon glyphicon-eye-open"></span>
</a> </a>
{% if perms.hrapplications.delete_application %} {% if perms.hrapplications.delete_application %}
<a href="{% url 'hrapplications:remove' app.id %}" <a href="{% url 'hrapplications:remove' app.id %}" class="btn btn-danger">
class="btn btn-danger">
<span class="glyphicon glyphicon-remove"></span> <span class="glyphicon glyphicon-remove"></span>
</a> </a>
{% endif %} {% endif %}
@ -175,18 +170,15 @@
{% if perms.auth.human_resources %} {% if perms.auth.human_resources %}
<!-- Modal --> <!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">{% trans "Close" %}</span></button>
class="sr-only">{% trans "Close" %}</span></button>
<h4 class="modal-title" id="myModalLabel">{% trans "Application Search" %}</h4> <h4 class="modal-title" id="myModalLabel">{% trans "Application Search" %}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-signin" role="form" <form class="form-signin" role="form" action={% url 'hrapplications:search' %} method="POST">
action={% url 'hrapplications:search' %} method="POST">
{% csrf_token %} {% csrf_token %}
{{ search_form|bootstrap }} {{ search_form|bootstrap }}
<br/> <br/>

View File

@ -56,18 +56,15 @@
{% if perms.auth.human_resources %} {% if perms.auth.human_resources %}
<!-- Modal --> <!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">{% trans "Close" %}</span></button>
class="sr-only">{% trans "Close" %}</span></button>
<h4 class="modal-title" id="myModalLabel">{% trans "Application Search" %}</h4> <h4 class="modal-title" id="myModalLabel">{% trans "Application Search" %}</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form class="form-signin" role="form" <form class="form-signin" role="form" action={% url 'hrapplications:search' %} method="POST">
action={% url 'hrapplications:search' %} method="POST">
{% csrf_token %} {% csrf_token %}
{{ search_form|bootstrap }} {{ search_form|bootstrap }}
<br/> <br/>

View File

@ -49,8 +49,7 @@
{% for char in app.characters %} {% for char in app.characters %}
<tr> <tr>
<td class="text-center"> <td class="text-center">
<img class="ra-avatar img-responsive img-circle" <img class="ra-avatar img-responsive img-circle" src="{{ char.portrait_url_32 }}">
src="{{ char.portrait_url_32 }}">
</td> </td>
<td class="text-center">{{ char.character_name }}</td> <td class="text-center">{{ char.character_name }}</td>
<td class="text-center">{{ char.corporation_name }}</td> <td class="text-center">{{ char.corporation_name }}</td>
@ -77,25 +76,20 @@
{% if app.approved == None %} {% if app.approved == None %}
{% if app.reviewer == user %} {% if app.reviewer == user %}
{% if perms.hrapplications.approve_application %} {% if perms.hrapplications.approve_application %}
<a href="{% url 'hrapplications:approve' app.id %}" <a href="{% url 'hrapplications:approve' app.id %}" class="btn btn-success">{% trans "Approve" %}</a>
class="btn btn-success">{% trans "Approve" %}</a>
{% endif %} {% endif %}
{% if perms.hrapplications.reject_application %} {% if perms.hrapplications.reject_application %}
<a href="{% url 'hrapplications:reject' app.id %}" <a href="{% url 'hrapplications:reject' app.id %}" class="btn btn-danger">{% trans "Reject" %}</a>
class="btn btn-danger">{% trans "Reject" %}</a>
{% endif %} {% endif %}
{% if perms.hrapplications.delete_application %} {% if perms.hrapplications.delete_application %}
<a href="{% url 'hrapplications:remove' app.id %}" <a href="{% url 'hrapplications:remove' app.id %}" class="btn btn-danger">{% trans "Delete" %}</a>
class="btn btn-danger">{% trans "Delete" %}</a>
{% endif %} {% endif %}
{% elif not app.reviewer %} {% elif not app.reviewer %}
<a href="{% url 'hrapplications:mark_in_progress' app.id %}" <a href="{% url 'hrapplications:mark_in_progress' app.id %}" class="btn btn-warning">{% trans "Mark in Progress" %}</a>
class="btn btn-warning">{% trans "Mark in Progress" %}</a>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if perms.hrapplications.add_applicationcomment %} {% if perms.hrapplications.add_applicationcomment %}
<button type="button" class="btn btn-primary" data-toggle="modal" <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#myModal">{% trans "Comment" %}</button>
data-target="#myModal">{% trans "Comment" %}</button>
{% endif %} {% endif %}
</div> </div>
</div> </div>
@ -104,15 +98,12 @@
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading" role="tab" id="headingThree"> <div class="panel-heading" role="tab" id="headingThree">
<h4 class="panel-title"> <h4 class="panel-title">
<a class="collapsed" data-toggle="collapse" data-parent="#accordion" <a class="collapsed" data-toggle="collapse" data-parent="#accordion" href="#collapseThree" aria-expanded="false" aria-controls="collapseThree">
href="#collapseThree" aria-expanded="false"
aria-controls="collapseThree">
{% trans 'Comments' %} ({{ comments.count }}) {% trans 'Comments' %} ({{ comments.count }})
</a> </a>
</h4> </h4>
</div> </div>
<div id="collapseThree" class="panel-collapse collapse" role="tabpanel" <div id="collapseThree" class="panel-collapse collapse" role="tabpanel" aria-labelledby="headingThree">
aria-labelledby="headingThree">
<div class="panel-body"> <div class="panel-body">
{% for comment in comments %} {% for comment in comments %}
<div class="panel panel-default"> <div class="panel panel-default">
@ -136,8 +127,7 @@
</div> </div>
</div> </div>
{% if perms.hrapplications.add_applicationcomment %} {% if perms.hrapplications.add_applicationcomment %}
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
aria-hidden="true">
<div class="modal-dialog"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">

View File

@ -63,15 +63,13 @@ def hr_application_create_view(request, form_id=None):
application.save() application.save()
for question in app_form.questions.all(): for question in app_form.questions.all():
response = ApplicationResponse(question=question, application=application) response = ApplicationResponse(question=question, application=application)
response.answer = "\n".join(request.POST.getlist(str(question.pk), response.answer = "\n".join(request.POST.getlist(str(question.pk), ""))
""))
response.save() response.save()
logger.info("%s created %s" % (request.user, application)) logger.info("%s created %s" % (request.user, application))
return redirect('hrapplications:personal_view', application.id) return redirect('hrapplications:personal_view', application.id)
else: else:
questions = app_form.questions.all() questions = app_form.questions.all()
return render(request, 'hrapplications/create.html', return render(request, 'hrapplications/create.html', context={'questions': questions, 'corp': app_form.corp})
context={'questions': questions, 'corp': app_form.corp})
else: else:
choices = [] choices = []
for app_form in ApplicationForm.objects.all(): for app_form in ApplicationForm.objects.all():
@ -171,8 +169,7 @@ def hr_application_approve(request, app_id):
logger.info("User %s approving %s" % (request.user, app)) logger.info("User %s approving %s" % (request.user, app))
app.approved = True app.approved = True
app.save() app.save()
notify(app.user, "Application Accepted", message="Your application to %s has been approved." % app.form.corp, notify(app.user, "Application Accepted", message="Your application to %s has been approved." % app.form.corp, level="success")
level="success")
else: else:
logger.warn("User %s not authorized to approve %s" % (request.user, app)) logger.warn("User %s not authorized to approve %s" % (request.user, app))
return redirect('hrapplications:index') return redirect('hrapplications:index')
@ -188,8 +185,7 @@ def hr_application_reject(request, app_id):
logger.info("User %s rejecting %s" % (request.user, app)) logger.info("User %s rejecting %s" % (request.user, app))
app.approved = False app.approved = False
app.save() app.save()
notify(app.user, "Application Rejected", message="Your application to %s has been rejected." % app.form.corp, notify(app.user, "Application Rejected", message="Your application to %s has been rejected." % app.form.corp, level="danger")
level="danger")
else: else:
logger.warn("User %s not authorized to reject %s" % (request.user, app)) logger.warn("User %s not authorized to reject %s" % (request.user, app))
return redirect('hrapplications:index') return redirect('hrapplications:index')
@ -248,8 +244,7 @@ def hr_application_mark_in_progress(request, app_id):
app.reviewer = request.user app.reviewer = request.user
app.reviewer_character = request.user.profile.main_character app.reviewer_character = request.user.profile.main_character
app.save() app.save()
notify(app.user, "Application In Progress", notify(app.user, "Application In Progress", message="Your application to %s is being reviewed by %s" % (app.form.corp, app.reviewer_str))
message="Your application to %s is being reviewed by %s" % (app.form.corp, app.reviewer_str))
else: else:
logger.warn( logger.warn(
"User %s unable to mark %s in progress: already being reviewed by %s" % (request.user, app, app.reviewer)) "User %s unable to mark %s in progress: already being reviewed by %s" % (request.user, app, app.reviewer))

View File

@ -18,10 +18,8 @@
<li><a data-toggle="pill" href="#read">{% trans "Read" %} <b>({{ read|length }})</b></a> <li><a data-toggle="pill" href="#read">{% trans "Read" %} <b>({{ read|length }})</b></a>
</li> </li>
<div class="pull-right"> <div class="pull-right">
<a href="{% url 'notifications:mark_all_read' %}" <a href="{% url 'notifications:mark_all_read' %}" class="btn btn-primary">{% trans "Mark All Read" %}</a>
class="btn btn-primary">{% trans "Mark All Read" %}</a> <a href="{% url 'notifications:delete_all_read' %}" class="btn btn-danger">{% trans "Delete All Read" %}</a>
<a href="{% url 'notifications:delete_all_read' %}"
class="btn btn-danger">{% trans "Delete All Read" %}</a>
</div> </div>
</ul> </ul>
</div> </div>
@ -41,12 +39,10 @@
<td class="text-center">{{ notif.timestamp }}</td> <td class="text-center">{{ notif.timestamp }}</td>
<td class="text-center">{{ notif.title }}</td> <td class="text-center">{{ notif.title }}</td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'notifications:view' notif.id %}" <a href="{% url 'notifications:view' notif.id %}" class="btn btn-success" title="View">
class="btn btn-success" title="View">
<span class="glyphicon glyphicon-eye-open"></span> <span class="glyphicon glyphicon-eye-open"></span>
</a> </a>
<a href="{% url 'notifications:remove' notif.id %}" <a href="{% url 'notifications:remove' notif.id %}" class="btn btn-danger" title="Remove">
class="btn btn-danger" title="Remove">
<span class="glyphicon glyphicon-remove"></span> <span class="glyphicon glyphicon-remove"></span>
</a> </a>
</td> </td>
@ -73,12 +69,10 @@
<td class="text-center">{{ notif.timestamp }}</td> <td class="text-center">{{ notif.timestamp }}</td>
<td class="text-center">{{ notif.title }}</td> <td class="text-center">{{ notif.title }}</td>
<td class="text-center"> <td class="text-center">
<a href="{% url 'notifications:view' notif.id %}" <a href="{% url 'notifications:view' notif.id %}" class="btn btn-success" title="View">
class="btn btn-success" title="View">
<span class="glyphicon glyphicon-eye-open"></span> <span class="glyphicon glyphicon-eye-open"></span>
</a> </a>
<a href="{% url 'notifications:remove' notif.id %}" <a href="{% url 'notifications:remove' notif.id %}" class="btn btn-danger" title="remove">
class="btn btn-danger" title="remove">
<span class="glyphicon glyphicon-remove"></span> <span class="glyphicon glyphicon-remove"></span>
</a> </a>
</td> </td>

View File

@ -6,10 +6,12 @@ from . import urls
class OpTimerboardMenu(MenuItemHook): class OpTimerboardMenu(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, _('Fleet Operations'), MenuItemHook.__init__(
self, _('Fleet Operations'),
'fas fa-exclamation fa-fw', 'fas fa-exclamation fa-fw',
'optimer:view', 'optimer:view',
navactive=['optimer:']) navactive=['optimer:']
)
def render(self, request): def render(self, request):
if request.user.has_perm('auth.optimer_view'): if request.user.has_perm('auth.optimer_view'):

View File

@ -6,12 +6,14 @@ from allianceauth.services.hooks import MenuItemHook, UrlHook
class PermissionsTool(MenuItemHook): class PermissionsTool(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, MenuItemHook.__init__(
self,
'Permissions Audit', 'Permissions Audit',
'fas fa-id-card fa-fw', 'fas fa-id-card fa-fw',
'permissions_tool:overview', 'permissions_tool:overview',
order=400, order=400,
navactive=['permissions_tool:']) navactive=['permissions_tool:']
)
def render(self, request): def render(self, request):
if request.user.has_perm('permissions_tool.audit_permissions'): if request.user.has_perm('permissions_tool.audit_permissions'):

View File

@ -40,8 +40,7 @@ class PermissionsToolViewsTestCase(WebTest):
response_content = response.content.decode('utf-8') response_content = response.content.decode('utf-8')
self.assertInHTML('<li><a class="active" href="/permissions/overview/">' self.assertInHTML('<li><a class="active" href="/permissions/overview/"><i class="fas fa-id-card fa-fw"></i> Permissions Audit</a></li>', response_content)
'<i class="fas fa-id-card fa-fw"></i> Permissions Audit</a></li>', response_content)
def test_permissions_overview(self): def test_permissions_overview(self):
self.app.set_user(self.member) self.app.set_user(self.member)

View File

@ -130,8 +130,10 @@ AUTH_PASSWORD_VALIDATORS = [
}, },
] ]
AUTHENTICATION_BACKENDS = ['allianceauth.authentication.backends.StateBackend', AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend'] 'allianceauth.authentication.backends.StateBackend',
'django.contrib.auth.backends.ModelBackend'
]
# Internationalization # Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/ # https://docs.djangoproject.com/en/1.10/topics/i18n/

View File

@ -72,8 +72,7 @@ class BaseCreatePasswordServiceAccountView(BaseServiceView, ServiceCredentialsVi
messages.error(request, _("That service account already exists")) messages.error(request, _("That service account already exists"))
return redirect(self.index_redirect) return redirect(self.index_redirect)
return render(request, self.template_name, return render(request, self.template_name, context={'credentials': svc_obj.credentials, 'service': self.service_name, 'view': self})
context={'credentials': svc_obj.credentials, 'service': self.service_name, 'view': self})
class ServicesCRUDMixin(SingleObjectMixin): class ServicesCRUDMixin(SingleObjectMixin):
@ -112,5 +111,4 @@ class BaseResetPasswordServiceAccountView(ServicesCRUDMixin, BaseServiceView, Se
def get(self, request): def get(self, request):
svc_obj = self.get_object() svc_obj = self.get_object()
svc_obj.reset_password() svc_obj.reset_password()
return render(request, self.template_name, return render(request, self.template_name, context={'credentials': svc_obj.credentials, 'service': self.service_name, 'view': self})
context={'credentials': svc_obj.credentials, 'service': self.service_name, 'view': self})

View File

@ -7,10 +7,12 @@ from .hooks import ServicesHook
class Services(MenuItemHook): class Services(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, MenuItemHook.__init__(
self,
_('Services'), _('Services'),
'fas fa-cogs fa-fw', 'fas fa-cogs fa-fw',
'services:services', 100) 'services:services', 100
)
def render(self, request): def render(self, request):
for svc in ServicesHook.get_services(): for svc in ServicesHook.get_services():

View File

@ -12,10 +12,8 @@ class FleetFormatterForm(forms.Form):
formup_time = forms.CharField(label=_('Formup Time:'), required=True) formup_time = forms.CharField(label=_('Formup Time:'), required=True)
expected_duration = forms.CharField(label=_('Expected Duration:'), required=True) expected_duration = forms.CharField(label=_('Expected Duration:'), required=True)
purpose = forms.CharField(label=_('Purpose:'), required=True) purpose = forms.CharField(label=_('Purpose:'), required=True)
reimbursable = forms.ChoiceField(label=_('Reimbursable?*'), choices=[(_('Yes'), _('Yes')), (_('No'), _('No'))], reimbursable = forms.ChoiceField(label=_('Reimbursable?*'), choices=[(_('Yes'), _('Yes')), (_('No'), _('No'))], required=True)
required=True) important = forms.ChoiceField(label=_('Important?*'), choices=[(_('Yes'), _('Yes')), (_('No'), _('No'))], required=True)
important = forms.ChoiceField(label=_('Important?*'), choices=[(_('Yes'), _('Yes')), (_('No'), _('No'))],
required=True)
comments = forms.CharField(label=_('Comments'), widget=forms.Textarea, required=False) comments = forms.CharField(label=_('Comments'), widget=forms.Textarea, required=False)

View File

@ -181,8 +181,7 @@ class NameFormatter:
main_char = getattr(self.user.profile, 'main_character', None) main_char = getattr(self.user.profile, 'main_character', None)
format_data = { format_data = {
'character_name': getattr(main_char, 'character_name', 'character_name': getattr(main_char, 'character_name', self.user.username if self._default_to_username else None),
self.user.username if self._default_to_username else None),
'character_id': getattr(main_char, 'character_id', None), 'character_id': getattr(main_char, 'character_id', None),
'corp_ticker': getattr(main_char, 'corporation_ticker', None), 'corp_ticker': getattr(main_char, 'corporation_ticker', None),
'corp_name': getattr(main_char, 'corporation_name', None), 'corp_name': getattr(main_char, 'corporation_name', None),

View File

@ -125,8 +125,7 @@ class DiscourseManager:
@staticmethod @staticmethod
def __suspend_user(username): def __suspend_user(username):
u_id = DiscourseManager.__user_name_to_id(username) u_id = DiscourseManager.__user_name_to_id(username)
return providers.discourse.client.suspend(u_id, DiscourseManager.SUSPEND_DAYS, return providers.discourse.client.suspend(u_id, DiscourseManager.SUSPEND_DAYS, DiscourseManager.SUSPEND_REASON)
DiscourseManager.SUSPEND_REASON)
@staticmethod @staticmethod
def __unsuspend(username): def __unsuspend(username):

View File

@ -33,8 +33,7 @@ def activate_ips4(request):
'username': result[0], 'username': result[0],
'password': result[1], 'password': result[1],
} }
return render(request, 'services/service_credentials.html', return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'IPSuite4'})
context={'credentials': credentials, 'service': 'IPSuite4'})
else: else:
logger.error("Unsuccessful attempt to activate IPS4 for user %s" % request.user) logger.error("Unsuccessful attempt to activate IPS4 for user %s" % request.user)
messages.error(request, _('An error occurred while processing your IPSuite4 account.')) messages.error(request, _('An error occurred while processing your IPSuite4 account.'))
@ -55,8 +54,7 @@ def reset_ips4_password(request):
'username': request.user.ips4.username, 'username': request.user.ips4.username,
'password': result, 'password': result,
} }
return render(request, 'services/service_credentials.html', return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'IPSuite4'})
context={'credentials': credentials, 'service': 'IPSuite4'})
logger.error("Unsuccessful attempt to reset IPS4 password for user %s" % request.user) logger.error("Unsuccessful attempt to reset IPS4 password for user %s" % request.user)
messages.error(request, _('An error occurred while processing your IPSuite4 account.')) messages.error(request, _('An error occurred while processing your IPSuite4 account.'))

View File

@ -25,8 +25,7 @@ class MumbleHooksTestCase(TestCase):
def setUp(self): def setUp(self):
self.member = 'member_user' self.member = 'member_user'
member = AuthUtils.create_member(self.member) member = AuthUtils.create_member(self.member)
AuthUtils.add_main_character(member, 'auth_member', '12345', corp_id='111', corp_name='Test Corporation', AuthUtils.add_main_character(member, 'auth_member', '12345', corp_id='111', corp_name='Test Corporation', corp_ticker='TESTR')
corp_ticker='TESTR')
member = User.objects.get(pk=member.pk) member = User.objects.get(pk=member.pk)
MumbleUser.objects.create(user=member) MumbleUser.objects.create(user=member)
self.none_user = 'none_user' self.none_user = 'none_user'
@ -123,8 +122,7 @@ class MumbleViewsTestCase(TestCase):
self.member = AuthUtils.create_member('auth_member') self.member = AuthUtils.create_member('auth_member')
self.member.email = 'auth_member@example.com' self.member.email = 'auth_member@example.com'
self.member.save() self.member.save()
AuthUtils.add_main_character(self.member, 'auth_member', '12345', corp_id='111', corp_name='Test Corporation', AuthUtils.add_main_character(self.member, 'auth_member', '12345', corp_id='111', corp_name='Test Corporation', corp_ticker='TESTR')
corp_ticker='TESTR')
self.member = User.objects.get(pk=self.member.pk) self.member = User.objects.get(pk=self.member.pk)
add_permissions() add_permissions()

View File

@ -74,10 +74,12 @@ def register_service():
class JabberBroadcast(MenuItemHook): class JabberBroadcast(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, MenuItemHook.__init__(
self,
_('Jabber Broadcast'), _('Jabber Broadcast'),
'fas fa-bullhorn fa-fw', 'fas fa-bullhorn fa-fw',
'openfire:broadcast') 'openfire:broadcast'
)
def render(self, request): def render(self, request):
if request.user.has_perm('auth.jabber_broadcast') or request.user.has_perm('auth.jabber_broadcast_all'): if request.user.has_perm('auth.jabber_broadcast') or request.user.has_perm('auth.jabber_broadcast_all'):
@ -87,10 +89,12 @@ class JabberBroadcast(MenuItemHook):
class FleetBroadcastFormatter(MenuItemHook): class FleetBroadcastFormatter(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, MenuItemHook.__init__(
self,
_('Fleet Broadcast Formatter'), _('Fleet Broadcast Formatter'),
'fas fa-space-shuttle fa-fw', 'fas fa-space-shuttle fa-fw',
'services:fleet_format_tool') 'services:fleet_format_tool'
)
def render(self, request): def render(self, request):
if request.user.has_perm('auth.jabber_broadcast') or request.user.has_perm('auth.jabber_broadcast_all'): if request.user.has_perm('auth.jabber_broadcast') or request.user.has_perm('auth.jabber_broadcast_all'):

View File

@ -16,8 +16,7 @@
{% if success %} {% if success %}
<div class="alert alert-success" role="alert">{% trans "Broadcast Sent!!" %}</div> <div class="alert alert-success" role="alert">{% trans "Broadcast Sent!!" %}</div>
{% endif %} {% endif %}
<form class="form-signin" role="form" action="" method="POST" <form class="form-signin" role="form" action="" method="POST" onsubmit="submitbutton.disabled = true; return true;">
onsubmit="submitbutton.disabled = true; return true;">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }} {{ form|bootstrap }}
<br/> <br/>

View File

@ -37,8 +37,7 @@ def activate_jabber(request):
'username': info[0], 'username': info[0],
'password': info[1], 'password': info[1],
} }
return render(request, 'services/service_credentials.html', return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'Jabber'})
context={'credentials': credentials, 'service': 'Jabber'})
else: else:
logger.error("Unsuccessful attempt to activate jabber for user %s" % request.user) logger.error("Unsuccessful attempt to activate jabber for user %s" % request.user)
messages.error(request, _('An error occurred while processing your jabber account.')) messages.error(request, _('An error occurred while processing your jabber account.'))
@ -72,8 +71,7 @@ def reset_jabber_password(request):
'username': request.user.openfire.username, 'username': request.user.openfire.username,
'password': result, 'password': result,
} }
return render(request, 'services/service_credentials.html', return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'Jabber'})
context={'credentials': credentials, 'service': 'Jabber'})
logger.error("Unsuccessful attempt to reset jabber for user %s" % request.user) logger.error("Unsuccessful attempt to reset jabber for user %s" % request.user)
messages.error(request, _('An error occurred while processing your jabber account.')) messages.error(request, _('An error occurred while processing your jabber account.'))
return redirect("services:services") return redirect("services:services")
@ -100,16 +98,14 @@ def jabber_broadcast_view(request):
logger.debug("Processing jabber broadcast for user %s with main character %s" % (request.user, main_char)) logger.debug("Processing jabber broadcast for user %s with main character %s" % (request.user, main_char))
try: try:
if main_char is not None: if main_char is not None:
message_to_send = form.cleaned_data[ message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \
'message'] + "\n##### SENT BY: " + "[" + main_char.corporation_ticker + "]" + \
main_char.character_name + " TO: " + \ main_char.character_name + " TO: " + \
form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime( form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime(
"%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n" "%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n"
group_to_send = form.cleaned_data['group'] group_to_send = form.cleaned_data['group']
else: else:
message_to_send = form.cleaned_data[ message_to_send = form.cleaned_data['message'] + "\n##### SENT BY: " + "No character but can send pings?" + " TO: " + \
'message'] + "\n##### SENT BY: " + "No character but can send pings?" + " TO: " + \
form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime( form.cleaned_data['group'] + " WHEN: " + datetime.datetime.utcnow().strftime(
"%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n" "%Y-%m-%d %H:%M:%S") + " #####\n##### Replies are NOT monitored #####\n"
group_to_send = form.cleaned_data['group'] group_to_send = form.cleaned_data['group']

View File

@ -36,8 +36,7 @@ def activate_forum(request):
'username': result[0], 'username': result[0],
'password': result[1], 'password': result[1],
} }
return render(request, 'services/service_credentials.html', return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'Forum'})
context={'credentials': credentials, 'service': 'Forum'})
else: else:
logger.error("Unsuccessful attempt to activate forum for user %s" % request.user) logger.error("Unsuccessful attempt to activate forum for user %s" % request.user)
messages.error(request, _('An error occurred while processing your forum account.')) messages.error(request, _('An error occurred while processing your forum account.'))
@ -73,8 +72,7 @@ def reset_forum_password(request):
'username': request.user.phpbb3.username, 'username': request.user.phpbb3.username,
'password': result, 'password': result,
} }
return render(request, 'services/service_credentials.html', return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'Forum'})
context={'credentials': credentials, 'service': 'Forum'})
logger.error("Unsuccessful attempt to reset forum password for user %s" % request.user) logger.error("Unsuccessful attempt to reset forum password for user %s" % request.user)
messages.error(request, _('An error occurred while processing your forum account.')) messages.error(request, _('An error occurred while processing your forum account.'))

View File

@ -23,8 +23,7 @@ def activate_smf(request):
# Valid now we get the main characters # Valid now we get the main characters
character = request.user.profile.main_character character = request.user.profile.main_character
logger.debug("Adding smf user for user %s with main character %s" % (request.user, character)) logger.debug("Adding smf user for user %s with main character %s" % (request.user, character))
result = SmfManager.add_user(SmfTasks.get_username(request.user), request.user.email, ['Member'], result = SmfManager.add_user(SmfTasks.get_username(request.user), request.user.email, ['Member'], character.character_id)
character.character_id)
# if empty we failed # if empty we failed
if result[0] != "": if result[0] != "":
SmfUser.objects.update_or_create(user=request.user, defaults={'username': result[0]}) SmfUser.objects.update_or_create(user=request.user, defaults={'username': result[0]})
@ -36,8 +35,7 @@ def activate_smf(request):
'username': result[0], 'username': result[0],
'password': result[1], 'password': result[1],
} }
return render(request, 'services/service_credentials.html', return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'SMF'})
context={'credentials': credentials, 'service': 'SMF'})
else: 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.')) messages.error(request, _('An error occurred while processing your SMF account.'))
@ -74,8 +72,7 @@ def reset_smf_password(request):
'username': request.user.smf.username, 'username': request.user.smf.username,
'password': result, 'password': result,
} }
return render(request, 'services/service_credentials.html', return render(request, 'services/service_credentials.html', context={'credentials': credentials, 'service': 'SMF'})
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.')) messages.error(request, _('An error occurred while processing your SMF account.'))
return redirect("services:services") return redirect("services:services")
@ -93,8 +90,7 @@ def set_smf_password(request):
if form.is_valid() and SmfTasks.has_account(request.user) and character is not None: if form.is_valid() and SmfTasks.has_account(request.user) and character is not None:
password = form.cleaned_data['password'] password = form.cleaned_data['password']
logger.debug("Form contains password of length %s" % len(password)) logger.debug("Form contains password of length %s" % len(password))
result = SmfManager.update_user_password(request.user.smf.username, character.character_id, result = SmfManager.update_user_password(request.user.smf.username, character.character_id, password=password)
password=password)
if result != "": 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.')) messages.success(request, _('Set SMF password.'))

View File

@ -11,7 +11,8 @@ class ConnectionError:
return 'Error connecting to host %s port %s' % (self.ip, self.port) return 'Error connecting to host %s port %s' % (self.ip, self.port)
ts3_escape = {'/': r"\/", ts3_escape = {
'/': r"\/",
' ': r'\s', ' ': r'\s',
'|': r'\p', '|': r'\p',
"\a": r'\a', "\a": r'\a',
@ -20,7 +21,8 @@ ts3_escape = {'/': r"\/",
"\n": r'\n', "\n": r'\n',
"\r": r'\r', "\r": r'\r',
"\t": r'\t', "\t": r'\t',
"\v": r'\v'} "\v": r'\v'
}
class TS3Proto: class TS3Proto:

View File

@ -55,8 +55,7 @@ def verify_teamspeak3(request):
form = TeamspeakJoinForm(initial={'username': request.user.teamspeak3.uid}) form = TeamspeakJoinForm(initial={'username': request.user.teamspeak3.uid})
context = { context = {
'form': form, 'form': form,
'authinfo': {'teamspeak3_uid': request.user.teamspeak3.uid, 'authinfo': {'teamspeak3_uid': request.user.teamspeak3.uid, 'teamspeak3_perm_key': request.user.teamspeak3.perm_key},
'teamspeak3_perm_key': request.user.teamspeak3.perm_key},
'public_url': settings.TEAMSPEAK3_PUBLIC_URL, 'public_url': settings.TEAMSPEAK3_PUBLIC_URL,
} }
return render(request, 'services/teamspeak3/teamspeakjoin.html', context=context) return render(request, 'services/teamspeak3/teamspeakjoin.html', context=context)

View File

@ -75,8 +75,7 @@ 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("Permissions changed for group {} on " logger.debug("Permissions changed for group {} on service {}, re-validating services for groups users".format(instance, svc))
"service {}, re-validating services for groups users".format(instance, svc))
def validate_all_groups_users_for_service(): def validate_all_groups_users_for_service():
logger.debug("Performing validation for service {}".format(svc)) logger.debug("Performing validation for service {}".format(svc))
@ -108,8 +107,7 @@ def m2m_changed_state_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("Permissions changed for state {} on " logger.debug("Permissions changed for state {} on service {}, re-validating services for state users".format(instance, svc))
"service {}, re-validating services for state users".format(instance, svc))
def validate_all_state_users_for_service(): def validate_all_state_users_for_service():
logger.debug("Performing validation for service {}".format(svc)) logger.debug("Performing validation for service {}".format(svc))

View File

@ -11,8 +11,7 @@
<div class="container-fluid"> <div class="container-fluid">
<div class="col-md-4 col-md-offset-4"> <div class="col-md-4 col-md-offset-4">
<div class="row"> <div class="row">
<form class="form-signin" role="form" action="" method="POST" <form class="form-signin" role="form" action="" method="POST" onsubmit="submitbutton.disabled = true; return true;">
onsubmit="submitbutton.disabled = true; return true;">
{% csrf_token %} {% csrf_token %}
{{ form|bootstrap }} {{ form|bootstrap }}
<br/> <br/>

View File

@ -9,10 +9,12 @@ from .managers import SRPManager
class SrpMenu(MenuItemHook): class SrpMenu(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, _('Ship Replacement'), MenuItemHook.__init__(
self, _('Ship Replacement'),
'far fa-money-bill-alt fa-fw', 'far fa-money-bill-alt fa-fw',
'srp:management', 'srp:management',
navactive=['srp:']) navactive=['srp:']
)
def render(self, request): def render(self, request):
if request.user.has_perm('srp.access_srp'): if request.user.has_perm('srp.access_srp'):

View File

@ -193,8 +193,7 @@ def srp_request_view(request, fleet_srp):
request.user, srp_request.killboard_link)) request.user, srp_request.killboard_link))
# THIS SHOULD BE IN FORM VALIDATION # THIS SHOULD BE IN FORM VALIDATION
messages.error(request, messages.error(request,
_( _("Your SRP request Killmail link is invalid. Please make sure you are using zKillboard."))
"Your SRP request Killmail link is invalid. Please make sure you are using zKillboard."))
return redirect("srp:management") return redirect("srp:management")
if request.user.character_ownerships.filter(character__character_id=str(victim_id)).exists(): if request.user.character_ownerships.filter(character__character_id=str(victim_id)).exists():
@ -209,8 +208,7 @@ def srp_request_view(request, fleet_srp):
return redirect("srp:management") return redirect("srp:management")
else: else:
messages.error(request, messages.error(request,
_( _("Character %(charid)s does not belong to your Auth account. Please add the API key for this character and try again")
"Character %(charid)s does not belong to your Auth account. Please add the API key for this character and try again")
% {"charid": victim_id}) % {"charid": victim_id})
return redirect("srp:management") return redirect("srp:management")
else: else:

View File

@ -6,8 +6,7 @@
<div class="collapse navbar-collapse auth-menus-collapse auth-side-navbar-collapse"> <div class="collapse navbar-collapse auth-menus-collapse auth-side-navbar-collapse">
<ul class="nav nav-pills nav-stacked gray-icon-color" id="side-menu"> <ul class="nav nav-pills nav-stacked gray-icon-color" id="side-menu">
<li> <li>
<a class="{% navactive request 'authentication:dashboard' %}" <a class="{% navactive request 'authentication:dashboard' %}" href="{% url 'authentication:dashboard' %}">
href="{% url 'authentication:dashboard' %}">
<i class="fas fa-tachometer-alt fa-fw"></i> {% trans "Dashboard" %} <i class="fas fa-tachometer-alt fa-fw"></i> {% trans "Dashboard" %}
</a> </a>
</li> </li>
@ -18,7 +17,6 @@
</li> </li>
{% menu_items %} {% menu_items %}
</ul> </ul>
</div> </div>
</div> </div>

View File

@ -34,15 +34,13 @@ class NavhelperTemplateTagTests(TestCase):
def test_navactive(self): def test_navactive(self):
self._navactive_common('active', '') self._navactive_common('active', '')
with self.settings(NAVHELPER_ACTIVE_CLASS='my-active-class', with self.settings(NAVHELPER_ACTIVE_CLASS='my-active-class', NAVHELPER_NOT_ACTIVE_CLASS='my-not-active-class'):
NAVHELPER_NOT_ACTIVE_CLASS='my-not-active-class'):
self._navactive_common('my-active-class', 'my-not-active-class') self._navactive_common('my-active-class', 'my-not-active-class')
def test_renavactive(self): def test_renavactive(self):
self._renavactive_common('active', '') self._renavactive_common('active', '')
with self.settings(NAVHELPER_ACTIVE_CLASS='my-active-class', with self.settings(NAVHELPER_ACTIVE_CLASS='my-active-class', NAVHELPER_NOT_ACTIVE_CLASS='my-not-active-class'):
NAVHELPER_NOT_ACTIVE_CLASS='my-not-active-class'):
self._renavactive_common('my-active-class', 'my-not-active-class') self._renavactive_common('my-active-class', 'my-not-active-class')
def _navactive_common(self, active, not_active): def _navactive_common(self, active, not_active):

View File

@ -6,10 +6,12 @@ from . import urls
class TimerboardMenu(MenuItemHook): class TimerboardMenu(MenuItemHook):
def __init__(self): def __init__(self):
MenuItemHook.__init__(self, 'Structure Timers', MenuItemHook.__init__(
self, 'Structure Timers',
'far fa-clock fa-fw', 'far fa-clock fa-fw',
'timerboard:view', 'timerboard:view',
navactive=['timerboard:']) navactive=['timerboard:']
)
def render(self, request): def render(self, request):
if request.user.has_perm('auth.timer_view'): if request.user.has_perm('auth.timer_view'):

View File

@ -71,8 +71,7 @@ class AddTimerView(TimerManagementView, AddUpdateMixin, CreateView):
result = super(AddTimerView, self).form_valid(form) result = super(AddTimerView, self).form_valid(form)
timer = self.object timer = self.object
logger.info("Created new timer in {} at {} by user {}".format(timer.system, timer.eve_time, self.request.user)) logger.info("Created new timer in {} at {} by user {}".format(timer.system, timer.eve_time, self.request.user))
messages.success(self.request, _('Added new timer in %(system)s at %(time)s.') % {"system": timer.system, messages.success(self.request, _('Added new timer in %(system)s at %(time)s.') % {"system": timer.system, "time": timer.eve_time})
"time": timer.eve_time})
return result return result

View File

@ -142,8 +142,7 @@ latex_elements = {
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
(master_doc, 'AllianceAuth.tex', u'Alliance Auth Documentation', (master_doc, 'AllianceAuth.tex', u'Alliance Auth Documentation', u'R4stl1n', 'manual'),
u'R4stl1n', 'manual'),
] ]

View File

@ -1,8 +1,8 @@
# Alliance Auth documentation # Alliance Auth documentation
The documentation for Alliance Auth uses [Sphinx](http://www.sphinx-doc.org/) to build documentation. When a new commit The documentation for Alliance Auth uses [Sphinx](http://www.sphinx-doc.org/) to build documentation. When a new commit
to specific branches is made (master, primarily), the repository is automatically pulled, docs built and deployed on to specific branches is made (master, primarily), the repository is automatically pulled, docs built and deployed on
[readthedocs.org](https://readthedocs.org/). [readthedocs.org](https://readthedocs.org/).
Documentation was migrated from the GitHub wiki pages and into the repository to allow documentation changes to be Documentation was migrated from the GitHub wiki pages and into the repository to allow documentation changes to be

View File

@ -1,6 +1,6 @@
# Openfire # Openfire
Openfire is a Jabber (XMPP) server. Openfire is a Jabber (XMPP) server.
## Prepare Your Settings ## Prepare Your Settings

View File

@ -11,8 +11,8 @@ SMF requires PHP installed in your web server. Apache has `mod_php`, NGINX requi
## Prepare Your Settings ## Prepare Your Settings
In your auth project's settings file, do the following: In your auth project's settings file, do the following:
- Add `'allianceauth.services.modules.smf',` to your `INSTALLED_APPS` list - Add `'allianceauth.services.modules.smf',` to your `INSTALLED_APPS` list
- Append the following to the bottom of the settings file: - Append the following to the bottom of the settings file:
```python ```python
# SMF Configuration # SMF Configuration
@ -36,15 +36,19 @@ Using your browser, you can download the latest version of SMF to your desktop c
Download using wget, replacing the URL with the URL for the package you just retrieved Download using wget, replacing the URL with the URL for the package you just retrieved
wget https://download.simplemachines.org/index.php?thanks;filename=smf_2-0-15_install.zip ```shell
wget https://download.simplemachines.org/index.php?thanks;filename=smf_2-0-15_install.zip
```
This needs to be unpackaged. Unzip it, replacing the file name with that of the file you just downloaded This needs to be unpackaged. Unzip it, replacing the file name with that of the file you just downloaded
```shell
unzip smf_2-0-15_install.zip unzip smf_2-0-15_install.zip
````
Now we need to move this to our web directory. Usually `/var/www/forums`. Now we need to move this to our web directory. Usually `/var/www/forums`.
```shell
mv smf /var/www/forums mv smf /var/www/forums
````
The web server needs read/write permission to this folder The web server needs read/write permission to this folder
@ -60,11 +64,15 @@ Nginx: `chown -R nginx:nginx /var/www/forums`
### Database Preparation ### Database Preparation
SMF needs a database. Create one: SMF needs a database. Create one:
```shell
mysql -u root -p
```
mysql -u root -p ```mysql
create database alliance_smf; create database alliance_smf;
grant all privileges on alliance_smf . * to 'allianceserver'@'localhost'; grant all privileges on alliance_smf . * to 'allianceserver'@'localhost';
exit; exit;
```
Enter the database information into the `DATABASES['smf']` section of your auth project's settings file. Enter the database information into the `DATABASES['smf']` section of your auth project's settings file.
@ -73,18 +81,19 @@ Enter the database information into the `DATABASES['smf']` section of your auth
Your web server needs to be configured to serve SMF. Your web server needs to be configured to serve SMF.
A minimal Apache config might look like: A minimal Apache config might look like:
```apache
<VirtualHost *:80> <VirtualHost *:80>
ServerName forums.example.com ServerName forums.example.com
DocumentRoot /var/www/forums DocumentRoot /var/www/forums
<Directory "/var/www/forums"> <Directory "/var/www/forums">
DirectoryIndex index.php DirectoryIndex index.php
</Directory> </Directory>
</VirtualHost> </VirtualHost>
````
A minimal Nginx config might look like: A minimal Nginx config might look like:
```nginx
server { server {
listen 80; listen 80;
server_name forums.example.com; server_name forums.example.com;
root /var/www/forums; root /var/www/forums;
@ -98,8 +107,8 @@ A minimal Nginx config might look like:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; include fastcgi_params;
} }
} }
````
Enter the web address to your forums into the `SMF_URL` setting in your auth project's settings file. Enter the web address to your forums into the `SMF_URL` setting in your auth project's settings file.
### Web Install ### Web Install