Велосипед не мой, я лишь объяву разместил.
У меня пока не хватает кармы на хабре, чтоб раздавать инвайты за полезные статьи, так что приходится, пока просто копировать в “бложик”, ибо они совсем выпадут из выдачи гугла.
Создание панели для Django Debug Toolbar
При отладке джангопроектов становиться необходимостью просмотр различной отладочной информации.
На вопрос отладки в полной мере отвечает приложение Django Debug Toolbar. Воспользуемся возможностью расширения функционала DDT и создадим панель для собственных нужд.
Создание панели
Так как системы контроля версий повсеместно используются для работы над проектами, время от времени возникает необходимость проверить когда тот или иной коммит был добавлен.
По причине того, что я использую git, данная панель будет взаимодействовать именно с этой vcs.
Примером при написании панели послужило приложение django-git, созданное с целью замены gitweb.
В качестве обертки для git был использован модуль GitPython.
Сначала напишем модуль с производным классом от DebugPanel (к примеру, в директории с каким-нибуть из приложений), назовем его panels.py:
[cc lang=”python”]import os
import time
from git import *
from debug_toolbar.panels import DebugPanel
from django.template.loader import render_to_string
class GitStatusPanel(DebugPanel):
name = ‘Git’
has_content = True
def nav_title(self):
return self.name
def title(self):
return self.name
def url(self):
return ”
def content(self):
repo_path = ‘../GitPython’
repo = Repo(repo_path)
return render_to_string(‘debug_toolbar/panels/commits.html’, {‘commits’: repo})
[/cc]
repo_path — относительный путь к репозиторию.
Так как GitPython возвращает время добавления коммита в формате unixtime, напишем templatetag для конвертации даты в нужную форму.
app_name/templatetags/cdate.py:
[cc lang=”python”]import time
from django import template
register = template.Library()
@register.filter
def cdate(value):
date = time.strftime(“%d.%M.%Y, %H:%M:%S”, time.localtime(value))
return date
[/cc]
Затем, создадим шаблон страницы в директории с остальными шаблонами DDT (templates/debug_toolbar/panels/commits.html) следующего содержания:
[cc lang=”html”]
{% load i18n %}
{% load cdate %}
Commit | Date | Author |
---|---|---|
{{commit}} | {{commit.committed_date|cdate}} | {{commit.committer.name}}, {{commit.committer.email}} |
[/cc]
В результате получилась панель со списком коммитов:
Так как задачей было также отобразить список действий в рамках коммитов, напишем соответствующую страницу.
Правим urls.py:
[cc lang=”python”]urlpatterns = patterns(”,
…
(r’^__debug__/commit/([a-z0-9]+)$’, show_commit),
)
[/cc]
Добавим функцию show_commit к вьюхам приложения app_name (app_name/views.py) или к вьюхам проекта (views.py):
[cc lang=”python”]def show_commit(request, commit):
repo_path = ‘../GitPython’
repo = Repo(repo_path)
commit_item = repo.commit(commit)
commit_diffs = commit_item.diff()
changes = []
for blob in commit_item.tree:
try:
changes.append({‘path’: blob[0].path, ‘content’: blob[0].data_stream.read()})
except:
changes.append({‘path’: blob.path, ‘content’: blob.data_stream.read()})
return render_to_response(‘debug_toolbar/panels/commit.html’, {‘commit’: commit, ‘commit_item’: commit_item, ‘commit_diffs’: commit_diffs, ‘changes’: changes})
[/cc]
Воспользовавшись API модуля GitPython получили список изменений, а с помощью свойств объекта blob — путь к модифицированным файлам и их raw-содержимое.
И наконец, создадим шаблон, templates/debug_toolbar/panels/commit.html:
[cc lang=”python”]{% load i18n %}
Commit {{commit}}
{{diff}}
{% if diff.deleted_file %}
File was removed.
{% endif %}
{% if diff.new_file %}
File was created.
{% endif %}
{% if diff.rename %}
File was renamed: {{diff.rename_from}} → {{diff.rename_to}}
{% endif %}
{% endfor %}
{% if commit_diffs %}
Modified files
{% for change in changes %}
file: {{change.path}}
{% autoescape off %}{{change.content}}{% endautoescape %}
{% endfor %}
{% endif %}
[/cc]
На данной странице будет отображен комментарий к коммиту, список изменений в рамках коммита, а также список путей и содержимого файлами, которые подверглись изменениям.
Результат:
При необходимости, можно добавить подсветку синтаксиса с помощью pygments.
Материалы
Страница проекта на github — https://github.com/robhudson/django-debug-toolbar,
статья о создании своей панели — http://blog.akei.com/post/3600587187/creating-a-custom-panel-for-the-django-debug-toolbar.
страница модуля GitPython — https://github.com/gitpython-developers/GitPython,
страница приложения django-git — https://github.com/sethtrain/django-git.
PS Песочница хабра