Skip to content

Commit

Permalink
The user controller functions for changing information were ripped ou…
Browse files Browse the repository at this point in the history
…t before providing a way for admin functionality to use the new javascript stuff. Seems nontrivial, so this puts the endpoint back temporarily until the adminjs rewrite which can include the new functionality.
  • Loading branch information
dannon committed Feb 23, 2017
1 parent 90de3f2 commit d10f740
Show file tree
Hide file tree
Showing 2 changed files with 287 additions and 0 deletions.
192 changes: 192 additions & 0 deletions lib/galaxy/webapps/galaxy/controllers/user.py
Expand Up @@ -1190,3 +1190,195 @@ def change_password( self, trans, token=None, **kwd):
message=message,
display_top=kwd.get('redirect_home', False)
)

@web.expose
@web.require_admin
def edit_info( self, trans, cntrller, **kwd ):
"""
Edit user information = username, email or password.
"""
params = util.Params( kwd )
is_admin = cntrller == 'admin' and trans.user_is_admin()
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
user_id = params.get( 'user_id', None )
if user_id and is_admin:
user = trans.sa_session.query( trans.app.model.User ).get( trans.security.decode_id( user_id ) )
elif user_id and ( not trans.user or trans.user.id != trans.security.decode_id( user_id ) ):
message = 'Invalid user id'
status = 'error'
user = None
else:
user = trans.user
if user and params.get( 'login_info_button', False ):
# Editing email and username
email = util.restore_text( params.get( 'email', '' ) )
username = util.restore_text( params.get( 'username', '' ) ).lower()

# Validate the new values for email and username
message = validate_email( trans, email, user )
if not message and username:
message = validate_publicname( trans, username, user )
if message:
status = 'error'
else:
if ( user.email != email ):
# The user's private role name must match the user's login ( email )
private_role = trans.app.security_agent.get_private_user_role( user )
private_role.name = email
private_role.description = 'Private role for ' + email
# Change the email itself
user.email = email
trans.sa_session.add_all( ( user, private_role ) )
trans.sa_session.flush()
if trans.webapp.name == 'galaxy' and trans.app.config.user_activation_on:
user.active = False
trans.sa_session.add( user )
trans.sa_session.flush()
is_activation_sent = self.send_verification_email( trans, user.email, user.username )
if is_activation_sent:
message = 'The login information has been updated with the changes.<br>Verification email has been sent to your new email address. Please verify it by clicking the activation link in the email.<br>Please check your spam/trash folder in case you cannot find the message.'
else:
message = 'Unable to send activation email, please contact your local Galaxy administrator.'
if trans.app.config.error_email_to is not None:
message += ' Contact: %s' % trans.app.config.error_email_to
if ( user.username != username ):
user.username = username
trans.sa_session.add( user )
trans.sa_session.flush()
message = 'The login information has been updated with the changes.'
elif user and params.get( 'edit_user_info_button', False ):
# Edit user information - webapp MUST BE 'galaxy'
user_type_fd_id = params.get( 'user_type_fd_id', 'none' )
if user_type_fd_id not in [ 'none' ]:
user_type_form_definition = trans.sa_session.query( trans.app.model.FormDefinition ).get( trans.security.decode_id( user_type_fd_id ) )
elif user.values:
user_type_form_definition = user.values.form_definition
else:
# User was created before any of the user_info forms were created
user_type_form_definition = None
if user_type_form_definition:
values = self.get_form_values( trans, user, user_type_form_definition, **kwd )
else:
values = {}
flush_needed = False
if user.values:
# Editing the user info of an existing user with existing user info
user.values.content = values
trans.sa_session.add( user.values )
flush_needed = True
elif values:
form_values = trans.model.FormValues( user_type_form_definition, values )
trans.sa_session.add( form_values )
user.values = form_values
flush_needed = True
if flush_needed:
trans.sa_session.add( user )
trans.sa_session.flush()
message = "The user information has been updated with the changes."
if user and trans.webapp.name == 'galaxy' and is_admin:
kwd[ 'user_id' ] = trans.security.encode_id( user.id )
kwd[ 'id' ] = user_id
if message:
kwd[ 'message' ] = util.sanitize_text( message )
if status:
kwd[ 'status' ] = status
return trans.response.send_redirect( web.url_for( controller='user',
action='manage_user_info',
cntrller=cntrller,
**kwd ) )

@web.expose
@web.require_admin
def manage_user_info( self, trans, cntrller, **kwd ):
'''TEMPORARY ENDPOINT - added back to support admin-level user info
editing prior to adminjs. This is code that was prematurely removed
from the user controller when the user-side admin functionality was
replaced. Manage a user's login, password, public username, type,
addresses, etc.'''

def __get_user_type_form_definition( trans, user=None, **kwd ):
params = util.Params( kwd )
if user and user.values:
user_type_fd_id = trans.security.encode_id( user.values.form_definition.id )
else:
user_type_fd_id = params.get( 'user_type_fd_id', 'none' )
if user_type_fd_id not in [ 'none' ]:
user_type_form_definition = trans.sa_session.query( trans.app.model.FormDefinition ).get( trans.security.decode_id( user_type_fd_id ) )
else:
user_type_form_definition = None
return user_type_form_definition

def __get_widgets( trans, user_type_form_definition, user=None, **kwd ):
widgets = []
if user_type_form_definition:
if user:
if user.values:
widgets = user_type_form_definition.get_widgets( user=user,
contents=user.values.content,
**kwd )
else:
widgets = user_type_form_definition.get_widgets( None, contents={}, **kwd )
else:
widgets = user_type_form_definition.get_widgets( None, contents={}, **kwd )
return widgets

def __build_user_type_fd_id_select_field( trans, selected_value ):
from galaxy.web.form_builder import build_select_field
# Get all the user information forms
user_info_forms = self.get_all_forms( trans,
filter=dict( deleted=False ),
form_type=trans.model.FormDefinition.types.USER_INFO )
return build_select_field( trans,
objs=user_info_forms,
label_attr='name',
select_field_name='user_type_fd_id',
initial_value='none',
selected_value=selected_value,
refresh_on_change=True )

params = util.Params( kwd )
user_id = params.get( 'id', None )
if user_id:
user = trans.sa_session.query( trans.app.model.User ).get( trans.security.decode_id( user_id ) )
else:
user = trans.user
if not user:
raise AssertionError("The user id (%s) is not valid" % str( user_id ))
email = util.restore_text( params.get( 'email', user.email ) )
username = util.restore_text( params.get( 'username', '' ) )
if not username:
username = user.username
message = escape( util.restore_text( params.get( 'message', '' ) ) )
status = params.get( 'status', 'done' )
user_type_form_definition = __get_user_type_form_definition( trans, user=user, **kwd )
user_type_fd_id = params.get( 'user_type_fd_id', 'none' )
if user_type_fd_id == 'none' and user_type_form_definition is not None:
user_type_fd_id = trans.security.encode_id( user_type_form_definition.id )
user_type_fd_id_select_field = __build_user_type_fd_id_select_field( trans, selected_value=user_type_fd_id )
widgets = __get_widgets( trans, user_type_form_definition, user=user, **kwd )
# user's addresses
show_filter = util.restore_text( params.get( 'show_filter', 'Active' ) )
if show_filter == 'All':
addresses = [address for address in user.addresses]
elif show_filter == 'Deleted':
addresses = [address for address in user.addresses if address.deleted]
else:
addresses = [address for address in user.addresses if not address.deleted]
user_info_forms = self.get_all_forms( trans,
filter=dict( deleted=False ),
form_type=trans.app.model.FormDefinition.types.USER_INFO )
return trans.fill_template( '/webapps/galaxy/user/manage_info.mako',
cntrller=cntrller,
user=user,
email=email,
username=username,
user_type_fd_id_select_field=user_type_fd_id_select_field,
user_info_forms=user_info_forms,
user_type_form_definition=user_type_form_definition,
user_type_fd_id=user_type_fd_id,
widgets=widgets,
addresses=addresses,
show_filter=show_filter,
message=message,
status=status )
95 changes: 95 additions & 0 deletions templates/webapps/galaxy/user/manage_info.mako
@@ -0,0 +1,95 @@
<%inherit file="/base.mako"/>
<%namespace file="/user/info.mako" import="render_user_info" />
<%namespace file="/message.mako" import="render_msg" />

%if message:
${render_msg( message, status )}
%endif

${render_user_info()}

%if user.values or user_info_forms:
<p></p>
<div class="toolForm">
<form name="user_info" id="user_info" action="${h.url_for( controller='user', action='edit_info', cntrller=cntrller, user_id=trans.security.encode_id( user.id ) )}" method="post" >
<div class="toolFormTitle">User information</div>
%if user_type_fd_id_select_field and len( user_type_fd_id_select_field.options ) >= 1:
<div class="form-row">
<label>User type:</label>
${user_type_fd_id_select_field.get_html()}
</div>
%else:
<input type="hidden" name="user_type_fd_id" value="${trans.security.encode_id( user_type_fd_id )}"/>
%endif
%for field in widgets:
<div class="form-row">
<label>${field['label']}:</label>
${field['widget'].get_html()}
<div class="toolParamHelp" style="clear: both;">
${field['helptext']}
</div>
<div style="clear: both"></div>
</div>
%endfor
<div class="form-row">
<input type="submit" name="edit_user_info_button" value="Save"/>
</div>
</form>
</div>
<p></p>
%endif

<p/>

<div class="toolForm">
<form name="user_addresses" id="user_addresses" action="${h.url_for( controller='user', action='new_address', cntrller=cntrller, id=trans.security.encode_id( user.id ) )}" method="post" >
<div class="toolFormTitle">User Addresses</div>
<div class="toolFormBody">
%if user.addresses:
<div class="form-row">
<div class="grid-header">
%for i, filter in enumerate( ['Active', 'Deleted', 'All'] ):
%if i > 0:
<span>|</span>
%endif
%if show_filter == filter:
<span class="filter"><a href="${h.url_for( controller='user', action='manage_user_info', cntrller=cntrller, show_filter=filter, id=trans.security.encode_id( user.id ) )}"><b>${filter}</b></a></span>
%else:
<span class="filter"><a href="${h.url_for( controller='user', action='manage_user_info', cntrller=cntrller, show_filter=filter, id=trans.security.encode_id( user.id ) )}">${filter}</a></span>
%endif
%endfor
</div>
</div>
<table class="grid">
<tbody>
%for index, address in enumerate(addresses):
<tr class="libraryRow libraryOrFolderRow" id="libraryRow">
<td>
<div class="form-row">
<label>${address.desc | h}:</label>
${address.get_html()}
</div>
<div class="form-row">
<ul class="manage-table-actions">
<li>
%if not address.deleted:
<a class="action-button" href="${h.url_for( controller='user', action='edit_address', cntrller=cntrller, address_id=trans.security.encode_id( address.id ), id=trans.security.encode_id( user.id ) )}">Edit</a>
<a class="action-button" href="${h.url_for( controller='user', action='delete_address', cntrller=cntrller, address_id=trans.security.encode_id( address.id ), id=trans.security.encode_id( user.id ) )}">Delete</a>
%else:
<a class="action-button" href="${h.url_for( controller='user', action='undelete_address', cntrller=cntrller, address_id=trans.security.encode_id( address.id ), id=trans.security.encode_id( user.id ) )}">Undelete</a>
%endif
</li>
</ul>
</div>
</td>
</tr>
%endfor
</tbody>
</table>
%endif
<div class="form-row">
<input type="submit" value="Add a new address">
</div>
</div>
</form>
</div>

0 comments on commit d10f740

Please sign in to comment.