Source code for galaxy.webapps.reports.controllers.users

from datetime import datetime, date, timedelta
import calendar
import operator
from galaxy.web.base.controller import BaseUIController, web
import galaxy.model
from galaxy import util
import pkg_resources
pkg_resources.require( "SQLAlchemy >= 0.4" )
import sqlalchemy as sa
from galaxy.webapps.reports.controllers.query import ReportQueryBuilder
import logging
from markupsafe import escape

log = logging.getLogger( __name__ )


[docs]class Users( BaseUIController, ReportQueryBuilder ): @web.expose
[docs] def registered_users( self, trans, **kwd ): message = escape( util.restore_text( kwd.get( 'message', '' ) ) ) num_users = trans.sa_session.query( galaxy.model.User ).count() return trans.fill_template( '/webapps/reports/registered_users.mako', num_users=num_users, message=message )
@web.expose
[docs] def registered_users_per_month( self, trans, **kwd ): message = escape( util.restore_text( kwd.get( 'message', '' ) ) ) q = sa.select( ( self.select_month( galaxy.model.User.table.c.create_time ).label( 'date' ), sa.func.count( galaxy.model.User.table.c.id ).label( 'num_users' ) ), from_obj=[ galaxy.model.User.table ], group_by=self.group_by_month( galaxy.model.User.table.c.create_time ), order_by=[ sa.desc( 'date' ) ] ) users = [] for row in q.execute(): users.append( ( row.date.strftime( "%Y-%m" ), row.num_users, row.date.strftime( "%B" ), row.date.strftime( "%Y" ) ) ) return trans.fill_template( '/webapps/reports/registered_users_per_month.mako', users=users, message=message )
@web.expose
[docs] def specified_month( self, trans, **kwd ): message = escape( util.restore_text( kwd.get( 'message', '' ) ) ) # If specified_date is not received, we'll default to the current month specified_date = kwd.get( 'specified_date', datetime.utcnow().strftime( "%Y-%m-%d" ) ) specified_month = specified_date[ :7 ] year, month = map( int, specified_month.split( "-" ) ) start_date = date( year, month, 1 ) end_date = start_date + timedelta( days=calendar.monthrange( year, month )[1] ) month_label = start_date.strftime( "%B" ) year_label = start_date.strftime( "%Y" ) q = sa.select( ( self.select_day( galaxy.model.User.table.c.create_time ).label( 'date' ), sa.func.count( galaxy.model.User.table.c.id ).label( 'num_users' ) ), whereclause=sa.and_( galaxy.model.User.table.c.create_time >= start_date, galaxy.model.User.table.c.create_time < end_date ), from_obj=[ galaxy.model.User.table ], group_by=self.group_by_day( galaxy.model.User.table.c.create_time ), order_by=[ sa.desc( 'date' ) ] ) users = [] for row in q.execute(): users.append( ( row.date.strftime( "%Y-%m-%d" ), row.date.strftime( "%d" ), row.num_users, row.date.strftime( "%A" ) ) ) return trans.fill_template( '/webapps/reports/registered_users_specified_month.mako', month_label=month_label, year_label=year_label, month=month, users=users, message=message )
@web.expose
[docs] def specified_date( self, trans, **kwd ): message = escape( util.restore_text( kwd.get( 'message', '' ) ) ) # If specified_date is not received, we'll default to the current month specified_date = kwd.get( 'specified_date', datetime.utcnow().strftime( "%Y-%m-%d" ) ) year, month, day = map( int, specified_date.split( "-" ) ) start_date = date( year, month, day ) end_date = start_date + timedelta( days=1 ) day_of_month = start_date.strftime( "%d" ) day_label = start_date.strftime( "%A" ) month_label = start_date.strftime( "%B" ) year_label = start_date.strftime( "%Y" ) q = sa.select( ( self.select_day( galaxy.model.User.table.c.create_time ).label( 'date' ), galaxy.model.User.table.c.email ), whereclause=sa.and_( galaxy.model.User.table.c.create_time >= start_date, galaxy.model.User.table.c.create_time < end_date ), from_obj=[ galaxy.model.User.table ], order_by=[ galaxy.model.User.table.c.email ] ) users = [] for row in q.execute(): users.append( ( row.email ) ) return trans.fill_template( '/webapps/reports/registered_users_specified_date.mako', specified_date=start_date, day_label=day_label, month_label=month_label, year_label=year_label, day_of_month=day_of_month, users=users, message=message )
@web.expose
[docs] def last_access_date( self, trans, **kwd ): message = escape( util.restore_text( kwd.get( 'message', '' ) ) ) not_logged_in_for_days = kwd.get( 'not_logged_in_for_days', 90 ) if not not_logged_in_for_days: not_logged_in_for_days = 0 cutoff_time = datetime.utcnow() - timedelta( days=int( not_logged_in_for_days ) ) users = [] for user in trans.sa_session.query( galaxy.model.User ) \ .filter( galaxy.model.User.table.c.deleted == False ) \ .order_by( galaxy.model.User.table.c.email ): if user.galaxy_sessions: last_galaxy_session = user.galaxy_sessions[ 0 ] if last_galaxy_session.update_time < cutoff_time: users.append( ( user.email, last_galaxy_session.update_time.strftime( "%Y-%m-%d" ) ) ) else: # The user has never logged in users.append( ( user.email, "never logged in" ) ) users = sorted( users, key=operator.itemgetter( 1 ), reverse=True ) return trans.fill_template( '/webapps/reports/users_last_access_date.mako', users=users, not_logged_in_for_days=not_logged_in_for_days, message=message )
@web.expose
[docs] def user_disk_usage( self, trans, **kwd ): message = escape( util.restore_text( kwd.get( 'message', '' ) ) ) user_cutoff = int( kwd.get( 'user_cutoff', 60 ) ) # disk_usage isn't indexed users = sorted( trans.sa_session.query( galaxy.model.User ).all(), key=operator.attrgetter( 'disk_usage' ), reverse=True ) if user_cutoff: users = users[:user_cutoff] return trans.fill_template( '/webapps/reports/users_user_disk_usage.mako', users=users, user_cutoff=user_cutoff, message=message )