summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--devel/forms.py99
-rw-r--r--devel/views.py106
2 files changed, 109 insertions, 96 deletions
diff --git a/devel/forms.py b/devel/forms.py
new file mode 100644
index 0000000..861a576
--- /dev/null
+++ b/devel/forms.py
@@ -0,0 +1,99 @@
+import random
+from string import ascii_letters, digits
+
+from django import forms
+from django.contrib.auth.models import User, Group
+from django.contrib.sites.models import Site
+from django.core.mail import send_mail
+from django.template import loader, Context
+
+from .models import UserProfile
+
+
+class ProfileForm(forms.Form):
+ email = forms.EmailField(label='Private email (not shown publicly):',
+ help_text="Used for out-of-date notifications, etc.")
+ passwd1 = forms.CharField(label='New Password', required=False,
+ widget=forms.PasswordInput)
+ passwd2 = forms.CharField(label='Confirm Password', required=False,
+ widget=forms.PasswordInput)
+
+ def clean(self):
+ if self.cleaned_data['passwd1'] != self.cleaned_data['passwd2']:
+ raise forms.ValidationError('Passwords do not match.')
+ return self.cleaned_data
+
+
+class UserProfileForm(forms.ModelForm):
+ def clean_pgp_key(self):
+ data = self.cleaned_data['pgp_key']
+ # strip 0x prefix if provided; store uppercase
+ if data.startswith('0x'):
+ data = data[2:]
+ return data.upper()
+
+ class Meta:
+ model = UserProfile
+ exclude = ('allowed_repos', 'user', 'latin_name')
+
+
+class NewUserForm(forms.ModelForm):
+ username = forms.CharField(max_length=30)
+ private_email = forms.EmailField()
+ first_name = forms.CharField(required=False)
+ last_name = forms.CharField(required=False)
+ groups = forms.ModelMultipleChoiceField(required=False,
+ queryset=Group.objects.all())
+
+ class Meta:
+ model = UserProfile
+ exclude = ('picture', 'user')
+
+ def __init__(self, *args, **kwargs):
+ super(NewUserForm, self).__init__(*args, **kwargs)
+ # Hack ourself so certain fields appear first. self.fields is a
+ # SortedDict object where we can manipulate the keyOrder list.
+ order = self.fields.keyOrder
+ keys = ('username', 'private_email', 'first_name', 'last_name')
+ for key in reversed(keys):
+ order.remove(key)
+ order.insert(0, key)
+
+ def clean_username(self):
+ username = self.cleaned_data['username']
+ if User.objects.filter(username=username).exists():
+ raise forms.ValidationError(
+ "A user with that username already exists.")
+ return username
+
+ def save(self, commit=True):
+ profile = super(NewUserForm, self).save(False)
+ pwletters = ascii_letters + digits
+ password = ''.join([random.choice(pwletters) for _ in xrange(8)])
+ user = User.objects.create_user(username=self.cleaned_data['username'],
+ email=self.cleaned_data['private_email'], password=password)
+ user.first_name = self.cleaned_data['first_name']
+ user.last_name = self.cleaned_data['last_name']
+ user.save()
+ # sucks that the MRM.add() method can't take a list directly... we have
+ # to resort to dirty * magic.
+ user.groups.add(*self.cleaned_data['groups'])
+ profile.user = user
+ if commit:
+ profile.save()
+ self.save_m2m()
+
+ template = loader.get_template('devel/new_account.txt')
+ ctx = Context({
+ 'site': Site.objects.get_current(),
+ 'user': user,
+ 'password': password,
+ })
+
+ send_mail("Your new archweb account",
+ template.render(ctx),
+ 'Arch Website Notification <nobody@archlinux.org>',
+ [user.email],
+ fail_silently=False)
+
+# vim: set ts=4 sw=4 et:
diff --git a/devel/views.py b/devel/views.py
index ad1f4de..5406974 100644
--- a/devel/views.py
+++ b/devel/views.py
@@ -1,31 +1,25 @@
from datetime import timedelta
import operator
import pytz
-import random
-from string import ascii_letters, digits
import time
-from django import forms
from django.http import HttpResponseRedirect
from django.contrib.auth.decorators import \
login_required, permission_required, user_passes_test
from django.contrib.admin.models import LogEntry, ADDITION
-from django.contrib.auth.models import User, Group
+from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
-from django.contrib.sites.models import Site
-from django.core.mail import send_mail
from django.db import transaction
from django.db.models import F, Count, Max
from django.http import Http404
from django.shortcuts import get_object_or_404, render
-from django.template import loader, Context
from django.template.defaultfilters import filesizeformat
from django.views.decorators.cache import never_cache
from django.utils.encoding import force_unicode
from django.utils.http import http_date
from django.utils.timezone import now
-from .models import UserProfile
+from .forms import ProfileForm, UserProfileForm, NewUserForm
from main.models import Package, PackageFile, TodolistPkg
from main.models import Arch, Repo
from news.models import News
@@ -89,6 +83,7 @@ def index(request):
return render(request, 'devel/index.html', page_dict)
+
@login_required
def clock(request):
devs = User.objects.filter(is_active=True).order_by(
@@ -141,30 +136,6 @@ def clock(request):
response['Expires'] = http_date(expire_time)
return response
-class ProfileForm(forms.Form):
- email = forms.EmailField(label='Private email (not shown publicly):',
- help_text="Used for out-of-date notifications, etc.")
- passwd1 = forms.CharField(label='New Password', required=False,
- widget=forms.PasswordInput)
- passwd2 = forms.CharField(label='Confirm Password', required=False,
- widget=forms.PasswordInput)
-
- def clean(self):
- if self.cleaned_data['passwd1'] != self.cleaned_data['passwd2']:
- raise forms.ValidationError('Passwords do not match.')
- return self.cleaned_data
-
-class UserProfileForm(forms.ModelForm):
- def clean_pgp_key(self):
- data = self.cleaned_data['pgp_key']
- # strip 0x prefix if provided; store uppercase
- if data.startswith('0x'):
- data = data[2:]
- return data.upper()
-
- class Meta:
- model = UserProfile
- exclude = ('allowed_repos', 'user', 'latin_name')
@login_required
@never_cache
@@ -177,8 +148,9 @@ def change_profile(request):
request.user.email = form.cleaned_data['email']
if form.cleaned_data['passwd1']:
request.user.set_password(form.cleaned_data['passwd1'])
- request.user.save()
- profile_form.save()
+ with transaction.commit_on_success():
+ request.user.save()
+ profile_form.save()
return HttpResponseRedirect('/devel/')
else:
form = ProfileForm(initial={'email': request.user.email})
@@ -186,6 +158,7 @@ def change_profile(request):
return render(request, 'devel/profile.html',
{'form': form, 'profile_form': profile_form})
+
@login_required
def report(request, report_name, username=None):
title = 'Developer Report'
@@ -309,65 +282,6 @@ def report(request, report_name, username=None):
return render(request, 'devel/packages.html', context)
-class NewUserForm(forms.ModelForm):
- username = forms.CharField(max_length=30)
- private_email = forms.EmailField()
- first_name = forms.CharField(required=False)
- last_name = forms.CharField(required=False)
- groups = forms.ModelMultipleChoiceField(required=False,
- queryset=Group.objects.all())
-
- class Meta:
- model = UserProfile
- exclude = ('picture', 'user')
-
- def __init__(self, *args, **kwargs):
- super(NewUserForm, self).__init__(*args, **kwargs)
- # Hack ourself so certain fields appear first. self.fields is a
- # SortedDict object where we can manipulate the keyOrder list.
- order = self.fields.keyOrder
- keys = ('username', 'private_email', 'first_name', 'last_name')
- for key in reversed(keys):
- order.remove(key)
- order.insert(0, key)
-
- def clean_username(self):
- username = self.cleaned_data['username']
- if User.objects.filter(username=username).exists():
- raise forms.ValidationError(
- "A user with that username already exists.")
- return username
-
- def save(self, commit=True):
- profile = super(NewUserForm, self).save(False)
- pwletters = ascii_letters + digits
- password = ''.join([random.choice(pwletters) for _ in xrange(8)])
- user = User.objects.create_user(username=self.cleaned_data['username'],
- email=self.cleaned_data['private_email'], password=password)
- user.first_name = self.cleaned_data['first_name']
- user.last_name = self.cleaned_data['last_name']
- user.save()
- # sucks that the MRM.add() method can't take a list directly... we have
- # to resort to dirty * magic.
- user.groups.add(*self.cleaned_data['groups'])
- profile.user = user
- if commit:
- profile.save()
- self.save_m2m()
-
- template = loader.get_template('devel/new_account.txt')
- ctx = Context({
- 'site': Site.objects.get_current(),
- 'user': user,
- 'password': password,
- })
-
- send_mail("Your new archweb account",
- template.render(ctx),
- 'Arch Website Notification <nobody@archlinux.org>',
- [user.email],
- fail_silently=False)
-
def log_addition(request, obj):
"""Cribbed from ModelAdmin.log_addition."""
LogEntry.objects.log_action(
@@ -379,17 +293,16 @@ def log_addition(request, obj):
change_message = "Added via Create New User form."
)
+
@permission_required('auth.add_user')
@never_cache
def new_user_form(request):
if request.POST:
form = NewUserForm(request.POST)
if form.is_valid():
- @transaction.commit_on_success
- def inner_save():
+ with transaction.commit_on_success():
form.save()
log_addition(request, form.instance.user)
- inner_save()
return HttpResponseRedirect('/admin/auth/user/%d/' % \
form.instance.user.id)
else:
@@ -406,6 +319,7 @@ def new_user_form(request):
}
return render(request, 'general_form.html', context)
+
@user_passes_test(lambda u: u.is_superuser)
def admin_log(request, username=None):
user = None