Correct longstanding issues with the EVEAccount object regarding its primary key

This commit is contained in:
2011-05-19 16:00:27 +01:00
parent 1533d937f4
commit d1afc15fc0
8 changed files with 177 additions and 15 deletions

View File

@@ -126,7 +126,7 @@ class OpTimerHandler(BaseHandler):
allowed_methods = ('GET') allowed_methods = ('GET')
def read(self, request, id=None): def read(self, request, id=None):
obj = get_object_or_404(EVEAccount, id=FULL_API_USER_ID) obj = get_object_or_404(EVEAccount, pk=FULL_API_USER_ID)
params = {'userID': obj.id, 'apiKey': obj.api_key, 'characterID': FULL_API_CHARACTER_ID} params = {'userID': obj.id, 'apiKey': obj.api_key, 'characterID': FULL_API_CHARACTER_ID}

View File

@@ -70,7 +70,7 @@ class V2EveAPIProxyHandler(BaseHandler):
try: try:
userid = request.GET.get('userid', None) userid = request.GET.get('userid', None)
obj = EVEAccount.objects.get(api_user_id=userid) obj = EVEAccount.objects.get(pk=userid)
params['apikey'] = obj.api_key params['apikey'] = obj.api_key
except EVEAccount.DoesNotExist: except EVEAccount.DoesNotExist:
pass pass

View File

@@ -0,0 +1,161 @@
# 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.id'
db.delete_column('eve_api_eveaccount', 'id')
# Changing field 'EVEAccount.api_user_id'
db.alter_column('eve_api_eveaccount', 'api_user_id', self.gf('django.db.models.fields.IntegerField')(primary_key=True))
# Adding unique constraint on 'EVEAccount', fields ['api_user_id']
db.create_unique('eve_api_eveaccount', ['api_user_id'])
def backwards(self, orm):
# User chose to not deal with backwards NULL issues for 'EVEAccount.id'
raise RuntimeError("Cannot reverse this migration. 'EVEAccount.id' 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_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'}),
'applications': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'ceo_character': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVEPlayerCharacter']", 'null': 'True', 'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.Group']", 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'logo_color1': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'logo_color2': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'logo_color3': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'logo_graphic_id': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'logo_shape1': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'logo_shape2': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'logo_shape3': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'member_count': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
'shares': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'tax_rate': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
'ticker': ('django.db.models.fields.CharField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
'url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
'eve_api.eveskill': {
'Meta': {'object_name': 'EVESkill'},
'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'group': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['eve_api.EVESkillGroup']", 'null': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
},
'eve_api.eveskillgroup': {
'Meta': {'object_name': 'EVESkillGroup'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'})
}
}
complete_apps = ['eve_api']

View File

@@ -8,14 +8,15 @@ class EVEAccount(EVEAPIModel):
Use this class to store EVE user account information. Note that its use is Use this class to store EVE user account information. Note that its use is
entirely optional and up to the developer's discretion. entirely optional and up to the developer's discretion.
""" """
api_user_id = models.IntegerField(primary_key=True, verbose_name="API User ID",
help_text="EVE API User ID")
api_key = models.CharField(max_length=64, verbose_name="API Key",
help_text="EVE API Key")
user = models.ForeignKey(User, blank=True, null=True, user = models.ForeignKey(User, blank=True, null=True,
help_text="User that owns this account") help_text="User that owns this account")
description = models.CharField(max_length=50, blank=True, description = models.CharField(max_length=50, blank=True,
help_text="User-provided description.") help_text="User-provided description.")
api_key = models.CharField(max_length=64, verbose_name="API Key",
help_text="EVE API Key")
api_user_id = models.IntegerField(verbose_name="API User ID",
help_text="EVE API User ID")
characters = models.ManyToManyField('eve_api.EVEPlayerCharacter', blank=True, null=True) characters = models.ManyToManyField('eve_api.EVEPlayerCharacter', blank=True, null=True)
api_status = models.IntegerField(choices=API_STATUS_CHOICES, api_status = models.IntegerField(choices=API_STATUS_CHOICES,
default=API_STATUS_PENDING, default=API_STATUS_PENDING,

View File

@@ -79,7 +79,7 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=lo
# Checks for a document error # Checks for a document error
if 'error' in doc: if 'error' in doc:
try: try:
account = EVEAccount.objects.get(id=api_userid) account = EVEAccount.objects.get(api_user_id=api_userid)
except EVEAccount.DoesNotExist: except EVEAccount.DoesNotExist:
# If no Account exists in the DB, just ignore it # If no Account exists in the DB, just ignore it
return return
@@ -102,7 +102,7 @@ def import_apikey_func(api_userid, api_key, user=None, force_cache=False, log=lo
# Create or retrieve the account last to make sure everything # Create or retrieve the account last to make sure everything
# before here is good to go. # before here is good to go.
account, created = EVEAccount.objects.get_or_create(id=api_userid, api_user_id=api_userid) account, created = EVEAccount.objects.get_or_create(api_user_id=api_userid, api_user_id=api_userid)
account.api_key = api_key account.api_key = api_key
account.api_status = API_STATUS_OK account.api_status = API_STATUS_OK
if user and created: if user and created:

View File

@@ -155,7 +155,7 @@ def import_eve_character_func(character_id, api_key=None, user_id=None, logger=l
pchar.save() pchar.save()
try: try:
acc = EVEAccount.objects.get(api_user_id=user_id) acc = EVEAccount.objects.get(pk=user_id)
if not pchar.id in acc.characters.all().values_list('id', flat=True): if not pchar.id in acc.characters.all().values_list('id', flat=True):
acc.characters.add(pchar) acc.characters.add(pchar)

View File

@@ -49,7 +49,7 @@ def eveapi_add(request, post_save_redirect='/'):
def eveapi_update(request, userid, post_save_redirect='/'): def eveapi_update(request, userid, post_save_redirect='/'):
""" Update a EVE API Key """ """ Update a EVE API Key """
acc = get_object_or_404(EVEAccount, id=userid) acc = get_object_or_404(EVEAccount, pk=userid)
if not acc.user == request.user and not request.user.is_staff: if not acc.user == request.user and not request.user.is_staff:
raise Http404 raise Http404
@@ -88,7 +88,7 @@ def eveapi_del(request, userid, post_save_redirect='/'):
""" Delete a EVE API key from a account """ """ Delete a EVE API key from a account """
try: try:
acc = EVEAccount.objects.get(id=userid) acc = EVEAccount.objects.get(pk=userid)
except EVEAccount.DoesNotExist: except EVEAccount.DoesNotExist:
return redirect(post_save_redirect) return redirect(post_save_redirect)
if acc.user == request.user: if acc.user == request.user:
@@ -103,7 +103,7 @@ def eveapi_refresh(request, userid, post_save_redirect='/'):
""" Force refresh a EVE API key """ """ Force refresh a EVE API key """
try: try:
acc = EVEAccount.objects.get(id=userid) acc = EVEAccount.objects.get(pk=userid)
except EVEAccount.DoesNotExist: except EVEAccount.DoesNotExist:
pass pass
else: else:
@@ -113,7 +113,7 @@ def eveapi_refresh(request, userid, post_save_redirect='/'):
try: try:
acc = task.wait(30) acc = task.wait(30)
except (celery.exceptions.TimeoutError, DocumentRetrievalError): except (celery.exceptions.TimeoutError, DocumentRetrievalError):
acc = EVEAccount.objects.get(id=userid) acc = EVEAccount.objects.get(pk=userid)
if acc: if acc:
ret = [acc] ret = [acc]
else: else:
@@ -129,7 +129,7 @@ def eveapi_refresh(request, userid, post_save_redirect='/'):
def eveapi_log(request, userid): def eveapi_log(request, userid):
""" Provides a list of access logs for a specific EVE API key """ """ Provides a list of access logs for a specific EVE API key """
acc = get_object_or_404(EVEAccount, id=userid) acc = get_object_or_404(EVEAccount, pk=userid)
if acc and (acc.user == request.user or request.user.is_staff): if acc and (acc.user == request.user or request.user.is_staff):
logs = ApiAccessLog.objects.filter(userid=userid).order_by('-time_access')[:50] logs = ApiAccessLog.objects.filter(userid=userid).order_by('-time_access')[:50]
return render_to_response('eve_api/log.html', locals(), context_instance=RequestContext(request)) return render_to_response('eve_api/log.html', locals(), context_instance=RequestContext(request))

View File

@@ -208,7 +208,7 @@ def user_lookup(request):
elif form.cleaned_data['type'] == '4': elif form.cleaned_data['type'] == '4':
users = User.objects.filter(email__icontains=form.cleaned_data['username']).only('username') users = User.objects.filter(email__icontains=form.cleaned_data['username']).only('username')
elif form.cleaned_data['type'] == '5': elif form.cleaned_data['type'] == '5':
uids = EVEAccount.objects.filter(id__icontains=form.cleaned_data['username']).values_list('user', flat=True) uids = EVEAccount.objects.filter(api_user_id__icontains=form.cleaned_data['username']).values_list('user', flat=True)
users = User.objects.filter(id__in=uids).only('username') users = User.objects.filter(id__in=uids).only('username')
else: else:
messages.add_message(request, messages.ERROR, "Error parsing form, Type: %s, Value: %s" % (form.cleaned_data['type'], form.cleaned_data['username'])) messages.add_message(request, messages.ERROR, "Error parsing form, Type: %s, Value: %s" % (form.cleaned_data['type'], form.cleaned_data['username']))