Показаны сообщения с ярлыком diagram. Показать все сообщения
Показаны сообщения с ярлыком diagram. Показать все сообщения

28 февраля 2014

Своя панель в pyramid_debugtoolbar

В pyramid_debugtoolbar можно создавать панели для своих нужд.
Документация здесь: http://docs.pylonsproject.org/projects/pyramid_debugtoolbar/en/latest/#adding-custom-panels

Я создал небольшой пример, как это сделать на примере sadisplay.
sadisplay - это модуль который отображает модели SQLAlchemy в виде UML диаграммы.



Было бы удобно видеть схему БД проекта в дебаг панеле. Для этого создадим папку проекта pyramid_debugtoolbar_sadisplay со структурой:

├── __init__.py
├── panel.py
└── templates
    └── base.dbtmako

panel.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# vim:fenc=utf-8
#
# Copyright © 2014 uralbash 
#
# Distributed under terms of the MIT license.

"""
sadisplay in pyramid_debugtoolbar
"""
import pydot
import sadisplay
import sqlalchemy

from sqlalchemy import engine_from_config
from pyramid_debugtoolbar.panels import DebugPanel

_ = lambda x: x


def get_sa_base(request, settings=None):
    if settings is None:
        settings = request.registry.settings
    engine = engine_from_config(settings, 'sqlalchemy.')
    sabase = sqlalchemy.ext.declarative.declarative_base()
    sabase.metadata.reflect(engine)
    return sabase


class SadisplayDebugPanel(DebugPanel):
    """
debug panel
"""
    name = 'SADisplay'
    has_content = True
    template = 'pyramid_debugtoolbar_sadisplay:templates/base.dbtmako'

    def __init__(self, request):
        self.request = request
        self.data = {}
        self.Base = get_sa_base(request)

    def nav_title(self):
        return _('SADisplay')

    def url(self):
        return ''

    def title(self):
        return _('SADisplay')

    def render_vars(self, request):
        tables = self.Base.metadata.tables.values()
        desc = sadisplay.describe(tables)
        dot_data = sadisplay.dot(desc)
        graph = pydot.graph_from_dot_data(str(dot_data))
        svg_img = graph.create_svg()
        return {'svg_img': svg_img}

    def content(self):
        vars = self.render_vars(self.request)
        return self.render(
            'pyramid_debugtoolbar_sadisplay:templates/base.dbtmako',
            vars, self.request)

Функция get_sa_base создает base объект и заполняет его метаданными по строке подключения к БД, в дальнейшем мы сможем получить все модели проекта.
Метод render_vars при помощи sadisplay генерит текст формата dot и при помощи pydot конвертит его в svg.

В версии pyramid_debugtoolbar 1.0.* нужно рендерить шаблон в методе content. В 2.0.* метод content не нужен, шаблон указывается в виде атрибута template, а параметры атдаются в методе render_vars. В примере используются оба метода, что бы работало во всех версиях.

шаблон base.dbtmako
<h4>
SQLAlchemy models preview</h4>
${ svg_img|n }
link: <a href="https://github.com/uralbash/pyramid_debugtoolbar_sadisplay" style="color: blue;">pyramid_debugtoolbar_sadisplay</a>

Подключаем к приложению:
# __init__.py
# SADisplay in pyramid_debugtoolbar
from pyramid_debugtoolbar_sadisplay.panel import SadisplayDebugPanel
config.registry.settings['debugtoolbar.panels'].append(SadisplayDebugPanel)

Результат:



Код примера здесь: https://github.com/uralbash/pyramid_debugtoolbar_sadisplay

24 октября 2011

SQLalchemy UML диаграмма

Для визуализации своей базы в SQLAlchemy удобно использовать graphviz и библиотеку sqlalchemy_schemadisplay.
Установка:
apt-get install graphviz
pip install sqlalchemy_schemadisplay
Далее читаем доки SQLAlchemy Schema Display
Для Ъ:
Схема БД строится на основании данных базы.

from sqlalchemy import MetaData
from sqlalchemy_schemadisplay import create_schema_graph

# create the pydot graph object by autoloading all tables via a bound metadata object
graph = create_schema_graph(metadata=MetaData('postgres://user:pwd@host/database'),
   show_datatypes=False, # The image would get nasty big if we'd show the datatypes
   show_indexes=False, # ditto for indexes
   rankdir='LR', # From left to right (instead of top to bottom)
   concentrate=False # Don't try to join the relation lines together
)
graph.write_png('dbschema.png') # write out the file

Схема БД Postgres

Схема UML строится по моделям проекта.

from myapp import model
from sqlalchemy_schemadisplay import create_uml_graph
from sqlalchemy.orm import class_mapper

# lets find all the mappers in our model
mappers = []
for attr in dir(model):
    if attr[0] == '_': continue
    try:
        cls = getattr(model, attr)
        mappers.append(class_mapper(cls))
    except:
        pass

# pass them to the function and set some formatting options
graph = create_uml_graph(mappers,
    show_operations=False, # not necessary in this case
    show_multiplicity_one=False # some people like to see the ones, some don't
)
graph.write_png('schema.png') # write out the file

Схема моделей в Pylons
 
Для Django кодеров есть модуль django-extension который добавляет много полезных команд для manage.py. Вот мой вариант скрипта для Django:
project_dir/_visualozation/visualized.sh
curent_d="`date +%H%M_%d%m%y`" 
exec python ../manage.py graph_models -a -g -o scheme_of_$curent_d.png 

пример django-extension + graphviz
UPD: sadisplay - замечательная штука!