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

Please fill in your API key as provided on the EVE Online API -page and a optional description.

+ +{% ifswitch switch_name %} +

Please fill in your API key as provided on the EVE Online API page and a optional description.

+{% else %} +

Please fill in your API key details and a optional description. You can create a API key on the API support site

+{% endifswitch %}
diff --git a/app/eve_api/templates/eve_api/character_list.html b/app/eve_api/templates/eve_api/character_list.html index a3aea6e..954e028 100644 --- a/app/eve_api/templates/eve_api/character_list.html +++ b/app/eve_api/templates/eve_api/character_list.html @@ -4,15 +4,11 @@

Character List

-{% if characters %} - -{% regroup characters by account as acc_list %} -
-{% for acc in acc_list %} - -{% for char in acc.list %} +{% for acc in accounts %} + +{% for char in acc.characters.all %} @@ -22,6 +18,5 @@ {% endfor %} {% endfor %}
Character NameCorporationAllianceSkillpointsTraining
Account {{ acc.grouper }} {% if acc.grouper.training == 0 %}(No Character Training){% endif %}
Key {{ acc.pk }} {% if acc.training == 0 %}(No Character Training){% endif %}
{{ char.name }} {{ char.corporation }} {% if char.corporation.alliance %}{{ char.corporation.alliance }}{% endif %}
-{% endif %} {% endblock %} diff --git a/app/eve_api/utils.py b/app/eve_api/utils.py index 860b7ed..840bcb5 100644 --- a/app/eve_api/utils.py +++ b/app/eve_api/utils.py @@ -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 diff --git a/app/eve_api/views.py b/app/eve_api/views.py index e07db6a..01cff25 100644 --- a/app/eve_api/views.py +++ b/app/eve_api/views.py @@ -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)) diff --git a/app/hr/forms.py b/app/hr/forms.py index 6fda43b..0f12bb5 100644 --- a/app/hr/forms.py +++ b/app/hr/forms.py @@ -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 diff --git a/app/sso/templates/sso/profile.html b/app/sso/templates/sso/profile.html index 261dbe4..04b639d 100644 --- a/app/sso/templates/sso/profile.html +++ b/app/sso/templates/sso/profile.html @@ -112,15 +112,18 @@ setup.

{{ acc.get_api_keytype_display }} {{ acc.get_api_status_display }} {{ acc.api_last_updated|naturaltimediff }} - Refresh,  - Update Key,  + {% ifswitch api-disableprocessing %}{% else %}Refresh,  + Update Key, {% endifswitch %} Logs {% endfor %} {% endif %}

+{% ifswitch api-disableprocessing %} +{% else %} Add a Eve API key +{% endifswitch %}