mirror of
https://github.com/nikdoof/test-auth.git
synced 2025-12-14 06:42:16 +00:00
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:
@@ -137,7 +137,10 @@ 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)
|
||||||
|
|
||||||
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': '<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': ''}]}
|
||||||
|
|
||||||
|
|||||||
@@ -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',
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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']):
|
||||||
|
|||||||
170
app/eve_api/migrations/0016_account_cak_fields.py
Normal file
170
app/eve_api/migrations/0016_account_cak_fields.py
Normal 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']
|
||||||
157
app/eve_api/migrations/0017_remove_characterid_field.py
Normal file
157
app/eve_api/migrations/0017_remove_characterid_field.py
Normal 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']
|
||||||
@@ -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']
|
||||||
@@ -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'
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -47,7 +47,10 @@ class EVEPlayerCorporation(EVEAPIModel):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def director_api_keys(self):
|
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
|
@property
|
||||||
def api_key_coverage(self):
|
def api_key_coverage(self):
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
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())
|
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,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__)):
|
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}
|
try:
|
||||||
account_doc = CachedDocument.objects.api_query('/account/Characters.xml.aspx', params=auth_params, no_cache=force_cache)
|
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 not 'error' in doc:
|
||||||
if 'error' in doc:
|
if not account:
|
||||||
try:
|
account, created = EVEAccount.objects.get_or_create(pk=api_userid)
|
||||||
account = EVEAccount.objects.get(api_user_id=api_userid)
|
if user:
|
||||||
except EVEAccount.DoesNotExist:
|
account.user = User.objects.get(id=user)
|
||||||
# If no Account exists in the DB, just ignore it
|
if not account.api_key == api_key:
|
||||||
return
|
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:
|
else:
|
||||||
account.api_status = API_STATUS_OTHER_ERROR
|
# No account object, just return
|
||||||
account.api_last_updated = datetime.utcnow()
|
if not account:
|
||||||
account.save()
|
return
|
||||||
if account.user:
|
|
||||||
update_user_access.delay(account.user.id)
|
|
||||||
return account
|
|
||||||
|
|
||||||
# Create or retrieve the account last to make sure everything
|
error = doc['error']['code']
|
||||||
# before here is good to go.
|
if int(error) >= 500:
|
||||||
account, created = EVEAccount.objects.get_or_create(api_user_id=api_userid)
|
# API disabled, down or rejecting, return without changes
|
||||||
if not account.api_key == api_key:
|
return
|
||||||
account.api_key = api_key
|
elif error in ['202', '203', '204', '205', '212']:
|
||||||
account.api_keytype = API_KEYTYPE_UNKNOWN
|
account.api_status = API_STATUS_AUTH_ERROR
|
||||||
account.api_status = API_STATUS_OK
|
elif error == '211':
|
||||||
if user and created:
|
account.api_status = API_STATUS_ACC_EXPIRED
|
||||||
account.user = User.objects.get(id=user)
|
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.api_last_updated = datetime.utcnow()
|
||||||
account.save()
|
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
|
return account
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>,
|
<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>,
|
||||||
<a href="{% url eve_api.views.eveapi_update acc.api_user_id %}">Update Key</a>,
|
<a href="{% url eve_api.views.eveapi_update acc.api_user_id %}">Update Key</a>, {% 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/>
|
||||||
|
|||||||
Reference in New Issue
Block a user