from patchwork.requestcontext import PatchworkRequestContext
from django.shortcuts import render_to_response, get_object_or_404
from django.contrib import auth
-from django.http import HttpResponse, HttpResponseRedirect
-from patchwork.models import Project, Patch, Bundle, Person, \
- RegistrationRequest, UserProfile, UserPersonConfirmation, State
-from patchwork.forms import RegisterForm, LoginForm, MultiplePatchForm, \
- UserProfileForm, UserPersonLinkForm
-from patchwork.utils import Order, get_patch_ids, set_patches
+from django.contrib.sites.models import Site
+from django.http import HttpResponseRedirect
+from patchwork.models import Project, Bundle, Person, EmailConfirmation, \
+ State, EmailOptout
+from patchwork.forms import UserProfileForm, UserPersonLinkForm, \
+ RegistrationForm
from patchwork.filters import DelegateFilter
-from patchwork.paginator import Paginator
from patchwork.views import generic_list
+from django.template.loader import render_to_string
+from django.conf import settings
+from django.core.mail import send_mail
import django.core.urlresolvers
def register(request):
context = PatchworkRequestContext(request)
- template = 'patchwork/register.html'
-
- if request.method != 'POST':
- form = RegisterForm()
- context['form'] = form
- return render_to_response(template, context)
-
- reg_req = RegistrationRequest()
- form = RegisterForm(instance = reg_req, data = request.POST)
-
- if form.is_valid():
- form.save()
- context['request'] = reg_req
- else:
- context['form'] = form
-
- return render_to_response(template, context)
-
-def register_confirm(request, key):
- context = PatchworkRequestContext(request)
- req = get_object_or_404(RegistrationRequest, key = key)
- req.create_user()
- user = auth.authenticate(username = req.username, password = req.password)
- auth.login(request, user)
-
- return render_to_response('patchwork/register-confirm.html', context)
-
-def login(request):
- context = PatchworkRequestContext(request)
- template = 'patchwork/login.html'
- error = None
-
if request.method == 'POST':
- form = LoginForm(request.POST)
- context['form'] = form
-
- if not form.is_valid():
- return render_to_response(template, context)
+ form = RegistrationForm(request.POST)
+ if form.is_valid():
+ data = form.cleaned_data
+ # create inactive user
+ user = auth.models.User.objects.create_user(data['username'],
+ data['email'],
+ data['password'])
+ user.is_active = False;
+ user.first_name = data.get('first_name', '')
+ user.last_name = data.get('last_name', '')
+ user.save()
+
+ # create confirmation
+ conf = EmailConfirmation(type = 'registration', user = user,
+ email = user.email)
+ conf.save()
- data = form.cleaned_data
- user = auth.authenticate(username = data['username'],
- password = data['password'])
+ # send email
+ mail_ctx = {'site': Site.objects.get_current(),
+ 'confirmation': conf}
- if user is not None and user.is_active:
- auth.login(request, user)
- url = request.POST.get('next', None) or \
- django.core.urlresolvers.reverse( \
- 'patchwork.views.user.profile')
- return HttpResponseRedirect(url)
+ subject = render_to_string('patchwork/activation_email_subject.txt',
+ mail_ctx).replace('\n', ' ').strip()
+
+ message = render_to_string('patchwork/activation_email.txt',
+ mail_ctx)
+
+ send_mail(subject, message, settings.DEFAULT_FROM_EMAIL,
+ [conf.email])
- context['error'] = 'Invalid username or password'
+ # setting 'confirmation' in the template indicates success
+ context['confirmation'] = conf
else:
- context['form'] = LoginForm()
-
- return render_to_response(template, context)
-
-def logout(request):
- auth.logout(request)
- return render_to_response('patchwork/logout.html')
+ form = RegistrationForm()
+
+ return render_to_response('patchwork/registration_form.html',
+ { 'form': form },
+ context_instance=context)
+
+def register_confirm(request, conf):
+ conf.user.is_active = True
+ conf.user.save()
+ conf.deactivate()
+ try:
+ person = Person.objects.get(email__iexact = conf.user.email)
+ except Person.DoesNotExist:
+ person = Person(email = conf.user.email,
+ name = conf.user.profile.name())
+ person.user = conf.user
+ person.save()
+
+ return render_to_response('patchwork/registration-confirm.html')
@login_required
def profile(request):
context = PatchworkRequestContext(request)
if request.method == 'POST':
- form = UserProfileForm(instance = request.user.get_profile(),
+ form = UserProfileForm(instance = request.user.profile,
data = request.POST)
if form.is_valid():
form.save()
else:
- form = UserProfileForm(instance = request.user.get_profile())
+ form = UserProfileForm(instance = request.user.profile)
- context.project = request.user.get_profile().primary_project
+ context.project = request.user.profile.primary_project
context['bundles'] = Bundle.objects.filter(owner = request.user)
context['profileform'] = form
- people = Person.objects.filter(user = request.user)
+ optout_query = '%s.%s IN (SELECT %s FROM %s)' % (
+ Person._meta.db_table,
+ Person._meta.get_field('email').column,
+ EmailOptout._meta.get_field('email').column,
+ EmailOptout._meta.db_table)
+ people = Person.objects.filter(user = request.user) \
+ .extra(select = {'is_optout': optout_query})
context['linked_emails'] = people
context['linkform'] = UserPersonLinkForm()
def link(request):
context = PatchworkRequestContext(request)
- form = UserPersonLinkForm(request.POST)
if request.method == 'POST':
form = UserPersonLinkForm(request.POST)
if form.is_valid():
- conf = UserPersonConfirmation(user = request.user,
+ conf = EmailConfirmation(type = 'userperson',
+ user = request.user,
email = form.cleaned_data['email'])
conf.save()
context['confirmation'] = conf
+ try:
+ send_mail('Patchwork email address confirmation',
+ render_to_string('patchwork/user-link.mail',
+ context),
+ settings.DEFAULT_FROM_EMAIL,
+ [form.cleaned_data['email']])
+ except Exception:
+ context['confirmation'] = None
+ context['error'] = 'An error occurred during confirmation. ' + \
+ 'Please try again later'
+ else:
+ form = UserPersonLinkForm()
context['linkform'] = form
return render_to_response('patchwork/user-link.html', context)
@login_required
-def link_confirm(request, key):
+def link_confirm(request, conf):
context = PatchworkRequestContext(request)
- confirmation = get_object_or_404(UserPersonConfirmation, key = key)
- errors = confirmation.confirm()
- if errors:
- context['errors'] = errors
- else:
- context['person'] = Person.objects.get(email = confirmation.email)
+ try:
+ person = Person.objects.get(email__iexact = conf.email)
+ except Person.DoesNotExist:
+ person = Person(email = conf.email)
- confirmation.delete()
+ person.link_to_user(conf.user)
+ person.save()
+ conf.deactivate()
+
+ context['person'] = person
return render_to_response('patchwork/user-link-confirm.html', context)
@login_required
def unlink(request, person_id):
- context = PatchworkRequestContext(request)
person = get_object_or_404(Person, id = person_id)
if request.method == 'POST':
todo_lists = []
for project in Project.objects.all():
- patches = request.user.get_profile().todo_patches(project = project)
+ patches = request.user.profile.todo_patches(project = project)
if not patches.count():
continue
context = PatchworkRequestContext(request)
context['todo_lists'] = todo_lists
- context.project = request.user.get_profile().primary_project
+ context.project = request.user.profile.primary_project
return render_to_response('patchwork/todo-lists.html', context)
@login_required
def todo_list(request, project_id):
project = get_object_or_404(Project, linkname = project_id)
- patches = request.user.get_profile().todo_patches(project = project)
+ patches = request.user.profile.todo_patches(project = project)
filter_settings = [(DelegateFilter,
{'delegate': request.user})]