tag:blogger.com,1999:blog-80492615149235327142024-03-16T13:08:35.127+06:00Programmer's Spirits WithinAnonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-8049261514923532714.post-68913232477219175902013-09-09T20:00:00.003+06:002013-09-09T20:01:11.888+06:00Полный цикл разработки на Python + Django<div dir="ltr" style="text-align: left;" trbidi="on">
Моя презентация на GeekCamp '2013<br />
<iframe frameborder="0" height="400" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/26024257" width="476"></iframe>
</div>
Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com0tag:blogger.com,1999:blog-8049261514923532714.post-92082054173947972782013-07-20T23:50:00.004+06:002013-07-21T17:20:30.429+06:00Symfony 2 pluralization russian twig extension<div dir="ltr" style="text-align: left;" trbidi="on">
I has the problem with symfony2, that I couldn't translate plural forms in a proper way inside the twig templates.<br />
There are only two options with the standard symfony2 <b>trans </b>tag and <b>transchoice </b>tag. They are described <a href="http://symfony.com/doc/current/book/translation.html#twig-templates" target="_blank">here</a>.<br />
<br />
<b>trans</b> tag allows to translate a simple string<br />
<b>transchoice </b>is something more complex. It allows to translate string based on number you provide. Simple logic looks like this.<br />
<br />
1 - I have just one apple<br />
2 - I have couple<br />
3 - There is enough for three of us<br />
4 - I have many apples<br />
5<br />
6<br />
..<br />
100 - I have many apples<br />
<br />
So basically when you use transchoice you have to provide explicit translation and explicit range.<br />
With russian language it is different<br />
<br />
the formula for suffixes in russian looks like this:<br />
<pre><span style="background: #ffffe8; color: #5f5035;"><?php</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">10</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">1</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">100</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">!</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">11</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">?</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">0</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">:</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">10</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">></span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">2</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">10</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;"><</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">4</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">100</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;"><</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">10</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">|</span><span style="background: #ffffe8; color: #808030;">|</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">100</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">></span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">20</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">?</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">1</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">:</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">2</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"></span>
<span style="background: #ffffe8; color: #5f5035;">?></span>
</pre>
<br />
The problem with symfony2 is that it does not provide any mechanism to use it. If you use plain twig, it will have the <b>translplural</b> tag. but it is not included in symfony2, so I had to write my own.<br />
<pre><span style="background: #ffffe8; color: #5f5035;">
</span></pre>
<pre><span style="background: #ffffe8; color: #5f5035;"><?php</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;">namespace YourBundleName\TwigExtensions</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: maroon; font-weight: bold;">use</span><span style="background: #ffffe8; color: black;"> Symfony\Bundle\FrameworkBundle\Translation\Translator</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: maroon; font-weight: bold;">use</span><span style="background: #ffffe8; color: black;"> Twig_Extension</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: maroon; font-weight: bold;">class</span><span style="background: #ffffe8; color: black;"> TransPlural </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">extends</span><span style="background: #ffffe8; color: black;"> Twig_Extension </span>
<span style="background: #ffffe8; color: purple;">{</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">protected</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$translator</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">public</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">function</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #400000;">__construct</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: black;">Translator </span><span style="background: #ffffe8; color: #797997;">$translator</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">{</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$</span><span style="background: #ffffe8; color: maroon; font-weight: bold;">this</span><span style="background: #ffffe8; color: #808030;">-></span><span style="background: #ffffe8; color: #797997;">translator</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$translator</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">}</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">public</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">function</span><span style="background: #ffffe8; color: black;"> getFilters</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">{</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">return</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">array</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">new</span><span style="background: #ffffe8; color: black;"> \Twig_SimpleFilter</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #0000e6;">'transplural'</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">array</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$</span><span style="background: #ffffe8; color: maroon; font-weight: bold;">this</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #0000e6;">'transplural'</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">}</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">public</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">function</span><span style="background: #ffffe8; color: black;"> transplural</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$string</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">{</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$translated</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$</span><span style="background: #ffffe8; color: maroon; font-weight: bold;">this</span><span style="background: #ffffe8; color: #808030;">-></span><span style="background: #ffffe8; color: #797997;">translator</span><span style="background: #ffffe8; color: #808030;">-</span><span style="background: #ffffe8; color: #808030;">></span><span style="background: #ffffe8; color: black;">trans</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #0000e6;">'%d '</span><span style="background: #ffffe8; color: #808030;">.</span><span style="background: #ffffe8; color: #797997;">$string</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">array</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #0000e6;">'%d'</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: #808030;">></span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$type</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">10</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">1</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">100</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">!</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">11</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">?</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">0</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">:</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">10</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">></span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">2</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">10</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;"><</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">4</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: #808030;">&</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">100</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;"><</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">10</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">|</span><span style="background: #ffffe8; color: #808030;">|</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$number</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">%</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">100</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">></span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">20</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">?</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">1</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">:</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #008c00;">2</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span></pre>
<pre> //this if condition here because on some servers $this->translator->tran</pre>
<pre> //was returning wrong strings
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">if</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #400000;">strpos</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$translated</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: #0000e6;">"{"</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: maroon; font-weight: bold;">false</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">{</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$translated_array</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #400000;">explode</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #0000e6;">"|"</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$translated</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">return</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$translated_array</span><span style="background: #ffffe8; color: #808030;">[</span><span style="background: #ffffe8; color: #797997;">$type</span><span style="background: #ffffe8; color: #808030;">]</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">}</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">else</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">{</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">return</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$</span><span style="background: #ffffe8; color: maroon; font-weight: bold;">this</span><span style="background: #ffffe8; color: #808030;">-></span><span style="background: #ffffe8; color: #797997;">translator</span><span style="background: #ffffe8; color: #808030;">-</span><span style="background: #ffffe8; color: #808030;">></span><span style="background: #ffffe8; color: black;">transChoice</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #797997;">$translated</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #797997;">$type</span><span style="background: #ffffe8; color: #808030;">,</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">array</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #0000e6;">"</span><span style="background: #ffffe8; color: maroon;">%</span><span style="background: #ffffe8; color: #0000e6;">count</span><span style="background: #ffffe8; color: maroon;">%</span><span style="background: #ffffe8; color: #0000e6;">"</span><span style="background: #ffffe8; color: #808030;">=</span><span style="background: #ffffe8; color: #808030;">></span><span style="background: #ffffe8; color: #797997;">$type</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">}</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">}</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: dimgrey;">/** </span>
<span style="background: #ffffe8; color: dimgrey;"> * Returns the name of the extension. </span>
<span style="background: #ffffe8; color: dimgrey;"> * </span>
<span style="background: #ffffe8; color: dimgrey;"> * @return string The extension name </span>
<span style="background: #ffffe8; color: dimgrey;"> */</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">public</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">function</span><span style="background: #ffffe8; color: black;"> getName</span><span style="background: #ffffe8; color: #808030;">(</span><span style="background: #ffffe8; color: #808030;">)</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">{</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: maroon; font-weight: bold;">return</span><span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: #0000e6;">"translate_plural_russian"</span><span style="background: #ffffe8; color: purple;">;</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: black;"> </span><span style="background: #ffffe8; color: purple;">}</span><span style="background: #ffffe8; color: black;"> </span>
<span style="background: #ffffe8; color: purple;">}</span><span style="background: #ffffe8; color: black;"></span>
</pre>
<pre><span style="background: #ffffe8; color: purple;">
</span></pre>
<pre></pre>
And additionally you need to add following lines to the services.xml<br />
<br />
<pre><span style="color: #a65700;"><</span><span style="color: #5f5035;">service</span> <span style="color: #274796;">id</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"</span><span style="color: #0000e6;">twig.plural_extension</span><span style="color: #0000e6;">"</span> <span style="color: #274796;">class</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"</span><span style="color: #0000e6;">YourBundleName\TwigExtensions\TransPlural</span><span style="color: #0000e6;">"</span><span style="color: #a65700;">></span>
<span style="color: #a65700;"><</span><span style="color: #5f5035;">tag</span> <span style="color: #274796;">name</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"</span><span style="color: #0000e6;">twig.extension</span><span style="color: #0000e6;">"</span> <span style="color: #a65700;">/></span>
<span style="color: #a65700;"><</span><span style="color: #5f5035;">argument</span> <span style="color: #274796;">type</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"</span><span style="color: #0000e6;">service</span><span style="color: #0000e6;">"</span> <span style="color: #274796;">id</span><span style="color: #808030;">=</span><span style="color: #0000e6;">"</span><span style="color: #0000e6;">translator</span><span style="color: #0000e6;">"</span><span style="color: #a65700;">></span><span style="color: #a65700;"></</span><span style="color: #5f5035;">argument</span><span style="color: #a65700;">></span>
<span style="color: #a65700;"></</span><span style="color: #5f5035;">service</span><span style="color: #a65700;">></span></pre>
<pre><span style="color: #a65700;">
</span></pre>
<pre><span style="font-family: 'Times New Roman'; white-space: normal;">And then you will be able to use transplural tag inside your twig templates like this:</span></pre>
<pre><span style="font-family: 'Times New Roman'; white-space: normal;">
</span></pre>
<pre><span style="font-family: Times New Roman;"><span style="white-space: normal;"><b>{{ </b>"string to be pluralized"<b>|transplural(</b><i style="font-weight: bold;">number</i><b>) }}</b></span></span><span style="font-family: 'Times New Roman'; font-weight: bold; white-space: normal;"> </span></pre>
</div>
Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com0Bishkek, Kyrgyzstan42.870022 74.5878829999999242.683841 74.265159499999925 43.056203 74.910606499999915tag:blogger.com,1999:blog-8049261514923532714.post-31852723939616939372013-06-11T01:57:00.000+06:002013-06-11T01:58:23.019+06:00Django localization settings<div dir="ltr" style="text-align: left;" trbidi="on">
<!-- HTML generated using hilite.me -->This examle shows all the settings that you need to put in your settings file in order to have the Django 1.5 to run in russian language.<br />
<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">ugettext <span style="color: #303030;">=</span> <span style="color: green; font-weight: bold;">lambda</span> s: s
LANGUAGES <span style="color: #303030;">=</span> (
(<span style="background-color: #fff0f0;">'ru'</span>, <span style="background-color: #fff0f0;">'Russian'</span>),
)
LOCALE_PATHS <span style="color: #303030;">=</span> (
PROJECT_PATH<span style="color: #303030;">+</span><span style="background-color: #fff0f0;">'/locale'</span>, #this is the place where the language files stored
)
LANGUAGE_CODE <span style="color: #303030;">=</span> <span style="background-color: #fff0f0;">'ru'</span>
</pre>
<pre style="line-height: 125%; margin: 0;"></pre>
<pre style="line-height: 125%; margin: 0;"><span style="background-color: #fff0f0;">
</span></pre>
<pre style="line-height: 125%; margin: 0;"><span style="background-color: #fff0f0;"><pre></pre>
</span></pre>
</div>
If any of these missing, it will not work</div>
Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com0Бишкек, Киргизия42.870022 74.5878829999999242.683841 74.265159499999925 43.056203 74.910606499999915tag:blogger.com,1999:blog-8049261514923532714.post-51082556323912955922013-04-10T10:41:00.003+06:002013-09-23T16:59:57.280+06:00Save button for ckeditor using ajax<div dir="ltr" style="text-align: left;" trbidi="on">
The task was to use inline ckeditor in order to edit div contents and save by sending ajax request to the server.<br />
I have stuck to a problem that ckeditor save button did not appear on the toolbar. So here is a solution for that. The most important part is highlighted with bold.<br />
Just replace the "save" plugin contents. You can find it in <b>ckeditor/plugins/save/plugin.js</b><br />
<br />
<!-- HTML generated using hilite.me -->
<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<pre style="line-height: 125%; margin: 0;">(<span style="color: green; font-weight: bold;">function</span>() {
<span style="color: green; font-weight: bold;">var</span> saveCmd <span style="color: #303030;">=</span> { modes<span style="color: #303030;">:</span>{wysiwyg<span style="color: #303030;">:</span><span style="color: #0000d0; font-weight: bold;">1</span>,source<span style="color: #303030;">:</span><span style="color: #0000d0; font-weight: bold;">1</span> },
readOnly<span style="color: #303030;">:</span> <span style="color: #0000d0; font-weight: bold;">1</span>,
exec<span style="color: #303030;">:</span> <span style="color: green; font-weight: bold;">function</span>( editor ) {
<span style="color: green; font-weight: bold;">var</span> data <span style="color: #303030;">=</span> editor.getData();
<b>jQuery.post(editor.config.saveSubmitURL,
{text<span style="color: #303030;">:</span> data},
<span style="color: green;">function</span>(response){
alert('Data sent to server!!!');
});
}</b>
};
<span style="color: green; font-weight: bold;">var</span> pluginName <span style="color: #303030;">=</span> <span style="background-color: #fff0f0;">'save'</span>;
<span style="color: grey;">// Register a plugin named "save".</span>
CKEDITOR.plugins.add( pluginName, {
lang<span style="color: #303030;">:</span> <span style="background-color: #fff0f0;">'af,ar,bg,bn,bs,ca,cs,cy,da,de,el,en-au,en-ca,en-gb,en,eo,es,et,eu,fa,fi,fo,fr-ca,fr,gl,gu,he,hi,hr,hu,is,it,ja,ka,km,ko,ku,lt,lv,mk,mn,ms,nb,nl,no,pl,pt-br,pt,ro,ru,sk,sl,sr-latn,sr,sv,th,tr,ug,uk,vi,zh-cn,zh'</span>, <span style="color: grey;">// %REMOVE_LINE_CORE%</span>
icons<span style="color: #303030;">:</span> <span style="background-color: #fff0f0;">'save'</span>, <span style="color: grey;">// %REMOVE_LINE_CORE%</span>
init<span style="color: #303030;">:</span> <span style="color: green; font-weight: bold;">function</span>( editor ) {
<span style="color: green; font-weight: bold;">var</span> command <span style="color: #303030;">=</span> editor.addCommand( pluginName, saveCmd );
<span style="color: grey;">//command.modes = { wysiwyg: !!( editor.element.$.form ) };</span>
editor.ui.addButton( <span style="background-color: #fff0f0;">'Save'</span>, {
label<span style="color: #303030;">:</span> editor.lang.save.toolbar,
command<span style="color: #303030;">:</span> pluginName,
toolbar<span style="color: #303030;">:</span> <span style="background-color: #fff0f0;">'clipboard,50'</span>
});
}
});
})();
</pre>
</div>
<br />
Additionally you will need to update the config.js file for the ckeditor and add the following lines<br />
<br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><b>config.saveSubmitURL <span style="color: #303030;">=</span> <span style="background-color: #fff0f0;">'URL_TO_YOUR_SERVER_SCRIPT.php'</span>;</b>
</pre>
</div>
<br />
And you are done.<br />
<br />
The problem was that "save" plugin was only working in the "replace" mode. When ckeditor replaces textareas on the page with the editor. But is was not working in the inline mode. When you use ckeditor in order to edit contents of the div tags.<br />
<br />
UPD: There is <a href="http://stackoverflow.com/questions/18956257/how-to-add-an-ajax-save-button-with-loading-gif-to-ckeditor-4-2-1-sample-plugi" target="_blank">working solution</a> on stackoverflow posted by user <a href="http://stackoverflow.com/users/907927/kasper-taeymans" target="_blank">kasper Taeymans</a></div>
Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com4tag:blogger.com,1999:blog-8049261514923532714.post-86963045477623332932013-02-05T23:08:00.000+06:002013-04-10T10:44:13.028+06:00Принуждение судей к более законному рассмотрению судебных процессов в Кыргзыстане<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCDJ017Fh6vbpVJDK16u8XS3e1VOXzUR9VdJmF979TwuTtwB4EZ9jKiG3eIHavCrlwYRo5SGccHZ1FjmMXpWcNd60D47Myzg9ZoNtPg0P4-w3BH1oAd6SkbbnZJt4pTQmJMuZ5WB9DXB8/s1600/1216723273_femida.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCDJ017Fh6vbpVJDK16u8XS3e1VOXzUR9VdJmF979TwuTtwB4EZ9jKiG3eIHavCrlwYRo5SGccHZ1FjmMXpWcNd60D47Myzg9ZoNtPg0P4-w3BH1oAd6SkbbnZJt4pTQmJMuZ5WB9DXB8/s1600/1216723273_femida.gif" /></a></div>
Сегодня посетил <a href="http://www.dom163.kg/news/master-klass-ugolovnoe-presledovanie-dolzhnostny-h-lits/" target="_blank">Мастер-класс "Уголовное преследование должностных лиц"</a>, на котором Нурбек Токтакунов рассказывал о том как можно привлечь государственных служащих к уголовной ответственности в случае применения неправомерных действий к гражданам нашей страны.<br />
<br />
Во время данного мероприятия у меня из головы не выходили пара вопросов. "А как же можно заставить судей более объективно и тщательно относится к своей работе? И как можно в них развить культуру более ответственного отношения к рассмотрению судебных дел?".<br />
<br />
<a name='more'></a><br />
По личному опыту мне приходится представлять интересы своей мамы суде уже довольно долгое время. Сначала мы привлекали адвокатов надеясь на их компетентность в работе. Но после смены 5-ти адвокатов и траты довольно не малых денег на их услуги, мы поняли что большинство адвокатов находящихся в доступной для нас ценовой категории оказываются еще более коррумпированны нежели чем многие представители государственной власти.<br />
<br />
Самая распространенная схема оказалась таковой: адвокаты двух сторон просто договариваются о затягивании судебных процессов ради получения большей выгоды. Также были случаи подкупа наших адвокатов за суммы от 5 000 до 10 000 сом.<br />
<br />
После этого я решил сам взяться за представление интересов в судах.<br />
<br />
За пятилетнею практику в судебных разбирательствах мы довольно часто сталкивались с тем как наши суды рассматривают судебные дела, как гражданские так и уголовные. И основным оружием оказывается только привлечение общественности и знание законов. Также были довольно частые случаи "корректировки" протоколов судебных заседаний в угоду определенным лицам.<br />
<br />
Итак вернемся же к основным вопросам.<br />
Из существующих сегодня и применяемых нами средств могу выделить два:<br />
<ol style="text-align: left;">
<li>Привлечение сотрудников <a href="http://www.ombudsman.kg/" target="_blank">Института Омбудсмена Кыргызской Республики</a> для участия в судебных заседаниях. Данная организация по вашему заявлению может выделить независимого наблюдателя для участия в судебных процессах. После вынесения решения они пишут Акт реагирования и отчет который в дальнейшем передается омбудсмену нашей страны и на основе которых они могут принять меры по отношению к судьям в случае не правомерного рассмотрения судебного дела, что может повлиять на карьеры судей. Поэтому судьи стараются более ответственно и законно рассматривать судебные дела.</li>
<li>Привлечение сотрудников <a href="http://koom.kg/" target="_blank">Института общественного анализа</a> к участию в судебных процессах. Когда в суд приходят они то я заметил, что судьи начинают относится к работе еще более ответственно чем при привлечении сотрудников <a href="http://www.ombudsman.kg/" target="_blank">Института Омбудсмена</a>. Но проблема в том что они не всегда могут приходить в районные суды, это связанно с ограниченным штатом сотрудников и не очень большим финансированием. Но в областные и верховный суды приходят охотно. Сотрудники данного института в обязательно порядке расписывают судебный процесс и вывешивают эту информацию у себя на сайте http://koom.kg</li>
</ol>
<div>
Также сегодня покопавшись в ГПК КР я нашел очень интересный пункт </div>
<div>
<div>
<b>п.2 ст 12 ГПК КР</b> </div>
<div>
<i>Лица, участвующие в деле, или любое заинтересованное лицо, присутствующие на открытом судебном заседании, <b>имеют право фиксировать письменно или с помощью средств звукозаписи </b>ход судебного разбирательства. Кино и фотосъемка, видеозапись, прямая радио- и телетрансляция судебного заседания допускаются с разрешения суда.</i><br />
<i><br /></i></div>
<div>
Получается на открытых судебных процессах по гражданским делам у любой из сторон есть право записывать звукозапись судебного процесса. Т.е. вы можете взять обычный диктофон и записать содержание судебного заседания. Что может в дальнейшем вам помочь если же будет изменен протокол и решение суда будет не законным. Что также заставит судью более объективно рассматривать ваше судебное дело. И при этом не нужно ничье согласие.<br />
<br /></div>
</div>
<div>
Если же это видео-съемка то тогда можно написать ходатайство для получения разрешения на видео-запись судебного процесса. Если же судья откажет вам то можно будет все равно записать на диктофон. И также можно постараться получить причину отказа в видео-записи. </div>
<div>
Думаю если все мы начнем сами записывать содержание судебных процессов, то таким образом хоть как-то сможем начать приучать судей к более ответственному отношению к их работе.<br />
<br /></div>
<div>
Также у меня возникла идея создания веб-сервиса куда можно было бы складывать все аудио, видео записи судебных заседаний. </div>
</div>
Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com0Бишкек, Киргизия42.228517356208521 74.3554687539.187474856208517 69.19189475 45.269559856208524 79.51904275tag:blogger.com,1999:blog-8049261514923532714.post-47708255287389597772012-01-16T00:29:00.000+06:002012-02-17T20:50:30.327+06:00Django - Adding row to the admin list with the totals and averages of given fields<div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on">Once a while a wild ticked occurred for one of the projects I was developing.<br />
The issue was that they needed a rows with the totals and averages to be displayed at the end of the table in the admin changelist view for particular fields.<br />
So here how it works<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6bfMXaKBIoz0y_SpKDuEqg_uWGFdV3svzyk5lDVYWkq95UMeqQCIMMHTEK7FCZw-6fcoftUUv_f8Dws_T7jxT8US-AUlLx613CvrKlBVVy30-mzfeWnsuu6pKcM1OOejtPdrsUOkzeFU/s1600/Screenshot-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6bfMXaKBIoz0y_SpKDuEqg_uWGFdV3svzyk5lDVYWkq95UMeqQCIMMHTEK7FCZw-6fcoftUUv_f8Dws_T7jxT8US-AUlLx613CvrKlBVVy30-mzfeWnsuu6pKcM1OOejtPdrsUOkzeFU/s640/Screenshot-1.png" width="640" /></a><br />
<br />
<br />
<a name='more'></a><br />
<br />
</div><pre class="python" style="font-family: monospace;"><span style="color: #ff7700; font-weight: bold;">from</span> django.<span style="color: black;">contrib</span>.<span style="color: black;">admin</span>.<span style="color: black;">views</span>.<span style="color: black;">main</span> <span style="color: #ff7700; font-weight: bold;">import</span> ChangeList
<span style="color: #ff7700; font-weight: bold;">from</span> django.<span style="color: black;">db</span>.<span style="color: black;">models</span> <span style="color: #ff7700; font-weight: bold;">import</span> Sum, Avg
<span style="color: #ff7700; font-weight: bold;">from</span> myapp.<span style="color: black;">models</span> <span style="color: #ff7700; font-weight: bold;">import</span> MyModelName
<span style="color: #ff7700; font-weight: bold;">class</span> TotalAveragesChangeList<span style="color: black;">(</span>ChangeList<span style="color: black;">)</span>:
<span style="color: grey; font-style: italic;">#provide the list of fields that we need to calculate averages and totals</span>
fields_to_total = <span style="color: black;">[</span><span style="color: darkslateblue;">'amount'</span>, <span style="color: darkslateblue;">'total_sum'</span>, <span style="color: darkslateblue;">'paid_by_cash'</span>,
<span style="color: darkslateblue;">'paid_by_transfer'</span>,<span style="color: black;">]</span>
<span style="color: #ff7700; font-weight: bold;">def</span> get_total_values<span style="color: black;">(</span><span style="color: green;">self</span>, queryset<span style="color: black;">)</span>:
<span style="color: darkslateblue;">"""
Get the totals
"""</span>
<span style="color: grey; font-style: italic;">#basically the total parameter is an empty instance of the given model</span>
total = MyModelName<span style="color: black;">(</span><span style="color: black;">)</span>
total.<span style="color: black;">custom_alias_name</span> = <span style="color: darkslateblue;">"Totals"</span> <span style="color: grey; font-style: italic;">#the label for the totals row</span>
<span style="color: #ff7700; font-weight: bold;">for</span> field <span style="color: #ff7700; font-weight: bold;">in</span> <span style="color: green;">self</span>.<span style="color: black;">fields_to_total</span>:
<span style="color: green;">setattr</span><span style="color: black;">(</span>total, field, queryset.<span style="color: black;">aggregate</span><span style="color: black;">(</span>Sum<span style="color: black;">(</span>field<span style="color: black;">)</span><span style="color: black;">)</span>.<span style="color: black;">items</span><span style="color: black;">(</span><span style="color: black;">)</span><span style="color: black;">[</span><span style="color: orangered;">0</span><span style="color: black;">]</span><span style="color: black;">[</span><span style="color: orangered;">1</span><span style="color: black;">]</span><span style="color: black;">)</span>
<span style="color: #ff7700; font-weight: bold;">return</span> total
<span style="color: #ff7700; font-weight: bold;">def</span> get_average_values<span style="color: black;">(</span><span style="color: green;">self</span>, queryset<span style="color: black;">)</span>:
<span style="color: darkslateblue;">"""
Get the averages
"""</span>
average = MyModelName<span style="color: black;">(</span><span style="color: black;">)</span>
average.<span style="color: black;">custom_alias_name</span> = <span style="color: darkslateblue;">"Averages"</span> <span style="color: grey; font-style: italic;">#the label for the averages row</span>
<span style="color: #ff7700; font-weight: bold;">for</span> field <span style="color: #ff7700; font-weight: bold;">in</span> <span style="color: green;">self</span>.<span style="color: black;">fields_to_total</span>:
<span style="color: green;">setattr</span><span style="color: black;">(</span>average, field, queryset.<span style="color: black;">aggregate</span><span style="color: black;">(</span>Avg<span style="color: black;">(</span>field<span style="color: black;">)</span><span style="color: black;">)</span>.<span style="color: black;">items</span><span style="color: black;">(</span><span style="color: black;">)</span><span style="color: black;">[</span><span style="color: orangered;">0</span><span style="color: black;">]</span><span style="color: black;">[</span><span style="color: orangered;">1</span><span style="color: black;">]</span><span style="color: black;">)</span>
<span style="color: #ff7700; font-weight: bold;">return</span> average
<span style="color: #ff7700; font-weight: bold;">def</span> get_results<span style="color: black;">(</span><span style="color: green;">self</span>, request<span style="color: black;">)</span>:
<span style="color: darkslateblue;">"""
The model admin gets queryset results from this method
and then displays it in the template
"""</span>
<span style="color: green;">super</span><span style="color: black;">(</span>TotalAveragesChangeList, <span style="color: green;">self</span><span style="color: black;">)</span>.<span style="color: black;">get_results</span><span style="color: black;">(</span>request<span style="color: black;">)</span>
<span style="color: grey; font-style: italic;">#first get the totals from the current changelist</span>
total = <span style="color: green;">self</span>.<span style="color: black;">get_total_values</span><span style="color: black;">(</span><span style="color: green;">self</span>.<span style="color: black;">query_set</span><span style="color: black;">)</span>
<span style="color: grey; font-style: italic;">#then get the averages</span>
average = <span style="color: green;">self</span>.<span style="color: black;">get_average_values</span><span style="color: black;">(</span><span style="color: green;">self</span>.<span style="color: black;">query_set</span><span style="color: black;">)</span>
<span style="color: grey; font-style: italic;">#small hack. in order to get the objects loaded we need to call for </span>
<span style="color: grey; font-style: italic;">#queryset results once so simple len function does it</span>
<span style="color: green;">len</span><span style="color: black;">(</span><span style="color: green;">self</span>.<span style="color: black;">result_list</span><span style="color: black;">)</span>
<span style="color: grey; font-style: italic;">#and finally we add our custom rows to the resulting changelist</span>
<span style="color: green;">self</span>.<span style="color: black;">result_list</span>._result_cache.<span style="color: black;">append</span><span style="color: black;">(</span>total<span style="color: black;">)</span>
<span style="color: green;">self</span>.<span style="color: black;">result_list</span>._result_cache.<span style="color: black;">append</span><span style="color: black;">(</span>average<span style="color: black;">)</span></pre><br />
</div><div>And all we need is just to set our custom changelist to the AdminModel<br />
<br />
<br />
</div><pre><span style="color: #ff7700; font-weight: bold;">class</span> MyModelNameAdmin<span style="color: black;">(</span>admin.<span style="color: black;">ModelAdmin</span><span style="color: black;">)</span>:
<span style="color: #ff7700; font-weight: bold;">def</span> get_changelist<span style="color: black;">(</span><span style="color: green;">self</span>, request, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">)</span>:
<span style="color: #ff7700; font-weight: bold;">return</span> TotalAveragesChangeList
admin.<span style="color: crimson;">site</span>.<span style="color: black;">register</span><span style="color: black;">(</span>MyModelName, MyModelNameAdmin<span style="color: black;">)</span>
</pre></div></div>Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com15tag:blogger.com,1999:blog-8049261514923532714.post-86719445160643632012011-11-05T19:44:00.000+06:002011-11-05T19:44:26.822+06:00Пойдемте в гости!<div dir="ltr" style="text-align: left;" trbidi="on">Вспомните когда вы в последний раз ходили или звали кого-нибудь в гости. Если это было недавно, то хорошо.<br />
<br />
На сегодняшний день все больше замечаю как многие из друзей и знакомых перестали ходить в гости домой. Сейчас все ходят в кафе и рестораны. А почему бы и нет? Готовить и убирать то не надо. Отвалил сумму из кармана и все в порядке.<br />
Что то я немного отошел. Вспомните как в детстве наши родители приглашали домой своих друзей, коллег, и просто знакомых. Как много радости было тогда. Как стол ломился от всяких конфет, вкусняшек и приходилось тайком оттуда таскать это все по немного пока мама была занята на кухне подготовкой. А когда тебя заметят тут же валишь в детскую комнату с наживой и сидишь там тихо, типа ничего и не происходило и если повезет то и конфетку покушаешь. А мама там ругается чтобы никто к столу не подходил. Ведь гости придут. А ты потом снова тайком в зал за добычей. И так пока не надоест.<br />
<br />
И вот долгожданный момент когда приходят первые гости, все здороваются, тут же начинаются всякие разговоры о детях, о семье, да и вообще о всяких делах. Все такие радостные. А если повезет кто нибудь из гостей приведет сына своего или дочку, очень хорошего твоего друга. И будете вы вместе тусить. А ты еще показываешь другу дома все, говоришь о новостях и чего нового тебе с прошлого раза родители купили. И начинаете во все это играться.<br />
<br />
Потихоньку собираются все гости и начинается главная часть, где приносят покушать первое, потом второе, еще и десерт. Сколько радости то!<br />
<br />
А потом в следующий раз уже вы идете в гости, мама тебя наряжает. И говорит чтобы не было как в прошлый раз, что то там поломали. Хе хе.<br />
Но это все детство.<br />
<br />
Самое главное в этом всем - это атмосфера той радости которую мы испытывали когда к нам приходил гости, и мы ходили к кому-нибудь.<br />
Теперь то ведь мы все реже ходим в гости. И это как то грустно.<br />
Давайте чаще навещать друг друга. Но не где-нибудь в кафе. А дома.<br />
<br />
<br />
<br />
<div><br />
</div></div>Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com1tag:blogger.com,1999:blog-8049261514923532714.post-13237986460912993942011-09-22T11:54:00.001+06:002011-09-22T12:55:32.783+06:00Позитив и Негатив. А где же Баланс?<div dir="ltr" style="text-align: left;" trbidi="on">Вот мы все часто очень слышим "Будьте позитивными! Жизнь такова каковы вы сами."<br />
Но очень часто люди и писатели этих мотивирующих статей не настолько правы как это кажеться на первый взгляд. <br />
<br />
<a name='more'></a><br />
Почти все мотивирующие статьи написаны людьми, которые пребывают в хорошем настроении, или же добились чего-то совсем недавно. А вот если взять картину, где у человека довольно сложный период жизни и спросить думает ли он или она также. А ведь нихрена. <br />
Дело в балансе. Да, мы сами определяем нашу жизнь, но только отчасти. Но также и жизнь преподносит неожиданные подарки. <br />
<br />
Вот взять персону у которой все в данный момент хорошо и спросить что чувствует. Конечно же отвитит, что нужно быть собой и стараться думать позитивно и тогда все придет. А взять с другой стороны человека на которого свалилось очень много разных испытаний и такого позитива вы уже не услышите. <br />
Иногда бывает так что обстоятельства оказываются немного сильнее нас и мы уходим в очень долгую дипрессию. И даже не знаем что же изменить чтобы хоть что-то стало лучше. <br />
<br />
Кажеться мне, что в такие времена нужно терпение. Иногда ведь нам просто нужно просто сесть, расслабиться, а еще лучше обнять кого-нибудь кто нам дорог и почувстоватать хоть немного приятной атмосферы чтобы начать менять все то плохое что нас может окружать. Дело тут идет о духовной поддержке. Ведь мы живем в обществе, где у нас есть семьи, друзья, увлечения. А также и раздражающие нас вещи или дела тех же семьи, друзей, и увлечение уже может казаться скучным. <br />
Ведь дело не всегда в том кто мы есть, а еще и в том что происходит вокруг. <br />
<br />
Сломать человека можно. И жизнь ломает многих людей, а может мы и сами себя ломаем. Но мне хотелось бы сказать только одну вещь. Иногда стоит остановиться и посмотреть вокруг. Главное остановиться, и только тогда наверное в голову придет интересная мысть о том как же бадаться с текущими обстоятельствами. </div>Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com0tag:blogger.com,1999:blog-8049261514923532714.post-13182827619525183722011-03-21T17:39:00.000+06:002011-09-22T12:55:57.432+06:00Надо было сделать по другому<div dir="ltr" style="text-align: left;" trbidi="on">Сегодня поймал себя на мысли, что очень часто приходит в голову идея того что нужно было сделать некоторые вещи по другому. Но момент прошел и уже как говориться "поздно". Каждый из нас почти каждый день думает о том что мы поступили в какой-то момент не так как хотим сейчас. А почему это происходит?<br />
<br />
<a name='more'></a><br />
Каждый раз когда у меня заходил разговор о жизни и ее приципах с разными людми тет-а-тет. Оказывало так, все все они довольно хорошо знают что правильно и что плохо, но почему-то некоторые не вели себя в жизни так как они о ней говорили, и я в том числе. И получается все мы знаем как правильно или лучше жить но не делаем этого. Потом смотрим на других, более успешных людей и говорим "Вот если бы у меня было .... То я бы тоже многое сделал". Но извинте этого нету и не будет если что-нибудь не поменять. Нет я тоже пока еще не такой успешный как хотел бы. И поэтому можете в это все не верить. Выбор за вами :).<br />
<br />
Итак возвращаясь в вопросу. Ответ довольно прост, когда мы задумываемся о чем-то то в голову приходит правильный ответ, а когда живем в каждодневной рутине то ответа на вопросы почему-то нету и мы просто делаем какой-то поступок на автопилоте. Наверное поэтому говорят нужно взять свою жизнь в руки. Получается тогда что этот автопилот и управляет нами. И нужно его просто отключить. Хммм интересно. Но черт возьми где же этот выключатель или кнопочка?<br />
<br />
А его нету. Вместо него регулятор, который можно крутить или передвигать, самым хорошим примером можно привести регулятор громкости, такой слайдер где мы делаем погромче или потише. Так вот в моменты когда мы делаем что-то или говорим не так как хотелось бы то регулятор находится на положении тихо а когда добиваемся успеха, это значит что в определенный период он был на высокой громкости.<br />
<br />
Другим вариантом еще выступает мировозрение. У человека с лучшим мировозрением почти все получается сразу и хорошо, а у других хуже. Дело в том что мировоззрение управляет нами в моменты автопилота. Если его изменить то автопилот станет более послушным, это как править баги в глючной программе. Чем больше их исправлено тем более предсказуемо и точно работает программа.<br />
<br />
Так что ребята меняемся в лучшую сторону.<br />
<br />
p.s. И чуть не забыл добавить, это занимает время, чаще всего дохрена времени. </div>Anonymoushttp://www.blogger.com/profile/09081183719635136698noreply@blogger.com1