def test_register_form_with_upref_mdata_with_invalid_preferences(self): import pybossa.core pybossa.core.upref_mdata_choices = self.upref_mdata_valid_choices form_data = dict(languages="somelang", locations="someloc", user_type="someutype", timezone="ZZZ") form = UserPrefMetadataForm(MultiDict(form_data)) form.set_upref_mdata_choices() assert not form.validate() expected_form_errors = { 'work_hours_to': [ 'Work Hours From, Work Hours To, and Timezone must be filled out for submission' ], 'locations': [u"'someloc' is not a valid choice for this field"], 'user_type': [u'Not a valid choice'], 'languages': [u"'somelang' is not a valid choice for this field"], 'work_hours_from': [ 'Work Hours From, Work Hours To, and Timezone must be filled out for submission' ], 'timezone': [ u'Not a valid choice', 'Work Hours From, Work Hours To, and Timezone must be filled out for submission' ] } assert form.errors == expected_form_errors
def test_register_form_with_upref_mdata_with_invalid_language(self): import pybossa.core pybossa.core.upref_mdata_choices = self.upref_mdata_valid_choices form_data = dict(languages="somelang", locations="uk", user_type="Researcher", timezone="") form = UserPrefMetadataForm(MultiDict(form_data)) form.set_upref_mdata_choices() assert not form.validate()
def add_metadata(name): """ Admin can save metadata for selected user. Regular user can save their own metadata. Redirects to public profile page for selected user. """ user = user_repo.get_by_name(name=name) (can_update, disabled_fields) = can_update_user_info(current_user, user) if not can_update: abort(403) form_data = get_form_data(request, user, disabled_fields) form = UserPrefMetadataForm(form_data, can_update=(can_update, disabled_fields)) form.set_upref_mdata_choices() if not form.validate(): if current_user.id == user.id: user_dict = cached_users.get_user_summary(user.name) else: user_dict = cached_users.public_get_user_summary(user.name) projects_contributed = cached_users.projects_contributed_cached( user.id) projects_created = cached_users.published_projects_cached(user.id) total_projects_contributed = '{} / {}'.format( cached_users.n_projects_contributed(user.id), n_published()) percentage_tasks_completed = user_dict['n_answers'] * 100 / ( n_total_tasks() or 1) if current_user.is_authenticated and current_user.admin: draft_projects = cached_users.draft_projects(user.id) projects_created.extend(draft_projects) title = "%s · User Profile" % user.name flash("Please fix the errors", 'message') return render_template( '/account/public_profile.html', title=title, user=user, projects=projects_contributed, projects_created=projects_created, total_projects_contributed=total_projects_contributed, percentage_tasks_completed=percentage_tasks_completed, form=form, input_form=True, can_update=can_update, upref_mdata_enabled=bool(app_settings.upref_mdata)) user_pref, metadata = get_user_pref_and_metadata(name, form) user.info['metadata'] = metadata ensure_data_access_assignment_from_form(user.info, form) user.user_pref = user_pref user_repo.update(user) cached_users.delete_user_pref_metadata(user.name) cached_users.delete_user_access_levels_by_id(user.id) delete_memoized(get_user_preferences, user.id) flash("Input saved successfully", "info") return redirect(url_for('account.profile', name=name))
def test_register_form_with_upref_mdata_with_invalid_language( self, upref_mdata, get_upref_mdata_choices): get_upref_mdata_choices.return_value = self.upref_mdata_valid_choices form_data = dict(languages="somelang", locations="uk", user_type="Researcher", timezone="") form = UserPrefMetadataForm(MultiDict(form_data)) form.set_upref_mdata_choices() assert not form.validate()
def test_register_form_with_upref_mdata_validates_with_valid_fields(self): import pybossa.core pybossa.core.upref_mdata_choices = self.upref_mdata_valid_choices form_data = dict(languages="en", locations="uk", user_type="Researcher", timezone="") form = UserPrefMetadataForm(MultiDict(form_data)) form.set_upref_mdata_choices() assert form.validate()
def redirect_profile(): """Redirect method for profile.""" if current_user.is_anonymous(): # pragma: no cover return redirect_content_type(url_for('.signin'), status='not_signed_in') if (request.headers.get('Content-Type') == 'application/json') and current_user.is_authenticated(): form = None if current_app.config.upref_mdata: form_data = cached_users.get_user_pref_metadata(current_user.name) form = UserPrefMetadataForm(**form_data) form.set_upref_mdata_choices() return _show_own_profile(current_user, form) else: return redirect_content_type(url_for('.profile', name=current_user.name))
def redirect_profile(): """Redirect method for profile.""" if current_user.is_anonymous: # pragma: no cover return redirect_content_type(url_for('.signin'), status='not_signed_in') if (request.headers.get('Content-Type') == 'application/json') and current_user.is_authenticated: form = None if current_app.config.upref_mdata: form_data = cached_users.get_user_pref_metadata(current_user.name) form = UserPrefMetadataForm(**form_data) form.set_upref_mdata_choices() return _show_own_profile(current_user, form, current_user) else: return redirect_content_type(url_for('.profile', name=current_user.name))
def profile(name): """ Get user profile. Returns a Jinja2 template with the user information. """ user = user_repo.get_by_name(name=name) if user is None: raise abort(404) form = None if current_app.config.upref_mdata: form_data = cached_users.get_user_pref_metadata(user.name) form = UserPrefMetadataForm(**form_data) form.set_upref_mdata_choices() if current_user.is_anonymous() or (user.id != current_user.id): return _show_public_profile(user, form) if current_user.is_authenticated() and user.id == current_user.id: return _show_own_profile(user, form, current_user)
def profile(name): """ Get user profile. Returns a Jinja2 template with the user information. """ user = user_repo.get_by_name(name=name) if user is None: raise abort(404) form = None if current_app.config.upref_mdata: form_data = cached_users.get_user_pref_metadata(user.name) form = UserPrefMetadataForm(**form_data) form.set_upref_mdata_choices() if current_user.is_anonymous() or (user.id != current_user.id): return _show_public_profile(user, form) if current_user.is_authenticated() and user.id == current_user.id: return _show_own_profile(user, form)
def profile(name): """ Get user profile. Returns a Jinja2 template with the user information. """ user = user_repo.get_by_name(name=name) if user is None or current_user.is_anonymous: raise abort(404) form = None (can_update, disabled_fields, hidden_fields) = can_update_user_info(current_user, user) if app_settings.upref_mdata: form_data = cached_users.get_user_pref_metadata(user.name) form = UserPrefMetadataForm(can_update=(can_update, disabled_fields, hidden_fields), **form_data) form.set_upref_mdata_choices() if user.id != current_user.id: return _show_public_profile(user, form, can_update) else: return _show_own_profile(user, form, current_user, can_update)
def add_metadata(name): """ Admin can save metadata for selected user Redirects to public profile page for selected user. """ user = user_repo.get_by_name(name=name) form = UserPrefMetadataForm(request.form) form.set_upref_mdata_choices() if not form.validate(): if current_user.id == user.id: user_dict = cached_users.get_user_summary(user.name) else: user_dict = cached_users.public_get_user_summary(user.name) projects_contributed = cached_users.projects_contributed_cached( user.id) projects_created = cached_users.published_projects_cached(user.id) if current_user.is_authenticated() and current_user.admin: draft_projects = cached_users.draft_projects(user.id) projects_created.extend(draft_projects) title = "%s · User Profile" % user.name flash("Please fix the errors", 'message') can_update = current_user.admin return render_template('/account/public_profile.html', title=title, user=user_dict, projects=projects_contributed, projects_created=projects_created, form=form, can_update=can_update, input_form=True) user_pref, metadata = get_user_pref_and_metadata(name, form) user.info['metadata'] = metadata user.user_pref = user_pref user_repo.update(user) cached_users.delete_user_pref_metadata(user.name) flash("Input saved successfully", "info") return redirect(url_for('account.profile', name=name))
def add_metadata(name): """ Admin can save metadata for selected user Redirects to public profile page for selected user. """ user = user_repo.get_by_name(name=name) form = UserPrefMetadataForm(request.form) form.set_upref_mdata_choices() if not form.validate(): if current_user.id == user.id: user_dict = cached_users.get_user_summary(user.name) else: user_dict = cached_users.public_get_user_summary(user.name) projects_contributed = cached_users.projects_contributed_cached(user.id) projects_created = cached_users.published_projects_cached(user.id) if current_user.is_authenticated() and current_user.admin: draft_projects = cached_users.draft_projects(user.id) projects_created.extend(draft_projects) title = "%s · User Profile" % user.name flash("Please fix the errors", 'message') can_update = current_user.admin return render_template('/account/public_profile.html', title=title, user=user_dict, projects=projects_contributed, projects_created=projects_created, form=form, can_update=can_update, input_form=True) user_pref, metadata = get_user_pref_and_metadata(name, form) user.info['metadata'] = metadata user.user_pref = user_pref user_repo.update(user) cached_users.delete_user_pref_metadata(user.name) flash("Input saved successfully", "info") return redirect(url_for('account.profile', name=name))
def test_register_form_with_upref_mdata_with_invalid_preferences(self): import pybossa.core pybossa.core.upref_mdata_choices = self.upref_mdata_valid_choices form_data = dict(languages="somelang", locations="someloc", user_type="someutype", timezone="ZZZ") form = UserPrefMetadataForm(MultiDict(form_data)) form.set_upref_mdata_choices() assert not form.validate() expected_form_errors = { 'work_hours_to': ['Work Hours From, Work Hours To, and Timezone must be filled out for submission'], 'locations': [u"'someloc' is not a valid choice for this field"], 'user_type': [u'Not a valid choice'], 'languages': [u"'somelang' is not a valid choice for this field"], 'work_hours_from': ['Work Hours From, Work Hours To, and Timezone must be filled out for submission'], 'timezone': [u'Not a valid choice', 'Work Hours From, Work Hours To, and Timezone must be filled out for submission'] } assert form.errors == expected_form_errors
def test_register_form_with_upref_mdata_disables_fields_correctly(self): form = UserPrefMetadataForm() # All fields are enabled by default. for field in form: assert not form.is_disabled(field) disabled = { 'languages': 'languages is disabled', 'locations': 'reason is disabled', 'work_hours_from': 'work_hours_from is disabled', 'work_hours_to': 'work_hours_to is disabled', 'timezone': 'timezone is disabled', 'user_type': 'user_type is disabled' } enabled = ['review'] #Disable some fields form.set_can_update((True, disabled)) for field_name, disable_reason in six.iteritems(disabled): assert form.is_disabled(getattr(form, field_name)) == disable_reason for field_name in enabled: assert not form.is_disabled(getattr(form, field_name)) #Disable all fields form.set_can_update((False, None)) for field in form: assert form.is_disabled(field) #Enable all fields form.set_can_update((True, None)) for field in form: assert not form.is_disabled(field)