Support for Incarna v1.1, Customizable API Keys

- Support CAK keys and their spinoffs
- Add support for the Employment History data available in CharacterInfo.xml.aspx
- Add a Gargoyle flag to disable backend processing when needed
- Clean up a few inconsistancies with how the models are handled
This commit is contained in:
2011-08-31 13:42:09 +01:00
parent eb4bf84c01
commit ad56058631
20 changed files with 811 additions and 121 deletions

View File

@@ -137,6 +137,9 @@ class OpTimerHandler(BaseHandler):
def read(self, request, id=None): def read(self, request, id=None):
obj = get_object_or_404(EVEAccount, pk=settings.FULL_API_USER_ID) obj = get_object_or_404(EVEAccount, pk=settings.FULL_API_USER_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} params = {'userID': obj.pk, 'apiKey': obj.api_key, 'characterID': settings.FULL_API_CHARACTER_ID}
error_doc = {'ops': [{'startsIn': -1, 'eventID': 0, 'ownerName': '', 'eventDate': '', 'eventTitle': '<div style="text-align:center">The EVE API calendar is unavailable</div>', 'duration': 0, 'isImportant': 0, 'eventText': 'Fuck CCP tbqh imho srsly', 'endsIn':-1, 'forumLink': ''}]} error_doc = {'ops': [{'startsIn': -1, 'eventID': 0, 'ownerName': '', 'eventDate': '', 'eventTitle': '<div style="text-align:center">The EVE API calendar is unavailable</div>', 'duration': 0, 'isImportant': 0, 'eventText': 'Fuck CCP tbqh imho srsly', 'endsIn':-1, 'forumLink': ''}]}

View File

@@ -123,4 +123,20 @@ GARGOYLE_SWITCH_DEFAULTS = {
'label': 'HR Functions', 'label': 'HR Functions',
'description': 'Enables/Disables the HR functionality.', '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',
}
} }

View File

@@ -24,7 +24,7 @@ char_api_update.short_description = "Update character information from the EVE A
class EVEAccountAdmin(admin.ModelAdmin): class EVEAccountAdmin(admin.ModelAdmin):
list_display = ('api_user_id', 'user', 'api_keytype', 'api_status', 'api_last_updated') list_display = ('api_user_id', 'user', 'api_keytype', 'api_status', 'api_last_updated')
search_fields = ['api_user_id', 'user__username'] 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] actions = [account_api_update]
def save_model(self, request, obj, form, change): def save_model(self, request, obj, form, change):
@@ -39,11 +39,21 @@ class EVEAccountAdmin(admin.ModelAdmin):
admin.site.register(EVEAccount, EVEAccountAdmin) 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): class EVEPlayerCharacterAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'corporation') list_display = ('id', 'name', 'corporation')
search_fields = ['id', 'name'] search_fields = ['id', 'name']
fields = ('name', 'corporation', 'corporation_date', 'total_sp', 'last_login', 'last_logoff') fields = ('name', 'corporation', 'corporation_date', 'total_sp', 'last_login', 'last_logoff')
readonly_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] actions = [char_api_update]
def has_add_permission(self, request): def has_add_permission(self, request):
@@ -55,17 +65,12 @@ class EVEPlayerCharacterAdmin(admin.ModelAdmin):
admin.site.register(EVEPlayerCharacter, EVEPlayerCharacterAdmin) admin.site.register(EVEPlayerCharacter, EVEPlayerCharacterAdmin)
class EVEPlayerCorporationInline(admin.TabularInline): class EVEPlayerCorporationInline(admin.TabularInline):
model = EVEPlayerCorporation model = EVEPlayerCorporation
fields = ('name', 'ticker') fields = ('name', 'ticker')
extra = 0 extra = 0
can_delete = False
def has_add_permission(self, request):
return False
def has_delete_permission(self, request, obj=None):
return False
class EVEPlayerAllianceAdmin(admin.ModelAdmin): class EVEPlayerAllianceAdmin(admin.ModelAdmin):
list_display = ('id', 'name', 'ticker', 'member_count', 'date_founded') list_display = ('id', 'name', 'ticker', 'member_count', 'date_founded')

View File

@@ -19,11 +19,17 @@ API_STATUS_CHOICES = (
API_KEYTYPE_UNKNOWN = 0 API_KEYTYPE_UNKNOWN = 0
API_KEYTYPE_LIMITED = 1 API_KEYTYPE_LIMITED = 1
API_KEYTYPE_FULL = 2 API_KEYTYPE_FULL = 2
API_KEYTYPE_CORPORATION = 3
API_KEYTYPE_CHARACTER = 4
API_KEYTYPE_ACCOUNT = 5
API_KEYTYPE_CHOICES = ( API_KEYTYPE_CHOICES = (
(API_KEYTYPE_UNKNOWN, 'Unknown'), (API_KEYTYPE_UNKNOWN, 'Unknown'),
(API_KEYTYPE_LIMITED, 'Limited'), (API_KEYTYPE_LIMITED, 'Limited'),
(API_KEYTYPE_FULL, 'Full'), (API_KEYTYPE_FULL, 'Full'),
(API_KEYTYPE_CORPORATION, 'Corporation'),
(API_KEYTYPE_CHARACTER, 'Character'),
(API_KEYTYPE_ACCOUNT, 'Account'),
) )
API_GENDER_MALE = 1 API_GENDER_MALE = 1

View File

@@ -1,6 +1,8 @@
import re import re
from django import forms from django import forms
from gargoyle import gargoyle
from eve_api.models import EVEAccount, EVEPlayerCharacter, EVEPlayerCorporation 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 # We're editing a existing instance, readonly the userid
self.fields['api_user_id'].widget.attrs['readonly'] = True 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): 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.") raise forms.ValidationError("Provided API Key is not 64 characters long.")
if re.search(r'[^\.a-zA-Z0-9]', self.cleaned_data['api_key']): if re.search(r'[^\.a-zA-Z0-9]', self.cleaned_data['api_key']):

View File

@@ -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']

View File

@@ -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']

View File

@@ -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']

View File

@@ -26,6 +26,12 @@ class EVEAccount(EVEAPIModel):
default=API_KEYTYPE_UNKNOWN, default=API_KEYTYPE_UNKNOWN,
verbose_name="API Key Type", verbose_name="API Key Type",
help_text="Type of API key") 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): def __unicode__(self):
return u"%s" % self.pk return u"%s" % self.pk
@@ -33,10 +39,39 @@ class EVEAccount(EVEAPIModel):
def in_corp(self, corpid): def in_corp(self, corpid):
return self.character.filter(corporation__id=corpid).count() 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 @property
def training(self): def training(self):
return self.characters.filter(eveplayercharacterskill__in_training__gt=0).count() 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: class Meta:
app_label = 'eve_api' app_label = 'eve_api'
verbose_name = 'EVE Account' verbose_name = 'EVE Account'

View File

@@ -23,6 +23,30 @@ class EVEPlayerCharacterSkill(models.Model):
verbose_name_plural = 'Player Character Skills' 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): class EVEPlayerCharacter(EVEAPIModel):
""" """
Represents an individual player character within the game. Not to be Represents an individual player character within the game. Not to be

View File

@@ -47,6 +47,9 @@ class EVEPlayerCorporation(EVEAPIModel):
@property @property
def director_api_keys(self): def director_api_keys(self):
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) return self.directors.filter(eveaccount__isnull=False, eveaccount__api_keytype=API_KEYTYPE_FULL, eveaccount__api_status=API_STATUS_OK)
@property @property

View File

@@ -5,6 +5,7 @@ import logging
from celery.decorators import task from celery.decorators import task
from celery.task.sets import TaskSet from celery.task.sets import TaskSet
from gargoyle import gargoyle
from eve_proxy.exceptions import * from eve_proxy.exceptions import *
from eve_proxy.models import CachedDocument 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() 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 # Update all the eve accounts and related corps
delta = timedelta(seconds=update_delay) delta = timedelta(seconds=update_delay)
log.info("Updating APIs older than %s" % (datetime.now() - delta)) log.info("Updating APIs older than %s" % (datetime.now() - delta))
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] 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()) log.info("%s account(s) to update" % accounts.count())
for acc in accounts: 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: if not acc.user:
acc.delete() acc.delete()
continue 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) @task(ignore_result=True)
@@ -76,17 +85,52 @@ 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__)): 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)) 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)
doc = basic_xml_parse_doc(account_doc)['eveapi']
# Checks for a document error
if 'error' in doc:
try: try:
account = EVEAccount.objects.get(api_user_id=api_userid) account = EVEAccount.objects.get(pk=api_userid)
except EVEAccount.DoesNotExist: except EVEAccount.DoesNotExist:
# If no Account exists in the DB, just ignore it account = None
# 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']
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)
else:
# No account object, just return
if not account:
return return
error = doc['error']['code'] error = doc['error']['code']
@@ -99,30 +143,26 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=lo
account.api_status = API_STATUS_ACC_EXPIRED account.api_status = API_STATUS_ACC_EXPIRED
else: else:
account.api_status = API_STATUS_OTHER_ERROR account.api_status = API_STATUS_OTHER_ERROR
account.api_last_updated = datetime.utcnow()
account.save()
if account.user: if account.user:
update_user_access.delay(account.user.id) update_user_access.delay(account.user.id)
return account
# Create or retrieve the account last to make sure everything else:
# before here is good to go. auth_params = {'userid': api_userid, 'apikey': api_key}
account, created = EVEAccount.objects.get_or_create(api_user_id=api_userid) 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: if not account.api_key == api_key:
account.api_key = api_key account.api_key = api_key
account.api_keytype = API_KEYTYPE_UNKNOWN
account.api_status = API_STATUS_OK account.api_status = API_STATUS_OK
if user and created:
account.user = User.objects.get(id=user)
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) keycheck = CachedDocument.objects.api_query('/account/AccountStatus.xml.aspx', params=auth_params, no_cache=True)
keydoc = basic_xml_parse_doc(keycheck)['eveapi'] keydoc = basic_xml_parse_doc(keycheck)['eveapi']
if 'error' in keydoc: if 'error' in keydoc:
account.api_keytype = API_KEYTYPE_LIMITED account.api_keytype = API_KEYTYPE_LIMITED
elif not 'error' in keydoc: elif not 'error' in keydoc:
@@ -130,24 +170,38 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=lo
else: else:
account.api_keytype = API_KEYTYPE_UNKNOWN account.api_keytype = API_KEYTYPE_UNKNOWN
account.api_last_updated = datetime.utcnow() # Remove deleted or traded characters
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']] newcharlist = [int(char['characterID']) for char in doc['result']['characters']]
for char in account.characters.all().exclude(id__in=newcharlist):
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) account.characters.remove(char)
# Schedule a task to update the characters
if account.user: if account.user:
cb = update_user_access.subtask(kwargs={'user': account.user.id }) cb = update_user_access.subtask(kwargs={'user': account.user.id })
else: else:
cb = None cb = None
import_eve_characters.delay(newcharlist, api_key, api_userid, callback=cb) 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()
return account return account

View File

@@ -4,18 +4,19 @@ import logging
from celery.decorators import task from celery.decorators import task
from celery.task.sets import subtask from celery.task.sets import subtask
from gargoyle import gargoyle
from eve_proxy.exceptions import * from eve_proxy.exceptions import *
from eve_proxy.models import CachedDocument from eve_proxy.models import CachedDocument
from eve_api.api_exceptions import * 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.app_defines import *
from eve_api.utils import basic_xml_parse, basic_xml_parse_doc from eve_api.utils import basic_xml_parse, basic_xml_parse_doc
@task() @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 Imports a character from the API, providing a API key will populate
further details. Returns a single EVEPlayerCharacter object 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() log = import_eve_character.get_logger()
try: 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: except APIAccessException, exc:
log.error('Error importing character - flagging for retry') 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: if not pchar:
log.error('Error importing character %s' % character_id) 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() @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 Imports characters from the API, providing a API key will populate
further details. Returns a list of EVEPlayerCharacter objects 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() log = import_eve_characters.get_logger()
try: 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: except APIAccessException, exc:
log.error('Error importing characters - flagging for retry') 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: if callback:
subtask(callback).delay(characters=results) subtask(callback).delay(characters=results)
else: else:
return results 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: try:
char_doc = CachedDocument.objects.api_query('/eve/CharacterInfo.xml.aspx', params={'characterID': character_id}, no_cache=False) 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'] pchar.security_status = values['securityStatus']
# Set corporation and join date # 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 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)): if created or not corp.name or corp.api_last_updated < (datetime.utcnow() - timedelta(hours=12)):
import_corp_details.delay(values['corporationID']) 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 pchar.race = val
break break
# If we have a valid API key, import the full character sheet # Import employment history if its made available
if api_key and user_id: if 'employmentHistory' in values:
auth_params = {'userID': user_id, 'apiKey': api_key, 'characterID': character_id } 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: try:
char_doc = CachedDocument.objects.api_query('/char/CharacterSheet.xml.aspx', params=auth_params, no_cache=False) char_doc = CachedDocument.objects.api_query('/char/CharacterSheet.xml.aspx', params=auth_params, no_cache=False)
except DocumentRetrievalError, exc: 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 # Process the character's skills
pchar.total_sp = 0 pchar.total_sp = 0
for skill in values.get('skills', None): 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) 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']): if created or not charskillobj.level == int(skill['level']) or not charskillobj.skillpoints == int(skill['skillpoints']):
charskillobj.level = int(skill['level']) 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'] queuedoc = queuedoc['eveapi']['result']
EVEPlayerCharacterSkill.objects.filter(character=pchar).update(in_training=0) EVEPlayerCharacterSkill.objects.filter(character=pchar).update(in_training=0)
if int(queuedoc['skillInTraining']): 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, created = EVEPlayerCharacterSkill.objects.get_or_create(skill=skillobj, character=pchar)
charskillobj.in_training = queuedoc['trainingToLevel'] charskillobj.in_training = queuedoc['trainingToLevel']
charskillobj.save() charskillobj.save()
@@ -157,19 +183,14 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
else: else:
pchar.gender = API_GENDER_FEMALE pchar.gender = API_GENDER_FEMALE
pchar.api_last_updated = datetime.utcnow() pchar.api_last_updated = datetime.utcnow()
pchar.save() pchar.save()
try: if acc:
acc = EVEAccount.objects.get(pk=user_id)
if not pchar.id in acc.characters.all().values_list('id', flat=True): if not pchar.id in acc.characters.all().values_list('id', flat=True):
acc.characters.add(pchar) acc.characters.add(pchar)
if pchar.director and acc.api_keytype in [API_KEYTYPE_FULL, API_KEYTYPE_CORPORATION]:
if pchar.director and acc.api_keytype == API_KEYTYPE_FULL:
from eve_api.tasks.corporation import import_corp_members 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) import_corp_members.delay(key_id=acc.pk, character_id=pchar.id)
except EVEAccount.DoesNotExist:
pass
return pchar return pchar

View File

@@ -4,10 +4,12 @@ from datetime import datetime, timedelta
from xml.dom import minidom from xml.dom import minidom
from celery.decorators import task from celery.decorators import task
from gargoyle import gargoyle
from eve_proxy.models import CachedDocument from eve_proxy.models import CachedDocument
from eve_proxy.exceptions import DocumentRetrievalError 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.utils import basic_xml_parse_doc
from eve_api.tasks.character import import_eve_character from eve_api.tasks.character import import_eve_character
from eve_api.api_exceptions import APIAccessException from eve_api.api_exceptions import APIAccessException
@@ -110,7 +112,7 @@ def link_ceo(corporation, character):
@task(ignore_result=True) @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 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. 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() 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 # 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', char_doc = CachedDocument.objects.api_query('/corp/MemberTracking.xml.aspx',
params=auth_params, params=auth_params,
no_cache=False, no_cache=False,
@@ -127,7 +140,7 @@ def import_corp_members(api_userid, api_key, character_id):
pdoc = basic_xml_parse_doc(char_doc) pdoc = basic_xml_parse_doc(char_doc)
if not 'eveapi' in pdoc or not 'result' in pdoc['eveapi']: 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 return
corp = EVEPlayerCharacter.objects.get(id=character_id).corporation corp = EVEPlayerCharacter.objects.get(id=character_id).corporation

View File

@@ -1,11 +1,16 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load gargoyle_tags %}
{% block title %}Add EVE API Key{% endblock %} {% block title %}Add EVE API Key{% endblock %}
{% block content %} {% block content %}
<p>Please fill in your API key as provided on the <a
href="http://eve-online.com/api">EVE Online API {% ifswitch switch_name %}
page</a> and a optional description.</p> <p>Please fill in your API key as provided on the <a href="http://eve-online.com/api">EVE Online API page</a> and a optional description.</p>
{% else %}
<p>Please fill in your API key details and a optional description. You can create a API key on the <a href="https://support.eveonline.com/api/Key/CreatePredefined/59638024/0/false">API support site</a></p>
{% endifswitch %}
<form action="{% url eve_api.views.eveapi_add %}" method="post"> <form action="{% url eve_api.views.eveapi_add %}" method="post">
<table> <table>

View File

@@ -4,15 +4,11 @@
<h1>Character List</h1> <h1>Character List</h1>
{% if characters %}
{% regroup characters by account as acc_list %}
<table> <table>
<tr><th>Character Name</th><th>Corporation</th><th>Alliance</th><th>Skillpoints</th><th>Training</th></tr> <tr><th>Character Name</th><th>Corporation</th><th>Alliance</th><th>Skillpoints</th><th>Training</th></tr>
{% for acc in acc_list %} {% for acc in accounts %}
<tr><th colspan=5>Account {{ acc.grouper }} {% if acc.grouper.training == 0 %}<font color="#F87217">(No Character Training)</font>{% endif %}</th></tr> <tr><th colspan=5>Key {{ acc.pk }} {% if acc.training == 0 %}<font color="#F87217">(No Character Training)</font>{% endif %}</th></tr>
{% for char in acc.list %} {% for char in acc.characters.all %}
<tr><td><a href="{% url eveapi-character char.id %}">{{ char.name }}</a></td> <tr><td><a href="{% url eveapi-character char.id %}">{{ char.name }}</a></td>
<td><a href="{% url eveapi-corporation char.corporation.id %}">{{ char.corporation }}</a></td> <td><a href="{% url eveapi-corporation char.corporation.id %}">{{ char.corporation }}</a></td>
<td>{% if char.corporation.alliance %}<a href="{% url eveapi-alliance char.corporation.alliance.id %}">{{ char.corporation.alliance }}</a>{% endif %}</td> <td>{% if char.corporation.alliance %}<a href="{% url eveapi-alliance char.corporation.alliance.id %}">{{ char.corporation.alliance }}</a>{% endif %}</td>
@@ -22,6 +18,5 @@
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
</table> </table>
{% endif %}
{% endblock %} {% endblock %}

View File

@@ -34,6 +34,10 @@ def basic_xml_parse(nodes):
values[node.attributes['name'].value] = rset values[node.attributes['name'].value] = rset
else: else:
values[node.tagName] = basic_xml_parse(node.childNodes) values[node.tagName] = basic_xml_parse(node.childNodes)
if node.attributes.keys():
for e in node.attributes.keys():
values[node.tagName][e] = node.attributes[e].value
return values return values

View File

@@ -176,7 +176,7 @@ def eveapi_character(request, charid=None, template='eve_api/character.html', li
return render_to_response(template, context, context_instance=RequestContext(request)) return render_to_response(template, context, context_instance=RequestContext(request))
context = { context = {
'characters': EVEPlayerCharacter.objects.select_related('corporation', 'corporation__alliance').filter(eveaccount__user=request.user).only('id', 'name', 'corporation__name', 'corporation__alliance__name'), 'accounts': EVEAccount.objects.select_related('characters', 'characters__corporation', 'characters__corporation__alliance').filter(user=request.user),
} }
return render_to_response(list_template, context, context_instance=RequestContext(request)) return render_to_response(list_template, context, context_instance=RequestContext(request))

View File

@@ -53,7 +53,7 @@ def CreateApplicationForm(user):
if char and corp: if char and corp:
if char.corporation == corp: if char.corporation == corp:
raise forms.ValidationError("%s is already a member of %s" % (char, corp)) raise forms.ValidationError("%s is already a member of %s" % (char, corp))
if not char.account.api_keytype >= corp.application_config.api_required: if not char.account.api_keytype == corp.application_config.api_required:
raise forms.ValidationError("%s requires a %s API key for this application" % (corp, corp.application_config.get_api_required_display())) raise forms.ValidationError("%s requires a %s API key for this application" % (corp, corp.application_config.get_api_required_display()))
return self.cleaned_data return self.cleaned_data

View File

@@ -112,15 +112,18 @@ setup.</p>
<td>{{ acc.get_api_keytype_display }}</td> <td>{{ acc.get_api_keytype_display }}</td>
<td id="api-status-{{ acc.api_user_id }}">{{ acc.get_api_status_display }}</td> <td id="api-status-{{ acc.api_user_id }}">{{ acc.get_api_status_display }}</td>
<td id="api-time-{{ acc.api_user_id }}">{{ acc.api_last_updated|naturaltimediff }}</td> <td id="api-time-{{ acc.api_user_id }}">{{ acc.api_last_updated|naturaltimediff }}</td>
<td><a href="{% url eve_api.views.eveapi_refresh acc.api_user_id %}" onclick="javascript:refresh_apikey({{ acc.api_user_id }}); return false;">Refresh</a>,&nbsp; <td>{% ifswitch api-disableprocessing %}{% else %}<a href="{% url eve_api.views.eveapi_refresh acc.api_user_id %}" onclick="javascript:refresh_apikey({{ acc.api_user_id }}); return false;">Refresh</a>,&nbsp;
<a href="{% url eve_api.views.eveapi_update acc.api_user_id %}">Update Key</a>,&nbsp; <a href="{% url eve_api.views.eveapi_update acc.api_user_id %}">Update Key</a>,&nbsp;{% endifswitch %}
<a href="{% url eve_api.views.eveapi_log acc.api_user_id %}">Logs</a> <a href="{% url eve_api.views.eveapi_log acc.api_user_id %}">Logs</a>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% endif %} {% endif %}
<p> <p>
{% ifswitch api-disableprocessing %}
{% else %}
<a href="{% url eve_api.views.eveapi_add %}" class="button">Add a Eve API key</a> <a href="{% url eve_api.views.eveapi_add %}" class="button">Add a Eve API key</a>
{% endifswitch %}
</p> </p>
<br/> <br/>