From fe54116057c7d0da3184867e13764da731e437d2 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Tue, 23 Mar 2010 12:59:16 +0000 Subject: [PATCH] Massive reworking on the user lookup form to support various other lookup types (Character/Reddit ID) --- sso/forms.py | 27 ++++-- sso/urls.py | 4 +- sso/views.py | 99 ++++++++++++---------- templates/sso/lookup/lookuplist.html | 15 ++++ templates/sso/{ => lookup}/user.html | 0 templates/sso/{ => lookup}/userlookup.html | 0 6 files changed, 93 insertions(+), 52 deletions(-) create mode 100644 templates/sso/lookup/lookuplist.html rename templates/sso/{ => lookup}/user.html (100%) rename templates/sso/{ => lookup}/userlookup.html (100%) diff --git a/sso/forms.py b/sso/forms.py index b79829d..eaac5a4 100644 --- a/sso/forms.py +++ b/sso/forms.py @@ -17,7 +17,6 @@ class EveAPIForm(forms.Form): def clean(self): if not len(self.cleaned_data['api_key']) == 64: raise forms.ValidationError("API Key provided is invalid (Not 64 characters long)") - try: eaccount = EVEAccount.objects.get(api_user_id=self.cleaned_data['user_id']) except EVEAccount.DoesNotExist: @@ -61,11 +60,29 @@ class RedditAccountForm(forms.Form): class UserLookupForm(forms.Form): """ User Lookup Form """ + choices = [ (1, "Auth Username"), + (2, "Character"), + (3, "Reddit ID") ] + + type = forms.ChoiceField(label = u'Search type', choices = choices) username = forms.CharField(label = u'User ID', max_length=64) def clean(self): - try: - acc = User.objects.get(username=self.cleaned_data['username']) - except User.DoesNotExist: - raise forms.ValidationError("User doesn't exist") + + if self.cleaned_data['type'] == 1: + try: + acc = User.objects.filter(username=self.cleaned_data['username']) + except User.DoesNotExist: + raise forms.ValidationError("User doesn't exist") + elif self.cleaned_data['type'] == 2: + try: + acc = EVEPlayerCharacter.filter(name=self.cleaned_data['username']) + except User.DoesNotExist: + raise forms.ValidationError("Character doesn't exist") + elif self.cleaned_data['type'] == 3: + try: + acc = RedditAccount.filter(name=self.cleaned_data['username']) + except User.DoesNotExist: + raise forms.ValidationError("Account doesn't exist") + return self.cleaned_data diff --git a/sso/urls.py b/sso/urls.py index ceab6b6..c978f21 100644 --- a/sso/urls.py +++ b/sso/urls.py @@ -18,6 +18,6 @@ urlpatterns = patterns('', (r'^profile/del/reddit/(?P\d+)/$', views.reddit_del), (r'^profile/characters$', views.characters), (r'^profile/characters/(?P.*)/$', views.characters), - (r'^users/(?P.*)/$', views.user_view), - (r'^users/$', views.user_view), + (r'^users/(?P.*)/$', views.user_view), + (r'^users/$', views.user_lookup), ) diff --git a/sso/views.py b/sso/views.py index 360a4fe..35e8768 100644 --- a/sso/views.py +++ b/sso/views.py @@ -155,7 +155,6 @@ def service_del(request, serviceid=0): return HttpResponseRedirect(reverse('sso.views.profile')) if request.method == 'POST': - print request.POST if 'confirm-delete' in request.POST: acc.delete() request.user.message_set.create(message="Service account successfully deleted.") @@ -190,14 +189,11 @@ def service_reset(request, serviceid=0, accept=0): def reddit_add(request): if request.method == 'POST': form = RedditAccountForm(request.POST) - if form.is_valid(): - + if form.is_valid(): acc = RedditAccount() - acc.user = request.user acc.username = form.cleaned_data['username'] acc.api_update() - acc.save() request.user.message_set.create(message="Reddit account %s successfully added." % acc.username) @@ -225,47 +221,60 @@ def reddit_del(request, redditid=0): @login_required -def user_view(request, user=None): +def user_view(request, username=None): + if username: + user = User.objects.get(username=username) + else: + return HttpResponseRedirect(reverse('sso.views.user_lookup')) + + profile = user.get_profile() + is_admin = request.user.is_staff + if is_admin: + try: + services = ServiceAccount.objects.filter(user=user).all() + except ServiceAccount.DoesNotExist: + services = None + try: + reddits = RedditAccount.objects.filter(user=user).all() + except ServiceAccount.DoesNotExist: + reddits = None + try: + eveaccounts = EVEAccount.objects.filter(user=user).all() + characters = [] + for acc in eveaccounts: + chars = acc.characters.all() + for char in chars: + characters.append({'name': char.name, 'corp': char.corporation.name}) + except EVEAccount.DoesNotExist: + eveaccounts = None + + return render_to_response('sso/lookup/user.html', locals(), context_instance=RequestContext(request)) + +def user_lookup(request): form = UserLookupForm() - if user: - user = user - elif request.method == 'POST': - form = UserLookupForm(request.POST) + if request.method == 'POST': + form = UserLookupForm(request.POST) if form.is_valid(): - user = form.cleaned_data['username'] - else: - return render_to_response('sso/userlookup.html', locals(), context_instance=RequestContext(request)) - else: - return render_to_response('sso/userlookup.html', locals(), context_instance=RequestContext(request)) + users = None + uids = [] + if form.cleaned_data['type'] == '1': + users = User.objects.filter(username=form.cleaned_data['username']) + elif form.cleaned_data['type'] == '2': + uid = EVEAccount.objects.filter(characters__name=form.cleaned_data['username']).values('user') + for u in uid: uids.append(u['user']) + users = User.objects.filter(id__in=uids) + elif form.cleaned_data['type'] == '3': + uid = RedditAccount.objects.filter(username=form.cleaned_data['username']).values('user') + for u in uid: uids.append(u['user']) + users = User.objects.filter(id__in=uids) + else: + request.user.message_set.create(message="Error parsing form, Type: %s, Value: %s" % (form.cleaned_data['type'], form.cleaned_data['username'])) + return HttpResponseRedirect(reverse('sso.views.user_lookup')) - is_admin = request.user.is_staff - - user = User.objects.get(username=user) - profile = user.get_profile() - - if is_admin: - try: - services = ServiceAccount.objects.filter(user=user).all() - except ServiceAccount.DoesNotExist: - services = None - - try: - reddits = RedditAccount.objects.filter(user=user).all() - except ServiceAccount.DoesNotExist: - reddits = None - - try: - eveaccounts = EVEAccount.objects.filter(user=user).all() - - characters = [] - - for acc in eveaccounts: - chars = acc.characters.all() - for char in chars: - characters.append({'name': char.name, 'corp': char.corporation.name}) - - except EVEAccount.DoesNotExist: - eveaccounts = None - - return render_to_response('sso/user.html', locals(), context_instance=RequestContext(request)) + if users and len(users) == 1: + return HttpResponseRedirect(reverse(user_view, kwargs={'username': users[0].username})) + elif users and len(users) > 1: + render_to_response('sso/lookup/lookuplist.html', locals(), context_instance=RequestContext(request)) + + return render_to_response('sso/lookup/userlookup.html', locals(), context_instance=RequestContext(request)) diff --git a/templates/sso/lookup/lookuplist.html b/templates/sso/lookup/lookuplist.html new file mode 100644 index 0000000..ce8e603 --- /dev/null +++ b/templates/sso/lookup/lookuplist.html @@ -0,0 +1,15 @@ +{% extends "base.html" %} + +{% block title %}User Lookup List{% endblock %} + +{% block content %} + +

More than one user was found matching your criteria:

+ + + +{% endblock %} diff --git a/templates/sso/user.html b/templates/sso/lookup/user.html similarity index 100% rename from templates/sso/user.html rename to templates/sso/lookup/user.html diff --git a/templates/sso/userlookup.html b/templates/sso/lookup/userlookup.html similarity index 100% rename from templates/sso/userlookup.html rename to templates/sso/lookup/userlookup.html