diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6f56d3d0..08a8d32c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -76,6 +76,27 @@ test-3.10-core: reports: cobertura: coverage.xml +test-3.11-core: + <<: *only-default + image: python:3.11-rc-bullseye + script: + - tox -e py311-core + artifacts: + when: always + reports: + cobertura: coverage.xml + allow_failure: true + +test-3.7-all: + <<: *only-default + image: python:3.7-bullseye + script: + - tox -e py37-all + artifacts: + when: always + reports: + cobertura: coverage.xml + test-3.8-all: <<: *only-default image: python:3.8-bullseye @@ -106,6 +127,17 @@ test-3.10-all: reports: cobertura: coverage.xml +test-3.11-all: + <<: *only-default + image: python:3.11-rc-bullseye + script: + - tox -e py311-all + artifacts: + when: always + reports: + cobertura: coverage.xml + allow_failure: true + deploy_production: stage: deploy image: python:3.10-bullseye diff --git a/allianceauth/eveonline/providers.py b/allianceauth/eveonline/providers.py index eae6ee6a..f399613e 100644 --- a/allianceauth/eveonline/providers.py +++ b/allianceauth/eveonline/providers.py @@ -13,17 +13,18 @@ from allianceauth import __version__ SWAGGER_SPEC_PATH = os.path.join(os.path.dirname( os.path.abspath(__file__)), 'swagger.json' ) -""" -Swagger spec operations: -get_alliances_alliance_id -get_alliances_alliance_id_corporations -get_corporations_corporation_id -get_characters_character_id -get_universe_types_type_id -post_character_affiliation -get_universe_factions -""" +# for the love of Bob please add operations you use here. I'm tired of breaking undocumented things. +ESI_OPERATIONS=[ + 'get_alliances_alliance_id', + 'get_alliances_alliance_id_corporations', + 'get_corporations_corporation_id', + 'get_characters_character_id', + 'post_characters_affiliation', + 'get_universe_types_type_id', + 'get_universe_factions', + 'post_universe_names', +] logger = logging.getLogger(__name__) diff --git a/allianceauth/eveonline/swagger.json b/allianceauth/eveonline/swagger.json index 504ac333..d4c1bbb6 100644 --- a/allianceauth/eveonline/swagger.json +++ b/allianceauth/eveonline/swagger.json @@ -1 +1 @@ -{"consumes": ["application/json"], "definitions": {"bad_request": {"description": "Bad request model", "properties": {"error": {"description": "Bad request message", "type": "string"}}, "required": ["error"], "title": "Bad request", "type": "object"}, "error_limited": {"description": "Error limited model", "properties": {"error": {"description": "Error limited message", "type": "string"}}, "required": ["error"], "title": "Error limited", "type": "object"}, "forbidden": {"description": "Forbidden model", "properties": {"error": {"description": "Forbidden message", "type": "string"}, "sso_status": {"description": "status code received from SSO", "type": "integer"}}, "required": ["error"], "title": "Forbidden", "type": "object"}, "gateway_timeout": {"description": "Gateway timeout model", "properties": {"error": {"description": "Gateway timeout message", "type": "string"}, "timeout": {"description": "number of seconds the request was given", "type": "integer"}}, "required": ["error"], "title": "Gateway timeout", "type": "object"}, "internal_server_error": {"description": "Internal server error model", "properties": {"error": {"description": "Internal server error message", "type": "string"}}, "required": ["error"], "title": "Internal server error", "type": "object"}, "service_unavailable": {"description": "Service unavailable model", "properties": {"error": {"description": "Service unavailable message", "type": "string"}}, "required": ["error"], "title": "Service unavailable", "type": "object"}, "unauthorized": {"description": "Unauthorized model", "properties": {"error": {"description": "Unauthorized message", "type": "string"}}, "required": ["error"], "title": "Unauthorized", "type": "object"}}, "host": "esi.evetech.net", "info": {"description": "An OpenAPI for EVE Online", "title": "EVE Swagger Interface", "version": "1.8.2"}, "parameters": {"Accept-Language": {"default": "en", "description": "Language to use in the response", "enum": ["en", "en-us", "de", "fr", "ja", "ru", "zh", "ko", "es"], "in": "header", "name": "Accept-Language", "type": "string"}, "If-None-Match": {"description": "ETag from a previous request. A 304 will be returned if this matches the current ETag", "in": "header", "name": "If-None-Match", "type": "string"}, "alliance_id": {"description": "An EVE alliance ID", "format": "int32", "in": "path", "minimum": 1, "name": "alliance_id", "required": true, "type": "integer"}, "character_id": {"description": "An EVE character ID", "format": "int32", "in": "path", "minimum": 1, "name": "character_id", "required": true, "type": "integer"}, "corporation_id": {"description": "An EVE corporation ID", "format": "int32", "in": "path", "minimum": 1, "name": "corporation_id", "required": true, "type": "integer"}, "datasource": {"default": "tranquility", "description": "The server name you would like data from", "enum": ["tranquility"], "in": "query", "name": "datasource", "type": "string"}, "language": {"default": "en", "description": "Language to use in the response, takes precedence over Accept-Language", "enum": ["en", "en-us", "de", "fr", "ja", "ru", "zh", "ko", "es"], "in": "query", "name": "language", "type": "string"}, "page": {"default": 1, "description": "Which page of results to return", "format": "int32", "in": "query", "minimum": 1, "name": "page", "type": "integer"}, "token": {"description": "Access token to use if unable to set a header", "in": "query", "name": "token", "type": "string"}}, "produces": ["application/json"], "schemes": ["https"], "securityDefinitions": {"evesso": {"authorizationUrl": "https://login.eveonline.com/v2/oauth/authorize", "flow": "implicit", "scopes": {"esi-alliances.read_contacts.v1": "EVE SSO scope esi-alliances.read_contacts.v1", "esi-assets.read_assets.v1": "EVE SSO scope esi-assets.read_assets.v1", "esi-assets.read_corporation_assets.v1": "EVE SSO scope esi-assets.read_corporation_assets.v1", "esi-bookmarks.read_character_bookmarks.v1": "EVE SSO scope esi-bookmarks.read_character_bookmarks.v1", "esi-bookmarks.read_corporation_bookmarks.v1": "EVE SSO scope esi-bookmarks.read_corporation_bookmarks.v1", "esi-calendar.read_calendar_events.v1": "EVE SSO scope esi-calendar.read_calendar_events.v1", "esi-calendar.respond_calendar_events.v1": "EVE SSO scope esi-calendar.respond_calendar_events.v1", "esi-characters.read_agents_research.v1": "EVE SSO scope esi-characters.read_agents_research.v1", "esi-characters.read_blueprints.v1": "EVE SSO scope esi-characters.read_blueprints.v1", "esi-characters.read_contacts.v1": "EVE SSO scope esi-characters.read_contacts.v1", "esi-characters.read_corporation_roles.v1": "EVE SSO scope esi-characters.read_corporation_roles.v1", "esi-characters.read_fatigue.v1": "EVE SSO scope esi-characters.read_fatigue.v1", "esi-characters.read_fw_stats.v1": "EVE SSO scope esi-characters.read_fw_stats.v1", "esi-characters.read_loyalty.v1": "EVE SSO scope esi-characters.read_loyalty.v1", "esi-characters.read_medals.v1": "EVE SSO scope esi-characters.read_medals.v1", "esi-characters.read_notifications.v1": "EVE SSO scope esi-characters.read_notifications.v1", "esi-characters.read_opportunities.v1": "EVE SSO scope esi-characters.read_opportunities.v1", "esi-characters.read_standings.v1": "EVE SSO scope esi-characters.read_standings.v1", "esi-characters.read_titles.v1": "EVE SSO scope esi-characters.read_titles.v1", "esi-characters.write_contacts.v1": "EVE SSO scope esi-characters.write_contacts.v1", "esi-clones.read_clones.v1": "EVE SSO scope esi-clones.read_clones.v1", "esi-clones.read_implants.v1": "EVE SSO scope esi-clones.read_implants.v1", "esi-contracts.read_character_contracts.v1": "EVE SSO scope esi-contracts.read_character_contracts.v1", "esi-contracts.read_corporation_contracts.v1": "EVE SSO scope esi-contracts.read_corporation_contracts.v1", "esi-corporations.read_blueprints.v1": "EVE SSO scope esi-corporations.read_blueprints.v1", "esi-corporations.read_contacts.v1": "EVE SSO scope esi-corporations.read_contacts.v1", "esi-corporations.read_container_logs.v1": "EVE SSO scope esi-corporations.read_container_logs.v1", "esi-corporations.read_corporation_membership.v1": "EVE SSO scope esi-corporations.read_corporation_membership.v1", "esi-corporations.read_divisions.v1": "EVE SSO scope esi-corporations.read_divisions.v1", "esi-corporations.read_facilities.v1": "EVE SSO scope esi-corporations.read_facilities.v1", "esi-corporations.read_fw_stats.v1": "EVE SSO scope esi-corporations.read_fw_stats.v1", "esi-corporations.read_medals.v1": "EVE SSO scope esi-corporations.read_medals.v1", "esi-corporations.read_standings.v1": "EVE SSO scope esi-corporations.read_standings.v1", "esi-corporations.read_starbases.v1": "EVE SSO scope esi-corporations.read_starbases.v1", "esi-corporations.read_structures.v1": "EVE SSO scope esi-corporations.read_structures.v1", "esi-corporations.read_titles.v1": "EVE SSO scope esi-corporations.read_titles.v1", "esi-corporations.track_members.v1": "EVE SSO scope esi-corporations.track_members.v1", "esi-fittings.read_fittings.v1": "EVE SSO scope esi-fittings.read_fittings.v1", "esi-fittings.write_fittings.v1": "EVE SSO scope esi-fittings.write_fittings.v1", "esi-fleets.read_fleet.v1": "EVE SSO scope esi-fleets.read_fleet.v1", "esi-fleets.write_fleet.v1": "EVE SSO scope esi-fleets.write_fleet.v1", "esi-industry.read_character_jobs.v1": "EVE SSO scope esi-industry.read_character_jobs.v1", "esi-industry.read_character_mining.v1": "EVE SSO scope esi-industry.read_character_mining.v1", "esi-industry.read_corporation_jobs.v1": "EVE SSO scope esi-industry.read_corporation_jobs.v1", "esi-industry.read_corporation_mining.v1": "EVE SSO scope esi-industry.read_corporation_mining.v1", "esi-killmails.read_corporation_killmails.v1": "EVE SSO scope esi-killmails.read_corporation_killmails.v1", "esi-killmails.read_killmails.v1": "EVE SSO scope esi-killmails.read_killmails.v1", "esi-location.read_location.v1": "EVE SSO scope esi-location.read_location.v1", "esi-location.read_online.v1": "EVE SSO scope esi-location.read_online.v1", "esi-location.read_ship_type.v1": "EVE SSO scope esi-location.read_ship_type.v1", "esi-mail.organize_mail.v1": "EVE SSO scope esi-mail.organize_mail.v1", "esi-mail.read_mail.v1": "EVE SSO scope esi-mail.read_mail.v1", "esi-mail.send_mail.v1": "EVE SSO scope esi-mail.send_mail.v1", "esi-markets.read_character_orders.v1": "EVE SSO scope esi-markets.read_character_orders.v1", "esi-markets.read_corporation_orders.v1": "EVE SSO scope esi-markets.read_corporation_orders.v1", "esi-markets.structure_markets.v1": "EVE SSO scope esi-markets.structure_markets.v1", "esi-planets.manage_planets.v1": "EVE SSO scope esi-planets.manage_planets.v1", "esi-planets.read_customs_offices.v1": "EVE SSO scope esi-planets.read_customs_offices.v1", "esi-search.search_structures.v1": "EVE SSO scope esi-search.search_structures.v1", "esi-skills.read_skillqueue.v1": "EVE SSO scope esi-skills.read_skillqueue.v1", "esi-skills.read_skills.v1": "EVE SSO scope esi-skills.read_skills.v1", "esi-ui.open_window.v1": "EVE SSO scope esi-ui.open_window.v1", "esi-ui.write_waypoint.v1": "EVE SSO scope esi-ui.write_waypoint.v1", "esi-universe.read_structures.v1": "EVE SSO scope esi-universe.read_structures.v1", "esi-wallet.read_character_wallet.v1": "EVE SSO scope esi-wallet.read_character_wallet.v1", "esi-wallet.read_corporation_wallets.v1": "EVE SSO scope esi-wallet.read_corporation_wallets.v1"}, "type": "oauth2"}}, "swagger": "2.0", "paths": {"/v1/alliances/{alliance_id}/corporations/": {"get": {"description": "List all current member corporations of an alliance\n\n---\n\nThis route is cached for up to 3600 seconds", "operationId": "get_alliances_alliance_id_corporations", "parameters": [{"$ref": "#/parameters/alliance_id"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}], "responses": {"200": {"description": "List of corporation IDs", "examples": {"application/json": [98000001]}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok array", "items": {"description": "200 ok integer", "format": "int32", "minimum": 0, "title": "get_alliances_alliance_id_corporations_200_ok", "type": "integer", "uniqueItems": true}, "maxItems": 1000, "title": "get_alliances_alliance_id_corporations_ok", "type": "array"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "List alliance's corporations", "tags": ["Alliance"], "x-alternate-versions": ["dev", "legacy", "v1", "v2"], "x-cached-seconds": 3600}}, "/v2/characters/affiliation/": {"post": {"description": "Bulk lookup of character IDs to corporation, alliance and faction\n\n---\n\nThis route is cached for up to 3600 seconds", "operationId": "post_characters_affiliation", "parameters": [{"description": "The character IDs to fetch affiliations for. All characters must exist, or none will be returned", "in": "body", "name": "characters", "required": true, "schema": {"description": "characters array", "items": {"description": "character integer", "format": "int32", "title": "post_characters_affiliation_character", "type": "integer"}, "maxItems": 1000, "minItems": 1, "title": "post_characters_affiliation_characters", "type": "array", "uniqueItems": true}}, {"$ref": "#/parameters/datasource"}], "responses": {"200": {"description": "Character corporation, alliance and faction IDs", "examples": {"application/json": [{"alliance_id": 434243723, "character_id": 95538921, "corporation_id": 109299958}]}, "schema": {"description": "200 ok array", "items": {"description": "200 ok object", "properties": {"alliance_id": {"description": "The character's alliance ID, if their corporation is in an alliance", "format": "int32", "title": "post_characters_affiliation_alliance_id", "type": "integer"}, "character_id": {"description": "The character's ID", "format": "int32", "title": "post_characters_affiliation_character_id", "type": "integer"}, "corporation_id": {"description": "The character's corporation ID", "format": "int32", "title": "post_characters_affiliation_corporation_id", "type": "integer"}, "faction_id": {"description": "The character's faction ID, if their corporation is in a faction", "format": "int32", "title": "post_characters_affiliation_faction_id", "type": "integer"}}, "required": ["character_id", "corporation_id"], "title": "post_characters_affiliation_200_ok", "type": "object"}, "maxItems": 1000, "title": "post_characters_affiliation_ok", "type": "array"}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Character affiliation", "tags": ["Character"], "x-alternate-versions": ["dev", "v2"], "x-cached-seconds": 3600}}, "/v2/universe/factions/": {"get": {"description": "Get a list of factions\n\n---\n\nThis route expires daily at 11:05", "operationId": "get_universe_factions", "parameters": [{"$ref": "#/parameters/Accept-Language"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}, {"$ref": "#/parameters/language"}], "responses": {"200": {"description": "A list of factions", "examples": {"application/json": [{"corporation_id": 456, "description": "blah blah", "faction_id": 1, "is_unique": true, "name": "Faction", "size_factor": 1.0, "solar_system_id": 123, "station_count": 1000, "station_system_count": 100}]}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "Content-Language": {"description": "The language used in the response", "enum": ["en", "de", "fr", "ja", "ru", "zh", "ko", "es"], "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok array", "items": {"description": "200 ok object", "properties": {"corporation_id": {"description": "corporation_id integer", "format": "int32", "title": "get_universe_factions_corporation_id", "type": "integer"}, "description": {"description": "description string", "title": "get_universe_factions_description", "type": "string"}, "faction_id": {"description": "faction_id integer", "format": "int32", "title": "get_universe_factions_faction_id", "type": "integer"}, "is_unique": {"description": "is_unique boolean", "title": "get_universe_factions_is_unique", "type": "boolean"}, "militia_corporation_id": {"description": "militia_corporation_id integer", "format": "int32", "title": "get_universe_factions_militia_corporation_id", "type": "integer"}, "name": {"description": "name string", "title": "get_universe_factions_name", "type": "string"}, "size_factor": {"description": "size_factor number", "format": "float", "title": "get_universe_factions_size_factor", "type": "number"}, "solar_system_id": {"description": "solar_system_id integer", "format": "int32", "title": "get_universe_factions_solar_system_id", "type": "integer"}, "station_count": {"description": "station_count integer", "format": "int32", "title": "get_universe_factions_station_count", "type": "integer"}, "station_system_count": {"description": "station_system_count integer", "format": "int32", "title": "get_universe_factions_station_system_count", "type": "integer"}}, "required": ["faction_id", "name", "description", "size_factor", "station_count", "station_system_count", "is_unique"], "title": "get_universe_factions_200_ok", "type": "object"}, "maxItems": 10000, "title": "get_universe_factions_ok", "type": "array"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get factions", "tags": ["Universe"], "x-alternate-versions": ["dev", "v2"]}}, "/v3/alliances/{alliance_id}/": {"get": {"description": "Public information about an alliance\n\n---\n\nThis route is cached for up to 3600 seconds", "operationId": "get_alliances_alliance_id", "parameters": [{"$ref": "#/parameters/alliance_id"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}], "responses": {"200": {"description": "Public data about an alliance", "examples": {"application/json": {"creator_corporation_id": 45678, "creator_id": 12345, "date_founded": "2016-06-26T21:00:00Z", "executor_corporation_id": 98356193, "name": "C C P Alliance", "ticker": ""}}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok object", "properties": {"creator_corporation_id": {"description": "ID of the corporation that created the alliance", "format": "int32", "title": "get_alliances_alliance_id_creator_corporation_id", "type": "integer"}, "creator_id": {"description": "ID of the character that created the alliance", "format": "int32", "title": "get_alliances_alliance_id_creator_id", "type": "integer"}, "date_founded": {"description": "date_founded string", "format": "date-time", "title": "get_alliances_alliance_id_date_founded", "type": "string"}, "executor_corporation_id": {"description": "the executor corporation ID, if this alliance is not closed", "format": "int32", "title": "get_alliances_alliance_id_executor_corporation_id", "type": "integer"}, "faction_id": {"description": "Faction ID this alliance is fighting for, if this alliance is enlisted in factional warfare", "format": "int32", "title": "get_alliances_alliance_id_faction_id", "type": "integer"}, "name": {"description": "the full name of the alliance", "title": "get_alliances_alliance_id_name", "type": "string"}, "ticker": {"description": "the short name of the alliance", "title": "get_alliances_alliance_id_ticker", "type": "string"}}, "required": ["name", "creator_id", "creator_corporation_id", "ticker", "date_founded"], "title": "get_alliances_alliance_id_ok", "type": "object"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Alliance not found", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "get_alliances_alliance_id_404_not_found", "type": "string"}}, "title": "get_alliances_alliance_id_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get alliance information", "tags": ["Alliance"], "x-alternate-versions": ["dev", "legacy", "v3", "v4"], "x-cached-seconds": 3600}}, "/v3/universe/types/{type_id}/": {"get": {"description": "Get information on a type\n\n---\n\nThis route expires daily at 11:05", "operationId": "get_universe_types_type_id", "parameters": [{"$ref": "#/parameters/Accept-Language"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}, {"$ref": "#/parameters/language"}, {"description": "An Eve item type ID", "format": "int32", "in": "path", "name": "type_id", "required": true, "type": "integer"}], "responses": {"200": {"description": "Information about a type", "examples": {"application/json": {"description": "The Rifter is a...", "group_id": 25, "name": "Rifter", "published": true, "type_id": 587}}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "Content-Language": {"description": "The language used in the response", "enum": ["en", "de", "fr", "ja", "ru", "zh", "ko", "es"], "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok object", "properties": {"capacity": {"description": "capacity number", "format": "float", "title": "get_universe_types_type_id_capacity", "type": "number"}, "description": {"description": "description string", "title": "get_universe_types_type_id_description", "type": "string"}, "dogma_attributes": {"description": "dogma_attributes array", "items": {"description": "dogma_attribute object", "properties": {"attribute_id": {"description": "attribute_id integer", "format": "int32", "title": "get_universe_types_type_id_attribute_id", "type": "integer"}, "value": {"description": "value number", "format": "float", "title": "get_universe_types_type_id_value", "type": "number"}}, "required": ["attribute_id", "value"], "title": "get_universe_types_type_id_dogma_attribute", "type": "object"}, "maxItems": 1000, "title": "get_universe_types_type_id_dogma_attributes", "type": "array"}, "dogma_effects": {"description": "dogma_effects array", "items": {"description": "dogma_effect object", "properties": {"effect_id": {"description": "effect_id integer", "format": "int32", "title": "get_universe_types_type_id_effect_id", "type": "integer"}, "is_default": {"description": "is_default boolean", "title": "get_universe_types_type_id_is_default", "type": "boolean"}}, "required": ["effect_id", "is_default"], "title": "get_universe_types_type_id_dogma_effect", "type": "object"}, "maxItems": 1000, "title": "get_universe_types_type_id_dogma_effects", "type": "array"}, "graphic_id": {"description": "graphic_id integer", "format": "int32", "title": "get_universe_types_type_id_graphic_id", "type": "integer"}, "group_id": {"description": "group_id integer", "format": "int32", "title": "get_universe_types_type_id_group_id", "type": "integer"}, "icon_id": {"description": "icon_id integer", "format": "int32", "title": "get_universe_types_type_id_icon_id", "type": "integer"}, "market_group_id": {"description": "This only exists for types that can be put on the market", "format": "int32", "title": "get_universe_types_type_id_market_group_id", "type": "integer"}, "mass": {"description": "mass number", "format": "float", "title": "get_universe_types_type_id_mass", "type": "number"}, "name": {"description": "name string", "title": "get_universe_types_type_id_name", "type": "string"}, "packaged_volume": {"description": "packaged_volume number", "format": "float", "title": "get_universe_types_type_id_packaged_volume", "type": "number"}, "portion_size": {"description": "portion_size integer", "format": "int32", "title": "get_universe_types_type_id_portion_size", "type": "integer"}, "published": {"description": "published boolean", "title": "get_universe_types_type_id_published", "type": "boolean"}, "radius": {"description": "radius number", "format": "float", "title": "get_universe_types_type_id_radius", "type": "number"}, "type_id": {"description": "type_id integer", "format": "int32", "title": "get_universe_types_type_id_type_id", "type": "integer"}, "volume": {"description": "volume number", "format": "float", "title": "get_universe_types_type_id_volume", "type": "number"}}, "required": ["type_id", "name", "description", "published", "group_id"], "title": "get_universe_types_type_id_ok", "type": "object"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Type not found", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "get_universe_types_type_id_404_not_found", "type": "string"}}, "title": "get_universe_types_type_id_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get type information", "tags": ["Universe"], "x-alternate-versions": ["dev", "v3"]}}, "/v5/characters/{character_id}/": {"get": {"description": "Public information about a character\n\n---\n\nThis route is cached for up to 86400 seconds", "operationId": "get_characters_character_id", "parameters": [{"$ref": "#/parameters/character_id"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}], "responses": {"200": {"description": "Public data for the given character", "examples": {"application/json": {"birthday": "2015-03-24T11:37:00Z", "bloodline_id": 3, "corporation_id": 109299958, "description": "", "gender": "male", "name": "CCP Bartender", "race_id": 2, "title": "All round pretty awesome guy"}}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok object", "properties": {"alliance_id": {"description": "The character's alliance ID", "format": "int32", "title": "get_characters_character_id_alliance_id", "type": "integer"}, "birthday": {"description": "Creation date of the character", "format": "date-time", "title": "get_characters_character_id_birthday", "type": "string"}, "bloodline_id": {"description": "bloodline_id integer", "format": "int32", "title": "get_characters_character_id_bloodline_id", "type": "integer"}, "corporation_id": {"description": "The character's corporation ID", "format": "int32", "title": "get_characters_character_id_corporation_id", "type": "integer"}, "description": {"description": "description string", "title": "get_characters_character_id_description", "type": "string"}, "faction_id": {"description": "ID of the faction the character is fighting for, if the character is enlisted in Factional Warfare", "format": "int32", "title": "get_characters_character_id_faction_id", "type": "integer"}, "gender": {"description": "gender string", "enum": ["female", "male"], "title": "get_characters_character_id_gender", "type": "string"}, "name": {"description": "name string", "title": "get_characters_character_id_name", "type": "string"}, "race_id": {"description": "race_id integer", "format": "int32", "title": "get_characters_character_id_race_id", "type": "integer"}, "security_status": {"description": "security_status number", "format": "float", "maximum": 10, "minimum": -10, "title": "get_characters_character_id_security_status", "type": "number"}, "title": {"description": "The individual title of the character", "title": "get_characters_character_id_title", "type": "string"}}, "required": ["corporation_id", "birthday", "name", "gender", "race_id", "bloodline_id"], "title": "get_characters_character_id_ok", "type": "object"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Character not found", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "get_characters_character_id_404_not_found", "type": "string"}}, "title": "get_characters_character_id_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get character's public information", "tags": ["Character"], "x-alternate-versions": ["dev", "v5"], "x-cached-seconds": 86400}}, "/v5/corporations/{corporation_id}/": {"get": {"description": "Public information about a corporation\n\n---\n\nThis route is cached for up to 3600 seconds", "operationId": "get_corporations_corporation_id", "parameters": [{"$ref": "#/parameters/corporation_id"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}], "responses": {"200": {"description": "Public information about a corporation", "examples": {"application/json": {"alliance_id": 434243723, "ceo_id": 180548812, "creator_id": 180548812, "date_founded": "2004-11-28T16:42:51Z", "description": "This is a corporation description, it's basically just a string", "member_count": 656, "name": "C C P", "tax_rate": 0.256, "ticker": "-CCP-", "url": "http://www.eveonline.com"}}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok object", "properties": {"alliance_id": {"description": "ID of the alliance that corporation is a member of, if any", "format": "int32", "title": "get_corporations_corporation_id_alliance_id", "type": "integer"}, "ceo_id": {"description": "ceo_id integer", "format": "int32", "title": "get_corporations_corporation_id_ceo_id", "type": "integer"}, "creator_id": {"description": "creator_id integer", "format": "int32", "title": "get_corporations_corporation_id_creator_id", "type": "integer"}, "date_founded": {"description": "date_founded string", "format": "date-time", "title": "get_corporations_corporation_id_date_founded", "type": "string"}, "description": {"description": "description string", "title": "get_corporations_corporation_id_description", "type": "string"}, "faction_id": {"description": "faction_id integer", "format": "int32", "title": "get_corporations_corporation_id_faction_id", "type": "integer"}, "home_station_id": {"description": "home_station_id integer", "format": "int32", "title": "get_corporations_corporation_id_home_station_id", "type": "integer"}, "member_count": {"description": "member_count integer", "format": "int32", "title": "get_corporations_corporation_id_member_count", "type": "integer"}, "name": {"description": "the full name of the corporation", "title": "get_corporations_corporation_id_name", "type": "string"}, "shares": {"description": "shares integer", "format": "int64", "title": "get_corporations_corporation_id_shares", "type": "integer"}, "tax_rate": {"description": "tax_rate number", "format": "float", "maximum": 1, "minimum": 0, "title": "get_corporations_corporation_id_tax_rate", "type": "number"}, "ticker": {"description": "the short name of the corporation", "title": "get_corporations_corporation_id_ticker", "type": "string"}, "url": {"description": "url string", "title": "get_corporations_corporation_id_url", "type": "string"}, "war_eligible": {"description": "war_eligible boolean", "title": "get_corporations_corporation_id_war_eligible", "type": "boolean"}}, "required": ["name", "ticker", "member_count", "ceo_id", "tax_rate", "creator_id"], "title": "get_corporations_corporation_id_ok", "type": "object"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Corporation not found", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "get_corporations_corporation_id_404_not_found", "type": "string"}}, "title": "get_corporations_corporation_id_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get corporation information", "tags": ["Corporation"], "x-alternate-versions": ["dev", "v5"], "x-cached-seconds": 3600}}}} \ No newline at end of file +{"consumes": ["application/json"], "definitions": {"bad_request": {"description": "Bad request model", "properties": {"error": {"description": "Bad request message", "type": "string"}}, "required": ["error"], "title": "Bad request", "type": "object"}, "error_limited": {"description": "Error limited model", "properties": {"error": {"description": "Error limited message", "type": "string"}}, "required": ["error"], "title": "Error limited", "type": "object"}, "forbidden": {"description": "Forbidden model", "properties": {"error": {"description": "Forbidden message", "type": "string"}, "sso_status": {"description": "status code received from SSO", "type": "integer"}}, "required": ["error"], "title": "Forbidden", "type": "object"}, "gateway_timeout": {"description": "Gateway timeout model", "properties": {"error": {"description": "Gateway timeout message", "type": "string"}, "timeout": {"description": "number of seconds the request was given", "type": "integer"}}, "required": ["error"], "title": "Gateway timeout", "type": "object"}, "internal_server_error": {"description": "Internal server error model", "properties": {"error": {"description": "Internal server error message", "type": "string"}}, "required": ["error"], "title": "Internal server error", "type": "object"}, "service_unavailable": {"description": "Service unavailable model", "properties": {"error": {"description": "Service unavailable message", "type": "string"}}, "required": ["error"], "title": "Service unavailable", "type": "object"}, "unauthorized": {"description": "Unauthorized model", "properties": {"error": {"description": "Unauthorized message", "type": "string"}}, "required": ["error"], "title": "Unauthorized", "type": "object"}}, "host": "esi.evetech.net", "info": {"description": "An OpenAPI for EVE Online", "title": "EVE Swagger Interface", "version": "1.10.1"}, "parameters": {"Accept-Language": {"default": "en", "description": "Language to use in the response", "enum": ["en", "en-us", "de", "fr", "ja", "ru", "zh", "ko", "es"], "in": "header", "name": "Accept-Language", "type": "string"}, "If-None-Match": {"description": "ETag from a previous request. A 304 will be returned if this matches the current ETag", "in": "header", "name": "If-None-Match", "type": "string"}, "alliance_id": {"description": "An EVE alliance ID", "format": "int32", "in": "path", "minimum": 1, "name": "alliance_id", "required": true, "type": "integer"}, "character_id": {"description": "An EVE character ID", "format": "int32", "in": "path", "minimum": 1, "name": "character_id", "required": true, "type": "integer"}, "corporation_id": {"description": "An EVE corporation ID", "format": "int32", "in": "path", "minimum": 1, "name": "corporation_id", "required": true, "type": "integer"}, "datasource": {"default": "tranquility", "description": "The server name you would like data from", "enum": ["tranquility"], "in": "query", "name": "datasource", "type": "string"}, "language": {"default": "en", "description": "Language to use in the response, takes precedence over Accept-Language", "enum": ["en", "en-us", "de", "fr", "ja", "ru", "zh", "ko", "es"], "in": "query", "name": "language", "type": "string"}, "page": {"default": 1, "description": "Which page of results to return", "format": "int32", "in": "query", "minimum": 1, "name": "page", "type": "integer"}, "token": {"description": "Access token to use if unable to set a header", "in": "query", "name": "token", "type": "string"}}, "produces": ["application/json"], "schemes": ["https"], "securityDefinitions": {"evesso": {"authorizationUrl": "https://login.eveonline.com/v2/oauth/authorize", "flow": "implicit", "scopes": {"esi-alliances.read_contacts.v1": "EVE SSO scope esi-alliances.read_contacts.v1", "esi-assets.read_assets.v1": "EVE SSO scope esi-assets.read_assets.v1", "esi-assets.read_corporation_assets.v1": "EVE SSO scope esi-assets.read_corporation_assets.v1", "esi-bookmarks.read_character_bookmarks.v1": "EVE SSO scope esi-bookmarks.read_character_bookmarks.v1", "esi-bookmarks.read_corporation_bookmarks.v1": "EVE SSO scope esi-bookmarks.read_corporation_bookmarks.v1", "esi-calendar.read_calendar_events.v1": "EVE SSO scope esi-calendar.read_calendar_events.v1", "esi-calendar.respond_calendar_events.v1": "EVE SSO scope esi-calendar.respond_calendar_events.v1", "esi-characters.read_agents_research.v1": "EVE SSO scope esi-characters.read_agents_research.v1", "esi-characters.read_blueprints.v1": "EVE SSO scope esi-characters.read_blueprints.v1", "esi-characters.read_contacts.v1": "EVE SSO scope esi-characters.read_contacts.v1", "esi-characters.read_corporation_roles.v1": "EVE SSO scope esi-characters.read_corporation_roles.v1", "esi-characters.read_fatigue.v1": "EVE SSO scope esi-characters.read_fatigue.v1", "esi-characters.read_fw_stats.v1": "EVE SSO scope esi-characters.read_fw_stats.v1", "esi-characters.read_loyalty.v1": "EVE SSO scope esi-characters.read_loyalty.v1", "esi-characters.read_medals.v1": "EVE SSO scope esi-characters.read_medals.v1", "esi-characters.read_notifications.v1": "EVE SSO scope esi-characters.read_notifications.v1", "esi-characters.read_opportunities.v1": "EVE SSO scope esi-characters.read_opportunities.v1", "esi-characters.read_standings.v1": "EVE SSO scope esi-characters.read_standings.v1", "esi-characters.read_titles.v1": "EVE SSO scope esi-characters.read_titles.v1", "esi-characters.write_contacts.v1": "EVE SSO scope esi-characters.write_contacts.v1", "esi-clones.read_clones.v1": "EVE SSO scope esi-clones.read_clones.v1", "esi-clones.read_implants.v1": "EVE SSO scope esi-clones.read_implants.v1", "esi-contracts.read_character_contracts.v1": "EVE SSO scope esi-contracts.read_character_contracts.v1", "esi-contracts.read_corporation_contracts.v1": "EVE SSO scope esi-contracts.read_corporation_contracts.v1", "esi-corporations.read_blueprints.v1": "EVE SSO scope esi-corporations.read_blueprints.v1", "esi-corporations.read_contacts.v1": "EVE SSO scope esi-corporations.read_contacts.v1", "esi-corporations.read_container_logs.v1": "EVE SSO scope esi-corporations.read_container_logs.v1", "esi-corporations.read_corporation_membership.v1": "EVE SSO scope esi-corporations.read_corporation_membership.v1", "esi-corporations.read_divisions.v1": "EVE SSO scope esi-corporations.read_divisions.v1", "esi-corporations.read_facilities.v1": "EVE SSO scope esi-corporations.read_facilities.v1", "esi-corporations.read_fw_stats.v1": "EVE SSO scope esi-corporations.read_fw_stats.v1", "esi-corporations.read_medals.v1": "EVE SSO scope esi-corporations.read_medals.v1", "esi-corporations.read_standings.v1": "EVE SSO scope esi-corporations.read_standings.v1", "esi-corporations.read_starbases.v1": "EVE SSO scope esi-corporations.read_starbases.v1", "esi-corporations.read_structures.v1": "EVE SSO scope esi-corporations.read_structures.v1", "esi-corporations.read_titles.v1": "EVE SSO scope esi-corporations.read_titles.v1", "esi-corporations.track_members.v1": "EVE SSO scope esi-corporations.track_members.v1", "esi-fittings.read_fittings.v1": "EVE SSO scope esi-fittings.read_fittings.v1", "esi-fittings.write_fittings.v1": "EVE SSO scope esi-fittings.write_fittings.v1", "esi-fleets.read_fleet.v1": "EVE SSO scope esi-fleets.read_fleet.v1", "esi-fleets.write_fleet.v1": "EVE SSO scope esi-fleets.write_fleet.v1", "esi-industry.read_character_jobs.v1": "EVE SSO scope esi-industry.read_character_jobs.v1", "esi-industry.read_character_mining.v1": "EVE SSO scope esi-industry.read_character_mining.v1", "esi-industry.read_corporation_jobs.v1": "EVE SSO scope esi-industry.read_corporation_jobs.v1", "esi-industry.read_corporation_mining.v1": "EVE SSO scope esi-industry.read_corporation_mining.v1", "esi-killmails.read_corporation_killmails.v1": "EVE SSO scope esi-killmails.read_corporation_killmails.v1", "esi-killmails.read_killmails.v1": "EVE SSO scope esi-killmails.read_killmails.v1", "esi-location.read_location.v1": "EVE SSO scope esi-location.read_location.v1", "esi-location.read_online.v1": "EVE SSO scope esi-location.read_online.v1", "esi-location.read_ship_type.v1": "EVE SSO scope esi-location.read_ship_type.v1", "esi-mail.organize_mail.v1": "EVE SSO scope esi-mail.organize_mail.v1", "esi-mail.read_mail.v1": "EVE SSO scope esi-mail.read_mail.v1", "esi-mail.send_mail.v1": "EVE SSO scope esi-mail.send_mail.v1", "esi-markets.read_character_orders.v1": "EVE SSO scope esi-markets.read_character_orders.v1", "esi-markets.read_corporation_orders.v1": "EVE SSO scope esi-markets.read_corporation_orders.v1", "esi-markets.structure_markets.v1": "EVE SSO scope esi-markets.structure_markets.v1", "esi-planets.manage_planets.v1": "EVE SSO scope esi-planets.manage_planets.v1", "esi-planets.read_customs_offices.v1": "EVE SSO scope esi-planets.read_customs_offices.v1", "esi-search.search_structures.v1": "EVE SSO scope esi-search.search_structures.v1", "esi-skills.read_skillqueue.v1": "EVE SSO scope esi-skills.read_skillqueue.v1", "esi-skills.read_skills.v1": "EVE SSO scope esi-skills.read_skills.v1", "esi-ui.open_window.v1": "EVE SSO scope esi-ui.open_window.v1", "esi-ui.write_waypoint.v1": "EVE SSO scope esi-ui.write_waypoint.v1", "esi-universe.read_structures.v1": "EVE SSO scope esi-universe.read_structures.v1", "esi-wallet.read_character_wallet.v1": "EVE SSO scope esi-wallet.read_character_wallet.v1", "esi-wallet.read_corporation_wallets.v1": "EVE SSO scope esi-wallet.read_corporation_wallets.v1"}, "type": "oauth2"}}, "swagger": "2.0", "paths": {"/v1/alliances/{alliance_id}/corporations/": {"get": {"description": "List all current member corporations of an alliance\n\n---\n\nThis route is cached for up to 3600 seconds", "operationId": "get_alliances_alliance_id_corporations", "parameters": [{"$ref": "#/parameters/alliance_id"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}], "responses": {"200": {"description": "List of corporation IDs", "examples": {"application/json": [98000001]}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok array", "items": {"description": "200 ok integer", "format": "int32", "minimum": 0, "title": "get_alliances_alliance_id_corporations_200_ok", "type": "integer", "uniqueItems": true}, "maxItems": 1000, "title": "get_alliances_alliance_id_corporations_ok", "type": "array"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "List alliance's corporations", "tags": ["Alliance"], "x-alternate-versions": ["dev", "legacy", "v1", "v2"], "x-cached-seconds": 3600}}, "/v2/characters/affiliation/": {"post": {"description": "Bulk lookup of character IDs to corporation, alliance and faction\n\n---\n\nThis route is cached for up to 3600 seconds", "operationId": "post_characters_affiliation", "parameters": [{"description": "The character IDs to fetch affiliations for. All characters must exist, or none will be returned", "in": "body", "name": "characters", "required": true, "schema": {"description": "characters array", "items": {"description": "character integer", "format": "int32", "title": "post_characters_affiliation_character", "type": "integer"}, "maxItems": 1000, "minItems": 1, "title": "post_characters_affiliation_characters", "type": "array", "uniqueItems": true}}, {"$ref": "#/parameters/datasource"}], "responses": {"200": {"description": "Character corporation, alliance and faction IDs", "examples": {"application/json": [{"alliance_id": 434243723, "character_id": 95538921, "corporation_id": 109299958}]}, "schema": {"description": "200 ok array", "items": {"description": "200 ok object", "properties": {"alliance_id": {"description": "The character's alliance ID, if their corporation is in an alliance", "format": "int32", "title": "post_characters_affiliation_alliance_id", "type": "integer"}, "character_id": {"description": "The character's ID", "format": "int32", "title": "post_characters_affiliation_character_id", "type": "integer"}, "corporation_id": {"description": "The character's corporation ID", "format": "int32", "title": "post_characters_affiliation_corporation_id", "type": "integer"}, "faction_id": {"description": "The character's faction ID, if their corporation is in a faction", "format": "int32", "title": "post_characters_affiliation_faction_id", "type": "integer"}}, "required": ["character_id", "corporation_id"], "title": "post_characters_affiliation_200_ok", "type": "object"}, "maxItems": 1000, "title": "post_characters_affiliation_ok", "type": "array"}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Character affiliation", "tags": ["Character"], "x-alternate-versions": ["dev", "v2"], "x-cached-seconds": 3600}}, "/v2/universe/factions/": {"get": {"description": "Get a list of factions\n\n---\n\nThis route expires daily at 11:05", "operationId": "get_universe_factions", "parameters": [{"$ref": "#/parameters/Accept-Language"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}, {"$ref": "#/parameters/language"}], "responses": {"200": {"description": "A list of factions", "examples": {"application/json": [{"corporation_id": 456, "description": "blah blah", "faction_id": 1, "is_unique": true, "name": "Faction", "size_factor": 1.0, "solar_system_id": 123, "station_count": 1000, "station_system_count": 100}]}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "Content-Language": {"description": "The language used in the response", "enum": ["en", "de", "fr", "ja", "ru", "zh", "ko", "es"], "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok array", "items": {"description": "200 ok object", "properties": {"corporation_id": {"description": "corporation_id integer", "format": "int32", "title": "get_universe_factions_corporation_id", "type": "integer"}, "description": {"description": "description string", "title": "get_universe_factions_description", "type": "string"}, "faction_id": {"description": "faction_id integer", "format": "int32", "title": "get_universe_factions_faction_id", "type": "integer"}, "is_unique": {"description": "is_unique boolean", "title": "get_universe_factions_is_unique", "type": "boolean"}, "militia_corporation_id": {"description": "militia_corporation_id integer", "format": "int32", "title": "get_universe_factions_militia_corporation_id", "type": "integer"}, "name": {"description": "name string", "title": "get_universe_factions_name", "type": "string"}, "size_factor": {"description": "size_factor number", "format": "float", "title": "get_universe_factions_size_factor", "type": "number"}, "solar_system_id": {"description": "solar_system_id integer", "format": "int32", "title": "get_universe_factions_solar_system_id", "type": "integer"}, "station_count": {"description": "station_count integer", "format": "int32", "title": "get_universe_factions_station_count", "type": "integer"}, "station_system_count": {"description": "station_system_count integer", "format": "int32", "title": "get_universe_factions_station_system_count", "type": "integer"}}, "required": ["faction_id", "name", "description", "size_factor", "station_count", "station_system_count", "is_unique"], "title": "get_universe_factions_200_ok", "type": "object"}, "maxItems": 10000, "title": "get_universe_factions_ok", "type": "array"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get factions", "tags": ["Universe"], "x-alternate-versions": ["dev", "v2"]}}, "/v3/alliances/{alliance_id}/": {"get": {"description": "Public information about an alliance\n\n---\n\nThis route is cached for up to 3600 seconds", "operationId": "get_alliances_alliance_id", "parameters": [{"$ref": "#/parameters/alliance_id"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}], "responses": {"200": {"description": "Public data about an alliance", "examples": {"application/json": {"creator_corporation_id": 45678, "creator_id": 12345, "date_founded": "2016-06-26T21:00:00Z", "executor_corporation_id": 98356193, "name": "C C P Alliance", "ticker": ""}}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok object", "properties": {"creator_corporation_id": {"description": "ID of the corporation that created the alliance", "format": "int32", "title": "get_alliances_alliance_id_creator_corporation_id", "type": "integer"}, "creator_id": {"description": "ID of the character that created the alliance", "format": "int32", "title": "get_alliances_alliance_id_creator_id", "type": "integer"}, "date_founded": {"description": "date_founded string", "format": "date-time", "title": "get_alliances_alliance_id_date_founded", "type": "string"}, "executor_corporation_id": {"description": "the executor corporation ID, if this alliance is not closed", "format": "int32", "title": "get_alliances_alliance_id_executor_corporation_id", "type": "integer"}, "faction_id": {"description": "Faction ID this alliance is fighting for, if this alliance is enlisted in factional warfare", "format": "int32", "title": "get_alliances_alliance_id_faction_id", "type": "integer"}, "name": {"description": "the full name of the alliance", "title": "get_alliances_alliance_id_name", "type": "string"}, "ticker": {"description": "the short name of the alliance", "title": "get_alliances_alliance_id_ticker", "type": "string"}}, "required": ["name", "creator_id", "creator_corporation_id", "ticker", "date_founded"], "title": "get_alliances_alliance_id_ok", "type": "object"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Alliance not found", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "get_alliances_alliance_id_404_not_found", "type": "string"}}, "title": "get_alliances_alliance_id_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get alliance information", "tags": ["Alliance"], "x-alternate-versions": ["dev", "legacy", "v3", "v4"], "x-cached-seconds": 3600}}, "/v3/universe/names/": {"post": {"description": "Resolve a set of IDs to names and categories. Supported ID's for resolving are: Characters, Corporations, Alliances, Stations, Solar Systems, Constellations, Regions, Types, Factions\n\n---\n", "operationId": "post_universe_names", "parameters": [{"$ref": "#/parameters/datasource"}, {"description": "The ids to resolve", "in": "body", "name": "ids", "required": true, "schema": {"description": "ids array", "example": [95465499, 30000142], "items": {"description": "id integer", "format": "int32", "title": "post_universe_names_id", "type": "integer"}, "maxItems": 1000, "minItems": 1, "title": "post_universe_names_ids", "type": "array", "uniqueItems": true}}], "responses": {"200": {"description": "List of id/name associations for a set of IDs. All IDs must resolve to a name, or nothing will be returned", "examples": {"application/json": [{"category": "character", "id": 95465499, "name": "CCP Bartender"}, {"category": "solar_system", "id": 30000142, "name": "Jita"}]}, "schema": {"description": "200 ok array", "items": {"description": "200 ok object", "properties": {"category": {"description": "category string", "enum": ["alliance", "character", "constellation", "corporation", "inventory_type", "region", "solar_system", "station", "faction"], "title": "post_universe_names_category", "type": "string"}, "id": {"description": "id integer", "format": "int32", "title": "post_universe_names_id", "type": "integer"}, "name": {"description": "name string", "title": "post_universe_names_name", "type": "string"}}, "required": ["id", "name", "category"], "title": "post_universe_names_200_ok", "type": "object"}, "maxItems": 1000, "title": "post_universe_names_ok", "type": "array"}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Ensure all IDs are valid before resolving", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "post_universe_names_404_not_found", "type": "string"}}, "title": "post_universe_names_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get names and categories for a set of IDs", "tags": ["Universe"], "x-alternate-versions": ["dev", "v3"]}}, "/v3/universe/types/{type_id}/": {"get": {"description": "Get information on a type\n\n---\n\nThis route expires daily at 11:05", "operationId": "get_universe_types_type_id", "parameters": [{"$ref": "#/parameters/Accept-Language"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}, {"$ref": "#/parameters/language"}, {"description": "An Eve item type ID", "format": "int32", "in": "path", "name": "type_id", "required": true, "type": "integer"}], "responses": {"200": {"description": "Information about a type", "examples": {"application/json": {"description": "The Rifter is a...", "group_id": 25, "name": "Rifter", "published": true, "type_id": 587}}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "Content-Language": {"description": "The language used in the response", "enum": ["en", "de", "fr", "ja", "ru", "zh", "ko", "es"], "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok object", "properties": {"capacity": {"description": "capacity number", "format": "float", "title": "get_universe_types_type_id_capacity", "type": "number"}, "description": {"description": "description string", "title": "get_universe_types_type_id_description", "type": "string"}, "dogma_attributes": {"description": "dogma_attributes array", "items": {"description": "dogma_attribute object", "properties": {"attribute_id": {"description": "attribute_id integer", "format": "int32", "title": "get_universe_types_type_id_attribute_id", "type": "integer"}, "value": {"description": "value number", "format": "float", "title": "get_universe_types_type_id_value", "type": "number"}}, "required": ["attribute_id", "value"], "title": "get_universe_types_type_id_dogma_attribute", "type": "object"}, "maxItems": 1000, "title": "get_universe_types_type_id_dogma_attributes", "type": "array"}, "dogma_effects": {"description": "dogma_effects array", "items": {"description": "dogma_effect object", "properties": {"effect_id": {"description": "effect_id integer", "format": "int32", "title": "get_universe_types_type_id_effect_id", "type": "integer"}, "is_default": {"description": "is_default boolean", "title": "get_universe_types_type_id_is_default", "type": "boolean"}}, "required": ["effect_id", "is_default"], "title": "get_universe_types_type_id_dogma_effect", "type": "object"}, "maxItems": 1000, "title": "get_universe_types_type_id_dogma_effects", "type": "array"}, "graphic_id": {"description": "graphic_id integer", "format": "int32", "title": "get_universe_types_type_id_graphic_id", "type": "integer"}, "group_id": {"description": "group_id integer", "format": "int32", "title": "get_universe_types_type_id_group_id", "type": "integer"}, "icon_id": {"description": "icon_id integer", "format": "int32", "title": "get_universe_types_type_id_icon_id", "type": "integer"}, "market_group_id": {"description": "This only exists for types that can be put on the market", "format": "int32", "title": "get_universe_types_type_id_market_group_id", "type": "integer"}, "mass": {"description": "mass number", "format": "float", "title": "get_universe_types_type_id_mass", "type": "number"}, "name": {"description": "name string", "title": "get_universe_types_type_id_name", "type": "string"}, "packaged_volume": {"description": "packaged_volume number", "format": "float", "title": "get_universe_types_type_id_packaged_volume", "type": "number"}, "portion_size": {"description": "portion_size integer", "format": "int32", "title": "get_universe_types_type_id_portion_size", "type": "integer"}, "published": {"description": "published boolean", "title": "get_universe_types_type_id_published", "type": "boolean"}, "radius": {"description": "radius number", "format": "float", "title": "get_universe_types_type_id_radius", "type": "number"}, "type_id": {"description": "type_id integer", "format": "int32", "title": "get_universe_types_type_id_type_id", "type": "integer"}, "volume": {"description": "volume number", "format": "float", "title": "get_universe_types_type_id_volume", "type": "number"}}, "required": ["type_id", "name", "description", "published", "group_id"], "title": "get_universe_types_type_id_ok", "type": "object"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Type not found", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "get_universe_types_type_id_404_not_found", "type": "string"}}, "title": "get_universe_types_type_id_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get type information", "tags": ["Universe"], "x-alternate-versions": ["dev", "v3"]}}, "/v5/characters/{character_id}/": {"get": {"description": "Public information about a character\n\n---\n\nThis route is cached for up to 86400 seconds", "operationId": "get_characters_character_id", "parameters": [{"$ref": "#/parameters/character_id"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}], "responses": {"200": {"description": "Public data for the given character", "examples": {"application/json": {"birthday": "2015-03-24T11:37:00Z", "bloodline_id": 3, "corporation_id": 109299958, "description": "", "gender": "male", "name": "CCP Bartender", "race_id": 2, "title": "All round pretty awesome guy"}}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok object", "properties": {"alliance_id": {"description": "The character's alliance ID", "format": "int32", "title": "get_characters_character_id_alliance_id", "type": "integer"}, "birthday": {"description": "Creation date of the character", "format": "date-time", "title": "get_characters_character_id_birthday", "type": "string"}, "bloodline_id": {"description": "bloodline_id integer", "format": "int32", "title": "get_characters_character_id_bloodline_id", "type": "integer"}, "corporation_id": {"description": "The character's corporation ID", "format": "int32", "title": "get_characters_character_id_corporation_id", "type": "integer"}, "description": {"description": "description string", "title": "get_characters_character_id_description", "type": "string"}, "faction_id": {"description": "ID of the faction the character is fighting for, if the character is enlisted in Factional Warfare", "format": "int32", "title": "get_characters_character_id_faction_id", "type": "integer"}, "gender": {"description": "gender string", "enum": ["female", "male"], "title": "get_characters_character_id_gender", "type": "string"}, "name": {"description": "name string", "title": "get_characters_character_id_name", "type": "string"}, "race_id": {"description": "race_id integer", "format": "int32", "title": "get_characters_character_id_race_id", "type": "integer"}, "security_status": {"description": "security_status number", "format": "float", "maximum": 10, "minimum": -10, "title": "get_characters_character_id_security_status", "type": "number"}, "title": {"description": "The individual title of the character", "title": "get_characters_character_id_title", "type": "string"}}, "required": ["corporation_id", "birthday", "name", "gender", "race_id", "bloodline_id"], "title": "get_characters_character_id_ok", "type": "object"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Character not found", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "get_characters_character_id_404_not_found", "type": "string"}}, "title": "get_characters_character_id_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get character's public information", "tags": ["Character"], "x-alternate-versions": ["dev", "legacy", "v5"], "x-cached-seconds": 86400}}, "/v5/corporations/{corporation_id}/": {"get": {"description": "Public information about a corporation\n\n---\n\nThis route is cached for up to 3600 seconds", "operationId": "get_corporations_corporation_id", "parameters": [{"$ref": "#/parameters/corporation_id"}, {"$ref": "#/parameters/datasource"}, {"$ref": "#/parameters/If-None-Match"}], "responses": {"200": {"description": "Public information about a corporation", "examples": {"application/json": {"alliance_id": 434243723, "ceo_id": 180548812, "creator_id": 180548812, "date_founded": "2004-11-28T16:42:51Z", "description": "This is a corporation description, it's basically just a string", "member_count": 656, "name": "C C P", "tax_rate": 0.256, "ticker": "-CCP-", "url": "http://www.eveonline.com"}}, "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}, "schema": {"description": "200 ok object", "properties": {"alliance_id": {"description": "ID of the alliance that corporation is a member of, if any", "format": "int32", "title": "get_corporations_corporation_id_alliance_id", "type": "integer"}, "ceo_id": {"description": "ceo_id integer", "format": "int32", "title": "get_corporations_corporation_id_ceo_id", "type": "integer"}, "creator_id": {"description": "creator_id integer", "format": "int32", "title": "get_corporations_corporation_id_creator_id", "type": "integer"}, "date_founded": {"description": "date_founded string", "format": "date-time", "title": "get_corporations_corporation_id_date_founded", "type": "string"}, "description": {"description": "description string", "title": "get_corporations_corporation_id_description", "type": "string"}, "faction_id": {"description": "faction_id integer", "format": "int32", "title": "get_corporations_corporation_id_faction_id", "type": "integer"}, "home_station_id": {"description": "home_station_id integer", "format": "int32", "title": "get_corporations_corporation_id_home_station_id", "type": "integer"}, "member_count": {"description": "member_count integer", "format": "int32", "title": "get_corporations_corporation_id_member_count", "type": "integer"}, "name": {"description": "the full name of the corporation", "title": "get_corporations_corporation_id_name", "type": "string"}, "shares": {"description": "shares integer", "format": "int64", "title": "get_corporations_corporation_id_shares", "type": "integer"}, "tax_rate": {"description": "tax_rate number", "format": "float", "maximum": 1, "minimum": 0, "title": "get_corporations_corporation_id_tax_rate", "type": "number"}, "ticker": {"description": "the short name of the corporation", "title": "get_corporations_corporation_id_ticker", "type": "string"}, "url": {"description": "url string", "title": "get_corporations_corporation_id_url", "type": "string"}, "war_eligible": {"description": "war_eligible boolean", "title": "get_corporations_corporation_id_war_eligible", "type": "boolean"}}, "required": ["name", "ticker", "member_count", "ceo_id", "tax_rate", "creator_id"], "title": "get_corporations_corporation_id_ok", "type": "object"}}, "304": {"description": "Not modified", "headers": {"Cache-Control": {"description": "The caching mechanism used", "type": "string"}, "ETag": {"description": "RFC7232 compliant entity tag", "type": "string"}, "Expires": {"description": "RFC7231 formatted datetime string", "type": "string"}, "Last-Modified": {"description": "RFC7231 formatted datetime string", "type": "string"}}}, "400": {"description": "Bad request", "examples": {"application/json": {"error": "Bad request message"}}, "schema": {"$ref": "#/definitions/bad_request"}}, "404": {"description": "Corporation not found", "examples": {"application/json": {"error": "Not found message"}}, "schema": {"description": "Not found", "properties": {"error": {"description": "Not found message", "title": "get_corporations_corporation_id_404_not_found", "type": "string"}}, "title": "get_corporations_corporation_id_not_found", "type": "object"}}, "420": {"description": "Error limited", "examples": {"application/json": {"error": "Error limited message"}}, "schema": {"$ref": "#/definitions/error_limited"}}, "500": {"description": "Internal server error", "examples": {"application/json": {"error": "Internal server error message"}}, "schema": {"$ref": "#/definitions/internal_server_error"}}, "503": {"description": "Service unavailable", "examples": {"application/json": {"error": "Service unavailable message"}}, "schema": {"$ref": "#/definitions/service_unavailable"}}, "504": {"description": "Gateway timeout", "examples": {"application/json": {"error": "Gateway timeout message"}}, "schema": {"$ref": "#/definitions/gateway_timeout"}}}, "summary": "Get corporation information", "tags": ["Corporation"], "x-alternate-versions": ["dev", "v5"], "x-cached-seconds": 3600}}}} \ No newline at end of file diff --git a/allianceauth/eveonline/tasks.py b/allianceauth/eveonline/tasks.py index 4b131497..13825f9b 100644 --- a/allianceauth/eveonline/tasks.py +++ b/allianceauth/eveonline/tasks.py @@ -49,7 +49,6 @@ def run_model_update(): for alliance in EveAllianceInfo.objects.all().values('alliance_id'): update_alliance.apply_async(args=[alliance['alliance_id']], priority=TASK_PRIORITY) - #update existing character models if required # update existing character models character_ids = EveCharacter.objects.all().values_list('character_id', flat=True) for character_ids_chunk in chunks(character_ids, CHUNK_SIZE): diff --git a/allianceauth/groupmanagement/templates/groupmanagement/index.html b/allianceauth/groupmanagement/templates/groupmanagement/index.html index a65cb776..842ea4bc 100644 --- a/allianceauth/groupmanagement/templates/groupmanagement/index.html +++ b/allianceauth/groupmanagement/templates/groupmanagement/index.html @@ -29,15 +29,18 @@ {% endif %} -
  • - - {% translate "Leave Requests" %} - {% if leaverequests %} - {{ leaverequests|length }} - {% endif %} - -
  • + {% if not auto_leave %} +
  • + + {% translate "Leave Requests" %} + + {% if leaverequests %} + {{ leaverequests|length }} + {% endif %} + +
  • + {% endif %}
    @@ -100,61 +103,63 @@ {% endif %}
    -
    - {% if leaverequests %} -
    - - - - - - - - - - - - {% for leaverequest in leaverequests %} + {% if not auto_leave %} +
    + {% if leaverequests %} +
    +
    {% translate "Character" %}{% translate "Organization" %}{% translate "Group" %}
    + - - - - + + + + - {% endfor %} - -
    - - {% if leaverequest.main_char %} - - {{ leaverequest.main_char.character_name }} - - {% else %} - {{ leaverequest.user.username }} - {% endif %} - - {% if leaverequest.main_char %} - - {{ leaverequest.main_char.corporation_name }} -
    - {{ leaverequest.main_char.alliance_name|default_if_none:"" }} - {% else %} - {% translate "(unknown)" %} - {% endif %} -
    {{ leaverequest.group.name }} - - {% translate "Accept" %} - - - - {% translate "Reject" %} - - {% translate "Character" %}{% translate "Organization" %}{% translate "Group" %}
    -
    - {% else %} -
    {% translate "No group leave requests." %}
    - {% endif %} -
    + + + + {% for leaverequest in leaverequests %} + + + + {% if leaverequest.main_char %} + + {{ leaverequest.main_char.character_name }} + + {% else %} + {{ leaverequest.user.username }} + {% endif %} + + + {% if leaverequest.main_char %} + + {{ leaverequest.main_char.corporation_name }} +
    + {{ leaverequest.main_char.alliance_name|default_if_none:"" }} + {% else %} + {% translate "(unknown)" %} + {% endif %} + + {{ leaverequest.group.name }} + + + {% translate "Accept" %} + + + + {% translate "Reject" %} + + + + {% endfor %} + + + + {% else %} +
    {% translate "No group leave requests." %}
    + {% endif %} + + {% endif %} diff --git a/allianceauth/groupmanagement/tests/test_views.py b/allianceauth/groupmanagement/tests/test_views.py index 0c723ec9..e0c9245b 100644 --- a/allianceauth/groupmanagement/tests/test_views.py +++ b/allianceauth/groupmanagement/tests/test_views.py @@ -1,4 +1,4 @@ -from django.test import RequestFactory, TestCase +from django.test import RequestFactory, TestCase, override_settings from django.urls import reverse from allianceauth.tests.auth_utils import AuthUtils @@ -6,14 +6,80 @@ from allianceauth.tests.auth_utils import AuthUtils from .. import views +def response_content_to_str(response) -> str: + return response.content.decode(response.charset) + + class TestViews(TestCase): def setUp(self): self.factory = RequestFactory() - self.user = AuthUtils.create_user('Bruce Wayne') + self.user = AuthUtils.create_user('Peter Parker') + self.user_with_manage_permission = AuthUtils.create_user('Bruce Wayne') + + # set permissions + AuthUtils.add_permission_to_user_by_name( + 'auth.group_management', self.user_with_manage_permission + ) def test_groups_view_can_load(self): request = self.factory.get(reverse('groupmanagement:groups')) request.user = self.user response = views.groups_view(request) self.assertEqual(response.status_code, 200) + + def test_management_view_can_load_for_user_with_permissions(self): + """ + Test if user with management permissions can access the management view + :return: + """ + + request = self.factory.get(reverse('groupmanagement:management')) + request.user = self.user_with_manage_permission + response = views.group_management(request) + self.assertEqual(response.status_code, 200) + + def test_management_view_doesnt_load_for_user_without_permissions(self): + """ + Test if user without management permissions can't access the management view + :return: + """ + + request = self.factory.get(reverse('groupmanagement:management')) + request.user = self.user + response = views.group_management(request) + self.assertEqual(response.status_code, 302) + + @override_settings(GROUPMANAGEMENT_AUTO_LEAVE=False) + def test_leave_requests_tab_visible(self): + """ + Test if the leave requests tab is visible when GROUPMANAGEMENT_AUTO_LEAVE = False + :return: + """ + + request = self.factory.get(reverse('groupmanagement:management')) + request.user = self.user_with_manage_permission + response = views.group_management(request) + + content = response_content_to_str(response) + + self.assertEqual(response.status_code, 200) + self.assertIn('', content) + self.assertIn('
    ', content) + + @override_settings(GROUPMANAGEMENT_AUTO_LEAVE=True) + def test_leave_requests_tab_hidden(self): + """ + Test if the leave requests tab is hidden when GROUPMANAGEMENT_AUTO_LEAVE = True + :return: + """ + + request = self.factory.get(reverse('groupmanagement:management')) + request.user = self.user_with_manage_permission + response = views.group_management(request) + + content = response_content_to_str(response) + + self.assertEqual(response.status_code, 200) + self.assertNotIn('', content) + self.assertNotIn('
    ', content) diff --git a/allianceauth/groupmanagement/views.py b/allianceauth/groupmanagement/views.py index e8d68157..10682636 100755 --- a/allianceauth/groupmanagement/views.py +++ b/allianceauth/groupmanagement/views.py @@ -45,7 +45,11 @@ def group_management(request): logger.debug("Providing user {} with {} acceptrequests and {} leaverequests.".format( request.user, len(acceptrequests), len(leaverequests))) - render_items = {'acceptrequests': acceptrequests, 'leaverequests': leaverequests} + render_items = { + 'acceptrequests': acceptrequests, + 'leaverequests': leaverequests, + 'auto_leave': getattr(settings, 'GROUPMANAGEMENT_AUTO_LEAVE', False), + } return render(request, 'groupmanagement/index.html', context=render_items) diff --git a/allianceauth/notifications/managers.py b/allianceauth/notifications/managers.py index 628ba1b9..3798428e 100644 --- a/allianceauth/notifications/managers.py +++ b/allianceauth/notifications/managers.py @@ -49,19 +49,22 @@ class NotificationManager(models.Manager): logger.info("Created notification %s", obj) return obj - def _max_notifications_per_user(self): - """return the maximum number of notifications allowed per user""" - max_notifications = getattr(settings, 'NOTIFICATIONS_MAX_PER_USER', None) - if ( - max_notifications is None - or not isinstance(max_notifications, int) - or max_notifications < 0 - ): + def _max_notifications_per_user(self) -> int: + """Maximum number of notifications allowed per user.""" + max_notifications = getattr( + settings, + "NOTIFICATIONS_MAX_PER_USER", + self.model.NOTIFICATIONS_MAX_PER_USER_DEFAULT + ) + try: + max_notifications = int(max_notifications) + except ValueError: + max_notifications = None + if max_notifications is None or max_notifications < 0: logger.warning( - 'NOTIFICATIONS_MAX_PER_USER setting is invalid. Using default.' + "NOTIFICATIONS_MAX_PER_USER setting is invalid. Using default." ) max_notifications = self.model.NOTIFICATIONS_MAX_PER_USER_DEFAULT - return max_notifications def user_unread_count(self, user_pk: int) -> int: diff --git a/allianceauth/notifications/tests/test_managers.py b/allianceauth/notifications/tests/test_managers.py index 19d40161..a74ca2b9 100644 --- a/allianceauth/notifications/tests/test_managers.py +++ b/allianceauth/notifications/tests/test_managers.py @@ -1,5 +1,6 @@ from unittest.mock import patch +from django.conf import settings from django.contrib.auth.models import User from django.test import TestCase, override_settings @@ -113,29 +114,53 @@ class TestUserNotify(TestCase): self.assertSetEqual(result, expected) +@patch("allianceauth.notifications.managers.logger") @patch( - MODULE_PATH + '.Notification.NOTIFICATIONS_MAX_PER_USER_DEFAULT', + MODULE_PATH + ".Notification.NOTIFICATIONS_MAX_PER_USER_DEFAULT", NOTIFICATIONS_MAX_PER_USER_DEFAULT ) class TestMaxNotificationsPerUser(TestCase): - - @override_settings(NOTIFICATIONS_MAX_PER_USER=None) - def test_reset_to_default_if_not_defined(self): + @override_settings(NOTIFICATIONS_MAX_PER_USER=42) + def test_should_use_custom_integer_setting(self, mock_logger): + # when result = Notification.objects._max_notifications_per_user() - expected = NOTIFICATIONS_MAX_PER_USER_DEFAULT - self.assertEqual(result, expected) + # then + self.assertEqual(result, 42) + self.assertFalse(mock_logger.warning.called) - @override_settings(NOTIFICATIONS_MAX_PER_USER='11') - def test_reset_to_default_if_not_int(self): + @override_settings(NOTIFICATIONS_MAX_PER_USER="42") + def test_should_use_custom_string_setting(self, mock_logger): + # when result = Notification.objects._max_notifications_per_user() - expected = NOTIFICATIONS_MAX_PER_USER_DEFAULT - self.assertEqual(result, expected) + # then + self.assertEqual(result, 42) + self.assertFalse(mock_logger.warning.called) + + @override_settings() + def test_should_use_default_if_not_defined(self, mock_logger): + # given + del settings.NOTIFICATIONS_MAX_PER_USER + # when + result = Notification.objects._max_notifications_per_user() + # then + self.assertEqual(result, NOTIFICATIONS_MAX_PER_USER_DEFAULT) + self.assertFalse(mock_logger.warning.called) + + @override_settings(NOTIFICATIONS_MAX_PER_USER="abc") + def test_should_reset_to_default_if_not_int(self, mock_logger): + # when + result = Notification.objects._max_notifications_per_user() + # then + self.assertEqual(result, NOTIFICATIONS_MAX_PER_USER_DEFAULT) + self.assertTrue(mock_logger.warning.called) @override_settings(NOTIFICATIONS_MAX_PER_USER=-1) - def test_reset_to_default_if_lt_zero(self): + def test_should_reset_to_default_if_lt_zero(self, mock_logger): + # when result = Notification.objects._max_notifications_per_user() - expected = NOTIFICATIONS_MAX_PER_USER_DEFAULT - self.assertEqual(result, expected) + # then + self.assertEqual(result, NOTIFICATIONS_MAX_PER_USER_DEFAULT) + self.assertTrue(mock_logger.warning.called) @patch('allianceauth.notifications.managers.cache') diff --git a/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_444444_256x240.png b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_444444_256x240.png new file mode 100644 index 00000000..1508deae Binary files /dev/null and b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_444444_256x240.png differ diff --git a/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_555555_256x240.png b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_555555_256x240.png new file mode 100644 index 00000000..8848bd4b Binary files /dev/null and b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_555555_256x240.png differ diff --git a/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_777620_256x240.png b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_777620_256x240.png new file mode 100644 index 00000000..40aa9c6c Binary files /dev/null and b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_777620_256x240.png differ diff --git a/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_777777_256x240.png b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_777777_256x240.png new file mode 100644 index 00000000..9faedc71 Binary files /dev/null and b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_777777_256x240.png differ diff --git a/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_cc0000_256x240.png b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_cc0000_256x240.png new file mode 100644 index 00000000..40d68905 Binary files /dev/null and b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_cc0000_256x240.png differ diff --git a/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_ffffff_256x240.png b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_ffffff_256x240.png new file mode 100644 index 00000000..20f4c0ab Binary files /dev/null and b/allianceauth/static/js/jquery-ui/1.12.1/css/images/ui-icons_ffffff_256x240.png differ diff --git a/allianceauth/static/js/jquery-ui/1.12.1/css/jquery-ui.min.css b/allianceauth/static/js/jquery-ui/1.12.1/css/jquery-ui.min.css new file mode 100644 index 00000000..63875567 --- /dev/null +++ b/allianceauth/static/js/jquery-ui/1.12.1/css/jquery-ui.min.css @@ -0,0 +1,6 @@ +/*! jQuery UI - v1.12.1 - 2021-06-10 +* http://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px} \ No newline at end of file diff --git a/allianceauth/templates/bundles/jquery-ui-css.html b/allianceauth/templates/bundles/jquery-ui-css.html index 970b5e9f..b7ddc1aa 100644 --- a/allianceauth/templates/bundles/jquery-ui-css.html +++ b/allianceauth/templates/bundles/jquery-ui-css.html @@ -1,3 +1,5 @@ - - - +{% load static %} + + + + diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 405776b8..495dc0bc 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -52,7 +52,7 @@ services: - auth_mysql grafana: - image: grafana/grafana:8.2 + image: grafana/grafana-oss:8.2 restart: always depends_on: - auth_mysql diff --git a/docs/features/core/groups.md b/docs/features/core/groups.md index 25fd16c2..0d75d327 100644 --- a/docs/features/core/groups.md +++ b/docs/features/core/groups.md @@ -90,11 +90,16 @@ This allows you to more finely control who has access to manage which groups. ### Auto Leave -By default in AA, Both requests and leaves for non-open groups must be approved by a group manager. If you wish to allow users to leave groups without requiring approvals, add the following lines to your `local.py` +By default, in AA both requests and leaves for non-open groups must be approved by a group manager. If you wish to allow users to leave groups without requiring approvals, add the following lines to your `local.py` ```python ## Allows users to freely leave groups without requiring approval. -AUTO_LEAVE = True +GROUPMANAGEMENT_AUTO_LEAVE = True +``` + +```eval_rst +.. note:: + Before you set `GROUPMANAGEMENT_AUTO_LEAVE = True`, make sure there are no pending leave requests, as this option will hide the "Leave Requests" tab. ``` ## Settings diff --git a/tox.ini b/tox.ini index 7012709f..b7b68ff9 100644 --- a/tox.ini +++ b/tox.ini @@ -1,7 +1,7 @@ [tox] skipsdist = true usedevelop = true -envlist = py{38,39,310}-{all,core} +envlist = py{38,39,310,311}-{all,core} [testenv] setenv = @@ -12,6 +12,7 @@ basepython = py38: python3.8 py39: python3.9 py310: python3.10 + py311: python3.11 deps= coverage install_command = pip install -e ".[testing]" -U {opts} {packages}