diff --git a/app/api/handlers/v1.py b/app/api/handlers/v1.py
index 3d3f41c..3c73db5 100644
--- a/app/api/handlers/v1.py
+++ b/app/api/handlers/v1.py
@@ -137,7 +137,10 @@ class OpTimerHandler(BaseHandler):
def read(self, request, id=None):
obj = get_object_or_404(EVEAccount, pk=settings.FULL_API_USER_ID)
- params = {'userID': obj.pk, 'apiKey': obj.api_key, 'characterID': settings.FULL_API_CHARACTER_ID}
+ if gargoyle.is_active('eve-cak'):
+ params = {'keyid': obj.pk, 'vcode': obj.api_key, 'characterID': settings.FULL_API_CHARACTER_ID}
+ else:
+ params = {'userID': obj.pk, 'apiKey': obj.api_key, 'characterID': settings.FULL_API_CHARACTER_ID}
error_doc = {'ops': [{'startsIn': -1, 'eventID': 0, 'ownerName': '', 'eventDate': '', 'eventTitle': '
The EVE API calendar is unavailable
', 'duration': 0, 'isImportant': 0, 'eventText': 'Fuck CCP tbqh imho srsly', 'endsIn':-1, 'forumLink': ''}]}
diff --git a/app/conf/common.py b/app/conf/common.py
index 61ba8af..88d809b 100644
--- a/app/conf/common.py
+++ b/app/conf/common.py
@@ -123,4 +123,20 @@ GARGOYLE_SWITCH_DEFAULTS = {
'label': 'HR Functions',
'description': 'Enables/Disables the HR functionality.',
},
+ 'eve-cak': {
+ 'is_active': False,
+ 'label': 'EVE Customizable API Keys',
+ 'description': 'Enables/Disables EVE API CAK support.',
+ },
+ 'eve-testapi': {
+ 'is_active': False,
+ 'label': 'EVE Test API Endpoints',
+ 'description': 'Use the Test API endpoints instead of Live.',
+ },
+ 'api-disableprocessing': {
+ 'is_active': False,
+ 'label': 'Disable API Backend Processing',
+ 'description': 'Disables backend processing for the EVE API, stops Auth hammering the API during outages',
+ }
+
}
diff --git a/app/eve_api/admin.py b/app/eve_api/admin.py
index e2d6c50..bd4a335 100644
--- a/app/eve_api/admin.py
+++ b/app/eve_api/admin.py
@@ -24,7 +24,7 @@ char_api_update.short_description = "Update character information from the EVE A
class EVEAccountAdmin(admin.ModelAdmin):
list_display = ('api_user_id', 'user', 'api_keytype', 'api_status', 'api_last_updated')
search_fields = ['api_user_id', 'user__username']
- readonly_fields = ('api_keytype', 'api_status', 'characters', 'api_last_updated', 'characters')
+ readonly_fields = ('api_keytype', 'api_status', 'api_accessmask', 'api_expiry', 'characters', 'api_last_updated')
actions = [account_api_update]
def save_model(self, request, obj, form, change):
@@ -39,11 +39,21 @@ class EVEAccountAdmin(admin.ModelAdmin):
admin.site.register(EVEAccount, EVEAccountAdmin)
+class EVEPlayerCharacterEmploymentHistoryInline(admin.TabularInline):
+ model = EVEPlayerCharacterEmploymentHistory
+ list_display = ('record_id', 'character', 'corporation', 'start_date', 'end_date')
+ search_fields = ['character__name', 'corporation__name', 'corporation__alliance__name']
+ readonly_fields = list_display
+ extra = 0
+ can_delete = False
+ verbose_name_plural = "Employment History"
+
class EVEPlayerCharacterAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'corporation')
search_fields = ['id', 'name']
fields = ('name', 'corporation', 'corporation_date', 'total_sp', 'last_login', 'last_logoff')
readonly_fields = ('name', 'corporation', 'corporation_date', 'total_sp', 'last_login', 'last_logoff')
+ inlines = [EVEPlayerCharacterEmploymentHistoryInline]
actions = [char_api_update]
def has_add_permission(self, request):
@@ -55,17 +65,12 @@ class EVEPlayerCharacterAdmin(admin.ModelAdmin):
admin.site.register(EVEPlayerCharacter, EVEPlayerCharacterAdmin)
+
class EVEPlayerCorporationInline(admin.TabularInline):
model = EVEPlayerCorporation
fields = ('name', 'ticker')
extra = 0
-
- def has_add_permission(self, request):
- return False
-
- def has_delete_permission(self, request, obj=None):
- return False
-
+ can_delete = False
class EVEPlayerAllianceAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'ticker', 'member_count', 'date_founded')
diff --git a/app/eve_api/app_defines.py b/app/eve_api/app_defines.py
index c13f456..73f85ba 100644
--- a/app/eve_api/app_defines.py
+++ b/app/eve_api/app_defines.py
@@ -19,11 +19,17 @@ API_STATUS_CHOICES = (
API_KEYTYPE_UNKNOWN = 0
API_KEYTYPE_LIMITED = 1
API_KEYTYPE_FULL = 2
+API_KEYTYPE_CORPORATION = 3
+API_KEYTYPE_CHARACTER = 4
+API_KEYTYPE_ACCOUNT = 5
API_KEYTYPE_CHOICES = (
(API_KEYTYPE_UNKNOWN, 'Unknown'),
(API_KEYTYPE_LIMITED, 'Limited'),
(API_KEYTYPE_FULL, 'Full'),
+ (API_KEYTYPE_CORPORATION, 'Corporation'),
+ (API_KEYTYPE_CHARACTER, 'Character'),
+ (API_KEYTYPE_ACCOUNT, 'Account'),
)
API_GENDER_MALE = 1
diff --git a/app/eve_api/forms.py b/app/eve_api/forms.py
index 3495f8f..7c12f11 100644
--- a/app/eve_api/forms.py
+++ b/app/eve_api/forms.py
@@ -1,6 +1,8 @@
import re
from django import forms
+from gargoyle import gargoyle
+
from eve_api.models import EVEAccount, EVEPlayerCharacter, EVEPlayerCorporation
@@ -20,9 +22,13 @@ class EveAPIForm(forms.ModelForm):
# We're editing a existing instance, readonly the userid
self.fields['api_user_id'].widget.attrs['readonly'] = True
+ if gargoyle.is_active('eve-cak'):
+ self.fields['api_user_id'].label = 'Key ID'
+ self.fields['api_key'].label = 'Verification Code'
+
def clean_api_key(self):
- if not len(self.cleaned_data['api_key']) == 64:
+ if not gargoyle.is_active('eve-cak') and not len(self.cleaned_data['api_key']) == 64:
raise forms.ValidationError("Provided API Key is not 64 characters long.")
if re.search(r'[^\.a-zA-Z0-9]', self.cleaned_data['api_key']):
diff --git a/app/eve_api/migrations/0016_account_cak_fields.py b/app/eve_api/migrations/0016_account_cak_fields.py
new file mode 100644
index 0000000..0dc7fc5
--- /dev/null
+++ b/app/eve_api/migrations/0016_account_cak_fields.py
@@ -0,0 +1,170 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'EVEAccount.api_accessmask'
+ db.add_column('eve_api_eveaccount', 'api_accessmask', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
+
+ # Adding field 'EVEAccount.api_characterid'
+ db.add_column('eve_api_eveaccount', 'api_characterid', self.gf('django.db.models.fields.IntegerField')(default=0), keep_default=False)
+
+ # Adding field 'EVEAccount.api_expiry'
+ db.add_column('eve_api_eveaccount', 'api_expiry', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'EVEAccount.api_accessmask'
+ db.delete_column('eve_api_eveaccount', 'api_accessmask')
+
+ # Deleting field 'EVEAccount.api_characterid'
+ db.delete_column('eve_api_eveaccount', 'api_characterid')
+
+ # Deleting field 'EVEAccount.api_expiry'
+ db.delete_column('eve_api_eveaccount', 'api_expiry')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'eve_api.eveaccount': {
+ 'Meta': {'ordering': "['api_user_id']", 'object_name': 'EVEAccount'},
+ 'api_accessmask': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_characterid': ('django.db.models.fields.IntegerField', [], {}),
+ 'api_expiry': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_key': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'api_keytype': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_user_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+ 'characters': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['eve_api.EVEPlayerCharacter']", 'null': 'True', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveplayeralliance': {
+ 'Meta': {'ordering': "['date_founded']", 'object_name': 'EVEPlayerAlliance'},
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'date_founded': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'executor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCorporation']", 'null': 'True', 'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'member_count': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'ticker': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'})
+ },
+ 'eve_api.eveplayercharacter': {
+ 'Meta': {'object_name': 'EVEPlayerCharacter'},
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_charisma': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_intelligence': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_memory': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_perception': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_willpower': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'balance': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'corporation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCorporation']", 'null': 'True', 'blank': 'True'}),
+ 'corporation_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'current_location_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'gender': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'last_logoff': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'race': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'roles': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['eve_api.EVEPlayerCharacterRole']", 'null': 'True', 'blank': 'True'}),
+ 'security_status': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'skills': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['eve_api.EVESkill']", 'through': "orm['eve_api.EVEPlayerCharacterSkill']", 'symmetrical': 'False'}),
+ 'total_sp': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveplayercharacterrole': {
+ 'Meta': {'object_name': 'EVEPlayerCharacterRole'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'roleid': ('django.db.models.fields.CharField', [], {'max_length': '64'})
+ },
+ 'eve_api.eveplayercharacterskill': {
+ 'Meta': {'object_name': 'EVEPlayerCharacterSkill'},
+ 'character': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCharacter']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'in_training': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'skill': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVESkill']"}),
+ 'skillpoints': ('django.db.models.fields.IntegerField', [], {'default': '0'})
+ },
+ 'eve_api.eveplayercorporation': {
+ 'Meta': {'object_name': 'EVEPlayerCorporation'},
+ 'alliance': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerAlliance']", 'null': 'True', 'blank': 'True'}),
+ 'alliance_join_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'ceo_character': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCharacter']", 'null': 'True', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'logo_color1': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_color2': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_color3': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_graphic_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape1': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape2': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape3': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'member_count': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'shares': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'tax_rate': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'ticker': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveskill': {
+ 'Meta': {'object_name': 'EVESkill'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVESkillGroup']", 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+ },
+ 'eve_api.eveskillgroup': {
+ 'Meta': {'object_name': 'EVESkillGroup'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+ }
+ }
+
+ complete_apps = ['eve_api']
diff --git a/app/eve_api/migrations/0017_remove_characterid_field.py b/app/eve_api/migrations/0017_remove_characterid_field.py
new file mode 100644
index 0000000..8ccaf2c
--- /dev/null
+++ b/app/eve_api/migrations/0017_remove_characterid_field.py
@@ -0,0 +1,157 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Deleting field 'EVEAccount.api_characterid'
+ db.delete_column('eve_api_eveaccount', 'api_characterid')
+
+
+ def backwards(self, orm):
+
+ # User chose to not deal with backwards NULL issues for 'EVEAccount.api_characterid'
+ raise RuntimeError("Cannot reverse this migration. 'EVEAccount.api_characterid' and its values cannot be restored.")
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'eve_api.eveaccount': {
+ 'Meta': {'ordering': "['api_user_id']", 'object_name': 'EVEAccount'},
+ 'api_accessmask': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_expiry': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_key': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'api_keytype': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_user_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+ 'characters': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['eve_api.EVEPlayerCharacter']", 'null': 'True', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveplayeralliance': {
+ 'Meta': {'ordering': "['date_founded']", 'object_name': 'EVEPlayerAlliance'},
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'date_founded': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'executor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCorporation']", 'null': 'True', 'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'member_count': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'ticker': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'})
+ },
+ 'eve_api.eveplayercharacter': {
+ 'Meta': {'object_name': 'EVEPlayerCharacter'},
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_charisma': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_intelligence': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_memory': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_perception': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_willpower': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'balance': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'corporation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCorporation']", 'null': 'True', 'blank': 'True'}),
+ 'corporation_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'current_location_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'gender': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'last_logoff': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'race': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'roles': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['eve_api.EVEPlayerCharacterRole']", 'null': 'True', 'blank': 'True'}),
+ 'security_status': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'skills': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['eve_api.EVESkill']", 'through': "orm['eve_api.EVEPlayerCharacterSkill']", 'symmetrical': 'False'}),
+ 'total_sp': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveplayercharacterrole': {
+ 'Meta': {'object_name': 'EVEPlayerCharacterRole'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'roleid': ('django.db.models.fields.CharField', [], {'max_length': '64'})
+ },
+ 'eve_api.eveplayercharacterskill': {
+ 'Meta': {'object_name': 'EVEPlayerCharacterSkill'},
+ 'character': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCharacter']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'in_training': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'skill': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVESkill']"}),
+ 'skillpoints': ('django.db.models.fields.IntegerField', [], {'default': '0'})
+ },
+ 'eve_api.eveplayercorporation': {
+ 'Meta': {'object_name': 'EVEPlayerCorporation'},
+ 'alliance': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerAlliance']", 'null': 'True', 'blank': 'True'}),
+ 'alliance_join_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'ceo_character': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCharacter']", 'null': 'True', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'logo_color1': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_color2': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_color3': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_graphic_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape1': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape2': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape3': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'member_count': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'shares': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'tax_rate': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'ticker': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveskill': {
+ 'Meta': {'object_name': 'EVESkill'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVESkillGroup']", 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+ },
+ 'eve_api.eveskillgroup': {
+ 'Meta': {'object_name': 'EVESkillGroup'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+ }
+ }
+
+ complete_apps = ['eve_api']
diff --git a/app/eve_api/migrations/0018_auto__add_eveplayercharacteremploymenthistory.py b/app/eve_api/migrations/0018_auto__add_eveplayercharacteremploymenthistory.py
new file mode 100644
index 0000000..2f14edc
--- /dev/null
+++ b/app/eve_api/migrations/0018_auto__add_eveplayercharacteremploymenthistory.py
@@ -0,0 +1,170 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding model 'EVEPlayerCharacterEmploymentHistory'
+ db.create_table('eve_api_eveplayercharacteremploymenthistory', (
+ ('record_id', self.gf('django.db.models.fields.IntegerField')(primary_key=True)),
+ ('character', self.gf('django.db.models.fields.related.ForeignKey')(related_name='employmenthistory', to=orm['eve_api.EVEPlayerCharacter'])),
+ ('corporation', self.gf('django.db.models.fields.related.ForeignKey')(related_name='+', to=orm['eve_api.EVEPlayerCorporation'])),
+ ('start_date', self.gf('django.db.models.fields.DateTimeField')()),
+ ))
+ db.send_create_signal('eve_api', ['EVEPlayerCharacterEmploymentHistory'])
+
+
+ def backwards(self, orm):
+
+ # Deleting model 'EVEPlayerCharacterEmploymentHistory'
+ db.delete_table('eve_api_eveplayercharacteremploymenthistory')
+
+
+ models = {
+ 'auth.group': {
+ 'Meta': {'object_name': 'Group'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+ 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+ },
+ 'auth.permission': {
+ 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+ 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'auth.user': {
+ 'Meta': {'object_name': 'User'},
+ 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+ 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+ 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+ 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
+ },
+ 'contenttypes.contenttype': {
+ 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+ 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+ },
+ 'eve_api.eveaccount': {
+ 'Meta': {'ordering': "['api_user_id']", 'object_name': 'EVEAccount'},
+ 'api_accessmask': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_expiry': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_key': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'api_keytype': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_status': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'api_user_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+ 'characters': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['eve_api.EVEPlayerCharacter']", 'null': 'True', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveplayeralliance': {
+ 'Meta': {'ordering': "['date_founded']", 'object_name': 'EVEPlayerAlliance'},
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'date_founded': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'executor': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCorporation']", 'null': 'True', 'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'member_count': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'ticker': ('django.db.models.fields.CharField', [], {'max_length': '15', 'blank': 'True'})
+ },
+ 'eve_api.eveplayercharacter': {
+ 'Meta': {'object_name': 'EVEPlayerCharacter'},
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_charisma': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_intelligence': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_memory': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_perception': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'attrib_willpower': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'balance': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'corporation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCorporation']", 'null': 'True', 'blank': 'True'}),
+ 'corporation_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'current_location_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'gender': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'last_login': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'last_logoff': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
+ 'race': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'roles': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['eve_api.EVEPlayerCharacterRole']", 'null': 'True', 'blank': 'True'}),
+ 'security_status': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'skills': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['eve_api.EVESkill']", 'through': "orm['eve_api.EVEPlayerCharacterSkill']", 'symmetrical': 'False'}),
+ 'total_sp': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveplayercharacteremploymenthistory': {
+ 'Meta': {'object_name': 'EVEPlayerCharacterEmploymentHistory'},
+ 'character': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'employmenthistory'", 'to': "orm['eve_api.EVEPlayerCharacter']"}),
+ 'corporation': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['eve_api.EVEPlayerCorporation']"}),
+ 'record_id': ('django.db.models.fields.IntegerField', [], {'primary_key': 'True'}),
+ 'start_date': ('django.db.models.fields.DateTimeField', [], {})
+ },
+ 'eve_api.eveplayercharacterrole': {
+ 'Meta': {'object_name': 'EVEPlayerCharacterRole'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'roleid': ('django.db.models.fields.CharField', [], {'max_length': '64'})
+ },
+ 'eve_api.eveplayercharacterskill': {
+ 'Meta': {'object_name': 'EVEPlayerCharacterSkill'},
+ 'character': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCharacter']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'in_training': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'skill': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVESkill']"}),
+ 'skillpoints': ('django.db.models.fields.IntegerField', [], {'default': '0'})
+ },
+ 'eve_api.eveplayercorporation': {
+ 'Meta': {'object_name': 'EVEPlayerCorporation'},
+ 'alliance': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerAlliance']", 'null': 'True', 'blank': 'True'}),
+ 'alliance_join_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}),
+ 'api_last_updated': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+ 'ceo_character': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCharacter']", 'null': 'True', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'logo_color1': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_color2': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_color3': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_graphic_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape1': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape2': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'logo_shape3': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'member_count': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+ 'shares': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+ 'tax_rate': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+ 'ticker': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
+ 'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
+ },
+ 'eve_api.eveskill': {
+ 'Meta': {'object_name': 'EVESkill'},
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVESkillGroup']", 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+ },
+ 'eve_api.eveskillgroup': {
+ 'Meta': {'object_name': 'EVESkillGroup'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
+ }
+ }
+
+ complete_apps = ['eve_api']
diff --git a/app/eve_api/models/account.py b/app/eve_api/models/account.py
index 8b952d4..cddc99f 100644
--- a/app/eve_api/models/account.py
+++ b/app/eve_api/models/account.py
@@ -26,6 +26,12 @@ class EVEAccount(EVEAPIModel):
default=API_KEYTYPE_UNKNOWN,
verbose_name="API Key Type",
help_text="Type of API key")
+ api_accessmask = models.IntegerField(default=0,
+ verbose_name="API Key Access Mask",
+ help_text="Describes the level of access this API key gives to the user's data")
+ api_expiry = models.DateTimeField(blank=True, null=True,
+ verbose_name="API Key Expiry Date",
+ help_text="Indicates when the API key will expire.")
def __unicode__(self):
return u"%s" % self.pk
@@ -33,10 +39,39 @@ class EVEAccount(EVEAPIModel):
def in_corp(self, corpid):
return self.character.filter(corporation__id=corpid).count()
+ @staticmethod
+ def _mask_check(accessmask, bit):
+ """ Returns a bool indicating if the bit is set in the accessmask """
+ mask = 1 << bit
+ return (accessmask & mask) > 0
+
+ def has_access(self, bit):
+ """ Checks if a specific bit is enabled in the key's access mask """
+ return self._mask_check(self.api_accessmask, bit)
+
+ def check_access(self, accessmask):
+ """ Checks if the account has equal or higher access than the bitmask provided """
+
+ length = 0
+ i = accessmask
+ while i:
+ i >>= 1
+ length += 1
+
+ for bit in range(0, length-1):
+ if self._mask_check(accessmask, bit) and not self.has_access(bit):
+ return False
+
+ return True
+
@property
def training(self):
return self.characters.filter(eveplayercharacterskill__in_training__gt=0).count()
+ @property
+ def is_cak(self):
+ return self.api_keytype in [API_KEYTYPE_CHARACTER, API_KEYTYPE_CORPORATION, API_KEYTYPE_ACCOUNT]
+
class Meta:
app_label = 'eve_api'
verbose_name = 'EVE Account'
diff --git a/app/eve_api/models/character.py b/app/eve_api/models/character.py
index 350c274..90451ae 100644
--- a/app/eve_api/models/character.py
+++ b/app/eve_api/models/character.py
@@ -23,6 +23,30 @@ class EVEPlayerCharacterSkill(models.Model):
verbose_name_plural = 'Player Character Skills'
+class EVEPlayerCharacterEmploymentHistory(models.Model):
+ """
+ Player's corporation history
+ """
+ record_id = models.IntegerField(primary_key=True, verbose_name="Record ID")
+ character = models.ForeignKey('eve_api.EVEPlayerCharacter', related_name='employmenthistory')
+ corporation = models.ForeignKey('eve_api.EVEPlayerCorporation', related_name='+')
+ start_date = models.DateTimeField(blank=False, null=False, verbose_name="Corporation Join Date")
+
+ @property
+ def end_date(self):
+ if self.character.employmenthistory.filter(record_id__gt=self.record_id).count():
+ return self.character.employmenthistory.filter(record_id__gt=self.record_id)[0].start_date
+ return None
+
+ def __unicode__(self):
+ return u'%s - %s - %s' % (self.record_id, self.character, self.corporation)
+
+ class Meta:
+ app_label = 'eve_api'
+ verbose_name = 'Player Character Employment History'
+ verbose_name_plural = 'Player Character Employment Histories'
+
+
class EVEPlayerCharacter(EVEAPIModel):
"""
Represents an individual player character within the game. Not to be
diff --git a/app/eve_api/models/corporation.py b/app/eve_api/models/corporation.py
index 64b9e66..cdcea1b 100644
--- a/app/eve_api/models/corporation.py
+++ b/app/eve_api/models/corporation.py
@@ -47,7 +47,10 @@ class EVEPlayerCorporation(EVEAPIModel):
@property
def director_api_keys(self):
- return self.directors.filter(eveaccount__isnull=False, eveaccount__api_keytype=API_KEYTYPE_FULL, eveaccount__api_status=API_STATUS_OK)
+ if gargoyle.is_active('eve-cak'):
+ return self.directors.filter(eveaccount__isnull=False, eveaccount__api_keytype__in=[API_KEYTYPE_CORPORATION, API_KEYTYPE_FULL], eveaccount__api_status=API_STATUS_OK)
+ else:
+ return self.directors.filter(eveaccount__isnull=False, eveaccount__api_keytype=API_KEYTYPE_FULL, eveaccount__api_status=API_STATUS_OK)
@property
def api_key_coverage(self):
diff --git a/app/eve_api/tasks/account.py b/app/eve_api/tasks/account.py
index 5751be8..7292616 100644
--- a/app/eve_api/tasks/account.py
+++ b/app/eve_api/tasks/account.py
@@ -5,6 +5,7 @@ import logging
from celery.decorators import task
from celery.task.sets import TaskSet
+from gargoyle import gargoyle
from eve_proxy.exceptions import *
from eve_proxy.models import CachedDocument
@@ -27,18 +28,26 @@ def queue_apikey_updates(update_delay=86400, batch_size=50):
"""
log = queue_apikey_updates.get_logger()
+
+ if gargoyle.is_active('api-disableprocessing'):
+ log.info("Backend processing disabled, exiting")
+ return
+
# Update all the eve accounts and related corps
delta = timedelta(seconds=update_delay)
log.info("Updating APIs older than %s" % (datetime.now() - delta))
- accounts = EVEAccount.objects.filter(api_last_updated__lt=(datetime.now() - delta)).exclude(api_status=API_STATUS_ACC_EXPIRED).exclude(api_status=API_STATUS_AUTH_ERROR).order_by('api_last_updated')[:batch_size]
+ if gargoyle.is_active('eve-cak'):
+ accounts = EVEAccount.objects.filter(api_last_updated__lt=(datetime.now() - delta)).exclude(api_status=API_STATUS_ACC_EXPIRED).exclude(api_status=API_STATUS_AUTH_ERROR).order_by('api_last_updated')[:batch_size]
+ else:
+ accounts = EVEAccount.objects.filter(api_last_updated__lt=(datetime.now() - delta)).exclude(api_status=API_STATUS_ACC_EXPIRED).exclude(api_status=API_STATUS_AUTH_ERROR).exclude(api_keytype__gt=2).order_by('api_last_updated')[:batch_size]
log.info("%s account(s) to update" % accounts.count())
for acc in accounts:
- log.debug("Queueing UserID %s for update" % acc.api_user_id)
+ log.debug("Queueing UserID %s for update" % acc.pk)
if not acc.user:
acc.delete()
continue
- import_apikey.delay(api_key=acc.api_key, api_userid=acc.api_user_id)
+ import_apikey.delay(api_key=acc.api_key, api_userid=acc.pk)
@task(ignore_result=True)
@@ -76,78 +85,123 @@ def import_apikey_result(api_userid, api_key, user=None, force_cache=False, call
def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=logging.getLogger(__name__)):
log.info('Importing %s/%s' % (api_userid, api_key))
- auth_params = {'userid': api_userid, 'apikey': api_key}
- account_doc = CachedDocument.objects.api_query('/account/Characters.xml.aspx', params=auth_params, no_cache=force_cache)
+ try:
+ account = EVEAccount.objects.get(pk=api_userid)
+ except EVEAccount.DoesNotExist:
+ account = None
- doc = basic_xml_parse_doc(account_doc)['eveapi']
+ # Use CAK if enabled and either a new key or flagged as so
+ if (gargoyle.is_active('eve-cak') and (not account or account.is_cak)):
+ auth_params = {'keyid': api_userid, 'vcode': api_key}
+ keycheck = CachedDocument.objects.api_query('/account/APIKeyInfo.xml.aspx', params=auth_params, no_cache=True)
+ doc = basic_xml_parse_doc(keycheck)['eveapi']
- # Checks for a document error
- if 'error' in doc:
- try:
- account = EVEAccount.objects.get(api_user_id=api_userid)
- except EVEAccount.DoesNotExist:
- # If no Account exists in the DB, just ignore it
- return
+ if not 'error' in doc:
+ if not account:
+ account, created = EVEAccount.objects.get_or_create(pk=api_userid)
+ if user:
+ account.user = User.objects.get(id=user)
+ if not account.api_key == api_key:
+ account.api_key = api_key
+
+ keydoc = doc['result']['key']
+ if keydoc['type'] == 'Character':
+ account.api_keytype = API_KEYTYPE_CHARACTER
+ elif keydoc['type'] == 'Corporation':
+ account.api_keytype = API_KEYTYPE_CORPORATION
+ elif keydoc['type'] == 'Account':
+ account.api_keytype = API_KEYTYPE_ACCOUNT
+ account.api_accessmask = keydoc['accessMask']
+ if not keydoc['expires'] == '':
+ account.api_expiry = datetime.strptime(keydoc['expires'], '%Y-%m-%d %H:%M:%S')
+ account.api_status = API_STATUS_OK
+
+ # Remove deleted or traded characters
+ newcharlist = [int(char['characterID']) for char in doc['result']['key']['characters']]
+ for char in account.characters.all().exclude(id__in=newcharlist):
+ account.characters.remove(char)
+
+ # Schedule a task to update the characters
+ if account.user:
+ cb = update_user_access.subtask(kwargs={'user': account.user.id })
+ else:
+ cb = None
+ import_eve_characters.delay(account.characters.all().values_list('id', flat=True), key_id=account.pk, callback=cb)
- error = doc['error']['code']
- if int(error) >= 500:
- # API disabled, down or rejecting, return without changes
- return
- elif error in ['202', '203', '204', '205', '212']:
- account.api_status = API_STATUS_AUTH_ERROR
- elif error == '211':
- account.api_status = API_STATUS_ACC_EXPIRED
else:
- account.api_status = API_STATUS_OTHER_ERROR
- account.api_last_updated = datetime.utcnow()
- account.save()
- if account.user:
- update_user_access.delay(account.user.id)
- return account
+ # No account object, just return
+ if not account:
+ return
- # Create or retrieve the account last to make sure everything
- # before here is good to go.
- account, created = EVEAccount.objects.get_or_create(api_user_id=api_userid)
- if not account.api_key == api_key:
- account.api_key = api_key
- account.api_keytype = API_KEYTYPE_UNKNOWN
- account.api_status = API_STATUS_OK
- if user and created:
- account.user = User.objects.get(id=user)
+ error = doc['error']['code']
+ if int(error) >= 500:
+ # API disabled, down or rejecting, return without changes
+ return
+ elif error in ['202', '203', '204', '205', '212']:
+ account.api_status = API_STATUS_AUTH_ERROR
+ elif error == '211':
+ account.api_status = API_STATUS_ACC_EXPIRED
+ else:
+ account.api_status = API_STATUS_OTHER_ERROR
+
+ if account.user:
+ update_user_access.delay(account.user.id)
+
+ else:
+ auth_params = {'userid': api_userid, 'apikey': api_key}
+ account_doc = CachedDocument.objects.api_query('/account/Characters.xml.aspx', params=auth_params, no_cache=force_cache)
+ doc = basic_xml_parse_doc(account_doc)['eveapi']
+
+ if not 'error' in doc:
+ if not account:
+ account, created = EVEAccount.objects.get_or_create(pk=api_userid)
+ if user:
+ account.user = User.objects.get(id=user)
+ if not account.api_key == api_key:
+ account.api_key = api_key
+ account.api_status = API_STATUS_OK
+
+ keycheck = CachedDocument.objects.api_query('/account/AccountStatus.xml.aspx', params=auth_params, no_cache=True)
+ keydoc = basic_xml_parse_doc(keycheck)['eveapi']
+ if 'error' in keydoc:
+ account.api_keytype = API_KEYTYPE_LIMITED
+ elif not 'error' in keydoc:
+ account.api_keytype = API_KEYTYPE_FULL
+ else:
+ account.api_keytype = API_KEYTYPE_UNKNOWN
+
+ # Remove deleted or traded characters
+ newcharlist = [int(char['characterID']) for char in doc['result']['characters']]
+ for char in account.characters.all().exclude(id__in=newcharlist):
+ account.characters.remove(char)
+
+ # Schedule a task to update the characters
+ if account.user:
+ cb = update_user_access.subtask(kwargs={'user': account.user.id })
+ else:
+ cb = None
+ import_eve_characters.delay(account.characters.all().values_list('id', flat=True), key_id=account.pk, callback=cb)
+
+ else:
+ # No account object, just return
+ if not account:
+ return
+
+ error = doc['error']['code']
+ if int(error) >= 500:
+ # API disabled, down or rejecting, return without changes
+ return
+ elif error in ['202', '203', '204', '205', '212']:
+ account.api_status = API_STATUS_AUTH_ERROR
+ elif error == '211':
+ account.api_status = API_STATUS_ACC_EXPIRED
+ else:
+ account.api_status = API_STATUS_OTHER_ERROR
+
+ if account.user:
+ update_user_access.delay(account.user.id)
account.api_last_updated = datetime.utcnow()
account.save()
-
- # Check API keytype if we have a character and a unknown key status
- if account.api_keytype == API_KEYTYPE_UNKNOWN:
- keycheck = CachedDocument.objects.api_query('/account/AccountStatus.xml.aspx', params=auth_params, no_cache=True)
- keydoc = basic_xml_parse_doc(keycheck)['eveapi']
-
- if 'error' in keydoc:
- account.api_keytype = API_KEYTYPE_LIMITED
- elif not 'error' in keydoc:
- account.api_keytype = API_KEYTYPE_FULL
- else:
- account.api_keytype = API_KEYTYPE_UNKNOWN
-
- account.api_last_updated = datetime.utcnow()
- account.save()
-
- tasklist = []
-
- # Process the account's character list
- charlist = set(account.characters.all().values_list('id', flat=True))
- newcharlist = [int(char['characterID']) for char in doc['result']['characters']]
-
- log.info("[CHAR] Current %s, New: %s, Remove: %s" % (charlist, newcharlist, set(charlist - set(newcharlist))))
-
- for char in account.characters.filter(id__in=set(charlist - set(newcharlist))):
- account.characters.remove(char)
-
- if account.user:
- cb = update_user_access.subtask(kwargs={'user': account.user.id })
- else:
- cb = None
- import_eve_characters.delay(newcharlist, api_key, api_userid, callback=cb)
-
return account
+
diff --git a/app/eve_api/tasks/character.py b/app/eve_api/tasks/character.py
index 785408c..89ee90c 100644
--- a/app/eve_api/tasks/character.py
+++ b/app/eve_api/tasks/character.py
@@ -4,18 +4,19 @@ import logging
from celery.decorators import task
from celery.task.sets import subtask
+from gargoyle import gargoyle
from eve_proxy.exceptions import *
from eve_proxy.models import CachedDocument
from eve_api.api_exceptions import *
-from eve_api.models import EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerCharacterRole, EVEPlayerCharacterSkill, EVESkill, EVEAccount
+from eve_api.models import EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerCharacterRole, EVEPlayerCharacterSkill, EVESkill, EVEAccount, EVEPlayerCharacterEmploymentHistory
from eve_api.app_defines import *
from eve_api.utils import basic_xml_parse, basic_xml_parse_doc
@task()
-def import_eve_character(character_id, api_key=None, user_id=None, callback=None, **kwargs):
+def import_eve_character(character_id, key_id=None, callback=None, **kwargs):
"""
Imports a character from the API, providing a API key will populate
further details. Returns a single EVEPlayerCharacter object
@@ -24,10 +25,10 @@ def import_eve_character(character_id, api_key=None, user_id=None, callback=None
log = import_eve_character.get_logger()
try:
- pchar = import_eve_character_func(character_id, api_key, user_id, log)
+ pchar = import_eve_character_func(character_id, key_id, log)
except APIAccessException, exc:
log.error('Error importing character - flagging for retry')
- import_eve_character.retry(args=[character_id, api_key, user_id, callback], exc=exc, kwargs=kwargs)
+ import_eve_character.retry(args=[character_id, key_id, callback], exc=exc, kwargs=kwargs)
if not pchar:
log.error('Error importing character %s' % character_id)
@@ -39,7 +40,7 @@ def import_eve_character(character_id, api_key=None, user_id=None, callback=None
@task()
-def import_eve_characters(character_list, api_key=None, user_id=None, callback=None, **kwargs):
+def import_eve_characters(character_list, key_id=None, callback=None, **kwargs):
"""
Imports characters from the API, providing a API key will populate
further details. Returns a list of EVEPlayerCharacter objects
@@ -48,17 +49,17 @@ def import_eve_characters(character_list, api_key=None, user_id=None, callback=N
log = import_eve_characters.get_logger()
try:
- results = [import_eve_character_func(char, api_key, user_id, log) for char in character_list]
+ results = [import_eve_character_func(char, key_id, log) for char in character_list]
except APIAccessException, exc:
log.error('Error importing characters - flagging for retry')
- import_eve_characters.retry(args=[character_list, api_key, user_id, callback], exc=exc, kwargs=kwargs)
+ import_eve_characters.retry(args=[character_list, key_id, callback], exc=exc, kwargs=kwargs)
if callback:
subtask(callback).delay(characters=results)
else:
return results
-def import_eve_character_func(character_id, api_key=None, user_id=None, logger=logging.getLogger(__name__)):
+def import_eve_character_func(character_id, key_id=None, logger=logging.getLogger(__name__)):
try:
char_doc = CachedDocument.objects.api_query('/eve/CharacterInfo.xml.aspx', params={'characterID': character_id}, no_cache=False)
@@ -82,7 +83,7 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
pchar.security_status = values['securityStatus']
# Set corporation and join date
- corp, created = EVEPlayerCorporation.objects.get_or_create(id=values['corporationID'])
+ corp, created = EVEPlayerCorporation.objects.get_or_create(pk=values['corporationID'])
from eve_api.tasks.corporation import import_corp_details
if created or not corp.name or corp.api_last_updated < (datetime.utcnow() - timedelta(hours=12)):
import_corp_details.delay(values['corporationID'])
@@ -97,9 +98,34 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
pchar.race = val
break
- # If we have a valid API key, import the full character sheet
- if api_key and user_id:
- auth_params = {'userID': user_id, 'apiKey': api_key, 'characterID': character_id }
+ # Import employment history if its made available
+ if 'employmentHistory' in values:
+ reclist = pchar.employmenthistory.values_list('pk', flat=True)
+ for emp in values['employmentHistory']:
+ if not emp['recordID'] in reclist:
+ corp, created = EVEPlayerCorporation.objects.get_or_create(pk=emp['corporationID'])
+ if created:
+ import_corp_details.delay(emp['corporationID'])
+ eobj, created = EVEPlayerCharacterEmploymentHistory.objects.get_or_create(pk=emp['recordID'], corporation=corp, character=pchar, start_date=emp['startDate'])
+
+ # We've been passed a Key ID, try and work with it
+ if key_id:
+ try:
+ acc = EVEAccount.objects.get(pk=key_id)
+ except EVEAccount.DoesNotExist:
+ acc = None
+ else:
+ acc = None
+
+ # Actual Key? Get further information
+ if acc:
+ if gargoyle.is_active('eve-cak') and acc.is_cak:
+ if not acc.has_access(3):
+ logger.error('Key %s does not have access to CharacterSheet' % acc.pk)
+ raise APIAccessException
+ auth_params = {'keyid': acc.api_user_id, 'vcode': acc.api_key, 'characterid': character_id }
+ else:
+ auth_params = {'userID': acc.api_user_id, 'apiKey': acc.api_key, 'characterID': character_id }
try:
char_doc = CachedDocument.objects.api_query('/char/CharacterSheet.xml.aspx', params=auth_params, no_cache=False)
except DocumentRetrievalError, exc:
@@ -121,7 +147,7 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
# Process the character's skills
pchar.total_sp = 0
for skill in values.get('skills', None):
- skillobj, created = EVESkill.objects.get_or_create(id=skill['typeID'])
+ skillobj, created = EVESkill.objects.get_or_create(pk=skill['typeID'])
charskillobj, created = EVEPlayerCharacterSkill.objects.get_or_create(skill=skillobj, character=pchar)
if created or not charskillobj.level == int(skill['level']) or not charskillobj.skillpoints == int(skill['skillpoints']):
charskillobj.level = int(skill['level'])
@@ -139,7 +165,7 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
queuedoc = queuedoc['eveapi']['result']
EVEPlayerCharacterSkill.objects.filter(character=pchar).update(in_training=0)
if int(queuedoc['skillInTraining']):
- skillobj, created = EVESkill.objects.get_or_create(id=queuedoc['trainingTypeID'])
+ skillobj, created = EVESkill.objects.get_or_create(pk=queuedoc['trainingTypeID'])
charskillobj, created = EVEPlayerCharacterSkill.objects.get_or_create(skill=skillobj, character=pchar)
charskillobj.in_training = queuedoc['trainingToLevel']
charskillobj.save()
@@ -157,19 +183,14 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
else:
pchar.gender = API_GENDER_FEMALE
-
pchar.api_last_updated = datetime.utcnow()
pchar.save()
- try:
- acc = EVEAccount.objects.get(pk=user_id)
+ if acc:
if not pchar.id in acc.characters.all().values_list('id', flat=True):
acc.characters.add(pchar)
-
- if pchar.director and acc.api_keytype == API_KEYTYPE_FULL:
+ if pchar.director and acc.api_keytype in [API_KEYTYPE_FULL, API_KEYTYPE_CORPORATION]:
from eve_api.tasks.corporation import import_corp_members
- import_corp_members.delay(api_key=api_key, api_userid=user_id, character_id=pchar.id)
- except EVEAccount.DoesNotExist:
- pass
+ import_corp_members.delay(key_id=acc.pk, character_id=pchar.id)
return pchar
diff --git a/app/eve_api/tasks/corporation.py b/app/eve_api/tasks/corporation.py
index 514bcaf..91ae486 100644
--- a/app/eve_api/tasks/corporation.py
+++ b/app/eve_api/tasks/corporation.py
@@ -4,10 +4,12 @@ from datetime import datetime, timedelta
from xml.dom import minidom
from celery.decorators import task
+from gargoyle import gargoyle
from eve_proxy.models import CachedDocument
from eve_proxy.exceptions import DocumentRetrievalError
-from eve_api.models import EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerAlliance
+from eve_api.models import EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerAlliance, EVEAccount
+from eve_api.app_defines import *
from eve_api.utils import basic_xml_parse_doc
from eve_api.tasks.character import import_eve_character
from eve_api.api_exceptions import APIAccessException
@@ -110,7 +112,7 @@ def link_ceo(corporation, character):
@task(ignore_result=True)
-def import_corp_members(api_userid, api_key, character_id):
+def import_corp_members(key_id, character_id):
"""
This function pulls all corporation members from the EVE API using a director's
API key. It'll add as much information as it can about the character.
@@ -118,8 +120,19 @@ def import_corp_members(api_userid, api_key, character_id):
log = import_corp_members.get_logger()
+ try:
+ acc = EVEAccount.objects.get(pk=key_id)
+ except EVEAccount.DoesNotExist:
+ return
+
# grab and decode /corp/MemberTracking.xml.aspx
- auth_params = {'userID': api_userid, 'apiKey': api_key, 'characterID': character_id }
+ if gargoyle.is_active('eve-cak') and acc.api_keytype == API_KEYTYPE_CORPORATION:
+ if not acc.has_access(11):
+ log.error('Key does not have access to MemberTracking', extra={'data': {'key_id': key_id, 'character_id': character_id}})
+ return
+ auth_params = {'keyid': acc.api_user_id, 'vcode': acc.api_key, 'characterID': character_id }
+ else:
+ auth_params = {'userID': acc.api_user_id, 'apiKey': acc.api_key, 'characterID': character_id }
char_doc = CachedDocument.objects.api_query('/corp/MemberTracking.xml.aspx',
params=auth_params,
no_cache=False,
@@ -127,7 +140,7 @@ def import_corp_members(api_userid, api_key, character_id):
pdoc = basic_xml_parse_doc(char_doc)
if not 'eveapi' in pdoc or not 'result' in pdoc['eveapi']:
- log.error('Invalid XML document / API Error recceived', extra={'data': {'xml': char_doc.body, 'api_userid': api_userid, 'api_key': api_key, 'character_id': character_id}})
+ log.error('Invalid XML document / API Error recceived', extra={'data': {'xml': char_doc.body, 'key_id': key_id, 'character_id': character_id}})
return
corp = EVEPlayerCharacter.objects.get(id=character_id).corporation
diff --git a/app/eve_api/templates/eve_api/add.html b/app/eve_api/templates/eve_api/add.html
index 914ed2e..7d101d6 100644
--- a/app/eve_api/templates/eve_api/add.html
+++ b/app/eve_api/templates/eve_api/add.html
@@ -1,11 +1,16 @@
{% extends "base.html" %}
+{% load gargoyle_tags %}
+
{% block title %}Add EVE API Key{% endblock %}
{% block content %}
-Please fill in your API key as provided on the EVE Online API
-page and a optional description.
+
+{% ifswitch switch_name %}
+Please fill in your API key as provided on the EVE Online API page and a optional description.
+{% else %}
+Please fill in your API key details and a optional description. You can create a API key on the API support site
+{% endifswitch %}