def create( self, trans, visualization_title="", visualization_slug="", visualization_annotation="", visualization_dbkey="", visualization_type="" ): """ Creates a new visualization or returns a form for creating visualization. """ visualization_title_err = visualization_slug_err = visualization_annotation_err = "" if trans.request.method == "POST": rval = self.create_visualization( trans, title=visualization_title, slug=visualization_slug, annotation=visualization_annotation, dbkey=visualization_dbkey, type=visualization_type ) if isinstance( rval, dict ): # Found error creating viz. visualization_title_err = rval[ 'title_err' ] visualization_slug_err = rval[ 'slug_err' ] else: # Successfully created viz. return trans.response.send_redirect( web.url_for(controller='visualization', action='list' ) ) viz_type_options = [ ( t, t ) for t in self.viz_types ] return trans.show_form( web.FormBuilder( web.url_for(controller='visualization', action='create'), "Create new visualization", submit_text="Submit" ) .add_text( "visualization_title", "Visualization title", value=visualization_title, error=visualization_title_err ) .add_select( "visualization_type", "Type", options=viz_type_options, error=None ) .add_text( "visualization_slug", "Visualization identifier", value=visualization_slug, error=visualization_slug_err, help="""A unique identifier that will be used for public links to this visualization. A default is generated from the visualization title, but can be edited. This field must contain only lowercase letters, numbers, and the '-' character.""" ) .add_select( "visualization_dbkey", "Visualization DbKey/Build", value=visualization_dbkey, options=trans.app.genomes.get_dbkeys( trans, chrom_info=True ), error=None) .add_text( "visualization_annotation", "Visualization annotation", value=visualization_annotation, error=visualization_annotation_err, help="A description of the visualization; annotation is shown alongside published visualizations."), template="visualization/create.mako" )
def reset_password(self, trans, email=None, **kwd): error = '' reset_user = trans.app.model.User.get_by(email=email) user = trans.get_user() if reset_user: if user and user.id != reset_user.id: error = "You may only reset your own password" else: chars = string.letters + string.digits new_pass = "" for i in range(15): new_pass = new_pass + choice(chars) mail = os.popen("%s -t" % self.app.config.sendmail_path, 'w') mail.write( "To: %s\nFrom: no-reply@%s\nSubject: Galaxy Password Reset\n\nYour password has been reset to \"%s\" (no quotes)." % (email, trans.request.remote_addr, new_pass)) if mail.close(): return trans.show_ok_message( "Failed to reset password! If this problem persist, submit a bug report." ) reset_user.set_password_cleartext(new_pass) reset_user.flush() trans.log_event("User reset password: %s" % email) return trans.show_ok_message( "Password has been reset and emailed to: %s." % email) elif email != None: error = "The specified user does not exist" return trans.show_form( web.FormBuilder("/user/reset_password", "Reset Password", submit_text="Submit").add_text("email", "Email", value=email, error=error))
def create(self, trans, email='', password='', confirm='', subscribe=False): email_error = password_error = confirm_error = None if email: if len(email) == 0 or "@" not in email or "." not in email: email_error = "Please enter a real email address" elif len(email) > 255: email_error = "Email address exceeds maximum allowable length" elif len(trans.app.model.User.select_by(email=email)) > 0: email_error = "User with that email already exists" elif len(password) < 6: password_error = "Please use a password of at least 6 characters" elif password != confirm: confirm_error = "Passwords do not match" else: user = trans.app.model.User(email=email) user.set_password_cleartext(password) user.flush() trans.set_user(user) trans.log_event("User new") trans.log_event("User logged in") #subscribe user to email list if subscribe: mail = os.popen("%s -t" % self.app.config.sendmail_path, 'w') mail.write( "To: %s\nFrom: %s\nSubject: Join Mailing List\n\nJoin Mailing list." % (self.app.config.mailing_join_addr, email)) if mail.close(): return trans.show_warn_message( "Now logged in as " + user.email + ". However, subscribing to the mailing list has failed.", refresh_frames=['masthead', 'history']) return trans.show_ok_message( "Now logged in as " + user.email, refresh_frames=['masthead', 'history']) return trans.show_form( web.FormBuilder("/user/create", "Create account", submit_text="Create").add_text( "email", "Email address", value=email, error=email_error).add_password( "password", "Password", value='', error=password_error).add_password( "confirm", "Confirm password", value='', error=confirm_error).add_input( "checkbox", "Subscribe To Mailing List", "subscribe", value='subscribe'))
def login(self, trans, email='', password=''): email_error = password_error = None # Attempt login if email or password: user = trans.app.model.User.get_by(email=email) if not user: email_error = "No such user" elif not user.check_password(password): password_error = "Invalid password" else: trans.set_user(user) trans.log_event("User logged in") return trans.show_ok_message( "Now logged in as " + user.email, \ refresh_frames=['masthead', 'history'] ) return trans.show_form( web.FormBuilder("/user/login", "Login", submit_text="Login").add_text("email", "Email address", value=email, error=email_error). add_password( "password", "Password", value='', error=password_error, help= "<a href=\"/user/reset_password\">Forgot password? Reset here</a>" ))
def edit( self, trans, id, page_title="", page_slug="", page_annotation="" ): """ Edit a page's attributes. """ encoded_id = id id = trans.security.decode_id( id ) session = trans.sa_session page = session.query( model.Page ).get( id ) user = trans.user assert page.user == user page_title_err = page_slug_err = page_annotation_err = "" if trans.request.method == "POST": if not page_title: page_title_err = "Page name is required" elif not page_slug: page_slug_err = "Page id is required" elif not self._is_valid_slug( page_slug ): page_slug_err = "Page identifier must consist of only lowercase letters, numbers, and the '-' character" elif page_slug != page.slug and trans.sa_session.query( model.Page ).filter_by( user=user, slug=page_slug, deleted=False ).first(): page_slug_err = "Page id must be unique" elif not page_annotation: page_annotation_err = "Page annotation is required" else: page.title = page_title page.slug = page_slug page_annotation = sanitize_html( page_annotation, 'utf-8', 'text/html' ) self.add_item_annotation( trans.sa_session, trans.get_user(), page, page_annotation ) session.flush() # Redirect to page list. return trans.response.send_redirect( web.url_for(controller='page', action='list' ) ) else: page_title = page.title page_slug = page.slug page_annotation = self.get_item_annotation_str( trans.sa_session, trans.user, page ) if not page_annotation: page_annotation = "" return trans.show_form( web.FormBuilder( web.url_for(controller='page', action='edit', id=encoded_id ), "Edit page attributes", submit_text="Submit" ) .add_text( "page_title", "Page title", value=page_title, error=page_title_err ) .add_text( "page_slug", "Page identifier", value=page_slug, error=page_slug_err, help="""A unique identifier that will be used for public links to this page. A default is generated from the page title, but can be edited. This field must contain only lowercase letters, numbers, and the '-' character.""" ) .add_text( "page_annotation", "Page annotation", value=page_annotation, error=page_annotation_err, help="A description of the page; annotation is shown alongside published pages."), template="page/create.mako" )
def create( self, trans, page_title="", page_slug="", page_annotation="" ): """ Create a new page """ user = trans.get_user() page_title_err = page_slug_err = page_annotation_err = "" if trans.request.method == "POST": if not page_title: page_title_err = "Page name is required" elif not page_slug: page_slug_err = "Page id is required" elif not self._is_valid_slug( page_slug ): page_slug_err = "Page identifier must consist of only lowercase letters, numbers, and the '-' character" elif trans.sa_session.query( model.Page ).filter_by( user=user, slug=page_slug, deleted=False ).first(): page_slug_err = "Page id must be unique" else: # Create the new stored page page = model.Page() page.title = page_title page.slug = page_slug page_annotation = sanitize_html( page_annotation, 'utf-8', 'text/html' ) self.add_item_annotation( trans.sa_session, trans.get_user(), page, page_annotation ) page.user = user # And the first (empty) page revision page_revision = model.PageRevision() page_revision.title = page_title page_revision.page = page page.latest_revision = page_revision page_revision.content = "" # Persist session = trans.sa_session session.add( page ) session.flush() # Display the management page ## trans.set_message( "Page '%s' created" % page.title ) return trans.response.send_redirect( web.url_for(controller='page', action='list' ) ) return trans.show_form( web.FormBuilder( web.url_for(controller='page', action='create'), "Create new page", submit_text="Submit" ) .add_text( "page_title", "Page title", value=page_title, error=page_title_err ) .add_text( "page_slug", "Page identifier", value=page_slug, error=page_slug_err, help="""A unique identifier that will be used for public links to this page. A default is generated from the page title, but can be edited. This field must contain only lowercase letters, numbers, and the '-' character.""" ) .add_text( "page_annotation", "Page annotation", value=page_annotation, error=page_annotation_err, help="A description of the page; annotation is shown alongside published pages."), template="page/create.mako" )
def edit( self, trans, id, visualization_title="", visualization_slug="", visualization_annotation="" ): """ Edit a visualization's attributes. """ visualization = self.get_visualization( trans, id, check_ownership=True ) session = trans.sa_session visualization_title_err = visualization_slug_err = visualization_annotation_err = "" if trans.request.method == "POST": if not visualization_title: visualization_title_err = "Visualization name is required" elif not visualization_slug: visualization_slug_err = "Visualization id is required" elif not self._is_valid_slug( visualization_slug ): visualization_slug_err = "Visualization identifier must consist of only lowercase letters, numbers, and the '-' character" elif visualization_slug != visualization.slug and trans.sa_session.query( model.Visualization ).filter_by( user=visualization.user, slug=visualization_slug, deleted=False ).first(): visualization_slug_err = "Visualization id must be unique" else: visualization.title = visualization_title visualization.slug = visualization_slug if visualization_annotation != "": visualization_annotation = sanitize_html( visualization_annotation, 'utf-8', 'text/html' ) self.add_item_annotation( trans.sa_session, trans.get_user(), visualization, visualization_annotation ) session.flush() # Redirect to visualization list. return trans.response.send_redirect( web.url_for(controller='visualization', action='list' ) ) else: visualization_title = visualization.title # Create slug if it's not already set. if visualization.slug is None: self.create_item_slug( trans.sa_session, visualization ) visualization_slug = visualization.slug visualization_annotation = self.get_item_annotation_str( trans.sa_session, trans.user, visualization ) if not visualization_annotation: visualization_annotation = "" return trans.show_form( web.FormBuilder( web.url_for(controller='visualization', action='edit', id=id ), "Edit visualization attributes", submit_text="Submit" ) .add_text( "visualization_title", "Visualization title", value=visualization_title, error=visualization_title_err ) .add_text( "visualization_slug", "Visualization identifier", value=visualization_slug, error=visualization_slug_err, help="""A unique identifier that will be used for public links to this visualization. A default is generated from the visualization title, but can be edited. This field must contain only lowercase letters, numbers, and the '-' character.""" ) .add_text( "visualization_annotation", "Visualization annotation", value=visualization_annotation, error=visualization_annotation_err, help="A description of the visualization; annotation is shown alongside published visualizations."), template="visualization/create.mako" )
def get_config_form(self): type_hints = odict.odict() type_hints["list"] = "List of Datasets" type_hints["paired"] = "Dataset Pair" type_hints["list:paired"] = "List of Dataset Pairs" type_input = web.framework.DatalistInput( name="collection_type", label="Collection Type", value=self.state["collection_type"], extra_attributes=dict(refresh_on_change='true'), options=type_hints) form = web.FormBuilder(title=self.name).add_text( "name", "Name", value=self.state['name']) form.inputs.append(type_input) return self.trans.fill_template("workflow/editor_generic_form.mako", module=self, form=form)
def change_password(self, trans, old_pass='', new_pass='', conf_pass='', **kwd): old_pass_err = new_pass_err = conf_pass_err = '' user = trans.get_user() if not user: trans.response.send_redirect("/user/login") if not user.check_password(old_pass): old_pass_err = "Invalid password" elif len(new_pass) < 6: new_pass_err = "Please use a password of at least 6 characters" elif new_pass != conf_pass: conf_pass_err = "New passwords do not match." else: user.set_password_cleartext(new_pass) user.flush() trans.log_event("User change password") return trans.show_ok_message("Password has been changed for " + user.email) return trans.show_form( web.FormBuilder("/user/change_password", "Change Password", submit_text="Submit").add_password( "old_pass", "Old Password", value='', error=old_pass_err).add_password( "new_pass", "New Password", value='', error=new_pass_err).add_password( "conf_pass", "Confirm Password", value='', error=conf_pass_err))
def change_email(self, trans, email='', conf_email='', password='', **kwd): email_err = conf_email_err = pass_err = '' user = trans.get_user() if not user: trans.response.send_redirect("/user/login") if not user.check_password(password): pass_err = "Invalid password" elif len(email) == 0 or "@" not in email or "." not in email: email_err = "Please enter a real email address" elif len(email) > 255: email_err = "Email address exceeds maximum allowable length" elif len(trans.app.model.User.select_by(email=email)) > 0: email_err = "User with that email already exists" elif email != conf_email: conf_email_err = "Email addresses do not match." else: user.email = email user.flush() trans.log_event("User change email") return trans.show_ok_message( "Email has been changed to: " + user.email, refresh_frames=['masthead', 'history']) return trans.show_form( web.FormBuilder("/user/change_email", "Change Email", submit_text="Submit").add_text( "email", "Email", value=email, error=email_err).add_text( "conf_email", "Confirm Email", value='', error=conf_email_err).add_password( "password", "Password", value='', error=pass_err))
def get_config_form( self ): form = web.FormBuilder( title=self.name ) \ .add_text( "name", "Name", value=self.state['name'] ) return self.trans.fill_template( "workflow/editor_generic_form.mako", module=self, form=form )