diff --git a/alliance_auth/settings.py.example b/alliance_auth/settings.py.example deleted file mode 100755 index 4c6de4c6..00000000 --- a/alliance_auth/settings.py.example +++ /dev/null @@ -1,498 +0,0 @@ -""" -vim: set filetype=python: -Django settings for alliance_auth project. - -For more information on this file, see -https://docs.djangoproject.com/en/1.6/topics/settings/ - -For the full list of settings and their values, see -https://docs.djangoproject.com/en/1.6/ref/settings/ - -""" - -# Build paths inside the project like this: os.path.join(BASE_DIR, ...) -import os - -import djcelery - -djcelery.setup_loader() -BASE_DIR = os.path.dirname(os.path.dirname(__file__)) - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/1.6/howto/deployment/checklist/ - -# SECURITY WARNING: keep the secret key used in production secret! -# Generate a new key here: http://www.miniwebtool.com/django-secret-key-generator/ -SECRET_KEY = os.environ.get('AA_SECRET_KEY', '5xvh4e0x&@-$6(kj%4^80pdo1n5v-!mtx(e(1tw@kn-1le*ts@') - -# SECURITY WARNING: don't run with debug turned on in production! -DEBUG = 'True' == os.environ.get('AA_DEBUG','True') - -TEMPLATE_DEBUG = True - -ALLOWED_HOSTS = ['127.0.0.1','yourdomain.com','www.yourdomain.com'] - -BROKER_URL = 'amqp://guest:guest@localhost:5672/' - -CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler" - -# Application definition -INSTALLED_APPS = ( - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'django.contrib.humanize', - 'django_evolution', - 'djcelery', - 'celerytask', - 'bootstrapform', - 'authentication', - 'portal', - 'registration', - 'services', - 'eveonline', - 'groupmanagement', - 'hrapplications', - 'timerboard', - 'srp', - 'sigtracker', - 'optimer', - 'corputils', - 'notifications', -) - -MIDDLEWARE_CLASSES = ( - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', -) - -ROOT_URLCONF = 'alliance_auth.urls' - -WSGI_APPLICATION = 'alliance_auth.wsgi.application' - -# Database -# https://docs.djangoproject.com/en/1.6/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'alliance_auth', - 'USER': os.environ.get('AA_DB_DEFAULT_USER', 'allianceserver'), - 'PASSWORD': os.environ.get('AA_DB_DEFAULT_PASSWORD', 'password'), - 'HOST': os.environ.get('AA_DB_DEFAULT_HOST', '127.0.0.1'), - 'PORT': os.environ.get('AA_DB_DEFAULT_PORT', '3306'), - }, - - 'phpbb3': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'alliance_forum', - 'USER': os.environ.get('AA_DB_PHPBB3_USER', 'allianceserver'), - 'PASSWORD': os.environ.get('AA_DB_PHPBB3_PASSWORD', 'password'), - 'HOST': os.environ.get('AA_DB_PHPBB3_HOST', '127.0.0.1'), - 'PORT': os.environ.get('AA_DB_PHPBB3_PORT', '3306'), - }, - - 'ips4': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': 'alliance_ips4', - 'USER': os.environ.get('AA_DB_IPS4_USER', 'allianceserver'), - 'PASSWORD': os.environ.get('AA_DB_IPS4_PASSWORD', 'password'), - 'HOST': os.environ.get('AA_DB_IPS4_HOST', '127.0.0.1'), - 'PORT': os.environ.get('AA_DB_IPS4_PORT', '3306'), - } - -} - -TEMPLATE_CONTEXT_PROCESSORS = ( - 'django.contrib.auth.context_processors.auth', - 'django.core.context_processors.debug', - 'django.core.context_processors.i18n', - 'django.core.context_processors.media', - 'django.core.context_processors.static', - 'django.core.context_processors.tz', - 'django.contrib.messages.context_processors.messages', - 'django.core.context_processors.request', - 'util.context_processors.is_corp', - 'util.context_processors.corp_id', - 'util.context_processors.corp_name', - 'util.context_processors.alliance_id', - 'util.context_processors.alliance_name', - 'util.context_processors.jabber_url', - 'util.context_processors.domain_url', - 'util.context_processors.member_api_mask', - 'util.context_processors.blue_api_mask', - 'notifications.context_processors.user_notification_count', -) - -TEMPLATE_DIRS = ( - os.path.join(BASE_DIR, 'customization/templates'), - os.path.join(BASE_DIR, 'stock/templates'), -) - -STATICFILES_DIRS = ( - os.path.join(BASE_DIR, "customization/static"), - os.path.join(BASE_DIR, "stock/static"), -) - -LOGIN_URL = '/login_user/' - -# Internationalization -# https://docs.djangoproject.com/en/1.6/topics/i18n/ - -LANGUAGE_CODE = os.environ.get('AA_LANGUAGE_CODE', 'en-us') - -TIME_ZONE = os.environ.get('AA_TIME_ZONE', 'UTC') - -USE_I18N = True - -USE_L10N = True - -USE_TZ = True - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/1.6/howto/static-files/ -STATIC_URL = '/static/' -STATIC_ROOT = '/home/allianceserver/allianceauth/static/' - -# Cache directory for EveWho, no ending / -# by default this becomes ~//alliance_auth/cache -# This directory needs to be writable by the webserver -EVEWHO_CACHE_DIR = '{}/cache'.format(BASE_DIR) - - -##################################################### -## -## Auth configuration starts here -## -##################################################### - -########################### -# ALLIANCE / CORP TOGGLE -########################### -# Specifies to run membership checks against corp or alliance -# Set to FALSE for alliance -# Set to TRUE for corp -########################### -IS_CORP = 'True' == os.environ.get('AA_IS_CORP', 'True') - - -################# -# EMAIL SETTINGS -################# -# DOMAIN - The alliance auth domain_url -# EMAIL_HOST - SMTP Server URL -# EMAIL_PORT - SMTP Server PORT -# EMAIL_HOST_USER - Email Username (for gmail, the entire address) -# EMAIL_HOST_PASSWORD - Email Password -# EMAIL_USE_TLS - Set to use TLS encryption -################# -DOMAIN = os.environ.get('AA_DOMAIN', 'https://yourdomain.com') -EMAIL_HOST = os.environ.get('AA_EMAIL_HOST', 'smtp.gmail.com') -EMAIL_PORT = int(os.environ.get('AA_EMAIL_PORT', '587')) -EMAIL_HOST_USER = os.environ.get('AA_EMAIL_HOST_USER', '') -EMAIL_HOST_PASSWORD = os.environ.get('AA_EMAIL_HOST_PASSWORD', '') -EMAIL_USE_TLS = 'True' == os.environ.get('AA_EMAIL_USE_TLS', 'True') - -#################### -# Front Page Links -#################### -# KILLBOARD_URL - URL for your killboard. Blank to hide link -# MEDIA_URL - URL for your media page (youtube etc). Blank to hide link -# FORUM_URL - URL for your forums. Blank to hide link -#################### -KILLBOARD_URL = os.environ.get('AA_KILLBOARD_URL', '') -EXTERNAL_MEDIA_URL = os.environ.get('AA_EXTERNAL_MEDIA_URL', '') -FORUM_URL = os.environ.get('AA_FORUM_URL', '') - -######################### -# Default Group Settings -######################### -# DEFAULT_AUTH_GROUP - Default group members are put in -# DEFAULT_BLUE_GROUP - Default group for blue members -# MEMBER_CORP_GROUPS - Assign members to a group representing their main corp -# BLUE_CORP_GROUPS - Assign blues to a group representing their main corp -######################### -DEFAULT_AUTH_GROUP = os.environ.get('AA_DEFAULT_ALLIANCE_GROUP', 'Member') -DEFAULT_BLUE_GROUP = os.environ.get('AA_DEFAULT_BLUE_GROUP', 'Blue') -MEMBER_CORP_GROUPS = 'True' == os.environ.get('AA_MEMBER_CORP_GROUPS', 'True') -MEMBER_ALLIANCE_GROUPS = 'True' == os.environ.get('AA_MEMBER_ALLIANCE_GROUPS', 'False') -BLUE_CORP_GROUPS = 'True' == os.environ.get('AA_BLUE_CORP_GROUPS', 'False') -BLUE_ALLIANCE_GROUPS = 'True' == os.environ.get('AA_BLUE_ALLIANCE_GROUPS', 'False') - -######################### -# Alliance Service Setup -######################### -# ENABLE_AUTH_FORUM - Enable forum support in the auth for auth'd members -# ENABLE_AUTH_JABBER - Enable jabber support in the auth for auth'd members -# ENABLE_AUTH_MUMBLE - Enable mumble support in the auth for auth'd members -# ENABLE_AUTH_IPBOARD - Enable IPBoard forum support in the auth for auth'd members -# ENABLE_AUTH_DISCORD - Enable Discord support in the auth for auth'd members -# ENABLE_AUTH_IPS4 - Enable IPS4 support in the auth for auth'd members -######################### -ENABLE_AUTH_FORUM = 'True' == os.environ.get('AA_ENABLE_AUTH_FORUM', 'False') -ENABLE_AUTH_JABBER = 'True' == os.environ.get('AA_ENABLE_AUTH_JABBER', 'False') -ENABLE_AUTH_MUMBLE = 'True' == os.environ.get('AA_ENABLE_AUTH_MUMBLE', 'False') -ENABLE_AUTH_IPBOARD = 'True' == os.environ.get('AA_ENABLE_AUTH_IPBOARD', 'False') -ENABLE_AUTH_TEAMSPEAK3 = 'True' == os.environ.get('AA_ENABLE_AUTH_TEAMSPEAK3', 'False') -ENABLE_AUTH_DISCORD = 'True' == os.environ.get('AA_ENABLE_AUTH_DISCORD', 'False') -ENABLE_AUTH_IPS4 = 'True' == os.environ.get('AA_ENABLE_AUTH_IPS4', 'False') - -##################### -# Blue service Setup -##################### -# BLUE_STANDING - The default lowest standings setting to consider blue -# ENABLE_BLUE_FORUM - Enable forum support in the auth for blues -# ENABLE_BLUE_JABBER - Enable jabber support in the auth for blues -# ENABLE_BLUE_MUMBLE - Enable mumble support in the auth for blues -# ENABLE_BLUE_IPBOARD - Enable IPBoard forum support in the auth for blues -# ENABLE_BLUE_DISCORD - Enable Discord support in the auth for blues -# ENABLE_BLUE_IPS4 - Enable IPS4 support in the auth for blues -##################### -BLUE_STANDING = float(os.environ.get('AA_BLUE_STANDING', '5.0')) -ENABLE_BLUE_FORUM = 'True' == os.environ.get('AA_ENABLE_BLUE_FORUM', 'False') -ENABLE_BLUE_JABBER = 'True' == os.environ.get('AA_ENABLE_BLUE_JABBER', 'False') -ENABLE_BLUE_MUMBLE = 'True' == os.environ.get('AA_ENABLE_BLUE_MUMBLE', 'False') -ENABLE_BLUE_IPBOARD = 'True' == os.environ.get('AA_ENABLE_BLUE_IPBOARD', 'False') -ENABLE_BLUE_TEAMSPEAK3 = 'True' == os.environ.get('AA_ENABLE_BLUE_TEAMSPEAK3', 'False') -ENABLE_BLUE_DISCORD = 'True' == os.environ.get('AA_ENABLE_BLUE_DISCORD', 'False') -ENABLE_BLUE_IPS4 = 'True' == os.environ.get('AA_ENABLE_BLUE_IPS4', 'False') - -######################### -# Corp Configuration -######################### -# If running in alliance mode, the following should be for the executor corp# -# CORP_ID - Set this to your corp ID (get this from https://zkillboard.com/corporation/#######) -# CORP_NAME - Set this to your Corporation Name -# CORP_API_ID - Set this to the api id for the corp API key -# CORP_API_VCODE - Set this to the api vcode for the corp API key -######################## -CORP_ID = os.environ.get('AA_CORP_ID', '') -CORP_NAME = os.environ.get('AA_CORP_NAME', '') -CORP_API_ID = os.environ.get('AA_CORP_API_ID', '') -CORP_API_VCODE = os.environ.get('AA_CORP_API_VCODE', '') - -######################### -# Alliance Configuration -######################### -# ALLIANCE_ID - Set this to your Alliance ID (get this from https://zkillboard.com/alliance/#######) -# ALLIANCE_NAME - Set this to your Alliance Name -######################## -ALLIANCE_ID = os.environ.get('AA_ALLIANCE_ID', '') -ALLIANCE_NAME = os.environ.get('AA_ALLIANCE_NAME', '') - -######################## -# API Configuration -######################## -# MEMBER_API_MASK - Numeric value of minimum API mask required for members -# MEMBER_API_ACCOUNT - Require API to be for Account and not character restricted -# BLUE_API_MASK - Numeric value of minimum API mask required for blues -# BLUE_API_ACCOUNT - Require API to be for Account and not character restricted -####################### -MEMBER_API_MASK = os.environ.get('AA_MEMBER_API_MASK', 268435455) -MEMBER_API_ACCOUNT = 'True' == os.environ.get('AA_MEMBER_API_ACCOUNT', 'True') -BLUE_API_MASK = os.environ.get('AA_BLUE_API_MASK', 8388608) -BLUE_API_ACCOUNT = 'True' == os.environ.get('AA_BLUE_API_ACCOUNT', 'False') - -##################### -# HR Configuration -##################### -# JACK_KNIFE_URL - Url for the audit page of API Jack knife -# Should seriously replace with your own. -##################### -JACK_KNIFE_URL = os.environ.get('AA_JACK_KNIFE_URL', 'http://ridetheclown.com/eveapi/audit.php') - -##################### -# Forum Configuration -##################### -# IPBOARD_ENDPOINT - Api endpoint if using ipboard -# IPBOARD_APIKEY - Api key to interact with ipboard -# IPBOARD_APIMODULE - Module for alliance auth *leave alone* -##################### -IPBOARD_ENDPOINT = os.environ.get('AA_IPBOARD_ENDPOINT', 'yourdomain.com/interface/board/index.php') -IPBOARD_APIKEY = os.environ.get('AA_IPBOARD_APIKEY', 'somekeyhere') -IPBOARD_APIMODULE = 'aa' - -###################### -# Jabber Configuration -###################### -# JABBER_URL - Jabber address url -# JABBER_PORT - Jabber service portal -# JABBER_SERVER - Jabber server url -# OPENFIRE_ADDRESS - Address of the openfire admin console including port -# Please use http with 9090 or https with 9091 -# OPENFIRE_SECRET_KEY - Openfire REST API secret key -# BROADCAST_USER - Broadcast user JID -# BROADCAST_USER_PASSWORD - Broadcast user password -###################### -JABBER_URL = os.environ.get('AA_JABBER_URL', "yourdomain.com") -JABBER_PORT = int(os.environ.get('AA_JABBER_PORT', '5223')) -JABBER_SERVER = os.environ.get('AA_JABBER_SERVER', "yourdomain.com") -OPENFIRE_ADDRESS = os.environ.get('AA_OPENFIRE_ADDRESS', "http://yourdomain.com:9090") -OPENFIRE_SECRET_KEY = os.environ.get('AA_OPENFIRE_SECRET_KEY', "somekey") -BROADCAST_USER = os.environ.get('AA_BROADCAST_USER', "broadcast@") + JABBER_URL -BROADCAST_USER_PASSWORD = os.environ.get('AA_BROADCAST_USER_PASSWORD', "somepassword") -BROADCAST_SERVICE_NAME = os.environ.get('AA_BROADCAST_SERVICE_NAME', "broadcast") - -###################################### -# Mumble Configuration -###################################### -# MUMBLE_URL - Mumble server url -# MUMBLE_SERVER_ID - Mumble server id -###################################### -MUMBLE_URL = os.environ.get('AA_MUMBLE_URL', "yourdomain.com") -MUMBLE_SERVER_ID = int(os.environ.get('AA_MUMBLE_SERVER_ID', '1')) - -###################################### -# Teamspeak3 Configuration -###################################### -# TEAMSPEAK3_SERVER_IP - Teamspeak3 server ip -# TEAMSPEAK3_SERVER_PORT - Teamspeak3 server port -# TEAMSPEAK3_SERVERQUERY_USER - Teamspeak3 serverquery username -# TEAMSPEAK3_SERVERQUERY_PASSWORD - Teamspeak3 serverquery password -# TEAMSPEAK3_VIRTUAL_SERVER - Virtual server id -# TEAMSPEAK3_AUTHED_GROUP_ID - Default authed group id -# TEAMSPEAK3_PUBLIC_URL - teamspeak3 public url used for link creation -###################################### -TEAMSPEAK3_SERVER_IP = os.environ.get('AA_TEAMSPEAK3_SERVER_IP', '127.0.0.1') -TEAMSPEAK3_SERVER_PORT = int(os.environ.get('AA_TEAMSPEAK3_SERVER_PORT', '10011')) -TEAMSPEAK3_SERVERQUERY_USER = os.environ.get('AA_TEAMSPEAK3_SERVERQUERY_USER', 'serveradmin') -TEAMSPEAK3_SERVERQUERY_PASSWORD = os.environ.get('AA_TEAMSPEAK3_SERVERQUERY_PASSWORD', 'passwordhere') -TEAMSPEAK3_VIRTUAL_SERVER = int(os.environ.get('AA_TEAMSPEAK3_VIRTUAL_SERVER', '1')) -TEAMSPEAK3_PUBLIC_URL = os.environ.get('AA_TEAMSPEAK3_PUBLIC_URL', 'yourdomain.com') - -###################################### -# Discord Configuration -###################################### -# DISCORD_SERVER_ID - ID of the server to manage -# DISCORD_USER_EMAIL - email of the server management user -# DISCORD_USER_PASSWORD - password of the server management user -###################################### -DISCORD_SERVER_ID = os.environ.get('AA_DISCORD_SERVER_ID', '') -DISCORD_USER_EMAIL = os.environ.get('AA_DISCORD_USER_EMAIL', '') -DISCORD_USER_PASSWORD = os.environ.get('AA_DISCORD_USER_PASSWORD', '') - -##################################### -# IPS4 Configuration -##################################### -# IPS4_URL - base url of the IPS4 install (no trailing slash) -# IPS4_API_KEY - API key provided by IPS4 -##################################### -IPS4_URL = os.environ.get('AA_IPS4_URL', 'http://yourdomain.com/ips4') -IPS4_API_KEY = os.environ.get('AA_IPS4_API_KEY', '') - -##################################### -# Logging Configuration -##################################### -# Set log_file and console level to desired state: -# DEBUG - basically stack trace, explains every step -# INFO - model creation, deletion, updates, etc -# WARN - unexpected function outcomes that do not impact user -# ERROR - unexcpeted function outcomes which prevent user from achieving desired outcome -# EXCEPTION - something critical went wrong, unhandled -##################################### -# Recommended level for log_file is INFO, console is DEBUG -# Change log level of individual apps below to narrow your debugging -##################################### -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'formatters': { - 'verbose': { - 'format' : "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s", - 'datefmt' : "%d/%b/%Y %H:%M:%S" - }, - 'simple': { - 'format': '%(levelname)s %(message)s' - }, - }, - 'handlers': { - 'log_file': { - 'level': 'INFO', # edit this line to change logging level to file - 'class': 'logging.handlers.RotatingFileHandler', - 'filename': os.path.join(BASE_DIR,'log/allianceauth.log'), - 'formatter': 'verbose', - 'maxBytes': 1024*1024*5, # edit this line to change max log file size - 'backupCount': 5, # edit this line to change number of log backups - }, - 'console': { - 'level': 'DEBUG', # edit this line to change logging level to console - 'class': 'logging.StreamHandler', - 'formatter': 'verbose', - }, - 'notifications': { # creates notifications for users with logging_notifications permission - 'level': 'ERROR', # edit this line to change logging level to notifications - 'class': 'notifications.handlers.NotificationHandler', - 'formatter': 'verbose', - }, - }, - 'loggers': { - 'authentication': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'celerytask': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'eveonline': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'groupmanagement': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'hrapplications': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'portal': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'registration': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'services': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'srp': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'timerboard': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'sigtracker': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'optimer': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'corputils': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'util': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'DEBUG', - }, - 'django': { - 'handlers': ['log_file', 'console', 'notifications'], - 'level': 'ERROR', - }, - } -} - diff --git a/alliance_auth/urls.py b/alliance_auth/urls.py index 52b2c157..1e62b602 100755 --- a/alliance_auth/urls.py +++ b/alliance_auth/urls.py @@ -186,6 +186,13 @@ urlpatterns = patterns('', # FLEET FITTINGS url(r'^fits/$', 'services.views.fleet_fits', name='auth_fleet_fits'), + #Fleetup + url(r'^fleetup/$', 'fleetup.views.fleetup_view', name='auth_fleetup_view'), + url(r'^fleetup/fittings/$', 'fleetup.views.fleetup_fittings', name='auth_fleetup_fittings'), + url(r'^fleetup/fittings/(?P[0-9]+)/$', 'fleetup.views.fleetup_fitting'), + url(r'^fleetup/doctrines/$', 'fleetup.views.fleetup_doctrines', name='auth_fleetup_doctrines'), + url(r'^fleetup/characters/$', 'fleetup.views.fleetup_characters', name='auth_fleetup_characters'), + url(r'^fleetup/doctrines/(?P[0-9]+)/$', 'fleetup.views.fleetup_doctrine'), # Sig Tracker url(r'^sigtracker/$', 'sigtracker.views.sigtracker_view', name='auth_signature_view'), diff --git a/cache/.gitignore b/cache/.gitignore old mode 100644 new mode 100755 diff --git a/cache/README.md b/cache/README.md old mode 100644 new mode 100755 diff --git a/fleetup/__init__.py b/fleetup/__init__.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/admin.py b/fleetup/admin.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/forms.py b/fleetup/forms.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/models.py b/fleetup/models.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/tests.py b/fleetup/tests.py new file mode 100755 index 00000000..e69de29b diff --git a/fleetup/views.py b/fleetup/views.py new file mode 100755 index 00000000..1595c244 --- /dev/null +++ b/fleetup/views.py @@ -0,0 +1,101 @@ +import datetime +from operator import itemgetter, attrgetter, methodcaller + +from django.utils.timezone import utc + +from django.conf import settings +from django.shortcuts import render_to_response +from django.template import RequestContext +from django.contrib.auth.decorators import login_required +from django.contrib.auth.decorators import permission_required +from django.contrib.auth.decorators import user_passes_test +from django.shortcuts import HttpResponseRedirect +from django.template.defaulttags import register +from django.contrib.humanize.templatetags.humanize import intword + +from collections import namedtuple + +from authentication.managers import AuthServicesInfoManager +from util import check_if_user_has_permission +from services.managers.eve_api_manager import EveApiManager +from services.managers.fleetup_manager import FleetUpManager +from eveonline.models import EveCorporationInfo +from eveonline.models import EveAllianceInfo +from eveonline.models import EveCharacter +from authentication.models import AuthServicesInfo + +import logging + +logger = logging.getLogger(__name__) + +@register.filter +def get_item(dictionary, key): + return dictionary.get(key) + +def fleetup_util_test(user): + return check_if_user_has_permission(user, 'member') or check_if_user_has_permission(user, 'blue_member') + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_view(request): + logger.debug("fleetup_view called by user %s" % request.user) + + operations_list = FleetUpManager.get_fleetup_operations() + timers_list = FleetUpManager.get_fleetup_timers() + now = datetime.datetime.now().strftime('%H:%M:%S') + + context = {"timers_list": sorted(timers_list.items()), + "operations_list": sorted(operations_list.items()), + "now": now} + + return render_to_response('registered/fleetup.html',context, context_instance=RequestContext(request) ) + +@login_required +@permission_required('auth.corp_stats') +def fleetup_characters(request): + logger.debug("fleetup_characters called by user %s" % request.user) + + member_list = FleetUpManager.get_fleetup_members() + + context = {"member_list": sorted(member_list.items())} + + return render_to_response('registered/fleetupcharacters.html',context, context_instance=RequestContext(request) ) + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_fittings(request): + logger.debug("fleetup_fittings called by user %s" % request.user) + fitting_list = FleetUpManager.get_fleetup_fittings() + context = {"fitting_list": sorted(fitting_list.items())} + return render_to_response('registered/fleetupfittingsview.html',context, context_instance=RequestContext(request) ) + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_fitting(request, fittingnumber): + logger.debug("fleetup_fitting called by user %s" % request.user) + fitting_eft = FleetUpManager.get_fleetup_fitting_eft(fittingnumber) + fitting_data = FleetUpManager.get_fleetup_fitting(fittingnumber) + doctrinenumber = FleetUpManager.get_fleetup_doctrineid(fittingnumber) + doctrines_list = FleetUpManager.get_fleetup_doctrine(doctrinenumber) + context = {"fitting_eft": fitting_eft, + "fitting_data": fitting_data, + "doctrines_list": doctrines_list} + return render_to_response('registered/fleetupfitting.html',context, context_instance=RequestContext(request) ) + + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_doctrines(request): + logger.debug("fleetup_doctrines called by user %s" % request.user) + doctrines_list = FleetUpManager.get_fleetup_doctrines() + context = {"doctrines_list": doctrines_list} + return render_to_response('registered/fleetupdoctrinesview.html',context, context_instance=RequestContext(request) ) + +@login_required +@user_passes_test(fleetup_util_test) +def fleetup_doctrine(request, doctrinenumber): + logger.debug("fleetup_doctrine called by user %s" % request.user) + doctrine = FleetUpManager.get_fleetup_doctrine(doctrinenumber) + context = {"doctrine": doctrine} + return render_to_response('registered/fleetupdoctrine.html',context, context_instance=RequestContext(request) ) + diff --git a/log/.gitignore b/log/.gitignore old mode 100644 new mode 100755 diff --git a/services/managers/fleetup_manager.py b/services/managers/fleetup_manager.py new file mode 100644 index 00000000..c86c11c3 --- /dev/null +++ b/services/managers/fleetup_manager.py @@ -0,0 +1,118 @@ +from django.conf import settings +from datetime import datetime + +import logging +import requests +import json + +appkey = settings.FLEETUP_APP_KEY +userid = settings.FLEETUP_USER_ID +apiid = settings.FLEETUP_API_ID +groupid = settings.FLEETUP_GROUP_ID + +class FleetUpManager(): + def __init__(self): + pass + + @staticmethod + def get_fleetup_members(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/GroupCharacters/" + str(groupid) + "" + jsondata = requests.get(url).content + fmembers=json.loads(jsondata.decode()) + + #return(fmembers) + return {row["UserId"]:{"user_id":row["UserId"], + "char_name":row["EveCharName"], + "char_id":row["EveCharId"], + "corporation":row["Corporation"]} for row in fmembers["Data"]} + + @staticmethod + def get_fleetup_operations(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Operations/" + str(groupid) + "" + try: + jsondata = requests.get(url).content + except requests.exceptions.ConnectionError: + r.status_code = "Connection timeout" + foperations=json.loads(jsondata.decode()) + + return {row["StartString"]:{"subject":row["Subject"], + "start": (datetime.strptime(row["StartString"], "%Y-%m-%d %H:%M:%S")), + "end": (datetime.strptime(row["EndString"], "%Y-%m-%d %H:%M:%S")), + "operation_id":row["OperationId"], + "location":row["Location"], + "location_info":row["LocationInfo"], + "details":row["Details"], + "url":row["Url"], + "doctrine":row["Doctrines"], + "organizer":row["Organizer"]} for row in foperations["Data"]} + + @staticmethod + def get_fleetup_timers(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Timers/" + str(groupid) + "" + jsondata = requests.get(url).content + ftimers=json.loads(jsondata.decode()) + + return {row["ExpiresString"]:{"solarsystem":row["SolarSystem"], + "planet":row["Planet"], + "moon":row["Moon"], + "owner":row["Owner"], + "type":row["Type"], + "timer_type":row["TimerType"], + "expires": (datetime.strptime(row["ExpiresString"], "%Y-%m-%d %H:%M:%S")), + "notes":row["Notes"]} for row in ftimers["Data"]} + + @staticmethod + def get_fleetup_doctrines(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Doctrines/" + str(groupid) + "" + jsondata = requests.get(url).content + fdoctrines=json.loads(jsondata.decode()) + + return {"fleetup_doctrines":fdoctrines["Data"]} + + @staticmethod + def get_fleetup_doctrine(doctrinenumber): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/%s" % doctrinenumber + jsondata = requests.get(url).content + fdoctrine=json.loads(jsondata.decode()) + + return {"fitting_doctrine":fdoctrine} + + @staticmethod + def get_fleetup_fittings(): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Fittings/" + str(groupid) + "" + jsondata = requests.get(url).content + ffittings=json.loads(jsondata.decode()) + + return {row["FittingId"]:{"fitting_id":row["FittingId"], + "name":row["Name"], + "icon_id":row["EveTypeId"], + "hull":row["HullType"], + "shiptype":row["ShipType"], + "estimated":row["EstPrice"], + "faction":row["Faction"], + "categories":row["Categories"], + "last_update":(datetime.strptime(row["LastUpdatedString"], "%Y-%m-%d %H:%M:%S"))} for row in ffittings["Data"]} + + @staticmethod + def get_fleetup_fitting(fittingnumber): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Fitting/%s" % fittingnumber + jsondata = requests.get(url).content + ffitting=json.loads(jsondata.decode()) + + return {"fitting_data":ffitting["Data"]} + + @staticmethod + def get_fleetup_doctrineid(fittingnumber): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Fitting/%s" % fittingnumber + jsondata = requests.get(url).content + fdoctrineid=json.loads(jsondata.decode()) + + return fdoctrineid['Data']['Doctrines'][0]['DoctrineId'] + + @staticmethod + def get_fleetup_fitting_eft(fittingnumber): + url = "http://api.fleet-up.com/Api.svc/" + str(appkey) + "/" + str(userid) + "/" + str(apiid) + "/Fitting/%s/eft" % fittingnumber + jsondata = requests.get(url).content + ffittingeft=json.loads(jsondata.decode()) + + return {"fitting_eft":ffittingeft["Data"]["FittingData"]} diff --git a/stock/templates/public/base.html b/stock/templates/public/base.html index bb9ea2d4..5afb5ac6 100755 --- a/stock/templates/public/base.html +++ b/stock/templates/public/base.html @@ -146,6 +146,12 @@ href="{% url 'auth_fleet_fits' %}"> Fleet Doctrines +
  • + Fleet-Up +
  • + {% endif %} {% if perms.auth.member or perms.auth.blue_member %} diff --git a/stock/templates/registered/fleetup.html b/stock/templates/registered/fleetup.html new file mode 100644 index 00000000..c4a5a00b --- /dev/null +++ b/stock/templates/registered/fleetup.html @@ -0,0 +1,221 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp{% endblock page_title %} + +{% block content %} +
    + +
    + + +
    +
    +
    + {% if operations_list %} + {% for subject, start in operations_list %} +
    +
    +

    {{ start.subject }}

    +
    +
    + + + + + + + + + + + + + + + +
    StartEnd
    {{ start.start|date:"l d M H:i" }} Eve Time{{ start.end|date:"l d M H:i" }} Eve Time
    +

    {{ start.details }}

    + +
    + + + + + + + + + + + + + +
    LocationDoctrineOrganizerURL
    + {{ start.location }} - {{ start.location_info }} Dotlan + + {% if start.doctrine %} + {% for doctrine in start.doctrine %} + + {{ doctrine.Name }} + + {% endfor %} + + {% else %} + TBA + {% endif %} + + {{ start.organizer }} + + {% ifequal start.url "" %} +
    No link
    + {% else %} + External link + {% endifequal %} +
    +
    +
    +
    + {% endfor %} + {% else %} +

    There seems to be no Operations in the near future, go make ISK!

    + {% endif %} +
    +
    +
    +
    +

    Current Eve Time:

    +
    +
    +
    +
    +
    + {% if timers_list %} +
    +
    +

    Timers

    +
    +
    + + {% for notes, type in timers_list %} + + + + + {% endfor %} +
    + {{ type.solarsystem }} + + {{ type.expires|date:"l d M H:i" }} +
    +
    +
    + {% endif %} +
    +
    +
    +
    + {% if timers_list %} +
    +
    +

    Timers

    +
    +
    +
    + + + + + + + + + + + {% for notes, type in timers_list %} + + + + + + + + + + {% endfor %} +
    TypeStructureLocationExpires(EVE-time)OwnerNote
    + {% ifequal type.type "Final" %} + + {{ type.type }}{% else %}{{ type.type }}{% endifequal %} + + {{ type.timer_type }} + + {{ type.solarsystem }} - Planet:{{ type.planet }} Moon:{{ type.moon }} + + {{ type.expires|date:"l d M H:i" }} + + {{ type.owner }} + + {{ type.notes }} +
    +
    +
    +
    + {% else %} +

    There seems to be no Timers in the near future, this does not mean there isn't any!

    + {% endif %} +
    +
    +
    + +
    +
    + + + +{% endblock content %} \ No newline at end of file diff --git a/stock/templates/registered/fleetupcharacters.html b/stock/templates/registered/fleetupcharacters.html new file mode 100644 index 00000000..f5b6a6fa --- /dev/null +++ b/stock/templates/registered/fleetupcharacters.html @@ -0,0 +1,71 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp{% endblock page_title %} + +{% block content %} +
    +{% if perms.auth.corp_stats %} + +
    +
    +

    Characters registered on Fleet-Up.com

    +
    +
    +
    +
    + + + + + + + + {% for char_name, user_id in member_list %} + + + + + + {% endfor %} +
    CharacterCorporationFleet-Up(id)
    + + +

    {{ user_id.char_name }}

    +
    +

    {{ user_id.corporation }}

    +
    +

    {{ user_id.user_id }}

    +
    +
    +
    +
    +
    +{% endif %} +
    +{% endblock content %} \ No newline at end of file diff --git a/stock/templates/registered/fleetupdoctrine.html b/stock/templates/registered/fleetupdoctrine.html new file mode 100644 index 00000000..b6d0d2e7 --- /dev/null +++ b/stock/templates/registered/fleetupdoctrine.html @@ -0,0 +1,94 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp - Doctrine{% endblock page_title %} + +{% block content %} +
    + +
    + {% for a, j in doctrine.items %} + {% regroup j.Data|dictsort:"Role" by Role as role_list %} + + {% for Role in role_list %} + +
    +
    +

    {{ Role.grouper }}

    +
    +
    + + + + + + + + + + + + {% for item in Role.list %} + + + + + + + + + + + {% endfor %} + +
    NameRoleHull typeShip typeEstimated ISKCategories
    + + + {{ item.Name }} + + {{ item.Role }} + + {{ item.HullType }} + + {{ item.ShipType }} + + {% load humanize %}{{ item.EstPrice|intword }} + + {% for categories in item.Categories %} + {{ categories }}, + {% endfor %} +
    + +
    +
    + {% endfor %} +
    + {% endfor %} +
    + +{% endblock content %} \ No newline at end of file diff --git a/stock/templates/registered/fleetupdoctrinesview.html b/stock/templates/registered/fleetupdoctrinesview.html new file mode 100644 index 00000000..5544ae9f --- /dev/null +++ b/stock/templates/registered/fleetupdoctrinesview.html @@ -0,0 +1,85 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp{% endblock page_title %} + +{% block content %} +
    + +
    + {% if doctrines_list %} + {% for a, j in doctrines_list.items %} + {% regroup j|dictsort:"FolderName" by FolderName as folder_list %} + {% for FolderName in folder_list %} +
    +
    +
    +

    {{ FolderName.grouper }}

    +
    +
    + + + + + + + + + {% for item in FolderName.list %} + + + + + + + + {% endfor %} +
    NameDoctrineLast updated
    + + + {{ item.Name }} + + {{ item.FolderName }} + + {{ item.LastUpdatedString }} +
    +
    +
    +
    + {% endfor %} +
    + {% endfor %} + + {% else %} +

    There seems to be no Doctrines in here at the moment!

    + {% endif %} +
    + + +{% endblock content %} \ No newline at end of file diff --git a/stock/templates/registered/fleetupfitting.html b/stock/templates/registered/fleetupfitting.html new file mode 100644 index 00000000..32f462aa --- /dev/null +++ b/stock/templates/registered/fleetupfitting.html @@ -0,0 +1,152 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp - Doctrine{% endblock page_title %} + +{% block content %} +
    + +
    +
    +
    + {% for x, y in fitting_data.items %} +
    +
    +

    This fit is part of a doctrine

    +
    +
    + {% for doctrin in y.Doctrines %} +

    {{ doctrin.Name }}

    +
    +

    Role in doctrine: {{ doctrin.Role }}

    +
    +
    +

    Priority:

    +
    +
    +
    +
    + {{ doctrin.Priority }}/5 +
    +
    +
    + + {% endfor %} +
    +
    +
    +
    +

    Fit categories

    +
    +
    + {% for category in y.Categories %} + {{ category }} + {% endfor %} +
    +
    + {% endfor %} +
    +
    +

    All fits in this Doctrine

    +
    +
    +
    + {% for arbit, orbit in doctrines_list.items %} + + {% for fitting in orbit.Data %} + + +

    {{ fitting.Name }}

    +

    {{ fitting.Role }} - {{ fitting.ShipType }}

    +
    + {% endfor %} + {% endfor %} +
    +
    +
    +
    +
    +
    +
    + {% for a, j in fitting_data.items %} +

    {{ j.Name }}

    +
    +
    +
    + +
    +
    +

    Hull: {{ j.HullType }}

    +

    Ship: {{ j.ShipType }}

    + {% load humanize %} +

    Estimated price: {{ j.EstPrice|intword }} ISK

    +
    + {% regroup j.FittingData by Slot as fitting_list %} + + + + + + {% for Slot in fitting_list %} + + + + {% for item in Slot.list %} + + + + + {% endfor %} + {% endfor %} +
    {{ Slot.grouper }}
    {{ item.Quantity }}x {{ item.TypeName }}
    +
    + {% endfor %} +
    +
    + +
    +
    +
    +

    EFT/Export

    +
    +
    + {% for data in fitting_eft.items %} + {% autoescape off %} +
    {{ fitting_eft.fitting_eft }}
    + {% endautoescape %} + {% endfor %} +
    +
    +
    +
    +
    +
    + +{% endblock content %} \ No newline at end of file diff --git a/stock/templates/registered/fleetupfittingsview.html b/stock/templates/registered/fleetupfittingsview.html new file mode 100644 index 00000000..14e8d9f7 --- /dev/null +++ b/stock/templates/registered/fleetupfittingsview.html @@ -0,0 +1,78 @@ +{% extends "public/base.html" %} +{% load bootstrap %} +{% load staticfiles %} + +{% block title %}Alliance Auth{% endblock %} +{% block page_title %}FleetUp{% endblock page_title %} + +{% block content %} +
    + +
    + {% if fitting_list %} + + + + + + + + + + {% for id, fittings in fitting_list %} + + + + + + + + + + + {% endfor %} +
    NameHullShip typeEstimated ISKCategories
    + + + {{ fittings.name }} + + {{ fittings.hull }} + + {{ fittings.shiptype }} + + {% load humanize %}{{ fittings.estimated|intword }} + + {% for categories in fittings.categories %} + {{ categories }}, + {% endfor %} +
    + {% else %} +

    There seems to be no Doctrines in here at the moment!

    + {% endif %} +
    +
    + +{% endblock content %} \ No newline at end of file