mirror of
https://github.com/nikdoof/test-auth.git
synced 2025-12-13 22:32:15 +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):
|
||||
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': ''}]}
|
||||
|
||||
|
||||
@@ -123,4 +123,20 @@ GARGOYLE_SWITCH_DEFAULTS = {
|
||||
'label': 'HR Functions',
|
||||
'description': 'Enables/Disables the HR functionality.',
|
||||
},
|
||||
'eve-cak': {
|
||||
'is_active': False,
|
||||
'label': 'EVE Customizable API Keys',
|
||||
'description': 'Enables/Disables EVE API CAK support.',
|
||||
},
|
||||
'eve-testapi': {
|
||||
'is_active': False,
|
||||
'label': 'EVE Test API Endpoints',
|
||||
'description': 'Use the Test API endpoints instead of Live.',
|
||||
},
|
||||
'api-disableprocessing': {
|
||||
'is_active': False,
|
||||
'label': 'Disable API Backend Processing',
|
||||
'description': 'Disables backend processing for the EVE API, stops Auth hammering the API during outages',
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ char_api_update.short_description = "Update character information from the EVE A
|
||||
class EVEAccountAdmin(admin.ModelAdmin):
|
||||
list_display = ('api_user_id', 'user', 'api_keytype', 'api_status', 'api_last_updated')
|
||||
search_fields = ['api_user_id', 'user__username']
|
||||
readonly_fields = ('api_keytype', 'api_status', 'characters', 'api_last_updated', 'characters')
|
||||
readonly_fields = ('api_keytype', 'api_status', 'api_accessmask', 'api_expiry', 'characters', 'api_last_updated')
|
||||
actions = [account_api_update]
|
||||
|
||||
def save_model(self, request, obj, form, change):
|
||||
@@ -39,11 +39,21 @@ class EVEAccountAdmin(admin.ModelAdmin):
|
||||
|
||||
admin.site.register(EVEAccount, EVEAccountAdmin)
|
||||
|
||||
class EVEPlayerCharacterEmploymentHistoryInline(admin.TabularInline):
|
||||
model = EVEPlayerCharacterEmploymentHistory
|
||||
list_display = ('record_id', 'character', 'corporation', 'start_date', 'end_date')
|
||||
search_fields = ['character__name', 'corporation__name', 'corporation__alliance__name']
|
||||
readonly_fields = list_display
|
||||
extra = 0
|
||||
can_delete = False
|
||||
verbose_name_plural = "Employment History"
|
||||
|
||||
class EVEPlayerCharacterAdmin(admin.ModelAdmin):
|
||||
list_display = ('id', 'name', 'corporation')
|
||||
search_fields = ['id', 'name']
|
||||
fields = ('name', 'corporation', 'corporation_date', 'total_sp', 'last_login', 'last_logoff')
|
||||
readonly_fields = ('name', 'corporation', 'corporation_date', 'total_sp', 'last_login', 'last_logoff')
|
||||
inlines = [EVEPlayerCharacterEmploymentHistoryInline]
|
||||
actions = [char_api_update]
|
||||
|
||||
def has_add_permission(self, request):
|
||||
@@ -55,17 +65,12 @@ class EVEPlayerCharacterAdmin(admin.ModelAdmin):
|
||||
|
||||
admin.site.register(EVEPlayerCharacter, EVEPlayerCharacterAdmin)
|
||||
|
||||
|
||||
class EVEPlayerCorporationInline(admin.TabularInline):
|
||||
model = EVEPlayerCorporation
|
||||
fields = ('name', 'ticker')
|
||||
extra = 0
|
||||
|
||||
def has_add_permission(self, request):
|
||||
return False
|
||||
|
||||
def has_delete_permission(self, request, obj=None):
|
||||
return False
|
||||
|
||||
can_delete = False
|
||||
|
||||
class EVEPlayerAllianceAdmin(admin.ModelAdmin):
|
||||
list_display = ('id', 'name', 'ticker', 'member_count', 'date_founded')
|
||||
|
||||
@@ -19,11 +19,17 @@ API_STATUS_CHOICES = (
|
||||
API_KEYTYPE_UNKNOWN = 0
|
||||
API_KEYTYPE_LIMITED = 1
|
||||
API_KEYTYPE_FULL = 2
|
||||
API_KEYTYPE_CORPORATION = 3
|
||||
API_KEYTYPE_CHARACTER = 4
|
||||
API_KEYTYPE_ACCOUNT = 5
|
||||
|
||||
API_KEYTYPE_CHOICES = (
|
||||
(API_KEYTYPE_UNKNOWN, 'Unknown'),
|
||||
(API_KEYTYPE_LIMITED, 'Limited'),
|
||||
(API_KEYTYPE_FULL, 'Full'),
|
||||
(API_KEYTYPE_CORPORATION, 'Corporation'),
|
||||
(API_KEYTYPE_CHARACTER, 'Character'),
|
||||
(API_KEYTYPE_ACCOUNT, 'Account'),
|
||||
)
|
||||
|
||||
API_GENDER_MALE = 1
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import re
|
||||
|
||||
from django import forms
|
||||
from gargoyle import gargoyle
|
||||
|
||||
from eve_api.models import EVEAccount, EVEPlayerCharacter, EVEPlayerCorporation
|
||||
|
||||
|
||||
@@ -20,9 +22,13 @@ class EveAPIForm(forms.ModelForm):
|
||||
# We're editing a existing instance, readonly the userid
|
||||
self.fields['api_user_id'].widget.attrs['readonly'] = True
|
||||
|
||||
if gargoyle.is_active('eve-cak'):
|
||||
self.fields['api_user_id'].label = 'Key ID'
|
||||
self.fields['api_key'].label = 'Verification Code'
|
||||
|
||||
def clean_api_key(self):
|
||||
|
||||
if not len(self.cleaned_data['api_key']) == 64:
|
||||
if not gargoyle.is_active('eve-cak') and not len(self.cleaned_data['api_key']) == 64:
|
||||
raise forms.ValidationError("Provided API Key is not 64 characters long.")
|
||||
|
||||
if re.search(r'[^\.a-zA-Z0-9]', self.cleaned_data['api_key']):
|
||||
|
||||
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,
|
||||
verbose_name="API Key Type",
|
||||
help_text="Type of API key")
|
||||
api_accessmask = models.IntegerField(default=0,
|
||||
verbose_name="API Key Access Mask",
|
||||
help_text="Describes the level of access this API key gives to the user's data")
|
||||
api_expiry = models.DateTimeField(blank=True, null=True,
|
||||
verbose_name="API Key Expiry Date",
|
||||
help_text="Indicates when the API key will expire.")
|
||||
|
||||
def __unicode__(self):
|
||||
return u"%s" % self.pk
|
||||
@@ -33,10 +39,39 @@ class EVEAccount(EVEAPIModel):
|
||||
def in_corp(self, corpid):
|
||||
return self.character.filter(corporation__id=corpid).count()
|
||||
|
||||
@staticmethod
|
||||
def _mask_check(accessmask, bit):
|
||||
""" Returns a bool indicating if the bit is set in the accessmask """
|
||||
mask = 1 << bit
|
||||
return (accessmask & mask) > 0
|
||||
|
||||
def has_access(self, bit):
|
||||
""" Checks if a specific bit is enabled in the key's access mask """
|
||||
return self._mask_check(self.api_accessmask, bit)
|
||||
|
||||
def check_access(self, accessmask):
|
||||
""" Checks if the account has equal or higher access than the bitmask provided """
|
||||
|
||||
length = 0
|
||||
i = accessmask
|
||||
while i:
|
||||
i >>= 1
|
||||
length += 1
|
||||
|
||||
for bit in range(0, length-1):
|
||||
if self._mask_check(accessmask, bit) and not self.has_access(bit):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
@property
|
||||
def training(self):
|
||||
return self.characters.filter(eveplayercharacterskill__in_training__gt=0).count()
|
||||
|
||||
@property
|
||||
def is_cak(self):
|
||||
return self.api_keytype in [API_KEYTYPE_CHARACTER, API_KEYTYPE_CORPORATION, API_KEYTYPE_ACCOUNT]
|
||||
|
||||
class Meta:
|
||||
app_label = 'eve_api'
|
||||
verbose_name = 'EVE Account'
|
||||
|
||||
@@ -23,6 +23,30 @@ class EVEPlayerCharacterSkill(models.Model):
|
||||
verbose_name_plural = 'Player Character Skills'
|
||||
|
||||
|
||||
class EVEPlayerCharacterEmploymentHistory(models.Model):
|
||||
"""
|
||||
Player's corporation history
|
||||
"""
|
||||
record_id = models.IntegerField(primary_key=True, verbose_name="Record ID")
|
||||
character = models.ForeignKey('eve_api.EVEPlayerCharacter', related_name='employmenthistory')
|
||||
corporation = models.ForeignKey('eve_api.EVEPlayerCorporation', related_name='+')
|
||||
start_date = models.DateTimeField(blank=False, null=False, verbose_name="Corporation Join Date")
|
||||
|
||||
@property
|
||||
def end_date(self):
|
||||
if self.character.employmenthistory.filter(record_id__gt=self.record_id).count():
|
||||
return self.character.employmenthistory.filter(record_id__gt=self.record_id)[0].start_date
|
||||
return None
|
||||
|
||||
def __unicode__(self):
|
||||
return u'%s - %s - %s' % (self.record_id, self.character, self.corporation)
|
||||
|
||||
class Meta:
|
||||
app_label = 'eve_api'
|
||||
verbose_name = 'Player Character Employment History'
|
||||
verbose_name_plural = 'Player Character Employment Histories'
|
||||
|
||||
|
||||
class EVEPlayerCharacter(EVEAPIModel):
|
||||
"""
|
||||
Represents an individual player character within the game. Not to be
|
||||
|
||||
@@ -47,7 +47,10 @@ class EVEPlayerCorporation(EVEAPIModel):
|
||||
|
||||
@property
|
||||
def director_api_keys(self):
|
||||
return self.directors.filter(eveaccount__isnull=False, eveaccount__api_keytype=API_KEYTYPE_FULL, eveaccount__api_status=API_STATUS_OK)
|
||||
if gargoyle.is_active('eve-cak'):
|
||||
return self.directors.filter(eveaccount__isnull=False, eveaccount__api_keytype__in=[API_KEYTYPE_CORPORATION, API_KEYTYPE_FULL], eveaccount__api_status=API_STATUS_OK)
|
||||
else:
|
||||
return self.directors.filter(eveaccount__isnull=False, eveaccount__api_keytype=API_KEYTYPE_FULL, eveaccount__api_status=API_STATUS_OK)
|
||||
|
||||
@property
|
||||
def api_key_coverage(self):
|
||||
|
||||
@@ -5,6 +5,7 @@ import logging
|
||||
|
||||
from celery.decorators import task
|
||||
from celery.task.sets import TaskSet
|
||||
from gargoyle import gargoyle
|
||||
|
||||
from eve_proxy.exceptions import *
|
||||
from eve_proxy.models import CachedDocument
|
||||
@@ -27,18 +28,26 @@ def queue_apikey_updates(update_delay=86400, batch_size=50):
|
||||
"""
|
||||
|
||||
log = queue_apikey_updates.get_logger()
|
||||
|
||||
if gargoyle.is_active('api-disableprocessing'):
|
||||
log.info("Backend processing disabled, exiting")
|
||||
return
|
||||
|
||||
# Update all the eve accounts and related corps
|
||||
delta = timedelta(seconds=update_delay)
|
||||
log.info("Updating APIs older than %s" % (datetime.now() - delta))
|
||||
|
||||
accounts = EVEAccount.objects.filter(api_last_updated__lt=(datetime.now() - delta)).exclude(api_status=API_STATUS_ACC_EXPIRED).exclude(api_status=API_STATUS_AUTH_ERROR).order_by('api_last_updated')[:batch_size]
|
||||
if gargoyle.is_active('eve-cak'):
|
||||
accounts = EVEAccount.objects.filter(api_last_updated__lt=(datetime.now() - delta)).exclude(api_status=API_STATUS_ACC_EXPIRED).exclude(api_status=API_STATUS_AUTH_ERROR).order_by('api_last_updated')[:batch_size]
|
||||
else:
|
||||
accounts = EVEAccount.objects.filter(api_last_updated__lt=(datetime.now() - delta)).exclude(api_status=API_STATUS_ACC_EXPIRED).exclude(api_status=API_STATUS_AUTH_ERROR).exclude(api_keytype__gt=2).order_by('api_last_updated')[:batch_size]
|
||||
log.info("%s account(s) to update" % accounts.count())
|
||||
for acc in accounts:
|
||||
log.debug("Queueing UserID %s for update" % acc.api_user_id)
|
||||
log.debug("Queueing UserID %s for update" % acc.pk)
|
||||
if not acc.user:
|
||||
acc.delete()
|
||||
continue
|
||||
import_apikey.delay(api_key=acc.api_key, api_userid=acc.api_user_id)
|
||||
import_apikey.delay(api_key=acc.api_key, api_userid=acc.pk)
|
||||
|
||||
|
||||
@task(ignore_result=True)
|
||||
@@ -76,78 +85,123 @@ def import_apikey_result(api_userid, api_key, user=None, force_cache=False, call
|
||||
def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=logging.getLogger(__name__)):
|
||||
log.info('Importing %s/%s' % (api_userid, api_key))
|
||||
|
||||
auth_params = {'userid': api_userid, 'apikey': api_key}
|
||||
account_doc = CachedDocument.objects.api_query('/account/Characters.xml.aspx', params=auth_params, no_cache=force_cache)
|
||||
try:
|
||||
account = EVEAccount.objects.get(pk=api_userid)
|
||||
except EVEAccount.DoesNotExist:
|
||||
account = None
|
||||
|
||||
doc = basic_xml_parse_doc(account_doc)['eveapi']
|
||||
# Use CAK if enabled and either a new key or flagged as so
|
||||
if (gargoyle.is_active('eve-cak') and (not account or account.is_cak)):
|
||||
auth_params = {'keyid': api_userid, 'vcode': api_key}
|
||||
keycheck = CachedDocument.objects.api_query('/account/APIKeyInfo.xml.aspx', params=auth_params, no_cache=True)
|
||||
doc = basic_xml_parse_doc(keycheck)['eveapi']
|
||||
|
||||
# Checks for a document error
|
||||
if 'error' in doc:
|
||||
try:
|
||||
account = EVEAccount.objects.get(api_user_id=api_userid)
|
||||
except EVEAccount.DoesNotExist:
|
||||
# If no Account exists in the DB, just ignore it
|
||||
return
|
||||
if not 'error' in doc:
|
||||
if not account:
|
||||
account, created = EVEAccount.objects.get_or_create(pk=api_userid)
|
||||
if user:
|
||||
account.user = User.objects.get(id=user)
|
||||
if not account.api_key == api_key:
|
||||
account.api_key = api_key
|
||||
|
||||
keydoc = doc['result']['key']
|
||||
if keydoc['type'] == 'Character':
|
||||
account.api_keytype = API_KEYTYPE_CHARACTER
|
||||
elif keydoc['type'] == 'Corporation':
|
||||
account.api_keytype = API_KEYTYPE_CORPORATION
|
||||
elif keydoc['type'] == 'Account':
|
||||
account.api_keytype = API_KEYTYPE_ACCOUNT
|
||||
account.api_accessmask = keydoc['accessMask']
|
||||
if not keydoc['expires'] == '':
|
||||
account.api_expiry = datetime.strptime(keydoc['expires'], '%Y-%m-%d %H:%M:%S')
|
||||
account.api_status = API_STATUS_OK
|
||||
|
||||
# Remove deleted or traded characters
|
||||
newcharlist = [int(char['characterID']) for char in doc['result']['key']['characters']]
|
||||
for char in account.characters.all().exclude(id__in=newcharlist):
|
||||
account.characters.remove(char)
|
||||
|
||||
# Schedule a task to update the characters
|
||||
if account.user:
|
||||
cb = update_user_access.subtask(kwargs={'user': account.user.id })
|
||||
else:
|
||||
cb = None
|
||||
import_eve_characters.delay(account.characters.all().values_list('id', flat=True), key_id=account.pk, callback=cb)
|
||||
|
||||
error = doc['error']['code']
|
||||
if int(error) >= 500:
|
||||
# API disabled, down or rejecting, return without changes
|
||||
return
|
||||
elif error in ['202', '203', '204', '205', '212']:
|
||||
account.api_status = API_STATUS_AUTH_ERROR
|
||||
elif error == '211':
|
||||
account.api_status = API_STATUS_ACC_EXPIRED
|
||||
else:
|
||||
account.api_status = API_STATUS_OTHER_ERROR
|
||||
account.api_last_updated = datetime.utcnow()
|
||||
account.save()
|
||||
if account.user:
|
||||
update_user_access.delay(account.user.id)
|
||||
return account
|
||||
# No account object, just return
|
||||
if not account:
|
||||
return
|
||||
|
||||
# Create or retrieve the account last to make sure everything
|
||||
# before here is good to go.
|
||||
account, created = EVEAccount.objects.get_or_create(api_user_id=api_userid)
|
||||
if not account.api_key == api_key:
|
||||
account.api_key = api_key
|
||||
account.api_keytype = API_KEYTYPE_UNKNOWN
|
||||
account.api_status = API_STATUS_OK
|
||||
if user and created:
|
||||
account.user = User.objects.get(id=user)
|
||||
error = doc['error']['code']
|
||||
if int(error) >= 500:
|
||||
# API disabled, down or rejecting, return without changes
|
||||
return
|
||||
elif error in ['202', '203', '204', '205', '212']:
|
||||
account.api_status = API_STATUS_AUTH_ERROR
|
||||
elif error == '211':
|
||||
account.api_status = API_STATUS_ACC_EXPIRED
|
||||
else:
|
||||
account.api_status = API_STATUS_OTHER_ERROR
|
||||
|
||||
if account.user:
|
||||
update_user_access.delay(account.user.id)
|
||||
|
||||
else:
|
||||
auth_params = {'userid': api_userid, 'apikey': api_key}
|
||||
account_doc = CachedDocument.objects.api_query('/account/Characters.xml.aspx', params=auth_params, no_cache=force_cache)
|
||||
doc = basic_xml_parse_doc(account_doc)['eveapi']
|
||||
|
||||
if not 'error' in doc:
|
||||
if not account:
|
||||
account, created = EVEAccount.objects.get_or_create(pk=api_userid)
|
||||
if user:
|
||||
account.user = User.objects.get(id=user)
|
||||
if not account.api_key == api_key:
|
||||
account.api_key = api_key
|
||||
account.api_status = API_STATUS_OK
|
||||
|
||||
keycheck = CachedDocument.objects.api_query('/account/AccountStatus.xml.aspx', params=auth_params, no_cache=True)
|
||||
keydoc = basic_xml_parse_doc(keycheck)['eveapi']
|
||||
if 'error' in keydoc:
|
||||
account.api_keytype = API_KEYTYPE_LIMITED
|
||||
elif not 'error' in keydoc:
|
||||
account.api_keytype = API_KEYTYPE_FULL
|
||||
else:
|
||||
account.api_keytype = API_KEYTYPE_UNKNOWN
|
||||
|
||||
# Remove deleted or traded characters
|
||||
newcharlist = [int(char['characterID']) for char in doc['result']['characters']]
|
||||
for char in account.characters.all().exclude(id__in=newcharlist):
|
||||
account.characters.remove(char)
|
||||
|
||||
# Schedule a task to update the characters
|
||||
if account.user:
|
||||
cb = update_user_access.subtask(kwargs={'user': account.user.id })
|
||||
else:
|
||||
cb = None
|
||||
import_eve_characters.delay(account.characters.all().values_list('id', flat=True), key_id=account.pk, callback=cb)
|
||||
|
||||
else:
|
||||
# No account object, just return
|
||||
if not account:
|
||||
return
|
||||
|
||||
error = doc['error']['code']
|
||||
if int(error) >= 500:
|
||||
# API disabled, down or rejecting, return without changes
|
||||
return
|
||||
elif error in ['202', '203', '204', '205', '212']:
|
||||
account.api_status = API_STATUS_AUTH_ERROR
|
||||
elif error == '211':
|
||||
account.api_status = API_STATUS_ACC_EXPIRED
|
||||
else:
|
||||
account.api_status = API_STATUS_OTHER_ERROR
|
||||
|
||||
if account.user:
|
||||
update_user_access.delay(account.user.id)
|
||||
|
||||
account.api_last_updated = datetime.utcnow()
|
||||
account.save()
|
||||
|
||||
# Check API keytype if we have a character and a unknown key status
|
||||
if account.api_keytype == API_KEYTYPE_UNKNOWN:
|
||||
keycheck = CachedDocument.objects.api_query('/account/AccountStatus.xml.aspx', params=auth_params, no_cache=True)
|
||||
keydoc = basic_xml_parse_doc(keycheck)['eveapi']
|
||||
|
||||
if 'error' in keydoc:
|
||||
account.api_keytype = API_KEYTYPE_LIMITED
|
||||
elif not 'error' in keydoc:
|
||||
account.api_keytype = API_KEYTYPE_FULL
|
||||
else:
|
||||
account.api_keytype = API_KEYTYPE_UNKNOWN
|
||||
|
||||
account.api_last_updated = datetime.utcnow()
|
||||
account.save()
|
||||
|
||||
tasklist = []
|
||||
|
||||
# Process the account's character list
|
||||
charlist = set(account.characters.all().values_list('id', flat=True))
|
||||
newcharlist = [int(char['characterID']) for char in doc['result']['characters']]
|
||||
|
||||
log.info("[CHAR] Current %s, New: %s, Remove: %s" % (charlist, newcharlist, set(charlist - set(newcharlist))))
|
||||
|
||||
for char in account.characters.filter(id__in=set(charlist - set(newcharlist))):
|
||||
account.characters.remove(char)
|
||||
|
||||
if account.user:
|
||||
cb = update_user_access.subtask(kwargs={'user': account.user.id })
|
||||
else:
|
||||
cb = None
|
||||
import_eve_characters.delay(newcharlist, api_key, api_userid, callback=cb)
|
||||
|
||||
return account
|
||||
|
||||
|
||||
@@ -4,18 +4,19 @@ import logging
|
||||
|
||||
from celery.decorators import task
|
||||
from celery.task.sets import subtask
|
||||
from gargoyle import gargoyle
|
||||
|
||||
from eve_proxy.exceptions import *
|
||||
from eve_proxy.models import CachedDocument
|
||||
|
||||
from eve_api.api_exceptions import *
|
||||
from eve_api.models import EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerCharacterRole, EVEPlayerCharacterSkill, EVESkill, EVEAccount
|
||||
from eve_api.models import EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerCharacterRole, EVEPlayerCharacterSkill, EVESkill, EVEAccount, EVEPlayerCharacterEmploymentHistory
|
||||
from eve_api.app_defines import *
|
||||
from eve_api.utils import basic_xml_parse, basic_xml_parse_doc
|
||||
|
||||
|
||||
@task()
|
||||
def import_eve_character(character_id, api_key=None, user_id=None, callback=None, **kwargs):
|
||||
def import_eve_character(character_id, key_id=None, callback=None, **kwargs):
|
||||
"""
|
||||
Imports a character from the API, providing a API key will populate
|
||||
further details. Returns a single EVEPlayerCharacter object
|
||||
@@ -24,10 +25,10 @@ def import_eve_character(character_id, api_key=None, user_id=None, callback=None
|
||||
|
||||
log = import_eve_character.get_logger()
|
||||
try:
|
||||
pchar = import_eve_character_func(character_id, api_key, user_id, log)
|
||||
pchar = import_eve_character_func(character_id, key_id, log)
|
||||
except APIAccessException, exc:
|
||||
log.error('Error importing character - flagging for retry')
|
||||
import_eve_character.retry(args=[character_id, api_key, user_id, callback], exc=exc, kwargs=kwargs)
|
||||
import_eve_character.retry(args=[character_id, key_id, callback], exc=exc, kwargs=kwargs)
|
||||
|
||||
if not pchar:
|
||||
log.error('Error importing character %s' % character_id)
|
||||
@@ -39,7 +40,7 @@ def import_eve_character(character_id, api_key=None, user_id=None, callback=None
|
||||
|
||||
|
||||
@task()
|
||||
def import_eve_characters(character_list, api_key=None, user_id=None, callback=None, **kwargs):
|
||||
def import_eve_characters(character_list, key_id=None, callback=None, **kwargs):
|
||||
"""
|
||||
Imports characters from the API, providing a API key will populate
|
||||
further details. Returns a list of EVEPlayerCharacter objects
|
||||
@@ -48,17 +49,17 @@ def import_eve_characters(character_list, api_key=None, user_id=None, callback=N
|
||||
|
||||
log = import_eve_characters.get_logger()
|
||||
try:
|
||||
results = [import_eve_character_func(char, api_key, user_id, log) for char in character_list]
|
||||
results = [import_eve_character_func(char, key_id, log) for char in character_list]
|
||||
except APIAccessException, exc:
|
||||
log.error('Error importing characters - flagging for retry')
|
||||
import_eve_characters.retry(args=[character_list, api_key, user_id, callback], exc=exc, kwargs=kwargs)
|
||||
import_eve_characters.retry(args=[character_list, key_id, callback], exc=exc, kwargs=kwargs)
|
||||
if callback:
|
||||
subtask(callback).delay(characters=results)
|
||||
else:
|
||||
return results
|
||||
|
||||
|
||||
def import_eve_character_func(character_id, api_key=None, user_id=None, logger=logging.getLogger(__name__)):
|
||||
def import_eve_character_func(character_id, key_id=None, logger=logging.getLogger(__name__)):
|
||||
|
||||
try:
|
||||
char_doc = CachedDocument.objects.api_query('/eve/CharacterInfo.xml.aspx', params={'characterID': character_id}, no_cache=False)
|
||||
@@ -82,7 +83,7 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
|
||||
pchar.security_status = values['securityStatus']
|
||||
|
||||
# Set corporation and join date
|
||||
corp, created = EVEPlayerCorporation.objects.get_or_create(id=values['corporationID'])
|
||||
corp, created = EVEPlayerCorporation.objects.get_or_create(pk=values['corporationID'])
|
||||
from eve_api.tasks.corporation import import_corp_details
|
||||
if created or not corp.name or corp.api_last_updated < (datetime.utcnow() - timedelta(hours=12)):
|
||||
import_corp_details.delay(values['corporationID'])
|
||||
@@ -97,9 +98,34 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
|
||||
pchar.race = val
|
||||
break
|
||||
|
||||
# If we have a valid API key, import the full character sheet
|
||||
if api_key and user_id:
|
||||
auth_params = {'userID': user_id, 'apiKey': api_key, 'characterID': character_id }
|
||||
# Import employment history if its made available
|
||||
if 'employmentHistory' in values:
|
||||
reclist = pchar.employmenthistory.values_list('pk', flat=True)
|
||||
for emp in values['employmentHistory']:
|
||||
if not emp['recordID'] in reclist:
|
||||
corp, created = EVEPlayerCorporation.objects.get_or_create(pk=emp['corporationID'])
|
||||
if created:
|
||||
import_corp_details.delay(emp['corporationID'])
|
||||
eobj, created = EVEPlayerCharacterEmploymentHistory.objects.get_or_create(pk=emp['recordID'], corporation=corp, character=pchar, start_date=emp['startDate'])
|
||||
|
||||
# We've been passed a Key ID, try and work with it
|
||||
if key_id:
|
||||
try:
|
||||
acc = EVEAccount.objects.get(pk=key_id)
|
||||
except EVEAccount.DoesNotExist:
|
||||
acc = None
|
||||
else:
|
||||
acc = None
|
||||
|
||||
# Actual Key? Get further information
|
||||
if acc:
|
||||
if gargoyle.is_active('eve-cak') and acc.is_cak:
|
||||
if not acc.has_access(3):
|
||||
logger.error('Key %s does not have access to CharacterSheet' % acc.pk)
|
||||
raise APIAccessException
|
||||
auth_params = {'keyid': acc.api_user_id, 'vcode': acc.api_key, 'characterid': character_id }
|
||||
else:
|
||||
auth_params = {'userID': acc.api_user_id, 'apiKey': acc.api_key, 'characterID': character_id }
|
||||
try:
|
||||
char_doc = CachedDocument.objects.api_query('/char/CharacterSheet.xml.aspx', params=auth_params, no_cache=False)
|
||||
except DocumentRetrievalError, exc:
|
||||
@@ -121,7 +147,7 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
|
||||
# Process the character's skills
|
||||
pchar.total_sp = 0
|
||||
for skill in values.get('skills', None):
|
||||
skillobj, created = EVESkill.objects.get_or_create(id=skill['typeID'])
|
||||
skillobj, created = EVESkill.objects.get_or_create(pk=skill['typeID'])
|
||||
charskillobj, created = EVEPlayerCharacterSkill.objects.get_or_create(skill=skillobj, character=pchar)
|
||||
if created or not charskillobj.level == int(skill['level']) or not charskillobj.skillpoints == int(skill['skillpoints']):
|
||||
charskillobj.level = int(skill['level'])
|
||||
@@ -139,7 +165,7 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
|
||||
queuedoc = queuedoc['eveapi']['result']
|
||||
EVEPlayerCharacterSkill.objects.filter(character=pchar).update(in_training=0)
|
||||
if int(queuedoc['skillInTraining']):
|
||||
skillobj, created = EVESkill.objects.get_or_create(id=queuedoc['trainingTypeID'])
|
||||
skillobj, created = EVESkill.objects.get_or_create(pk=queuedoc['trainingTypeID'])
|
||||
charskillobj, created = EVEPlayerCharacterSkill.objects.get_or_create(skill=skillobj, character=pchar)
|
||||
charskillobj.in_training = queuedoc['trainingToLevel']
|
||||
charskillobj.save()
|
||||
@@ -157,19 +183,14 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
|
||||
else:
|
||||
pchar.gender = API_GENDER_FEMALE
|
||||
|
||||
|
||||
pchar.api_last_updated = datetime.utcnow()
|
||||
pchar.save()
|
||||
|
||||
try:
|
||||
acc = EVEAccount.objects.get(pk=user_id)
|
||||
if acc:
|
||||
if not pchar.id in acc.characters.all().values_list('id', flat=True):
|
||||
acc.characters.add(pchar)
|
||||
|
||||
if pchar.director and acc.api_keytype == API_KEYTYPE_FULL:
|
||||
if pchar.director and acc.api_keytype in [API_KEYTYPE_FULL, API_KEYTYPE_CORPORATION]:
|
||||
from eve_api.tasks.corporation import import_corp_members
|
||||
import_corp_members.delay(api_key=api_key, api_userid=user_id, character_id=pchar.id)
|
||||
except EVEAccount.DoesNotExist:
|
||||
pass
|
||||
import_corp_members.delay(key_id=acc.pk, character_id=pchar.id)
|
||||
|
||||
return pchar
|
||||
|
||||
@@ -4,10 +4,12 @@ from datetime import datetime, timedelta
|
||||
from xml.dom import minidom
|
||||
|
||||
from celery.decorators import task
|
||||
from gargoyle import gargoyle
|
||||
|
||||
from eve_proxy.models import CachedDocument
|
||||
from eve_proxy.exceptions import DocumentRetrievalError
|
||||
from eve_api.models import EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerAlliance
|
||||
from eve_api.models import EVEPlayerCorporation, EVEPlayerCharacter, EVEPlayerAlliance, EVEAccount
|
||||
from eve_api.app_defines import *
|
||||
from eve_api.utils import basic_xml_parse_doc
|
||||
from eve_api.tasks.character import import_eve_character
|
||||
from eve_api.api_exceptions import APIAccessException
|
||||
@@ -110,7 +112,7 @@ def link_ceo(corporation, character):
|
||||
|
||||
|
||||
@task(ignore_result=True)
|
||||
def import_corp_members(api_userid, api_key, character_id):
|
||||
def import_corp_members(key_id, character_id):
|
||||
"""
|
||||
This function pulls all corporation members from the EVE API using a director's
|
||||
API key. It'll add as much information as it can about the character.
|
||||
@@ -118,8 +120,19 @@ def import_corp_members(api_userid, api_key, character_id):
|
||||
|
||||
log = import_corp_members.get_logger()
|
||||
|
||||
try:
|
||||
acc = EVEAccount.objects.get(pk=key_id)
|
||||
except EVEAccount.DoesNotExist:
|
||||
return
|
||||
|
||||
# grab and decode /corp/MemberTracking.xml.aspx
|
||||
auth_params = {'userID': api_userid, 'apiKey': api_key, 'characterID': character_id }
|
||||
if gargoyle.is_active('eve-cak') and acc.api_keytype == API_KEYTYPE_CORPORATION:
|
||||
if not acc.has_access(11):
|
||||
log.error('Key does not have access to MemberTracking', extra={'data': {'key_id': key_id, 'character_id': character_id}})
|
||||
return
|
||||
auth_params = {'keyid': acc.api_user_id, 'vcode': acc.api_key, 'characterID': character_id }
|
||||
else:
|
||||
auth_params = {'userID': acc.api_user_id, 'apiKey': acc.api_key, 'characterID': character_id }
|
||||
char_doc = CachedDocument.objects.api_query('/corp/MemberTracking.xml.aspx',
|
||||
params=auth_params,
|
||||
no_cache=False,
|
||||
@@ -127,7 +140,7 @@ def import_corp_members(api_userid, api_key, character_id):
|
||||
|
||||
pdoc = basic_xml_parse_doc(char_doc)
|
||||
if not 'eveapi' in pdoc or not 'result' in pdoc['eveapi']:
|
||||
log.error('Invalid XML document / API Error recceived', extra={'data': {'xml': char_doc.body, 'api_userid': api_userid, 'api_key': api_key, 'character_id': character_id}})
|
||||
log.error('Invalid XML document / API Error recceived', extra={'data': {'xml': char_doc.body, 'key_id': key_id, 'character_id': character_id}})
|
||||
return
|
||||
|
||||
corp = EVEPlayerCharacter.objects.get(id=character_id).corporation
|
||||
|
||||
@@ -1,11 +1,16 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% load gargoyle_tags %}
|
||||
|
||||
{% block title %}Add EVE API Key{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<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>
|
||||
|
||||
{% ifswitch switch_name %}
|
||||
<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">
|
||||
<table>
|
||||
|
||||
@@ -4,15 +4,11 @@
|
||||
|
||||
<h1>Character List</h1>
|
||||
|
||||
{% if characters %}
|
||||
|
||||
{% regroup characters by account as acc_list %}
|
||||
|
||||
<table>
|
||||
<tr><th>Character Name</th><th>Corporation</th><th>Alliance</th><th>Skillpoints</th><th>Training</th></tr>
|
||||
{% for acc in acc_list %}
|
||||
<tr><th colspan=5>Account {{ acc.grouper }} {% if acc.grouper.training == 0 %}<font color="#F87217">(No Character Training)</font>{% endif %}</th></tr>
|
||||
{% for char in acc.list %}
|
||||
{% for acc in accounts %}
|
||||
<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.characters.all %}
|
||||
<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>{% 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 %}
|
||||
</table>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
|
||||
@@ -34,6 +34,10 @@ def basic_xml_parse(nodes):
|
||||
values[node.attributes['name'].value] = rset
|
||||
else:
|
||||
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
|
||||
|
||||
|
||||
@@ -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))
|
||||
|
||||
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))
|
||||
|
||||
|
||||
@@ -53,7 +53,7 @@ def CreateApplicationForm(user):
|
||||
if char and corp:
|
||||
if char.corporation == 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()))
|
||||
|
||||
return self.cleaned_data
|
||||
|
||||
@@ -112,15 +112,18 @@ setup.</p>
|
||||
<td>{{ acc.get_api_keytype_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><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>,
|
||||
<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>, {% endifswitch %}
|
||||
<a href="{% url eve_api.views.eveapi_log acc.api_user_id %}">Logs</a>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
{% endif %}
|
||||
<p>
|
||||
{% ifswitch api-disableprocessing %}
|
||||
{% else %}
|
||||
<a href="{% url eve_api.views.eveapi_add %}" class="button">Add a Eve API key</a>
|
||||
{% endifswitch %}
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
Reference in New Issue
Block a user