Warning
This document is for an in-development version of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.
Source code for galaxy.actions.admin
"""
Contains administrative functions
"""
import logging
from galaxy import util
from galaxy.exceptions import ActionInputError
log = logging.getLogger(__name__)
[docs]class AdminActions:
"""
Mixin for controllers that provide administrative functionality.
"""
def _create_quota(self, params, decode_id=None):
if params.amount.lower() in ('unlimited', 'none', 'no limit'):
create_amount = None
else:
try:
create_amount = util.size_to_bytes(params.amount)
except AssertionError:
create_amount = False
if not params.name or not params.description:
raise ActionInputError("Enter a valid name and a description.")
elif self.sa_session.query(self.app.model.Quota).filter(self.app.model.Quota.table.c.name == params.name).first():
raise ActionInputError("Quota names must be unique and a quota with that name already exists, so choose another name.")
elif not params.get('amount', None):
raise ActionInputError("Enter a valid quota amount.")
elif create_amount is False:
raise ActionInputError("Unable to parse the provided amount.")
elif params.operation not in self.app.model.Quota.valid_operations:
raise ActionInputError("Enter a valid operation.")
elif params.default != 'no' and params.default not in self.app.model.DefaultQuotaAssociation.types.__dict__.values():
raise ActionInputError("Enter a valid default type.")
elif params.default != 'no' and params.operation != '=':
raise ActionInputError("Operation for a default quota must be '='.")
elif create_amount is None and params.operation != '=':
raise ActionInputError("Operation for an unlimited quota must be '='.")
else:
# Create the quota
quota = self.app.model.Quota(name=params.name, description=params.description, amount=create_amount, operation=params.operation)
self.sa_session.add(quota)
# If this is a default quota, create the DefaultQuotaAssociation
if params.default != 'no':
self.app.quota_agent.set_default_quota(params.default, quota)
message = "Default quota '%s' has been created." % quota.name
else:
# Create the UserQuotaAssociations
in_users = [self.sa_session.query(self.app.model.User).get(decode_id(x) if decode_id else x) for x in util.listify(params.in_users)]
in_groups = [self.sa_session.query(self.app.model.Group).get(decode_id(x) if decode_id else x) for x in util.listify(params.in_groups)]
if None in in_users:
raise ActionInputError("One or more invalid user id has been provided.")
for user in in_users:
uqa = self.app.model.UserQuotaAssociation(user, quota)
self.sa_session.add(uqa)
# Create the GroupQuotaAssociations
if None in in_groups:
raise ActionInputError("One or more invalid group id has been provided.")
for group in in_groups:
gqa = self.app.model.GroupQuotaAssociation(group, quota)
self.sa_session.add(gqa)
message = "Quota '%s' has been created with %d associated users and %d associated groups." % (quota.name, len(in_users), len(in_groups))
self.sa_session.flush()
return quota, message
def _rename_quota(self, quota, params):
if not params.name:
raise ActionInputError('Enter a valid name.')
elif params.name != quota.name and self.sa_session.query(self.app.model.Quota).filter(self.app.model.Quota.table.c.name == params.name).first():
raise ActionInputError('A quota with that name already exists.')
else:
old_name = quota.name
quota.name = params.name
quota.description = params.description
self.sa_session.add(quota)
self.sa_session.flush()
message = "Quota '{}' has been renamed to '{}'.".format(old_name, params.name)
return message
def _manage_users_and_groups_for_quota(self, quota, params, decode_id=None):
if quota.default:
raise ActionInputError('Default quotas cannot be associated with specific users and groups.')
else:
in_users = [self.sa_session.query(self.app.model.User).get(decode_id(x) if decode_id else x) for x in util.listify(params.in_users)]
if None in in_users:
raise ActionInputError("One or more invalid user id has been provided.")
in_groups = [self.sa_session.query(self.app.model.Group).get(decode_id(x) if decode_id else x) for x in util.listify(params.in_groups)]
if None in in_groups:
raise ActionInputError("One or more invalid group id has been provided.")
self.app.quota_agent.set_entity_quota_associations(quotas=[quota], users=in_users, groups=in_groups)
self.sa_session.refresh(quota)
message = "Quota '%s' has been updated with %d associated users and %d associated groups." % (quota.name, len(in_users), len(in_groups))
return message
def _edit_quota(self, quota, params):
if params.amount.lower() in ('unlimited', 'none', 'no limit'):
new_amount = None
else:
try:
new_amount = util.size_to_bytes(params.amount)
except (AssertionError, ValueError):
new_amount = False
if not params.amount:
raise ActionInputError('Enter a valid amount.')
elif new_amount is False:
raise ActionInputError('Unable to parse the provided amount.')
elif params.operation not in self.app.model.Quota.valid_operations:
raise ActionInputError('Enter a valid operation.')
else:
quota.amount = new_amount
quota.operation = params.operation
self.sa_session.add(quota)
self.sa_session.flush()
message = "Quota '{}' is now '{}'.".format(quota.name, quota.operation + quota.display_amount)
return message
def _set_quota_default(self, quota, params):
if params.default != 'no' and params.default not in self.app.model.DefaultQuotaAssociation.types.__dict__.values():
raise ActionInputError('Enter a valid default type.')
else:
if params.default != 'no':
self.app.quota_agent.set_default_quota(params.default, quota)
message = "Quota '{}' is now the default for {} users.".format(quota.name, params.default)
else:
if quota.default:
message = "Quota '{}' is no longer the default for {} users.".format(quota.name, quota.default[0].type)
for dqa in quota.default:
self.sa_session.delete(dqa)
self.sa_session.flush()
else:
message = "Quota '%s' is not a default." % quota.name
return message
def _unset_quota_default(self, quota, params=None):
if not quota.default:
raise ActionInputError("Quota '%s' is not a default." % quota.name)
else:
message = "Quota '{}' is no longer the default for {} users.".format(quota.name, quota.default[0].type)
for dqa in quota.default:
self.sa_session.delete(dqa)
self.sa_session.flush()
return message
def _delete_quota(self, quota, params=None):
quotas = util.listify(quota)
names = []
for q in quotas:
if q.default:
names.append(q.name)
if len(names) == 1:
raise ActionInputError("Quota '%s' is a default, please unset it as a default before deleting it." % (names[0]))
elif len(names) > 1:
raise ActionInputError("Quotas are defaults, please unset them as defaults before deleting them: " + ', '.join(names))
message = "Deleted %d quotas: " % len(quotas)
for q in quotas:
q.deleted = True
self.sa_session.add(q)
names.append(q.name)
self.sa_session.flush()
message += ', '.join(names)
return message
def _undelete_quota(self, quota, params=None):
quotas = util.listify(quota)
names = []
for q in quotas:
if not q.deleted:
names.append(q.name)
if len(names) == 1:
raise ActionInputError("Quota '%s' has not been deleted, so it cannot be undeleted." % (names[0]))
elif len(names) > 1:
raise ActionInputError("Quotas have not been deleted so they cannot be undeleted: " + ', '.join(names))
message = "Undeleted %d quotas: " % len(quotas)
for q in quotas:
q.deleted = False
self.sa_session.add(q)
names.append(q.name)
self.sa_session.flush()
message += ', '.join(names)
return message
def _purge_quota(self, quota, params=None):
"""
This method should only be called for a Quota that has previously been deleted.
Purging a deleted Quota deletes all of the following from the database:
- UserQuotaAssociations where quota_id == Quota.id
- GroupQuotaAssociations where quota_id == Quota.id
"""
quotas = util.listify(quota)
names = []
for q in quotas:
if not q.deleted:
names.append(q.name)
if len(names) == 1:
raise ActionInputError("Quota '%s' has not been deleted, so it cannot be purged." % (names[0]))
elif len(names) > 1:
raise ActionInputError("Quotas have not been deleted so they cannot be undeleted: " + ', '.join(names))
message = "Purged %d quotas: " % len(quotas)
for q in quotas:
# Delete UserQuotaAssociations
for uqa in q.users:
self.sa_session.delete(uqa)
# Delete GroupQuotaAssociations
for gqa in q.groups:
self.sa_session.delete(gqa)
names.append(q.name)
self.sa_session.flush()
message += ', '.join(names)
return message