X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Fviews%2Fuser.py;h=126ecc95c4ca27444aff1721271baf648fd0a0a3;hb=a48f76a2d3a98c21d4b37f19cf84073e77db55c8;hp=b042d35b2f8a433984a981e60f55c1b50c68c114;hpb=05d26756d7e7f254d5631a0649aeac5fd3a58ca8;p=patchwork diff --git a/apps/patchwork/views/user.py b/apps/patchwork/views/user.py index b042d35..126ecc9 100644 --- a/apps/patchwork/views/user.py +++ b/apps/patchwork/views/user.py @@ -22,38 +22,99 @@ from django.contrib.auth.decorators import login_required 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, UserProfile, \ - UserPersonConfirmation, State -from patchwork.forms import MultiplePatchForm, UserProfileForm, \ - UserPersonLinkForm -from patchwork.utils import Order, get_patch_ids +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.template import Context from django.conf import settings from django.core.mail import send_mail import django.core.urlresolvers +def register(request): + context = PatchworkRequestContext(request) + if request.method == 'POST': + 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() + + # send email + mail_ctx = {'site': Site.objects.get_current(), + 'confirmation': conf} + + 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]) + + # setting 'confirmation' in the template indicates success + context['confirmation'] = conf + + else: + 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() @@ -63,12 +124,13 @@ def profile(request): 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: @@ -77,31 +139,35 @@ def link(request): context), settings.DEFAULT_FROM_EMAIL, [form.cleaned_data['email']]) - conf.save() - except Exception, ex: + 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) + + 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': @@ -118,7 +184,7 @@ def todo_lists(request): 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 @@ -129,13 +195,13 @@ def todo_lists(request): 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})]