def destroy(request): schema = AccountDestroySchema() button1 = Button('submit', _('Yes, I am sure. Destroy my account')) button1.css_class = 'btn-danger' button2 = Button('cancel', _('Cancel')) button2.css_class = 'btn-default' form = Form(schema, buttons=(button1, button2)) user = request.user can_destroy = len(user.applications) == 0 context = { 'passwords': len(user.passwords), 'can_destroy': can_destroy, } if 'submit' in request.POST: if not can_destroy: request.session.flash( _('You must remove your applications before destroying your account' ), 'error', ) return HTTPFound( location=request.route_path('oauth2_developer_applications')) controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: context['form'] = e.render() return context reason = appstruct['reason'] notify_admins_of_account_removal(request, user, reason) Session.delete(user) request.session.flash( _('Your account has been removed. Have a nice day!'), 'success', ) return logout(request) elif 'cancel' in request.POST: request.session.flash( _('Thanks for reconsidering removing your account!'), 'info', ) return HTTPFound(location=request.route_path('user_information')) context['form'] = form.render() return context
def contact(request): button1 = Button('submit', _('Send message')) button1.css_class = 'btn-primary' button2 = Button('cancel', _('Cancel')) button2.css_class = 'btn-default' form = Form(ContactSchema(), buttons=(button1, button2)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} context = {'link': request.route_url('contact')} context.update(appstruct) subject = ("%s sent a message from Yith's contact form" % appstruct['name']) result = send_email_to_admins( request, 'yithlibraryserver:templates/email_contact', context, subject, extra_headers={'Reply-To': appstruct['email']}, ) if result is None: log.error( '%s <%s> tried to send a message from the contact form but no ' 'admin emails were configured. Message: %s' % ( appstruct['name'], appstruct['email'], appstruct['message'], ) ) request.session.flash( _('Thank you very much for sharing your opinion'), 'info', ) return HTTPFound(location=request.route_path('home')) elif 'cancel' in request.POST: return HTTPFound(location=request.route_path('home')) initial = {} if request.user is not None: initial['name'] = request.user.get('first_name', '') if request.user.get('email_verified', False): initial['email'] = request.user.get('email', '') return {'form': form.render(initial)}
def contact(request): button1 = Button('submit', _('Send message')) button1.css_class = 'btn-primary' button2 = Button('cancel', _('Cancel')) button2.css_class = 'btn-default' form = Form(ContactSchema(), buttons=(button1, button2)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} context = {'link': request.route_url('contact')} context.update(appstruct) subject = ("%s sent a message from Yith's contact form" % appstruct['name']) result = send_email_to_admins( request, 'yithlibraryserver:templates/email_contact', context, subject, extra_headers={'Reply-To': appstruct['email']}, ) if result is None: log.error( '%s <%s> tried to send a message from the contact form but no ' 'admin emails were configured. Message: %s' % ( appstruct['name'], appstruct['email'], appstruct['message'], )) request.session.flash( _('Thank you very much for sharing your opinion'), 'info', ) return HTTPFound(location=request.route_path('home')) elif 'cancel' in request.POST: return HTTPFound(location=request.route_path('home')) initial = {} if request.user is not None: initial['name'] = request.user.first_name if request.user.email_verified: initial['email'] = request.user.email return {'form': form.render(initial)}
def destroy(request): schema = AccountDestroySchema() button1 = Button('submit', _('Yes, I am sure. Destroy my account')) button1.css_class = 'btn-danger' button2 = Button('cancel', _('Cancel')) button2.css_class = 'btn-default' form = Form(schema, buttons=(button1, button2)) user = request.user can_destroy = len(user.applications) == 0 context = { 'passwords': len(user.passwords), 'can_destroy': can_destroy, } if 'submit' in request.POST: if not can_destroy: request.session.flash( _('You must remove your applications before destroying your account'), 'error', ) return HTTPFound(location=request.route_path('oauth2_developer_applications')) controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: context['form'] = e.render() return context reason = appstruct['reason'] notify_admins_of_account_removal(request, user, reason) Session.delete(user) request.session.flash( _('Your account has been removed. Have a nice day!'), 'success', ) return logout(request) elif 'cancel' in request.POST: request.session.flash( _('Thanks for reconsidering removing your account!'), 'info', ) return HTTPFound(location=request.route_path('user_information')) context['form'] = form.render() return context
def destroy(request): schema = AccountDestroySchema() button1 = Button('submit', _('Yes, I am sure. Destroy my account')) button1.css_class = 'btn-danger' button2 = Button('cancel', _('Cancel')) button2.css_class = '' form = Form(schema, buttons=(button1, button2)) passwords_manager = PasswordsManager(request.db) context = { 'passwords': passwords_manager.retrieve(request.user).count(), } if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: context['form'] = e.render() return context reason = appstruct['reason'] admin_emails = request.registry.settings['admin_emails'] if admin_emails: notify_admins_of_account_removal(request, request.user, reason, admin_emails) passwords_manager.delete(request.user) # TODO: remove user's applications delete_user(request.db, request.user) request.session.flash( _('Your account has been removed. Have a nice day!'), 'success', ) return logout(request) elif 'cancel' in request.POST: request.session.flash( _('Thanks for reconsidering removing your account!'), 'info', ) return HTTPFound(location=request.route_path('user_information')) context['form'] = form.render() return context
def preferences(request): schema = UserPreferencesSchema() button1 = Button('submit', _('Save changes')) button1.css_class = 'btn-primary' form = Form(schema, buttons=(button1, )) user = request.user if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} user.update_preferences(appstruct) Session.add(user) request.session.flash( _('The changes were saved successfully'), 'success', ) return HTTPFound(location=request.route_path('user_preferences')) return { 'form': form.render({ 'allow_google_analytics': user.allow_google_analytics, 'send_passwords_periodically': user.send_passwords_periodically, }) }
def preferences(request): schema = UserPreferencesSchema() button1 = Button('submit', _('Save changes')) button1.css_class = 'btn-primary' form = Form(schema, buttons=(button1, )) today = request.date_service.today() # use 28 to get a consistent day_to_send no matter what the # current month is. The disadvantage is that there are # several days in a regular month that are not used. day_to_send = get_day_to_send(request.user, 28) if day_to_send > today.day: day_to_send_msg = _( 'You will receive your passwords backup on the day ${day} of this month', mapping={'day': day_to_send}) elif day_to_send < today.day: day_to_send_msg = _( 'You will receive your passwords backup on the day ${day} of next month', mapping={'day': day_to_send}) else: day_to_send_msg = _( 'You will receive your passwords backup today!', mapping={'day': day_to_send}) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render(), 'day_to_send': day_to_send_msg} changes = dict([(pref, appstruct[pref]) for pref in ( analytics.USER_ATTR, 'send_passwords_periodically', )]) result = request.db.users.update({'_id': request.user['_id']}, {'$set': changes}, safe=True) if result['n'] == 1: request.session.flash( _('The changes were saved successfully'), 'success', ) return HTTPFound(location=request.route_path('user_preferences')) else: request.session.flash( _('There were an error while saving your changes'), 'error', ) return {'form': appstruct, 'day_to_send': day_to_send_msg} return {'form': form.render(request.user), 'day_to_send': day_to_send_msg}
def developer_application_new(request): assert_authenticated_user_is_registered(request) schema = ApplicationSchema() button1 = Button('submit', _('Save application')) button1.css_class = 'btn-primary' button2 = Button('cancel', _('Cancel')) button2.css_class = '' form = Form(schema, buttons=(button1, button2)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} # the data is fine, save into the db application = { 'owner': request.user['_id'], 'name': appstruct['name'], 'main_url': appstruct['main_url'], 'callback_url': appstruct['callback_url'], 'authorized_origins': appstruct['authorized_origins'], 'production_ready': appstruct['production_ready'], 'image_url': appstruct['image_url'], 'description': appstruct['description'], } create_client_id_and_secret(application) request.session.flash( _('The application ${app} was created successfully', mapping={'app': appstruct['name']}), 'success') request.db.applications.insert(application, safe=True) return HTTPFound( location=request.route_path('oauth2_developer_applications')) elif 'cancel' in request.POST: return HTTPFound( location=request.route_path('oauth2_developer_applications')) # this is a GET return {'form': form.render()}
def developer_application_new(request): assert_authenticated_user_is_registered(request) schema = ApplicationSchema() button1 = Button('submit', _('Save application')) button1.css_class = 'btn-primary' button2 = Button('cancel', _('Cancel')) button2.css_class = 'btn-default' form = Form(schema, buttons=(button1, button2)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} # the data is fine, save into the db application = Application( name=appstruct['name'], main_url=appstruct['main_url'], callback_url=appstruct['callback_url'], authorized_origins=appstruct['authorized_origins'], production_ready=appstruct['production_ready'], image_url=appstruct['image_url'], description=appstruct['description'], ) request.user.applications.append(application) request.session.flash( _('The application ${app} was created successfully', mapping={'app': appstruct['name']}), 'success') Session.add(request.user) return HTTPFound( location=request.route_path('oauth2_developer_applications')) elif 'cancel' in request.POST: return HTTPFound( location=request.route_path('oauth2_developer_applications')) # this is a GET return {'form': form.render()}
def user_information(request): schema = UserSchema() button1 = Button('submit', _('Save changes')) button1.css_class = 'btn-primary' form = Form(schema, buttons=(button1, )) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} changes = { 'first_name': appstruct['first_name'], 'last_name': appstruct['last_name'], 'screen_name': appstruct['screen_name'], 'email': appstruct['email']['email'], } if request.user['email'] != appstruct['email']['email']: changes['email_verified'] = False result = request.db.users.update({'_id': request.user['_id']}, {'$set': changes}, safe=True) if result['n'] == 1: request.session.flash( _('The changes were saved successfully'), 'success', ) return HTTPFound(location=request.route_path('user_information')) else: request.session.flash( _('There were an error while saving your changes'), 'error', ) return {'form': appstruct} return { 'form': form.render({ 'first_name': request.user['first_name'], 'last_name': request.user['last_name'], 'screen_name': request.user['screen_name'], 'email': { 'email': request.user['email'], 'email_verified': request.user['email_verified'], }, }), }
def user_information(request): schema = UserSchema() button1 = Button('submit', _('Save changes')) button1.css_class = 'btn-primary' form = Form(schema, buttons=(button1, )) user = request.user if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} changes = { 'first_name': appstruct['first_name'], 'last_name': appstruct['last_name'], 'screen_name': appstruct['screen_name'], 'email': appstruct['email']['email'], } user.update_user_info(changes) Session.add(user) request.session.flash( _('The changes were saved successfully'), 'success', ) return HTTPFound(location=request.route_path('user_information')) return { 'form': form.render({ 'first_name': user.first_name, 'last_name': user.last_name, 'screen_name': user.screen_name, 'email': { 'email': user.email, 'email_verified': user.email_verified, }, }), }
def preferences(request): schema = UserPreferencesSchema() button1 = Button('submit', _('Save changes')) button1.css_class = 'btn-primary' form = Form(schema, buttons=(button1, )) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} changes = dict([(pref, appstruct[pref]) for pref in ( analytics.USER_ATTR, 'send_passwords_periodically', )]) result = request.db.users.update({'_id': request.user['_id']}, {'$set': changes}) if result['n'] == 1: request.session.flash( _('The changes were saved successfully'), 'success', ) return HTTPFound(location=request.route_path('user_preferences')) else: request.session.flash( _('There were an error while saving your changes'), 'error', ) return {'form': appstruct} return {'form': form.render(request.user)}
def register_new_user(request): try: user_info = request.session['user_info'] except KeyError: return HTTPBadRequest('Missing user info in the session') try: next_url = request.session['next_url'] except KeyError: next_url = request.route_url('oauth2_clients') schema = NewUserSchema() button1 = Button('submit', _('Register into Yith Library')) button1.css_class = 'btn-primary' button2 = Button('cancel', _('Cancel')) button2.css_class = 'btn-default logout' form = Form(schema, buttons=(button1, button2)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return { 'form': e.render(), 'provider': user_info.get('provider', ''), 'email': user_info.get('email', ''), 'next_url': next_url, } provider = user_info['provider'] provider_key = provider + '_id' email = appstruct['email'] if email != '' and email == user_info['email']: email_verified = True else: email_verified = False now = datetime.datetime.now(tz=utc) user_attrs = { provider_key: user_info[provider_key], 'screen_name': appstruct['screen_name'], 'first_name': appstruct['first_name'], 'last_name': appstruct['last_name'], 'email': email, 'email_verified': email_verified, 'date_joined': now, 'last_login': now, 'send_passwords_periodically': False, } if request.google_analytics.is_in_session(): allow_analytics = request.google_analytics.show_in_session() user_attrs[analytics.USER_ATTR] = allow_analytics request.google_analytics.clean_session() _id = request.db.users.insert(user_attrs) if not email_verified and email != '': evc = EmailVerificationCode() user = request.db.users.find_one({'_id': _id}) if evc.store(request.db, user): link = request.route_url('user_verify_email') evc.send(request, user, link) del request.session['user_info'] if 'next_url' in request.session: del request.session['next_url'] request.session['current_provider'] = provider return HTTPFound(location=next_url, headers=remember(request, str(_id))) elif 'cancel' in request.POST: del request.session['user_info'] if 'next_url' in request.session: del request.session['next_url'] return HTTPFound(location=next_url) return { 'form': form.render({ 'first_name': user_info.get('first_name', ''), 'last_name': user_info.get('last_name', ''), 'screen_name': user_info.get('screen_name', ''), 'email': user_info.get('email', ''), }), 'provider': user_info.get('provider', ''), 'email': user_info.get('email', ''), 'next_url': next_url, }
def register_new_user(request): try: user_info = request.session['user_info'] except KeyError: return HTTPBadRequest('Missing user info in the session') try: next_url = request.session['next_url'] except KeyError: next_url = request.route_url('oauth2_clients') schema = NewUserSchema() button1 = Button('submit', _('Register into Yith Library')) button1.css_class = 'btn-primary' button2 = Button('cancel', _('Cancel')) button2.css_class = 'btn-default logout' form = Form(schema, buttons=(button1, button2)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return { 'form': e.render(), 'provider': user_info.get('provider', ''), 'email': user_info.get('email', ''), 'next_url': next_url, } email = appstruct['email'] if email != '' and email == user_info['email']: email_verified = True else: email_verified = False user_attrs = { 'screen_name': appstruct['screen_name'], 'first_name': appstruct['first_name'], 'last_name': appstruct['last_name'], 'email': email, 'email_verified': email_verified, } if request.google_analytics.is_in_session(): allow_analytics = request.google_analytics.show_in_session() user_attrs[analytics.USER_ATTR] = allow_analytics request.google_analytics.clean_session() user = User(**user_attrs) provider = user_info['provider'] external_id = user_info['external_id'] user.add_identity(provider, external_id) Session.add(user) if not email_verified and email != '': evc = EmailVerificationCode() user.email_verification_code = evc.code link = request.route_url('user_verify_email') evc.send(request, user, link) del request.session['user_info'] if 'next_url' in request.session: del request.session['next_url'] Session.flush() request.session['current_provider'] = provider return HTTPFound(location=next_url, headers=remember(request, str(user.id))) elif 'cancel' in request.POST: del request.session['user_info'] if 'next_url' in request.session: del request.session['next_url'] return HTTPFound(location=next_url) return { 'form': form.render({ 'first_name': user_info.get('first_name', ''), 'last_name': user_info.get('last_name', ''), 'screen_name': user_info.get('screen_name', ''), 'email': user_info.get('email', ''), }), 'provider': user_info.get('provider', ''), 'email': user_info.get('email', ''), 'next_url': next_url, }
def contact(request): button1 = Button('submit', _('Send message')) button1.css_class = 'btn-primary' button2 = Button('cancel', _('Cancel')) button2.css_class = '' form = Form(ContactSchema(), buttons=(button1, button2)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render()} context = {'link': request.route_url('contact')} context.update(appstruct) text_body = render('yithlibraryserver:templates/email_contact.txt', context, request=request) # chamaleon txt templates are rendered as utf-8 bytestrings text_body = text_body.decode('utf-8') html_body = render('yithlibraryserver:templates/email_contact.pt', context, request=request) admin_emails = request.registry.settings['admin_emails'] if admin_emails: message = Message( subject=("%s sent a message from Yith's contact form" % appstruct['name']), recipients=request.registry.settings['admin_emails'], body=text_body, html=html_body, extra_headers={'Reply-To': appstruct['email']}, ) get_mailer(request).send(message) else: log.error( '%s <%s> tried to send a message from the contact form but no ' 'admin emails were configured. Message: %s' % ( appstruct['name'], appstruct['email'], appstruct['message'], ) ) request.session.flash( _('Thank you very much for sharing your opinion'), 'info', ) return HTTPFound(location=request.route_path('home')) elif 'cancel' in request.POST: return HTTPFound(location=request.route_path('home')) initial = {} if request.user is not None: initial['name'] = request.user.get('first_name', '') if request.user.get('email_verified', False): initial['email'] = request.user.get('email', '') return {'form': form.render(initial)}
def developer_application_edit(request): try: app_id = bson.ObjectId(request.matchdict['app']) except bson.errors.InvalidId: return HTTPBadRequest(body='Invalid application id') assert_authenticated_user_is_registered(request) app = request.db.applications.find_one(app_id) if app is None: return HTTPNotFound() if app['owner'] != request.user['_id']: return HTTPUnauthorized() schema = FullApplicationSchema() button1 = Button('submit', _('Save application')) button1.css_class = 'btn-primary' button2 = Button('delete', _('Delete application')) button2.css_class = 'btn-danger' button3 = Button('cancel', _('Cancel')) button3.css_class = '' form = Form(schema, buttons=(button1, button2, button3)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render(), 'app': app} # the data is fine, save into the db application = { 'owner': request.user['_id'], 'name': appstruct['name'], 'main_url': appstruct['main_url'], 'callback_url': appstruct['callback_url'], 'authorized_origins': appstruct['authorized_origins'], 'production_ready': appstruct['production_ready'], 'image_url': appstruct['image_url'], 'description': appstruct['description'], 'client_id': app['client_id'], 'client_secret': app['client_secret'], } request.db.applications.update({'_id': app['_id']}, application, safe=True) request.session.flash(_('The changes were saved successfully'), 'success') return HTTPFound( location=request.route_path('oauth2_developer_applications')) elif 'delete' in request.POST: return HTTPFound( location=request.route_path('oauth2_developer_application_delete', app=app['_id'])) elif 'cancel' in request.POST: return HTTPFound( location=request.route_path('oauth2_developer_applications')) # this is a GET return {'form': form.render(app), 'app': app}
def developer_application_edit(request): app_id = request.matchdict['app'] try: uuid.UUID(app_id) except ValueError: return HTTPBadRequest() try: app = Session.query(Application).filter(Application.id == app_id).one() except NoResultFound: return HTTPNotFound() assert_authenticated_user_is_registered(request) if app.user != request.user: return HTTPUnauthorized() schema = FullApplicationSchema() button1 = Button('submit', _('Save application')) button1.css_class = 'btn-primary' button2 = Button('delete', _('Delete application')) button2.css_class = 'btn-danger' button3 = Button('cancel', _('Cancel')) button3.css_class = 'btn-default' form = Form(schema, buttons=(button1, button2, button3)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render(), 'app': app} # the data is fine, save into the db app.name = appstruct['name'] app.main_url = appstruct['main_url'] app.callback_url = appstruct['callback_url'] app.authorized_origins = appstruct['authorized_origins'] app.production_ready = appstruct['production_ready'] app.image_url = appstruct['image_url'] app.description = appstruct['description'] Session.add(app) request.session.flash(_('The changes were saved successfully'), 'success') return HTTPFound( location=request.route_path('oauth2_developer_applications')) elif 'delete' in request.POST: return HTTPFound(location=request.route_path( 'oauth2_developer_application_delete', app=app.id)) elif 'cancel' in request.POST: return HTTPFound( location=request.route_path('oauth2_developer_applications')) # this is a GET return { 'form': form.render({ 'name': app.name, 'main_url': app.main_url, 'callback_url': app.callback_url, 'authorized_origins': app.authorized_origins, 'production_ready': app.production_ready, 'image_url': app.image_url, 'description': app.description, 'client_id': app.id, 'client_secret': app.secret, }), 'app': app, }
def developer_application_edit(request): app_id = request.matchdict['app'] try: uuid.UUID(app_id) except ValueError: return HTTPBadRequest() try: app = Session.query(Application).filter(Application.id == app_id).one() except NoResultFound: return HTTPNotFound() assert_authenticated_user_is_registered(request) if app.user != request.user: return HTTPUnauthorized() schema = FullApplicationSchema() button1 = Button('submit', _('Save application')) button1.css_class = 'btn-primary' button2 = Button('delete', _('Delete application')) button2.css_class = 'btn-danger' button3 = Button('cancel', _('Cancel')) button3.css_class = 'btn-default' form = Form(schema, buttons=(button1, button2, button3)) if 'submit' in request.POST: controls = request.POST.items() try: appstruct = form.validate(controls) except ValidationFailure as e: return {'form': e.render(), 'app': app} # the data is fine, save into the db app.name = appstruct['name'] app.main_url = appstruct['main_url'] app.callback_url = appstruct['callback_url'] app.authorized_origins = appstruct['authorized_origins'] app.production_ready = appstruct['production_ready'] app.image_url = appstruct['image_url'] app.description = appstruct['description'] Session.add(app) request.session.flash(_('The changes were saved successfully'), 'success') return HTTPFound( location=request.route_path('oauth2_developer_applications')) elif 'delete' in request.POST: return HTTPFound( location=request.route_path('oauth2_developer_application_delete', app=app.id)) elif 'cancel' in request.POST: return HTTPFound( location=request.route_path('oauth2_developer_applications')) # this is a GET return { 'form': form.render({ 'name': app.name, 'main_url': app.main_url, 'callback_url': app.callback_url, 'authorized_origins': app.authorized_origins, 'production_ready': app.production_ready, 'image_url': app.image_url, 'description': app.description, 'client_id': app.id, 'client_secret': app.secret, }), 'app': app, }