Split devel forms out of devel/views.py
Signed-off-by: Dan McGee <dan@archlinux.org>
This commit is contained in:
parent
5df83a3828
commit
e7e9b15164
99
devel/forms.py
Normal file
99
devel/forms.py
Normal file
@ -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:
|
106
devel/views.py
106
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 inner_save():
|
||||
}
|
||||
return render(request, 'general_form.html', context)
|
||||
|
||||
|
||||
@user_passes_test(lambda u: u.is_superuser)
|
||||
def admin_log(request, username=None):
|
||||
user = None
|
||||
|
Loading…
Reference in New Issue
Block a user