<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>Oduvan's Web Blog</title>
	
	<link>http://www.lyabah.com</link>
	<description />
	<lastBuildDate>Thu, 13 Oct 2011 13:00:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/OduvansWebBlog" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="oduvanswebblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Python. Json. Как не сериализировать уже сериализированое</title>
		<link>http://www.lyabah.com/index.php/2011/10/13/python-json/</link>
		<comments>http://www.lyabah.com/index.php/2011/10/13/python-json/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 13:00:32 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[json]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=953</guid>
		<description><![CDATA[Бомбезное название придумал!
Проблема. У меня в таблице в 2х полях лежить жсон. А в ответ на запрос пользователю я должен вернуть другой дсон, некоторыми ключами которого будут жсоны из наших полей. 
Решение в лоп &#8211; загрузится с этих полей данные и использовать их в формировании жсона. Но получается дурная работа



return json.dumps&#40;&#123;


&#160; &#160; &#39;user_id&#39;:request.user.id


&#160; &#160; &#39;user_data&#39;:request.user.data&#40;&#41;,


&#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Бомбезное название придумал!</p>
<p>Проблема. У меня в таблице в 2х полях лежить жсон. А в ответ на запрос пользователю я должен вернуть другой дсон, некоторыми ключами которого будут жсоны из наших полей. </p>
<p>Решение в лоп &#8211; загрузится с этих полей данные и использовать их в формировании жсона. Но получается дурная работа</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">return</span> json.<span class="me1">dumps</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;user_id&#39;</span>:request.<span class="kw3">user</span>.<span class="kw2">id</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;user_data&#39;</span>:request.<span class="kw3">user</span>.<span class="me1">data</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;info_1&#39;</span>:json.<span class="me1">loads</span><span class="br0">&#40;</span>model_obj.<span class="me1">info1</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="st0">&#39;info_2&#39;</span>:json.<span class="me1">loads</span><span class="br0">&#40;</span>model_obj.<span class="me1">info2</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>тут получается мы гоняем данные из жсона и обратно в холостую. Я тут наклепал небольшой модулик с использованием json  чтоб этого не делать</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">import</span> json</div>
</li>
<li class="li1">
<div class="de1">loads = json.<span class="me1">loads</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> JSONotEncode<span class="br0">&#40;</span><span class="kw2">object</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>,data<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="kw2">str</span> = data</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> simple<span class="br0">&#40;</span>data<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> JSONotEncode<span class="br0">&#40;</span>data<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> JSONEncoderSimple<span class="br0">&#40;</span>json.<span class="me1">JSONEncoder</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> _iterencode<span class="br0">&#40;</span><span class="kw2">self</span>,obj,<span class="sy0">*</span>args,<span class="sy0">**</span>kwargs<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">isinstance</span><span class="br0">&#40;</span>obj, JSONotEncode<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> obj.<span class="kw2">str</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> json.<span class="me1">JSONEncoder</span>._iterencode<span class="br0">&#40;</span><span class="kw2">self</span>,obj,<span class="sy0">*</span>args,<span class="sy0">**</span>kwargs<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> dumps<span class="br0">&#40;</span>data<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> json.<span class="me1">dumps</span><span class="br0">&#40;</span>data,cls=JSONEncoderSimple<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> loads<span class="br0">&#40;</span>data<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> json.<span class="me1">loads</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">if</span> __name__ == <span class="st0">&#39;__main__&#39;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">print</span> dumps<span class="br0">&#40;</span><span class="br0">&#123;</span><span class="st0">&#39;a&#39;</span>:<span class="nu0">1</span>,<span class="st0">&#39;b&#39;</span>:<span class="st0">&#39;sdr&#39;</span>,<span class="st0">&#39;c&#39;</span>:simple<span class="br0">&#40;</span><span class="st0">&#39;{&quot;v&quot;:1}&#39;</span><span class="br0">&#41;</span><span class="br0">&#125;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Как видите, теперь данные, которые и так JSON просто оборачиваем в функцию simple и холостого хода не происходит.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/10/13/python-json/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Django. Быстрый способ сохранить копию объекта</title>
		<link>http://www.lyabah.com/index.php/2011/07/12/django-object-copy/</link>
		<comments>http://www.lyabah.com/index.php/2011/07/12/django-object-copy/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 00:36:28 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=949</guid>
		<description><![CDATA[


from money.models import Trans


cur_model = Trans.objects.all&#40;&#41;&#91;0&#93;


// and make a copy


cur_model.pk = None


cur_model.save&#40;&#41; //ha ha



]]></description>
			<content:encoded><![CDATA[<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">from</span> money.<span class="me1">models</span> <span class="kw1">import</span> Trans</div>
</li>
<li class="li1">
<div class="de1">cur_model = Trans.<span class="me1">objects</span>.<span class="me1">all</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">// <span class="kw1">and</span> make a <span class="kw3">copy</span></div>
</li>
<li class="li1">
<div class="de1">cur_model.<span class="me1">pk</span> = <span class="kw2">None</span></div>
</li>
<li class="li1">
<div class="de1">cur_model.<span class="me1">save</span><span class="br0">&#40;</span><span class="br0">&#41;</span> //ha ha</div>
</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/07/12/django-object-copy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Об оговорках или “Мопед не мой, я просто разместил объяву…”</title>
		<link>http://www.lyabah.com/index.php/2011/06/27/posts/</link>
		<comments>http://www.lyabah.com/index.php/2011/06/27/posts/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 13:16:58 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=945</guid>
		<description><![CDATA[Часто в статьях нахожу оговорки, и наконецто дошли руки, чтоб потратить минутку и черкнуть пару слов на тему оговорок:
&#8220;Сразу скажу, что это мое личное мнение&#8230;&#8221;
&#8220;Я не профи, и могу что-то упустить&#8230;&#8221;
&#8220;Не бейте сильно, я недавно пишу&#8230;&#8221;
и еще милион всяких других&#8230; Не уверен, но в арххивах этого блога тоже можно будет найти парочку.  В некоторых [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lyabah.com/wp-content/uploads/2011/06/contented-writer.jpg"><img src="http://www.lyabah.com/wp-content/uploads/2011/06/contented-writer.jpg" alt="" title="contented-writer" width="344" height="350" class="alignleft size-full wp-image-946" /></a>Часто в статьях нахожу оговорки, и наконецто дошли руки, чтоб потратить минутку и черкнуть пару слов на тему оговорок:</p>
<p>&#8220;Сразу скажу, что это мое личное мнение&#8230;&#8221;</p>
<p>&#8220;Я не профи, и могу что-то упустить&#8230;&#8221;</p>
<p>&#8220;Не бейте сильно, я недавно пишу&#8230;&#8221;</p>
<p>и еще милион всяких других&#8230; Не уверен, но в арххивах этого блога тоже можно будет найти парочку.  В некоторых статьях я замечаю прям абзаци посвещенные этому. Даже думаю начать их собирать.</p>
<p>Первое, что мне непонятно &#8211; так это <strong>зачем это писать?</strong> Что за детская неуверенность и робость. Ну правда. Ну написал ты статью, ну к примеру, тюнинг конфига mysql. И в конце &#8211; &#8220;ну статья не может быть полной, и я не являюсь большим специалистом в MySQL поэтому не бейте меня сильно&#8221;. А я читаю это а в голове продолжение: &#8221; &#8230; поэтому тупо хвалите меня и восхищайтесь мной&#8221; <img src='http://www.lyabah.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Я считаю, что основной плюс того, что ты ведешь свой блог и пишеш статьи или обзоры именно в том, что ты еще что-то точно не знаешь и твой блогодарный читатель всегда укажет тебе на ошибку или упущение ( но не всегда мягко ).</p>
<p>Вам в статье надо наоборот подбивать читателя к критике, а не написав статью вконце умащивать себе пути отступления. Мне кажется идеальным вариантом будет, если в конце статьи Вы задаете вопрос читателю. </p>
<p>А какая по Вашему идеальная концовка должна быть в постах?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/06/27/posts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Методология написания тестов в Django с использованием fixtures</title>
		<link>http://www.lyabah.com/index.php/2011/06/10/testing-django-fixtures/</link>
		<comments>http://www.lyabah.com/index.php/2011/06/10/testing-django-fixtures/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 19:37:14 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[fixtures]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=941</guid>
		<description><![CDATA[В Django есть такая удобная вещь для написания тестов — это fixtures. Удобство состоит в том, что ваши тесты могут входить в уже заполненный данными проект. Например тестируем работу админчасти статистики, надо иметь готовый массив данных, с которым оперируем и проверяем результаты. Неудобство состоит в том, что эти фикстуры надо где взять, надо поддерживать актуальными, [...]]]></description>
			<content:encoded><![CDATA[<p>В <strong><a href="https://www.djangoproject.com/">Django</a></strong> есть такая удобная вещь для написания тестов — это <a href="https://docs.djangoproject.com/en/dev/topics/testing/#django.test.TestCase.fixtures">fixtures</a>. Удобство состоит в том, что ваши тесты могут входить в уже заполненный данными проект. Например тестируем работу админчасти статистики, надо иметь готовый массив данных, с которым оперируем и проверяем результаты. Неудобство состоит в том, что эти фикстуры надо где взять, надо поддерживать актуальными, такими-же актуальными как и тесты. Вот как раз и про неудобную часть, а также паре подводных камней я бы и хотел вам рассказать.</p>
<h2>Получаем фикстуру</h2>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">python manage.py dumpdata <span class="sy0">&gt;</span> all_data.json</div>
</li>
</ol>
</div>
<p>Рассказывать, что это означает я не буду, но то есть хорошая <a href="https://docs.djangoproject.com/en/dev/topics/testing/#django.test.TestCase.fixtures">документация по фикстурам у самой Django </a>.</p>
<p>Я «обплетал» тесты уже готового написанного проекта. В нагрузку с проектом идет дамп базы, которая,  как это не удивительно,  может быть не <a href="http://ru.wikipedia.org/wiki/%D0%A6%D0%B5%D0%BB%D0%BE%D1%81%D1%82%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B1%D0%B0%D0%B7%D1%8B_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85">целостная</a>.  Самый часты бок — это когда записи по форенключу нет. Например у Вас есть профиль, но нет юзера или есть транзакция между не существующими счетами.</p>
<p>Самое обидное, что Джанго Вам не поможет решить эту проблему. И получите что-то типа<br />
<em>Error: Unable to serialize database:</em></p>
<p>Нагугил тикет в <a href="https://code.djangoproject.com">Django Code</a>:<br />
<a href="https://code.djangoproject.com/ticket/6773">https://code.djangoproject.com/ticket/6773</a></p>
<p>К которому прилагается команда, которая показывает Вам «разбитые модели», т. е. модели не полные с неверными данными в  ForeignKey .<br />
Я ее немного приукрасил возможностью удалять их автоматом <a href="https://gist.github.com/1018947">https://gist.github.com/1018947</a>.  Для реальных данных удаление автоматом — это не очень обдуманный шаг, но мне сейчас надо получить хоть какую-то фикстуру.</p>
<h2>Подержание актуальности фикстуры</h2>
<p>Для поддержки актуальности базы между всеми разработчиками используется django-south, мне кажется это уже давно стало стандартом Django разработки. Тот же механизм можно использовать для поддержки актуальности с фикстурами, поэтому я одну фикстуру полностью перегоняю в sqlite3 базу, которую как и фикстуру держу в репозитарии проекта и для доступа к которой использую отдельный сетингс.</p>
<p>Сеттингс файл для этого состоит из 3х строчек (settings_lights.py):</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">from</span> settings <span class="kw1">import</span> <span class="sy0">*</span></div>
</li>
<li class="li1">
<div class="de1">DATABASES<span class="br0">&#91;</span><span class="st0">&#39;default&#39;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;ENGINE&#39;</span><span class="br0">&#93;</span> =<span class="st0">&#39;django.db.backends.sqlite3&#39;</span> </div>
</li>
<li class="li1">
<div class="de1">DATABASES<span class="br0">&#91;</span><span class="st0">&#39;default&#39;</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#39;NAME&#39;</span><span class="br0">&#93;</span> = <span class="st0">&#39;lights.db&#39;</span></div>
</li>
</ol>
</div>
<p>Как известно, в любую команду можно передать не стандартное имя сетингс модуля.</p>
<p>Например, для того, чтоб запустить его и добавить новых данных:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">python manage.py runserver <span class="nu0">0</span>:<span class="nu0">8001</span> &#8211;<span class="re2">settings=</span>settings_lights</div>
</li>
<li class="li1">
<div class="de1">python manage.py dumpdata &#8211;<span class="re2">setting=</span>settings_lights <span class="sy0">&gt;</span> all_data.json</div>
</li>
</ol>
</div>
<p>А поддерживать актуальность фикстуры можно через миграции, которые вы создаете после изменения структуры базы</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">python manage.py migrate &#8211;<span class="re2">settings=</span>settings_lights</div>
</li>
<li class="li1">
<div class="de1">python manage.py dumpdata &#8211;<span class="re2">setting=</span>settings_lights <span class="sy0">&gt;</span> all_data.json</div>
</li>
</ol>
</div>
<h2>Тестирование</h2>
<p>Для тестирования я использую тот-же <em>settings_lights.py</em> для того, чтобы использовать <strong>sqlite3</strong> в тестах, при этом для тестов вся база будет держаться в памяти, что существенно ускорит процесс написания тестов и тестирования их. </p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">python manage.py <span class="kw3">test</span> &#8211;<span class="re2">settings=</span>settings_lights</div>
</li>
</ol>
</div>
<p>Но я думаю как финальную проверку, после того, как вы закончили с разработкой ( доработкой  ) тестов можно использовать и реальный Engine.</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">python manage.py <span class="kw3">test</span></div>
</li>
</ol>
</div>
<p>А собственно сам текст тестов может выглядить так:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">from</span> django.<span class="kw3">test</span> <span class="kw1">import</span> TestCase</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> django.<span class="kw3">test</span>.<span class="me1">client</span> <span class="kw1">import</span> Client</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> django.<span class="me1">contrib</span>.<span class="me1">auth</span>.<span class="me1">models</span> <span class="kw1">import</span> User</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">class</span> SimpleTest<span class="br0">&#40;</span>TestCase<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fixtures = <span class="br0">&#91;</span><span class="st0">&#39;all_data.json&#39;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> setUp<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>: &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">client</span> = Client<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">def</span> test_details<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> User.<span class="me1">objects</span>.<span class="me1">all</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Этот пример ничего не тестирует, а просто показывает Вам, что данные на момент запуска тестов в базе уже есть. Фикстуры можно хранить как в папке fixtures любой апы, не только тестируемой. А еще в <a href="https://docs.djangoproject.com/en/1.3/ref/settings/#fixture-dirs">сетингсах</a> можно прописать:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1">FIXTURE_DIRS = <span class="br0">&#40;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="st0">&#39;/path/to/myapp/fixtures/&#39;</span>,</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<h2>Проблема с сигналами</h2>
<p><i>Про сигналы в Django вы можете почитать в <a href="https://docs.djangoproject.com/en/1.3/topics/signals/">документции</a>.</i></p>
<p>Фикстура — это по сути сериализация ОРМ объектов, т. е. объект будет сохранен как json, как просто текст. А значит загрузка из фикстуры — это поочередное добавление всех объектов, а добавление объектов связано с вызовом сигналов, которые в свою очередь могу сами создавать объекты моделей или изменять существующие. </p>
<p>Например. У Вас есть 2 модели счета и транзакции. При добавлении транзакции — дергается сигнал, по которому изменяются балансы счетов участников этой транзакции. При подготовке фикстуры  вы создали одну транзакцию между двумя счетами на сумму 100 рублей, т. е. после ее проведения на одном счету прибавится 100 рублей, а на другой вычтится. Вы сохраните полученные данные в файл фикстуры, в которой будут готовые записи со счетами и транзакциями. Во время тестирования этот файл будет загружаться и вначале загрузятся модели счетов &#8211; на одном 100, на другом -100. После загрузятся транзакции и дернут сигнал, который еще раз изменит балансы на счетах и мы во время тестирования увидим состояния на счетах 200 и -200.</p>
<p>Решение у джанги <a href="https://code.djangoproject.com/ticket/5422">есть</a> , но почему-то не документированное, и как по мне — очень не удачное.</p>
<p>В обработчик сигнала передается параметр raw который True во время загрузки фиксутры.</p>
<p>Так что, если вы не хотите, чтоб обработчик сигнала работал в момент загрузки фикстуры, то первые 3 строчки вашего обработчика могут выглядит так:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">def</span> trans_save<span class="br0">&#40;</span>sender, instance, raw, &nbsp;<span class="sy0">**</span>kwargs<span class="br0">&#41;</span>: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> raw: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span></div>
</li>
</ol>
</div>
<p>Как по мне — это недокументированную возможность надо огромными буквами задокументировать в обоих разделах — тесты и сигналы, но я думаю будут решения и лучше этой проблемы.</p>
<p>У меня все. Я описал то, как  с фикстурами работаю я, и очевидно, что они могут сэкономить очень много времени Вам при разработке тестов, а также могут помогать Вам делать более качественные и реальные тесты. </p>
<p>Хотелось бы в комментариях увидеть критику такого подхода, дополнения, подводные камни, с которым вы сталкиваетесь. Буду дополнять статью Вашими цитатами и идеями.</p>
<p>Спасибо, и удачных Вам выходных.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/06/10/testing-django-fixtures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Еще немного искусства</title>
		<link>http://www.lyabah.com/index.php/2011/06/03/%d0%b5%d1%89%d0%b5-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%b0/</link>
		<comments>http://www.lyabah.com/index.php/2011/06/03/%d0%b5%d1%89%d0%b5-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%b0/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 08:27:19 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Art]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=913</guid>
		<description><![CDATA[
Обещаю, дальше будет по теме  
]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://vkontakte.ru/video_ext.php?oid=86639689&#038;id=160257430&#038;hash=cfd4bfe3080a8177&#038;hd=3" width="607" height="360" frameborder="0"></iframe></p>
<p>Обещаю, дальше будет по теме <img src='http://www.lyabah.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/06/03/%d0%b5%d1%89%d0%b5-%d0%bd%d0%b5%d0%bc%d0%bd%d0%be%d0%b3%d0%be-%d0%b8%d1%81%d0%ba%d1%83%d1%81%d1%81%d1%82%d0%b2%d0%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пользуйтесь сонцезащитными кремами</title>
		<link>http://www.lyabah.com/index.php/2011/05/08/crem/</link>
		<comments>http://www.lyabah.com/index.php/2011/05/08/crem/#comments</comments>
		<pubDate>Sun, 08 May 2011 12:17:39 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=908</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<p><iframe src="http://vkontakte.ru/video_ext.php?oid=44401977&#038;id=156379311&#038;hash=d854a0da1c0dc3e5&#038;sd" width="607" height="360" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/05/08/crem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Фансы и шортсы. Такого программирования вы еще не видели :)</title>
		<link>http://www.lyabah.com/index.php/2011/05/07/funny-and-shorts/</link>
		<comments>http://www.lyabah.com/index.php/2011/05/07/funny-and-shorts/#comments</comments>
		<pubDate>Sat, 07 May 2011 11:40:48 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[checkio]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=904</guid>
		<description><![CDATA[ Вчера для CheckIO придумали вам новую развлекуху, друзья мои, на эти выходные  
Идея развлекухи в том, что надо придумать максимально необычное решение для самой обычной задачи. Например, самое простое из раздела Funny, и проще уже не придумаешь - Funny addition. На вход &#8211; массив из 2х интов, а на выходе  их сумма. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.checkio.org"><img src="http://www.lyabah.com/wp-content/uploads/2011/05/funny.png" alt="" title="funny" width="137" height="169" class="alignleft size-full wp-image-905" /></a> Вчера для <a href="http://www.checkio.org">CheckIO</a> придумали вам новую развлекуху, друзья мои, на эти выходные <img src='http://www.lyabah.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Идея развлекухи в том, что надо придумать максимально необычное решение для самой обычной задачи. Например, самое простое из раздела <a href="http://www.checkio.org/catalog/section/funny/">Funny</a>, и проще уже не придумаешь -<a href="http://www.checkio.org/mission/info/funny-adding/"> Funny addition</a>. На вход &#8211; массив из 2х интов, а на выходе  их сумма. Но функция sum(data) &#8211; это же не смешно. Смешнее что-то вроде max(data) + min(data). </p>
<p>Заходим, пишем свое аморальное решение, и рейтенгуем решения друзей.</p>
<p>По результатам выложу сюда топ аморальщины. Развлекайтесь и удачных вым выходных <img src='http://www.lyabah.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>ЗЫ: У нас есть еще прикольные <a href="http://www.checkio.org/catalog/section/shorts/">шортсы</a>, но о них уже в другой раз </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/05/07/funny-and-shorts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ЧекЁ или почему я не сплю последние несколько месяцев</title>
		<link>http://www.lyabah.com/index.php/2011/04/24/checkio/</link>
		<comments>http://www.lyabah.com/index.php/2011/04/24/checkio/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 17:20:59 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[checkio]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=893</guid>
		<description><![CDATA[
Я последние несколько месяцев любую свободную минутку посвящаю именно этому проекту www.checkio.org, т. к. чувствую, что делаю что-то полезное, что-то что может помогать молоды специалистам.
Я уже писал о нем, но сейчас, когда считаю, что закончен большой этап в развитии этого проекта решил написать еще раз, а лучше показать.
Тут Вы можете посмотреть видео небольшого туториала на тему [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.lyabah.com/wp-content/uploads/2011/04/main_page.png"><img src="http://www.lyabah.com/wp-content/uploads/2011/04/main_page.png" alt="" title="main_page" width="681" height="177" class="aligncenter size-full wp-image-895" /></a></p>
<p>Я последние несколько месяцев любую свободную минутку посвящаю именно этому проекту <a href="http://www.checkio.org">www.checkio.org</a>, т. к. чувствую, что делаю что-то полезное, что-то что может помогать молоды специалистам.</p>
<p>Я уже <a href="http://www.lyabah.com/index.php/2010/11/22/checkio-org-we-are-betta-almost/">писал о нем</a>, но сейчас, когда считаю, что закончен большой этап в развитии этого проекта решил написать еще раз, а лучше показать.</p>
<p>Тут Вы можете <a href="http://checkio.blip.tv/">посмотреть видео</a> небольшого туториала на тему чекио, а именно, как чекио позволяет находить идеальное решение многих задач, а так же помогать в обучению как питону так и программированию в целом.</p>
<p>Так-же у нас на стадии тестирования <a href="http://www.checkio.org/catalog/competitions/">терниры между программами</a>. И первой задачей для турнира сейчас выбрана игра <a href="http://www.checkio.org/mission/competition/info/1/">five in row</a>. Надо написать программу, которая  будет играть в эту игру, в простонародье &#8211; бота</p>
<p>После прохождения квалификации — вы сами, интерактивно, можете поиграть в нее. Можете поиграть с другими программами на арене. Турнир между программами у нас запланирован на конец мая. Хотелось бы увидеть по больше участников, должно быть интересно.</p>
<p>Еще хотелось бы услышать от вас отзыв. Как Вам проект?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/04/24/checkio/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Мы снова в сети</title>
		<link>http://www.lyabah.com/index.php/2011/03/18/online/</link>
		<comments>http://www.lyabah.com/index.php/2011/03/18/online/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 11:39:51 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=886</guid>
		<description><![CDATA[ После нескольких месяцев скитаний моего блога, он снова ожил и обжился баджетами моего твитера, фейсбука и линкедина. 
Я наконецто перехал на нормальный сервер, на который буду стягивать свои проекты.
В блоге буду продолжать раскрывать тему питона и разработки в целом. А в твитере короткие идеи и анонсы на эту тему
Мы никуда не пропадали, мы просто [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lyabah.com/wp-content/uploads/2011/03/artikel-102-612-2841.jpg" alt="" title="artikel-102-612-284" width="300" height="139" class="alignleft size-full wp-image-889" /> После нескольких месяцев скитаний моего блога, он снова ожил и обжился баджетами моего <a href="http://twitter.com/lyabahcom">твитера</a>, <a href="http://www.facebook.com/profile.php?id=100000271324028">фейсбука</a> и <a href="http://www.linkedin.com/in/lyabah">линкедина</a>. </p>
<p>Я наконецто перехал на нормальный сервер, на который буду стягивать свои проекты.</p>
<p>В блоге буду продолжать раскрывать тему питона и разработки в целом. А в твитере короткие идеи и анонсы на эту тему</p>
<p>Мы никуда не пропадали, мы просто болели, так что не переключайте.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/03/18/online/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UCSVLOG. Нужна точка.</title>
		<link>http://www.lyabah.com/index.php/2011/01/11/ucsvlog-point-needs/</link>
		<comments>http://www.lyabah.com/index.php/2011/01/11/ucsvlog-point-needs/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 23:39:31 +0000</pubDate>
		<dc:creator>Oduvan</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ucsvlog]]></category>

		<guid isPermaLink="false">http://www.lyabah.com/?p=883</guid>
		<description><![CDATA[Это продолжение моего общения с собой на тему логов.
Размышляя на тему логов, у которых нет конца &#8211; я пришел к выводу &#8211; что у записи конец обязан быть. Парсеру возможно это и не важно, но человеку надо знать, что эта запись полная.
Например у Вас такая часть лога

"date time,"log,"inc sum: 100

Парсер эту строку распарсит очень просто, [...]]]></description>
			<content:encoded><![CDATA[<p>Это продолжение <a href="http://www.lyabah.com/index.php/2011/01/03/ucsvlog/">моего общения с собой на тему логов</a>.</p>
<p>Размышляя на тему логов, у которых нет конца &#8211; я пришел к выводу &#8211; что у записи конец обязан быть. Парсеру возможно это и не важно, но человеку надо знать, что эта запись полная.</p>
<p>Например у Вас такая часть лога</p>
<p><code><br />
"date time,"log,"inc sum: 100<br />
</code></p>
<p>Парсер эту строку распарсит очень просто, а вот у человека не будет уверенности в цифре. А может там был мильен.</p>
<p>Именно по этому у записи должна быть точка. И пока кроме идеи &#8211; тупо добавлять ячейку с точкой мне ничего в голову не пришло. </p>
<p>Так что теперь наша запись в логах меняется на следующую:<br />
<code><br />
"date time,"log,"inc sum: 100,".<br />
</code></p>
<p>В принципе можно заморочиться на том, чтоб записи, в которых реально только одна точка &#8211; заменять на 2, а 2 &#8211; на 3. Ну т.е. при парсе надо понимать, что если в записи &#8211; одни точки, то нужно уменьшить их кол на одну. Но чем дольше я об этом думаю, тем больше понимаю, что это уже перебор. И такую погрешность можно взять в учет. </p>
<p><strong>Откуда вообще у меня тараканы в голове на тему логов.</strong></p>
<p>Когда-то я руководил разработкой электронных кассиров для банка. Ну, знаете, такая штука с тачскрином, купюроприемником и притером. Так вот, они, как положено вели логи, и периодически отправляли их на сервер, а на сервере периодически работал анализатор логов на предмет как-либо неожиданности в работе элементов кассира, а также проводил сверку локальных логов с данными присланными на сервер. Таким образом осуществлялся двойной контроль за их работой.</p>
<p>Вот с тех пор у меня и бегают ваши в голове на тему логов для легкого анализа, остальные преимущества таких логов появились уже по ходу пьесы.</p>
<p>Сегодня уже фиксы в текущие логи внести не получится, но завтра постараюсь выкроить время. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.lyabah.com/index.php/2011/01/11/ucsvlog-point-needs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

