X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=apps%2Fpatchwork%2Fviews%2Fuser.py;h=126ecc95c4ca27444aff1721271baf648fd0a0a3;hb=a48f76a2d3a98c21d4b37f19cf84073e77db55c8;hp=0e145494ab023a6c3888b7e3efdb21f828f17650;hpb=3c6909740c2b00c31a9b39b5ef8e0ce7f588f685;p=patchwork diff --git a/apps/patchwork/views/user.py b/apps/patchwork/views/user.py index 0e14549..126ecc9 100644 --- a/apps/patchwork/views/user.py +++ b/apps/patchwork/views/user.py @@ -22,111 +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, \ - RegistrationRequest, UserProfile, UserPersonConfirmation, State -from patchwork.forms import RegisterForm, LoginForm, 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) - 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() - try: - context['request'] = reg_req - send_mail('Patchwork account confirmation', - render_to_string('patchwork/register.mail', context), - settings.PATCHWORK_FROM_EMAIL, - [form.cleaned_data['email']]) - - except Exception, ex: - context['request'] = None - context['error'] = 'An error occurred during registration. ' + \ - 'Please try again later' - - 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) - - data = form.cleaned_data - user = auth.authenticate(username = data['username'], - password = data['password']) - - 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) - - context['error'] = 'Invalid username or password' + 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: - 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() @@ -136,45 +124,50 @@ 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: send_mail('Patchwork email address confirmation', render_to_string('patchwork/user-link.mail', context), - settings.PATCHWORK_FROM_EMAIL, + 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': @@ -191,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 @@ -202,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})]