galaxy-commits
Threads by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/9a440d0b2a1c/
changeset: 9a440d0b2a1c
user: james_taylor
date: 2013-01-18 16:44:18
summary: modals: make wider by default and scroll like trello
affected #: 3 files
diff -r a4113cc1cb5eaa68091c9a73375f00555b66dd11 -r 9a440d0b2a1ca00e71564f9258211a9eb9830fee static/june_2007_style/base.less
--- a/static/june_2007_style/base.less
+++ b/static/june_2007_style/base.less
@@ -311,9 +311,10 @@
}
#overlay {
- position: fixed;
+ position: absolute;
top: 0; left: 0; width: 100%; height: 100%;
z-index: 20000;
+ overflow-y: auto;
}
#overlay.is_modal #overlay-background, .overlay-background {
diff -r a4113cc1cb5eaa68091c9a73375f00555b66dd11 -r 9a440d0b2a1ca00e71564f9258211a9eb9830fee static/june_2007_style/blue/base.css
--- a/static/june_2007_style/blue/base.css
+++ b/static/june_2007_style/blue/base.css
@@ -537,6 +537,9 @@
.btn.active,.btn:active{color:inherit;}
.dropdown-menu{max-width:auto;}
input[type="checkbox"],input[type="radio"]{margin-left:0.5ex;margin-right:0.5ex;}
+.modal{position:absolute;top:50px;width:660px;margin-left:-330px;}
+.modal:after{content:"";height:0px;position:relative;top:50px;display:block;border:solid transparent 1px;}
+.modal-body{height:auto;max-height:none;}
.nav-tabs{border-bottom:1px solid #999999;}
.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #999999;}
.nav-tabs>.active>a,.nav-tabs>.active>a:hover{border:1px solid #999999;border-bottom-color:transparent;}
@@ -865,7 +868,7 @@
.panel-header-button{color:#333;text-decoration:none;display:inline-block;cursor:pointer;margin:-1px;padding:1px;margin-top:-0.2em;padding-right:0.5em;padding-left:0.5em;}.panel-header-button:hover{color:maroon;-webkit-transition:color 0.25s linear;-moz-transition:color 0.25s linear;-o-transition:color 0.25s linear;transition:color 0.25s linear;}
.panel-header-button .caret{margin-top:7px;}
.panel-header-button.popup{padding-right:1.75em;background:url(../images/dropdownarrow.png) no-repeat right 7px;}
-#overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:20000;}
+#overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:20000;overflow-y:auto;}
#overlay.is_modal #overlay-background,.overlay-background{background:rgba(0, 0, 0, 0.5);}
.panel-error-message,.panel-warning-message,.panel-done-message,.panel-info-message{height:24px;line-height:24px;color:#303030;padding:0px;padding-left:26px;background-color:#ffcccc;background-image:url(error_small.png);background-repeat:no-repeat;background-position:6px 50%;}
.panel-warning-message{background-image:url(warn_small.png);background-color:#ffffcc;}
diff -r a4113cc1cb5eaa68091c9a73375f00555b66dd11 -r 9a440d0b2a1ca00e71564f9258211a9eb9830fee static/june_2007_style/galaxy_bootstrap.less
--- a/static/june_2007_style/galaxy_bootstrap.less
+++ b/static/june_2007_style/galaxy_bootstrap.less
@@ -98,6 +98,31 @@
margin-right: 0.5ex;
}
+// Modal -- wider by default, scroll like Trello
+
+.modal {
+ position: absolute;
+ top: 50px;
+ width: 660px;
+ margin-left: -330px;
+}
+
+
+.modal:after {
+ content: "";
+ height: 0px;
+ position: relative;
+ top: 50px;
+ display: block;
+ border: solid transparent 1px;
+};
+
+
+.modal-body {
+ height: auto;
+ max-height: none;
+}
+
// Tabs -- border color is hardcoded in navs.less, change to @btnBorder here
.nav-tabs {
https://bitbucket.org/galaxy/galaxy-central/commits/add133ca7596/
changeset: add133ca7596
user: james_taylor
date: 2013-01-18 17:31:21
summary: merge
affected #: 3 files
diff -r b9d44cf4b68e2c4a76bc2b7f7eb54950e2c077be -r add133ca7596281900e31933e6b0748812323517 static/june_2007_style/base.less
--- a/static/june_2007_style/base.less
+++ b/static/june_2007_style/base.less
@@ -311,9 +311,10 @@
}
#overlay {
- position: fixed;
+ position: absolute;
top: 0; left: 0; width: 100%; height: 100%;
z-index: 20000;
+ overflow-y: auto;
}
#overlay.is_modal #overlay-background, .overlay-background {
diff -r b9d44cf4b68e2c4a76bc2b7f7eb54950e2c077be -r add133ca7596281900e31933e6b0748812323517 static/june_2007_style/blue/base.css
--- a/static/june_2007_style/blue/base.css
+++ b/static/june_2007_style/blue/base.css
@@ -537,6 +537,9 @@
.btn.active,.btn:active{color:inherit;}
.dropdown-menu{max-width:auto;}
input[type="checkbox"],input[type="radio"]{margin-left:0.5ex;margin-right:0.5ex;}
+.modal{position:absolute;top:50px;width:660px;margin-left:-330px;}
+.modal:after{content:"";height:0px;position:relative;top:50px;display:block;border:solid transparent 1px;}
+.modal-body{height:auto;max-height:none;}
.nav-tabs{border-bottom:1px solid #999999;}
.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #999999;}
.nav-tabs>.active>a,.nav-tabs>.active>a:hover{border:1px solid #999999;border-bottom-color:transparent;}
@@ -865,7 +868,7 @@
.panel-header-button{color:#333;text-decoration:none;display:inline-block;cursor:pointer;margin:-1px;padding:1px;margin-top:-0.2em;padding-right:0.5em;padding-left:0.5em;}.panel-header-button:hover{color:maroon;-webkit-transition:color 0.25s linear;-moz-transition:color 0.25s linear;-o-transition:color 0.25s linear;transition:color 0.25s linear;}
.panel-header-button .caret{margin-top:7px;}
.panel-header-button.popup{padding-right:1.75em;background:url(../images/dropdownarrow.png) no-repeat right 7px;}
-#overlay{position:fixed;top:0;left:0;width:100%;height:100%;z-index:20000;}
+#overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:20000;overflow-y:auto;}
#overlay.is_modal #overlay-background,.overlay-background{background:rgba(0, 0, 0, 0.5);}
.panel-error-message,.panel-warning-message,.panel-done-message,.panel-info-message{height:24px;line-height:24px;color:#303030;padding:0px;padding-left:26px;background-color:#ffcccc;background-image:url(error_small.png);background-repeat:no-repeat;background-position:6px 50%;}
.panel-warning-message{background-image:url(warn_small.png);background-color:#ffffcc;}
diff -r b9d44cf4b68e2c4a76bc2b7f7eb54950e2c077be -r add133ca7596281900e31933e6b0748812323517 static/june_2007_style/galaxy_bootstrap.less
--- a/static/june_2007_style/galaxy_bootstrap.less
+++ b/static/june_2007_style/galaxy_bootstrap.less
@@ -98,6 +98,31 @@
margin-right: 0.5ex;
}
+// Modal -- wider by default, scroll like Trello
+
+.modal {
+ position: absolute;
+ top: 50px;
+ width: 660px;
+ margin-left: -330px;
+}
+
+
+.modal:after {
+ content: "";
+ height: 0px;
+ position: relative;
+ top: 50px;
+ display: block;
+ border: solid transparent 1px;
+};
+
+
+.modal-body {
+ height: auto;
+ max-height: none;
+}
+
// Tabs -- border color is hardcoded in navs.less, change to @btnBorder here
.nav-tabs {
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: history panel: Show/enable display icon-button for non-ready-state hdas
by Bitbucket 18 Jan '13
by Bitbucket 18 Jan '13
18 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b9d44cf4b68e/
changeset: b9d44cf4b68e
user: carlfeberhard
date: 2013-01-18 16:45:20
summary: history panel: Show/enable display icon-button for non-ready-state hdas
affected #: 1 file
diff -r c8cb184472b913c635fb34f31e4122c3c1f77e87 -r b9d44cf4b68e2c4a76bc2b7f7eb54950e2c077be static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -198,15 +198,14 @@
* @returns {jQuery} rendered DOM
*/
_render_displayButton : function(){
- // don't show display if not in ready state or not accessible
- // DO show if in error (ala previous history panel)
- if( ( !this.model.inReadyState() )
- //|| ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.ERROR )
- || ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
+ // don't show display if not viewable or not accessible
+ // (do show if in error, running)
+ if( ( this.model.get( 'state' ) === HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( !this.model.get( 'accessible' ) ) ){
this.displayButton = null;
return null;
}
+ //NOTE: line 88 in history_common.mako should be handled by the url template generation
var displayBtnData = {
icon_class : 'display',
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dannon: Sphinx Doc: Remove enable_api step from the api quickstart as it is no longer necessary.
by Bitbucket 18 Jan '13
by Bitbucket 18 Jan '13
18 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c8cb184472b9/
changeset: c8cb184472b9
user: dannon
date: 2013-01-18 16:26:57
summary: Sphinx Doc: Remove enable_api step from the api quickstart as it is no longer necessary.
affected #: 1 file
diff -r d36e35dd83bf18a47f26dc6eb779549c15782fbd -r c8cb184472b913c635fb34f31e4122c3c1f77e87 doc/source/lib/galaxy.webapps.galaxy.api.rst
--- a/doc/source/lib/galaxy.webapps.galaxy.api.rst
+++ b/doc/source/lib/galaxy.webapps.galaxy.api.rst
@@ -23,10 +23,6 @@
Quickstart
==========
-Set the following option in universe_wsgi.ini and start the server::
-
- enable_api = True
-
Log in as your user, navigate to the API Keys page in the User menu, and
generate a new API key. Make a note of the API key, and then pull up a
terminal. Now we'll use the display.py script in your galaxy/scripts/api
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix circular repository dependency issue that so far uccurs only on the test tool shed.
by Bitbucket 18 Jan '13
by Bitbucket 18 Jan '13
18 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d36e35dd83bf/
changeset: d36e35dd83bf
user: greg
date: 2013-01-18 16:16:20
summary: Fix circular repository dependency issue that so far uccurs only on the test tool shed.
affected #: 1 file
diff -r c86a704ba3f60bc51c9f998e0061d9b9f9507242 -r d36e35dd83bf18a47f26dc6eb779549c15782fbd lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -2779,6 +2779,7 @@
def populate_repository_dependency_objects_for_processing( trans, current_repository_key, repository_dependencies_dict, key_rd_dicts_to_be_processed,
handled_key_rd_dicts, circular_repository_dependencies, all_repository_dependencies ):
current_repository_key_rd_dicts = []
+ filtered_current_repository_key_rd_dicts = []
for rd in repository_dependencies_dict[ 'repository_dependencies' ]:
new_key_rd_dict = {}
new_key_rd_dict[ current_repository_key ] = rd
@@ -2790,6 +2791,7 @@
for key_rd_dict in current_repository_key_rd_dicts:
is_circular = False
if not in_key_rd_dicts( key_rd_dict, handled_key_rd_dicts ) and not in_key_rd_dicts( key_rd_dict, key_rd_dicts_to_be_processed ):
+ filtered_current_repository_key_rd_dicts.append( key_rd_dict )
repository_dependency = key_rd_dict[ current_repository_key ]
if current_repository_key in all_repository_dependencies:
# Add all repository dependencies for the current repository into it's entry in all_repository_dependencies.
@@ -2813,7 +2815,7 @@
new_key_rd_dict = {}
new_key_rd_dict[ current_repository_key ] = repository_dependency
key_rd_dicts_to_be_processed.append( new_key_rd_dict )
- return current_repository_key_rd_dicts, key_rd_dicts_to_be_processed, handled_key_rd_dicts, all_repository_dependencies
+ return filtered_current_repository_key_rd_dicts, key_rd_dicts_to_be_processed, handled_key_rd_dicts, all_repository_dependencies
def remove_dir( dir ):
if os.path.exists( dir ):
try:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
17 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c86a704ba3f6/
changeset: c86a704ba3f6
user: greg
date: 2013-01-17 22:42:11
summary: Add missing imports to shed_util_common.
affected #: 1 file
diff -r dd395d9b8a01255412b3e56219d11639ccce2e50 -r c86a704ba3f60bc51c9f998e0061d9b9f9507242 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1,4 +1,6 @@
import os, shutil, tempfile, logging, string, threading, urllib2, filecmp
+from datetime import datetime
+from time import gmtime, strftime
from galaxy import web, util
from galaxy.tools import parameters
from galaxy.util import inflector, json
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Refactor the tool shed's common controller for planned elimination.
by Bitbucket 17 Jan '13
by Bitbucket 17 Jan '13
17 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/dd395d9b8a01/
changeset: dd395d9b8a01
user: greg
date: 2013-01-17 22:34:26
summary: Refactor the tool shed's common controller for planned elimination.
affected #: 7 files
diff -r 6538175fb3e6483895aaadfdeddd09aac558fdf5 -r dd395d9b8a01255412b3e56219d11639ccce2e50 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1,12 +1,14 @@
import os, shutil, tempfile, logging, string, threading, urllib2, filecmp
-from galaxy import util
+from galaxy import web, util
from galaxy.tools import parameters
from galaxy.util import inflector, json
+from galaxy.util.odict import odict
from galaxy.web import url_for
from galaxy.web.form_builder import SelectField
from galaxy.webapps.community.util import container_util
from galaxy.datatypes import checkers
from galaxy.model.orm import and_
+import sqlalchemy.orm.exc
from galaxy.tools.parameters import dynamic_options
from galaxy.tool_shed import encoding_util
@@ -38,6 +40,60 @@
TOOL_SHED_ADMIN_CONTROLLER = 'TOOL_SHED_ADMIN_CONTROLLER'
VALID_CHARS = set( string.letters + string.digits + "'\"-=_.()/+*^,:?!#[]%\\$@;{}" )
+new_repo_email_alert_template = """
+Repository name: ${repository_name}
+Revision: ${revision}
+Change description:
+${description}
+
+Uploaded by: ${username}
+Date content uploaded: ${display_date}
+
+${content_alert_str}
+
+-----------------------------------------------------------------------------
+This change alert was sent from the Galaxy tool shed hosted on the server
+"${host}"
+-----------------------------------------------------------------------------
+You received this alert because you registered to receive email when
+new repositories were created in the Galaxy tool shed named "${host}".
+-----------------------------------------------------------------------------
+"""
+
+email_alert_template = """
+Repository name: ${repository_name}
+Revision: ${revision}
+Change description:
+${description}
+
+Changed by: ${username}
+Date of change: ${display_date}
+
+${content_alert_str}
+
+-----------------------------------------------------------------------------
+This change alert was sent from the Galaxy tool shed hosted on the server
+"${host}"
+-----------------------------------------------------------------------------
+You received this alert because you registered to receive email whenever
+changes were made to the repository named "${repository_name}".
+-----------------------------------------------------------------------------
+"""
+
+contact_owner_template = """
+GALAXY TOOL SHED REPOSITORY MESSAGE
+------------------------
+
+The user '${username}' sent you the following message regarding your tool shed
+repository named '${repository_name}'. You can respond by sending a reply to
+the user's email address: ${email}.
+-----------------------------------------------------------------------------
+${message}
+-----------------------------------------------------------------------------
+This message was sent from the Galaxy Tool Shed instance hosted on the server
+'${host}'
+"""
+
def add_installation_directories_to_tool_dependencies( trans, tool_dependencies ):
"""
Determine the path to the installation directory for each of the received tool dependencies. This path will be displayed within the tool dependencies
@@ -65,6 +121,18 @@
requirements_dict[ 'install_dir' ] = install_dir
tool_dependencies[ dependency_key ] = requirements_dict
return tool_dependencies
+def add_tool_versions( trans, id, repository_metadata, changeset_revisions ):
+ # Build a dictionary of { 'tool id' : 'parent tool id' } pairs for each tool in repository_metadata.
+ metadata = repository_metadata.metadata
+ tool_versions_dict = {}
+ for tool_dict in metadata.get( 'tools', [] ):
+ # We have at least 2 changeset revisions to compare tool guids and tool ids.
+ parent_id = get_parent_id( trans, id, tool_dict[ 'id' ], tool_dict[ 'version' ], tool_dict[ 'guid' ], changeset_revisions )
+ tool_versions_dict[ tool_dict[ 'guid' ] ] = parent_id
+ if tool_versions_dict:
+ repository_metadata.tool_versions = tool_versions_dict
+ trans.sa_session.add( repository_metadata )
+ trans.sa_session.flush()
def build_readme_files_dict( metadata, tool_path=None ):
"""Return a dictionary of valid readme file name <-> readme file content pairs for all readme files contained in the received metadata."""
readme_files_dict = {}
@@ -439,6 +507,30 @@
except:
pass
return can_use_disk_file
+def changeset_is_malicious( trans, id, changeset_revision, **kwd ):
+ """Check the malicious flag in repository metadata for a specified change set"""
+ repository_metadata = get_repository_metadata_by_changeset_revision( trans, id, changeset_revision )
+ if repository_metadata:
+ return repository_metadata.malicious
+ return False
+def changeset_revision_reviewed_by_user( trans, user, repository, changeset_revision ):
+ """Determine if the current changeset revision has been reviewed by the current user."""
+ for review in repository.reviews:
+ if review.changeset_revision == changeset_revision and review.user == user:
+ return True
+ return False
+def check_file_contents( trans ):
+ """See if any admin users have chosen to receive email alerts when a repository is updated. If so, the file contents of the update must be
+ checked for inappropriate content.
+ """
+ admin_users = trans.app.config.get( "admin_users", "" ).split( "," )
+ for repository in trans.sa_session.query( trans.model.Repository ) \
+ .filter( trans.model.Repository.table.c.email_alerts != None ):
+ email_alerts = json.from_json_string( repository.email_alerts )
+ for user_email in email_alerts:
+ if user_email in admin_users:
+ return True
+ return False
def check_tool_input_params( app, repo_dir, tool_config_name, tool, sample_files ):
"""
Check all of the tool's input parameters, looking for any that are dynamically generated using external data files to make
@@ -1411,13 +1503,49 @@
if name == stripped_file_name:
return os.path.abspath( os.path.join( root, name ) )
return file_path
+def get_categories( trans ):
+ """Get all categories from the database."""
+ return trans.sa_session.query( trans.model.Category ) \
+ .filter( trans.model.Category.table.c.deleted==False ) \
+ .order_by( trans.model.Category.table.c.name ) \
+ .all()
+def get_category( trans, id ):
+ """Get a category from the database."""
+ return trans.sa_session.query( trans.model.Category ).get( trans.security.decode_id( id ) )
+def get_category_by_name( trans, name ):
+ """Get a category from the database via name."""
+ try:
+ return trans.sa_session.query( trans.model.Category ).filter_by( name=name ).one()
+ except sqlalchemy.orm.exc.NoResultFound:
+ return None
def get_changectx_for_changeset( repo, changeset_revision, **kwd ):
- """Retrieve a specified changectx from a repository"""
+ """Retrieve a specified changectx from a repository."""
for changeset in repo.changelog:
ctx = repo.changectx( changeset )
if str( ctx ) == changeset_revision:
return ctx
return None
+def get_component( trans, id ):
+ """Get a component from the database."""
+ return trans.sa_session.query( trans.model.Component ).get( trans.security.decode_id( id ) )
+def get_component_by_name( trans, name ):
+ """Get a component from the database via a name."""
+ return trans.sa_session.query( trans.app.model.Component ) \
+ .filter( trans.app.model.Component.table.c.name==name ) \
+ .first()
+def get_component_review( trans, id ):
+ """Get a component_review from the database"""
+ return trans.sa_session.query( trans.model.ComponentReview ).get( trans.security.decode_id( id ) )
+def get_component_review_by_repository_review_id_component_id( trans, repository_review_id, component_id ):
+ """Get a component_review from the database via repository_review_id and component_id."""
+ return trans.sa_session.query( trans.model.ComponentReview ) \
+ .filter( and_( trans.model.ComponentReview.table.c.repository_review_id == trans.security.decode_id( repository_review_id ),
+ trans.model.ComponentReview.table.c.component_id == trans.security.decode_id( component_id ) ) ) \
+ .first()
+def get_components( trans ):
+ return trans.sa_session.query( trans.app.model.Component ) \
+ .order_by( trans.app.model.Component.name ) \
+ .all()
def get_config_from_disk( config_file, relative_install_dir ):
for root, dirs, files in os.walk( relative_install_dir ):
if root.find( '.hg' ) < 0:
@@ -1426,7 +1554,7 @@
return os.path.abspath( os.path.join( root, name ) )
return None
def get_configured_ui():
- # Configure any desired ui settings.
+ """Configure any desired ui settings."""
_ui = ui.ui()
# The following will suppress all messages. This is
# the same as adding the following setting to the repo
@@ -1479,6 +1607,12 @@
def get_installed_tool_shed_repository( trans, id ):
"""Get a repository on the Galaxy side from the database via id"""
return trans.sa_session.query( trans.model.ToolShedRepository ).get( trans.security.decode_id( id ) )
+def get_latest_repository_metadata( trans, decoded_repository_id ):
+ """Get last metadata defined for a specified repository from the database."""
+ return trans.sa_session.query( trans.model.RepositoryMetadata ) \
+ .filter( trans.model.RepositoryMetadata.table.c.repository_id == decoded_repository_id ) \
+ .order_by( trans.model.RepositoryMetadata.table.c.id.desc() ) \
+ .first()
def get_latest_tool_config_revision_from_repository_manifest( repo, filename, changeset_revision ):
"""
Get the latest revision of a tool config file named filename from the repository manifest up to the value of changeset_revision.
@@ -1649,6 +1783,21 @@
return INITIAL_CHANGELOG_HASH
else:
previous_changeset_revision = changeset_revision
+def get_previous_repository_reviews( trans, repository, changeset_revision ):
+ """Return an ordered dictionary of repository reviews up to and including the received changeset revision."""
+ repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) )
+ reviewed_revision_hashes = [ review.changeset_revision for review in repository.reviews ]
+ previous_reviews_dict = odict()
+ for changeset in reversed_upper_bounded_changelog( repo, changeset_revision ):
+ previous_changeset_revision = str( repo.changectx( changeset ) )
+ if previous_changeset_revision in reviewed_revision_hashes:
+ previous_rev, previous_changeset_revision_label = get_rev_label_from_changeset_revision( repo, previous_changeset_revision )
+ revision_reviews = get_reviews_by_repository_id_changeset_revision( trans,
+ trans.security.encode_id( repository.id ),
+ previous_changeset_revision )
+ previous_reviews_dict[ previous_changeset_revision ] = dict( changeset_revision_label=previous_changeset_revision_label,
+ reviews=revision_reviews )
+ return previous_reviews_dict
def get_readme_file_names( repository_name ):
readme_files = [ 'readme', 'read_me', 'install' ]
valid_filenames = [ r for r in readme_files ]
@@ -1664,6 +1813,9 @@
elif len( repo_info_tuple ) == 7:
description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
return description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies
+def get_repository_by_name( trans, name ):
+ """Get a repository from the database via name."""
+ return trans.sa_session.query( trans.model.Repository ).filter_by( name=name ).one()
def get_repository_by_name_and_owner( trans, name, owner ):
"""Get a repository from the database via name and owner"""
if trans.webapp.name == 'galaxy':
@@ -1819,6 +1971,25 @@
.filter( and_( trans.model.RepositoryMetadata.table.c.repository_id == trans.security.decode_id( id ),
trans.model.RepositoryMetadata.table.c.changeset_revision == changeset_revision ) ) \
.first()
+def get_repository_metadata_revisions_for_review( repository, reviewed=True ):
+ repository_metadata_revisions = []
+ metadata_changeset_revision_hashes = []
+ if reviewed:
+ for metadata_revision in repository.metadata_revisions:
+ metadata_changeset_revision_hashes.append( metadata_revision.changeset_revision )
+ for review in repository.reviews:
+ if review.changeset_revision in metadata_changeset_revision_hashes:
+ rmcr_hashes = [ rmr.changeset_revision for rmr in repository_metadata_revisions ]
+ if review.changeset_revision not in rmcr_hashes:
+ repository_metadata_revisions.append( review.repository_metadata )
+ else:
+ for review in repository.reviews:
+ if review.changeset_revision not in metadata_changeset_revision_hashes:
+ metadata_changeset_revision_hashes.append( review.changeset_revision )
+ for metadata_revision in repository.metadata_revisions:
+ if metadata_revision.changeset_revision not in metadata_changeset_revision_hashes:
+ repository_metadata_revisions.append( metadata_revision )
+ return repository_metadata_revisions
def get_repository_tools_tups( app, metadata_dict ):
repository_tools_tups = []
index, shed_conf_dict = get_shed_tool_conf_dict( app, metadata_dict.get( 'shed_config_filename' ) )
@@ -1849,6 +2020,48 @@
relative_path_to_file.startswith( os.path.join( shed_config_dict.get( 'tool_path' ), relative_install_dir ) ):
relative_path_to_file = relative_path_to_file[ len( shed_config_dict.get( 'tool_path' ) ) + 1: ]
return relative_path_to_file
+def get_reversed_changelog_changesets( repo ):
+ reversed_changelog = []
+ for changeset in repo.changelog:
+ reversed_changelog.insert( 0, changeset )
+ return reversed_changelog
+def get_review( trans, id ):
+ """Get a repository_review from the database via id."""
+ return trans.sa_session.query( trans.model.RepositoryReview ).get( trans.security.decode_id( id ) )
+def get_reviews_by_repository_id_changeset_revision( trans, repository_id, changeset_revision ):
+ """Get all repository_reviews from the database via repository id and changeset_revision."""
+ return trans.sa_session.query( trans.model.RepositoryReview ) \
+ .filter( and_( trans.model.RepositoryReview.repository_id == trans.security.decode_id( repository_id ),
+ trans.model.RepositoryReview.changeset_revision == changeset_revision ) ) \
+ .all()
+def get_review_by_repository_id_changeset_revision_user_id( trans, repository_id, changeset_revision, user_id ):
+ """Get a repository_review from the database via repository id, changeset_revision and user_id."""
+ return trans.sa_session.query( trans.model.RepositoryReview ) \
+ .filter( and_( trans.model.RepositoryReview.repository_id == trans.security.decode_id( repository_id ),
+ trans.model.RepositoryReview.changeset_revision == changeset_revision,
+ trans.model.RepositoryReview.user_id == trans.security.decode_id( user_id ) ) ) \
+ .first()
+def get_rev_label_changeset_revision_from_repository_metadata( trans, repository_metadata, repository=None ):
+ if repository is None:
+ repository = repository_metadata.repository
+ repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) )
+ changeset_revision = repository_metadata.changeset_revision
+ ctx = get_changectx_for_changeset( repo, changeset_revision )
+ if ctx:
+ rev = '%04d' % ctx.rev()
+ label = "%s:%s" % ( str( ctx.rev() ), changeset_revision )
+ else:
+ rev = '-1'
+ label = "-1:%s" % changeset_revision
+ return rev, label, changeset_revision
+def get_revision_label( trans, repository, changeset_revision ):
+ """Return a string consisting of the human read-able changeset rev and the changeset revision string."""
+ repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) )
+ ctx = get_changectx_for_changeset( repo, changeset_revision )
+ if ctx:
+ return "%s:%s" % ( str( ctx.rev() ), changeset_revision )
+ else:
+ return "-1:%s" % changeset_revision
def get_sample_files_from_disk( repository_files_dir, tool_path=None, relative_install_dir=None, resetting_all_metadata_on_repository=False ):
if resetting_all_metadata_on_repository:
# Keep track of the location where the repository is temporarily cloned so that we can strip it when setting metadata.
@@ -1877,6 +2090,15 @@
relative_path_to_sample_file = relative_path_to_sample_file[ len( tool_path ) + 1 :]
sample_file_metadata_paths.append( relative_path_to_sample_file )
return sample_file_metadata_paths, sample_file_copy_paths
+def get_rev_label_from_changeset_revision( repo, changeset_revision ):
+ ctx = get_changectx_for_changeset( repo, changeset_revision )
+ if ctx:
+ rev = '%04d' % ctx.rev()
+ label = "%s:%s" % ( str( ctx.rev() ), changeset_revision )
+ else:
+ rev = '-1'
+ label = "-1:%s" % changeset_revision
+ return rev, label
def get_shed_tool_conf_dict( app, shed_tool_conf ):
"""
Return the in-memory version of the shed_tool_conf file, which is stored in the config_elems entry
@@ -2004,8 +2226,11 @@
return shed_url
# The tool shed from which the repository was originally installed must no longer be configured in tool_sheds_conf.xml.
return None
+def get_user( trans, id ):
+ """Get a user from the database by id."""
+ return trans.sa_session.query( trans.model.User ).get( trans.security.decode_id( id ) )
def get_user_by_username( trans, username ):
- """Get a user from the database by username"""
+ """Get a user from the database by username."""
return trans.sa_session.query( trans.model.User ) \
.filter( trans.model.User.table.c.username == username ) \
.one()
@@ -2044,6 +2269,94 @@
all_repository_dependencies=all_repository_dependencies,
handled_key_rd_dicts=handled_key_rd_dicts,
circular_repository_dependencies=circular_repository_dependencies )
+def handle_email_alerts( trans, repository, content_alert_str='', new_repo_alert=False, admin_only=False ):
+ # There are 2 complementary features that enable a tool shed user to receive email notification:
+ # 1. Within User Preferences, they can elect to receive email when the first (or first valid)
+ # change set is produced for a new repository.
+ # 2. When viewing or managing a repository, they can check the box labeled "Receive email alerts"
+ # which caused them to receive email alerts when updates to the repository occur. This same feature
+ # is available on a per-repository basis on the repository grid within the tool shed.
+ #
+ # There are currently 4 scenarios for sending email notification when a change is made to a repository:
+ # 1. An admin user elects to receive email when the first change set is produced for a new repository
+ # from User Preferences. The change set does not have to include any valid content. This allows for
+ # the capture of inappropriate content being uploaded to new repositories.
+ # 2. A regular user elects to receive email when the first valid change set is produced for a new repository
+ # from User Preferences. This differs from 1 above in that the user will not receive email until a
+ # change set tha tincludes valid content is produced.
+ # 3. An admin user checks the "Receive email alerts" check box on the manage repository page. Since the
+ # user is an admin user, the email will include information about both HTML and image content that was
+ # included in the change set.
+ # 4. A regular user checks the "Receive email alerts" check box on the manage repository page. Since the
+ # user is not an admin user, the email will not include any information about both HTML and image content
+ # that was included in the change set.
+ repo_dir = repository.repo_path( trans.app )
+ repo = hg.repository( get_configured_ui(), repo_dir )
+ smtp_server = trans.app.config.smtp_server
+ if smtp_server and ( new_repo_alert or repository.email_alerts ):
+ # Send email alert to users that want them.
+ if trans.app.config.email_from is not None:
+ email_from = trans.app.config.email_from
+ elif trans.request.host.split( ':' )[0] == 'localhost':
+ email_from = 'galaxy-no-reply@' + socket.getfqdn()
+ else:
+ email_from = 'galaxy-no-reply@' + trans.request.host.split( ':' )[0]
+ tip_changeset = repo.changelog.tip()
+ ctx = repo.changectx( tip_changeset )
+ t, tz = ctx.date()
+ date = datetime( *gmtime( float( t ) - tz )[:6] )
+ display_date = date.strftime( "%Y-%m-%d" )
+ try:
+ username = ctx.user().split()[0]
+ except:
+ username = ctx.user()
+ # We'll use 2 template bodies because we only want to send content
+ # alerts to tool shed admin users.
+ if new_repo_alert:
+ template = new_repo_email_alert_template
+ else:
+ template = email_alert_template
+ admin_body = string.Template( template ).safe_substitute( host=trans.request.host,
+ repository_name=repository.name,
+ revision='%s:%s' %( str( ctx.rev() ), ctx ),
+ display_date=display_date,
+ description=ctx.description(),
+ username=username,
+ content_alert_str=content_alert_str )
+ body = string.Template( template ).safe_substitute( host=trans.request.host,
+ repository_name=repository.name,
+ revision='%s:%s' %( str( ctx.rev() ), ctx ),
+ display_date=display_date,
+ description=ctx.description(),
+ username=username,
+ content_alert_str='' )
+ admin_users = trans.app.config.get( "admin_users", "" ).split( "," )
+ frm = email_from
+ if new_repo_alert:
+ subject = "Galaxy tool shed alert for new repository named %s" % str( repository.name )
+ subject = subject[ :80 ]
+ email_alerts = []
+ for user in trans.sa_session.query( trans.model.User ) \
+ .filter( and_( trans.model.User.table.c.deleted == False,
+ trans.model.User.table.c.new_repo_alert == True ) ):
+ if admin_only:
+ if user.email in admin_users:
+ email_alerts.append( user.email )
+ else:
+ email_alerts.append( user.email )
+ else:
+ subject = "Galaxy tool shed update alert for repository named %s" % str( repository.name )
+ email_alerts = json.from_json_string( repository.email_alerts )
+ for email in email_alerts:
+ to = email.strip()
+ # Send it
+ try:
+ if to in admin_users:
+ util.send_mail( frm, to, subject, admin_body, trans.app.config )
+ else:
+ util.send_mail( frm, to, subject, body, trans.app.config )
+ except Exception, e:
+ log.exception( "An error occurred sending a tool shed repository update alert by email." )
def handle_existing_tool_dependencies_that_changed_in_update( app, repository, original_dependency_dict, new_dependency_dict ):
"""
This method is called when a Galaxy admin is getting updates for an installed tool shed repository in order to cover the case where an
@@ -2160,6 +2473,15 @@
message = str( e )
error = True
return error, message
+def has_previous_repository_reviews( trans, repository, changeset_revision ):
+ """Determine if a repository has a changeset revision review prior to the received changeset revision."""
+ repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) )
+ reviewed_revision_hashes = [ review.changeset_revision for review in repository.reviews ]
+ for changeset in reversed_upper_bounded_changelog( repo, changeset_revision ):
+ previous_changeset_revision = str( repo.changectx( changeset ) )
+ if previous_changeset_revision in reviewed_revision_hashes:
+ return True
+ return False
def in_all_repository_dependencies( repository_key, repository_dependency, all_repository_dependencies ):
"""Return True if { repository_key :repository_dependency } is in all_repository_dependencies."""
for key, val in all_repository_dependencies.items():
@@ -2348,6 +2670,89 @@
containers_dict[ 'tool_dependencies' ] = root_container
containers_dict[ 'missing_tool_dependencies' ] = None
return containers_dict
+def new_repository_dependency_metadata_required( trans, repository, metadata_dict ):
+ """
+ Compare the last saved metadata for each repository dependency in the repository with the new metadata in metadata_dict to determine if a new
+ repository_metadata table record is required or if the last saved metadata record can be updated instead.
+ """
+ if 'repository_dependencies' in metadata_dict:
+ repository_metadata = get_latest_repository_metadata( trans, repository.id )
+ if repository_metadata:
+ metadata = repository_metadata.metadata
+ if metadata:
+ if 'repository_dependencies' in metadata:
+ saved_repository_dependencies = metadata[ 'repository_dependencies' ][ 'repository_dependencies' ]
+ new_repository_dependencies = metadata_dict[ 'repository_dependencies' ][ 'repository_dependencies' ]
+ # The saved metadata must be a subset of the new metadata.
+ for new_repository_dependency_metadata in new_repository_dependencies:
+ if new_repository_dependency_metadata not in saved_repository_dependencies:
+ return True
+ for saved_repository_dependency_metadata in saved_repository_dependencies:
+ if saved_repository_dependency_metadata not in new_repository_dependencies:
+ return True
+ else:
+ # We have repository metadata that does not include metadata for any repository dependencies in the
+ # repository, so we can update the existing repository metadata.
+ return False
+ else:
+ # There is no saved repository metadata, so we need to create a new repository_metadata table record.
+ return True
+ # The received metadata_dict includes no metadata for repository dependencies, so a new repository_metadata table record is not needed.
+ return False
+def new_tool_metadata_required( trans, repository, metadata_dict ):
+ """
+ Compare the last saved metadata for each tool in the repository with the new metadata in metadata_dict to determine if a new repository_metadata
+ table record is required, or if the last saved metadata record can be updated instead.
+ """
+ if 'tools' in metadata_dict:
+ repository_metadata = get_latest_repository_metadata( trans, repository.id )
+ if repository_metadata:
+ metadata = repository_metadata.metadata
+ if metadata:
+ if 'tools' in metadata:
+ saved_tool_ids = []
+ # The metadata for one or more tools was successfully generated in the past
+ # for this repository, so we first compare the version string for each tool id
+ # in metadata_dict with what was previously saved to see if we need to create
+ # a new table record or if we can simply update the existing record.
+ for new_tool_metadata_dict in metadata_dict[ 'tools' ]:
+ for saved_tool_metadata_dict in metadata[ 'tools' ]:
+ if saved_tool_metadata_dict[ 'id' ] not in saved_tool_ids:
+ saved_tool_ids.append( saved_tool_metadata_dict[ 'id' ] )
+ if new_tool_metadata_dict[ 'id' ] == saved_tool_metadata_dict[ 'id' ]:
+ if new_tool_metadata_dict[ 'version' ] != saved_tool_metadata_dict[ 'version' ]:
+ return True
+ # So far, a new metadata record is not required, but we still have to check to see if
+ # any new tool ids exist in metadata_dict that are not in the saved metadata. We do
+ # this because if a new tarball was uploaded to a repository that included tools, it
+ # may have removed existing tool files if they were not included in the uploaded tarball.
+ for new_tool_metadata_dict in metadata_dict[ 'tools' ]:
+ if new_tool_metadata_dict[ 'id' ] not in saved_tool_ids:
+ return True
+ else:
+ # We have repository metadata that does not include metadata for any tools in the
+ # repository, so we can update the existing repository metadata.
+ return False
+ else:
+ # There is no saved repository metadata, so we need to create a new repository_metadata table record.
+ return True
+ # The received metadata_dict includes no metadata for tools, so a new repository_metadata table record is not needed.
+ return False
+def new_workflow_metadata_required( trans, repository, metadata_dict ):
+ """
+ Currently everything about an exported workflow except the name is hard-coded, so there's no real way to differentiate versions of
+ exported workflows. If this changes at some future time, this method should be enhanced accordingly.
+ """
+ if 'workflows' in metadata_dict:
+ repository_metadata = get_latest_repository_metadata( trans, repository.id )
+ if repository_metadata:
+ # The repository has metadata, so update the workflows value - no new record is needed.
+ return False
+ else:
+ # There is no saved repository metadata, so we need to create a new repository_metadata table record.
+ return True
+ # The received metadata_dict includes no metadata for workflows, so a new repository_metadata table record is not needed.
+ return False
def open_repository_files_folder( trans, folder_path ):
try:
files_list = get_repository_files( trans, folder_path )
@@ -2701,6 +3106,77 @@
return reversed_changelog
def reversed_upper_bounded_changelog( repo, included_upper_bounds_changeset_revision ):
return reversed_lower_upper_bounded_changelog( repo, INITIAL_CHANGELOG_HASH, included_upper_bounds_changeset_revision )
+def set_repository_metadata( trans, repository, content_alert_str='', **kwd ):
+ """
+ Set metadata using the repository's current disk files, returning specific error messages (if any) to alert the repository owner that the changeset
+ has problems.
+ """
+ message = ''
+ status = 'done'
+ encoded_id = trans.security.encode_id( repository.id )
+ repository_clone_url = generate_clone_url_for_repository_in_tool_shed( trans, repository )
+ repo_dir = repository.repo_path( trans.app )
+ repo = hg.repository( get_configured_ui(), repo_dir )
+ metadata_dict, invalid_file_tups = generate_metadata_for_changeset_revision( app=trans.app,
+ repository=repository,
+ repository_clone_url=repository_clone_url,
+ relative_install_dir=repo_dir,
+ repository_files_dir=None,
+ resetting_all_metadata_on_repository=False,
+ updating_installed_repository=False,
+ persist=False )
+ if metadata_dict:
+ downloadable = is_downloadable( metadata_dict )
+ repository_metadata = None
+ if new_repository_dependency_metadata_required( trans, repository, metadata_dict ) or \
+ new_tool_metadata_required( trans, repository, metadata_dict ) or \
+ new_workflow_metadata_required( trans, repository, metadata_dict ):
+ # Create a new repository_metadata table row.
+ repository_metadata = create_or_update_repository_metadata( trans, encoded_id, repository, repository.tip( trans.app ), metadata_dict )
+ # If this is the first record stored for this repository, see if we need to send any email alerts.
+ if len( repository.downloadable_revisions ) == 1:
+ handle_email_alerts( trans, repository, content_alert_str='', new_repo_alert=True, admin_only=False )
+ else:
+ repository_metadata = get_latest_repository_metadata( trans, repository.id )
+ if repository_metadata:
+ downloadable = is_downloadable( metadata_dict )
+ # Update the last saved repository_metadata table row.
+ repository_metadata.changeset_revision = repository.tip( trans.app )
+ repository_metadata.metadata = metadata_dict
+ repository_metadata.downloadable = downloadable
+ trans.sa_session.add( repository_metadata )
+ trans.sa_session.flush()
+ else:
+ # There are no tools in the repository, and we're setting metadata on the repository tip.
+ repository_metadata = create_or_update_repository_metadata( trans, encoded_id, repository, repository.tip( trans.app ), metadata_dict )
+ if 'tools' in metadata_dict and repository_metadata and status != 'error':
+ # Set tool versions on the new downloadable change set. The order of the list of changesets is critical, so we use the repo's changelog.
+ changeset_revisions = []
+ for changeset in repo.changelog:
+ changeset_revision = str( repo.changectx( changeset ) )
+ if get_repository_metadata_by_changeset_revision( trans, encoded_id, changeset_revision ):
+ changeset_revisions.append( changeset_revision )
+ add_tool_versions( trans, encoded_id, repository_metadata, changeset_revisions )
+ elif len( repo ) == 1 and not invalid_file_tups:
+ message = "Revision '%s' includes no tools, datatypes or exported workflows for which metadata can " % str( repository.tip( trans.app ) )
+ message += "be defined so this revision cannot be automatically installed into a local Galaxy instance."
+ status = "error"
+ if invalid_file_tups:
+ message = generate_message_for_invalid_tools( trans, invalid_file_tups, repository, metadata_dict )
+ status = 'error'
+ # Reset the tool_data_tables by loading the empty tool_data_table_conf.xml file.
+ reset_tool_data_tables( trans.app )
+ return message, status
+def set_repository_metadata_due_to_new_tip( trans, repository, content_alert_str=None, **kwd ):
+ # Set metadata on the repository tip.
+ error_message, status = set_repository_metadata( trans, repository, content_alert_str=content_alert_str, **kwd )
+ if error_message:
+ # If there is an error, display it.
+ return trans.response.send_redirect( web.url_for( controller='repository',
+ action='manage_repository',
+ id=trans.security.encode_id( repository.id ),
+ message=error_message,
+ status='error' ) )
def strip_path( fpath ):
if not fpath:
return fpath
@@ -2862,10 +3338,8 @@
# ? = not tracked
# I = ignored
# It would be nice if we could use mercurial's purge extension to remove untracked files. The problem is that
- # purging is not supported by the mercurial API. See the deprecated update_for_browsing() method in common.py.
- commands.update( get_configured_ui(),
- repo,
- rev=ctx_rev )
+ # purging is not supported by the mercurial API.
+ commands.update( get_configured_ui(), repo, rev=ctx_rev )
def url_join( *args ):
parts = []
for arg in args:
diff -r 6538175fb3e6483895aaadfdeddd09aac558fdf5 -r dd395d9b8a01255412b3e56219d11639ccce2e50 lib/galaxy/webapps/community/controllers/admin.py
--- a/lib/galaxy/webapps/community/controllers/admin.py
+++ b/lib/galaxy/webapps/community/controllers/admin.py
@@ -6,7 +6,6 @@
from galaxy.web.form_builder import SelectField
from galaxy.util import inflector
import galaxy.util.shed_util_common as suc
-import common
from repository import RepositoryGrid, CategoryGrid
from galaxy import eggs
@@ -474,7 +473,7 @@
if k.startswith( 'f-' ):
del kwd[ k ]
if 'user_id' in kwd:
- user = common.get_user( trans, kwd[ 'user_id' ] )
+ user = suc.get_user( trans, kwd[ 'user_id' ] )
kwd[ 'f-email' ] = user.email
del kwd[ 'user_id' ]
else:
@@ -489,7 +488,7 @@
if k.startswith( 'f-' ):
del kwd[ k ]
category_id = kwd.get( 'id', None )
- category = common.get_category( trans, category_id )
+ category = suc.get_category( trans, category_id )
kwd[ 'f-Category.name' ] = category.name
elif operation == "receive email alerts":
if kwd[ 'id' ]:
@@ -554,7 +553,7 @@
if not name or not description:
message = 'Enter a valid name and a description'
status = 'error'
- elif common.get_category_by_name( trans, name ):
+ elif suc.get_category_by_name( trans, name ):
message = 'A category with that name already exists'
status = 'error'
else:
@@ -641,7 +640,7 @@
action='manage_categories',
message=message,
status='error' ) )
- category = common.get_category( trans, id )
+ category = suc.get_category( trans, id )
if params.get( 'edit_category_button', False ):
new_name = util.restore_text( params.get( 'name', '' ) ).strip()
new_description = util.restore_text( params.get( 'description', '' ) ).strip()
@@ -649,7 +648,7 @@
if not new_name:
message = 'Enter a valid name'
status = 'error'
- elif category.name != new_name and common.get_category_by_name( trans, name ):
+ elif category.name != new_name and suc.get_category_by_name( trans, name ):
message = 'A category with that name already exists'
status = 'error'
else:
@@ -772,7 +771,7 @@
ids = util.listify( id )
message = "Deleted %d categories: " % len( ids )
for category_id in ids:
- category = common.get_category( trans, category_id )
+ category = suc.get_category( trans, category_id )
category.deleted = True
trans.sa_session.add( category )
trans.sa_session.flush()
@@ -800,7 +799,7 @@
purged_categories = ""
message = "Purged %d categories: " % len( ids )
for category_id in ids:
- category = common.get_category( trans, category_id )
+ category = suc.get_category( trans, category_id )
if category.deleted:
# Delete RepositoryCategoryAssociations
for rca in category.repositories:
@@ -827,7 +826,7 @@
count = 0
undeleted_categories = ""
for category_id in ids:
- category = common.get_category( trans, category_id )
+ category = suc.get_category( trans, category_id )
if category.deleted:
category.deleted = False
trans.sa_session.add( category )
diff -r 6538175fb3e6483895aaadfdeddd09aac558fdf5 -r dd395d9b8a01255412b3e56219d11639ccce2e50 lib/galaxy/webapps/community/controllers/common.py
--- a/lib/galaxy/webapps/community/controllers/common.py
+++ b/lib/galaxy/webapps/community/controllers/common.py
@@ -1,13 +1,4 @@
-import os, string, socket, logging, simplejson, binascii, tempfile
-from time import gmtime, strftime
-from datetime import *
-from galaxy.tools import *
-from galaxy.util.odict import odict
-from galaxy.util.json import from_json_string, to_json_string
-import galaxy.util.shed_util_common as suc
-from galaxy.web.base.controllers.admin import *
-from galaxy.webapps.community import model
-from galaxy.model.orm import and_
+import logging
from galaxy.model.item_attrs import UsesItemRatings
from galaxy import eggs
@@ -16,63 +7,6 @@
log = logging.getLogger( __name__ )
-new_repo_email_alert_template = """
-Repository name: ${repository_name}
-Revision: ${revision}
-Change description:
-${description}
-
-Uploaded by: ${username}
-Date content uploaded: ${display_date}
-
-${content_alert_str}
-
------------------------------------------------------------------------------
-This change alert was sent from the Galaxy tool shed hosted on the server
-"${host}"
------------------------------------------------------------------------------
-You received this alert because you registered to receive email when
-new repositories were created in the Galaxy tool shed named "${host}".
------------------------------------------------------------------------------
-"""
-
-email_alert_template = """
-Repository name: ${repository_name}
-Revision: ${revision}
-Change description:
-${description}
-
-Changed by: ${username}
-Date of change: ${display_date}
-
-${content_alert_str}
-
------------------------------------------------------------------------------
-This change alert was sent from the Galaxy tool shed hosted on the server
-"${host}"
------------------------------------------------------------------------------
-You received this alert because you registered to receive email whenever
-changes were made to the repository named "${repository_name}".
------------------------------------------------------------------------------
-"""
-
-contact_owner_template = """
-GALAXY TOOL SHED REPOSITORY MESSAGE
-------------------------
-
-The user '${username}' sent you the following message regarding your tool shed
-repository named '${repository_name}'. You can respond by sending a reply to
-the user's email address: ${email}.
------------------------------------------------------------------------------
-${message}
------------------------------------------------------------------------------
-This message was sent from the Galaxy Tool Shed instance hosted on the server
-'${host}'
-"""
-
-malicious_error = " This changeset cannot be downloaded because it potentially produces malicious behavior or contains inappropriate content."
-malicious_error_can_push = " Correct this changeset as soon as possible, it potentially produces malicious behavior or contains inappropriate content."
-
class ItemRatings( UsesItemRatings ):
"""Overrides rate_item method since we also allow for comments"""
def rate_item( self, trans, user, item, rating, comment='' ):
@@ -95,503 +29,3 @@
trans.sa_session.add( item_rating )
trans.sa_session.flush()
return item_rating
-
-def add_tool_versions( trans, id, repository_metadata, changeset_revisions ):
- # Build a dictionary of { 'tool id' : 'parent tool id' } pairs for each tool in repository_metadata.
- metadata = repository_metadata.metadata
- tool_versions_dict = {}
- for tool_dict in metadata.get( 'tools', [] ):
- # We have at least 2 changeset revisions to compare tool guids and tool ids.
- parent_id = suc.get_parent_id( trans,
- id,
- tool_dict[ 'id' ],
- tool_dict[ 'version' ],
- tool_dict[ 'guid' ],
- changeset_revisions )
- tool_versions_dict[ tool_dict[ 'guid' ] ] = parent_id
- if tool_versions_dict:
- repository_metadata.tool_versions = tool_versions_dict
- trans.sa_session.add( repository_metadata )
- trans.sa_session.flush()
-def changeset_is_malicious( trans, id, changeset_revision, **kwd ):
- """Check the malicious flag in repository metadata for a specified change set"""
- repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, id, changeset_revision )
- if repository_metadata:
- return repository_metadata.malicious
- return False
-def changeset_revision_reviewed_by_user( trans, user, repository, changeset_revision ):
- """Determine if the current changeset revision has been reviewed by the current user."""
- for review in repository.reviews:
- if review.changeset_revision == changeset_revision and review.user == user:
- return True
- return False
-def check_file_contents( trans ):
- # See if any admin users have chosen to receive email alerts when a repository is updated.
- # If so, the file contents of the update must be checked for inappropriate content.
- admin_users = trans.app.config.get( "admin_users", "" ).split( "," )
- for repository in trans.sa_session.query( trans.model.Repository ) \
- .filter( trans.model.Repository.table.c.email_alerts != None ):
- email_alerts = from_json_string( repository.email_alerts )
- for user_email in email_alerts:
- if user_email in admin_users:
- return True
- return False
-def get_category( trans, id ):
- """Get a category from the database"""
- return trans.sa_session.query( trans.model.Category ).get( trans.security.decode_id( id ) )
-def get_category_by_name( trans, name ):
- """Get a category from the database via name"""
- try:
- return trans.sa_session.query( trans.model.Category ).filter_by( name=name ).one()
- except sqlalchemy.orm.exc.NoResultFound:
- return None
-def get_categories( trans ):
- """Get all categories from the database"""
- return trans.sa_session.query( trans.model.Category ) \
- .filter( trans.model.Category.table.c.deleted==False ) \
- .order_by( trans.model.Category.table.c.name ) \
- .all()
-def get_component( trans, id ):
- """Get a component from the database"""
- return trans.sa_session.query( trans.model.Component ).get( trans.security.decode_id( id ) )
-def get_component_by_name( trans, name ):
- return trans.sa_session.query( trans.app.model.Component ) \
- .filter( trans.app.model.Component.table.c.name==name ) \
- .first()
-def get_component_review( trans, id ):
- """Get a component_review from the database"""
- return trans.sa_session.query( trans.model.ComponentReview ).get( trans.security.decode_id( id ) )
-def get_component_review_by_repository_review_id_component_id( trans, repository_review_id, component_id ):
- """Get a component_review from the database via repository_review_id and component_id"""
- return trans.sa_session.query( trans.model.ComponentReview ) \
- .filter( and_( trans.model.ComponentReview.table.c.repository_review_id == trans.security.decode_id( repository_review_id ),
- trans.model.ComponentReview.table.c.component_id == trans.security.decode_id( component_id ) ) ) \
- .first()
-def get_components( trans ):
- return trans.sa_session.query( trans.app.model.Component ) \
- .order_by( trans.app.model.Component.name ) \
- .all()
-def get_latest_repository_metadata( trans, decoded_repository_id ):
- """Get last metadata defined for a specified repository from the database"""
- return trans.sa_session.query( trans.model.RepositoryMetadata ) \
- .filter( trans.model.RepositoryMetadata.table.c.repository_id == decoded_repository_id ) \
- .order_by( trans.model.RepositoryMetadata.table.c.id.desc() ) \
- .first()
-def get_previous_repository_reviews( trans, repository, changeset_revision ):
- """Return an ordered dictionary of repository reviews up to and including the received changeset revision."""
- repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
- reviewed_revision_hashes = [ review.changeset_revision for review in repository.reviews ]
- previous_reviews_dict = odict()
- for changeset in suc.reversed_upper_bounded_changelog( repo, changeset_revision ):
- previous_changeset_revision = str( repo.changectx( changeset ) )
- if previous_changeset_revision in reviewed_revision_hashes:
- previous_rev, previous_changeset_revision_label = get_rev_label_from_changeset_revision( repo, previous_changeset_revision )
- revision_reviews = get_reviews_by_repository_id_changeset_revision( trans,
- trans.security.encode_id( repository.id ),
- previous_changeset_revision )
- previous_reviews_dict[ previous_changeset_revision ] = dict( changeset_revision_label=previous_changeset_revision_label,
- reviews=revision_reviews )
- return previous_reviews_dict
-def get_repository_by_name( trans, name ):
- """Get a repository from the database via name"""
- return trans.sa_session.query( trans.model.Repository ).filter_by( name=name ).one()
-def get_repository_metadata_revisions_for_review( repository, reviewed=True ):
- repository_metadata_revisions = []
- metadata_changeset_revision_hashes = []
- if reviewed:
- for metadata_revision in repository.metadata_revisions:
- metadata_changeset_revision_hashes.append( metadata_revision.changeset_revision )
- for review in repository.reviews:
- if review.changeset_revision in metadata_changeset_revision_hashes:
- rmcr_hashes = [ rmr.changeset_revision for rmr in repository_metadata_revisions ]
- if review.changeset_revision not in rmcr_hashes:
- repository_metadata_revisions.append( review.repository_metadata )
- else:
- for review in repository.reviews:
- if review.changeset_revision not in metadata_changeset_revision_hashes:
- metadata_changeset_revision_hashes.append( review.changeset_revision )
- for metadata_revision in repository.metadata_revisions:
- if metadata_revision.changeset_revision not in metadata_changeset_revision_hashes:
- repository_metadata_revisions.append( metadata_revision )
- return repository_metadata_revisions
-def get_rev_label_changeset_revision_from_repository_metadata( trans, repository_metadata, repository=None ):
- if repository is None:
- repository = repository_metadata.repository
- repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
- changeset_revision = repository_metadata.changeset_revision
- ctx = suc.get_changectx_for_changeset( repo, changeset_revision )
- if ctx:
- rev = '%04d' % ctx.rev()
- label = "%s:%s" % ( str( ctx.rev() ), changeset_revision )
- else:
- rev = '-1'
- label = "-1:%s" % changeset_revision
- return rev, label, changeset_revision
-def get_rev_label_from_changeset_revision( repo, changeset_revision ):
- ctx = suc.get_changectx_for_changeset( repo, changeset_revision )
- if ctx:
- rev = '%04d' % ctx.rev()
- label = "%s:%s" % ( str( ctx.rev() ), changeset_revision )
- else:
- rev = '-1'
- label = "-1:%s" % changeset_revision
- return rev, label
-def get_reversed_changelog_changesets( repo ):
- reversed_changelog = []
- for changeset in repo.changelog:
- reversed_changelog.insert( 0, changeset )
- return reversed_changelog
-def get_review( trans, id ):
- """Get a repository_review from the database via id"""
- return trans.sa_session.query( trans.model.RepositoryReview ).get( trans.security.decode_id( id ) )
-def get_review_by_repository_id_changeset_revision_user_id( trans, repository_id, changeset_revision, user_id ):
- """Get a repository_review from the database via repository id, changeset_revision and user_id"""
- return trans.sa_session.query( trans.model.RepositoryReview ) \
- .filter( and_( trans.model.RepositoryReview.repository_id == trans.security.decode_id( repository_id ),
- trans.model.RepositoryReview.changeset_revision == changeset_revision,
- trans.model.RepositoryReview.user_id == trans.security.decode_id( user_id ) ) ) \
- .first()
-def get_reviews_by_repository_id_changeset_revision( trans, repository_id, changeset_revision ):
- """Get all repository_reviews from the database via repository id and changeset_revision"""
- return trans.sa_session.query( trans.model.RepositoryReview ) \
- .filter( and_( trans.model.RepositoryReview.repository_id == trans.security.decode_id( repository_id ),
- trans.model.RepositoryReview.changeset_revision == changeset_revision ) ) \
- .all()
-def get_revision_label( trans, repository, changeset_revision ):
- """
- Return a string consisting of the human read-able
- changeset rev and the changeset revision string.
- """
- repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
- ctx = suc.get_changectx_for_changeset( repo, changeset_revision )
- if ctx:
- return "%s:%s" % ( str( ctx.rev() ), changeset_revision )
- else:
- return "-1:%s" % changeset_revision
-def get_user( trans, id ):
- """Get a user from the database by id"""
- return trans.sa_session.query( trans.model.User ).get( trans.security.decode_id( id ) )
-def handle_email_alerts( trans, repository, content_alert_str='', new_repo_alert=False, admin_only=False ):
- # There are 2 complementary features that enable a tool shed user to receive email notification:
- # 1. Within User Preferences, they can elect to receive email when the first (or first valid)
- # change set is produced for a new repository.
- # 2. When viewing or managing a repository, they can check the box labeled "Receive email alerts"
- # which caused them to receive email alerts when updates to the repository occur. This same feature
- # is available on a per-repository basis on the repository grid within the tool shed.
- #
- # There are currently 4 scenarios for sending email notification when a change is made to a repository:
- # 1. An admin user elects to receive email when the first change set is produced for a new repository
- # from User Preferences. The change set does not have to include any valid content. This allows for
- # the capture of inappropriate content being uploaded to new repositories.
- # 2. A regular user elects to receive email when the first valid change set is produced for a new repository
- # from User Preferences. This differs from 1 above in that the user will not receive email until a
- # change set tha tincludes valid content is produced.
- # 3. An admin user checks the "Receive email alerts" check box on the manage repository page. Since the
- # user is an admin user, the email will include information about both HTML and image content that was
- # included in the change set.
- # 4. A regular user checks the "Receive email alerts" check box on the manage repository page. Since the
- # user is not an admin user, the email will not include any information about both HTML and image content
- # that was included in the change set.
- repo_dir = repository.repo_path( trans.app )
- repo = hg.repository( suc.get_configured_ui(), repo_dir )
- smtp_server = trans.app.config.smtp_server
- if smtp_server and ( new_repo_alert or repository.email_alerts ):
- # Send email alert to users that want them.
- if trans.app.config.email_from is not None:
- email_from = trans.app.config.email_from
- elif trans.request.host.split( ':' )[0] == 'localhost':
- email_from = 'galaxy-no-reply@' + socket.getfqdn()
- else:
- email_from = 'galaxy-no-reply@' + trans.request.host.split( ':' )[0]
- tip_changeset = repo.changelog.tip()
- ctx = repo.changectx( tip_changeset )
- t, tz = ctx.date()
- date = datetime( *gmtime( float( t ) - tz )[:6] )
- display_date = date.strftime( "%Y-%m-%d" )
- try:
- username = ctx.user().split()[0]
- except:
- username = ctx.user()
- # We'll use 2 template bodies because we only want to send content
- # alerts to tool shed admin users.
- if new_repo_alert:
- template = new_repo_email_alert_template
- else:
- template = email_alert_template
- admin_body = string.Template( template ).safe_substitute( host=trans.request.host,
- repository_name=repository.name,
- revision='%s:%s' %( str( ctx.rev() ), ctx ),
- display_date=display_date,
- description=ctx.description(),
- username=username,
- content_alert_str=content_alert_str )
- body = string.Template( template ).safe_substitute( host=trans.request.host,
- repository_name=repository.name,
- revision='%s:%s' %( str( ctx.rev() ), ctx ),
- display_date=display_date,
- description=ctx.description(),
- username=username,
- content_alert_str='' )
- admin_users = trans.app.config.get( "admin_users", "" ).split( "," )
- frm = email_from
- if new_repo_alert:
- subject = "Galaxy tool shed alert for new repository named %s" % str( repository.name )
- subject = subject[ :80 ]
- email_alerts = []
- for user in trans.sa_session.query( trans.model.User ) \
- .filter( and_( trans.model.User.table.c.deleted == False,
- trans.model.User.table.c.new_repo_alert == True ) ):
- if admin_only:
- if user.email in admin_users:
- email_alerts.append( user.email )
- else:
- email_alerts.append( user.email )
- else:
- subject = "Galaxy tool shed update alert for repository named %s" % str( repository.name )
- email_alerts = from_json_string( repository.email_alerts )
- for email in email_alerts:
- to = email.strip()
- # Send it
- try:
- if to in admin_users:
- util.send_mail( frm, to, subject, admin_body, trans.app.config )
- else:
- util.send_mail( frm, to, subject, body, trans.app.config )
- except Exception, e:
- log.exception( "An error occurred sending a tool shed repository update alert by email." )
-def has_previous_repository_reviews( trans, repository, changeset_revision ):
- """Determine if a repository has a changeset revision review prior to the received changeset revision."""
- repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
- reviewed_revision_hashes = [ review.changeset_revision for review in repository.reviews ]
- for changeset in suc.reversed_upper_bounded_changelog( repo, changeset_revision ):
- previous_changeset_revision = str( repo.changectx( changeset ) )
- if previous_changeset_revision in reviewed_revision_hashes:
- return True
- return False
-def new_repository_dependency_metadata_required( trans, repository, metadata_dict ):
- """
- Compare the last saved metadata for each repository dependency in the repository with the new
- metadata in metadata_dict to determine if a new repository_metadata table record is required,
- or if the last saved metadata record can be updated instead.
- """
- if 'repository_dependencies' in metadata_dict:
- repository_metadata = get_latest_repository_metadata( trans, repository.id )
- if repository_metadata:
- metadata = repository_metadata.metadata
- if metadata:
- if 'repository_dependencies' in metadata:
- saved_repository_dependencies = metadata[ 'repository_dependencies' ][ 'repository_dependencies' ]
- new_repository_dependencies = metadata_dict[ 'repository_dependencies' ][ 'repository_dependencies' ]
- # The saved metadata must be a subset of the new metadata.
- for new_repository_dependency_metadata in new_repository_dependencies:
- if new_repository_dependency_metadata not in saved_repository_dependencies:
- return True
- for saved_repository_dependency_metadata in saved_repository_dependencies:
- if saved_repository_dependency_metadata not in new_repository_dependencies:
- return True
- else:
- # We have repository metadata that does not include metadata for any repository dependencies in the
- # repository, so we can update the existing repository metadata.
- return False
- else:
- # There is no saved repository metadata, so we need to create a new repository_metadata table record.
- return True
- # The received metadata_dict includes no metadata for repository dependencies, so a new repository_metadata table record is not needed.
- return False
-def new_tool_metadata_required( trans, repository, metadata_dict ):
- """
- Compare the last saved metadata for each tool in the repository with the new metadata in metadata_dict to determine if a new repository_metadata
- table record is required, or if the last saved metadata record can be updated instead.
- """
- if 'tools' in metadata_dict:
- repository_metadata = get_latest_repository_metadata( trans, repository.id )
- if repository_metadata:
- metadata = repository_metadata.metadata
- if metadata:
- if 'tools' in metadata:
- saved_tool_ids = []
- # The metadata for one or more tools was successfully generated in the past
- # for this repository, so we first compare the version string for each tool id
- # in metadata_dict with what was previously saved to see if we need to create
- # a new table record or if we can simply update the existing record.
- for new_tool_metadata_dict in metadata_dict[ 'tools' ]:
- for saved_tool_metadata_dict in metadata[ 'tools' ]:
- if saved_tool_metadata_dict[ 'id' ] not in saved_tool_ids:
- saved_tool_ids.append( saved_tool_metadata_dict[ 'id' ] )
- if new_tool_metadata_dict[ 'id' ] == saved_tool_metadata_dict[ 'id' ]:
- if new_tool_metadata_dict[ 'version' ] != saved_tool_metadata_dict[ 'version' ]:
- return True
- # So far, a new metadata record is not required, but we still have to check to see if
- # any new tool ids exist in metadata_dict that are not in the saved metadata. We do
- # this because if a new tarball was uploaded to a repository that included tools, it
- # may have removed existing tool files if they were not included in the uploaded tarball.
- for new_tool_metadata_dict in metadata_dict[ 'tools' ]:
- if new_tool_metadata_dict[ 'id' ] not in saved_tool_ids:
- return True
- else:
- # We have repository metadata that does not include metadata for any tools in the
- # repository, so we can update the existing repository metadata.
- return False
- else:
- # There is no saved repository metadata, so we need to create a new repository_metadata table record.
- return True
- # The received metadata_dict includes no metadata for tools, so a new repository_metadata table record is not needed.
- return False
-def new_workflow_metadata_required( trans, repository, metadata_dict ):
- """
- Currently everything about an exported workflow except the name is hard-coded, so there's no real way to differentiate versions of
- exported workflows. If this changes at some future time, this method should be enhanced accordingly.
- """
- if 'workflows' in metadata_dict:
- repository_metadata = get_latest_repository_metadata( trans, repository.id )
- if repository_metadata:
- # The repository has metadata, so update the workflows value - no new record is needed.
- return False
- else:
- # There is no saved repository metadata, so we need to create a new repository_metadata table record.
- return True
- # The received metadata_dict includes no metadata for workflows, so a new repository_metadata table record is not needed.
- return False
-def set_repository_metadata( trans, repository, content_alert_str='', **kwd ):
- """
- Set metadata using the repository's current disk files, returning specific error messages (if any) to alert the repository owner that the changeset
- has problems.
- """
- message = ''
- status = 'done'
- encoded_id = trans.security.encode_id( repository.id )
- repository_clone_url = suc.generate_clone_url_for_repository_in_tool_shed( trans, repository )
- repo_dir = repository.repo_path( trans.app )
- repo = hg.repository( suc.get_configured_ui(), repo_dir )
- metadata_dict, invalid_file_tups = suc.generate_metadata_for_changeset_revision( app=trans.app,
- repository=repository,
- repository_clone_url=repository_clone_url,
- relative_install_dir=repo_dir,
- repository_files_dir=None,
- resetting_all_metadata_on_repository=False,
- updating_installed_repository=False,
- persist=False )
- if metadata_dict:
- downloadable = suc.is_downloadable( metadata_dict )
- repository_metadata = None
- if new_repository_dependency_metadata_required( trans, repository, metadata_dict ) or \
- new_tool_metadata_required( trans, repository, metadata_dict ) or \
- new_workflow_metadata_required( trans, repository, metadata_dict ):
- # Create a new repository_metadata table row.
- repository_metadata = suc.create_or_update_repository_metadata( trans,
- encoded_id,
- repository,
- repository.tip( trans.app ),
- metadata_dict )
- # If this is the first record stored for this repository, see if we need to send any email alerts.
- if len( repository.downloadable_revisions ) == 1:
- handle_email_alerts( trans, repository, content_alert_str='', new_repo_alert=True, admin_only=False )
- else:
- repository_metadata = get_latest_repository_metadata( trans, repository.id )
- if repository_metadata:
- downloadable = suc.is_downloadable( metadata_dict )
- # Update the last saved repository_metadata table row.
- repository_metadata.changeset_revision = repository.tip( trans.app )
- repository_metadata.metadata = metadata_dict
- repository_metadata.downloadable = downloadable
- trans.sa_session.add( repository_metadata )
- trans.sa_session.flush()
- else:
- # There are no tools in the repository, and we're setting metadata on the repository tip.
- repository_metadata = suc.create_or_update_repository_metadata( trans,
- encoded_id,
- repository,
- repository.tip( trans.app ),
- metadata_dict )
- if 'tools' in metadata_dict and repository_metadata and status != 'error':
- # Set tool versions on the new downloadable change set. The order of the list of changesets is critical, so we use the repo's changelog.
- changeset_revisions = []
- for changeset in repo.changelog:
- changeset_revision = str( repo.changectx( changeset ) )
- if suc.get_repository_metadata_by_changeset_revision( trans, encoded_id, changeset_revision ):
- changeset_revisions.append( changeset_revision )
- add_tool_versions( trans, encoded_id, repository_metadata, changeset_revisions )
- elif len( repo ) == 1 and not invalid_file_tups:
- message = "Revision '%s' includes no tools, datatypes or exported workflows for which metadata can " % str( repository.tip( trans.app ) )
- message += "be defined so this revision cannot be automatically installed into a local Galaxy instance."
- status = "error"
- if invalid_file_tups:
- message = suc.generate_message_for_invalid_tools( trans, invalid_file_tups, repository, metadata_dict )
- status = 'error'
- # Reset the tool_data_tables by loading the empty tool_data_table_conf.xml file.
- suc.reset_tool_data_tables( trans.app )
- return message, status
-def set_repository_metadata_due_to_new_tip( trans, repository, content_alert_str=None, **kwd ):
- # Set metadata on the repository tip.
- error_message, status = set_repository_metadata( trans, repository, content_alert_str=content_alert_str, **kwd )
- if error_message:
- # If there is an error, display it.
- return trans.response.send_redirect( web.url_for( controller='repository',
- action='manage_repository',
- id=trans.security.encode_id( repository.id ),
- message=error_message,
- status='error' ) )
-def update_for_browsing( trans, repository, current_working_dir, commit_message='' ):
- # This method id deprecated, but we'll keep it around for a while in case we need it. The problem is that hg purge
- # is not supported by the mercurial API.
- # Make a copy of a repository's files for browsing, remove from disk all files that are not tracked, and commit all
- # added, modified or removed files that have not yet been committed.
- repo_dir = repository.repo_path( trans.app )
- repo = hg.repository( suc.get_configured_ui(), repo_dir )
- # The following will delete the disk copy of only the files in the repository.
- #os.system( 'hg update -r null > /dev/null 2>&1' )
- files_to_remove_from_disk = []
- files_to_commit = []
- # We may have files on disk in the repo directory that aren't being tracked, so they must be removed.
- # The codes used to show the status of files are as follows.
- # M = modified
- # A = added
- # R = removed
- # C = clean
- # ! = deleted, but still tracked
- # ? = not tracked
- # I = ignored
- # We'll use mercurial's purge extension to remove untracked file. Using this extension requires the
- # following entry in the repository's hgrc file which was not required for some time, so we'll add it
- # if it's missing.
- # [extensions]
- # hgext.purge=
- lines = repo.opener( 'hgrc', 'rb' ).readlines()
- if not '[extensions]\n' in lines:
- # No extensions have been added at all, so just append to the file.
- fp = repo.opener( 'hgrc', 'a' )
- fp.write( '[extensions]\n' )
- fp.write( 'hgext.purge=\n' )
- fp.close()
- elif not 'hgext.purge=\n' in lines:
- # The file includes and [extensions] section, but we need to add the
- # purge extension.
- fp = repo.opener( 'hgrc', 'wb' )
- for line in lines:
- if line.startswith( '[extensions]' ):
- fp.write( line )
- fp.write( 'hgext.purge=\n' )
- else:
- fp.write( line )
- fp.close()
- cmd = 'hg purge'
- os.chdir( repo_dir )
- proc = subprocess.Popen( args=cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
- return_code = proc.wait()
- os.chdir( current_working_dir )
- if return_code != 0:
- output = proc.stdout.read( 32768 )
- log.debug( 'hg purge failed in repository directory %s, reason: %s' % ( repo_dir, output ) )
- if files_to_commit:
- if not commit_message:
- commit_message = 'Committed changes to: %s' % ', '.join( files_to_commit )
- repo.dirstate.write()
- repo.commit( user=trans.user.username, text=commit_message )
- cmd = 'hg update > /dev/null 2>&1'
- os.chdir( repo_dir )
- proc = subprocess.Popen( args=cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT )
- return_code = proc.wait()
- os.chdir( current_working_dir )
- if return_code != 0:
- output = proc.stdout.read( 32768 )
- log.debug( 'hg update > /dev/null 2>&1 failed in repository directory %s, reason: %s' % ( repo_dir, output ) )
diff -r 6538175fb3e6483895aaadfdeddd09aac558fdf5 -r dd395d9b8a01255412b3e56219d11639ccce2e50 lib/galaxy/webapps/community/controllers/hg.py
--- a/lib/galaxy/webapps/community/controllers/hg.py
+++ b/lib/galaxy/webapps/community/controllers/hg.py
@@ -1,7 +1,6 @@
import os, logging
from galaxy.web.base.controller import *
-from galaxy.util.shed_util_common import get_repository_by_name_and_owner
-from galaxy.webapps.community.controllers.common import set_repository_metadata
+from galaxy.util.shed_util_common import get_repository_by_name_and_owner, set_repository_metadata
from galaxy import eggs
eggs.require('mercurial')
diff -r 6538175fb3e6483895aaadfdeddd09aac558fdf5 -r dd395d9b8a01255412b3e56219d11639ccce2e50 lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -25,6 +25,8 @@
log = logging.getLogger( __name__ )
VALID_REPOSITORYNAME_RE = re.compile( "^[a-z0-9\_]+$" )
+malicious_error = " This changeset cannot be downloaded because it potentially produces malicious behavior or contains inappropriate content."
+malicious_error_can_push = " Correct this changeset as soon as possible, it potentially produces malicious behavior or contains inappropriate content."
class CategoryGrid( grids.Grid ):
class NameColumn( grids.TextColumn ):
@@ -540,7 +542,7 @@
# The value of 'id' has been set to the search string, which is a repository name. We'll try to get the desired encoded repository
# id to pass on.
try:
- repository = common.get_repository_by_name( trans, kwd[ 'id' ] )
+ repository = suc.get_repository_by_name( trans, kwd[ 'id' ] )
kwd[ 'id' ] = trans.security.encode_id( repository.id )
except:
pass
@@ -615,7 +617,7 @@
if k.startswith( 'f-' ):
del kwd[ k ]
if 'user_id' in kwd:
- user = common.get_user( trans, kwd[ 'user_id' ] )
+ user = suc.get_user( trans, kwd[ 'user_id' ] )
kwd[ 'f-email' ] = user.email
del kwd[ 'user_id' ]
else:
@@ -655,7 +657,7 @@
if k.startswith( 'f-' ):
del kwd[ k ]
category_id = kwd.get( 'id', None )
- category = common.get_category( trans, category_id )
+ category = suc.get_category( trans, category_id )
kwd[ 'f-Category.name' ] = category.name
elif operation == "receive email alerts":
if trans.user:
@@ -696,7 +698,7 @@
repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
# Update repository files for browsing.
suc.update_repository( repo )
- is_malicious = common.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
metadata = self.get_metadata( trans, id, repository.tip( trans.app ) )
return trans.fill_template( '/webapps/community/repository/browse_repository.mako',
repository=repository,
@@ -722,7 +724,7 @@
# We'll try to get the desired encoded repository id to pass on.
try:
name = kwd[ 'id' ]
- repository = common.get_repository_by_name( trans, name )
+ repository = suc.get_repository_by_name( trans, name )
kwd[ 'id' ] = trans.security.encode_id( repository.id )
except:
pass
@@ -745,7 +747,7 @@
if 'f-Category.name' in kwd:
# The user browsed to a category and then entered a search string, so get the category associated with it's value.
category_name = kwd[ 'f-Category.name' ]
- category = common.get_category_by_name( trans, category_name )
+ category = suc.get_category_by_name( trans, category_name )
# Set the id value in kwd since it is required by the ValidRepositoryGrid.build_initial_query method.
kwd[ 'id' ] = trans.security.encode_id( category.id )
if galaxy_url:
@@ -755,7 +757,7 @@
if operation == "preview_tools_in_changeset":
repository_id = kwd.get( 'id', None )
repository = suc.get_repository_in_tool_shed( trans, repository_id )
- repository_metadata = common.get_latest_repository_metadata( trans, repository.id )
+ repository_metadata = suc.get_latest_repository_metadata( trans, repository.id )
latest_installable_changeset_revision = repository_metadata.changeset_revision
return trans.response.send_redirect( web.url_for( controller='repository',
action='preview_tools_in_changeset',
@@ -767,7 +769,7 @@
if k.startswith( 'f-' ):
del kwd[ k ]
category_id = kwd.get( 'id', None )
- category = common.get_category( trans, category_id )
+ category = suc.get_category( trans, category_id )
kwd[ 'f-Category.name' ] = category.name
# The changeset_revision_select_field in the ValidRepositoryGrid performs a refresh_on_change which sends in request parameters like
# changeset_revison_1, changeset_revision_2, etc. One of the many select fields on the grid performed the refresh_on_change, so we loop
@@ -927,7 +929,7 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- categories = common.get_categories( trans )
+ categories = suc.get_categories( trans )
if not categories:
message = 'No categories have been configured in this instance of the Galaxy Tool Shed. ' + \
'An administrator needs to create some via the Administrator control panel before creating repositories.',
@@ -1028,7 +1030,7 @@
if message:
status = 'error'
tool_state = self.__new_state( trans )
- is_malicious = common.changeset_is_malicious( trans, repository_id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, repository_id, repository.tip( trans.app ) )
metadata = self.get_metadata( trans, repository_id, changeset_revision )
try:
return trans.fill_template( "/webapps/community/repository/tool_form.mako",
@@ -1685,7 +1687,7 @@
status = params.get( 'status', 'error' )
repository, tool, error_message = suc.load_tool_from_changeset_revision( trans, repository_id, changeset_revision, tool_config )
tool_state = self.__new_state( trans )
- is_malicious = common.changeset_is_malicious( trans, repository_id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, repository_id, repository.tip( trans.app ) )
invalid_file_tups = []
if tool:
invalid_file_tups = suc.check_tool_input_params( trans.app,
@@ -1883,7 +1885,7 @@
selected_value=changeset_revision,
add_id_to_name=False,
downloadable=False )
- revision_label = common.get_revision_label( trans, repository, repository.tip( trans.app ) )
+ revision_label = suc.get_revision_label( trans, repository, repository.tip( trans.app ) )
repository_metadata = None
repository_metadata_id = None
metadata = None
@@ -1892,7 +1894,7 @@
if changeset_revision != suc.INITIAL_CHANGELOG_HASH:
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, id, changeset_revision )
if repository_metadata:
- revision_label = common.get_revision_label( trans, repository, changeset_revision )
+ revision_label = suc.get_revision_label( trans, repository, changeset_revision )
repository_metadata_id = trans.security.encode_id( repository_metadata.id )
metadata = repository_metadata.metadata
is_malicious = repository_metadata.malicious
@@ -1902,7 +1904,7 @@
if previous_changeset_revision != suc.INITIAL_CHANGELOG_HASH:
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, id, previous_changeset_revision )
if repository_metadata:
- revision_label = common.get_revision_label( trans, repository, previous_changeset_revision )
+ revision_label = suc.get_revision_label( trans, repository, previous_changeset_revision )
repository_metadata_id = trans.security.encode_id( repository_metadata.id )
metadata = repository_metadata.metadata
is_malicious = repository_metadata.malicious
@@ -1917,20 +1919,20 @@
handled_key_rd_dicts=None )
if is_malicious:
if trans.app.security_agent.can_push( trans.app, trans.user, repository ):
- message += common.malicious_error_can_push
+ message += malicious_error_can_push
else:
- message += common.malicious_error
+ message += malicious_error
status = 'error'
malicious_check_box = CheckboxField( 'malicious', checked=is_malicious )
- categories = common.get_categories( trans )
+ categories = suc.get_categories( trans )
selected_categories = [ rca.category_id for rca in repository.categories ]
# Determine if the current changeset revision has been reviewed by the current user.
- reviewed_by_user = common.changeset_revision_reviewed_by_user( trans, trans.user, repository, changeset_revision )
+ reviewed_by_user = suc.changeset_revision_reviewed_by_user( trans, trans.user, repository, changeset_revision )
if reviewed_by_user:
- review = common.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
- repository_id=id,
- changeset_revision=changeset_revision,
- user_id=trans.security.encode_id( trans.user.id ) )
+ review = suc.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
+ repository_id=id,
+ changeset_revision=changeset_revision,
+ user_id=trans.security.encode_id( trans.user.id ) )
review_id = trans.security.encode_id( review.id )
else:
review_id = None
@@ -2031,7 +2033,7 @@
repository_metadata_id = None
metadata = None
repository_dependencies = None
- revision_label = common.get_revision_label( trans, repository, changeset_revision )
+ revision_label = suc.get_revision_label( trans, repository, changeset_revision )
changeset_revision_select_field = build_changeset_revision_select_field( trans,
repository,
selected_value=changeset_revision,
@@ -2103,7 +2105,7 @@
avg_rating, num_ratings = self.get_ave_item_rating_data( trans.sa_session, repository, webapp_model=trans.model )
display_reviews = util.string_as_bool( params.get( 'display_reviews', False ) )
rra = self.get_user_item_rating( trans.sa_session, trans.user, repository, webapp_model=trans.model )
- is_malicious = common.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
metadata = self.get_metadata( trans, id, repository.tip( trans.app ) )
return trans.fill_template( '/webapps/community/repository/rate_repository.mako',
repository=repository,
@@ -2263,7 +2265,7 @@
if not commit_message:
commit_message = 'Deleted selected files'
commands.commit( repo.ui, repo, repo_dir, user=trans.user.username, message=commit_message )
- common.handle_email_alerts( trans, repository )
+ suc.handle_email_alerts( trans, repository )
# Update the repository files for browsing.
suc.update_repository( repo )
# Get the new repository tip.
@@ -2275,11 +2277,11 @@
else:
message += 'The selected files were deleted from the repository. '
kwd[ 'message' ] = message
- common.set_repository_metadata_due_to_new_tip( trans, repository, **kwd )
+ suc.set_repository_metadata_due_to_new_tip( trans, repository, **kwd )
else:
message = "Select at least 1 file to delete from the repository before clicking <b>Delete selected files</b>."
status = "error"
- is_malicious = common.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
return trans.fill_template( '/webapps/community/repository/browse_repository.mako',
repo=repo,
repository=repository,
@@ -2302,7 +2304,7 @@
# Get the name of the server hosting the tool shed instance.
host = trans.request.host
# Build the email message
- body = string.Template( common.contact_owner_template ) \
+ body = string.Template( suc.contact_owner_template ) \
.safe_substitute( username=trans.user.username,
repository_name=repository.name,
email=trans.user.email,
@@ -2434,7 +2436,7 @@
'has_metadata' : has_metadata }
# Make sure we'll view latest changeset first.
changesets.insert( 0, change_dict )
- is_malicious = common.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
metadata = self.get_metadata( trans, id, repository.tip( trans.app ) )
return trans.fill_template( '/webapps/community/repository/view_changelog.mako',
repository=repository,
@@ -2465,7 +2467,7 @@
diffs = []
for diff in patch.diff( repo, node1=ctx_parent.node(), node2=ctx.node() ):
diffs.append( suc.to_safe_string( diff, to_html=True ) )
- is_malicious = common.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
metadata = self.get_metadata( trans, id, ctx_str )
return trans.fill_template( '/webapps/community/repository/view_changeset.mako',
repository=repository,
@@ -2535,7 +2537,7 @@
selected_value=changeset_revision,
add_id_to_name=False,
downloadable=False )
- revision_label = common.get_revision_label( trans, repository, changeset_revision )
+ revision_label = suc.get_revision_label( trans, repository, changeset_revision )
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, id, changeset_revision )
if repository_metadata:
repository_metadata_id = trans.security.encode_id( repository_metadata.id )
@@ -2551,20 +2553,20 @@
else:
repository_metadata_id = None
metadata = None
- is_malicious = common.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, id, repository.tip( trans.app ) )
if is_malicious:
if trans.app.security_agent.can_push( trans.app, trans.user, repository ):
- message += common.malicious_error_can_push
+ message += malicious_error_can_push
else:
- message += common.malicious_error
+ message += malicious_error
status = 'error'
# Determine if the current changeset revision has been reviewed by the current user.
- reviewed_by_user = common.changeset_revision_reviewed_by_user( trans, trans.user, repository, changeset_revision )
+ reviewed_by_user = suc.changeset_revision_reviewed_by_user( trans, trans.user, repository, changeset_revision )
if reviewed_by_user:
- review = common.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
- repository_id=id,
- changeset_revision=changeset_revision,
- user_id=trans.security.encode_id( trans.user.id ) )
+ review = suc.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
+ repository_id=id,
+ changeset_revision=changeset_revision,
+ user_id=trans.security.encode_id( trans.user.id ) )
review_id = trans.security.encode_id( review.id )
else:
review_id = None
@@ -2601,7 +2603,7 @@
tool = None
guid = None
original_tool_data_path = trans.app.config.tool_data_path
- revision_label = common.get_revision_label( trans, repository, changeset_revision )
+ revision_label = suc.get_revision_label( trans, repository, changeset_revision )
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision )
if repository_metadata:
metadata = repository_metadata.metadata
@@ -2636,19 +2638,19 @@
tool_lineage = self.get_versions_of_tool( trans, repository, repository_metadata, guid )
else:
metadata = None
- is_malicious = common.changeset_is_malicious( trans, repository_id, repository.tip( trans.app ) )
+ is_malicious = suc.changeset_is_malicious( trans, repository_id, repository.tip( trans.app ) )
changeset_revision_select_field = build_changeset_revision_select_field( trans,
repository,
selected_value=changeset_revision,
add_id_to_name=False,
downloadable=False )
trans.app.config.tool_data_path = original_tool_data_path
- reviewed_by_user = common.changeset_revision_reviewed_by_user( trans, trans.user, repository, changeset_revision )
+ reviewed_by_user = suc.changeset_revision_reviewed_by_user( trans, trans.user, repository, changeset_revision )
if reviewed_by_user:
- review = common.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
- repository_id=repository_id,
- changeset_revision=changeset_revision,
- user_id=trans.security.encode_id( trans.user.id ) )
+ review = suc.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
+ repository_id=repository_id,
+ changeset_revision=changeset_revision,
+ user_id=trans.security.encode_id( trans.user.id ) )
review_id = trans.security.encode_id( review.id )
else:
review_id = None
@@ -2719,7 +2721,7 @@
# Restrict the options to all revisions that have associated metadata.
repository_metadata_revisions = repository.metadata_revisions
for repository_metadata in repository_metadata_revisions:
- rev, label, changeset_revision = common.get_rev_label_changeset_revision_from_repository_metadata( trans, repository_metadata, repository=repository )
+ rev, label, changeset_revision = suc.get_rev_label_changeset_revision_from_repository_metadata( trans, repository_metadata, repository=repository )
changeset_tups.append( ( rev, label, changeset_revision ) )
refresh_on_change_values.append( changeset_revision )
# Sort options by the revision label. Even though the downloadable_revisions query sorts by update_time,
diff -r 6538175fb3e6483895aaadfdeddd09aac558fdf5 -r dd395d9b8a01255412b3e56219d11639ccce2e50 lib/galaxy/webapps/community/controllers/repository_review.py
--- a/lib/galaxy/webapps/community/controllers/repository_review.py
+++ b/lib/galaxy/webapps/community/controllers/repository_review.py
@@ -59,7 +59,7 @@
repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
for review in repository.reviews:
changeset_revision = review.changeset_revision
- rev, label = common.get_rev_label_from_changeset_revision( repo, changeset_revision )
+ rev, label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision )
rval += '<a href="manage_repository_reviews_of_revision'
rval += '?id=%s&changeset_revision=%s">%s</a><br/>' % ( trans.security.encode_id( repository.id ), changeset_revision, label )
return rval
@@ -67,13 +67,13 @@
class WithoutReviewsRevisionColumn( grids.GridColumn ):
def get_value( self, trans, grid, repository ):
# Restrict the options to revisions that have not yet been reviewed.
- repository_metadata_revisions = common.get_repository_metadata_revisions_for_review( repository, reviewed=False )
+ repository_metadata_revisions = suc.get_repository_metadata_revisions_for_review( repository, reviewed=False )
if repository_metadata_revisions:
rval = ''
for repository_metadata in repository_metadata_revisions:
- rev, label, changeset_revision = common.get_rev_label_changeset_revision_from_repository_metadata( trans,
- repository_metadata,
- repository=repository )
+ rev, label, changeset_revision = suc.get_rev_label_changeset_revision_from_repository_metadata( trans,
+ repository_metadata,
+ repository=repository )
rval += '<a href="manage_repository_reviews_of_revision'
rval += '?id=%s&changeset_revision=%s">%s</a><br/>' % ( trans.security.encode_id( repository.id ), changeset_revision, label )
return rval
@@ -177,7 +177,7 @@
rval += 'edit_review'
else:
rval +='browse_review'
- rval += '?id=%s">%s</a>' % ( encoded_review_id, common.get_revision_label( trans, review.repository, review.changeset_revision ) )
+ rval += '?id=%s">%s</a>' % ( encoded_review_id, suc.get_revision_label( trans, review.repository, review.changeset_revision ) )
return rval
class RatingColumn( grids.TextColumn ):
def get_value( self, trans, grid, review ):
@@ -277,7 +277,7 @@
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
encoded_review_id = kwd[ 'id' ]
- review = common.get_review( trans, encoded_review_id )
+ review = suc.get_review( trans, encoded_review_id )
if kwd.get( 'approve_repository_review_button', False ):
approved_select_field_name = '%s%sapproved' % ( encoded_review_id, STRSEP )
approved_select_field_value = str( kwd[ approved_select_field_name ] )
@@ -309,10 +309,10 @@
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
- review = common.get_review( trans, kwd[ 'id' ] )
+ review = suc.get_review( trans, kwd[ 'id' ] )
repository = review.repository
repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
- rev, changeset_revision_label = common.get_rev_label_from_changeset_revision( repo, review.changeset_revision )
+ rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, review.changeset_revision )
return trans.fill_template( '/webapps/community/repository_review/browse_review.mako',
repository=repository,
changeset_revision_label=changeset_revision_label,
@@ -345,7 +345,7 @@
if not name or not description:
message = 'Enter a valid name and a description'
status = 'error'
- elif common.get_component_by_name( trans, name ):
+ elif suc.get_component_by_name( trans, name ):
message = 'A component with that name already exists'
status = 'error'
else:
@@ -378,15 +378,15 @@
if changeset_revision:
# Make sure there is not already a review of the revision by the user.
repository = suc.get_repository_in_tool_shed( trans, repository_id )
- if common.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
- repository_id=repository_id,
- changeset_revision=changeset_revision,
- user_id=trans.security.encode_id( trans.user.id ) ):
+ if suc.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
+ repository_id=repository_id,
+ changeset_revision=changeset_revision,
+ user_id=trans.security.encode_id( trans.user.id ) ):
message = "You have already created a review for revision <b>%s</b> of repository <b>%s</b>." % ( changeset_revision, repository.name )
status = "error"
else:
# See if there are any reviews for previous changeset revisions that the user can copy.
- if not create_without_copying and not previous_review_id and common.has_previous_repository_reviews( trans, repository, changeset_revision ):
+ if not create_without_copying and not previous_review_id and suc.has_previous_repository_reviews( trans, repository, changeset_revision ):
return trans.response.send_redirect( web.url_for( controller='repository_review',
action='select_previous_review',
**kwd ) )
@@ -404,7 +404,7 @@
trans.sa_session.add( review )
trans.sa_session.flush()
if previous_review_id:
- review_to_copy = common.get_review( trans, previous_review_id )
+ review_to_copy = suc.get_review( trans, previous_review_id )
self.copy_review( trans, review_to_copy, review )
review_id = trans.security.encode_id( review.id )
message = "Begin your review of revision <b>%s</b> of repository <b>%s</b>." \
@@ -440,7 +440,7 @@
action='manage_categories',
message=message,
status='error' ) )
- component = common.get_component( trans, id )
+ component = suc.get_component( trans, id )
if params.get( 'edit_component_button', False ):
new_description = util.restore_text( params.get( 'description', '' ) ).strip()
if component.description != new_description:
@@ -465,9 +465,9 @@
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
review_id = kwd.get( 'id', None )
- review = common.get_review( trans, review_id )
+ review = suc.get_review( trans, review_id )
components_dict = odict()
- for component in common.get_components( trans ):
+ for component in suc.get_components( trans ):
components_dict[ component.name ] = dict( component=component, component_review=None )
repository = review.repository
repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
@@ -517,8 +517,8 @@
approved = str( v )
elif component_review_attr == 'rating':
rating = int( str( v ) )
- component = common.get_component( trans, component_id )
- component_review = common.get_component_review_by_repository_review_id_component_id( trans, review_id, component_id )
+ component = suc.get_component( trans, component_id )
+ component_review = suc.get_component_review_by_repository_review_id_component_id( trans, review_id, component_id )
if component_review:
# See if the existing component review should be updated.
if component_review.comment != comment or \
@@ -572,7 +572,7 @@
name='revision_approved',
selected_value=selected_value,
for_component=False )
- rev, changeset_revision_label = common.get_rev_label_from_changeset_revision( repo, review.changeset_revision )
+ rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, review.changeset_revision )
return trans.fill_template( '/webapps/community/repository_review/edit_review.mako',
repository=repository,
review=review,
@@ -659,14 +659,14 @@
metadata_revision_hashes = [ metadata_revision.changeset_revision for metadata_revision in repository.metadata_revisions ]
reviewed_revision_hashes = [ review.changeset_revision for review in repository.reviews ]
reviews_dict = odict()
- for changeset in common.get_reversed_changelog_changesets( repo ):
+ for changeset in suc.get_reversed_changelog_changesets( repo ):
ctx = repo.changectx( changeset )
changeset_revision = str( ctx )
if changeset_revision in metadata_revision_hashes or changeset_revision in reviewed_revision_hashes:
- rev, changeset_revision_label = common.get_rev_label_from_changeset_revision( repo, changeset_revision )
+ rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision )
if changeset_revision in reviewed_revision_hashes:
# Find the review for this changeset_revision
- repository_reviews = common.get_reviews_by_repository_id_changeset_revision( trans, repository_id, changeset_revision )
+ repository_reviews = suc.get_reviews_by_repository_id_changeset_revision( trans, repository_id, changeset_revision )
# Determine if the current user can add a review to this revision.
can_add_review = trans.user not in [ repository_review.user for repository_review in repository_reviews ]
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision )
@@ -704,8 +704,8 @@
repo_dir = repository.repo_path( trans.app )
repo = hg.repository( suc.get_configured_ui(), repo_dir )
installable = changeset_revision in [ metadata_revision.changeset_revision for metadata_revision in repository.metadata_revisions ]
- rev, changeset_revision_label = common.get_rev_label_from_changeset_revision( repo, changeset_revision )
- reviews = common.get_reviews_by_repository_id_changeset_revision( trans, repository_id, changeset_revision )
+ rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision )
+ reviews = suc.get_reviews_by_repository_id_changeset_revision( trans, repository_id, changeset_revision )
return trans.fill_template( '/webapps/community/repository_review/reviews_of_changeset_revision.mako',
repository=repository,
changeset_revision=changeset_revision,
@@ -724,7 +724,7 @@
if 'operation' in kwd:
operation = kwd['operation'].lower()
# The value of the received id is the encoded review id.
- review = common.get_review( trans, kwd[ 'id' ] )
+ review = suc.get_review( trans, kwd[ 'id' ] )
repository = review.repository
kwd[ 'id' ] = trans.security.encode_id( repository.id )
if operation == "inspect repository revisions":
@@ -737,7 +737,7 @@
action='view_or_manage_repository',
**kwd ) )
# The user may not be the current user. The value of the received id is the encoded user id.
- user = common.get_user( trans, kwd[ 'id' ] )
+ user = suc.get_user( trans, kwd[ 'id' ] )
self.repository_reviews_by_user_grid.title = "All repository revision reviews for user '%s'" % user.username
return self.repository_reviews_by_user_grid( trans, **kwd )
@web.expose
@@ -768,8 +768,8 @@
repository = suc.get_repository_in_tool_shed( trans, kwd[ 'id' ] )
changeset_revision = kwd.get( 'changeset_revision', None )
repo = hg.repository( suc.get_configured_ui(), repository.repo_path( trans.app ) )
- previous_reviews_dict = common.get_previous_repository_reviews( trans, repository, changeset_revision )
- rev, changeset_revision_label = common.get_rev_label_from_changeset_revision( repo, changeset_revision )
+ previous_reviews_dict = suc.get_previous_repository_reviews( trans, repository, changeset_revision )
+ rev, changeset_revision_label = suc.get_rev_label_from_changeset_revision( repo, changeset_revision )
return trans.fill_template( '/webapps/community/repository_review/select_previous_review.mako',
repository=repository,
changeset_revision=changeset_revision,
diff -r 6538175fb3e6483895aaadfdeddd09aac558fdf5 -r dd395d9b8a01255412b3e56219d11639ccce2e50 lib/galaxy/webapps/community/controllers/upload.py
--- a/lib/galaxy/webapps/community/controllers/upload.py
+++ b/lib/galaxy/webapps/community/controllers/upload.py
@@ -1,7 +1,6 @@
import sys, os, shutil, logging, tarfile, tempfile, urllib
from galaxy.web.base.controller import *
from galaxy.datatypes import checkers
-import common
import galaxy.util.shed_util_common as suc
from galaxy import eggs
@@ -23,7 +22,7 @@
status = params.get( 'status', 'done' )
commit_message = util.restore_text( params.get( 'commit_message', 'Uploaded' ) )
category_ids = util.listify( params.get( 'category_id', '' ) )
- categories = common.get_categories( trans )
+ categories = suc.get_categories( trans )
repository_id = params.get( 'repository_id', '' )
repository = suc.get_repository_in_tool_shed( trans, repository_id )
repo_dir = repository.repo_path( trans.app )
@@ -37,7 +36,7 @@
url = params.get( 'url', '' )
# Part of the upload process is sending email notification to those that have registered to
# receive them. One scenario occurs when the first change set is produced for the repository.
- # See the common.handle_email_alerts() method for the definition of the scenarios.
+ # See the suc.handle_email_alerts() method for the definition of the scenarios.
new_repo_alert = repository.is_new( trans.app )
uploaded_directory = None
if params.get( 'upload_button', False ):
@@ -104,22 +103,11 @@
# Uploaded directory
istar = False
if istar:
- ok, message, files_to_remove, content_alert_str, undesirable_dirs_removed, undesirable_files_removed = self.upload_tar( trans,
- repository,
- tar,
- uploaded_file,
- upload_point,
- remove_repo_files_not_in_tar,
- commit_message,
- new_repo_alert )
+ ok, message, files_to_remove, content_alert_str, undesirable_dirs_removed, undesirable_files_removed = \
+ self.upload_tar( trans, repository, tar, uploaded_file, upload_point, remove_repo_files_not_in_tar, commit_message, new_repo_alert )
elif uploaded_directory:
- ok,message, files_to_remove, content_alert_str, undesirable_dirs_removed, undesirable_files_removed = self.upload_directory( trans,
- repository,
- uploaded_directory,
- upload_point,
- remove_repo_files_not_in_tar,
- commit_message,
- new_repo_alert )
+ ok,message, files_to_remove, content_alert_str, undesirable_dirs_removed, undesirable_files_removed = \
+ self.upload_directory( trans, repository, uploaded_directory, upload_point, remove_repo_files_not_in_tar, commit_message, new_repo_alert )
else:
if ( isgzip or isbz2 ) and uncompress_file:
uploaded_file_filename = self.uncompress( repository, uploaded_file_name, uploaded_file_filename, isgzip, isbz2 )
@@ -131,7 +119,7 @@
shutil.move( uploaded_file_name, full_path )
# See if any admin users have chosen to receive email alerts when a repository is
# updated. If so, check every uploaded file to ensure content is appropriate.
- check_contents = common.check_file_contents( trans )
+ check_contents = suc.check_file_contents( trans )
if check_contents and os.path.isfile( full_path ):
content_alert_str = self.__check_file_content( full_path )
else:
@@ -148,7 +136,7 @@
message = '%s<br/>%s' % ( message, error_message )
# See if the content of the change set was valid.
admin_only = len( repository.downloadable_revisions ) != 1
- common.handle_email_alerts( trans, repository, content_alert_str=content_alert_str, new_repo_alert=new_repo_alert, admin_only=admin_only )
+ suc.handle_email_alerts( trans, repository, content_alert_str=content_alert_str, new_repo_alert=new_repo_alert, admin_only=admin_only )
if ok:
# Update the repository files for browsing.
suc.update_repository( repo )
@@ -177,17 +165,20 @@
else:
message += " %d files were removed from the repository root. " % len( files_to_remove )
kwd[ 'message' ] = message
- common.set_repository_metadata_due_to_new_tip( trans, repository, content_alert_str=content_alert_str, **kwd )
- # Provide a warning message if a tool_dependencies.xml file is provided, but tool dependencies weren't loaded due to e.g. a requirement tag mismatch
+ suc.set_repository_metadata_due_to_new_tip( trans, repository, content_alert_str=content_alert_str, **kwd )
+ # Provide a warning message if a tool_dependencies.xml file is provided, but tool dependencies weren't loaded due to a requirement tag mismatch
+ # or some other problem.
if suc.get_config_from_disk( 'tool_dependencies.xml', repo_dir ):
if repository.metadata_revisions:
+ # A repository's metadata revisions are order descending by update_time, so the zeroth revision will be the tip just after an upload.
metadata_dict = repository.metadata_revisions[0].metadata
else:
metadata_dict = {}
if 'tool_dependencies' not in metadata_dict:
- message += 'Name, version and type from a tool requirement tag does not match the information in the "tool_dependencies.xml file". '
+ message += 'Name, version and type from a tool requirement tag does not match the information in the "tool_dependencies.xml file", '
+ message += 'so the tool dependency definitions will be ignored.'
status = 'warning'
- log.debug( 'Error in tool dependencies for repository %s: %s.' % ( repository.id, repository.name ) )
+ log.debug( 'Error in tool dependencies for repository with id %s and name %s: %s' % ( str( repository.id ), str( repository.name ), message ) )
# Reset the tool_data_tables by loading the empty tool_data_table_conf.xml file.
suc.reset_tool_data_tables( trans.app )
trans.response.send_redirect( web.url_for( controller='repository',
@@ -327,7 +318,7 @@
pass
# See if any admin users have chosen to receive email alerts when a repository is
# updated. If so, check every uploaded file to ensure content is appropriate.
- check_contents = common.check_file_contents( trans )
+ check_contents = suc.check_file_contents( trans )
for filename_in_archive in filenames_in_archive:
# Check file content to ensure it is appropriate.
if check_contents and os.path.isfile( filename_in_archive ):
@@ -341,7 +332,7 @@
return False, message, files_to_remove, content_alert_str, undesirable_dirs_removed, undesirable_files_removed
commands.commit( repo.ui, repo, full_path, user=trans.user.username, message=commit_message )
admin_only = len( repository.downloadable_revisions ) != 1
- common.handle_email_alerts( trans, repository, content_alert_str=content_alert_str, new_repo_alert=new_repo_alert, admin_only=admin_only )
+ suc.handle_email_alerts( trans, repository, content_alert_str=content_alert_str, new_repo_alert=new_repo_alert, admin_only=admin_only )
return True, '', files_to_remove, content_alert_str, undesirable_dirs_removed, undesirable_files_removed
def uncompress( self, repository, uploaded_file_name, uploaded_file_filename, isgzip, isbz2 ):
if isgzip:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6538175fb3e6/
changeset: 6538175fb3e6
user: jgoecks
date: 2013-01-17 21:57:21
summary: Remove incorrect test parameter.
affected #: 1 file
diff -r d4a61389668164e833eef418ab03c1467ba64d13 -r 6538175fb3e6483895aaadfdeddd09aac558fdf5 tools/ngs_rna/tophat2_wrapper.xml
--- a/tools/ngs_rna/tophat2_wrapper.xml
+++ b/tools/ngs_rna/tophat2_wrapper.xml
@@ -462,7 +462,6 @@
<param name="use_annotations" value="No" /><param name="use_juncs" value="No" /><param name="no_novel_juncs" value="No" />
- <param name="report_discordant_pairs" value="No" /><param name="use_search" value="Yes" /><param name="min_coverage_intron" value="50" /><param name="max_coverage_intron" value="20000" />
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/44d9d215b9c3/
changeset: 44d9d215b9c3
user: epaniagu
date: 2011-11-22 21:42:18
summary: fix add/remove buttons in Repeat elements
affected #: 1 file
diff -r 9d6a9963b0da21fe3139fcefbd11c1ec6290a529 -r 44d9d215b9c337cf9b988976bf93f429dbd84ccb templates/tool_form.mako
--- a/templates/tool_form.mako
+++ b/templates/tool_form.mako
@@ -139,13 +139,17 @@
%><div class="form-title-row"><strong>${input.title} ${i + 1}</strong></div>
${do_inputs( input.inputs, repeat_state[i], rep_errors, prefix + input.name + "_" + str(index) + "|", other_values )}
- <div class="form-row"><input type="submit" name="${prefix}${input.name}_${index}_remove" value="Remove ${input.title} ${i+1}"></div>
+ %if input.min < len( repeat_state ):
+ <div class="form-row"><input type="submit" name="${prefix}${input.name}_${index}_remove" value="Remove ${input.title} ${i+1}"></div>
+ %endif
</div>
%if rep_errors.has_key( '__index__' ):
<div><img style="vertical-align: middle;" src="${h.url_for('/static/style/error_small.png')}"> <span style="vertical-align: middle;">${rep_errors['__index__']}</span></div>
%endif
%endfor
- <div class="form-row"><input type="submit" name="${prefix}${input.name}_add" value="Add new ${input.title}"></div>
+ %if input.max > len( repeat_state ):
+ <div class="form-row"><input type="submit" name="${prefix}${input.name}_add" value="Add new ${input.title}"></div>
+ %endif
</div>
%elif input.type == "conditional":
<%
https://bitbucket.org/galaxy/galaxy-central/commits/b6ff1a695e07/
changeset: b6ff1a695e07
user: epaniagu
date: 2011-11-22 21:53:56
summary: replace len( repeat_state ) with a variable so there's only one call
affected #: 1 file
diff -r 44d9d215b9c337cf9b988976bf93f429dbd84ccb -r b6ff1a695e07e6a2443a3d6d0aa9a9066a155dbc templates/tool_form.mako
--- a/templates/tool_form.mako
+++ b/templates/tool_form.mako
@@ -127,8 +127,11 @@
</div>
%endif
</div>
- <% repeat_state = tool_state[input.name] %>
- %for i in range( len( repeat_state ) ):
+ <%
+ repeat_state = tool_state[input.name]
+ num_repeats = len( repeat_state )
+ %>
+ %for i in range( num_repeats ):
<div class="repeat-group-item"><%
if input.name in errors:
@@ -139,7 +142,7 @@
%><div class="form-title-row"><strong>${input.title} ${i + 1}</strong></div>
${do_inputs( input.inputs, repeat_state[i], rep_errors, prefix + input.name + "_" + str(index) + "|", other_values )}
- %if input.min < len( repeat_state ):
+ %if input.min < num_repeats:
<div class="form-row"><input type="submit" name="${prefix}${input.name}_${index}_remove" value="Remove ${input.title} ${i+1}"></div>
%endif
</div>
@@ -147,7 +150,7 @@
<div><img style="vertical-align: middle;" src="${h.url_for('/static/style/error_small.png')}"> <span style="vertical-align: middle;">${rep_errors['__index__']}</span></div>
%endif
%endfor
- %if input.max > len( repeat_state ):
+ %if input.max > num_repeats:
<div class="form-row"><input type="submit" name="${prefix}${input.name}_add" value="Add new ${input.title}"></div>
%endif
</div>
https://bitbucket.org/galaxy/galaxy-central/commits/8d068273cf5b/
changeset: 8d068273cf5b
user: jgoecks
date: 2013-01-17 21:32:34
summary: Merged in epaniagu/galaxy-central (pull request #24: Fix Add/Remove buttons for Repeat groups)
affected #: 1 file
diff -r 7848d6fd1b7a3ef8330ad1b31f5a3521094ad706 -r 8d068273cf5b1160a27977727a7ab6f2237d4bb7 templates/tool_form.mako
--- a/templates/tool_form.mako
+++ b/templates/tool_form.mako
@@ -135,8 +135,11 @@
</div>
%endif
</div>
- <% repeat_state = tool_state[input.name] %>
- %for i in range( len( repeat_state ) ):
+ <%
+ repeat_state = tool_state[input.name]
+ num_repeats = len( repeat_state )
+ %>
+ %for i in range( num_repeats ):
<div class="repeat-group-item"><%
if input.name in errors:
@@ -147,13 +150,25 @@
%><div class="form-title-row"><strong>${input.title} ${i + 1}</strong></div>
${do_inputs( input.inputs, repeat_state[i], rep_errors, prefix + input.name + "_" + str(index) + "|", other_values )}
+<<<<<<< local
<div class="form-row"><input type="submit" class="btn" name="${prefix}${input.name}_${index}_remove" value="Remove ${input.title} ${i+1}"></div>
+=======
+ %if input.min < num_repeats:
+ <div class="form-row"><input type="submit" name="${prefix}${input.name}_${index}_remove" value="Remove ${input.title} ${i+1}"></div>
+ %endif
+>>>>>>> other
</div>
%if rep_errors.has_key( '__index__' ):
<div><img style="vertical-align: middle;" src="${h.url_for('/static/style/error_small.png')}"> <span style="vertical-align: middle;">${rep_errors['__index__']}</span></div>
%endif
%endfor
+<<<<<<< local
<div class="form-row"><input type="submit" class="btn" name="${prefix}${input.name}_add" value="Add new ${input.title}"></div>
+=======
+ %if input.max > num_repeats:
+ <div class="form-row"><input type="submit" name="${prefix}${input.name}_add" value="Add new ${input.title}"></div>
+ %endif
+>>>>>>> other
</div>
%elif input.type == "conditional":
<%
https://bitbucket.org/galaxy/galaxy-central/commits/d4a613896681/
changeset: d4a613896681
user: jgoecks
date: 2013-01-17 21:34:04
summary: Automated merge.
affected #: 1 file
diff -r 8d068273cf5b1160a27977727a7ab6f2237d4bb7 -r d4a61389668164e833eef418ab03c1467ba64d13 scripts/functional_tests.py
--- a/scripts/functional_tests.py
+++ b/scripts/functional_tests.py
@@ -50,6 +50,41 @@
migrated_tool_panel_config = 'migrated_tools_conf.xml'
installed_tool_panel_configs = [ 'shed_tool_conf.xml' ]
+# should this serve static resources (scripts, images, styles, etc.)
+STATIC_ENABLED = True
+
+def get_static_settings():
+ """Returns dictionary of the settings necessary for a galaxy App
+ to be wrapped in the static middleware.
+
+ This mainly consists of the filesystem locations of url-mapped
+ static resources.
+ """
+ cwd = os.getcwd()
+ static_dir = os.path.join( cwd, 'static' )
+ #TODO: these should be copied from universe_wsgi.ini
+ return dict(
+ #TODO: static_enabled needed here?
+ static_enabled = True,
+ static_cache_time = 360,
+ static_dir = static_dir,
+ static_images_dir = os.path.join( static_dir, 'images', '' ),
+ static_favicon_dir = os.path.join( static_dir, 'favicon.ico' ),
+ static_scripts_dir = os.path.join( static_dir, 'scripts', '' ),
+ static_style_dir = os.path.join( static_dir, 'june_2007_style', 'blue' ),
+ static_robots_txt = os.path.join( static_dir, 'robots.txt' ),
+ )
+
+def get_webapp_global_conf():
+ """Get the global_conf dictionary sent as the first argument to app_factory.
+ """
+ # (was originally sent 'dict()') - nothing here for now except static settings
+ global_conf = dict()
+ if STATIC_ENABLED:
+ global_conf.update( get_static_settings() )
+ return global_conf
+
+
def parse_tool_panel_config( config, shed_tools_dict ):
"""
Parse a shed-related tool panel config to generate the shed_tools_dict. This only happens when testing tools installed from the tool shed.
@@ -289,7 +324,8 @@
server = None
if start_server:
- webapp = buildapp.app_factory( dict(), use_translogger=False, static_enabled=False, app=app )
+ webapp = buildapp.app_factory( get_webapp_global_conf(), app=app,
+ use_translogger=False, static_enabled=STATIC_ENABLED )
if galaxy_test_port is not None:
server = httpserver.serve( webapp, host=galaxy_test_host, port=galaxy_test_port, start_loop=False )
else:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: Enable serving static files when running functional tests
by Bitbucket 17 Jan '13
by Bitbucket 17 Jan '13
17 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/da89c3556c27/
changeset: da89c3556c27
user: carlfeberhard
date: 2013-01-17 20:58:43
summary: Enable serving static files when running functional tests
affected #: 1 file
diff -r 7848d6fd1b7a3ef8330ad1b31f5a3521094ad706 -r da89c3556c27c8f1e5acf943c6983be5437efac6 scripts/functional_tests.py
--- a/scripts/functional_tests.py
+++ b/scripts/functional_tests.py
@@ -50,6 +50,41 @@
migrated_tool_panel_config = 'migrated_tools_conf.xml'
installed_tool_panel_configs = [ 'shed_tool_conf.xml' ]
+# should this serve static resources (scripts, images, styles, etc.)
+STATIC_ENABLED = True
+
+def get_static_settings():
+ """Returns dictionary of the settings necessary for a galaxy App
+ to be wrapped in the static middleware.
+
+ This mainly consists of the filesystem locations of url-mapped
+ static resources.
+ """
+ cwd = os.getcwd()
+ static_dir = os.path.join( cwd, 'static' )
+ #TODO: these should be copied from universe_wsgi.ini
+ return dict(
+ #TODO: static_enabled needed here?
+ static_enabled = True,
+ static_cache_time = 360,
+ static_dir = static_dir,
+ static_images_dir = os.path.join( static_dir, 'images', '' ),
+ static_favicon_dir = os.path.join( static_dir, 'favicon.ico' ),
+ static_scripts_dir = os.path.join( static_dir, 'scripts', '' ),
+ static_style_dir = os.path.join( static_dir, 'june_2007_style', 'blue' ),
+ static_robots_txt = os.path.join( static_dir, 'robots.txt' ),
+ )
+
+def get_webapp_global_conf():
+ """Get the global_conf dictionary sent as the first argument to app_factory.
+ """
+ # (was originally sent 'dict()') - nothing here for now except static settings
+ global_conf = dict()
+ if STATIC_ENABLED:
+ global_conf.update( get_static_settings() )
+ return global_conf
+
+
def parse_tool_panel_config( config, shed_tools_dict ):
"""
Parse a shed-related tool panel config to generate the shed_tools_dict. This only happens when testing tools installed from the tool shed.
@@ -289,7 +324,8 @@
server = None
if start_server:
- webapp = buildapp.app_factory( dict(), use_translogger=False, static_enabled=False, app=app )
+ webapp = buildapp.app_factory( get_webapp_global_conf(), app=app,
+ use_translogger=False, static_enabled=STATIC_ENABLED )
if galaxy_test_port is not None:
server = httpserver.serve( webapp, host=galaxy_test_host, port=galaxy_test_port, start_loop=False )
else:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/2eb6dddb3866/
changeset: 2eb6dddb3866
user: fangly
date: 2011-10-05 10:04:58
summary: Paired-end code that properly ignores description part of FASTQ headers
affected #: 1 file
diff -r 087a766b3eca312d49caffa6b821d304658825ae -r 2eb6dddb3866adef30b72e92e747d9ece4e11da9 lib/galaxy_utils/sequence/fastq.py
--- a/lib/galaxy_utils/sequence/fastq.py
+++ b/lib/galaxy_utils/sequence/fastq.py
@@ -514,9 +514,13 @@
self.apply_galaxy_conventions = apply_galaxy_conventions
def close( self ):
return self.file.close()
- def get( self, sequence_id ):
- if not isinstance( sequence_id, basestring ):
- sequence_id = sequence_id.identifier
+ def get( self, sequence_identifier ):
+ # Input is either a sequence ID or a sequence object
+ if not isinstance( sequence_identifier, basestring ):
+ # Input was a sequence object (not a sequence ID). Get the sequence ID
+ sequence_identifier = sequence_identifier.identifier
+ # Get only the ID part of the sequence header
+ sequence_id, sequence_sep, sequence_desc = sequence_identifier.partition(' ')
rval = None
if sequence_id in self.offset_dict:
initial_offset = self.file.tell()
@@ -525,7 +529,7 @@
del self.offset_dict[ sequence_id ]
self.file.seek( seq_offset )
rval = self.reader.next()
- #assert rval.identifier == sequence_id, 'seq id mismatch' #should be able to remove this
+ #assert rval.id == sequence_id, 'seq id mismatch' #should be able to remove this
self.file.seek( initial_offset )
else:
while True:
@@ -535,13 +539,14 @@
except StopIteration:
self.eof = True
break #eof, id not found, will return None
- if fastq_read.identifier == sequence_id:
+ fastq_read_id, fastq_read_sep, fastq_read_desc = fastq_read.identifier.partition(' ')
+ if fastq_read_id == sequence_id:
rval = fastq_read
break
else:
- if fastq_read.identifier not in self.offset_dict:
- self.offset_dict[ fastq_read.identifier ] = []
- self.offset_dict[ fastq_read.identifier ].append( offset )
+ if fastq_read_id not in self.offset_dict:
+ self.offset_dict[ fastq_read_id ] = []
+ self.offset_dict[ fastq_read_id ].append( offset )
if rval is not None and self.apply_galaxy_conventions:
rval.apply_galaxy_conventions()
return rval
@@ -582,16 +587,18 @@
self.format = format
self.force_quality_encoding = force_quality_encoding
def join( self, read1, read2 ):
- if read1.identifier.endswith( '/2' ) and read2.identifier.endswith( '/1' ):
+ read1_id, read1_sep, read1_desc = read1.identifier.partition(' ')
+ read2_id, read2_sep, read2_desc = read2.identifier.partition(' ')
+ if read1_id.endswith( '/2' ) and read2_id.endswith( '/1' ):
#swap 1 and 2
tmp = read1
read1 = read2
read2 = tmp
del tmp
- if read1.identifier.endswith( '/1' ) and read2.identifier.endswith( '/2' ):
- identifier = read1.identifier[:-2]
- else:
- identifier = read1.identifier
+ if read1_id.endswith( '/1' ) and read2_id.endswith( '/2' ):
+ read1_id = read1_id[:-2]
+
+ identifier = read1_id + ' ' + read1_desc
#use force quality encoding, if not present force to encoding of first read
force_quality_encoding = self.force_quality_encoding
@@ -621,17 +628,18 @@
rval.quality = "%s %s" % ( new_read1.quality.strip(), new_read2.quality.strip() )
return rval
def get_paired_identifier( self, fastq_read ):
- identifier = fastq_read.identifier
- if identifier[-2] == '/':
- if identifier[-1] == "1":
- identifier = "%s2" % identifier[:-1]
- elif identifier[-1] == "2":
- identifier = "%s1" % identifier[:-1]
- return identifier
+ read_id, read_sep, read_desc = fastq_read.identifier.partition(' ')
+ if read_id[-2] == '/':
+ if read_id[-1] == "1":
+ read_id = "%s2" % read_id[:-1]
+ elif read_id[-1] == "2":
+ read_id = "%s1" % read_id[:-1]
+ return read_id
def is_first_mate( self, sequence_id ):
is_first = None
if not isinstance( sequence_id, basestring ):
sequence_id = sequence_id.identifier
+ sequence_id, sequence_sep, sequence_desc = sequence_id.partition(' ')
if sequence_id[-2] == '/':
if sequence_id[-1] == "1":
is_first = True
https://bitbucket.org/galaxy/galaxy-central/commits/34e7cf3bcef0/
changeset: 34e7cf3bcef0
user: fangly
date: 2011-11-30 02:38:52
summary: Avoid trailing whitespace
affected #: 1 file
diff -r 2eb6dddb3866adef30b72e92e747d9ece4e11da9 -r 34e7cf3bcef0eb7bf7d0684e8ac5d91e03750d8c lib/galaxy_utils/sequence/fastq.py
--- a/lib/galaxy_utils/sequence/fastq.py
+++ b/lib/galaxy_utils/sequence/fastq.py
@@ -597,8 +597,10 @@
del tmp
if read1_id.endswith( '/1' ) and read2_id.endswith( '/2' ):
read1_id = read1_id[:-2]
-
- identifier = read1_id + ' ' + read1_desc
+
+ identifier = read1_id
+ if read1_desc:
+ identifier = identifier + ' ' + read1_desc
#use force quality encoding, if not present force to encoding of first read
force_quality_encoding = self.force_quality_encoding
https://bitbucket.org/galaxy/galaxy-central/commits/7d4a431f7188/
changeset: 7d4a431f7188
user: fangly
date: 2011-11-30 03:01:07
summary: Updated tests for FASTQ interlacer/deinterlacer tool
affected #: 2 files
diff -r 34e7cf3bcef0eb7bf7d0684e8ac5d91e03750d8c -r 7d4a431f7188d71d5e0ba2655a10145ecbdb4468 test-data/paired_end_2.fastqsanger
--- a/test-data/paired_end_2.fastqsanger
+++ b/test-data/paired_end_2.fastqsanger
@@ -1,6 +1,6 @@
-@1539:931/2
+@1539:931/2 this read has a description
GCGCGTAACGTTTCACCTCGAGATCGTTGTCGGCCGCAATCTCCTGGGGGCGCCATTCCGAATCGTAGTTGTCGGCGTCTTCCAGTGCGGCAAGGCATCGT
-+1539:931/2
++1539:931/2 this read has a description
aee_dcadeeWcaaadJbdaff[fffc]dcfe[dRc^\[^QVOZXXZSPFWNUUZ\P^`BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
@2971:937/2
CTCGCACGGCCGCCTCGACCACTTGGTCTGGCGTCATGCGCAATTTTTTCTCCATGTGGAACGGGCTGGTGGCGATGAACGTATGAATATGCCCCCGCGCT
diff -r 34e7cf3bcef0eb7bf7d0684e8ac5d91e03750d8c -r 7d4a431f7188d71d5e0ba2655a10145ecbdb4468 test-data/paired_end_merged.fastqsanger
--- a/test-data/paired_end_merged.fastqsanger
+++ b/test-data/paired_end_merged.fastqsanger
@@ -2,9 +2,9 @@
NACATCAACACTCAGTAACGGCTGGCGCAAAATGGCATTGATTAACGAAGACTTCCCGCGCGTGAAGGCGCCGGCAAACGAGGCTCGGGAAGGGGCTCCCG
+1539:931/1
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-@1539:931/2
+@1539:931/2 this read has a description
GCGCGTAACGTTTCACCTCGAGATCGTTGTCGGCCGCAATCTCCTGGGGGCGCCATTCCGAATCGTAGTTGTCGGCGTCTTCCAGTGCGGCAAGGCATCGT
-+1539:931/2
++1539:931/2 this read has a description
aee_dcadeeWcaaadJbdaff[fffc]dcfe[dRc^\[^QVOZXXZSPFWNUUZ\P^`BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
@2971:937/1
NCGGAGACTTCGAGGCCATCCAGTCGATTGCCAAAGTCATCAAGGGGTCGACGATCTGCTCCCTTGCCCGTTCCAACGAGAATGAAATCCGCCGCGCGTGG
https://bitbucket.org/galaxy/galaxy-central/commits/7848d6fd1b7a/
changeset: 7848d6fd1b7a
user: jgoecks
date: 2013-01-17 20:12:57
summary: Merged in fangly/galaxy-central (pull request #8: Paired-end code mishandles description of FASTQ headers)
affected #: 3 files
diff -r 1b95e5b076fee018402e5c94534a2e65ea6c5315 -r 7848d6fd1b7a3ef8330ad1b31f5a3521094ad706 lib/galaxy_utils/sequence/fastq.py
--- a/lib/galaxy_utils/sequence/fastq.py
+++ b/lib/galaxy_utils/sequence/fastq.py
@@ -514,9 +514,13 @@
self.apply_galaxy_conventions = apply_galaxy_conventions
def close( self ):
return self.file.close()
- def get( self, sequence_id ):
- if not isinstance( sequence_id, basestring ):
- sequence_id = sequence_id.identifier
+ def get( self, sequence_identifier ):
+ # Input is either a sequence ID or a sequence object
+ if not isinstance( sequence_identifier, basestring ):
+ # Input was a sequence object (not a sequence ID). Get the sequence ID
+ sequence_identifier = sequence_identifier.identifier
+ # Get only the ID part of the sequence header
+ sequence_id, sequence_sep, sequence_desc = sequence_identifier.partition(' ')
rval = None
if sequence_id in self.offset_dict:
initial_offset = self.file.tell()
@@ -525,7 +529,7 @@
del self.offset_dict[ sequence_id ]
self.file.seek( seq_offset )
rval = self.reader.next()
- #assert rval.identifier == sequence_id, 'seq id mismatch' #should be able to remove this
+ #assert rval.id == sequence_id, 'seq id mismatch' #should be able to remove this
self.file.seek( initial_offset )
else:
while True:
@@ -535,13 +539,14 @@
except StopIteration:
self.eof = True
break #eof, id not found, will return None
- if fastq_read.identifier == sequence_id:
+ fastq_read_id, fastq_read_sep, fastq_read_desc = fastq_read.identifier.partition(' ')
+ if fastq_read_id == sequence_id:
rval = fastq_read
break
else:
- if fastq_read.identifier not in self.offset_dict:
- self.offset_dict[ fastq_read.identifier ] = []
- self.offset_dict[ fastq_read.identifier ].append( offset )
+ if fastq_read_id not in self.offset_dict:
+ self.offset_dict[ fastq_read_id ] = []
+ self.offset_dict[ fastq_read_id ].append( offset )
if rval is not None and self.apply_galaxy_conventions:
rval.apply_galaxy_conventions()
return rval
@@ -582,16 +587,20 @@
self.format = format
self.force_quality_encoding = force_quality_encoding
def join( self, read1, read2 ):
- if read1.identifier.endswith( '/2' ) and read2.identifier.endswith( '/1' ):
+ read1_id, read1_sep, read1_desc = read1.identifier.partition(' ')
+ read2_id, read2_sep, read2_desc = read2.identifier.partition(' ')
+ if read1_id.endswith( '/2' ) and read2_id.endswith( '/1' ):
#swap 1 and 2
tmp = read1
read1 = read2
read2 = tmp
del tmp
- if read1.identifier.endswith( '/1' ) and read2.identifier.endswith( '/2' ):
- identifier = read1.identifier[:-2]
- else:
- identifier = read1.identifier
+ if read1_id.endswith( '/1' ) and read2_id.endswith( '/2' ):
+ read1_id = read1_id[:-2]
+
+ identifier = read1_id
+ if read1_desc:
+ identifier = identifier + ' ' + read1_desc
#use force quality encoding, if not present force to encoding of first read
force_quality_encoding = self.force_quality_encoding
@@ -621,17 +630,18 @@
rval.quality = "%s %s" % ( new_read1.quality.strip(), new_read2.quality.strip() )
return rval
def get_paired_identifier( self, fastq_read ):
- identifier = fastq_read.identifier
- if identifier[-2] == '/':
- if identifier[-1] == "1":
- identifier = "%s2" % identifier[:-1]
- elif identifier[-1] == "2":
- identifier = "%s1" % identifier[:-1]
- return identifier
+ read_id, read_sep, read_desc = fastq_read.identifier.partition(' ')
+ if read_id[-2] == '/':
+ if read_id[-1] == "1":
+ read_id = "%s2" % read_id[:-1]
+ elif read_id[-1] == "2":
+ read_id = "%s1" % read_id[:-1]
+ return read_id
def is_first_mate( self, sequence_id ):
is_first = None
if not isinstance( sequence_id, basestring ):
sequence_id = sequence_id.identifier
+ sequence_id, sequence_sep, sequence_desc = sequence_id.partition(' ')
if sequence_id[-2] == '/':
if sequence_id[-1] == "1":
is_first = True
diff -r 1b95e5b076fee018402e5c94534a2e65ea6c5315 -r 7848d6fd1b7a3ef8330ad1b31f5a3521094ad706 test-data/paired_end_2.fastqsanger
--- a/test-data/paired_end_2.fastqsanger
+++ b/test-data/paired_end_2.fastqsanger
@@ -1,6 +1,6 @@
-@1539:931/2
+@1539:931/2 this read has a description
GCGCGTAACGTTTCACCTCGAGATCGTTGTCGGCCGCAATCTCCTGGGGGCGCCATTCCGAATCGTAGTTGTCGGCGTCTTCCAGTGCGGCAAGGCATCGT
-+1539:931/2
++1539:931/2 this read has a description
aee_dcadeeWcaaadJbdaff[fffc]dcfe[dRc^\[^QVOZXXZSPFWNUUZ\P^`BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
@2971:937/2
CTCGCACGGCCGCCTCGACCACTTGGTCTGGCGTCATGCGCAATTTTTTCTCCATGTGGAACGGGCTGGTGGCGATGAACGTATGAATATGCCCCCGCGCT
diff -r 1b95e5b076fee018402e5c94534a2e65ea6c5315 -r 7848d6fd1b7a3ef8330ad1b31f5a3521094ad706 test-data/paired_end_merged.fastqsanger
--- a/test-data/paired_end_merged.fastqsanger
+++ b/test-data/paired_end_merged.fastqsanger
@@ -2,9 +2,9 @@
NACATCAACACTCAGTAACGGCTGGCGCAAAATGGCATTGATTAACGAAGACTTCCCGCGCGTGAAGGCGCCGGCAAACGAGGCTCGGGAAGGGGCTCCCG
+1539:931/1
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
-@1539:931/2
+@1539:931/2 this read has a description
GCGCGTAACGTTTCACCTCGAGATCGTTGTCGGCCGCAATCTCCTGGGGGCGCCATTCCGAATCGTAGTTGTCGGCGTCTTCCAGTGCGGCAAGGCATCGT
-+1539:931/2
++1539:931/2 this read has a description
aee_dcadeeWcaaadJbdaff[fffc]dcfe[dRc^\[^QVOZXXZSPFWNUUZ\P^`BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
@2971:937/1
NCGGAGACTTCGAGGCCATCCAGTCGATTGCCAAAGTCATCAAGGGGTCGACGATCTGCTCCCTTGCCCGTTCCAACGAGAATGAAATCCGCCGCGCGTGG
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Comment and naming fix for migration script 108.
by Bitbucket 17 Jan '13
by Bitbucket 17 Jan '13
17 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1b95e5b076fe/
changeset: 1b95e5b076fe
user: jgoecks
date: 2013-01-17 19:56:26
summary: Comment and naming fix for migration script 108.
affected #: 1 file
diff -r 1314572f86e121aa734ea27a52601fbcdb450278 -r 1b95e5b076fee018402e5c94534a2e65ea6c5315 lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
--- a/lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
+++ b/lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
@@ -71,10 +71,10 @@
except Exception, e:
log.debug( "Dropping 'extended_metadata' table failed: %s" % ( str( e ) ) )
- # Drop the Job table's exit_code column.
+ # Drop the LDDA table's extended metadata ID column.
try:
- job_table = Table( "library_dataset_dataset_association", metadata, autoload=True )
- extended_metadata_id = job_table.c.extended_metadata_id
+ ldda_table = Table( "library_dataset_dataset_association", metadata, autoload=True )
+ extended_metadata_id = ldda_table.c.extended_metadata_id
extended_metadata_id.drop()
except Exception, e:
log.debug( "Dropping 'extended_metadata_id' column from library_dataset_dataset_association table failed: %s" % ( str( e ) ) )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ccc640f65971/
changeset: ccc640f65971
user: kellrott
date: 2013-01-15 22:57:14
summary: Adding exception catches to database 108 downgrade step to fix failure issue with downgrading postgres database (foreign key rules violated...)
affected #: 1 file
diff -r 4bd419751ed3e8cc54913fa37389111a0e7faaa9 -r ccc640f65971632ea6de7a94bc01d24954102487 lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
--- a/lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
+++ b/lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
@@ -61,8 +61,15 @@
def downgrade():
metadata.reflect()
- ExtendedMetadata_table.drop()
- ExtendedMetadataIndex_table.drop()
+ try:
+ ExtendedMetadataIndex_table.drop()
+ except Exception, e:
+ log.debug( "Dropping 'extended_metadata_index' table failed: %s" % ( str( e ) ) )
+
+ try:
+ ExtendedMetadata_table.drop()
+ except Exception, e:
+ log.debug( "Dropping 'extended_metadata' table failed: %s" % ( str( e ) ) )
# Drop the Job table's exit_code column.
try:
https://bitbucket.org/galaxy/galaxy-central/commits/1314572f86e1/
changeset: 1314572f86e1
user: jgoecks
date: 2013-01-17 19:52:01
summary: Merged in kellrott/galaxy-central (pull request #109: Fixing database v108 downgrade failure)
affected #: 1 file
diff -r b14f68fb3e853313d944f934cf279b3517d4a7e6 -r 1314572f86e121aa734ea27a52601fbcdb450278 lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
--- a/lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
+++ b/lib/galaxy/model/migrate/versions/0108_add_extended_metadata.py
@@ -61,8 +61,15 @@
def downgrade():
metadata.reflect()
- ExtendedMetadata_table.drop()
- ExtendedMetadataIndex_table.drop()
+ try:
+ ExtendedMetadataIndex_table.drop()
+ except Exception, e:
+ log.debug( "Dropping 'extended_metadata_index' table failed: %s" % ( str( e ) ) )
+
+ try:
+ ExtendedMetadata_table.drop()
+ except Exception, e:
+ log.debug( "Dropping 'extended_metadata' table failed: %s" % ( str( e ) ) )
# Drop the Job table's exit_code column.
try:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Use correct index tables for setting dbkey of Tophat2 outputs.
by Bitbucket 17 Jan '13
by Bitbucket 17 Jan '13
17 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b14f68fb3e85/
changeset: b14f68fb3e85
user: jgoecks
date: 2013-01-17 18:56:03
summary: Use correct index tables for setting dbkey of Tophat2 outputs.
affected #: 1 file
diff -r f11abc888753d0b8efeb4cae653a21ca64a2ae5b -r b14f68fb3e853313d944f934cf279b3517d4a7e6 tools/ngs_rna/tophat2_wrapper.xml
--- a/tools/ngs_rna/tophat2_wrapper.xml
+++ b/tools/ngs_rna/tophat2_wrapper.xml
@@ -323,7 +323,7 @@
<conditional name="refGenomeSource.genomeSource"><when value="indexed"><action type="metadata" name="dbkey">
- <option type="from_data_table" name="tophat_indexes" column="1" offset="0">
+ <option type="from_data_table" name="tophat2_indexes" column="1" offset="0"><filter type="param_value" column="0" value="#" compare="startswith" keep="False"/><filter type="param_value" ref="refGenomeSource.index" column="0"/></option>
@@ -342,7 +342,7 @@
<conditional name="refGenomeSource.genomeSource"><when value="indexed"><action type="metadata" name="dbkey">
- <option type="from_data_table" name="tophat_indexes" column="1" offset="0">
+ <option type="from_data_table" name="tophat2_indexes" column="1" offset="0"><filter type="param_value" column="0" value="#" compare="startswith" keep="False"/><filter type="param_value" ref="refGenomeSource.index" column="0"/></option>
@@ -361,7 +361,7 @@
<conditional name="refGenomeSource.genomeSource"><when value="indexed"><action type="metadata" name="dbkey">
- <option type="from_data_table" name="tophat_indexes" column="1" offset="0">
+ <option type="from_data_table" name="tophat2_indexes" column="1" offset="0"><filter type="param_value" column="0" value="#" compare="startswith" keep="False"/><filter type="param_value" ref="refGenomeSource.index" column="0"/></option>
@@ -380,7 +380,7 @@
<conditional name="refGenomeSource.genomeSource"><when value="indexed"><action type="metadata" name="dbkey">
- <option type="from_data_table" name="tophat_indexes" column="1" offset="0">
+ <option type="from_data_table" name="tophat2_indexes" column="1" offset="0"><filter type="param_value" column="0" value="#" compare="startswith" keep="False"/><filter type="param_value" ref="refGenomeSource.index" column="0"/></option>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Readd a request param that is no longer needed to a request between Galaxy and the tool shed to ensure backward compatibility.
by Bitbucket 17 Jan '13
by Bitbucket 17 Jan '13
17 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f11abc888753/
changeset: f11abc888753
user: greg
date: 2013-01-17 16:40:01
summary: Readd a request param that is no longer needed to a request between Galaxy and the tool shed to ensure backward compatibility.
affected #: 1 file
diff -r 6e1e7bee1e6f1b10eed3ba023e6ed0badf16ed38 -r f11abc888753d0b8efeb4cae653a21ca64a2ae5b lib/galaxy/webapps/galaxy/controllers/admin.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin.py
@@ -711,7 +711,8 @@
tool_dependencies_dict = {}
repository_name = elem.get( 'name' )
changeset_revision = elem.get( 'changeset_revision' )
- url = '%s/repository/get_tool_dependencies?name=%s&owner=devteam&changeset_revision=%s' % ( tool_shed_url, repository_name, changeset_revision )
+ url = '%s/repository/get_tool_dependencies?name=%s&owner=devteam&changeset_revision=%s&from_install_manager=True' % \
+ ( tool_shed_url, repository_name, changeset_revision )
response = urllib2.urlopen( url )
text = response.read()
response.close()
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Test for reinstalling an uninstalled repository that now has a new changeset adding repository dependencies.
by Bitbucket 17 Jan '13
by Bitbucket 17 Jan '13
17 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6e1e7bee1e6f/
changeset: 6e1e7bee1e6f
user: inithello
date: 2013-01-17 16:18:36
summary: Test for reinstalling an uninstalled repository that now has a new changeset adding repository dependencies.
affected #: 2 files
diff -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 -r 6e1e7bee1e6f1b10eed3ba023e6ed0badf16ed38 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -711,6 +711,8 @@
url = '/admin_toolshed/reselect_tool_panel_section?id=%s' % self.security.encode_id( installed_repository.id )
self.visit_galaxy_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed=[] )
+ # Build the url that will simulate a filled-out form being submitted. Due to a limitation in twill, the reselect_tool_panel_section
+ # form doesn't get parsed correctly.
repo_dependencies = self.create_checkbox_query_string( field_name='install_repository_dependencies', value=install_repository_dependencies )
tool_dependencies = self.create_checkbox_query_string( field_name='install_tool_dependencies', value=install_tool_dependencies )
encoded_repository_id = self.security.encode_id( installed_repository.id )
diff -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 -r 6e1e7bee1e6f1b10eed3ba023e6ed0badf16ed38 test/tool_shed/functional/test_1087_install_updated_repository_dependencies.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1087_install_updated_repository_dependencies.py
@@ -0,0 +1,105 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os, logging
+import tool_shed.base.test_db_util as test_db_util
+
+column_repository_name = 'column_maker_1087'
+column_repository_description = "Add column"
+column_repository_long_description = "Compute an expression on every row"
+
+convert_repository_name = 'convert_chars_1087'
+convert_repository_description = "Convert delimiters"
+convert_repository_long_description = "Convert delimiters to tab"
+
+category_name = 'Test 1087 Advanced Circular Dependencies'
+category_description = 'Test circular dependency features'
+
+log = logging.getLogger( __name__ )
+
+class TestRepositoryDependencies( ShedTwillTestCase ):
+ '''Test installing a repository, then updating it to include repository dependencies.'''
+ def test_0000_create_or_login_admin_user( self ):
+ """Create necessary user accounts and login as an admin user."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ galaxy_admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert galaxy_admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ galaxy_admin_user_private_role = test_db_util.get_galaxy_private_role( galaxy_admin_user )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_create_and_populate_column_repository( self ):
+ """Create a category for this test suite and add repositories to it."""
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name=column_repository_name,
+ description=column_repository_description,
+ long_description=column_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository,
+ 'column_maker/column_maker.tar',
+ strings_displayed=[],
+ commit_message='Uploaded column_maker.tar.' )
+ def test_0010_create_and_populate_convert_repository( self ):
+ '''Create and populate the convert_chars repository.'''
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name=convert_repository_name,
+ description=convert_repository_description,
+ long_description=convert_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository,
+ 'convert_chars/convert_chars.tar',
+ strings_displayed=[],
+ commit_message='Uploaded convert_chars.tar.' )
+ def test_0015_install_and_uninstall_column_repository( self ):
+ '''Install and uninstall the column_maker repository.'''
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ self.install_repository( column_repository_name,
+ common.test_user_1_name,
+ category_name,
+ install_tool_dependencies=False,
+ install_repository_dependencies=True,
+ new_tool_panel_section='column_maker',
+ strings_not_displayed=[ 'install_repository_dependencies' ] )
+ installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name, common.test_user_1_name )
+ self.uninstall_repository( installed_column_repository, remove_from_disk=True )
+ def test_0020_upload_dependency_xml( self ):
+ '''Upload a repository_dependencies.xml file to column_maker that specifies convert_chars.'''
+ convert_repository = test_db_util.get_repository_by_name_and_owner( convert_repository_name, common.test_user_1_name )
+ column_repository = test_db_util.get_repository_by_name_and_owner( column_repository_name, common.test_user_1_name )
+ repository_dependencies_path = self.generate_temp_path( 'test_1085', additional_paths=[ 'column' ] )
+ self.create_repository_dependency( column_repository, depends_on=[ convert_repository ], filepath=repository_dependencies_path )
+ def test_0025_verify_repository_dependency( self ):
+ '''Verify that the new revision of column_maker now depends on convert_chars.'''
+ convert_repository = test_db_util.get_repository_by_name_and_owner( convert_repository_name, common.test_user_1_name )
+ column_repository = test_db_util.get_repository_by_name_and_owner( column_repository_name, common.test_user_1_name )
+ self.check_repository_dependency( column_repository, convert_repository )
+ log.debug( [ repository.id for repository in test_db_util.get_all_installed_repositories() ] )
+ def test_0030_reinstall_column_repository( self ):
+ '''Reinstall column_maker and verify that it now shows repository dependencies.'''
+ installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name, common.test_user_1_name )
+ convert_repository = test_db_util.get_repository_by_name_and_owner( convert_repository_name, common.test_user_1_name )
+ strings_displayed=[ 'Handle repository dependencies', convert_repository.name, self.get_repository_tip( convert_repository ) ]
+ # Due to twill's limitations, only check for strings on the (redirected) reselect tool panel section page, don't actually reinstall.
+ url = '/admin_toolshed/browse_repositories?operation=activate+or+reinstall&id=%s' % self.security.encode_id( installed_column_repository.id )
+ self.visit_galaxy_url( url )
+ self.check_for_strings( strings_displayed )
+ uninstalled_repositories = [ ( column_repository_name, common.test_user_1_name ) ]
+ self.verify_installed_uninstalled_repositories( uninstalled_repositories=uninstalled_repositories, installed_repositories=[] )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Properly handle updates which have become available for tool shed repositories while they were ninstalled when reinstalling them.
by Bitbucket 16 Jan '13
by Bitbucket 16 Jan '13
16 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e6302ee56ed0/
changeset: e6302ee56ed0
user: greg
date: 2013-01-16 21:39:22
summary: Properly handle updates which have become available for tool shed repositories while they were ninstalled when reinstalling them.
affected #: 8 files
diff -r f199b236ceb08e9588351223b6277861e9f87325 -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -596,8 +596,7 @@
# In this case, a record for the repository will exist in the database with the status of 'New'.
repository = suc.get_repository_for_dependency_relationship( trans.app, tool_shed_url, name, repository_owner, changeset_revision )
if repository and repository.metadata:
- installed_rd, missing_rd = \
- get_installed_and_missing_repository_dependencies( trans, repository )
+ installed_rd, missing_rd = get_installed_and_missing_repository_dependencies( trans, repository )
else:
installed_rd, missing_rd = get_installed_and_missing_repository_dependencies_for_new_install( trans, repo_info_tuple )
# Discover all repository dependencies and retrieve information for installing them.
diff -r f199b236ceb08e9588351223b6277861e9f87325 -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -66,7 +66,7 @@
tool_dependencies[ dependency_key ] = requirements_dict
return tool_dependencies
def build_readme_files_dict( metadata, tool_path=None ):
- """Return a dictionary of valid readme file name <-> readme file content pairs for all readme files contained in the received repository_metadata."""
+ """Return a dictionary of valid readme file name <-> readme file content pairs for all readme files contained in the received metadata."""
readme_files_dict = {}
if metadata:
if 'readme_files' in metadata:
@@ -128,10 +128,14 @@
containers_dict[ 'readme_files' ] = readme_files_root_folder
# Installed repository dependencies container.
if repository_dependencies:
+ if new_install:
+ label = 'Repository dependencies'
+ else:
+ label = 'Installed repository dependencies'
folder_id, repository_dependencies_root_folder = container_util.build_repository_dependencies_folder( trans=trans,
folder_id=folder_id,
repository_dependencies=repository_dependencies,
- label='Installed repository dependencies',
+ label=label,
installed=True )
containers_dict[ 'repository_dependencies' ] = repository_dependencies_root_folder
# Missing repository dependencies container.
@@ -777,17 +781,20 @@
sa_session.flush()
return tool_shed_repository
def create_repo_info_dict( trans, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_name=None, repository=None,
- repository_metadata=None, metadata=None, repository_dependencies=None ):
+ repository_metadata=None, tool_dependencies=None, repository_dependencies=None ):
"""
Return a dictionary that includes all of the information needed to install a repository into a local Galaxy instance. The dictionary will also
contain the recursive list of repository dependencies defined for the repository, as well as the defined tool dependencies.
- This method is called from Galaxy in two places:
- 1. During the tool shed repository installation process (via the tool shed's get_repository_information() method)- in this case both the received
- repository and repository_metadata will be objects.
- 2. When a tool shed repository that was uninstalled from a Galaxy instance is being re-installed - in this case, both repository and
- repository_metadata will be None, but metadata will be the tool_shed_repository metadata on the Galaxy side, and the repository_dependencies will
- be an object previously retrieved from the tool shed.
+ This method is called from Galaxy unser three scenarios:
+ 1. During the tool shed repository installation process via the tool shed's get_repository_information() method. In this case both the received
+ repository and repository_metadata will be objects., but tool_dependencies and repository_dependencies will be None
+ 2. When a tool shed repository that was uninstalled from a Galaxy instance is being reinstalled with no updates available. In this case, both
+ repository and repository_metadata will be None, but tool_dependencies and repository_dependencies will be objects previously retrieved from the
+ tool shed if the repository includes definitions for them.
+ 3. When a tool shed repository that was uninstalled from a Galaxy instance is being reinstalled with updates available. In this case, this
+ method is reached via the tool shed's get_updated_repository_information() method, and both repository and repository_metadata will be objects
+ but tool_dependencies and repository_dependencies will be None.
"""
repo_info_dict = {}
repository = get_repository_by_name_and_owner( trans, repository_name, repository_owner )
@@ -806,27 +813,24 @@
all_repository_dependencies=None,
handled_key_rd_dicts=None,
circular_repository_dependencies=None )
- if metadata:
- tool_dependencies = metadata.get( 'tool_dependencies', None )
- if tool_dependencies:
- new_tool_dependencies = {}
- for dependency_key, requirements_dict in tool_dependencies.items():
- if dependency_key in [ 'set_environment' ]:
- new_set_environment_dict_list = []
- for set_environment_dict in requirements_dict:
- set_environment_dict[ 'repository_name' ] = repository_name
- set_environment_dict[ 'repository_owner' ] = repository_owner
- set_environment_dict[ 'changeset_revision' ] = changeset_revision
- new_set_environment_dict_list.append( set_environment_dict )
- new_tool_dependencies[ dependency_key ] = new_set_environment_dict_list
- else:
- requirements_dict[ 'repository_name' ] = repository_name
- requirements_dict[ 'repository_owner' ] = repository_owner
- requirements_dict[ 'changeset_revision' ] = changeset_revision
- new_tool_dependencies[ dependency_key ] = requirements_dict
- tool_dependencies = new_tool_dependencies
- else:
- tool_dependencies = None
+ tool_dependencies = metadata.get( 'tool_dependencies', None )
+ if tool_dependencies:
+ new_tool_dependencies = {}
+ for dependency_key, requirements_dict in tool_dependencies.items():
+ if dependency_key in [ 'set_environment' ]:
+ new_set_environment_dict_list = []
+ for set_environment_dict in requirements_dict:
+ set_environment_dict[ 'repository_name' ] = repository_name
+ set_environment_dict[ 'repository_owner' ] = repository_owner
+ set_environment_dict[ 'changeset_revision' ] = changeset_revision
+ new_set_environment_dict_list.append( set_environment_dict )
+ new_tool_dependencies[ dependency_key ] = new_set_environment_dict_list
+ else:
+ requirements_dict[ 'repository_name' ] = repository_name
+ requirements_dict[ 'repository_owner' ] = repository_owner
+ requirements_dict[ 'changeset_revision' ] = changeset_revision
+ new_tool_dependencies[ dependency_key ] = requirements_dict
+ tool_dependencies = new_tool_dependencies
# Cast unicode to string.
repo_info_dict[ str( repository.name ) ] = ( str( repository.description ),
str( repository_clone_url ),
diff -r f199b236ceb08e9588351223b6277861e9f87325 -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -1406,7 +1406,7 @@
a local Galaxy instance.
"""
includes_tools = False
- includes_repository_dependencies = False
+ has_repository_dependencies = False
includes_tool_dependencies = False
repo_info_dicts = []
for tup in zip( util.listify( repository_ids ), util.listify( changeset_revisions ) ):
@@ -1417,8 +1417,8 @@
metadata = repository_metadata.metadata
if not includes_tools and 'tools' in metadata:
includes_tools = True
- if not includes_repository_dependencies and 'repository_dependencies' in metadata:
- includes_repository_dependencies = True
+ if not has_repository_dependencies and 'repository_dependencies' in metadata:
+ has_repository_dependencies = True
if not includes_tool_dependencies and 'tool_dependencies' in metadata:
includes_tool_dependencies = True
repo_dir = repository.repo_path( trans.app )
@@ -1431,11 +1431,12 @@
repository_owner=repository.user.username,
repository_name=repository.name,
repository=repository,
- metadata=None,
- repository_metadata=repository_metadata )
+ repository_metadata=repository_metadata,
+ tool_dependencies=None,
+ repository_dependencies=None )
repo_info_dicts.append( encoding_util.tool_shed_encode( repo_info_dict ) )
return dict( includes_tools=includes_tools,
- includes_repository_dependencies=includes_repository_dependencies,
+ has_repository_dependencies=has_repository_dependencies,
includes_tool_dependencies=includes_tool_dependencies,
repo_info_dicts=repo_info_dicts )
@web.json
@@ -1465,10 +1466,6 @@
def get_tool_dependencies( self, trans, **kwd ):
"""Handle a request from a Galaxy instance."""
params = util.Params( kwd )
- message = util.restore_text( params.get( 'message', '' ) )
- status = params.get( 'status', 'done' )
- # If the request originated with the UpdateManager, it will not include a galaxy_url.
- galaxy_url = kwd.get( 'galaxy_url', '' )
name = params.get( 'name', None )
owner = params.get( 'owner', None )
changeset_revision = params.get( 'changeset_revision', None )
@@ -1478,10 +1475,8 @@
break
metadata = downloadable_revision.metadata
tool_dependencies = metadata.get( 'tool_dependencies', '' )
- from_install_manager = kwd.get( 'from_install_manager', False )
- if from_install_manager:
- if tool_dependencies:
- return encoding_util.tool_shed_encode( tool_dependencies )
+ if tool_dependencies:
+ return encoding_util.tool_shed_encode( tool_dependencies )
return ''
@web.expose
def get_tool_versions( self, trans, **kwd ):
@@ -1506,6 +1501,53 @@
if tool_version_dicts:
return json.to_json_string( tool_version_dicts )
return ''
+ @web.json
+ def get_updated_repository_information( self, trans, name, owner, changeset_revision, **kwd ):
+ """Generate a disctionary that contains the information about a repository that is necessary for installing it into a local Galaxy instance."""
+ repository = suc.get_repository_by_name_and_owner( trans, name, owner )
+ repository_id = trans.security.encode_id( repository.id )
+ repository_clone_url = suc.generate_clone_url_for_repository_in_tool_shed( trans, repository )
+ repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, repository_id, changeset_revision )
+ repo_dir = repository.repo_path( trans.app )
+ repo = hg.repository( suc.get_configured_ui(), repo_dir )
+ ctx = suc.get_changectx_for_changeset( repo, changeset_revision )
+ repo_info_dict = suc.create_repo_info_dict( trans=trans,
+ repository_clone_url=repository_clone_url,
+ changeset_revision=changeset_revision,
+ ctx_rev=str( ctx.rev() ),
+ repository_owner=repository.user.username,
+ repository_name=repository.name,
+ repository=repository,
+ repository_metadata=repository_metadata,
+ tool_dependencies=None,
+ repository_dependencies=None )
+ metadata = repository_metadata.metadata
+ if metadata:
+ readme_files_dict = suc.build_readme_files_dict( metadata )
+ if 'tools' in metadata:
+ includes_tools = True
+ else:
+ includes_tools = False
+ else:
+ readme_files_dict = None
+ includes_tools = False
+ # See if the repo_info_dict was populated with repository_dependencies or tool_dependencies.
+ for name, repo_info_tuple in repo_info_dict.items():
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
+ suc.get_repo_info_tuple_contents( repo_info_tuple )
+ if repository_dependencies:
+ has_repository_dependencies = True
+ else:
+ has_repository_dependencies = False
+ if tool_dependencies:
+ includes_tool_dependencies = True
+ else:
+ includes_tool_dependencies = False
+ return dict( includes_tools=includes_tools,
+ has_repository_dependencies=has_repository_dependencies,
+ includes_tool_dependencies=includes_tool_dependencies,
+ readme_files_dict=readme_files_dict,
+ repo_info_dict=repo_info_dict )
def get_versions_of_tool( self, trans, repository, repository_metadata, guid ):
"""Return the tool lineage in descendant order for the received guid contained in the received repsitory_metadata.tool_versions."""
encoded_id = trans.security.encode_id( repository.id )
diff -r f199b236ceb08e9588351223b6277861e9f87325 -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 lib/galaxy/webapps/community/util/container_util.py
--- a/lib/galaxy/webapps/community/util/container_util.py
+++ b/lib/galaxy/webapps/community/util/container_util.py
@@ -485,10 +485,14 @@
sub_folder.repository_dependencies.append( repository_dependency )
for repository_dependency in rd_value:
if trans.webapp.name == 'galaxy':
- # We have two extra items in the tuple, repository.id and repository.status.
- tool_shed_repository_id = repository_dependency[ 4 ]
- installation_status = repository_dependency[ 5 ]
- repository_dependency = repository_dependency[ 0:4 ]
+ if len( repository_dependency ) == 6:
+ # We have two extra items in the tuple, repository.id and repository.status.
+ tool_shed_repository_id = repository_dependency[ 4 ]
+ installation_status = repository_dependency[ 5 ]
+ repository_dependency = repository_dependency[ 0:4 ]
+ else:
+ tool_shed_repository_id = None
+ installation_status = 'unknown'
else:
tool_shed_repository_id = None
installation_status = None
diff -r f199b236ceb08e9588351223b6277861e9f87325 -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 lib/galaxy/webapps/galaxy/controllers/admin.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin.py
@@ -711,8 +711,7 @@
tool_dependencies_dict = {}
repository_name = elem.get( 'name' )
changeset_revision = elem.get( 'changeset_revision' )
- url = '%s/repository/get_tool_dependencies?name=%s&owner=devteam&changeset_revision=%s&from_install_manager=True' % \
- ( tool_shed_url, repository_name, changeset_revision )
+ url = '%s/repository/get_tool_dependencies?name=%s&owner=devteam&changeset_revision=%s' % ( tool_shed_url, repository_name, changeset_revision )
response = urllib2.urlopen( url )
text = response.read()
response.close()
diff -r f199b236ceb08e9588351223b6277861e9f87325 -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -374,21 +374,41 @@
if repository.uninstalled:
# Since we're reinstalling the repository we need to find the latest changeset revision to which it can be updated so that we
# can reset the metadata if necessary. This will ensure that information about repository dependencies and tool dependencies
- # will be current.
+ # will be current. Only allow selecting a different section in the tool panel if the repository was uninstalled.
current_changeset_revision, current_ctx_rev, includes_tools, has_repository_dependencies = \
shed_util.get_update_to_changeset_revision_and_ctx_rev( trans, repository )
if current_ctx_rev == repository.ctx_rev:
- includes_tools = repository.includes_tools
- has_repository_dependencies = repository.has_repository_dependencies
- if includes_tools or has_repository_dependencies:
- # Only allow selecting a different section in the tool panel if the repository was uninstalled.
- return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
- action='reselect_tool_panel_section',
- **kwd ) )
+ # The uninstalled repository is current.
+ if repository.includes_tools or repository.has_repository_dependencies:
+ return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
+ action='reselect_tool_panel_section',
+ **kwd ) )
+ else:
+ return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
+ action='reinstall_repository',
+ **kwd ) )
else:
- return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
- action='reinstall_repository',
- **kwd ) )
+ # The uninstalled repository has updates available in the tool shed.
+ updated_repo_info_dict = self.get_updated_repository_information( trans=trans,
+ repository_id=trans.security.encode_id( repository.id ),
+ repository_name=repository.name,
+ repository_owner=repository.owner,
+ changeset_revision=current_changeset_revision )
+ has_repository_dependencies = updated_repo_info_dict.get( 'has_repository_dependencies', False )
+ includes_tool_dependencies = updated_repo_info_dict.get( 'includes_tool_dependencies', False )
+ if has_repository_dependencies or includes_tool_dependencies:
+ json_repo_info_dict = json.to_json_string( updated_repo_info_dict )
+ encoded_repo_info_dict = encoding_util.tool_shed_encode( json_repo_info_dict )
+ kwd[ 'latest_changeset_revision' ] = current_changeset_revision
+ kwd[ 'latest_ctx_rev' ] = current_ctx_rev
+ kwd[ 'updated_repo_info_dict' ] = encoded_repo_info_dict
+ return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
+ action='reselect_tool_panel_section',
+ **kwd ) )
+ else:
+ return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
+ action='reinstall_repository',
+ **kwd ) )
else:
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
action='activate_repository',
@@ -581,6 +601,45 @@
else:
text = ''
return text
+ @web.expose
+ @web.require_admin
+ def get_tool_dependencies( self, trans, repository_id, repository_name, repository_owner, changeset_revision ):
+ """
+ Send a request to the appropriate tool shed to retrieve the dictionary of tool dependencies defined for the received repository name,
+ owner and changeset revision. The received repository_id is the encoded id of the installed tool shed repository in Galaxy. We need
+ it so that we can derive the tool shed from which it was installed.
+ """
+ repository = suc.get_installed_tool_shed_repository( trans, repository_id )
+ tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository )
+ url = suc.url_join( tool_shed_url,
+ 'repository/get_tool_dependencies?name=%s&owner=%s&changeset_revision=%s' % \
+ ( repository_name, repository_owner, changeset_revision ) )
+ response = urllib2.urlopen( url )
+ raw_text = response.read()
+ response.close()
+ if len( raw_text ) > 2:
+ encoded_text = json.from_json_string( raw_text )
+ text = encoding_util.tool_shed_decode( encoded_text )
+ else:
+ text = ''
+ return text
+ @web.expose
+ @web.require_admin
+ def get_updated_repository_information( self, trans, repository_id, repository_name, repository_owner, changeset_revision ):
+ """
+ Send a request to the appropriate tool shed to retrieve the dictionary of information required to reinstall an updated revision of an
+ uninstalled tool shed repository.
+ """
+ repository = suc.get_installed_tool_shed_repository( trans, repository_id )
+ tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository )
+ url = suc.url_join( tool_shed_url,
+ 'repository/get_updated_repository_information?name=%s&owner=%s&changeset_revision=%s' % \
+ ( repository_name, repository_owner, changeset_revision ) )
+ response = urllib2.urlopen( url )
+ raw_text = response.read()
+ response.close()
+ repo_information_dict = json.from_json_string( raw_text )
+ return repo_information_dict
def get_versions_of_tool( self, app, guid ):
tool_version = shed_util.get_tool_version( app, guid )
return tool_version.get_version_ids( app, reverse=True )
@@ -1149,7 +1208,7 @@
status = kwd.get( 'status', 'done' )
tool_shed_url = kwd[ 'tool_shed_url' ]
# Handle repository dependencies.
- includes_repository_dependencies = util.string_as_bool( kwd.get( 'includes_repository_dependencies', False ) )
+ has_repository_dependencies = util.string_as_bool( kwd.get( 'has_repository_dependencies', False ) )
install_repository_dependencies = kwd.get( 'install_repository_dependencies', '' )
# Every repository will be installed into the same tool panel section or all will be installed outside of any sections.
new_tool_panel_section = kwd.get( 'new_tool_panel_section', '' )
@@ -1173,12 +1232,12 @@
response.close()
repo_information_dict = json.from_json_string( raw_text )
includes_tools = util.string_as_bool( repo_information_dict.get( 'includes_tools', False ) )
- includes_repository_dependencies = util.string_as_bool( repo_information_dict.get( 'includes_repository_dependencies', False ) )
+ has_repository_dependencies = util.string_as_bool( repo_information_dict.get( 'has_repository_dependencies', False ) )
includes_tool_dependencies = util.string_as_bool( repo_information_dict.get( 'includes_tool_dependencies', False ) )
encoded_repo_info_dicts = util.listify( repo_information_dict.get( 'repo_info_dicts', [] ) )
repo_info_dicts = [ encoding_util.tool_shed_decode( encoded_repo_info_dict ) for encoded_repo_info_dict in encoded_repo_info_dicts ]
- if ( not includes_tools and not includes_repository_dependencies ) or \
- ( ( includes_tools or includes_repository_dependencies ) and kwd.get( 'select_tool_panel_section_button', False ) ):
+ if ( not includes_tools and not has_repository_dependencies ) or \
+ ( ( includes_tools or has_repository_dependencies ) and kwd.get( 'select_tool_panel_section_button', False ) ):
install_repository_dependencies = CheckboxField.is_checked( install_repository_dependencies )
if includes_tools:
shed_tool_conf = kwd[ 'shed_tool_conf' ]
@@ -1241,7 +1300,7 @@
for tsr in created_or_updated_tool_shed_repositories:
tool_panel_section_keys.append( tool_panel_section_key )
new_kwd = dict( includes_tools=includes_tools,
- includes_repository_dependencies=includes_repository_dependencies,
+ has_repository_dependencies=has_repository_dependencies,
install_repository_dependencies=install_repository_dependencies,
includes_tool_dependencies=includes_tool_dependencies,
install_tool_dependencies=install_tool_dependencies,
@@ -1331,7 +1390,7 @@
includes_tools=includes_tools,
includes_tool_dependencies=includes_tool_dependencies,
install_tool_dependencies_check_box=install_tool_dependencies_check_box,
- includes_repository_dependencies=includes_repository_dependencies,
+ has_repository_dependencies=has_repository_dependencies,
install_repository_dependencies_check_box=install_repository_dependencies_check_box,
new_tool_panel_section=new_tool_panel_section,
containers_dict=containers_dict,
@@ -1364,7 +1423,7 @@
tool_panel_section_key = None
tool_panel_section_keys = []
metadata = tool_shed_repository.metadata
- # Keep track of tool dependencies define dfor the current repository or those defined for any of it's repository dependencies.
+ # Keep track of tool dependencies defined for the current repository or those defined for any of it's repository dependencies.
includes_tool_dependencies = tool_shed_repository.includes_tool_dependencies
if tool_shed_repository.includes_tools:
# Handle the selected tool panel location for loading tools included in the tool shed repository.
@@ -1381,7 +1440,7 @@
tool_shed_repository.installed_changeset_revision,
tool_shed_repository.ctx_rev,
repository_clone_url,
- tool_shed_repository.metadata,
+ metadata,
trans.model.ToolShedRepository.installation_status.NEW,
tool_shed_repository.installed_changeset_revision,
tool_shed_repository.owner,
@@ -1402,6 +1461,10 @@
changeset_revision=tool_shed_repository.changeset_revision )
else:
repository_dependencies = None
+ if metadata:
+ tool_dependencies = metadata.get( 'tool_dependencies', None )
+ else:
+ tool_dependencies = None
repo_info_dict = suc.create_repo_info_dict( trans=trans,
repository_clone_url=repository_clone_url,
changeset_revision=tool_shed_repository.changeset_revision,
@@ -1410,15 +1473,15 @@
repository_name=tool_shed_repository.name,
repository=None,
repository_metadata=None,
- metadata=metadata,
+ tool_dependencies=tool_dependencies,
repository_dependencies=repository_dependencies )
repo_info_dicts.append( repo_info_dict )
# Make sure all tool_shed_repository records exist.
created_or_updated_tool_shed_repositories, tool_panel_section_keys, repo_info_dicts, filtered_repo_info_dicts, message = \
- shed_util.create_repository_dependency_objects( trans,
- tool_path,
- tool_shed_url,
- repo_info_dicts,
+ shed_util.create_repository_dependency_objects( trans=trans,
+ tool_path=tool_path,
+ tool_shed_url=tool_shed_url,
+ repo_info_dicts=repo_info_dicts,
reinstalling=True,
install_repository_dependencies=install_repository_dependencies,
no_changes_checked=no_changes_checked,
@@ -1472,40 +1535,62 @@
@web.expose
@web.require_admin
def reselect_tool_panel_section( self, trans, **kwd ):
- """Select or change the tool panel section to contain the tools included in the tool shed repositories being reinstalled."""
+ """
+ Select or change the tool panel section to contain the tools included in the tool shed repository being reinstalled. If there are updates
+ available for the repository in the tool shed, the tool_dependencies and repository_dependencies associated with the updated changeset revision
+ will have been retrieved from the tool shed and passed in the received kwd. In this case, the stored tool shed repository metqdata from the
+ Galaxy database will not be used since it is outdated.
+ """
message = ''
- repository_id = kwd[ 'id' ]
+ repository_id = kwd.get( 'id', None )
+ latest_changeset_revision = kwd.get( 'latest_changeset_revision', None )
+ latest_ctx_rev = kwd.get( 'latest_ctx_rev', None )
tool_shed_repository = suc.get_installed_tool_shed_repository( trans, repository_id )
+ repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, tool_shed_repository )
metadata = tool_shed_repository.metadata
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, tool_shed_repository )
- ctx_rev = suc.get_ctx_rev( tool_shed_url, tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision )
- repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, tool_shed_repository )
tool_path, relative_install_dir = tool_shed_repository.get_tool_relative_path( trans.app )
- repository_dependencies = self.get_repository_dependencies( trans=trans,
- repository_id=repository_id,
- repository_name=tool_shed_repository.name,
- repository_owner=tool_shed_repository.owner,
- changeset_revision=tool_shed_repository.changeset_revision )
- if repository_dependencies:
- includes_repository_dependencies = True
+ if latest_changeset_revision and latest_ctx_rev:
+ # There are updates available in the tool shed for the repository, so use the receieved dependency information which was retrieved from
+ # the tool shed.
+ encoded_updated_repo_info_dict = kwd.get( 'updated_repo_info_dict', None )
+ updated_repo_info_dict = encoding_util.tool_shed_decode( encoded_updated_repo_info_dict )
+ readme_files_dict = updated_repo_info_dict.get( 'readme_files_dict', None )
+ includes_tools = updated_repo_info_dict.get( 'includes_tools', False )
+ has_repository_dependencies = updated_repo_info_dict.get( 'has_repository_dependencies', False )
+ includes_tool_dependencies = updated_repo_info_dict.get( 'includes_tool_dependencies', False )
+ repo_info_dict = updated_repo_info_dict[ 'repo_info_dict' ]
else:
- includes_repository_dependencies = False
- includes_tool_dependencies = tool_shed_repository.includes_tool_dependencies
- repo_info_dict = suc.create_repo_info_dict( trans=trans,
- repository_clone_url=repository_clone_url,
- changeset_revision=tool_shed_repository.changeset_revision,
- ctx_rev=ctx_rev,
- repository_owner=tool_shed_repository.owner,
- repository_name=tool_shed_repository.name,
- repository=None,
- repository_metadata=None,
- metadata=metadata,
- repository_dependencies=repository_dependencies )
- if includes_repository_dependencies:
- # Discover all repository dependencies and retrieve information for installing them.
- required_repo_info_dicts = shed_util.get_required_repo_info_dicts( tool_shed_url, util.listify( repo_info_dict ) )
+ # There are no updates available from the tool shed for the repository, so use it's locally stored metadata.
+ if metadata:
+ readme_files_dict = suc.build_readme_files_dict( metadata )
+ tool_dependencies = metadata.get( 'tool_dependencies', None )
+ else:
+ readme_files_dict = None
+ tool_dependencies = None
+ includes_tool_dependencies = tool_shed_repository.includes_tool_dependencies
+ repository_dependencies = self.get_repository_dependencies( trans=trans,
+ repository_id=repository_id,
+ repository_name=tool_shed_repository.name,
+ repository_owner=tool_shed_repository.owner,
+ changeset_revision=tool_shed_repository.changeset_revision )
+ repo_info_dict = suc.create_repo_info_dict( trans=trans,
+ repository_clone_url=repository_clone_url,
+ changeset_revision=tool_shed_repository.changeset_revision,
+ ctx_rev=tool_shed_repository.ctx_rev,
+ repository_owner=tool_shed_repository.owner,
+ repository_name=tool_shed_repository.name,
+ repository=None,
+ repository_metadata=None,
+ tool_dependencies=tool_dependencies,
+ repository_dependencies=repository_dependencies )
+ repository_name, repository_owner, changeset_revision, includes_tool_dependencies, installed_repository_dependencies, \
+ missing_repository_dependencies, installed_tool_dependencies, missing_tool_dependencies = \
+ shed_util.get_dependencies_for_repository( trans, tool_shed_url, repo_info_dict, includes_tool_dependencies )
+ if installed_repository_dependencies or missing_repository_dependencies:
+ has_repository_dependencies = True
else:
- required_repo_info_dicts = None
+ has_repository_dependencies = False
# Get the location in the tool panel in which the tool was originally loaded.
if 'tool_panel_section' in metadata:
tool_panel_dict = metadata[ 'tool_panel_section' ]
@@ -1533,14 +1618,14 @@
message += "The tools contained in your <b>%s</b> repository were last loaded into the tool panel outside of any sections. " % tool_shed_repository.name
message += "Uncheck the <b>No changes</b> check box and select a tool panel section to load the tools into that section. "
status = 'warning'
- # Populate the containers_dict from the metadata for the tool shed repository we're reinstalling, but make sure to include tool dependencies defined for
- # all of the repository's repository dependencies.
- containers_dict = shed_util.populate_containers_dict_from_repository_metadata( trans=trans,
- tool_shed_url=tool_shed_url,
- tool_path=tool_path,
- repository=tool_shed_repository,
- reinstalling=True,
- required_repo_info_dicts=required_repo_info_dicts )
+ containers_dict = shed_util.populate_containers_dict_for_new_install( trans=trans,
+ tool_shed_url=tool_shed_url,
+ tool_path=tool_path,
+ readme_files_dict=readme_files_dict,
+ installed_repository_dependencies=installed_repository_dependencies,
+ missing_repository_dependencies=missing_repository_dependencies,
+ installed_tool_dependencies=installed_tool_dependencies,
+ missing_tool_dependencies=missing_tool_dependencies )
# Since we're reinstalling we'll merge the list of missing repository dependencies into the list of installed repository dependencies since each displayed
# repository dependency will display a status, whether installed or missing.
containers_dict = suc.merge_missing_repository_dependencies_to_installed_container( containers_dict )
@@ -1561,7 +1646,7 @@
no_changes_check_box=no_changes_check_box,
original_section_name=original_section_name,
includes_tool_dependencies=includes_tool_dependencies,
- includes_repository_dependencies=includes_repository_dependencies,
+ has_repository_dependencies=has_repository_dependencies,
install_repository_dependencies_check_box=install_repository_dependencies_check_box,
install_tool_dependencies_check_box=install_tool_dependencies_check_box,
containers_dict=containers_dict,
diff -r f199b236ceb08e9588351223b6277861e9f87325 -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
--- a/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
+++ b/templates/admin/tool_shed_repository/reselect_tool_panel_section.mako
@@ -33,7 +33,7 @@
${render_readme_section( containers_dict )}
<div style="clear: both"></div>
%endif
- %if includes_repository_dependencies or includes_tool_dependencies:
+ %if has_repository_dependencies or includes_tool_dependencies:
<div class="form-row"><table class="colored" width="100%"><th bgcolor="#EBD9B2">Confirm dependency installation</th>
diff -r f199b236ceb08e9588351223b6277861e9f87325 -r e6302ee56ed03e4cc9f95ff1720b08721ced5600 templates/admin/tool_shed_repository/select_tool_panel_section.mako
--- a/templates/admin/tool_shed_repository/select_tool_panel_section.mako
+++ b/templates/admin/tool_shed_repository/select_tool_panel_section.mako
@@ -17,10 +17,10 @@
<%
# Handle the case where an uninstalled repository encountered errors during the process of being reinstalled. In
- # this case, the repository metadata is an empty dictionary, but one or both of includes_repository_dependencies
+ # this case, the repository metadata is an empty dictionary, but one or both of has_repository_dependencies
# and includes_tool_dependencies may be True. If either of these are True but we have no metadata, we cannot install
# repository dependencies on this pass.
- if includes_repository_dependencies:
+ if has_repository_dependencies:
repository_dependencies = containers_dict[ 'repository_dependencies' ]
missing_repository_dependencies = containers_dict[ 'missing_repository_dependencies' ]
if repository_dependencies or missing_repository_dependencies:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Fix missing import that was breaking unit tests.
by Bitbucket 16 Jan '13
by Bitbucket 16 Jan '13
16 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f199b236ceb0/
changeset: f199b236ceb0
user: inithello
date: 2013-01-16 21:14:36
summary: Fix missing import that was breaking unit tests.
affected #: 1 file
diff -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 -r f199b236ceb08e9588351223b6277861e9f87325 lib/galaxy/datatypes/tabular.py
--- a/lib/galaxy/datatypes/tabular.py
+++ b/lib/galaxy/datatypes/tabular.py
@@ -13,7 +13,7 @@
from galaxy.datatypes import metadata
from galaxy.datatypes.checkers import is_gzip
from galaxy.datatypes.metadata import MetadataElement
-from galaxy.datatypes.sniff import get_headers
+from galaxy.datatypes.sniff import get_headers, get_test_fname
from galaxy.util.json import to_json_string
log = logging.getLogger(__name__)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Tool shed functional test enhancements. Tests for installing repositories via the tool search. Tests for reviewing repository components.
by Bitbucket 16 Jan '13
by Bitbucket 16 Jan '13
16 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/3a2211dc42f1/
changeset: 3a2211dc42f1
user: inithello
date: 2013-01-16 19:19:45
summary: Tool shed functional test enhancements. Tests for installing repositories via the tool search. Tests for reviewing repository components.
affected #: 16 files
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/base/common.py
--- a/test/tool_shed/base/common.py
+++ b/test/tool_shed/base/common.py
@@ -8,6 +8,16 @@
test_user_1_email = 'test-1(a)bx.psu.edu'
test_user_1_name = 'user1'
+test_user_2 = None
+test_user_2_private_role = None
+test_user_2_email = 'test-2(a)bx.psu.edu'
+test_user_2_name = 'user2'
+
+test_user_3 = None
+test_user_3_private_role = None
+test_user_3_email = 'test-3(a)bx.psu.edu'
+test_user_3_name = 'user3'
+
new_repository_dependencies_xml = '''<?xml version="1.0"?><repositories${description}>
${dependency_lines}
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/base/test_db_util.py
--- a/test/tool_shed/base/test_db_util.py
+++ b/test/tool_shed/base/test_db_util.py
@@ -61,6 +61,17 @@
return sa_session.query( model.Repository ) \
.filter( model.Repository.table.c.id == repository_id ) \
.first()
+def get_repository_review_by_user_id_changeset_revision( user_id, repository_id, changeset_revision ):
+ review = sa_session.query( model.RepositoryReview ) \
+ .filter( and_( model.RepositoryReview.table.c.user_id == user_id,
+ model.RepositoryReview.table.c.repository_id == repository_id,
+ model.RepositoryReview.table.c.changeset_revision == changeset_revision ) ) \
+ .first()
+ return review
+def get_role_by_name( role_name ):
+ return sa_session.query( model.Role ) \
+ .filter( model.Role.table.c.name == role_name ) \
+ .first()
def get_user( email ):
return sa_session.query( model.User ) \
.filter( model.User.table.c.email==email ) \
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -35,11 +35,19 @@
self.galaxy_tool_dependency_dir = None # os.environ.get( 'GALAXY_TEST_TOOL_DEPENDENCY_DIR' )
self.shed_tools_dict = {}
self.home()
+ def add_repository_review_component( self, **kwd ):
+ url = '/repository_review/create_component?operation=create'
+ self.visit_url( url )
+ self.submit_form( 1, 'create_component_button', **kwd )
def browse_category( self, category, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/browse_valid_categories?sort=name&operation=valid_repositories_by_category&id=%s' % \
self.security.encode_id( category.id )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def browse_component_review( self, review, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository_review/browse_review?id=%s' % self.security.encode_id( review.id )
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def browse_repository( self, repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/browse_repository?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
@@ -173,6 +181,23 @@
self.submit_form( form_no=1, button="create_category_button", **kwd )
return test_db_util.get_category_by_name( kwd[ 'name' ] )
def create_checkbox_query_string( self, field_name, value ):
+ '''
+ From galaxy.web.form_builder.CheckboxField:
+ The hidden field is necessary because if the check box is not checked on the form, it will
+ not be included in the request params. The hidden field ensure that this will happen. When
+ parsing the request, the value 'true' in the hidden field actually means it is NOT checked.
+ See the is_checked() method below. The prefix is necessary in each case to ensure functional
+ correctness when the param is inside a conditional.
+
+ This may look strange upon initial inspection, but see the comments in the get_html() method
+ above for clarification. Basically, if value is not True, then it will always be a list with
+ 2 input fields ( a checkbox and a hidden field ) if the checkbox is checked. If it is not
+ checked, then value will be only the hidden field.
+
+ The create_checkbox_query_string method emulates the described behavior with URL query parameters.
+ This is currently necessary because twill does not correctly parse certain forms, so the test
+ method has to visit the intended form target "manually".
+ '''
field_value = str( value ).lower()
if value:
return '%s=%s&%s=%s' % ( field_name, field_value, field_name, field_value )
@@ -187,6 +212,27 @@
'repository_dependencies.xml',
filepath=filepath,
commit_message='Uploaded dependency on %s.' % ', '.join( repo.name for repo in depends_on ) )
+ def create_repository_review( self, repository, review_contents_dict, changeset_revision=None, copy_from=None):
+ strings_displayed = []
+ if not copy_from:
+ strings_displayed.append( 'Begin your review' )
+ strings_not_displayed = []
+ kwd = dict()
+ if not changeset_revision:
+ changeset_revision = self.get_repository_tip( repository )
+ url = '/repository_review/create_review?changeset_revision=%s&id=%s' % ( changeset_revision, self.security.encode_id( repository.id ) )
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+ strings_displayed = []
+ if copy_from:
+ old_changeset_revision, review_id = copy_from
+ strings_displayed = [ 'You have elected to create a new review', 'Select previous revision', changeset_revision ]
+ self.check_for_strings( strings_displayed )
+ strings_displayed = []
+ url = '/repository_review/create_review?changeset_revision=%s&id=%s&previous_review_id=%s' % \
+ ( self.get_repository_tip( repository ), self.security.encode_id( repository.id ), self.security.encode_id( review_id ) )
+ self.visit_url( url )
+ self.fill_review_form( review_contents_dict, strings_displayed, strings_not_displayed )
def create_user_in_galaxy( self, cntrller='user', email='test(a)bx.psu.edu', password='testuser', username='admin-user', redirect='' ):
self.visit_galaxy_url( "/user/create?cntrller=%s&use_panels=False" % cntrller )
tc.fv( '1', 'email', email )
@@ -293,6 +339,10 @@
url = '/repository/get_file_contents?file_path=%s' % os.path.join( relative_path, filename )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def display_reviewed_repositories_owned_by_user( self, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository_review/reviewed_repositories_i_own'
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def edit_repository_categories( self, repository, categories_to_add=[], categories_to_remove=[], restore_original=True ):
url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
@@ -317,6 +367,10 @@
strings_not_displayed.append( "selected>%s" % category )
tc.submit( "manage_categories_button" )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def display_repository_reviews_by_user( self, user, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository_review/repository_reviews_by_user?id=%s' % self.security.encode_id( user.id )
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def edit_repository_information( self, repository, **kwd ):
url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
@@ -343,6 +397,21 @@
else:
string = string.replace( character, replacement )
return string
+ def fill_review_form( self, review_contents_dict, strings_displayed=[], strings_not_displayed=[] ):
+ kwd = dict()
+ for label, contents in review_contents_dict.items():
+ strings_displayed.append( label )
+ if contents:
+ kwd[ '%s__ESEP__comment' % label ] = contents[ 'comment' ]
+ kwd[ '%s__ESEP__rating' % label ] = contents[ 'rating' ]
+ if 'private' in contents:
+ kwd[ '%s__ESEP__private' % label ] = contents[ 'private' ]
+ kwd[ '%s__ESEP__approved' % label ] = contents[ 'approved' ]
+ else:
+ kwd[ '%s__ESEP__approved' % label ] = 'not_applicable'
+ self.submit_form( 1, 'Workflows__ESEP__review_button', **kwd )
+ strings_displayed.append( 'Reviews were saved' )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def galaxy_login( self, email='test(a)bx.psu.edu', password='testuser', username='admin-user', redirect='' ):
previously_created, username_taken, invalid_username = \
self.create_user_in_galaxy( email=email, password=password, username=username, redirect=redirect )
@@ -409,7 +478,7 @@
raise Exception( "Entry for repository %s missing in hgweb config file %s." % ( lhs, self.hgweb_config_manager.hgweb_config ) )
def get_repository_changelog( self, repository ):
repo = hg.repository( ui.ui(), self.get_repo_path( repository ) )
- return [repo.changectx( changeset ) for changeset in repo.changelog ]
+ return [ ( repo.changectx( changeset ), changeset ) for changeset in repo.changelog ]
def get_repository_datatypes_count( self, repository ):
metadata = self.get_repository_metadata( repository )[0].metadata
if 'datatypes' not in metadata:
@@ -469,6 +538,22 @@
if include_invalid and 'invalid_tools' in repository_metadata.metadata:
invalid_tools.append( dict( tools=repository_metadata.metadata[ 'invalid_tools' ], changeset_revision=repository_metadata.changeset_revision ) )
return valid_tools, invalid_tools
+ def grant_role_to_user( self, user, role ):
+ strings_displayed = [ self.security.encode_id( role.id ), role.name ]
+ strings_not_displayed = []
+ self.visit_url( '/admin/roles' )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+ url = '/admin/roles?operation=manage+users+and+groups&id=%s' % self.security.encode_id( role.id )
+ self.visit_url( url )
+ strings_displayed = [ common.test_user_1_email, common.test_user_2_email ]
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+ # As elsewhere, twill limits the possibility of submitting the form, this time due to not executing the javascript
+ # attached to the role selection form. Visit the action url directly with the necessary parameters.
+ url = '/admin/manage_users_and_groups_for_role?id=%s&in_users=%d&operation=manage+users+and+groups&role_members_edit_button=Save' % \
+ ( self.security.encode_id( role.id ), user.id )
+ self.visit_url( url )
+ strings_displayed = [ "Role '%s' has been updated" % role.name ]
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def grant_write_access( self, repository, usernames=[], strings_displayed=[], strings_not_displayed=[] ):
self.display_manage_repository_page( repository )
tc.fv( "3", "allow_push", '-Select one' )
@@ -508,10 +593,38 @@
( ','.join( util.listify( repository_ids ) ), encoded_kwd, reinstalling )
self.visit_galaxy_url( url )
return util.listify( repository_ids )
+ def install_repositories_from_search_results( self, repositories, strings_displayed=[], strings_not_displayed=[], **kwd ):
+ '''
+ Normally, it would be possible to check the appropriate boxes in the search results, and click the install button. This works
+ in a browser, but Twill manages to lose the 'toolshedgalaxyurl' cookie between one page and the next, so it's necessary to work
+ around this by explicitly visiting the prepare_for_install method on the Galaxy side.
+ '''
+ url = '/admin_toolshed/prepare_for_install?tool_shed_url=%s&repository_ids=%s&changeset_revisions=%s' % \
+ ( self.url, ','.join( self.security.encode_id( repository.id ) for repository in repositories ), \
+ ','.join( self.get_repository_tip( repository ) for repository in repositories ) )
+ self.visit_galaxy_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+ if 'install_tool_dependencies' in self.last_page():
+ form = tc.browser.get_form( 'select_tool_panel_section' )
+ checkbox = form.find_control( id="install_tool_dependencies" )
+ checkbox.disabled = False
+ if 'install_tool_dependencies' in kwd:
+ install_tool_dependencies = kwd[ 'install_tool_dependencies' ]
+ del kwd[ 'install_tool_dependencies' ]
+ else:
+ install_tool_dependencies = False
+ if install_tool_dependencies:
+ checkbox.selected = True
+ else:
+ checkbox.selected = False
+ self.submit_form( 1, 'select_tool_panel_section_button', **kwd )
+ repository_ids = self.initiate_installation_process()
+ self.wait_for_repository_installation( repository_ids )
def install_repository( self, name, owner, category_name, install_tool_dependencies=False,
install_repository_dependencies=True, changeset_revision=None,
strings_displayed=[], strings_not_displayed=[], preview_strings_displayed=[],
- post_submit_strings_displayed=[], new_tool_panel_section=None, **kwd ):
+ post_submit_strings_displayed=[], new_tool_panel_section=None, includes_tools=True,
+ **kwd ):
self.browse_tool_shed( url=self.url )
self.browse_category( test_db_util.get_category_by_name( category_name ) )
self.preview_repository_in_tool_shed( name, owner, strings_displayed=preview_strings_displayed )
@@ -539,8 +652,9 @@
kwd[ 'shed_tool_conf' ] = self.shed_tool_conf
if new_tool_panel_section:
kwd[ 'new_tool_panel_section' ] = new_tool_panel_section
- self.submit_form( 1, 'select_tool_panel_section_button', **kwd )
- self.check_for_strings( post_submit_strings_displayed, strings_not_displayed )
+ if includes_tools:
+ self.submit_form( 1, 'select_tool_panel_section_button', **kwd )
+ self.check_for_strings( post_submit_strings_displayed, strings_not_displayed )
repository_ids = self.initiate_installation_process( new_tool_panel_section=new_tool_panel_section )
self.wait_for_repository_installation( repository_ids )
def load_invalid_tool_page( self, repository, tool_xml, changeset_revision, strings_displayed=[], strings_not_displayed=[] ):
@@ -563,6 +677,10 @@
( self.security.encode_id( metadata.id ), tool_shed_encode( workflow_name ) )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def manage_review_components( self, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository_review/manage_components'
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def preview_repository_in_tool_shed( self, name, owner, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
repository = test_db_util.get_repository_by_name_and_owner( name, owner )
if not changeset_revision:
@@ -587,31 +705,19 @@
install_repository_dependencies=True,
install_tool_dependencies=False,
no_changes=True,
- new_tool_panel_section='' ):
+ new_tool_panel_section='',
+ strings_displayed=[],
+ strings_not_displayed=[] ):
url = '/admin_toolshed/reselect_tool_panel_section?id=%s' % self.security.encode_id( installed_repository.id )
self.visit_galaxy_url( url )
- # From galaxy.web.form_builder.CheckboxField:
- # The hidden field is necessary because if the check box is not checked on the form, it will
- # not be included in the request params. The hidden field ensure that this will happen. When
- # parsing the request, the value 'true' in the hidden field actually means it is NOT checked.
- # See the is_checked() method below. The prefix is necessary in each case to ensure functional
- # correctness when the param is inside a conditional.
- #
- # This may look strange upon initial inspection, but see the comments in the get_html() method
- # above for clarification. Basically, if value is not True, then it will always be a list with
- # 2 input fields ( a checkbox and a hidden field ) if the checkbox is checked. If it is not
- # checked, then value will be only the hidden field.
- #
- # The create_checkbox_query_string method emulates the described behavior with URL query parameters.
- # This is currently necessary because twill does not correctly parse the reselect tool panel section
- # form, so the test method has to visit the intended form target "manually".
+ self.check_for_strings( strings_displayed, strings_not_displayed=[] )
repo_dependencies = self.create_checkbox_query_string( field_name='install_repository_dependencies', value=install_repository_dependencies )
tool_dependencies = self.create_checkbox_query_string( field_name='install_tool_dependencies', value=install_tool_dependencies )
encoded_repository_id = self.security.encode_id( installed_repository.id )
url = '/admin_toolshed/reinstall_repository?id=%s&%s&%s&no_changes=%s&new_tool_panel_section=%s' % \
( encoded_repository_id, repo_dependencies, tool_dependencies, str( no_changes ), new_tool_panel_section )
self.visit_galaxy_url( url )
- # Then manually initiate the install process, as with installing a repository. See comments in the
+ # Manually initiate the install process, as with installing a repository. See comments in the
# initiate_installation_process method for details.
repository_ids = self.initiate_installation_process( install_tool_dependencies,
install_repository_dependencies,
@@ -639,13 +745,28 @@
url = '/repository/reset_all_metadata?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
self.check_for_strings( [ 'All repository metadata has been reset.' ] )
+ def review_repository( self, repository, review_contents_dict, user=None, changeset_revision=None ):
+ strings_displayed = []
+ strings_not_displayed = []
+ kwd = dict()
+ if not changeset_revision:
+ changeset_revision = self.get_repository_tip( repository )
+ if user:
+ review = test_db_util.get_repository_review_by_user_id_changeset_revision( user.id, repository.id, changeset_revision )
+ url = '/repository_review/edit_review?id=%s' % self.security.encode_id( review.id )
+ self.visit_url( url )
+ self.fill_review_form( review_contents_dict, strings_displayed, strings_not_displayed )
def revoke_write_access( self, repository, username ):
url = '/repository/manage_repository?user_access_button=Remove&id=%s&remove_auth=%s' % \
( self.security.encode_id( repository.id ), username )
self.visit_url( url )
- def search_for_valid_tools( self, search_fields={}, exact_matches=False, strings_displayed=[], strings_not_displayed=[] ):
+ def search_for_valid_tools( self, search_fields={}, exact_matches=False, strings_displayed=[], strings_not_displayed=[], from_galaxy=False ):
+ if from_galaxy:
+ galaxy_url = '?galaxy_url=%s' % self.galaxy_url
+ else:
+ galaxy_url = ''
for field_name, search_string in search_fields.items():
- url = '/repository/find_tools'
+ url = '/repository/find_tools%s' % galaxy_url
self.visit_url( url )
tc.fv( "1", "exact_matches", exact_matches )
tc.fv( "1", field_name, search_string )
@@ -746,6 +867,17 @@
found = True
break
assert found, 'No entry for %s in %s.' % ( data_table, self.shed_tool_data_table_conf )
+ def verify_repository_reviews( self, repository, reviewer=None, strings_displayed=[], strings_not_displayed=[] ):
+ changeset_revision = self.get_repository_tip( repository )
+ # Verify that the currently logged in user has a repository review for the specified repository, reviewer, and changeset revision.
+ strings_displayed=[ repository.name, reviewer.username, changeset_revision ]
+ self.display_reviewed_repositories_owned_by_user( strings_displayed=strings_displayed )
+ # Verify that the reviewer has reviewed the specified repository's changeset revision.
+ strings_displayed=[ repository.name, repository.description, changeset_revision ]
+ self.display_repository_reviews_by_user( reviewer, strings_displayed=strings_displayed )
+ # Load the review and check for the components passed in strings_displayed.
+ review = test_db_util.get_repository_review_by_user_id_changeset_revision( reviewer.id, repository.id, changeset_revision )
+ self.browse_component_review( review, strings_displayed=strings_displayed )
def verify_tool_metadata_for_installed_repository( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
repository_id = self.security.encode_id( installed_repository.id )
for tool in installed_repository.metadata[ 'tools' ]:
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_0000_basic_repository_features.py
--- a/test/tool_shed/functional/test_0000_basic_repository_features.py
+++ b/test/tool_shed/functional/test_0000_basic_repository_features.py
@@ -6,7 +6,7 @@
repository_long_description = "Long description of Galaxy's filtering tool for test 0000"
class TestBasicRepositoryFeatures( ShedTwillTestCase ):
-
+ '''Test core repository features.'''
def test_0000_initiate_users( self ):
"""Create necessary user accounts and login as an admin user."""
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_0040_repository_circular_dependencies.py
--- a/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
+++ b/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
@@ -10,7 +10,7 @@
filtering_repository_long_description = "Long description of Galaxy's filtering tool"
class TestRepositoryCircularDependencies( ShedTwillTestCase ):
- '''Verify that the code correctly handles circular dependencies.'''
+ '''Verify that the code correctly displays repositories with circular repository dependencies.'''
def test_0000_initiate_users( self ):
"""Create necessary user accounts."""
self.logout()
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_0050_circular_dependencies_4_levels.py
--- a/test/tool_shed/functional/test_0050_circular_dependencies_4_levels.py
+++ b/test/tool_shed/functional/test_0050_circular_dependencies_4_levels.py
@@ -169,6 +169,12 @@
freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
bismark_repository = test_db_util.get_repository_by_name_and_owner( bismark_repository_name, common.test_user_1_name )
dependency_xml_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'freebayes' ] )
+ # convert_chars depends on column_maker
+ # column_maker depends on convert_chars
+ # emboss depends on emboss_datatypes
+ # emboss_datatypes depends on bismark
+ # freebayes depends on freebayes, emboss, emboss_datatypes, and column_maker
+ # filtering depends on emboss
self.create_repository_dependency( convert_repository, depends_on=[ column_repository ], filepath=dependency_xml_path )
self.create_repository_dependency( column_repository, depends_on=[ convert_repository ], filepath=dependency_xml_path )
self.create_repository_dependency( emboss_datatypes_repository, depends_on=[ bismark_repository ], filepath=dependency_xml_path )
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_0060_workflows.py
--- a/test/tool_shed/functional/test_0060_workflows.py
+++ b/test/tool_shed/functional/test_0060_workflows.py
@@ -8,6 +8,7 @@
workflow_name = 'Workflow for 0060_filter_workflow_repository'
class TestToolShedWorkflowFeatures( ShedTwillTestCase ):
+ '''Test valid and invalid workflows.'''
def test_0000_initiate_users( self ):
"""Create necessary user accounts and login as an admin user."""
self.logout()
@@ -39,7 +40,8 @@
workflow = file( self.get_filename( 'filtering_workflow/Workflow_for_0060_filter_workflow_repository.ga' ), 'r' ).read()
workflow = workflow.replace( '__TEST_TOOL_SHED_URL__', self.url.replace( 'http://', '' ) )
workflow_filepath = self.generate_temp_path( 'test_0060', additional_paths=[ 'filtering_workflow' ] )
- os.makedirs( workflow_filepath )
+ if not os.path.exists( workflow_filepath ):
+ os.makedirs( workflow_filepath )
file( os.path.join( workflow_filepath, workflow_filename ), 'w+' ).write( workflow )
self.upload_file( repository,
workflow_filename,
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_0090_tool_search.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0090_tool_search.py
@@ -0,0 +1,171 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+emboss_datatypes_repository_name = 'emboss_datatypes_0090'
+emboss_datatypes_repository_description = "Datatypes for emboss"
+emboss_datatypes_repository_long_description = "Long description of Emboss' datatypes"
+
+emboss_repository_name = 'emboss_0090'
+emboss_repository_description = "Galaxy's emboss tool"
+emboss_repository_long_description = "Long description of Galaxy's emboss tool"
+
+filtering_repository_name = 'filtering_0090'
+filtering_repository_description = "Galaxy's filtering tool"
+filtering_repository_long_description = "Long description of Galaxy's filtering tool"
+
+freebayes_repository_name = 'freebayes_0090'
+freebayes_repository_description = "Galaxy's freebayes tool"
+freebayes_repository_long_description = "Long description of Galaxy's freebayes tool"
+
+bwa_base_repository_name = 'bwa_base_0090'
+bwa_base_repository_description = "BWA Base"
+bwa_base_repository_long_description = "NT space mapping with BWA"
+
+bwa_color_repository_name = 'bwa_color_0090'
+bwa_color_repository_description = "BWA Color"
+bwa_color_repository_long_description = "Color space mapping with BWA"
+
+category_name = 'Test 0090 Tool Search And Installation'
+category_description = 'Test 0090 Tool Search And Installation'
+
+class TestRepositoryCircularDependenciesAgain( ShedTwillTestCase ):
+ '''Test more features related to repository dependencies.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_create_bwa_base_repository( self ):
+ '''Create and populate bwa_base_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name=bwa_base_repository_name,
+ description=bwa_base_repository_description,
+ long_description=bwa_base_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( repository,
+ 'bwa/bwa_base.tar',
+ strings_displayed=[],
+ commit_message='Uploaded bwa_base.tar.' )
+ def test_0010_create_bwa_color_repository( self ):
+ '''Create and populate bwa_color_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name=bwa_color_repository_name,
+ description=bwa_color_repository_description,
+ long_description=bwa_color_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( repository,
+ 'bwa/bwa_color.tar',
+ strings_displayed=[],
+ commit_message='Uploaded bwa_color.tar.' )
+ def test_0015_create_emboss_datatypes_repository( self ):
+ '''Create and populate emboss_datatypes_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name=emboss_datatypes_repository_name,
+ description=emboss_datatypes_repository_description,
+ long_description=emboss_datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( repository,
+ 'emboss/datatypes/datatypes_conf.xml',
+ strings_displayed=[],
+ commit_message='Uploaded datatypes_conf.xml.' )
+ def test_0020_create_emboss_repository( self ):
+ '''Create and populate emboss_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ repository = self.get_or_create_repository( name=emboss_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( repository,
+ 'emboss/emboss.tar',
+ strings_displayed=[],
+ commit_message='Uploaded tool tarball.' )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ repository_dependencies_path = self.generate_temp_path( 'test_0090', additional_paths=[ 'emboss' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Emboss depends on the emboss_datatypes repository.' )
+ self.upload_file( repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on emboss_datatypes.' )
+ def test_0025_create_filtering_repository( self ):
+ '''Create and populate filtering_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ filtering_repository = self.get_or_create_repository( name=filtering_repository_name,
+ description=filtering_repository_description,
+ long_description=filtering_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( filtering_repository,
+ 'filtering/filtering_1.1.0.tar',
+ strings_displayed=[],
+ commit_message='Uploaded filtering.tar.' )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ repository_dependencies_path = self.generate_temp_path( 'test_0090', additional_paths=[ 'filtering' ] )
+ self.generate_repository_dependency_xml( [ emboss_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Filtering depends on the emboss repository.' )
+ self.upload_file( filtering_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on emboss.' )
+ def test_0030_create_freebayes_repository( self ):
+ '''Create and populate freebayes_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ repository = self.get_or_create_repository( name=freebayes_repository_name,
+ description=freebayes_repository_description,
+ long_description=freebayes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( repository,
+ 'freebayes/freebayes.tar',
+ strings_displayed=[],
+ commit_message='Uploaded freebayes.tar.' )
+ def test_0035_create_and_upload_dependency_definitions( self ):
+ '''Create and upload repository dependency definitions.'''
+ bwa_color_repository = test_db_util.get_repository_by_name_and_owner( bwa_color_repository_name, common.test_user_1_name )
+ bwa_base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ dependency_xml_path = self.generate_temp_path( 'test_0090', additional_paths=[ 'freebayes' ] )
+ self.create_repository_dependency( emboss_repository, depends_on=[ emboss_datatypes_repository ], filepath=dependency_xml_path )
+ self.create_repository_dependency( filtering_repository, depends_on=[ freebayes_repository ], filepath=dependency_xml_path )
+ self.create_repository_dependency( bwa_base_repository, depends_on=[ emboss_repository ], filepath=dependency_xml_path )
+ self.create_repository_dependency( bwa_color_repository, depends_on=[ filtering_repository ], filepath=dependency_xml_path )
+ def test_0040_verify_repository_dependencies( self ):
+ '''Verify the generated dependency structure.'''
+ bwa_color_repository = test_db_util.get_repository_by_name_and_owner( bwa_color_repository_name, common.test_user_1_name )
+ bwa_base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ self.check_repository_dependency( emboss_repository, emboss_datatypes_repository )
+ self.check_repository_dependency( filtering_repository, freebayes_repository )
+ self.check_repository_dependency( bwa_base_repository, emboss_repository )
+ self.check_repository_dependency( bwa_color_repository, filtering_repository )
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_0400_repository_component_reviews.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0400_repository_component_reviews.py
@@ -0,0 +1,279 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+repository_name = 'filtering_0400'
+repository_description = 'Galaxy filtering tool for test 0400'
+repository_long_description = 'Long description of Galaxy filtering tool for test 0400'
+
+class TestRepositoryComponentReviews( ShedTwillTestCase ):
+ '''Test repository component review features.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts and login as an admin user."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ test_user_2 = test_db_util.get_user( common.test_user_2_email )
+ assert test_user_2 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_2_email
+ test_user_2_private_role = test_db_util.get_private_role( test_user_2 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_grant_reviewer_role( self ):
+ '''Grant the repository reviewer role to test_user_2.'''
+ reviewer_role = test_db_util.get_role_by_name( 'Repository Reviewer' )
+ test_user_2 = test_db_util.get_user( common.test_user_2_email )
+ self.grant_role_to_user( test_user_2, reviewer_role )
+ def test_0010_verify_repository_review_components( self ):
+ '''Ensure that the required review components exist.'''
+ strings_not_displayed=[ 'Repository dependencies' ]
+ self.manage_review_components( strings_not_displayed=strings_not_displayed )
+ self.add_repository_review_component( name='Repository dependencies',
+ description='Repository dependencies defined in a file named repository_dependencies.xml included in the repository' )
+ strings_displayed=[ 'Data types', 'Functional tests', 'README', 'Repository dependencies', 'Tool dependencies', 'Tools', 'Workflows' ]
+ self.manage_review_components( strings_displayed=strings_displayed )
+ def test_0015_create_repository( self ):
+ """Create and populate the filtering repository"""
+ category = self.create_category( name='Test 0400 Repository Component Reviews', description='Test 0400 Repository Component Reviews' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ strings_displayed = [ 'Repository %s' % "'%s'" % repository_name,
+ 'Repository %s has been created' % "'%s'" % repository_name ]
+ repository = self.get_or_create_repository( name=repository_name,
+ description=repository_description,
+ long_description=repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=strings_displayed )
+ self.upload_file( repository, 'filtering/filtering_1.1.0.tar', commit_message="Uploaded filtering 1.1.0" )
+ def test_0020_review_initial_revision_data_types( self ):
+ '''Review the datatypes component for the current tip revision.'''
+ # Review this revision:
+ # Data types (N/A)
+ # Functional tests (One star, comment 'functional tests missing')
+ # README (N/A)
+ # Repository dependencies (N/A)
+ # Tool dependencies (N/A)
+ # Tools (5 stars, good review)
+ # Workflows (N/A)
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ review_contents_dict = { 'Data types': dict() }
+ self.create_repository_review( repository, review_contents_dict )
+ def test_0025_verify_datatype_review( self ):
+ '''Verify that the datatypes component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed = [ 'Data types', 'not_applicable' ]
+ strings_not_displayed = [ 'Functional tests', 'README', 'Repository dependencies', 'Tool dependencies', 'Tools', 'Workflows' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0030_review_initial_revision_functional_tests( self ):
+ '''Review the datatypes component for the current tip revision.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ review_contents_dict = { 'Functional tests': dict( rating=1, comment='Functional tests missing', approved='no', private='yes' ) }
+ self.review_repository( repository, review_contents_dict, user )
+# def test_0030_verify_review_display( self ):
+# '''Verify that private reviews are restricted to owner and reviewer, and non-private views are viewable by others.'''
+# # Currently not implemented because third parties cannot view reviews whether they are private or not.
+# self.logout()
+# self.login( email=common.test_user_3_email, username=common.test_user_3_name )
+ def test_0035_verify_functional_test_review( self ):
+ '''Verify that the datatypes component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed=[ 'Functional tests', 'Functional tests missing', 'no' ]
+ strings_not_displayed = [ 'README', 'Repository dependencies', 'Tool dependencies', 'Tools', 'Workflows' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0040_review_readme( self ):
+ '''Review the readme component for the current tip revision.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ review_contents_dict = { 'README': dict() }
+ self.review_repository( repository, review_contents_dict, user )
+ def test_0045_verify_readme_review( self ):
+ '''Verify that the datatypes component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed=[ 'README', 'not_applicable' ]
+ strings_not_displayed = [ 'Repository dependencies', 'Tool dependencies', 'Tools', 'Workflows' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0050_review_repository_dependencies( self ):
+ '''Review the repository dependencies component for the current tip revision.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ review_contents_dict = { 'Repository dependencies': dict() }
+ self.review_repository( repository, review_contents_dict, user )
+ def test_0055_verify_repository_dependency_review( self ):
+ '''Verify that the datatypes component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed=[ 'Repository dependencies', 'not_applicable' ]
+ strings_not_displayed = [ 'Tool dependencies', 'Tools', 'Workflows' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0060_review_tool_dependencies( self ):
+ '''Review the tool dependencies component for the current tip revision.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ review_contents_dict = { 'Tool dependencies': dict() }
+ self.review_repository( repository, review_contents_dict, user )
+ def test_0065_verify_tool_dependency_review( self ):
+ '''Verify that the datatypes component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed=[ 'Tool dependencies', 'not_applicable' ]
+ strings_not_displayed = [ 'Tools', 'Workflows' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0070_review_tools( self ):
+ '''Review the tools component for the current tip revision.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ review_contents_dict = { 'Tools': dict( rating=5, comment='Excellent tool, easy to use.', approved='yes', private='no' ) }
+ self.review_repository( repository, review_contents_dict, test_db_util.get_user( common.test_user_2_email ) )
+ def test_0075_verify_tools_review( self ):
+ '''Verify that the datatypes component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed=[ 'Tools', 'yes', 'Excellent tool, easy to use.' ]
+ strings_not_displayed = [ 'Workflows' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0080_review_workflows( self ):
+ '''Review the workflows component for the current tip revision.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ review_contents_dict = { 'Workflows': dict() }
+ self.review_repository( repository, review_contents_dict, user )
+ def test_0085_verify_workflows_review( self ):
+ '''Verify that the datatypes component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed=[ 'Workflows', 'not_applicable' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0090_upload_readme_file( self ):
+ '''Upload a readme file to the filtering repository.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ self.upload_file( repository, 'readme.txt', commit_message="Uploaded readme.txt" )
+ def test_0095_review_new_changeset_readme_component( self ):
+ '''Update the filtering repository's readme component review to reflect the presence of the readme file.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ # Get the changeset immediately prior to the tip, and pass it to the create review method.
+ changelog = self.get_repository_changelog( repository )
+ changeset_revision, ctx_revision = changelog[-2]
+ previous_review = test_db_util.get_repository_review_by_user_id_changeset_revision( user.id, repository.id, str( changeset_revision ) )
+ review_contents_dict = { 'README': dict( rating=5, comment='Clear and concise readme file, a true pleasure to read.', approved='yes', private='no' ) }
+ self.create_repository_review( repository,
+ review_contents_dict,
+ changeset_revision=self.get_repository_tip( repository ),
+ copy_from=( str( changeset_revision ), previous_review.id ) )
+ def test_0100_verify_readme_review( self ):
+ '''Verify that the readme component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed = [ 'README', 'yes', 'Clear and concise readme file, a true pleasure to read.' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0105_upload_test_data( self ):
+ '''Upload the missing test data to the filtering repository.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ self.upload_file( repository, 'filtering/filtering_test_data.tar', commit_message="Uploaded test data." )
+ def test_0110_review_new_changeset_functional_tests( self ):
+ '''Update the filtering repository's readme component review to reflect the presence of the readme file.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ # Get the changeset immediately prior to the tip, and pass it to the create review method.
+ changelog = self.get_repository_changelog( repository )
+ changeset_revision, ctx_revision = changelog[-2]
+ previous_review = test_db_util.get_repository_review_by_user_id_changeset_revision( user.id, repository.id, str( changeset_revision ) )
+ review_contents_dict = { 'Functional tests': dict( rating=5, comment='A good set of functional tests.', approved='yes', private='no' ) }
+ self.create_repository_review( repository,
+ review_contents_dict,
+ changeset_revision=self.get_repository_tip( repository ),
+ copy_from=( str( changeset_revision ), previous_review.id ) )
+ def test_0115_verify_functional_tests_review( self ):
+ '''Verify that the functional tests component review displays correctly.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed=[ 'Functional tests', 'yes', 'A good set of functional tests.' ]
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0120_upload_new_tool_version( self ):
+ '''Upload filtering 2.2.0 to the filtering repository.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ self.upload_file( repository,
+ 'filtering/filtering_2.2.0.tar',
+ commit_message="Uploaded filtering 2.2.0",
+ remove_repo_files_not_in_tar='No' )
+ def test_0125_review_new_changeset_functional_tests( self ):
+ '''Update the filtering repository's review to apply to the new changeset with filtering 2.2.0.'''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ # Get the changeset immediately prior to the tip, and pass it to the create review method.
+ changelog = self.get_repository_changelog( repository )
+ changeset_revision, ctx_revision = changelog[-2]
+ previous_review = test_db_util.get_repository_review_by_user_id_changeset_revision( user.id, repository.id, str( changeset_revision ) )
+ # Something needs to change so that the review will save.
+ review_contents_dict = { 'Tools': dict( rating=5, comment='Version 2.2.0 does the impossible and improves this tool.', approved='yes', private='yes' ) }
+ self.create_repository_review( repository,
+ review_contents_dict,
+ changeset_revision=self.get_repository_tip( repository ),
+ copy_from=( str( changeset_revision ), previous_review.id ) )
+ def test_0135_verify_review_for_new_version( self ):
+ '''Verify that the reviews display correctly for this changeset revision.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed = [ 'Data types', 'Functional tests', 'yes', 'A good set of functional tests.', 'README', 'yes', 'Workflows', 'Tools' ]
+ strings_displayed.extend( [ 'Clear and concise readme file, a true pleasure to read.', 'Tool dependencies', 'not_applicable' ] )
+ strings_displayed.extend( [ 'Repository dependencies', 'Version 2.2.0 does the impossible and improves this tool.' ] )
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
--- a/test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
+++ b/test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
@@ -163,6 +163,12 @@
freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
bismark_repository = test_db_util.get_repository_by_name_and_owner( bismark_repository_name, common.test_user_1_name )
dependency_xml_path = self.generate_temp_path( 'test_1050', additional_paths=[ 'dependencies' ] )
+ # convert_chars depends on column_maker
+ # column_maker depends on convert_chars
+ # emboss depends on emboss_datatypes
+ # emboss_datatypes depends on bismark
+ # freebayes depends on freebayes, emboss, emboss_datatypes, and column_maker
+ # filtering depends on emboss
self.create_repository_dependency( convert_repository, depends_on=[ column_repository ], filepath=dependency_xml_path )
self.create_repository_dependency( column_repository, depends_on=[ convert_repository ], filepath=dependency_xml_path )
self.create_repository_dependency( emboss_datatypes_repository, depends_on=[ bismark_repository ], filepath=dependency_xml_path )
@@ -224,6 +230,7 @@
install_tool_dependencies=False,
install_repository_dependencies=True,
new_tool_panel_section='column_maker' )
+ # This should result in column_maker and convert_chars being installed, and the rest never installed.
installed_repositories = [ ( column_repository_name, common.test_user_1_name ),
( convert_repository_name, common.test_user_1_name ) ]
uninstalled_repositories = [ ( emboss_datatypes_repository_name, common.test_user_1_name ),
@@ -244,6 +251,7 @@
new_tool_panel_section='emboss_5_0050' )
if running_standalone:
assert original_datatypes < self.get_datatypes_count(), 'Installing a repository that depends on emboss_datatypes did not add datatypes.'
+ # Now we have emboss_datatypes, emboss, bismark, column_maker, and convert_chars installed, filtering and freebayes never installed.
installed_repositories = [ ( emboss_datatypes_repository_name, common.test_user_1_name ),
( column_repository_name, common.test_user_1_name ),
( emboss_repository_name, common.test_user_1_name ),
@@ -258,6 +266,7 @@
repository = test_db_util.get_installed_repository_by_name_owner( emboss_datatypes_repository_name, common.test_user_1_name )
self.uninstall_repository( repository, remove_from_disk=False )
assert original_datatypes > self.get_datatypes_count(), 'Deactivating emboss_datatypes did not remove datatypes.'
+ # Now we have emboss, bismark, column_maker, and convert_chars installed, filtering and freebayes never installed, and emboss_datatypes deactivated.
installed_repositories = [ ( column_repository_name, common.test_user_1_name ),
( emboss_repository_name, common.test_user_1_name ),
( convert_repository_name, common.test_user_1_name ),
@@ -276,6 +285,8 @@
self.display_galaxy_browse_repositories_page( strings_not_displayed=strings_not_displayed )
test_db_util.ga_refresh( repository )
self.check_galaxy_repository_tool_panel_section( repository, 'emboss_5_0050' )
+ # Now we have bismark, column_maker, and convert_chars installed, filtering and freebayes never installed, emboss_datatypes deactivated,
+ # and emboss uninstalled.
installed_repositories = [ ( column_repository_name, common.test_user_1_name ),
( convert_repository_name, common.test_user_1_name ),
( bismark_repository_name, common.test_user_1_name ) ]
@@ -303,6 +314,8 @@
datatypes_repository.name,
datatypes_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
+ # Installing freebayes should automatically reinstall emboss and reactivate emboss_datatypes.
+ # Now column_maker, convert_chars, emboss, emboss_datatypes, freebayes, and bismark should be installed.
installed_repositories = [ ( column_repository_name, common.test_user_1_name ),
( emboss_datatypes_repository_name, common.test_user_1_name ),
( emboss_repository_name, common.test_user_1_name ),
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_1070_invalid_tool.py
--- a/test/tool_shed/functional/test_1070_invalid_tool.py
+++ b/test/tool_shed/functional/test_1070_invalid_tool.py
@@ -7,7 +7,7 @@
category_name = 'Test 0070 Invalid Tool Revisions'
class TestFreebayesRepository( ShedTwillTestCase ):
- '''Testing freebayes with tool data table entries, .loc files, and tool dependencies.'''
+ '''Test repository with multiple revisions with invalid tools.'''
def test_0000_create_or_login_admin_user( self ):
"""Create necessary user accounts and login as an admin user."""
self.galaxy_logout()
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
--- a/test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
+++ b/test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
@@ -17,7 +17,7 @@
running_standalone = False
class TestRepositoryDependencies( ShedTwillTestCase ):
- '''Testing freebayes with tool data table entries, .loc files, and tool dependencies.'''
+ '''Testing uninstalling and reinstalling repository dependencies, and setting tool panel sections.'''
def test_0000_create_or_login_admin_user( self ):
"""Create necessary user accounts and login as an admin user."""
self.galaxy_logout()
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_1085_repository_dependency_handling.py
--- a/test/tool_shed/functional/test_1085_repository_dependency_handling.py
+++ b/test/tool_shed/functional/test_1085_repository_dependency_handling.py
@@ -15,7 +15,7 @@
log = logging.getLogger( __name__ )
class TestRepositoryDependencies( ShedTwillTestCase ):
- '''Testing freebayes with tool data table entries, .loc files, and tool dependencies.'''
+ '''Testing the behavior of repository dependencies with tool panel sections.'''
def test_0000_create_or_login_admin_user( self ):
"""Create necessary user accounts and login as an admin user."""
self.galaxy_logout()
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
@@ -0,0 +1,266 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+emboss_datatypes_repository_name = 'emboss_datatypes_0090'
+emboss_datatypes_repository_description = "Datatypes for emboss"
+emboss_datatypes_repository_long_description = "Long description of Emboss' datatypes"
+
+emboss_repository_name = 'emboss_0090'
+emboss_repository_description = "Galaxy's emboss tool"
+emboss_repository_long_description = "Long description of Galaxy's emboss tool"
+
+filtering_repository_name = 'filtering_0090'
+filtering_repository_description = "Galaxy's filtering tool"
+filtering_repository_long_description = "Long description of Galaxy's filtering tool"
+
+freebayes_repository_name = 'freebayes_0090'
+freebayes_repository_description = "Galaxy's freebayes tool"
+freebayes_repository_long_description = "Long description of Galaxy's freebayes tool"
+
+bwa_base_repository_name = 'bwa_base_0090'
+bwa_base_repository_description = "BWA Base"
+bwa_base_repository_long_description = "NT space mapping with BWA"
+
+bwa_color_repository_name = 'bwa_color_0090'
+bwa_color_repository_description = "BWA Color"
+bwa_color_repository_long_description = "Color space mapping with BWA"
+
+category_name = 'Test 0090 Tool Search And Installation'
+category_description = 'Test 0090 Tool Search And Installation'
+
+running_standalone = False
+
+class TestToolSearchAndInstall( ShedTwillTestCase ):
+ '''Verify that the code correctly handles circular dependencies down to n levels.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_create_bwa_base_repository( self ):
+ '''Create and populate bwa_base_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ global running_standalone
+ repository = self.get_or_create_repository( name=bwa_base_repository_name,
+ description=bwa_base_repository_description,
+ long_description=bwa_base_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ running_standalone = True
+ self.upload_file( repository,
+ 'bwa/bwa_base.tar',
+ strings_displayed=[],
+ commit_message='Uploaded bwa_base.tar.' )
+ def test_0010_create_bwa_color_repository( self ):
+ '''Create and populate bwa_color_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ global running_standalone
+ repository = self.get_or_create_repository( name=bwa_color_repository_name,
+ description=bwa_color_repository_description,
+ long_description=bwa_color_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ running_standalone = True
+ self.upload_file( repository,
+ 'bwa/bwa_color.tar',
+ strings_displayed=[],
+ commit_message='Uploaded bwa_color.tar.' )
+ def test_0015_create_emboss_datatypes_repository( self ):
+ '''Create and populate emboss_datatypes_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ global running_standalone
+ repository = self.get_or_create_repository( name=emboss_datatypes_repository_name,
+ description=emboss_datatypes_repository_description,
+ long_description=emboss_datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ running_standalone = True
+ self.upload_file( repository,
+ 'emboss/datatypes/datatypes_conf.xml',
+ strings_displayed=[],
+ commit_message='Uploaded datatypes_conf.xml.' )
+ def test_0020_create_emboss_repository( self ):
+ '''Create and populate emboss_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ global running_standalone
+ repository = self.get_or_create_repository( name=emboss_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ running_standalone = True
+ self.upload_file( repository,
+ 'emboss/emboss.tar',
+ strings_displayed=[],
+ commit_message='Uploaded tool tarball.' )
+ def test_0025_create_filtering_repository( self ):
+ '''Create and populate filtering_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ global running_standalone
+ repository = self.get_or_create_repository( name=filtering_repository_name,
+ description=filtering_repository_description,
+ long_description=filtering_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ running_standalone = True
+ self.upload_file( repository,
+ 'filtering/filtering_1.1.0.tar',
+ strings_displayed=[],
+ commit_message='Uploaded filtering.tar.' )
+ def test_0030_create_freebayes_repository( self ):
+ '''Create and populate freebayes_0090.'''
+ category = self.create_category( name=category_name, description=category_description )
+ global running_standalone
+ repository = self.get_or_create_repository( name=freebayes_repository_name,
+ description=freebayes_repository_description,
+ long_description=freebayes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ running_standalone = True
+ self.upload_file( repository,
+ 'freebayes/freebayes.tar',
+ strings_displayed=[],
+ commit_message='Uploaded freebayes.tar.' )
+ def test_0035_create_and_upload_dependency_definitions( self ):
+ '''Create and upload repository dependency definitions.'''
+ global running_standalone
+ if running_standalone:
+ bwa_color_repository = test_db_util.get_repository_by_name_and_owner( bwa_color_repository_name, common.test_user_1_name )
+ bwa_base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ dependency_xml_path = self.generate_temp_path( 'test_0090', additional_paths=[ 'freebayes' ] )
+ self.create_repository_dependency( emboss_repository, depends_on=[ emboss_datatypes_repository ], filepath=dependency_xml_path )
+ self.create_repository_dependency( filtering_repository, depends_on=[ freebayes_repository ], filepath=dependency_xml_path )
+ self.create_repository_dependency( bwa_base_repository, depends_on=[ emboss_repository ], filepath=dependency_xml_path )
+ self.create_repository_dependency( bwa_color_repository, depends_on=[ filtering_repository ], filepath=dependency_xml_path )
+ def test_0040_verify_repository_dependencies( self ):
+ '''Verify the generated dependency structure.'''
+ bwa_color_repository = test_db_util.get_repository_by_name_and_owner( bwa_color_repository_name, common.test_user_1_name )
+ bwa_base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ self.check_repository_dependency( emboss_repository, emboss_datatypes_repository )
+ self.check_repository_dependency( filtering_repository, freebayes_repository )
+ self.check_repository_dependency( bwa_base_repository, emboss_repository )
+ self.check_repository_dependency( bwa_color_repository, filtering_repository )
+ def test_0045_install_freebayes_repository( self ):
+ '''Install freebayes without repository dependencies.'''
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ # After this test, the repositories should be in the following states:
+ # Installed: freebayes
+ # Never installed: filtering, emboss, emboss_datatypes, bwa_color, bwa_base
+ self.install_repository( freebayes_repository_name,
+ common.test_user_1_name,
+ category_name,
+ install_tool_dependencies=False,
+ install_repository_dependencies=False,
+ new_tool_panel_section='freebayes_1090' )
+ installed_repositories = [ ( freebayes_repository_name, common.test_user_1_name ) ]
+ uninstalled_repositories = [ ( filtering_repository_name, common.test_user_1_name ),
+ ( emboss_repository_name, common.test_user_1_name ),
+ ( emboss_datatypes_repository_name, common.test_user_1_name ),
+ ( bwa_color_repository_name, common.test_user_1_name ),
+ ( bwa_base_repository_name, common.test_user_1_name ) ]
+ self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ def test_0050_install_deactivate_filtering_repository( self ):
+ '''Install and deactivate filtering.'''
+ global running_standalone
+ original_datatypes = self.get_datatypes_count()
+ # After this test, the repositories should be in the following states:
+ # Installed: freebayes
+ # Deactivated: filtering
+ # Never installed: emboss, emboss_datatypes, bwa_color, bwa_base
+ self.install_repository( filtering_repository_name,
+ common.test_user_1_name,
+ category_name,
+ install_tool_dependencies=False,
+ install_repository_dependencies=False,
+ new_tool_panel_section='filtering_1090' )
+ installed_repositories = [ ( filtering_repository_name, common.test_user_1_name ),
+ ( freebayes_repository_name, common.test_user_1_name ) ]
+ uninstalled_repositories = [ ( emboss_repository_name, common.test_user_1_name ),
+ ( emboss_datatypes_repository_name, common.test_user_1_name ),
+ ( bwa_color_repository_name, common.test_user_1_name ),
+ ( bwa_base_repository_name, common.test_user_1_name ) ]
+ self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ filtering_repository = test_db_util.get_installed_repository_by_name_owner( filtering_repository_name, common.test_user_1_name )
+ self.uninstall_repository( filtering_repository, remove_from_disk=False )
+ def test_0055_install_uninstall_datatypes_repository( self ):
+ '''Install and uninstall emboss_datatypes.'''
+ # After this test, the repositories should be in the following states:
+ # Installed: freebayes
+ # Deactivated: filtering
+ # Uninstalled: emboss_datatypes
+ # Never installed: emboss, bwa_color, bwa_base
+ self.install_repository( emboss_datatypes_repository_name,
+ common.test_user_1_name,
+ category_name,
+ includes_tools=False )
+ installed_repositories = [ ( emboss_datatypes_repository_name, common.test_user_1_name ),
+ ( freebayes_repository_name, common.test_user_1_name ) ]
+ uninstalled_repositories = [ ( emboss_repository_name, common.test_user_1_name ),
+ ( filtering_repository_name, common.test_user_1_name ),
+ ( bwa_color_repository_name, common.test_user_1_name ),
+ ( bwa_base_repository_name, common.test_user_1_name ) ]
+ self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ datatypes_repository = test_db_util.get_installed_repository_by_name_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ self.uninstall_repository( datatypes_repository, remove_from_disk=True )
+ def test_0060_search_for_bwa_tools( self ):
+ '''Search for and install the repositories with BWA tools, and verify that this reinstalls emboss_datatypes and reactivates filtering.'''
+ bwa_color_repository = test_db_util.get_repository_by_name_and_owner( bwa_color_repository_name, common.test_user_1_name )
+ bwa_base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ bwa_base_revision = self.get_repository_tip( bwa_base_repository )
+ bwa_color_revision = self.get_repository_tip( bwa_color_repository )
+ self.search_for_valid_tools( search_fields={ 'tool_id': 'bwa' },
+ exact_matches=False, from_galaxy=True,
+ strings_displayed=[ bwa_color_repository_name, bwa_base_repository_name, bwa_base_revision, bwa_color_revision ] )
+ strings_displayed=[ freebayes_repository_name, emboss_repository_name, filtering_repository_name ]
+ strings_displayed.extend( [ bwa_color_repository_name, bwa_base_repository_name, emboss_datatypes_repository_name ] )
+ strings_displayed.extend( [ 'bwa', 'Handle', 'tool dependencies' ] )
+ repositories_to_install = [ bwa_color_repository, bwa_base_repository ]
+ # BWA is a good candidate for testing the installation of tool dependencies, but it is a core requirement of functional
+ # tests that they be able to run independently of any network connection or remote data.
+ #
+ # After this test, the repositories should be in the following state:
+ # Installed: bwa_color, bwa_base, emboss_datatypes, emboss, filtering, freebayes
+ self.install_repositories_from_search_results( repositories_to_install,
+ install_repository_dependencies='True',
+ install_tool_dependencies=False,
+ new_tool_panel_section='bwa_1090',
+ strings_displayed=strings_displayed )
+
+ installed_repositories = [ ( emboss_repository_name, common.test_user_1_name ),
+ ( filtering_repository_name, common.test_user_1_name ),
+ ( bwa_color_repository_name, common.test_user_1_name ),
+ ( bwa_base_repository_name, common.test_user_1_name ),
+ ( emboss_datatypes_repository_name, common.test_user_1_name ),
+ ( freebayes_repository_name, common.test_user_1_name ) ]
+ uninstalled_repositories = []
+ self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/test_data/bwa/bwa_base.tar
Binary file test/tool_shed/test_data/bwa/bwa_base.tar has changed
diff -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 -r 3a2211dc42f15e0bd357de6abb7dca73221854c7 test/tool_shed/test_data/bwa/bwa_color.tar
Binary file test/tool_shed/test_data/bwa/bwa_color.tar has changed
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/5e710a6f1c99/
changeset: 5e710a6f1c99
user: inithello
date: 2013-01-16 18:35:36
summary: Fix for removing roles from users in the tool shed.
affected #: 1 file
diff -r 4f01c6a8693e855da6abad43112afe7447da6e82 -r 5e710a6f1c99e56abb5eb7964cd1c673526866b2 lib/galaxy/web/base/controllers/admin.py
--- a/lib/galaxy/web/base/controllers/admin.py
+++ b/lib/galaxy/web/base/controllers/admin.py
@@ -224,19 +224,20 @@
role = get_role( trans, id )
if params.get( 'role_members_edit_button', False ):
in_users = [ trans.sa_session.query( trans.app.model.User ).get( x ) for x in util.listify( params.in_users ) ]
- for ura in role.users:
- user = trans.sa_session.query( trans.app.model.User ).get( ura.user_id )
- if user not in in_users:
- # Delete DefaultUserPermissions for previously associated users that have been removed from the role
- for dup in user.default_permissions:
- if role == dup.role:
- trans.sa_session.delete( dup )
- # Delete DefaultHistoryPermissions for previously associated users that have been removed from the role
- for history in user.histories:
- for dhp in history.default_permissions:
- if role == dhp.role:
- trans.sa_session.delete( dhp )
- trans.sa_session.flush()
+ if trans.webapp.name == 'galaxy':
+ for ura in role.users:
+ user = trans.sa_session.query( trans.app.model.User ).get( ura.user_id )
+ if user not in in_users:
+ # Delete DefaultUserPermissions for previously associated users that have been removed from the role
+ for dup in user.default_permissions:
+ if role == dup.role:
+ trans.sa_session.delete( dup )
+ # Delete DefaultHistoryPermissions for previously associated users that have been removed from the role
+ for history in user.histories:
+ for dhp in history.default_permissions:
+ if role == dhp.role:
+ trans.sa_session.delete( dhp )
+ trans.sa_session.flush()
in_groups = [ trans.sa_session.query( trans.app.model.Group ).get( x ) for x in util.listify( params.in_groups ) ]
trans.app.security_agent.set_entity_role_associations( roles=[ role ], users=in_users, groups=in_groups )
trans.sa_session.refresh( role )
https://bitbucket.org/galaxy/galaxy-central/commits/974d7c41b8df/
changeset: 974d7c41b8df
user: inithello
date: 2013-01-16 18:36:19
summary: Fix server error when trying to create a component review for a repository when one already exists for that changeset revision.
affected #: 1 file
diff -r 5e710a6f1c99e56abb5eb7964cd1c673526866b2 -r 974d7c41b8dfb7e77c6dfa24da05b31d684fd2e6 lib/galaxy/webapps/community/controllers/repository_review.py
--- a/lib/galaxy/webapps/community/controllers/repository_review.py
+++ b/lib/galaxy/webapps/community/controllers/repository_review.py
@@ -377,6 +377,7 @@
if repository_id:
if changeset_revision:
# Make sure there is not already a review of the revision by the user.
+ repository = suc.get_repository_in_tool_shed( trans, repository_id )
if common.get_review_by_repository_id_changeset_revision_user_id( trans=trans,
repository_id=repository_id,
changeset_revision=changeset_revision,
@@ -384,7 +385,6 @@
message = "You have already created a review for revision <b>%s</b> of repository <b>%s</b>." % ( changeset_revision, repository.name )
status = "error"
else:
- repository = suc.get_repository_in_tool_shed( trans, repository_id )
# See if there are any reviews for previous changeset revisions that the user can copy.
if not create_without_copying and not previous_review_id and common.has_previous_repository_reviews( trans, repository, changeset_revision ):
return trans.response.send_redirect( web.url_for( controller='repository_review',
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
16 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/4f01c6a8693e/
changeset: 4f01c6a8693e
user: natefoo
date: 2013-01-16 18:30:24
summary: Remove spurious debugging statement.
affected #: 1 file
diff -r ee6ddbd3fcb35845239ea82c9062c4893e88c37e -r 4f01c6a8693e855da6abad43112afe7447da6e82 lib/galaxy/web/framework/__init__.py
--- a/lib/galaxy/web/framework/__init__.py
+++ b/lib/galaxy/web/framework/__init__.py
@@ -274,7 +274,6 @@
from galaxy.web.base.controller import ControllerUnavailable
package = import_module( package_name )
controller_dir = package.__path__[0]
- print ">>>", controller_dir, package.__path__
for fname in os.listdir( controller_dir ):
if not( fname.startswith( "_" ) ) and fname.endswith( ".py" ):
name = fname[:-3]
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Update history functional tests for changes in f93113b
by Bitbucket 15 Jan '13
by Bitbucket 15 Jan '13
15 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ee6ddbd3fcb3/
changeset: ee6ddbd3fcb3
user: jgoecks
date: 2013-01-15 23:17:32
summary: Update history functional tests for changes in f93113b
affected #: 2 files
diff -r 06cdf8b0b582c40fa89fc7e398fecacb3943dbfc -r ee6ddbd3fcb35845239ea82c9062c4893e88c37e test/base/twilltestcase.py
--- a/test/base/twilltestcase.py
+++ b/test/base/twilltestcase.py
@@ -417,7 +417,7 @@
if active_datasets:
self.check_page_for_string( 'Create</a> a new empty history' )
self.check_page_for_string( 'Construct workflow</a> from current history' )
- self.check_page_for_string( 'Clone</a> current history' )
+ self.check_page_for_string( 'Copy</a> current history' )
self.check_page_for_string( 'Share</a> current history' )
self.check_page_for_string( 'Change default permissions</a> for current history' )
if histories_shared_by_others:
@@ -534,13 +534,13 @@
for check_str in strings_displayed:
self.check_page_for_string( check_str )
self.home()
- def clone_history( self, history_id, clone_choice, strings_displayed=[], strings_displayed_after_submit=[] ):
+ def copy_history( self, history_id, copy_choice, strings_displayed=[], strings_displayed_after_submit=[] ):
self.home()
- self.visit_page( "history/clone?id=%s" % history_id )
+ self.visit_page( "history/copy?id=%s" % history_id )
for check_str in strings_displayed:
self.check_page_for_string( check_str )
- tc.fv( '1', 'clone_choice', clone_choice )
- tc.submit( 'clone_choice_button' )
+ tc.fv( '1', 'copy_choice', copy_choice )
+ tc.submit( 'copy_choice_button' )
for check_str in strings_displayed_after_submit:
self.check_page_for_string( check_str )
self.home()
diff -r 06cdf8b0b582c40fa89fc7e398fecacb3943dbfc -r ee6ddbd3fcb35845239ea82c9062c4893e88c37e test/functional/test_history_functions.py
--- a/test/functional/test_history_functions.py
+++ b/test/functional/test_history_functions.py
@@ -215,7 +215,7 @@
# Logged in as admin_user
self.delete_current_history( strings_displayed=[ "History (%s) has been shared with others, unshare it before deleting it." % history3.name ] )
def test_030_clone_shared_history( self ):
- """Testing cloning a shared history"""
+ """Testing copying a shared history"""
# logged in as admin user
self.logout()
self.login( email=regular_user1.email )
@@ -223,9 +223,9 @@
self.history_options( user=True, histories_shared_by_others=True )
# Shared history3 should be in regular_user1's list of shared histories
self.view_shared_histories( strings_displayed=[ history3.name, admin_user.email ] )
- self.clone_history( self.security.encode_id( history3.id ),
+ self.copy_history( self.security.encode_id( history3.id ),
'activatable',
- strings_displayed_after_submit=[ 'is now included in your previously stored histories.' ] )
+ strings_displayed_after_submit=[ 'has been created.' ] )
global history3_clone1
history3_clone1 = sa_session.query( galaxy.model.History ) \
.filter( and_( galaxy.model.History.table.c.deleted==False,
@@ -234,11 +234,11 @@
.first()
assert history3_clone1 is not None, "Problem retrieving history3_clone1 from database"
# Check list of histories to make sure shared history3 was cloned
- strings_displayed=[ "Clone of '%s' shared by '%s'" % ( history3.name, admin_user.email ) ]
+ strings_displayed=[ "Copy of '%s' shared by '%s'" % ( history3.name, admin_user.email ) ]
self.view_stored_active_histories( strings_displayed=strings_displayed )
def test_035_clone_current_history( self ):
- """Testing cloning the current history"""
+ """Testing copying the current history"""
# logged in as regular_user1
self.logout()
self.login( email=admin_user.email )
@@ -264,9 +264,9 @@
self.delete_history_item( str( hda_3_bed.id ) )
# Test cloning activatable datasets
- self.clone_history( self.security.encode_id( history3.id ),
+ self.copy_history( self.security.encode_id( history3.id ),
'activatable',
- strings_displayed_after_submit=['is now included in your previously stored histories.' ] )
+ strings_displayed_after_submit=['has been created.' ] )
global history3_clone2
history3_clone2 = sa_session.query( galaxy.model.History ) \
.filter( and_( galaxy.model.History.table.c.deleted==False,
@@ -276,7 +276,7 @@
assert history3_clone2 is not None, "Problem retrieving history3_clone2 from database"
# Check list of histories to make sure shared history3 was cloned
- self.view_stored_active_histories( strings_displayed=[ "Clone of '%s'" % history3.name ] )
+ self.view_stored_active_histories( strings_displayed=[ "Copy of '%s'" % history3.name ] )
# Switch to the cloned history to make sure activatable datasets were cloned
self.switch_history( id=self.security.encode_id( history3_clone2.id ), name=history3_clone2.name )
hda_2_bed = (
@@ -301,10 +301,10 @@
self.check_history_for_exact_string( self.security.encode_id( hda_3_bed.id ), show_deleted=True )
# Test cloning only active datasets
- self.clone_history(
+ self.copy_history(
self.security.encode_id( history3.id ),
'active',
- strings_displayed_after_submit=[ 'is now included in your previously stored histories.' ] )
+ strings_displayed_after_submit=[ 'has been created.' ] )
global history3_clone3
history3_clone3 = (
sa_session.query( galaxy.model.History )
@@ -316,7 +316,7 @@
assert history3_clone3 is not None, "Problem retrieving history3_clone3 from database"
# Check list of histories to make sure shared history3 was cloned
- self.view_stored_active_histories( strings_displayed = ["Clone of '%s'" % history3.name ] )
+ self.view_stored_active_histories( strings_displayed = ["Copy of '%s'" % history3.name ] )
# Switch to the cloned history to make sure ONLY activatable datasets were cloned
self.switch_history( id=self.security.encode_id( history3_clone3.id ) )
@@ -428,9 +428,9 @@
# Shared history5 should be in regular_user1's list of shared histories
self.view_shared_histories( strings_displayed=[ history5.name, admin_user.email ] )
# Clone restricted history5
- self.clone_history( self.security.encode_id( history5.id ),
+ self.copy_history( self.security.encode_id( history5.id ),
'activatable',
- strings_displayed_after_submit=[ 'is now included in your previously stored histories.' ] )
+ strings_displayed_after_submit=[ 'has been created.' ] )
global history5_clone1
history5_clone1 = sa_session.query( galaxy.model.History ) \
.filter( and_( galaxy.model.History.table.c.deleted==False,
@@ -439,7 +439,7 @@
.first()
assert history5_clone1 is not None, "Problem retrieving history5_clone1 from database"
# Check list of histories to make sure shared history5 was cloned
- self.view_stored_active_histories( strings_displayed=[ "Clone of '%s'" % history5.name ] )
+ self.view_stored_active_histories( strings_displayed=[ "Copy of '%s'" % history5.name ] )
# Make sure the dataset is accessible
self.switch_history( id=self.security.encode_id( history5_clone1.id ), name=history5_clone1.name )
self.check_history_for_string( 'chr1' )
@@ -486,9 +486,9 @@
# Shared history5 should be in regular_user2's list of shared histories
self.view_shared_histories( strings_displayed=[ history5.name, admin_user.email ] )
# Clone restricted history5
- self.clone_history( self.security.encode_id( history5.id ),
+ self.copy_history( self.security.encode_id( history5.id ),
'activatable',
- strings_displayed_after_submit=[ 'is now included in your previously stored histories.' ] )
+ strings_displayed_after_submit=[ 'has been created.' ] )
global history5_clone2
history5_clone2 = sa_session.query( galaxy.model.History ) \
.filter( and_( galaxy.model.History.table.c.deleted==False,
@@ -497,7 +497,7 @@
.first()
assert history5_clone2 is not None, "Problem retrieving history5_clone2 from database"
# Check list of histories to make sure shared history3 was cloned
- self.view_stored_active_histories( strings_displayed=[ "Clone of '%s'" % history5.name ] )
+ self.view_stored_active_histories( strings_displayed=[ "Copy of '%s'" % history5.name ] )
# Make sure the dataset is accessible
self.switch_history( id=self.security.encode_id( history5_clone2.id ), name=history5_clone2.name )
# Make sure both datasets are in the history
@@ -557,15 +557,15 @@
self.share_current_history( email,
strings_displayed_after_submit=strings_displayed_after_submit,
action='share_anyway' )
- # Check security on clone of history5 for regular_user2
+ # Check security on copy of history5 for regular_user2
self.logout()
self.login( email=regular_user2.email )
# Shared history5 should be in regular_user2's list of shared histories
self.view_shared_histories( strings_displayed=[ history5.name, admin_user.email ] )
# Clone restricted history5
- self.clone_history( self.security.encode_id( history5.id ),
+ self.copy_history( self.security.encode_id( history5.id ),
'activatable',
- strings_displayed_after_submit=[ 'is now included in your previously stored histories.' ] )
+ strings_displayed_after_submit=[ 'has been created.' ] )
global history5_clone3
history5_clone3 = (
sa_session.query( galaxy.model.History )
@@ -576,7 +576,7 @@
assert history5_clone3 is not None, "Problem retrieving history5_clone3 from database"
# Check list of histories to make sure shared history3 was cloned
- self.view_stored_active_histories( strings_displayed=[ "Clone of '%s'" % history5.name ] )
+ self.view_stored_active_histories( strings_displayed=[ "Copy of '%s'" % history5.name ] )
# Make sure the dataset is accessible
self.switch_history( id=self.security.encode_id( history5_clone3.id ), name=history5_clone3.name )
# Make sure both datasets are in the history
@@ -602,16 +602,16 @@
self.display_history_item( str( hda_2_bed.id ), strings_displayed=[ 'chr1' ] )
# Delete the clone so the next test will be valid
self.delete_history( id=self.security.encode_id( history5_clone3.id ) )
- # Check security on clone of history5 for regular_user3
+ # Check security on copy of history5 for regular_user3
self.logout()
self.login( email=regular_user3.email )
# Shared history5 should be in regular_user2's list of shared histories
self.view_shared_histories( strings_displayed=[ history5.name, admin_user.email ] )
# Clone restricted history5
- self.clone_history( self.security.encode_id( history5.id ),
+ self.copy_history( self.security.encode_id( history5.id ),
'activatable',
- strings_displayed_after_submit=[ 'is now included in your previously stored histories.' ] )
+ strings_displayed_after_submit=[ 'has been created.' ] )
global history5_clone4
history5_clone4 = (
sa_session.query( galaxy.model.History )
@@ -622,7 +622,7 @@
assert history5_clone4 is not None, "Problem retrieving history5_clone4 from database"
# Check list of histories to make sure shared history3 was cloned
- self.view_stored_active_histories( strings_displayed=[ "Clone of '%s'" % history5.name ] )
+ self.view_stored_active_histories( strings_displayed=[ "Copy of '%s'" % history5.name ] )
# Make sure the dataset is accessible
self.switch_history( id=self.security.encode_id( history5_clone4.id ), name=history5_clone4.name )
# Make sure both datasets are in the history
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b45675d0e019/
changeset: b45675d0e019
user: jmchilton
date: 2012-12-18 23:28:09
summary: Add more commonly generated Galaxy runtime files to .hgignore.
affected #: 1 file
diff -r eae248415389203907b5b951f139a200024ae069 -r b45675d0e0192952e9466d843fe0f17a9a6038d3 .hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -16,6 +16,7 @@
database/community_files
database/compiled_templates
database/files
+database/job_working_directory
database/pbs
database/tmp
database/*.sqlite
@@ -23,6 +24,11 @@
# Python bytecode
*.pyc
+# Tool Shed Runtime Files
+community_webapp.log
+community_webapp.pid
+hgweb.config*
+
# Config files
universe_wsgi.ini
reports_wsgi.ini
https://bitbucket.org/galaxy/galaxy-central/commits/06cdf8b0b582/
changeset: 06cdf8b0b582
user: dannon
date: 2013-01-15 23:09:33
summary: Merged in jmchilton/galaxy-central-hgignore-fixes (pull request #100: Add more commonly generated Galaxy runtime files to .hgignore.)
affected #: 1 file
diff -r 4bd419751ed3e8cc54913fa37389111a0e7faaa9 -r 06cdf8b0b582c40fa89fc7e398fecacb3943dbfc .hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -16,6 +16,7 @@
database/community_files
database/compiled_templates
database/files
+database/job_working_directory
database/pbs
database/tmp
database/*.sqlite
@@ -23,6 +24,11 @@
# Python bytecode
*.pyc
+# Tool Shed Runtime Files
+community_webapp.log
+community_webapp.pid
+hgweb.config*
+
# Config files
universe_wsgi.ini
reports_wsgi.ini
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
15 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/4bd419751ed3/
changeset: 4bd419751ed3
user: dan
date: 2013-01-15 22:46:47
summary: Make galaxy.tools.Tool a new-style class.
affected #: 1 file
diff -r 52395842f8e65a6484268d3db1e3dbac09d60089 -r 4bd419751ed3e8cc54913fa37389111a0e7faaa9 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -813,7 +813,7 @@
self.attributes['split_size'] = 20
self.attributes['split_mode'] = 'number_of_parts'
-class Tool:
+class Tool( object ):
"""
Represents a computational tool that can be executed through Galaxy.
"""
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Change 'clone workflow/visualization' to 'copy workflow/visualization' in user interface and associated code.
by Bitbucket 15 Jan '13
by Bitbucket 15 Jan '13
15 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/52395842f8e6/
changeset: 52395842f8e6
user: jgoecks
date: 2013-01-15 22:16:55
summary: Change 'clone workflow/visualization' to 'copy workflow/visualization' in user interface and associated code.
affected #: 4 files
diff -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 -r 52395842f8e65a6484268d3db1e3dbac09d60089 lib/galaxy/webapps/galaxy/controllers/visualization.py
--- a/lib/galaxy/webapps/galaxy/controllers/visualization.py
+++ b/lib/galaxy/webapps/galaxy/controllers/visualization.py
@@ -190,7 +190,7 @@
grids.GridOperation( "Open", allow_multiple=False, url_args=get_url_args ),
grids.GridOperation( "Open in Circster", allow_multiple=False, condition=( lambda item: item.type == 'trackster' ), url_args=dict( action='circster' ) ),
grids.GridOperation( "Edit Attributes", allow_multiple=False, url_args=dict( action='edit') ),
- grids.GridOperation( "Copy", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False, url_args=dict( action='clone') ),
+ grids.GridOperation( "Copy", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False, url_args=dict( action='copy') ),
grids.GridOperation( "Share or Publish", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Delete", condition=( lambda item: not item.deleted ), async_compatible=True, confirm="Are you sure you want to delete this visualization?" ),
]
@@ -352,7 +352,7 @@
@web.expose
@web.require_login()
- def clone(self, trans, id, *args, **kwargs):
+ def copy(self, trans, id, *args, **kwargs):
visualization = self.get_visualization( trans, id, check_ownership=False )
user = trans.get_user()
owner = ( visualization.user == user )
@@ -360,15 +360,15 @@
if not owner:
new_title += " shared by %s" % visualization.user.email
- cloned_visualization = visualization.copy( user=trans.user, title=new_title )
+ copied_viz = visualization.copy( user=trans.user, title=new_title )
# Persist
session = trans.sa_session
- session.add( cloned_visualization )
+ session.add( copied_viz )
session.flush()
# Display the management page
- trans.set_message( 'Copy created with name "%s"' % cloned_visualization.title )
+ trans.set_message( 'Created new visualization with name "%s"' % copied_viz.title )
return self.list( trans )
@web.expose
diff -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 -r 52395842f8e65a6484268d3db1e3dbac09d60089 lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -51,7 +51,7 @@
operations = [
grids.GridOperation( "Edit", allow_multiple=False, condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Run", condition=( lambda item: not item.deleted ), async_compatible=False ),
- grids.GridOperation( "Clone", condition=( lambda item: not item.deleted ), async_compatible=False ),
+ grids.GridOperation( "Copy", condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Rename", condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Sharing", condition=( lambda item: not item.deleted ), async_compatible=False ),
grids.GridOperation( "Delete", condition=( lambda item: item.deleted ), async_compatible=True ),
@@ -499,8 +499,8 @@
@web.expose
@web.require_login( "use Galaxy workflows" )
- def clone( self, trans, id ):
- # Get workflow to clone.
+ def copy( self, trans, id ):
+ # Get workflow to copy.
stored = self.get_stored_workflow( trans, id, check_ownership=False )
user = trans.get_user()
if stored.user == user:
@@ -511,11 +511,11 @@
error( "Workflow is not owned by or shared with current user" )
owner = False
- # Clone.
+ # Copy.
new_stored = model.StoredWorkflow()
- new_stored.name = "Clone of '%s'" % stored.name
+ new_stored.name = "Copy of '%s'" % stored.name
new_stored.latest_workflow = stored.latest_workflow
- # Clone annotation.
+ # Copy annotation.
annotation_obj = self.get_item_annotation_obj( trans.sa_session, stored.user, stored )
if annotation_obj:
self.add_item_annotation( trans.sa_session, trans.get_user(), new_stored, annotation_obj.annotation )
@@ -528,7 +528,7 @@
session.add( new_stored )
session.flush()
# Display the management page
- trans.set_message( 'Clone created with name "%s"' % new_stored.name )
+ trans.set_message( 'Created new workflow with name "%s"' % new_stored.name )
return self.list( trans )
@web.expose
diff -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 -r 52395842f8e65a6484268d3db1e3dbac09d60089 templates/visualization/list.mako
--- a/templates/visualization/list.mako
+++ b/templates/visualization/list.mako
@@ -48,7 +48,7 @@
<td><div popupmenu="shared-${i}-popup"><a class="action-button" href="${h.url_for( action='display_by_username_and_slug', username=visualization.user.username, slug=visualization.slug)}" target="_top">View</a>
- <a class="action-button" href="${h.url_for( action='clone', id=trans.security.encode_id(visualization.id) )}">Copy</a>
+ <a class="action-button" href="${h.url_for( action='copy', id=trans.security.encode_id(visualization.id) )}">Copy</a></div></td></tr>
diff -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 -r 52395842f8e65a6484268d3db1e3dbac09d60089 templates/workflow/list.mako
--- a/templates/workflow/list.mako
+++ b/templates/workflow/list.mako
@@ -67,7 +67,7 @@
<a class="action-button" href="${h.url_for( controller='root', action='index', workflow_id=trans.security.encode_id( workflow.id ) )}" target="_parent">Run</a><a class="action-button" href="${h.url_for( controller='workflow', action='sharing', id=trans.security.encode_id( workflow.id ) )}">Share or Publish</a><a class="action-button" href="${h.url_for( controller='workflow', action='export', id=trans.security.encode_id( workflow.id ) )}">Download or Export</a>
- <a class="action-button" href="${h.url_for( controller='workflow', action='clone', id=trans.security.encode_id( workflow.id ) )}">Clone</a>
+ <a class="action-button" href="${h.url_for( controller='workflow', action='copy', id=trans.security.encode_id( workflow.id ) )}">Copy</a><a class="action-button" href="${h.url_for( controller='workflow', action='rename', id=trans.security.encode_id( workflow.id ) )}">Rename</a><a class="action-button" href="${h.url_for( controller='workflow', action='display_by_id', id=trans.security.encode_id( workflow.id ) )}" target="_top">View</a><a class="action-button" confirm="Are you sure you want to delete workflow '${h.to_unicode( workflow.name ) | h}'?" href="${h.url_for( controller='workflow', action='delete', id=trans.security.encode_id( workflow.id ) )}">Delete</a>
@@ -102,7 +102,7 @@
<div popupmenu="shared-${i}-popup"><a class="action-button" href="${h.url_for( controller='workflow', action='display_by_username_and_slug', username=workflow.user.username, slug=workflow.slug )}" target="_top">View</a><a class="action-button" href="${h.url_for( controller='workflow', action='run', id=trans.security.encode_id( workflow.id ) )}">Run</a>
- <a class="action-button" href="${h.url_for( controller='workflow', action='clone', id=trans.security.encode_id( workflow.id ) )}">Clone</a>
+ <a class="action-button" href="${h.url_for( controller='workflow', action='copy', id=trans.security.encode_id( workflow.id ) )}">Copy</a><a class="action-button" confirm="Are you sure you want to remove the shared workflow '${h.to_unicode( workflow.name ) | h}'?" href="${h.url_for( controller='workflow', action='sharing', unshare_me=True, id=trans.security.encode_id( workflow.id ))}">Remove</a></div></td>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Change 'clone history' to 'copy history' in user interface and associated code.
by Bitbucket 15 Jan '13
by Bitbucket 15 Jan '13
15 Jan '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f93113b8e477/
changeset: f93113b8e477
user: jgoecks
date: 2013-01-15 16:48:35
summary: Change 'clone history' to 'copy history' in user interface and associated code.
affected #: 5 files
diff -r ec543816a2a2b6fea98e3353e65f9e9c30d62cbe -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 lib/galaxy/webapps/galaxy/controllers/history.py
--- a/lib/galaxy/webapps/galaxy/controllers/history.py
+++ b/lib/galaxy/webapps/galaxy/controllers/history.py
@@ -150,7 +150,7 @@
]
operations = [
grids.GridOperation( "View", allow_multiple=False, target="_top" ),
- grids.GridOperation( "Clone" ),
+ grids.GridOperation( "Copy" ),
grids.GridOperation( "Unshare" )
]
standard_filters = []
@@ -400,13 +400,13 @@
# Display history.
history = self.get_history( trans, ids[0], False)
return self.display_by_username_and_slug( trans, history.user.username, history.slug )
- elif operation == "clone":
+ elif operation == "copy":
if not ids:
- message = "Select a history to clone"
+ message = "Select a history to copy"
return self.shared_list_grid( trans, status='error', message=message, **kwargs )
- # When cloning shared histories, only copy active datasets
- new_kwargs = { 'clone_choice' : 'active' }
- return self.clone( trans, ids, **new_kwargs )
+ # When copying shared histories, only copy active datasets
+ new_kwargs = { 'copy_choice' : 'active' }
+ return self.copy( trans, ids, **new_kwargs )
elif operation == 'unshare':
if not ids:
message = "Select a history to unshare"
@@ -957,7 +957,7 @@
def share( self, trans, id=None, email="", **kwd ):
# If a history contains both datasets that can be shared and others that cannot be shared with the desired user,
# then the entire history is shared, and the protected datasets will be visible, but inaccessible ( greyed out )
- # in the cloned history
+ # in the copyd history
params = util.Params( kwd )
user = trans.get_user()
# TODO: we have too many error messages floating around in here - we need
@@ -1270,15 +1270,16 @@
return trans.show_message( "<p>%s" % change_msg, refresh_frames=['history'] )
@web.expose
- @web.require_login( "clone shared Galaxy history" )
- def clone( self, trans, id=None, **kwd ):
- """Clone a list of histories"""
+ @web.require_login( "copy shared Galaxy history" )
+ def copy( self, trans, id=None, **kwd ):
+ """Copy one or more histories"""
params = util.Params( kwd )
- # If clone_choice was not specified, display form passing along id
+ # If copy_choice was not specified, display form passing along id
# argument
- clone_choice = params.get( 'clone_choice', None )
- if not clone_choice:
- return trans.fill_template( "/history/clone.mako", id_argument=id )
+ copy_choice = params.get( 'copy_choice', None )
+ if not copy_choice:
+ return trans.fill_template( "/history/copy.mako", id_argument=id )
+
# Extract histories for id argument, defaulting to current
if id is None:
histories = [ trans.history ]
@@ -1296,20 +1297,20 @@
if trans.sa_session.query( trans.app.model.HistoryUserShareAssociation ) \
.filter_by( user=user, history=history ) \
.count() == 0:
- return trans.show_error_message( "The history you are attempting to clone is not owned by you or shared with you. " )
+ return trans.show_error_message( "The history you are attempting to copy is not owned by you or shared with you. " )
owner = False
- name = "Clone of '%s'" % history.name
+ name = "Copy of '%s'" % history.name
if not owner:
name += " shared by '%s'" % history.user.email
- if clone_choice == 'activatable':
+ if copy_choice == 'activatable':
new_history = history.copy( name=name, target_user=user, activatable=True )
- elif clone_choice == 'active':
+ elif copy_choice == 'active':
name += " (active items only)"
new_history = history.copy( name=name, target_user=user )
if len( histories ) == 1:
- msg = 'Clone with name "<a href="%s" target="_top">%s</a>" is now included in your previously stored histories.' % ( url_for( controller="history", action="switch_to_history", hist_id=trans.security.encode_id( new_history.id ) ) , new_history.name )
+ msg = 'New history "<a href="%s" target="_top">%s</a>" has been created.' % ( url_for( controller="history", action="switch_to_history", hist_id=trans.security.encode_id( new_history.id ) ) , new_history.name )
else:
- msg = '%d cloned histories are now included in your previously stored histories.' % len( histories )
+ msg = 'Copied and created %d new histories.' % len( histories )
return trans.show_ok_message( msg )
@web.expose
diff -r ec543816a2a2b6fea98e3353e65f9e9c30d62cbe -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 templates/history/clone.mako
--- a/templates/history/clone.mako
+++ /dev/null
@@ -1,27 +0,0 @@
-<% _=n_ %>
-<%inherit file="/base.mako"/>
-<%def name="title()">Clone History</%def>
-
-<div class="toolForm">
- <div class="toolFormTitle">Clone History</div>
- <div class="toolFormBody">
- <form action="${h.url_for( controller='history', action='clone' )}" method="post" >
- <div class="form-row">
- %if id_argument is not None:
- <input type="hidden" name="id" value="${id_argument}">
- %endif
- You can clone the history such that the clone will include all items in the original
- history, or you can eliminate the original history's deleted items from the clone.
- </div>
- <div class="form-row">
- <input type="radio" name="clone_choice" value="activatable"> Clone all history items, including deleted items
- </div>
- <div class="form-row">
- <input type="radio" name="clone_choice" value="active"> Clone only items that are not deleted
- </div>
- <div class="form-row">
- <input type="submit" name="clone_choice_button" value="Clone">
- </div>
- </form>
- </div>
-</div>
diff -r ec543816a2a2b6fea98e3353e65f9e9c30d62cbe -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 templates/history/copy.mako
--- /dev/null
+++ b/templates/history/copy.mako
@@ -0,0 +1,27 @@
+<% _=n_ %>
+<%inherit file="/base.mako"/>
+<%def name="title()">Copy History</%def>
+
+<div class="toolForm">
+ <div class="toolFormTitle">Copy History</div>
+ <div class="toolFormBody">
+ <form action="${h.url_for( controller='history', action='copy' )}" method="post" >
+ <div class="form-row">
+ %if id_argument is not None:
+ <input type="hidden" name="id" value="${id_argument}">
+ %endif
+ You can make a copy of the history that includes all datasets in the original history or just the active
+ (not deleted) datasets.
+ </div>
+ <div class="form-row">
+ <input type="radio" name="copy_choice" value="activatable"> Copy all datasets, including deleted ones
+ </div>
+ <div class="form-row">
+ <input type="radio" name="copy_choice" value="active"> Copy only active (not deleted) datasets
+ </div>
+ <div class="form-row">
+ <input type="submit" name="copy_choice_button" value="Copy">
+ </div>
+ </form>
+ </div>
+</div>
diff -r ec543816a2a2b6fea98e3353e65f9e9c30d62cbe -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 templates/history/options.mako
--- a/templates/history/options.mako
+++ b/templates/history/options.mako
@@ -16,7 +16,7 @@
%if len( history.active_datasets ) > 0:
<li><a href="${h.url_for( controller='root', action='history_new' )}">Create</a> a new empty history</li><li><a href="${h.url_for( controller='workflow', action='build_from_current_history' )}">Construct workflow</a> from current history</li>
- <li><a href="${h.url_for( controller='history', action='clone', id=trans.security.encode_id( history.id ) )}">Clone</a> current history</li>
+ <li><a href="${h.url_for( controller='history', action='copy', id=trans.security.encode_id( history.id ) )}">Copy</a> current history</li>
%endif
<li><a href="${h.url_for( controller='history', action='share' )}" target="galaxy_main">Share</a> current history</div><li><a href="${h.url_for( controller='root', action='history_set_default_permissions' )}">Change default permissions</a> for current history</li>
diff -r ec543816a2a2b6fea98e3353e65f9e9c30d62cbe -r f93113b8e4771c31aed6dd39aba38d09e11ffb31 templates/root/index.mako
--- a/templates/root/index.mako
+++ b/templates/root/index.mako
@@ -22,8 +22,8 @@
"${_("Create New")}": function() {
galaxy_history.location = "${h.url_for( controller='root', action='history_new' )}";
},
- "${_("Clone")}": function() {
- galaxy_main.location = "${h.url_for( controller='history', action='clone')}";
+ "${_("Copy History")}": function() {
+ galaxy_main.location = "${h.url_for( controller='history', action='copy')}";
},
"${_("Copy Datasets")}": function() {
galaxy_main.location = "${h.url_for( controller='dataset', action='copy_datasets' )}";
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0