From 289f591eac47f5632c413b073af336ebedb3c453 Mon Sep 17 00:00:00 2001 From: Andrew Williams Date: Wed, 7 Dec 2011 19:29:40 +0000 Subject: [PATCH] Added the ability to add notes to user's accounts --- app/sso/forms.py | 17 +++++++++- app/sso/templates/sso/add_usernote.html | 24 ++++++++++++++ app/sso/templates/sso/lookup/user.html | 19 +++++++++++ app/sso/urls.py | 4 ++- app/sso/views.py | 43 +++++++++++++++++++++++-- 5 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 app/sso/templates/sso/add_usernote.html diff --git a/app/sso/forms.py b/app/sso/forms.py index c53025b..4b23901 100644 --- a/app/sso/forms.py +++ b/app/sso/forms.py @@ -9,7 +9,7 @@ from gargoyle import gargoyle from utils import installed from eve_api.models import EVEAccount, EVEPlayerCharacter, EVEPlayerCorporation -from sso.models import ServiceAccount, Service +from sso.models import ServiceAccount, Service, SSOUserNote from registration.forms import RegistrationForm @@ -139,3 +139,18 @@ class PrimaryCharacterForm(forms.Form): if self.user: self.fields['character'].queryset = EVEPlayerCharacter.objects.filter(eveaccount__user=self.user).distinct() + +class UserNoteForm(forms.ModelForm): + + class Meta: + model = SSOUserNote + exclude = ('created_by', 'created_date') + widgets = { + 'user': forms.HiddenInput(), + 'note': forms.Textarea(), + } + + def clean_note(self): + data = self.cleaned_data['note'] + # Clean dodgy text? + return data diff --git a/app/sso/templates/sso/add_usernote.html b/app/sso/templates/sso/add_usernote.html new file mode 100644 index 0000000..2bce91c --- /dev/null +++ b/app/sso/templates/sso/add_usernote.html @@ -0,0 +1,24 @@ +{% extends "base.html" %} + +{% block title %}Add User Note{% endblock %} + +{% block content %} + + + +

This will add a note to {{ user.username }}'s account that'll be visible to everyone able to view user profiles

+ +
+
+ {% include "formtools/formerror.html" %} + {% include "formtools/formfield.html" with field=form.user %} + {% include "formtools/formfield.html" with field=form.note class="xxlarge" %} + {% csrf_token %} + +
+
+ +{% endblock %} + diff --git a/app/sso/templates/sso/lookup/user.html b/app/sso/templates/sso/lookup/user.html index 7c9a435..ab58d0f 100644 --- a/app/sso/templates/sso/lookup/user.html +++ b/app/sso/templates/sso/lookup/user.html @@ -28,8 +28,27 @@ Blacklist User {% endif %} {% endif %} +{% if perms.sso.add_ssousernote %} +Add Note +{% endif %}

+{% if user.notes.count %} +

User Notes

+ + + + + + + {% for note in user.notes.all %} + + {% endfor %} + +
NoteDateAdded By
{{ note.note|linebreaks }}{{ note.date_created|date:"Y/m/d H:i:s" }}{{ note.created_by }}
+{% endif %} + + {% if services %}

Service Accounts

diff --git a/app/sso/urls.py b/app/sso/urls.py index 4fad51c..69e8144 100644 --- a/app/sso/urls.py +++ b/app/sso/urls.py @@ -1,6 +1,7 @@ from django.conf.urls.defaults import * from django.core.urlresolvers import reverse from django.contrib.auth.views import password_change, password_change_done +from django.contrib.auth.decorators import login_required from sso import views @@ -19,8 +20,9 @@ urlpatterns = patterns('', (r'^profile/change/email/$', views.email_change), (r'^profile/change/primary/$', views.primarychar_change), (r'^profile/change/reddittag/$', views.toggle_reddit_tagging), - (r'^users/(?P.*)/$', views.user_view), (r'^users/$', views.user_lookup), + url(r'^users/(?P.*)/addnote/$', login_required(views.AddUserNote.as_view()), name='sso-addusernote'), + url(r'^users/(?P.*)/$', views.user_view, name='sso-viewuser'), ) urlpatterns += patterns('django.views.generic.simple', diff --git a/app/sso/views.py b/app/sso/views.py index 6b1b8ca..870a13e 100644 --- a/app/sso/views.py +++ b/app/sso/views.py @@ -4,7 +4,7 @@ import re import unicodedata import celery -from django.http import HttpResponse +from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseForbidden from django.shortcuts import render_to_response, get_object_or_404, redirect from django.core.urlresolvers import reverse from django.contrib import messages @@ -13,6 +13,7 @@ from django.contrib.auth.decorators import login_required from django.template import RequestContext from django.core import serializers from django.conf import settings +from django.views.generic import FormView from gargoyle import gargoyle from gargoyle.decorators import switch_is_active @@ -23,7 +24,7 @@ from eve_api.tasks import import_apikey, import_apikey_result, update_user_acces from eve_proxy.models import ApiAccessLog from reddit.tasks import update_user_flair from sso.models import ServiceAccount, Service, SSOUser, ExistingUser, ServiceError -from sso.forms import UserServiceAccountForm, ServiceAccountResetForm, UserLookupForm, APIPasswordForm, EmailChangeForm, PrimaryCharacterForm +from sso.forms import UserServiceAccountForm, ServiceAccountResetForm, UserLookupForm, APIPasswordForm, EmailChangeForm, PrimaryCharacterForm, UserNoteForm @login_required def profile(request): @@ -315,3 +316,41 @@ def toggle_reddit_tagging(request): messages.add_message(request, messages.ERROR, "You need to set a primary character before using this feature!") return redirect('sso.views.profile') + + +class AddUserNote(FormView): + + template_name = 'sso/add_usernote.html' + form_class = UserNoteForm + + def dispatch(self, request, *args, **kwargs): + if not request.user.has_perm('add_ssousernote'): + return HttpResponseForbidden() + return super(AddUserNote, self).dispatch(request, *args, **kwargs) + + def get_user(self): + if not hasattr(self, 'user'): + userid = self.kwargs.get('username', None) + self.user = User.objects.get(username=userid) + return self.user + + def get_context_data(self, **kwargs): + ctx = super(AddUserNote, self).get_context_data(**kwargs) + ctx['user'] = self.get_user() + return ctx + + def get_initial(self): + initial = super(AddUserNote, self).get_initial() + initial['user'] = self.get_user() + return initial + + def get_success_url(self): + return reverse('sso-viewuser', args=[self.get_user()]) + + def form_valid(self, form): + + obj = form.save(commit=False) + obj.created_by = self.request.user + obj.save() + + return super(AddUserNote, self).form_valid(form)