From b47392ba7f6d4a8787b8d4d174d1944683c963bc Mon Sep 17 00:00:00 2001 From: Peter Pfeufer Date: Mon, 17 May 2021 09:49:33 +0200 Subject: [PATCH] check for LF as line ending --- .pre-commit-config.yaml | 2 + allianceauth/services/modules/smf/manager.py | 540 +++++++++---------- allianceauth/timerboard/form.py | 186 +++---- docs/make.bat | 72 +-- 4 files changed, 401 insertions(+), 399 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 24b13efe..e76da4fa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,3 +16,5 @@ repos: exclude: \.(min\.css|min\.js|po|mo)$ - id: end-of-file-fixer exclude: \.(min\.css|min\.js|po|mo)$ + - id: mixed-line-ending + args: [ '--fix=lf' ] diff --git a/allianceauth/services/modules/smf/manager.py b/allianceauth/services/modules/smf/manager.py index b8c3e919..fdd859eb 100644 --- a/allianceauth/services/modules/smf/manager.py +++ b/allianceauth/services/modules/smf/manager.py @@ -1,270 +1,270 @@ -import random -import string -import calendar -from datetime import datetime -import hashlib -import logging -import re - -from django.db import connections -from django.conf import settings -from allianceauth.eveonline.models import EveCharacter - -logger = logging.getLogger(__name__) - - -TABLE_PREFIX = getattr(settings, 'SMF_TABLE_PREFIX', 'smf_') - - -class SmfManager: - def __init__(self): - pass - - SQL_ADD_USER = r"INSERT INTO %smembers (member_name, passwd, email_address, date_registered, real_name," \ - r" buddy_list, message_labels, openid_uri, signature, ignore_boards) " \ - r"VALUES (%%s, %%s, %%s, %%s, %%s, 0, 0, 0, 0, 0)" % TABLE_PREFIX - - SQL_DEL_USER = r"DELETE FROM %smembers where member_name = %%s" % TABLE_PREFIX - - SQL_DIS_USER = r"UPDATE %smembers SET email_address = %%s, passwd = %%s WHERE member_name = %%s" % TABLE_PREFIX - - SQL_USER_ID_FROM_USERNAME = r"SELECT id_member from %smembers WHERE member_name = %%s" % TABLE_PREFIX - - SQL_ADD_USER_GROUP = r"UPDATE %smembers SET additional_groups = %%s WHERE id_member = %%s" % TABLE_PREFIX - - SQL_GET_GROUP_ID = r"SELECT id_group from %smembergroups WHERE group_name = %%s" % TABLE_PREFIX - - SQL_ADD_GROUP = r"INSERT INTO %smembergroups (group_name,description) VALUES (%%s,%%s)" % TABLE_PREFIX - - SQL_UPDATE_USER_PASSWORD = r"UPDATE %smembers SET passwd = %%s WHERE member_name = %%s" % TABLE_PREFIX - - SQL_REMOVE_USER_GROUP = r"UPDATE %smembers SET additional_groups = %%s WHERE id_member = %%s" % TABLE_PREFIX - - SQL_GET_ALL_GROUPS = r"SELECT id_group, group_name FROM %smembergroups" % TABLE_PREFIX - - SQL_GET_USER_GROUPS = r"SELECT additional_groups FROM %smembers WHERE id_member = %%s" % TABLE_PREFIX - - SQL_ADD_USER_AVATAR = r"UPDATE %smembers SET avatar = %%s WHERE id_member = %%s" % TABLE_PREFIX - - @staticmethod - def _sanitize_groupname(name): - name = name.strip(' _') - return re.sub('[^\w.-]', '', name) - - @staticmethod - def generate_random_pass(): - return ''.join([random.choice(string.ascii_letters + string.digits) for n in range(16)]) - - @staticmethod - def gen_hash(username_clean, passwd): - return hashlib.sha1((username_clean + passwd).encode('utf-8')).hexdigest() - - @staticmethod - def santatize_username(username): - sanatized = username.replace(" ", "_") - sanatized = sanatized.replace("'", "_") - return sanatized.lower() - - @staticmethod - def get_current_utc_date(): - d = datetime.utcnow() - unixtime = calendar.timegm(d.utctimetuple()) - return unixtime - - @classmethod - def create_group(cls, groupname): - logger.debug("Creating smf group %s" % groupname) - cursor = connections['smf'].cursor() - cursor.execute(cls.SQL_ADD_GROUP, [groupname, groupname]) - logger.info("Created smf group %s" % groupname) - return cls.get_group_id(groupname) - - @classmethod - def get_group_id(cls, groupname): - logger.debug("Getting smf group id for groupname %s" % groupname) - cursor = connections['smf'].cursor() - cursor.execute(cls.SQL_GET_GROUP_ID, [groupname]) - row = cursor.fetchone() - logger.debug("Got smf group id %s for groupname %s" % (row[0], groupname)) - return row[0] - - @classmethod - def check_user(cls, username): - logger.debug("Checking smf username %s" % username) - cursor = connections['smf'].cursor() - cursor.execute(cls.SQL_USER_ID_FROM_USERNAME, [cls.santatize_username(username)]) - row = cursor.fetchone() - if row: - logger.debug("Found user %s on smf" % username) - return True - logger.debug("User %s not found on smf" % username) - return False - - @classmethod - def add_avatar(cls, member_name, characterid): - logger.debug("Adding EVE character id %s portrait as smf avatar for user %s" % (characterid, member_name)) - avatar_url = EveCharacter.generic_portrait_url(characterid, 64) - cursor = connections['smf'].cursor() - id_member = cls.get_user_id(member_name) - cursor.execute(cls.SQL_ADD_USER_AVATAR, [avatar_url, id_member]) - - @classmethod - def get_user_id(cls, username): - logger.debug("Getting smf user id for username %s" % username) - cursor = connections['smf'].cursor() - cursor.execute(cls.SQL_USER_ID_FROM_USERNAME, [username]) - row = cursor.fetchone() - if row is not None: - logger.debug("Got smf user id %s for username %s" % (row[0], username)) - return row[0] - else: - logger.error("username %s not found on smf. Unable to determine user id ." % username) - return None - - @classmethod - def get_all_groups(cls): - logger.debug("Getting all smf groups.") - cursor = connections['smf'].cursor() - cursor.execute(cls.SQL_GET_ALL_GROUPS) - rows = cursor.fetchall() - out = {} - for row in rows: - out[row[1]] = row[0] - logger.debug("Got smf groups %s" % out) - return out - - @classmethod - def get_user_groups(cls, userid): - logger.debug("Getting smf user id %s groups" % userid) - cursor = connections['smf'].cursor() - cursor.execute(cls.SQL_GET_USER_GROUPS, [userid]) - out = [row[0] for row in cursor.fetchall()] - logger.debug("Got user %s smf groups %s" % (userid, out)) - return out - - @classmethod - def add_user(cls, username, email_address, groups, characterid): - logger.debug("Adding smf user with member_name %s, email_address %s, characterid %s" % ( - username, email_address, characterid)) - cursor = connections['smf'].cursor() - username_clean = cls.santatize_username(username) - passwd = cls.generate_random_pass() - pwhash = cls.gen_hash(username_clean, passwd) - logger.debug("Proceeding to add smf user %s and pwhash starting with %s" % (username, pwhash[0:5])) - register_date = cls.get_current_utc_date() - # check if the username was simply revoked - if cls.check_user(username) is True: - logger.warn("Unable to add smf user with username %s - already exists. Updating user instead." % username) - cls.__update_user_info(username_clean, email_address, pwhash) - else: - try: - cursor.execute(cls.SQL_ADD_USER, - [username_clean, passwd, email_address, register_date, username_clean]) - cls.add_avatar(username_clean, characterid) - logger.info("Added smf member_name %s" % username_clean) - cls.update_groups(username_clean, groups) - except: - logger.warn("Unable to add smf user %s" % username_clean) - pass - return username_clean, passwd - - @classmethod - def __update_user_info(cls, username, email_address, passwd): - logger.debug( - "Updating smf user %s info: username %s password of length %s" % (username, email_address, len(passwd))) - cursor = connections['smf'].cursor() - try: - cursor.execute(cls.SQL_DIS_USER, [email_address, passwd, username]) - logger.info("Updated smf user %s info" % username) - except: - logger.exception("Unable to update smf user %s info." % username) - pass - - @classmethod - def delete_user(cls, username): - logger.debug("Deleting smf user %s" % username) - cursor = connections['smf'].cursor() - - if cls.check_user(username): - cursor.execute(cls.SQL_DEL_USER, [username]) - logger.info("Deleted smf user %s" % username) - return True - logger.error("Unable to delete smf user %s - user not found on smf." % username) - return False - - @classmethod - def update_groups(cls, username, groups): - userid = cls.get_user_id(username) - logger.debug("Updating smf user %s with id %s groups %s" % (username, userid, groups)) - if userid is not None: - forum_groups = cls.get_all_groups() - user_groups = set(cls.get_user_groups(userid)) - act_groups = set([cls._sanitize_groupname(g) for g in groups]) - addgroups = act_groups - user_groups - remgroups = user_groups - act_groups - logger.info("Updating smf user %s groups - adding %s, removing %s" % (username, addgroups, remgroups)) - act_group_id = set() - for g in addgroups: - if g not in forum_groups: - forum_groups[g] = cls.create_group(g) - act_group_id.add(str(cls.get_group_id(g))) - string_groups = ','.join(act_group_id) - cls.add_user_to_group(userid, string_groups) - - @classmethod - def add_user_to_group(cls, userid, groupid): - logger.debug("Adding smf user id %s to group id %s" % (userid, groupid)) - try: - cursor = connections['smf'].cursor() - cursor.execute(cls.SQL_ADD_USER_GROUP, [groupid, userid]) - logger.info("Added smf user id %s to group id %s" % (userid, groupid)) - except: - logger.exception("Unable to add smf user id %s to group id %s" % (userid, groupid)) - pass - - @classmethod - def remove_user_from_group(cls, userid, groupid): - logger.debug("Removing smf user id %s from group id %s" % (userid, groupid)) - try: - cursor = connections['smf'].cursor() - cursor.execute(cls.SQL_REMOVE_USER_GROUP, [groupid, userid]) - logger.info("Removed smf user id %s from group id %s" % (userid, groupid)) - except: - logger.exception("Unable to remove smf user id %s from group id %s" % (userid, groupid)) - pass - - @classmethod - def disable_user(cls, username): - logger.debug("Disabling smf user %s" % username) - cursor = connections['smf'].cursor() - - password = cls.generate_random_pass() - revoke_email = "revoked@localhost" - try: - pwhash = cls.gen_hash(username, password) - cursor.execute(cls.SQL_DIS_USER, [revoke_email, pwhash, username]) - cls.get_user_id(username) - cls.update_groups(username, []) - logger.info("Disabled smf user %s" % username) - return True - except TypeError: - logger.exception("TypeError occured while disabling user %s - failed to disable." % username) - return False - - @classmethod - def update_user_password(cls, username, characterid, password=None): - logger.debug("Updating smf user %s password" % username) - cursor = connections['smf'].cursor() - if not password: - password = cls.generate_random_pass() - if cls.check_user(username): - username_clean = cls.santatize_username(username) - pwhash = cls.gen_hash(username_clean, password) - logger.debug( - "Proceeding to update smf user %s password with pwhash starting with %s" % (username, pwhash[0:5])) - cursor.execute(cls.SQL_UPDATE_USER_PASSWORD, [pwhash, username]) - cls.add_avatar(username, characterid) - logger.info("Updated smf user %s password." % username) - return password - logger.error("Unable to update smf user %s password - user not found on smf." % username) - return "" +import random +import string +import calendar +from datetime import datetime +import hashlib +import logging +import re + +from django.db import connections +from django.conf import settings +from allianceauth.eveonline.models import EveCharacter + +logger = logging.getLogger(__name__) + + +TABLE_PREFIX = getattr(settings, 'SMF_TABLE_PREFIX', 'smf_') + + +class SmfManager: + def __init__(self): + pass + + SQL_ADD_USER = r"INSERT INTO %smembers (member_name, passwd, email_address, date_registered, real_name," \ + r" buddy_list, message_labels, openid_uri, signature, ignore_boards) " \ + r"VALUES (%%s, %%s, %%s, %%s, %%s, 0, 0, 0, 0, 0)" % TABLE_PREFIX + + SQL_DEL_USER = r"DELETE FROM %smembers where member_name = %%s" % TABLE_PREFIX + + SQL_DIS_USER = r"UPDATE %smembers SET email_address = %%s, passwd = %%s WHERE member_name = %%s" % TABLE_PREFIX + + SQL_USER_ID_FROM_USERNAME = r"SELECT id_member from %smembers WHERE member_name = %%s" % TABLE_PREFIX + + SQL_ADD_USER_GROUP = r"UPDATE %smembers SET additional_groups = %%s WHERE id_member = %%s" % TABLE_PREFIX + + SQL_GET_GROUP_ID = r"SELECT id_group from %smembergroups WHERE group_name = %%s" % TABLE_PREFIX + + SQL_ADD_GROUP = r"INSERT INTO %smembergroups (group_name,description) VALUES (%%s,%%s)" % TABLE_PREFIX + + SQL_UPDATE_USER_PASSWORD = r"UPDATE %smembers SET passwd = %%s WHERE member_name = %%s" % TABLE_PREFIX + + SQL_REMOVE_USER_GROUP = r"UPDATE %smembers SET additional_groups = %%s WHERE id_member = %%s" % TABLE_PREFIX + + SQL_GET_ALL_GROUPS = r"SELECT id_group, group_name FROM %smembergroups" % TABLE_PREFIX + + SQL_GET_USER_GROUPS = r"SELECT additional_groups FROM %smembers WHERE id_member = %%s" % TABLE_PREFIX + + SQL_ADD_USER_AVATAR = r"UPDATE %smembers SET avatar = %%s WHERE id_member = %%s" % TABLE_PREFIX + + @staticmethod + def _sanitize_groupname(name): + name = name.strip(' _') + return re.sub('[^\w.-]', '', name) + + @staticmethod + def generate_random_pass(): + return ''.join([random.choice(string.ascii_letters + string.digits) for n in range(16)]) + + @staticmethod + def gen_hash(username_clean, passwd): + return hashlib.sha1((username_clean + passwd).encode('utf-8')).hexdigest() + + @staticmethod + def santatize_username(username): + sanatized = username.replace(" ", "_") + sanatized = sanatized.replace("'", "_") + return sanatized.lower() + + @staticmethod + def get_current_utc_date(): + d = datetime.utcnow() + unixtime = calendar.timegm(d.utctimetuple()) + return unixtime + + @classmethod + def create_group(cls, groupname): + logger.debug("Creating smf group %s" % groupname) + cursor = connections['smf'].cursor() + cursor.execute(cls.SQL_ADD_GROUP, [groupname, groupname]) + logger.info("Created smf group %s" % groupname) + return cls.get_group_id(groupname) + + @classmethod + def get_group_id(cls, groupname): + logger.debug("Getting smf group id for groupname %s" % groupname) + cursor = connections['smf'].cursor() + cursor.execute(cls.SQL_GET_GROUP_ID, [groupname]) + row = cursor.fetchone() + logger.debug("Got smf group id %s for groupname %s" % (row[0], groupname)) + return row[0] + + @classmethod + def check_user(cls, username): + logger.debug("Checking smf username %s" % username) + cursor = connections['smf'].cursor() + cursor.execute(cls.SQL_USER_ID_FROM_USERNAME, [cls.santatize_username(username)]) + row = cursor.fetchone() + if row: + logger.debug("Found user %s on smf" % username) + return True + logger.debug("User %s not found on smf" % username) + return False + + @classmethod + def add_avatar(cls, member_name, characterid): + logger.debug("Adding EVE character id %s portrait as smf avatar for user %s" % (characterid, member_name)) + avatar_url = EveCharacter.generic_portrait_url(characterid, 64) + cursor = connections['smf'].cursor() + id_member = cls.get_user_id(member_name) + cursor.execute(cls.SQL_ADD_USER_AVATAR, [avatar_url, id_member]) + + @classmethod + def get_user_id(cls, username): + logger.debug("Getting smf user id for username %s" % username) + cursor = connections['smf'].cursor() + cursor.execute(cls.SQL_USER_ID_FROM_USERNAME, [username]) + row = cursor.fetchone() + if row is not None: + logger.debug("Got smf user id %s for username %s" % (row[0], username)) + return row[0] + else: + logger.error("username %s not found on smf. Unable to determine user id ." % username) + return None + + @classmethod + def get_all_groups(cls): + logger.debug("Getting all smf groups.") + cursor = connections['smf'].cursor() + cursor.execute(cls.SQL_GET_ALL_GROUPS) + rows = cursor.fetchall() + out = {} + for row in rows: + out[row[1]] = row[0] + logger.debug("Got smf groups %s" % out) + return out + + @classmethod + def get_user_groups(cls, userid): + logger.debug("Getting smf user id %s groups" % userid) + cursor = connections['smf'].cursor() + cursor.execute(cls.SQL_GET_USER_GROUPS, [userid]) + out = [row[0] for row in cursor.fetchall()] + logger.debug("Got user %s smf groups %s" % (userid, out)) + return out + + @classmethod + def add_user(cls, username, email_address, groups, characterid): + logger.debug("Adding smf user with member_name %s, email_address %s, characterid %s" % ( + username, email_address, characterid)) + cursor = connections['smf'].cursor() + username_clean = cls.santatize_username(username) + passwd = cls.generate_random_pass() + pwhash = cls.gen_hash(username_clean, passwd) + logger.debug("Proceeding to add smf user %s and pwhash starting with %s" % (username, pwhash[0:5])) + register_date = cls.get_current_utc_date() + # check if the username was simply revoked + if cls.check_user(username) is True: + logger.warn("Unable to add smf user with username %s - already exists. Updating user instead." % username) + cls.__update_user_info(username_clean, email_address, pwhash) + else: + try: + cursor.execute(cls.SQL_ADD_USER, + [username_clean, passwd, email_address, register_date, username_clean]) + cls.add_avatar(username_clean, characterid) + logger.info("Added smf member_name %s" % username_clean) + cls.update_groups(username_clean, groups) + except: + logger.warn("Unable to add smf user %s" % username_clean) + pass + return username_clean, passwd + + @classmethod + def __update_user_info(cls, username, email_address, passwd): + logger.debug( + "Updating smf user %s info: username %s password of length %s" % (username, email_address, len(passwd))) + cursor = connections['smf'].cursor() + try: + cursor.execute(cls.SQL_DIS_USER, [email_address, passwd, username]) + logger.info("Updated smf user %s info" % username) + except: + logger.exception("Unable to update smf user %s info." % username) + pass + + @classmethod + def delete_user(cls, username): + logger.debug("Deleting smf user %s" % username) + cursor = connections['smf'].cursor() + + if cls.check_user(username): + cursor.execute(cls.SQL_DEL_USER, [username]) + logger.info("Deleted smf user %s" % username) + return True + logger.error("Unable to delete smf user %s - user not found on smf." % username) + return False + + @classmethod + def update_groups(cls, username, groups): + userid = cls.get_user_id(username) + logger.debug("Updating smf user %s with id %s groups %s" % (username, userid, groups)) + if userid is not None: + forum_groups = cls.get_all_groups() + user_groups = set(cls.get_user_groups(userid)) + act_groups = set([cls._sanitize_groupname(g) for g in groups]) + addgroups = act_groups - user_groups + remgroups = user_groups - act_groups + logger.info("Updating smf user %s groups - adding %s, removing %s" % (username, addgroups, remgroups)) + act_group_id = set() + for g in addgroups: + if g not in forum_groups: + forum_groups[g] = cls.create_group(g) + act_group_id.add(str(cls.get_group_id(g))) + string_groups = ','.join(act_group_id) + cls.add_user_to_group(userid, string_groups) + + @classmethod + def add_user_to_group(cls, userid, groupid): + logger.debug("Adding smf user id %s to group id %s" % (userid, groupid)) + try: + cursor = connections['smf'].cursor() + cursor.execute(cls.SQL_ADD_USER_GROUP, [groupid, userid]) + logger.info("Added smf user id %s to group id %s" % (userid, groupid)) + except: + logger.exception("Unable to add smf user id %s to group id %s" % (userid, groupid)) + pass + + @classmethod + def remove_user_from_group(cls, userid, groupid): + logger.debug("Removing smf user id %s from group id %s" % (userid, groupid)) + try: + cursor = connections['smf'].cursor() + cursor.execute(cls.SQL_REMOVE_USER_GROUP, [groupid, userid]) + logger.info("Removed smf user id %s from group id %s" % (userid, groupid)) + except: + logger.exception("Unable to remove smf user id %s from group id %s" % (userid, groupid)) + pass + + @classmethod + def disable_user(cls, username): + logger.debug("Disabling smf user %s" % username) + cursor = connections['smf'].cursor() + + password = cls.generate_random_pass() + revoke_email = "revoked@localhost" + try: + pwhash = cls.gen_hash(username, password) + cursor.execute(cls.SQL_DIS_USER, [revoke_email, pwhash, username]) + cls.get_user_id(username) + cls.update_groups(username, []) + logger.info("Disabled smf user %s" % username) + return True + except TypeError: + logger.exception("TypeError occured while disabling user %s - failed to disable." % username) + return False + + @classmethod + def update_user_password(cls, username, characterid, password=None): + logger.debug("Updating smf user %s password" % username) + cursor = connections['smf'].cursor() + if not password: + password = cls.generate_random_pass() + if cls.check_user(username): + username_clean = cls.santatize_username(username) + pwhash = cls.gen_hash(username_clean, password) + logger.debug( + "Proceeding to update smf user %s password with pwhash starting with %s" % (username, pwhash[0:5])) + cursor.execute(cls.SQL_UPDATE_USER_PASSWORD, [pwhash, username]) + cls.add_avatar(username, characterid) + logger.info("Updated smf user %s password." % username) + return password + logger.error("Unable to update smf user %s password - user not found on smf." % username) + return "" diff --git a/allianceauth/timerboard/form.py b/allianceauth/timerboard/form.py index 3969b9b4..0442e6da 100755 --- a/allianceauth/timerboard/form.py +++ b/allianceauth/timerboard/form.py @@ -1,93 +1,93 @@ -import logging -import datetime -from django import forms -from django.utils import timezone -from django.core.validators import MaxValueValidator, MinValueValidator -from django.utils.translation import ugettext_lazy as _ - -from .models import Timer - -logger = logging.getLogger(__name__) - - -class TimerForm(forms.ModelForm): - class Meta: - model = Timer - fields = ('details', 'system', 'planet_moon', 'structure', 'objective', 'important', 'corp_timer') - - def __init__(self, *args, **kwargs): - self.user = kwargs.pop('user', None) - if 'instance' in kwargs and kwargs['instance'] is not None: - # Do conversion from db datetime to days/hours/minutes - # for appropriate fields - current_time = timezone.now() - td = kwargs['instance'].eve_time - current_time - initial = kwargs.pop('initial', dict()) - if 'days_left' not in initial: - initial.update({'days_left': td.days}) - if 'hours_left' not in initial: - initial.update({'hours_left': td.seconds // 3600}) - if 'minutes_left' not in initial: - initial.update({'minutes_left': td.seconds // 60 % 60}) - kwargs.update({'initial': initial}) - super(TimerForm, self).__init__(*args, **kwargs) - - structure_choices = [('POCO', 'POCO'), - ('I-HUB', 'I-HUB'), - ('TCU', 'TCU'), - ('POS[S]', 'POS[S]'), - ('POS[M]', 'POS[M]'), - ('POS[L]', 'POS[L]'), - ('Astrahus', 'Astrahus'), - ('Fortizar', 'Fortizar'), - ('Keepstar', 'Keepstar'), - ('Raitaru', 'Raitaru'), - ('Azbel', 'Azbel'), - ('Sotiyo', 'Sotiyo'), - ('Athanor', 'Athanor'), - ('Tatara', 'Tatara'), - ('Pharolux Cyno Beacon', 'Pharolux Cyno Beacon'), - ('Tenebrex Cyno Jammer', 'Tenebrex Cyno Jammer'), - ('Ansiblex Jump Gate', 'Ansiblex Jump Gate'), - ('Moon Mining Cycle', 'Moon Mining Cycle'), - (_('Other'), _('Other'))] - objective_choices = [('Friendly', _('Friendly')), - ('Hostile', _('Hostile')), - ('Neutral', _('Neutral'))] - - details = forms.CharField(max_length=254, required=True, label=_('Details')) - system = forms.CharField(max_length=254, required=True, label=_("System")) - planet_moon = forms.CharField(max_length=254, label=_("Planet/Moon"), required=False, initial="") - structure = forms.ChoiceField(choices=structure_choices, required=True, label=_("Structure Type")) - objective = forms.ChoiceField(choices=objective_choices, required=True, label=_("Objective")) - days_left = forms.IntegerField(required=True, label=_("Days Remaining"), validators=[MinValueValidator(0)]) - hours_left = forms.IntegerField(required=True, label=_("Hours Remaining"), - validators=[MinValueValidator(0), MaxValueValidator(23)]) - minutes_left = forms.IntegerField(required=True, label=_("Minutes Remaining"), - validators=[MinValueValidator(0), MaxValueValidator(59)]) - important = forms.BooleanField(label=_("Important"), required=False) - corp_timer = forms.BooleanField(label=_("Corp-Restricted"), required=False) - - def save(self, commit=True): - timer = super(TimerForm, self).save(commit=False) - - # Get character - character = self.user.profile.main_character - corporation = character.corporation - logger.debug("Determined timer save request on behalf " - "of character {} corporation {}".format(character, corporation)) - # calculate future time - future_time = datetime.timedelta(days=self.cleaned_data['days_left'], hours=self.cleaned_data['hours_left'], - minutes=self.cleaned_data['minutes_left']) - current_time = timezone.now() - eve_time = current_time + future_time - logger.debug( - "Determined timer eve time is %s - current time %s, adding %s" % (eve_time, current_time, future_time)) - - timer.eve_time = eve_time - timer.eve_character = character - timer.eve_corp = corporation - timer.user = self.user - if commit: - timer.save() - return timer +import logging +import datetime +from django import forms +from django.utils import timezone +from django.core.validators import MaxValueValidator, MinValueValidator +from django.utils.translation import ugettext_lazy as _ + +from .models import Timer + +logger = logging.getLogger(__name__) + + +class TimerForm(forms.ModelForm): + class Meta: + model = Timer + fields = ('details', 'system', 'planet_moon', 'structure', 'objective', 'important', 'corp_timer') + + def __init__(self, *args, **kwargs): + self.user = kwargs.pop('user', None) + if 'instance' in kwargs and kwargs['instance'] is not None: + # Do conversion from db datetime to days/hours/minutes + # for appropriate fields + current_time = timezone.now() + td = kwargs['instance'].eve_time - current_time + initial = kwargs.pop('initial', dict()) + if 'days_left' not in initial: + initial.update({'days_left': td.days}) + if 'hours_left' not in initial: + initial.update({'hours_left': td.seconds // 3600}) + if 'minutes_left' not in initial: + initial.update({'minutes_left': td.seconds // 60 % 60}) + kwargs.update({'initial': initial}) + super(TimerForm, self).__init__(*args, **kwargs) + + structure_choices = [('POCO', 'POCO'), + ('I-HUB', 'I-HUB'), + ('TCU', 'TCU'), + ('POS[S]', 'POS[S]'), + ('POS[M]', 'POS[M]'), + ('POS[L]', 'POS[L]'), + ('Astrahus', 'Astrahus'), + ('Fortizar', 'Fortizar'), + ('Keepstar', 'Keepstar'), + ('Raitaru', 'Raitaru'), + ('Azbel', 'Azbel'), + ('Sotiyo', 'Sotiyo'), + ('Athanor', 'Athanor'), + ('Tatara', 'Tatara'), + ('Pharolux Cyno Beacon', 'Pharolux Cyno Beacon'), + ('Tenebrex Cyno Jammer', 'Tenebrex Cyno Jammer'), + ('Ansiblex Jump Gate', 'Ansiblex Jump Gate'), + ('Moon Mining Cycle', 'Moon Mining Cycle'), + (_('Other'), _('Other'))] + objective_choices = [('Friendly', _('Friendly')), + ('Hostile', _('Hostile')), + ('Neutral', _('Neutral'))] + + details = forms.CharField(max_length=254, required=True, label=_('Details')) + system = forms.CharField(max_length=254, required=True, label=_("System")) + planet_moon = forms.CharField(max_length=254, label=_("Planet/Moon"), required=False, initial="") + structure = forms.ChoiceField(choices=structure_choices, required=True, label=_("Structure Type")) + objective = forms.ChoiceField(choices=objective_choices, required=True, label=_("Objective")) + days_left = forms.IntegerField(required=True, label=_("Days Remaining"), validators=[MinValueValidator(0)]) + hours_left = forms.IntegerField(required=True, label=_("Hours Remaining"), + validators=[MinValueValidator(0), MaxValueValidator(23)]) + minutes_left = forms.IntegerField(required=True, label=_("Minutes Remaining"), + validators=[MinValueValidator(0), MaxValueValidator(59)]) + important = forms.BooleanField(label=_("Important"), required=False) + corp_timer = forms.BooleanField(label=_("Corp-Restricted"), required=False) + + def save(self, commit=True): + timer = super(TimerForm, self).save(commit=False) + + # Get character + character = self.user.profile.main_character + corporation = character.corporation + logger.debug("Determined timer save request on behalf " + "of character {} corporation {}".format(character, corporation)) + # calculate future time + future_time = datetime.timedelta(days=self.cleaned_data['days_left'], hours=self.cleaned_data['hours_left'], + minutes=self.cleaned_data['minutes_left']) + current_time = timezone.now() + eve_time = current_time + future_time + logger.debug( + "Determined timer eve time is %s - current time %s, adding %s" % (eve_time, current_time, future_time)) + + timer.eve_time = eve_time + timer.eve_character = character + timer.eve_corp = corporation + timer.user = self.user + if commit: + timer.save() + return timer diff --git a/docs/make.bat b/docs/make.bat index 50c46f7a..dc9b6ef8 100644 --- a/docs/make.bat +++ b/docs/make.bat @@ -1,36 +1,36 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=AllianceAuth - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build +set SPHINXPROJ=AllianceAuth + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% + +:end +popd