def attempt_registration(request): # Check that the password is long enough if len(request.POST['password']) < settings.USER_PASSWORD_LENGTH: return None, 'too_short_password' # Check that the email address is valid if not validator.email(request.POST['email']): return None, 'invalid_email' try: user = verify_memberid( ip_address=request.META['REMOTE_ADDR'], memberid=request.POST['memberid'], country_code=request.POST['country'], zipcode=request.POST['zipcode'], ) if not user.is_inactive: return None, 'user_exists' user.set_contact_info({'email': request.POST['email'].strip()}) user.is_inactive = False user.activated = datetime.now() user.set_consent_accepted_privacy_policy_date(None, False) user.set_password(request.POST['password']) user.save() authenticate(user=user) log_user_in(request, user) try: message = render_to_string('common/user/login/registered_email.txt', request=request) send_mail(EMAIL_REGISTERED_SUBJECT, message, settings.DEFAULT_FROM_EMAIL, [user.get_email()]) except (SMTPException, SSLError, UnicodeEncodeError): # Silently log and ignore this error. Consider warning the user that the email wasn't sent? logger.warning( "Klarte ikke å sende registreringskvitteringepost", exc_info=sys.exc_info(), extra={'request': request} ) return user, None except MemberidLookupsExceeded: return None, 'memberid_lookups_exceeded' except CountryDoesNotExist: raise PermissionDenied except (NoMatchingMemberid, ActorIsNotPersonalMember, ValueError): return None, 'invalid_memberid'
def search_for_existing_member(request): if not request.is_ajax() or request.method != 'POST': raise PermissionDenied post_data = json.loads(request.POST['data']) if not all([q in post_data for q in ['memberid', 'country_code', 'zipcode']]): # Some clients seem to send empty query dicts raise PermissionDenied context = { 'adult_age': settings.MEMBERSHIP['AGES']['MAIN'], } try: context['user_result'] = verify_memberid( ip_address=request.META['REMOTE_ADDR'], memberid=post_data['memberid'], country_code=post_data['country_code'], zipcode=post_data['zipcode'], ) success = True except MemberidLookupsExceeded: context['memberid_lookups_exceeded'] = True success = False except CountryDoesNotExist: raise PermissionDenied except ActorIsNotPersonalMember: context['actor_is_not_member'] = True success = False except (NoMatchingMemberid, ValueError): context['no_match'] = True success = False return HttpResponse(json.dumps({ 'html': render_to_string('common/user/account/family/add_members_search_result.html', context, request=request), 'success': success, }))
def register_membership(request): """This view should reuse the standard registration logic in user/login/util and still merge the user objects instead of reimplementing the logic.""" if request.user.is_member(): return redirect('user:home') if request.method == 'GET': context = { 'memberid_lookups_limit': settings.MEMBERID_LOOKUPS_LIMIT, 'countries': FocusCountry.get_sorted() } return render(request, 'common/user/account/register_membership.html', context) elif request.method == 'POST': try: user = request.user verified_user = verify_memberid( ip_address=request.META['REMOTE_ADDR'], memberid=request.POST['memberid'], country_code=request.POST['country'], zipcode=request.POST['zipcode'], ) if request.POST['email-equal'] == 'true': # Focus-email is empty, or equal to this email, so just use it chosen_email = user.get_email() elif request.POST['email-choice'] == 'sherpa': chosen_email = user.get_email() elif request.POST['email-choice'] == 'focus': chosen_email = verified_user.get_email() elif request.POST['email-choice'] == 'custom': # Check that the email address is valid if not validator.email(request.POST['email']): messages.error(request, 'invalid_email') return redirect('user:register_membership') chosen_email = request.POST['email'] else: raise Exception("Missing email-equal / email-choise-parameters") # Check that the user doesn't already have an account if not verified_user.is_inactive: messages.error(request, 'user_exists') return redirect('user:register_membership') # Ok, registration successful, update the user # The verified user might be pending. The merge method only merges related objects, so if that's the case, # set the new user's state to pending. if verified_user.is_pending: user.is_pending = True user.save() # The verification lookup will ensure there's already an inactive user, pending or not, so merge them user.merge_with(verified_user, move_password=True) # This will delete the other user # Point the user to its corresponding memberid and clear other personal information user.identifier = request.POST['memberid'] user.memberid = request.POST['memberid'] user.first_name = '' user.last_name = '' user.email = '' user.save() # Save the chosen email in Focus user.set_contact_info({'email': chosen_email}) return redirect('user:home') except MemberidLookupsExceeded: messages.error(request, 'memberid_lookups_exceeded') return redirect('user:register_membership') except CountryDoesNotExist: raise PermissionDenied except (NoMatchingMemberid, ActorIsNotPersonalMember, ValueError): messages.error(request, 'invalid_memberid') return redirect('user:register_membership')