def get_db_overview_rst(self): """ Returns a reStructredText-formatted "database overview" report. Used by the :mod:`diag <lino.management.commands.diag>` command and in test cases. """ from atelier import rstgen from lino.core.dbutils import (full_model_name, sorted_models_list, app_labels) #~ writeln("Lino %s" % lino.__version__) #~ yield (settings.SITE.verbose_name, settings.SITE.version) #~ writeln(settings.SITE.title) models_list = sorted_models_list() apps = app_labels() s = "%d apps: %s." % (len(apps), ", ".join(apps)) s += "\n%d models:\n" % len(models_list) i = 0 headers = [ #~ "No.", "Name", #~ "Class", #~ "M", "#fields", "#rows", #~ ,"first","last" ] rows = [] for model in models_list: if model._meta.managed: i += 1 cells = [] #~ cells.append(str(i)) cells.append(full_model_name(model)) #~ cells.append(str(model)) #~ if model._meta.managed: #~ cells.append('X') #~ else: #~ cells.append('') cells.append(str(len(model._meta.fields))) #~ qs = model.objects.all() qs = model.objects.order_by('pk') n = qs.count() cells.append(str(n)) #~ if n: #~ cells.append(obj2str(qs[0])) #~ cells.append(obj2str(qs[n-1])) #~ else: #~ cells.append('') #~ cells.append('') rows.append(cells) s += rstgen.table(headers, rows) return s
def handle(self, *args, **options): if args: raise CommandError("This command doesn't accept any arguments.") self.options = options #~ settings.SITE.startup() state = dict() state.update(timestamp=datetime.datetime.now()) state.update(lino_version=lino.__version__) states_file = os.path.join(settings.SITE.project_dir, 'states.pck') if os.path.exists(states_file): fd = open(states_file) states_list = pickle.load(fd) fd.close() logger.info("Loaded %d states from %s", len(states_list), states_file) else: states_list = [] models_list = sorted_models_list() apps = app_labels() state.update(applications=" ".join(apps)) for model in models_list: if model._meta.managed: model_state = dict() #~ cells.append(str(i)) #~ cells.append(full_model_name(model)) #~ cells.append(str(model)) #~ if model._meta.managed: #~ cells.append('X') #~ else: #~ cells.append('') model_state.update(fields=[f.name for f in model._meta.fields]) #~ qs = model.objects.all() qs = model.objects.order_by('pk') n = qs.count() model_state.update(rows=n) connection = connections[DEFAULT_DB_ALIAS] #~ if isinstance(connection,sqlite): #~ cells.append("-") if mysql and isinstance(connection, mysql): cursor = connection.cursor() dbname = connection.settings_dict['NAME'] sql = """\ SELECT (data_length+index_length) tablesize FROM information_schema.tables WHERE table_schema='%s' and table_name='%s'; """ % (dbname, model._meta.db_table) #~ print sql cursor.execute(sql) row = cursor.fetchone() if row is not None: model_state.update(bytes=row[0]) else: pass state[full_model_name(model)] = model_state if len(states_list): msg = compare(state, states_list[-1]) if msg: logger.info(msg) #~ sendmail_admins() states_list.append(state) #~ print state if self.options['write']: f = open(states_file, 'w') pickle.dump(states_list, f) logger.info("Saved %d states to %s", len(states_list), states_file)