From 301aa58bf3d61c2896ad2abf70593bd8cf92b3a0 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Fri, 12 Mar 2010 16:36:46 +0000 Subject: [PATCH 1/5] Added a "Reddit Eligible" field in the admin interface. --- reddit/admin.py | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/reddit/admin.py b/reddit/admin.py index 4cfe1dd..96d499d 100644 --- a/reddit/admin.py +++ b/reddit/admin.py @@ -2,14 +2,35 @@ from django.contrib import admin from reddit.models import RedditAccount from reddit.forms import RedditAccountForm +from datetime import date + class RedditAccountAdmin(admin.ModelAdmin): - list_display = ('username', 'user', 'date_created', 'link_karma', 'comment_karma', 'last_update') + list_display = ('username', 'user', 'date_created', 'link_karma', 'comment_karma', 'last_update', 'is_valid') search_fields = ['username', 'user'] fields = ('user', 'username') form = RedditAccountForm + def is_valid(self, obj): + if not obj.date_created: + return False + + # Account 3 months old? + if (date.today() - obj.date_created.date()).days >= 90: + return True + + # Account created after 9/2/10 and before 13/2/10 + if obj.date_created.date() >= date(2010, 2, 9) and obj.date_created.date() <= date(2010, 2, 13): + return True + + return False + + + is_valid.short_description = 'Dreddit Eligible' + is_valid.boolean = True + + def save_model(self, request, obj, form, change): obj.api_update() obj.save() From b6c402f4fa848b6443315aa0f778fd250cd97a61 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Sun, 14 Mar 2010 02:27:16 +0000 Subject: [PATCH 2/5] Fixes the cron jobs and account validation, enables account deletion --- eve_api/api_puller/accounts.py | 11 +++++++++++ eve_api/cron.py | 1 + sso/cron.py | 13 +++---------- sso/models.py | 11 ++++++----- test.py | 11 +++++++---- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/eve_api/api_puller/accounts.py b/eve_api/api_puller/accounts.py index 383199b..1620d61 100755 --- a/eve_api/api_puller/accounts.py +++ b/eve_api/api_puller/accounts.py @@ -28,6 +28,17 @@ def import_eve_account(api_key, user_id): #print account_doc.body dom = minidom.parseString(account_doc.body) + + if dom.getElementsByTagName('error'): + try: + account = EVEAccount.objects.get(id=user_id) + except EVEAccount.DoesNotExist: + return + + account.api_status = API_STATUS_OTHER_ERROR + account.save() + return + characters_node_children = dom.getElementsByTagName('rowset')[0].childNodes # Create or retrieve the account last to make sure everything diff --git a/eve_api/cron.py b/eve_api/cron.py index f004bfb..920850e 100644 --- a/eve_api/cron.py +++ b/eve_api/cron.py @@ -3,6 +3,7 @@ import logging from django_cron import cronScheduler, Job from eve_api.models.api_player import EVEAccount, EVEPlayerCorporation import eve_api.api_puller.accounts +from eve_api.api_exceptions import APIAuthException, APINoUserIDException class UpdateAPIs(Job): """ diff --git a/sso/cron.py b/sso/cron.py index 94344cc..2a9c614 100644 --- a/sso/cron.py +++ b/sso/cron.py @@ -26,23 +26,16 @@ class RemoveInvalidUsers(Job): # Check each service account and delete access if they're not allowed for servacc in ServiceAccount.objects.filter(user=user): - - print servacc.service.groups.all() - print user.groups.all() - allowedgroups = servacc.service.groups.all() - - print set(servacc.service.groups.all()) & set(servacc.service.groups.all()) - - if not (set(servacc.service.groups.all()) & set(servacc.service.groups.all())): + if not (set(user.groups.all()) & set(servacc.service.groups.all())): print "User %s is not in allowed group for %s, deleting account" % (user.username, servacc.service) - #servacc.delete() + servacc.delete() pass # For users set to not active, delete all accounts if not user.is_active: print "User %s is inactive, deleting related service accounts" % user.username for servacc in ServiceAccount.objects.filter(user=user): - #servacc.delete() + servacc.delete() pass diff --git a/sso/models.py b/sso/models.py index d7fe891..2328db7 100644 --- a/sso/models.py +++ b/sso/models.py @@ -42,22 +42,23 @@ class SSOUser(models.Model): # Create a list of Char groups chargroups = [] for eacc in EVEAccount.objects.filter(user=self.user): - for char in eacc.characters.all(): - if char.corporation.group: - chargroups.append(char.corporation.group) + if eacc.api_status == 1: + for char in eacc.characters.all(): + if char.corporation.group: + chargroups.append(char.corporation.group) # Generate the list of groups to add/remove delgroups = set(set(self.user.groups.all()) & set(corpgroups)) - set(chargroups) addgroups = set(chargroups) - set(set(self.user.groups.all()) & set(corpgroups)) - print "Del:", delgroups for g in delgroups: self.user.groups.remove(g) - print "Add:", addgroups for g in addgroups: self.user.groups.add(g) + print "%s, Add: %s, Del: %s, Current: %s" % (self.user, addgroups, delgroups, self.user.groups.all()) + def __str__(self): return self.user.__str__() diff --git a/test.py b/test.py index 149338d..2d62731 100644 --- a/test.py +++ b/test.py @@ -1,9 +1,12 @@ import os os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' -from sso.models import Service -from sso.services.jabber import JabberService +from eve_api.cron import UpdateAPIs -b = JabberService() +b = UpdateAPIs() +b.job() -print b.check_user('matalok') +from sso.cron import RemoveInvalidUsers + +b = RemoveInvalidUsers() +b.job() From 84f625a90068cae7c2af225706334b0203cc9204 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Sun, 14 Mar 2010 03:35:09 +0000 Subject: [PATCH 3/5] Fixes #26, cleanup form validation issues. Due to the way the validation worked, all cleanup() functions are ran before the errors are returned. If the username didn't exist the existing user lookup failed. --- sso/forms.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/sso/forms.py b/sso/forms.py index fcadeeb..735b664 100644 --- a/sso/forms.py +++ b/sso/forms.py @@ -25,19 +25,6 @@ class EveAPIForm(forms.Form): else: raise forms.ValidationError("This API User ID is already registered") -class ServiceUsernameField(forms.CharField): - """ Extension of a CharField, does extra validation on username format and - also checks the username is free with ServiceAccount model """ - - def clean(self, request, initial=None): - field = super(ServiceUsernameField, self).clean(request) - - # Checks that usernames consist of letters and numbers only - if not re.match("^[A-Za-z0-9_-]*$", field): - raise forms.ValidationError("Invalid character in username, use letters and numbers only") - - return field - def UserServiceAccountForm(user): """ Generate a Service Account form based on the user's permissions """ @@ -47,13 +34,23 @@ def UserServiceAccountForm(user): """ Service Account Form """ service = forms.ModelChoiceField(queryset=services) - username = ServiceUsernameField(min_length=4,max_length=50) + username = forms.CharField(min_length=4,max_length=50) password = forms.CharField(label = u'Password',widget = forms.PasswordInput(render_value=False)) + def clean_username(self): + field = self.cleaned_data.get('username', '') + + # Checks that usernames consist of letters and numbers only + if not re.match("^[A-Za-z0-9_-]*$", field): + raise forms.ValidationError("Invalid character in username, use letters and numbers only") + + return field + + def clean(self): try: acc = ServiceAccount.objects.get(service_uid=self.cleaned_data['username'],service=self.cleaned_data['service']) - except ServiceAccount.DoesNotExist: + except (ServiceAccount.DoesNotExist, KeyError): pass else: raise forms.ValidationError("That username is already taken") From 3a31d3b3c1922db99b6f28802bfd36a7c327d793 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Sun, 14 Mar 2010 03:39:31 +0000 Subject: [PATCH 4/5] Fixes BaseService to return a uid value --- sso/services/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sso/services/__init__.py b/sso/services/__init__.py index cabf784..bad0c6b 100644 --- a/sso/services/__init__.py +++ b/sso/services/__init__.py @@ -32,7 +32,7 @@ class BaseService(): def add_user(self, username, password): """ Add a user, returns a UID for that user """ - pass + return username def check_user(self, username): """ Check if the username exists """ From 36e05f2d446395fd2da8dc9905ec47bd928fa0f2 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Sun, 14 Mar 2010 03:57:25 +0000 Subject: [PATCH 5/5] Fixed views to provide full header on all views --- sso/views.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/sso/views.py b/sso/views.py index 0514610..1e7bac2 100644 --- a/sso/views.py +++ b/sso/views.py @@ -65,9 +65,7 @@ def eveapi_add(request): else: form = EveAPIForm() # An unbound form - return render_to_response('sso/eveapi.html', { - 'form': form, - }) + return render_to_response('sso/eveapi.html', locals()) @login_required def eveapi_del(request, userid=0): @@ -109,9 +107,7 @@ def service_add(request): #defaults = { 'username': request.user.username, 'password': request.user.get_profile().default_service_passwd } form = clsform() # An unbound form - return render_to_response('sso/serviceaccount.html', { - 'form': form, - }) + return render_to_response('sso/serviceaccount.html', locals()) @login_required def service_del(request, serviceid=0): @@ -146,9 +142,7 @@ def reddit_add(request): defaults = { 'username': request.user.username, } form = RedditAccountForm(defaults) # An unbound form - return render_to_response('sso/redditaccount.html', { - 'form': form, - }) + return render_to_response('sso/redditaccount.html', locals()) @login_required def reddit_del(request, redditid=0): @@ -176,13 +170,9 @@ def user_view(request, user=None): if form.is_valid(): user = form.cleaned_data['username'] else: - return render_to_response('sso/userlookup.html', { - 'form': form, - }) + return render_to_response('sso/userlookup.html', locals()) else: - return render_to_response('sso/userlookup.html', { - 'form': form, - }) + return render_to_response('sso/userlookup.html', locals()) is_admin = request.user.is_staff