diff --git a/eve_api/forms.py b/eve_api/forms.py new file mode 100644 index 0000000..00c50e2 --- /dev/null +++ b/eve_api/forms.py @@ -0,0 +1,33 @@ +import re + +from django import forms +from eve_api.models import EVEAccount, EVEPlayerCharacter, EVEPlayerCorporation + + +class EveAPIForm(forms.Form): + """ EVE API input form """ + + user_id = forms.IntegerField(label=u'User ID') + api_key = forms.CharField(label=u'API Key', max_length=64) + description = forms.CharField(max_length=100, required=False) + + def clean_api_key(self): + + if 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']): + raise forms.ValidationError("Provided API Key has invalid characters.") + + def clean_user_id(self): + + if not 'user_id' in self.cleaned_data or self.cleaned_data['user_id'] == '': + raise forms.ValidationError("Please provide a valid User ID") + + try: + eaccount = EVEAccount.objects.get(api_user_id=self.cleaned_data['user_id']) + except EVEAccount.DoesNotExist: + return self.cleaned_data + else: + raise forms.ValidationError("This API User ID is already registered") + diff --git a/eve_api/urls.py b/eve_api/urls.py new file mode 100644 index 0000000..047a1ed --- /dev/null +++ b/eve_api/urls.py @@ -0,0 +1,11 @@ +from django.conf.urls.defaults import * +from django.core.urlresolvers import reverse + +from eve_api import views + +urlpatterns = patterns('', + url(r'^eveapi/add/', views.eveapi_add, name="eveapi-add"), + url(r'^eveapi/delete/(?P\d+)/$', views.eveapi_del, name="eveapi-delete"), + url(r'^eveapi/refresh/(?P\d+)/$', views.eveapi_refresh, name="eveapi-refresh"), + url(r'^eveapi/log/(?P\d+)/$', views.eveapi_log, name="eveapi-log"), +) diff --git a/eve_api/views.py b/eve_api/views.py new file mode 100644 index 0000000..a979eb9 --- /dev/null +++ b/eve_api/views.py @@ -0,0 +1,92 @@ +import celery + +from django.shortcuts import render_to_response, get_object_or_404, redirect +from django.core.urlresolvers import reverse +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.template import RequestContext +from django.http import Http404 + +from eve_api.forms import EveAPIForm +from eve_api.models import EVEAccount, EVEPlayerCharacter +from eve_api.tasks import import_apikey_result + + +@login_required +def eveapi_add(request, post_save_redirect='/'): + """ Add a EVE API key to a user's account """ + + if request.method == 'POST': + form = EveAPIForm(request.POST) + if form.is_valid(): + + task = import_apikey_result.delay(api_key=form.cleaned_data['api_key'], api_userid=form.cleaned_data['user_id'], user=request.user.id) + try: + task.wait(10) + except celery.exceptions.TimeoutError: + msg = "The addition of your API key is still processing, please check back in a minute or so." + pass + else: + msg = "EVE API key %d successfully added." % form.cleaned_data['user_id'] + messages.success(request, msg, fail_silently=True) + return redirect(post_save_redirect) + else: + form = EveAPIForm() # An unbound form + + return render_to_response('eve_api/add.html', locals(), context_instance=RequestContext(request)) + + +@login_required +def eveapi_del(request, userid, post_save_redirect='/'): + """ Delete a EVE API key from a account """ + + try: + acc = EVEAccount.objects.get(id=userid) + except EVEAccount.DoesNotExist: + return redirect(post_save_redirect) + if acc.user == request.user: + acc.delete() + messages.success(request, "EVE API key successfully deleted.", fail_silently=True) + + return redirect(post_save_redirect) + + +@login_required +def eveapi_refresh(request, userid, post_save_redirect='/'): + """ Force refresh a EVE API key """ + + if userid > 0: + try: + acc = EVEAccount.objects.get(id=userid) + except EVEAccount.DoesNotExist: + pass + else: + if acc.user == request.user or request.user.is_superuser: + task = import_apikey_result.delay(api_key=acc.api_key, api_userid=acc.api_user_id, force_cache=True, user=request.user.id) + + if request.is_ajax(): + try: + acc = task.wait(30) + except celery.exceptions.TimeoutError: + acc = EVEAccount.objects.get(id=userid) + return HttpResponse(serializers.serialize('json', [acc]), mimetype='application/javascript') + else: + messages.add_message(request, messages.INFO, "Key %s has been queued to be refreshed from the API" % acc.api_user_id) + + return redirect(post_save_redirect) + + +@login_required +def eveproxy_log(request, userid): + """ Provides a list of access logs for a specific EVE API key """ + try: + acc = EVEAccount.objects.get(id=userid) + except EVEAccount.DoesNotExist: + pass + else: + if acc and (acc.user == request.user or request.user.is_staff): + logs = ApiAccessLog.objects.filter(userid=userid).order_by('-time_access')[:50] + return render_to_response('eve_api/log.html', locals(), context_instance=RequestContext(request)) + + raise Http404 + diff --git a/sso/urls.py b/sso/urls.py index 0d1d0f1..4d0df48 100644 --- a/sso/urls.py +++ b/sso/urls.py @@ -6,16 +6,11 @@ from sso import views urlpatterns = patterns('', ('^$', views.profile), (r'^profile/$', views.profile), - (r'^profile/add/eveapi', views.eveapi_add), - (r'^profile/del/eveapi/$', views.eveapi_del), - (r'^profile/del/eveapi/(?P\d+)/$', views.eveapi_del), (r'^profile/add/service', views.service_add), (r'^profile/del/service/$', views.service_del), (r'^profile/del/service/(?P\d+)/$', views.service_del), (r'^profile/reset/service/(?P\d+)/$', views.service_reset), (r'^profile/reset/service/(?P\d+)/(?P\d+)$', views.service_reset), - (r'^profile/refresh/eveapi/(?P\d+)/$', views.eveapi_refresh), - (r'^profile/log/eveapi/(?P\d+)/$', views.eveapi_log), (r'^profile/characters$', views.characters), (r'^profile/characters/(?P.*)/$', views.characters), (r'^profile/apipassword/', views.set_apipasswd), diff --git a/sso/views.py b/sso/views.py index 1c638e8..ce00e54 100644 --- a/sso/views.py +++ b/sso/views.py @@ -22,7 +22,7 @@ from eve_api.tasks import import_apikey, import_apikey_result from eve_proxy.models import ApiAccessLog from sso.models import ServiceAccount, Service, SSOUser, ExistingUser, ServiceError -from sso.forms import EveAPIForm, UserServiceAccountForm, ServiceAccountResetForm, UserLookupForm, APIPasswordForm +from sso.forms import UserServiceAccountForm, ServiceAccountResetForm, UserLookupForm, APIPasswordForm @login_required def profile(request): @@ -51,87 +51,6 @@ def characters(request, charid=0): return render_to_response('sso/characterlist.html', locals(), context_instance=RequestContext(request)) -@login_required -def eveapi_add(request): - """ Add a EVE API key to a user's account """ - - if request.method == 'POST': - form = EveAPIForm(request.POST) - if form.is_valid(): - - task = import_apikey.delay(api_key=form.cleaned_data['api_key'], api_userid=form.cleaned_data['user_id'], user=request.user.id) - try: - task.wait(5) - except celery.exceptions.TimeoutError: - messages.add_message(request, messages.INFO, "The addition of your API key is still processing, please check back in a minute or so") - pass - else: - messages.add_message(request, messages.INFO, "EVE API successfully added.") - - return redirect('sso.views.profile') - else: - form = EveAPIForm() # An unbound form - - return render_to_response('sso/eveapi.html', locals(), context_instance=RequestContext(request)) - - -@login_required -def eveapi_del(request, userid=0): - """ Delete a EVE API key from a account """ - - if userid > 0: - try: - acc = EVEAccount.objects.get(id=userid) - except EVEAccount.DoesNotExist: - return redirect('sso.views.profile') - if acc.user == request.user: - acc.delete() - messages.add_message(request, messages.INFO, "EVE API key successfully deleted.") - - return redirect('sso.views.profile') - - -@login_required -def eveapi_refresh(request, userid=0): - """ Force refresh a EVE API key """ - - if userid > 0: - try: - acc = EVEAccount.objects.get(id=userid) - except EVEAccount.DoesNotExist: - pass - else: - if acc.user == request.user or request.user.is_superuser: - task = import_apikey_result.delay(api_key=acc.api_key, api_userid=acc.api_user_id, force_cache=True, user=request.user.id) - - if request.is_ajax(): - try: - acc = task.wait(30) - except celery.exceptions.TimeoutError: - acc = EVEAccount.objects.get(id=userid) - return HttpResponse(serializers.serialize('json', [acc]), mimetype='application/javascript') - else: - messages.add_message(request, messages.INFO, "Key %s has been queued to be refreshed from the API" % acc.api_user_id) - - return redirect('sso.views.profile') - - -@login_required -def eveapi_log(request, userid=0): - """ Provides a list of access logs for a specific EVE API key """ - if userid > 0: - try: - acc = EVEAccount.objects.get(id=userid) - except: - pass - - if acc and (acc.user == request.user or request.user.is_staff): - logs = ApiAccessLog.objects.filter(userid=userid).order_by('-time_access')[:50] - return render_to_response('sso/eveapi_log.html', locals(), context_instance=RequestContext(request)) - - return redirect('sso.views.profile') - - @login_required def service_add(request): """ Add a service to a user's account """ diff --git a/templates/sso/eveapi.html b/templates/eve_api/add.html similarity index 60% rename from templates/sso/eveapi.html rename to templates/eve_api/add.html index 0cdae01..914ed2e 100644 --- a/templates/sso/eveapi.html +++ b/templates/eve_api/add.html @@ -7,7 +7,7 @@ href="http://eve-online.com/api">EVE Online API page and a optional description.

-
+ {{ form.as_table }}
@@ -15,6 +15,5 @@ page and a optional description.

{% csrf_token %}
-

Once you have added your EVE API key, don't forget to apply in game, as well as add an application through our -HR system.

+ {% endblock %} diff --git a/templates/sso/eveapi_log.html b/templates/eve_api/log.html similarity index 100% rename from templates/sso/eveapi_log.html rename to templates/eve_api/log.html diff --git a/templates/sso/profile.html b/templates/sso/profile.html index acdae04..35d5624 100644 --- a/templates/sso/profile.html +++ b/templates/sso/profile.html @@ -13,7 +13,7 @@ function refresh_apikey(key) { $("#api-status-" + key).html("
"); $("#api-time-" + key).html("
"); - $.getJSON("/profile/refresh/eveapi/" + key + "/", function(json) { + $.getJSON("/eve/eveapi/refresh/" + key + "/", function(json) { $("#api-time-" + json[0].fields.api_user_id).html("a moment ago"); switch(json[0].fields.api_status) { @@ -107,15 +107,15 @@ setup.

{{ acc.get_api_status_display }} {{ acc.api_last_updated|naturaltimediff }} Refresh,  - Logs,  - Delete + Logs,  + Delete {% endfor %} {% endif %}

-Add a Eve API key +Add a Eve API key


diff --git a/urls.py b/urls.py index 8dafaec..d8f896a 100644 --- a/urls.py +++ b/urls.py @@ -15,6 +15,7 @@ urlpatterns = patterns('', (r'^admin/', include(admin.site.urls)), ('', include('registration.urls')), ('', include('sso.urls')), + (r'^eve/', include('eve_api.urls')), (r'^eveapi/', include('eve_proxy.urls')), (r'^api/', include('api.urls')), (r'^hr/', include('hr.urls')),