<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>Notes of a Developer &#187; Python</title>
	<atom:link href="http://www.developers-life.com/category/python/feed" rel="self" type="application/rss+xml" />
	<link>http://www.developers-life.com</link>
	<description>Develop on Objective-C, UIKit, C, OpenGL for  iPhone, iPad, Mac OS X</description>
	<lastBuildDate>Fri, 03 Feb 2012 11:49:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Setup Python, MySQL, MySQL-python and SVN on MAC OS X 10.6</title>
		<link>http://www.developers-life.com/setup-python-mysql-mysql-python-and-svn-on-mac-os-x-106.html</link>
		<comments>http://www.developers-life.com/setup-python-mysql-mysql-python-and-svn-on-mac-os-x-106.html#comments</comments>
		<pubDate>Sun, 11 Oct 2009 12:58:03 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Mac OS X]]></category>
		<category><![CDATA[others]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=550</guid>
		<description><![CDATA[Mac Os X + Python 2.6.1+ PIL + apache2.2 +mod_python + MySQL + MySQLdb +php5+ phpMyAdmin + SVN server +WebSVN OS: Mac OS X 10.6.1 Snow Leopard XCode:The latest Xcode Tools Python: Python 2.6.1 64-bit (Snow Leopard default) Projects will be located in ~/Sites, so change permissions: add read permission for everyone on ~/Sites Setup [...]]]></description>
			<content:encoded><![CDATA[<p>Mac Os X + Python 2.6.1+ PIL + apache2.2 +mod_python + MySQL + MySQLdb +php5+ phpMyAdmin + SVN server +WebSVN</p>
<p>OS: Mac OS X 10.6.1 Snow Leopard<br />
XCode:The latest Xcode Tools<br />
Python: Python 2.6.1 64-bit (Snow Leopard default)</p>
<p>Projects will be located in ~/Sites, so change permissions:<br />
     add read permission for everyone on ~/Sites</p>
<p>Setup django</p>
<p>   1.    mkdir  ~/sources<br />
   2.    cd ~/sources<br />
   3.    svn co http://code.djangoproject.com/svn/django/trunk/ django<br />
   4.    cd django<br />
   5.    sudo python setup.py install</p>
<p>Apache:<br />
    We will use default 10.6 apache2.2</p>
<p>Setup mod_python:<br />
   1.  mkdir  ~/sources/mod_python<br />
   2.  cd ~/sources/mod_python<br />
   3.  svn co http://svn.apache.org/repos/asf/quetzalcoatl/mod_python/trunk mod_python-trunk<br />
   4.  cd mod_python-trunk<br />
   5.  ./configure &#8211;with-apxs=/usr/sbin/apxs<br />
   6.  make<br />
   7.  sudo make install</p>
<p><span id="more-550"></span><br />
Setup MySQL &#8212; Download 64bit!!!<br />
  1. nano  ~/.profile<br />
   2. export PATH=&#8221;/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin:$PATH&#8221;<br />
   3. source ~/.profile<br />
   4. Download MySQL 5.1.39 sourcse and place it into ~/sources<br />
   5. tar xzvf mysql-5.1.39.tar.gz<br />
   6. cd mysql-5.1.39</p>
<p>    7.  ./configure &#8211;prefix=/usr/local/mysql &#8211;with-extra-charsets=complex \<br />
         &#8211;enable-thread-safe-client &#8211;enable-local-infile &#8211;enable-shared \<br />
         &#8211;with-plugins=innobase<br />
    8. make<br />
    9. sudo make install<br />
    10. cd /usr/local/mysql<br />
    11. sudo ./bin/mysql_install_db &#8211;user=mysql<br />
    12. sudo chown -R mysql ./var<br />
    13. cd ..<br />
    14. open TexEdit, switch to plain text<br />
            copy-paste:</p>
<div class="codecolorer-container objc geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br /></div></td><td><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version<span style="color: #002200;">=</span><span style="color: #bf1d1a;">&quot;1.0&quot;</span> encoding<span style="color: #002200;">=</span><span style="color: #bf1d1a;">&quot;UTF-8&quot;</span>?&gt;<br />
&lt;<span style="color: #002200;">!</span>DOCTYPE plist PUBLIC <span style="color: #bf1d1a;">&quot;-//Apple//DTD PLIST 1.0//EN&quot;</span> <span style="color: #bf1d1a;">&quot;http://www.apple.com/DTDs/PropertyList-1.0.dtd&quot;</span>&gt;<br />
&lt;plist version<span style="color: #002200;">=</span><span style="color: #bf1d1a;">&quot;1.0&quot;</span>&gt;<br />
&lt;dict&gt;<br />
&nbsp; &nbsp; &lt;key&gt;KeepAlive&lt;<span style="color: #002200;">/</span>key&gt;<br />
&nbsp; &nbsp; &lt;<span style="color: #a61390;">true</span><span style="color: #002200;">/</span>&gt;<br />
&nbsp; &nbsp; &lt;key&gt;Label&lt;<span style="color: #002200;">/</span>key&gt;<br />
&nbsp; &nbsp; &lt;string&gt;com.mysql.mysqld&lt;<span style="color: #002200;">/</span>string&gt;<br />
&nbsp; &nbsp; &lt;key&gt;Program&lt;<span style="color: #002200;">/</span>key&gt;<br />
&nbsp; &nbsp; &lt;string&gt;<span style="color: #002200;">/</span>usr<span style="color: #002200;">/</span>local<span style="color: #002200;">/</span>mysql<span style="color: #002200;">/</span>bin<span style="color: #002200;">/</span>mysqld_safe&lt;<span style="color: #002200;">/</span>string&gt;<br />
&nbsp; &nbsp; &lt;key&gt;RunAtLoad&lt;<span style="color: #002200;">/</span>key&gt;<br />
&nbsp; &nbsp; &lt;<span style="color: #a61390;">true</span><span style="color: #002200;">/</span>&gt;<br />
&nbsp; &nbsp; &lt;key&gt;UserName&lt;<span style="color: #002200;">/</span>key&gt;<br />
&nbsp; &nbsp; &lt;string&gt;mysql&lt;<span style="color: #002200;">/</span>string&gt;<br />
&nbsp; &nbsp; &lt;key&gt;WorkingDirectory&lt;<span style="color: #002200;">/</span>key&gt;<br />
&nbsp; &nbsp; &lt;string&gt;<span style="color: #002200;">/</span>usr<span style="color: #002200;">/</span>local<span style="color: #002200;">/</span>mysql&lt;<span style="color: #002200;">/</span>string&gt;<br />
&lt;<span style="color: #002200;">/</span>dict&gt;<br />
&lt;<span style="color: #002200;">/</span>plist&gt;</div></td></tr></tbody></table></div>
<p>save as ~/sources/com.mysql.mysqld.plist<br />
close TexEdit</p>
<p>    15. sudo mv ~/sources/com.mysql.mysqld.plist /Library/LaunchDaemons<br />
    16. sudo chown root /Library/LaunchDaemons/com.mysql.mysqld.plist<br />
    17. sudo launchctl load -w /Library/LaunchDaemons/com.mysql.mysqld.plist<br />
    18. mysqladmin -u root password NEW_PASSWORD</p>
<p>Setup MySQL for Python adapter</p>
<p>   1. Download the latest MySQL for Python adapter from SourceForge(http://sourceforge.net/project/showfiles.php?group_id=22307) and copy to ~/sources<br />
   2. cd ~/sources<br />
   3. tar xzvf MySQL-python-1.2.2.tar.gz<br />
   4. cd ./MySQL-python-1.2.2<br />
   5. Inside the folder, clean the package by typing<br />
   6. sudo python setup.py clean<br />
   7. In the same folder, edit _mysql.c using your favourite text-editor<br />
   8. Remove the following lines (37-39):</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#ifndef uint</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#define uint unsigned int</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#endif</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;Change the following:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;uint port <span style="color: #66cc66;">=</span> MYSQL_PORT<span style="color: #66cc66;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;uint client_flag <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">;</span> <br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;to<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp;unsigned <span style="color: #008000;">int</span> port <span style="color: #66cc66;">=</span> MYSQL_PORT<span style="color: #66cc66;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp;unsigned <span style="color: #008000;">int</span> client_flag <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><span style="color: #66cc66;">;</span></div></td></tr></tbody></table></div>
<p>9. Create a symbolic link under lib to point to a sub-directory called mysql. This is where it    looks for during compilation.<br />
    10.sudo ln -s /usr/local/mysql/lib /usr/local/mysql/lib/mysql<br />
    11. Edit the setup_posix.py and change the following<br />
         mysql_config.path = &#8220;mysql_config&#8221;<br />
          to<br />
     mysql_config.path = &#8220;/usr/local/mysql/bin/mysql_config&#8221;<br />
     12.In the same directory, rebuild your package (ignore the warnings that comes with it)</p>
<p>     13. sudo python setup.py build</p>
<p>       Install the package and you are done.</p>
<p>     14. sudo python setup.py install</p>
<p>      Test if it&#8217;s working. It works if you can import MySQLdb.</p>
<p>      python<br />
    >>> import MySQLdb</p>
<p> SVN<br />
   We will be using build in svn  + WebSvn for repo browsing<br />
   1. mkdir ~/svn<br />
   2 cd ~<br />
   3.chown -R _www svn<br />
   4. svnadmin create &#8211;fs-type fsfs myrepo-1<br />
   5. donwload latest WebSVN<br />
   6. Unpack in into ~/Sites<br />
   7. rename to websvn<br />
   8. chmod 0700 ~/Sites/websvn/cache<br />
   9. rename ~/Sites/websvn/include/distconfig.php to ~/Sites/websvn/include/config.php<br />
   10. edit ~/Sites/websvn/include/config.php:<br />
               find and uncomment<br />
         $config-&gt;useTreeIndex(true);  // Tree index, open by default<br />
         $config-&gt;addInlineMimeType(&#8220;text/plain&#8221;);<br />
         $config-&gt;hideRSS();<br />
         $config-&gt;parentPath(&#8216;path/to/yours/svn&#8217;);</p>
<p> Starting project<br />
   1. cd ~/Sites<br />
   2. mkdir Temp<br />
   3. chmod 0700  ~/Sites/Temp<br />
   4. django-admin.py start project my_project<br />
   5. nano apache_settings.py<br />
   6. add lines:</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">os</span>.<span style="color: black;">environ</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'PYTHON_EGG_CACHE'</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'/Users/you_user_name/Sites/Temp'</span><br />
&nbsp; &nbsp;close apache_settings.<span style="color: black;">py</span></div></td></tr></tbody></table></div>
<p>Configure Apache:<br />
      sudo nano /etc/apache2/httpd.conf<br />
      Add lines:<br />
      LoadModule python_module  libexec/apache2/mod_python.so<br />
      LoadModule php5_module libexec/apache2/libphp5.so #for WebSvn and phpMyAdmin<br />
      Uncomment:<br />
      Include /private/etc/apache2/extra/httpd-vhosts.conf<br />
      Add line:<br />
      PythonImport /Users/you_user_name/Sites/my_project/apache_settings.py my_project<br />
save and exit httpd.conf</p>
<p>Configure VirtualHosts:<br />
      sudo nano /etc/apache2/extra/httpd-vhosts.conf<br />
      remove all lines<br />
      add</p>
<div class="codecolorer-container apache geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br /></div></td><td><div class="apache codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp;<span style="color: #00007f;">NameVirtualHost</span> *:<span style="color: #ff0000;">80</span><br />
&nbsp; &nbsp; <br />
&lt;<span style="color: #000000; font-weight:bold;">VirtualHost</span> *:<span style="color: #ff0000;">80</span>&gt;<br />
&nbsp; &nbsp; <span style="color: #00007f;">ServerName</span> <span style="color: #7f007f;">&quot;you_server_name&quot;</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">DocumentRoot</span> <span style="color: #7f007f;">&quot;/Users/pyromann/Sites/my_project&quot;</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">ErrorLog</span> &nbsp; &nbsp; <span style="color: #7f007f;">&quot;/private/var/log/apache2/my_project-error_log&quot;</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">CustomLog</span> &nbsp; <span style="color: #7f007f;">&quot;/private/var/log/apache2/my_project-access_log&quot;</span> common<br />
&nbsp; &nbsp; &lt;<span style="color: #000000; font-weight:bold;">Directory</span> <span style="color: #7f007f;">&quot;/Users/pyromann/Sites/my_project&quot;</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00007f;">Options</span> <span style="color: #0000ff;">FollowSymLinks</span> MultiViews <span style="color: #0000ff;">Includes</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00007f;">AllowOverride</span> <span style="color: #0000ff;">All</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00007f;">Order</span> <span style="color: #00007f;">allow</span>,<span style="color: #00007f;">deny</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00007f;">Allow</span> from <span style="color: #0000ff;">all</span><br />
&nbsp; &nbsp; &lt;/<span style="color: #000000; font-weight:bold;">Directory</span>&gt;<br />
<br />
&nbsp; &nbsp; &lt;<span style="color: #000000; font-weight:bold;">Location</span> <span style="color: #7f007f;">&quot;/&quot;</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00007f;">SetHandler</span> python-program<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00007f;">SetEnv</span> &nbsp;DJANGO_SETTINGS_MODULE my_project.settings<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonHandler django.core.handlers.modpython<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonPath <span style="color: #7f007f;">&quot;sys.path + ['/Users/your_user_name/Sites/']&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonOption django.root /my_project<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonDebug <span style="color: #0000ff;">On</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonInterpreter my_project<br />
&nbsp; &nbsp; &lt;/<span style="color: #000000; font-weight:bold;">Location</span>&gt;<br />
<br />
&nbsp; &nbsp; &lt;<span style="color: #000000; font-weight:bold;">Location</span> <span style="color: #7f007f;">&quot;/media&quot;</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00007f;">SetHandler</span> <span style="color: #0000ff;">None</span><br />
&nbsp; &nbsp; &lt;/<span style="color: #000000; font-weight:bold;">Location</span>&gt;<br />
<br />
&nbsp; &nbsp; &lt;<span style="color: #000000; font-weight:bold;">LocationMatch</span> <span style="color: #7f007f;">&quot;.(jpg|gif|png)$&quot;</span>&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #00007f;">SetHandler</span> <span style="color: #0000ff;">None</span><br />
&nbsp; &nbsp; &lt;/<span style="color: #000000; font-weight:bold;">LocationMatch</span>&gt;<br />
<br />
&lt;/<span style="color: #000000; font-weight:bold;">VirtualHost</span>&gt;<br />
<br />
&lt;<span style="color: #000000; font-weight:bold;">VirtualHost</span> *:<span style="color: #ff0000;">80</span>&gt;<br />
&nbsp; &nbsp; <span style="color: #00007f;">ServerName</span> <span style="color: #7f007f;">&quot;mysqladmin.loc&quot;</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">ServerAlias</span> <span style="color: #7f007f;">&quot;www.mysqladmin.loc&quot;</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">DocumentRoot</span> <span style="color: #7f007f;">&quot;/Users/your_user_name/Sites/mysqladmin&quot;</span><br />
&lt;/<span style="color: #000000; font-weight:bold;">VirtualHost</span>&gt;<br />
<br />
<br />
&lt;<span style="color: #000000; font-weight:bold;">VirtualHost</span> *:<span style="color: #ff0000;">80</span>&gt;<br />
&nbsp; &nbsp; <span style="color: #00007f;">ServerName</span> <span style="color: #7f007f;">&quot;svn.loc&quot;</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">ServerAlias</span> <span style="color: #7f007f;">&quot;www.svn.loc&quot;</span><br />
&nbsp; &nbsp; <span style="color: #00007f;">DocumentRoot</span> <span style="color: #7f007f;">&quot;/Users/your_user_name/Sites/websvn&quot;</span><br />
&lt;/<span style="color: #000000; font-weight:bold;">VirtualHost</span>&gt;</div></td></tr></tbody></table></div>
<p>Setup hosts<br />
   sudo nano /etc/hosts<br />
   add line:<br />
   127.0.0.1 your_server_name svn.loc mysqladmin.loc</p>
<p>restart apache<br />
    sudo apachectl restart<br />
    http://svn.loc &#8211; yours svn<br />
    http://mysqladmin.loc &#8211; phpMyAdmin<br />
    http://your_server_name  &#8211; yours django project</p>
<p> setup PIL<br />
    Download lates sources<br />
    Place it to ~/sources<br />
    tar xzfv Imaging-1.1.6.tar<br />
    cd Imaging-1.1.6<br />
    python setup.py build<br />
    sudo python setup.py install</p>
<p>Source:<br />
<noindex><br />
<a href="http://pyromann-dude.blogspot.com/2009/09/how-to-setup-django-development.html">How to setup django development environment in Mac OS X 10.6 Snow Leopard</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/setup-python-mysql-mysql-python-and-svn-on-mac-os-x-106.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python and PyQt4 part 1</title>
		<link>http://www.developers-life.com/python-and-pyqt4.html</link>
		<comments>http://www.developers-life.com/python-and-pyqt4.html#comments</comments>
		<pubDate>Sat, 29 Nov 2008 15:17:58 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[others]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[PyQt]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=197</guid>
		<description><![CDATA[Меня уже довольно долгое время интересует программирование на python. В том числе и кроссплатформенное программирование под GUI. Для этих целей использовал PyQt4, который очень легко было использовать т.к. под рукой был qt4 и все его возможности. Первые помощьники это Qt Designer в котором можно быстро набросать интерфейс и Qt Assistant в котором можно прочитать много [...]]]></description>
			<content:encoded><![CDATA[<p>Меня уже довольно долгое время интересует программирование на python. В том числе и кроссплатформенное программирование под GUI. Для этих целей использовал PyQt4, который очень легко было использовать т.к. под рукой был qt4 и все его возможности. Первые помощьники это Qt Designer в котором можно быстро набросать интерфейс и Qt Assistant в котором можно прочитать много полезного для работы с объектами GUI.</p>
<p>Про IDE можно спорить долго, но я выбрал Eric IDE, он написан на Python+PyQt4 , что мне очень понравилось, но в нем есть свои нюансы и баги :)</p>
<p><span id="more-197"></span></p>
<p>На  Qt Designer делаем интерфейс и легким движением руки превращаем в python код:</p>
<p>pyuic4 -x untitled.ui &gt; untitled.py</p>
<p>но можно и не преобразовывать, а использовать *.ui файл&#8230;.</p>
<p>прошло много времени&#8230;&#8230;</p>
<p>и еще много времени&#8230;.</p>
<p>Эта статья писалась уже давно и не как не доходили руки ее дописать, публикую то что есть. Будет время допишу :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/python-and-pyqt4.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Тикеты по всем проектам в Trac`e</title>
		<link>http://www.developers-life.com/macros-for-trac-all-tickets-by-all-projects.html</link>
		<comments>http://www.developers-life.com/macros-for-trac-all-tickets-by-all-projects.html#comments</comments>
		<pubDate>Thu, 11 Sep 2008 20:50:38 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[Macros]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=132</guid>
		<description><![CDATA[Выкладываю свой Macros для трака. Это переписанный макрос, который отображал тикеты по выбранному проекту в виде календаря. На данный момент этот макрос выводит в список все активные тикеты по всем проектам, зашедшего в систему человека, и сортирует их по важности. В этом макросе есть возможность отследить время закрытия/создание/изменение тикетов по дате и по определенному человеку. [...]]]></description>
			<content:encoded><![CDATA[<p>Выкладываю свой Macros для трака. Это переписанный макрос, который отображал тикеты по выбранному проекту в виде календаря.</p>
<p>На данный момент этот макрос выводит в список все активные тикеты по всем проектам, зашедшего в систему человека, и сортирует их по важности. В этом макросе есть возможность отследить время закрытия/создание/изменение тикетов по дате и по определенному человеку.</p>
<p>Код макроса:<br />
<span id="more-132"></span></p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># Author: Vladimir Boichentsov </span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">calendar</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">string</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">Cookie</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">fileinput</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3 <span style="color: #ff7700;font-weight:bold;">as</span> sqlite<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">operator</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">StringIO</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> trac.<span style="color: black;">wiki</span>.<span style="color: black;">api</span> <span style="color: #ff7700;font-weight:bold;">import</span> WikiSystem<br />
<span style="color: #ff7700;font-weight:bold;">from</span> trac.<span style="color: black;">util</span> <span style="color: #ff7700;font-weight:bold;">import</span> *<br />
<br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> execute<span style="color: black;">&#40;</span>hdf<span style="color: #66cc66;">,</span> txt<span style="color: #66cc66;">,</span> env<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># building the output</span><br />
&nbsp; &nbsp; buff <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># you type ticket</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>hdf.<span style="color: black;">getValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'args.close'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'no'</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">&quot;yes&quot;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp;plist <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">'none'</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp;plist <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">'blocker'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'critical'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'high'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'major'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'medium'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'minor'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'trivial'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'low'</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; tickets <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># directory by trac projects</span><br />
&nbsp; &nbsp; DIR <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'/home/pub/trac'</span><br />
&nbsp; &nbsp; o <span style="color: #66cc66;">=</span> j <span style="color: #66cc66;">=</span> c <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; users <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">''</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#passwords for users trac projects</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">fileinput</span>.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/home/pub/svn/.htpasswd'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp;temp <span style="color: #66cc66;">=</span> line.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">':'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>temp<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'admin'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;users +<span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'&lt;a href=&quot;?user='</span> + temp<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">'&quot;&gt;'</span> + temp<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">'&lt;/a&gt; &amp;nbsp;'</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #dc143c;">user</span> <span style="color: #66cc66;">=</span> hdf.<span style="color: black;">getValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'args.user'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; owner <span style="color: #66cc66;">=</span> hdf.<span style="color: black;">getValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;trac.authname&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">&quot;anonymous&quot;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; owner <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">user</span><br />
<br />
&nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;a href=&quot;?user='</span> + owner + <span style="color: #483d8b;">'&amp;close=yes&amp;time=yes&quot;&gt;close(create time)&lt;/a&gt; &lt;a href=&quot;?user='</span> + owner + <span style="color: #483d8b;">'&amp;close=yes&quot;&gt;close(time close)&lt;/a&gt; | '</span> + users + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> <span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;table class=&quot;listing tickets&quot;&gt;&lt;tbody&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;thead&gt;&lt;tr&gt; &lt;td class=&quot;ticket&quot;&gt; Ticket &lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;summary&quot;&gt;Summary&lt;/td&gt; &lt;td&gt; Project&lt;/td&gt; &nbsp;&lt;td class=&quot;owner&quot;&gt;Owner&lt;/td&gt; &lt;td&gt;Priority&lt;/td&gt; &lt;td&gt;Type&lt;/td&gt; &lt;td class=&quot;date&quot;&gt; Create &lt;/td&gt; &lt;td class=&quot;date&quot;&gt; Changetime &lt;/td&gt; &lt;/tr&gt; &lt;/thead&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> p <span style="color: #ff7700;font-weight:bold;">in</span> plist:<br />
&nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">for</span> project <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">listdir</span><span style="color: black;">&#40;</span>DIR<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;con <span style="color: #66cc66;">=</span> sqlite.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>DIR + <span style="color: #483d8b;">'/'</span> + project +<span style="color: #483d8b;">'/db/trac.db'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cur <span style="color: #66cc66;">=</span> con.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>p <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'none'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;and t.priority='&quot;</span> + p + <span style="color: #483d8b;">&quot;'&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">''</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cur.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT t.changetime,t.id,t.summary,t.owner,t.status,t.description,t.time,t.priority,t.type FROM ticket t, ticket_custom tc where tc.ticket=t.id and t.owner='&quot;</span> + owner +<span style="color: #483d8b;">&quot;' &quot;</span> + t<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>hdf.<span style="color: black;">getValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'args.close'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'no'</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">&quot;yes&quot;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; row <span style="color: #66cc66;">=</span> cur.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> row <span style="color: #66cc66;">==</span> <span style="color: #008000;">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;j <span style="color: #66cc66;">=</span> j + <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'closed'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;o <span style="color: #66cc66;">=</span> o + <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c <span style="color: #66cc66;">=</span> c + <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'closed'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span>show_ticket<span style="color: black;">&#40;</span>row<span style="color: #66cc66;">,</span>project<span style="color: #66cc66;">,</span>env<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">while</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; row <span style="color: #66cc66;">=</span> cur.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ticket <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> row <span style="color: #66cc66;">==</span> <span style="color: #008000;">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> t <span style="color: #ff7700;font-weight:bold;">in</span> row:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ticket.<span style="color: black;">append</span><span style="color: black;">&#40;</span>t<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ticket.<span style="color: black;">append</span><span style="color: black;">&#40;</span>project<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tickets.<span style="color: black;">append</span><span style="color: black;">&#40;</span>ticket<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>hdf.<span style="color: black;">getValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'args.close'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'no'</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">&quot;yes&quot;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>hdf.<span style="color: black;">getValue</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'args.time'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'no'</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">&quot;yes&quot;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tickets.<span style="color: black;">sort</span><span style="color: black;">&#40;</span>reverse<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: #66cc66;">,</span>key<span style="color: #66cc66;">=</span><span style="color: #dc143c;">operator</span>.<span style="color: black;">itemgetter</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">6</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;tickets.<span style="color: black;">sort</span><span style="color: black;">&#40;</span>reverse<span style="color: #66cc66;">=</span><span style="color: #008000;">True</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> tickets:<br />
&nbsp; &nbsp; &nbsp;buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span>show_ticket<span style="color: black;">&#40;</span>row<span style="color: #66cc66;">,</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">9</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span>env<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;j <span style="color: #66cc66;">=</span> j + <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'closed'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;o <span style="color: #66cc66;">=</span> o + <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c <span style="color: #66cc66;">=</span> c + <span style="color: #ff4500;">1</span><br />
&nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;/tbody&gt;&lt;/table&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;br&gt;Ticket all: %(j)i Ticket open: %(o)i &nbsp;Closed ticket: %(c)i <span style="color: #000099; font-weight: bold;">\n</span>'</span> % <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'j'</span>:j<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'o'</span>:o<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'c'</span>:c<span style="color: #66cc66;">,</span> <span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; table <span style="color: #66cc66;">=</span> buff.<span style="color: black;">getvalue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; buff.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> table<br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> ticket_priority<span style="color: black;">&#40;</span>row<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; priority <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">''</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'minor'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp;priority <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;background: #e7ffff; border-color: #cee; color: #099;&quot;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'major'</span> <span style="color: #ff7700;font-weight:bold;">or</span> row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'medium'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; priority <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;background: #fbfbfb; border-color: #ddd; color: #444;&quot;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'trivial'</span> <span style="color: #ff7700;font-weight:bold;">or</span> row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'low'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; priority <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;background: #e7eeff; border-color: #cde; color: #469;&quot;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'critical'</span> <span style="color: #ff7700;font-weight:bold;">or</span> row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'high'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; priority <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;background: #ffb; border-color: #eea; color: #880;&quot;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'blocker'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; priority <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;background: #fdc; border-color: #e88; color: #a22;&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'closed'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; priority <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">&quot;color: #777; background: #ddd; border-color: #ccc;&quot;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> priority<br />
<br />
&nbsp; &nbsp; &nbsp;<br />
<span style="color: #ff7700;font-weight:bold;">def</span> show_ticket<span style="color: black;">&#40;</span>row<span style="color: #66cc66;">,</span>project<span style="color: #66cc66;">,</span>env<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; ticket <span style="color: #66cc66;">=</span> row<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; line <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'&lt;tr style=&quot;%(priority)s&quot;&gt; &lt;td class=&quot;ticket&quot;&gt; &lt;a href=&quot;/trac/%(project)s/ticket/%(id)i&quot;&gt; #%(id)i &lt;/a&gt;&lt;/td&gt;&lt;td class=&quot;summary&quot;&gt;&lt;a href=&quot;/trac/%(project)s/ticket/%(id)i&quot; title=&quot;%(description)s&quot;&gt; %(ticket)s &lt;/a&gt;&lt;/td&gt;&lt;td&gt;%(project)s&lt;/td&gt; &nbsp;&lt;td class=&quot;owner&quot;&gt;%(owner)s&lt;/td&gt; &lt;td&gt;%(prio)s&lt;/td&gt; &lt;td&gt;%(type)s&lt;/td&gt; &lt;td class=&quot;date&quot;&gt; %(time)s &lt;/td&gt; &lt;td class=&quot;date&quot;&gt; %(changetime)s &lt;/td&gt; &lt;/tr&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span> % <span style="color: black;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'id'</span> : row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'url'</span>: env.<span style="color: black;">href</span>.<span style="color: black;">ticket</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'project'</span> : project<span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'priority'</span> : ticket_priority<span style="color: black;">&#40;</span>row<span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'prio'</span> : row<span style="color: black;">&#91;</span><span style="color: #ff4500;">7</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'type'</span> : row<span style="color: black;">&#91;</span><span style="color: #ff4500;">8</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'ticket'</span>: ticket<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span>:<span style="color: #ff4500;">100</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'owner'</span>: row<span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'time'</span> : <span style="color: #dc143c;">time</span>.<span style="color: black;">strftime</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%d/%m/%y'</span><span style="color: #66cc66;">,</span><span style="color: #dc143c;">time</span>.<span style="color: black;">localtime</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">6</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'changetime'</span> : &nbsp; &nbsp; &nbsp;<span style="color: #dc143c;">time</span>.<span style="color: black;">strftime</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%d/%m/%y'</span><span style="color: #66cc66;">,</span><span style="color: #dc143c;">time</span>.<span style="color: black;">localtime</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #483d8b;">'style'</span>: row<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'closed'</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: #483d8b;">'font-size: 9px; color: #777777; text-decoration: line-through;'</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #483d8b;">'font-size: 9px; color: #000000'</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #483d8b;">'description'</span>: <span style="color: #483d8b;">&quot; &quot;</span><span style="color: #66cc66;">,</span> <span style="color: #808080; font-style: italic;">#replace(description, &quot;\'&quot;, &quot;&amp;#39;&quot;) == None and &quot; &quot; or replace(description, &quot;\'&quot;, &quot;&amp;#39;&quot;),</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: black;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> line</div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/macros-for-trac-all-tickets-by-all-projects.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Делаем RSS ленту всех проектов Trac`a</title>
		<link>http://www.developers-life.com/making-rss-tape-all-projects-trac-a.html</link>
		<comments>http://www.developers-life.com/making-rss-tape-all-projects-trac-a.html#comments</comments>
		<pubDate>Thu, 11 Sep 2008 20:36:11 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[RSS]]></category>

		<guid isPermaLink="false">http://www.developers-life.com/?p=131</guid>
		<description><![CDATA[Написал небольшой скрипт на python. Для получения RSS ленты по всем проектам trac системы, что иногда очень полезно. Это оценил мой менеджер проектов как удобное средство. Вот привожу на вольный суд. Чтоб получить ленту пишем http://192.168.0.129/index.py?user= md5( хеш пароля) Тоесть уже захешированый пароль еще в md5 Код: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100# Author: Vladimir Boichentsov &#60;sakrist@sakrist.org.ua&#62; import time import [...]]]></description>
			<content:encoded><![CDATA[<p>Написал небольшой скрипт на python. Для получения RSS ленты по всем проектам trac системы, что иногда очень полезно. Это оценил мой менеджер проектов как удобное средство. Вот привожу на вольный суд.</p>
<p>Чтоб получить ленту пишем http://192.168.0.129/index.py?user= md5( хеш пароля)<br />
Тоесть уже захешированый пароль еще в md5<br />
Код:<br />
<span id="more-131"></span></p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># Author: Vladimir Boichentsov &lt;sakrist@sakrist.org.ua&gt;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">calendar</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">string</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">Cookie</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">fileinput</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3 <span style="color: #ff7700;font-weight:bold;">as</span> sqlite<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">cgi</span><br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">base64</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">md5</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">md5</span><br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">StringIO</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">StringIO</span><br />
<br />
<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> &nbsp;index<span style="color: black;">&#40;</span>req<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># building the output</span><br />
&nbsp; &nbsp; buff <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">StringIO</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># you type ticket</span><br />
&nbsp; &nbsp; plist <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span><span style="color: #483d8b;">'blocker'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'critical'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'high'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'major'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'medium'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'minor'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'trivial'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">'low'</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># directory by trac projects</span><br />
&nbsp; &nbsp; DIR <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'/home/pub/trac'</span><br />
<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;"># adress trac projects</span><br />
&nbsp; &nbsp; url <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">'http://192.168.0.129/trac'</span><br />
&nbsp; &nbsp; i <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
&nbsp; &nbsp; owner <span style="color: #66cc66;">=</span> <span style="color: #483d8b;">' '</span><br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> req.<span style="color: black;">form</span>.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'user'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #dc143c;">user</span> <span style="color: #66cc66;">=</span> req.<span style="color: black;">form</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'user'</span><span style="color: black;">&#93;</span>.<span style="color: black;">value</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">#passwords for users trac projects</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> line <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">fileinput</span>.<span style="color: #008000;">input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'/home/pub/.htpasswd'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; line <span style="color: #66cc66;">=</span> line.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #66cc66;">,</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp <span style="color: #66cc66;">=</span> line.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">':'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">md5</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span>.<span style="color: black;">hexdigest</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> <span style="color: #dc143c;">user</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; owner <span style="color: #66cc66;">=</span> temp<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> owner <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">' '</span> :<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;?xml version=&quot;1.0&quot;?&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;rss version=&quot;2.0&quot;&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;channel&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;title&gt;All My Tickets&lt;/title&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;link&gt;'</span> + url + <span style="color: #483d8b;">'/org/wiki/AllTikets&lt;/link&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;description&gt;Trac Report - All My Tickets&lt;/description&gt;'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;language&gt;en-us&lt;/language&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;generator&gt;RSS SAKrisT&lt;/generator&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;image&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;title&gt;Organizational&lt;/title&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;url&gt;'</span> + url + <span style="color: #483d8b;">'_banner.png&lt;/url&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;link&gt;'</span> + url + <span style="color: #483d8b;">'/org/wiki/AllTikets&lt;/link&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;/image&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> p <span style="color: #ff7700;font-weight:bold;">in</span> plist:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> project <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">listdir</span><span style="color: black;">&#40;</span>DIR<span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>i <span style="color: #66cc66;">==</span> <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; con <span style="color: #66cc66;">=</span> sqlite.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>DIR + <span style="color: #483d8b;">'/'</span> + project +<span style="color: #483d8b;">'/db/trac.db'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur <span style="color: #66cc66;">=</span> con.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT t.id,t.summary,t.owner,t.status,t.description,t.time,t.priority,t.type FROM ticket t, ticket_custom tc where tc.ticket=t.id and t.owner='&quot;</span> + owner +<span style="color: #483d8b;">&quot;' and t.priority='&quot;</span> + p &nbsp;+ <span style="color: #483d8b;">&quot;'&quot;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; row <span style="color: #66cc66;">=</span> cur.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> row <span style="color: #66cc66;">==</span> <span style="color: #008000;">None</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">break</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; status <span style="color: #66cc66;">=</span> row<span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description <span style="color: #66cc66;">=</span> row<span style="color: black;">&#91;</span><span style="color: #ff4500;">4</span><span style="color: black;">&#93;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description <span style="color: #66cc66;">=</span> description.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'[[BR]]'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'&amp;lt;br&amp;gt;'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description <span style="color: #66cc66;">=</span> description.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'&amp;lt;'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; description <span style="color: #66cc66;">=</span> description.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&gt;'</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'&amp;gt;'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timee <span style="color: #66cc66;">=</span> <span style="color: #dc143c;">time</span>.<span style="color: black;">strftime</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%d %m %Y %H:%M:%S GMT'</span><span style="color: #66cc66;">,</span><span style="color: #dc143c;">time</span>.<span style="color: black;">localtime</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'closed'</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;item&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>&lt;author&gt;'</span> + owner + <span style="color: #483d8b;">'&lt;/author&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>&lt;pubDate&gt;'</span> + timee &nbsp;+ <span style="color: #483d8b;">'&lt;/pubDate&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>&lt;title&gt;'</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> &nbsp;+ <span style="color: #483d8b;">'&lt;/title&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>&lt;link&gt;%(url)s/%(p)s/ticket/%(id)i&lt;/link&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span> % <span style="color: black;">&#123;</span><span style="color: #483d8b;">'id'</span> : row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'p'</span> : project<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'url'</span> : url<span style="color: #66cc66;">,</span> <span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>&lt;guid isPermaLink=&quot;false&quot;&gt;%(url)s/%(p)s/ticket/%(id)i&lt;/guid&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span> % <span style="color: black;">&#123;</span><span style="color: #483d8b;">'id'</span> : row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'p'</span> : project<span style="color: #66cc66;">,</span> <span style="color: #483d8b;">'url'</span> : url<span style="color: #66cc66;">,</span> <span style="color: black;">&#125;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>&lt;description&gt;'</span> + description +<span style="color: #483d8b;">'&lt;/description&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span><span style="color: #000099; font-weight: bold;">\t</span>&lt;category&gt;Report&lt;/category&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\t</span>&lt;/item&gt;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&lt;/channel&gt;<span style="color: #000099; font-weight: bold;">\n</span>&lt;/rss&gt;'</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; table <span style="color: #66cc66;">=</span> buff.<span style="color: black;">getvalue</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; buff.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> table<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'error'</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/making-rss-tape-all-projects-trac-a.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Пишем свою статистику посещения на Python</title>
		<link>http://www.developers-life.com/writing-his-visitation-statistics-on-python.html</link>
		<comments>http://www.developers-life.com/writing-his-visitation-statistics-on-python.html#comments</comments>
		<pubDate>Thu, 04 Sep 2008 05:44:54 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[sqlite3]]></category>

		<guid isPermaLink="false">http://developers-life.com/?p=77</guid>
		<description><![CDATA[И так, продолжаем играться с питоном и попробуем написать статистику посещений для сайта. Для реализации воспользуемся связкой python и sqlite. Я постараюсь рассказать про мой подход к написанию статистики для одного своего сайта написанного на питоне. Создаем базу для статистики с одной единственной таблицей. setup.py 1234567891011# -*- coding: utf-8 -*- import sqlite3 connection = sqlite3.connect&#40;'statistics.db'&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>И так, продолжаем играться с питоном и попробуем написать статистику посещений для сайта. Для реализации воспользуемся связкой python и sqlite.<br />
Я постараюсь рассказать про мой подход к написанию статистики для одного своего сайта написанного на питоне.<br />
<a name="habracut"></a><br />
Создаем базу для статистики с одной единственной таблицей.<br />
setup.py</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3<br />
<br />
connection <span style="color: #66cc66;">=</span> sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'statistics.db'</span><span style="color: black;">&#41;</span><br />
cursor <span style="color: #66cc66;">=</span> connection.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
cursor.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'CREATE TABLE daily (id INTEGER PRIMARY KEY, time, uri, referer, user_agent, ip)'</span><span style="color: black;">&#41;</span><br />
<br />
cursor.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
connection.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p><span id="more-77"></span></p>
<p>Для сбора статистики будем помещать в базу информацию о каждом запросе. У меня все запросы проходят через файл core.py так что в начале этого файла пишем код такого вида</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">core.<span style="color: black;">py</span><br />
<br />
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3<br />
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span><br />
<br />
connection <span style="color: #66cc66;">=</span> sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'statistics.db'</span><span style="color: black;">&#41;</span><br />
cursor <span style="color: #66cc66;">=</span> connection.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
cursor.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'INSERT INTO daily (time, uri, referer, user_agent, ip) VALUES (%s, %s, %s, %s, %s)'</span> % <span style="color: black;">&#40;</span><span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">,</span> uri<span style="color: #66cc66;">,</span> refer<span style="color: #66cc66;">,</span> user_agent<span style="color: #66cc66;">,</span> ip<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
cursor.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
connection.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p>Отвлечемся немного на sqlite. Модуль sqlite3 реализует работу с базой через DB-API 2.0. При таком подходе стандартная работа с базой выглядит так</p>
<p>connection = sqlite3.connect(&#8216;файл БД&#8217;) — соединяемся с базой<br />
cursor = connection.cursor() — получаем курсор, через него в дальнейшем выполняем все запросы</code></p>
<p>cursor.execute(запрос) — выполняем запрос</p>
<p>cursor.fetchone() — получить одну строку запроса<br />
cursor.fetchall() — получить все строки запроса</p>
<p>connection.close() — закрываем соединение</p>
<p>В sqlite3 есть одна магическая команда, позволяющая обращаться к результатам выборки не только по индексу, но и по имени</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">connection.<span style="color: black;">row_factory</span> <span style="color: #66cc66;">=</span> sqlite3.<span style="color: black;">Row</span></div></td></tr></tbody></table></div>
<p>Теперь займемся самым легким, выбором из базы необходимых данных (мой подход возможно не самый оптимальный, так как вся нагрузка ложится на выборки, но все же)<br />
Создадим класс для статистики.</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3<br />
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">parser</span> <span style="color: #ff7700;font-weight:bold;">import</span> Parser<br />
<br />
<span style="color: #ff7700;font-weight:bold;">class</span> Stats<span style="color: black;">&#40;</span><span style="color: #008000;">object</span><span style="color: black;">&#41;</span>:<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> db<span style="color: black;">&#41;</span>:<br />
<span style="color: #008000;">self</span>.__connection <span style="color: #66cc66;">=</span> sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>db<span style="color: black;">&#41;</span><br />
<span style="color: #008000;">self</span>.__connection.<span style="color: black;">row_factory</span> <span style="color: #66cc66;">=</span> sqlite3.<span style="color: black;">Row</span><br />
<span style="color: #008000;">self</span>.__cursor <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.__connection.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #008000;">self</span>.__parser <span style="color: #66cc66;">=</span> Parser<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<span style="color: #008000;">self</span>.__connection.<span style="color: black;">create_function</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'truncate_time'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">truncate_time</span><span style="color: black;">&#41;</span><br />
<span style="color: #008000;">self</span>.__connection.<span style="color: black;">create_function</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'parse_os_type'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">parse_os_type</span><span style="color: black;">&#41;</span><br />
<span style="color: #008000;">self</span>.__connection.<span style="color: black;">create_function</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'parse_os_version'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">parse_os_version</span><span style="color: black;">&#41;</span><br />
<span style="color: #008000;">self</span>.__connection.<span style="color: black;">create_function</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'parse_browser_type'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">parse_browser_type</span><span style="color: black;">&#41;</span><br />
<span style="color: #008000;">self</span>.__connection.<span style="color: black;">create_function</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'parse_browser_version'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">parse_browser_version</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__del__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #008000;">self</span>.__connection.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_rows<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> query<span style="color: black;">&#41;</span>:<br />
<span style="color: #008000;">self</span>.__cursor.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>query<span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.__cursor.<span style="color: black;">fetchall</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_row<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> query<span style="color: black;">&#41;</span>:<br />
<span style="color: #008000;">self</span>.__cursor.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>query<span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.__cursor.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_row_count<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> query<span style="color: black;">&#41;</span>:<br />
<span style="color: #008000;">self</span>.__cursor.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>query<span style="color: black;">&#41;</span><br />
count <span style="color: #66cc66;">=</span> <span style="color: #ff4500;">0</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.__cursor.<span style="color: black;">fetchall</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
count <span style="color: #66cc66;">=</span> count + <span style="color: #ff4500;">1</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">return</span> count<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> os_type<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_rows</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT COUNT(id) count, parse_os_type(user_agent) os FROM daily GROUP BY os ORDER BY count DESC'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> os_version<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_rows</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT COUNT(id) count, parse_os_type(user_agent) os, parse_os_version(user_agent) version FROM daily GROUP BY os, version ORDER BY count DESC'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> browser_type<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_rows</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT COUNT(id) count, parse_browser_type(user_agent) browser FROM daily GROUP BY browser ORDER BY count DESC'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> browser_version<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_rows</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT COUNT(id) count, parse_browser_type(user_agent) browser, parse_browser_version(user_agent) version FROM daily GROUP BY browser, version ORDER BY count DESC'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> daily_stats<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_rows</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT COUNT(id) count, truncate_time(time) date FROM daily GROUP BY date ORDER BY date DESC'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> page_visited<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_rows</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT COUNT(id) count, uri FROM daily GROUP BY uri ORDER BY uri'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> all_unique<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_row_count</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT ip, truncate_time(time) date FROM daily GROUP BY ip, date'</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> unique_for_date<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> date<span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_row_count</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT ip, truncate_time(time) date FROM daily WHERE date = «%s» GROUP BY ip, date'</span> % date<span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> unique_for_period<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: #66cc66;">,</span> begin<span style="color: #66cc66;">,</span> end<span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_row_count</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT ip, truncate_time(time) date FROM daily WHERE date BETWEEN «%s» AND «%s» GROUP BY ip, date'</span> % <span style="color: black;">&#40;</span>begin<span style="color: #66cc66;">,</span> end<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> count<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
result <span style="color: #66cc66;">=</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_row</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT COUNT(id) count FROM daily'</span><span style="color: black;">&#41;</span><br />
<span style="color: #ff7700;font-weight:bold;">return</span> result<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> get_all<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:<br />
<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>.<span style="color: black;">get_rows</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SELECT * FROM daily'</span><span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p>Класс Parser мы рассмотрим поздней, в нем реализованы методы для обработки запросов.<br />
В примере я реализовал следующие функции:</p>
<p>truncate_time — переводим тип timestamp к формату dd.mm.yyyy<br />
parse_os_type — выбираем из поля user_agent типы ОС<br />
parse_os_version — выбираем из поля user_agent версии ОС<br />
parse_browser_type — выбираем из поля user_agent типы браузеров<br />
parse_browser_version — выбираем из поля user_agent версии браузеров</p>
<p>Функция create_function делает доступными методы питона в запросах sqlite, для выборки статистики будем активно пользоваться этой возможностью.<br />
Нам надо зарегистрировать методы класса как функции в sqlite</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">create_function<span style="color: black;">&#40;</span><span style="color: #483d8b;">'truncate_time'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">truncate_time</span><span style="color: black;">&#41;</span><br />
create_function<span style="color: black;">&#40;</span><span style="color: #483d8b;">'parse_os_type'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">parse_os_type</span><span style="color: black;">&#41;</span><br />
create_function<span style="color: black;">&#40;</span><span style="color: #483d8b;">'parse_os_version'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">parse_os_version</span><span style="color: black;">&#41;</span><br />
create_function<span style="color: black;">&#40;</span><span style="color: #483d8b;">'parse_browser_type'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">parse_browser_type</span><span style="color: black;">&#41;</span><br />
create_function<span style="color: black;">&#40;</span><span style="color: #483d8b;">'parse_browser_version'</span><span style="color: #66cc66;">,</span> <span style="color: #ff4500;">1</span><span style="color: #66cc66;">,</span> <span style="color: #008000;">self</span>.__parser.<span style="color: black;">parse_browser_version</span><span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p>Методы класса</p>
<p>get_rows, get_row, get_row_count — спомогательные методы<br />
os_type — получаем типы ОС<br />
os_version — типы ОС вместе с версиями<br />
browser_type — типы браузеров<br />
browser_version — типы и версии браузеров<br />
daily_stats — количество хитов по дням<br />
page_visited — посещенные страницы и количество хитов<br />
all_unique, unique_for_date, unique_for_period — все уникальные посетители, на дату и за период<br />
count — общее количество хитов<br />
get_all — все записи</p>
<p>Ну а теперь сам парсер. Приведу сразу полный код класса, думаю там ничего сложного нет. При вызове метода в него передается поле из базы и обрабатывается.<br />
# -*- coding: utf-8 -*-</p>
<p>import datetime<br />
import <span style="color: #0000ff;">string</span></p>
<p><span style="color: #0000ff;">class</span> Parser(<span style="color: #0000ff;">object</span>):</p>
<p>def parse_os_type(self, user_agent):<br />
user_agent = user_agent.lower()</p>
<p><span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'windows'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'linux'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'linux'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'macintosh'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'mac'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'freebsd'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'bsd'</span></p>
<p><span style="color: #0000ff;">return</span> <span style="color: #a31515;">'unknown'</span></p>
<p>def parse_os_version(self, user_agent):<br />
user_agent = user_agent.lower()</p>
<p><span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows nt 6.0'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'vista'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows nt 5.2'</span> <span style="color: #0000ff;">in</span> user_agent:</p>
<p><span style="color: #0000ff;">return</span> <span style="color: #a31515;">'2003'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows nt 5.1'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'xp'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows nt 5.0'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'2000'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows nt 4.0'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'nt'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows 98'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'98'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'windows 95'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'95'</span></p>
<p><span style="color: #0000ff;">if</span> <span style="color: #a31515;">'macintosh'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
start = user_agent.find(<span style="color: #a31515;">'mac os x'</span>) + 8<br />
<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">string</span>.replace(user_agent[start: start + 7], <span style="color: #a31515;">'_'</span>, <span style="color: #a31515;">'.'</span>)</p>
<p><span style="color: #0000ff;">return</span> <span style="color: #a31515;">'unknown'</span></p>
<p>def parse_browser_type(self, user_agent):<br />
user_agent = user_agent.lower()</p>
<p><span style="color: #0000ff;">if</span> <span style="color: #a31515;">'firefox'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'firefox'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'opera'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'opera'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'safari'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'safari'</span><br />
<span style="color: #0000ff;">if</span> <span style="color: #a31515;">'msie'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
<span style="color: #0000ff;">return</span> <span style="color: #a31515;">'ie'</span></p>
<p><span style="color: #0000ff;">return</span> <span style="color: #a31515;">'unknown'</span></p>
<p>def parse_browser_version(self, user_agent):<br />
user_agent = user_agent.lower()</p>
<p><span style="color: #0000ff;">if</span> <span style="color: #a31515;">'firefox'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
start = user_agent.find(<span style="color: #a31515;">'firefox/'</span>) + 8<br />
<span style="color: #0000ff;">return</span> user_agent[start: start + 3]</p>
<p><span style="color: #0000ff;">if</span> <span style="color: #a31515;">'opera'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
start = user_agent.find(<span style="color: #a31515;">'opera'</span>) + 5<br />
<span style="color: #0000ff;">return</span> user_agent[start: start + 4]</p>
<p><span style="color: #0000ff;">if</span> <span style="color: #a31515;">'safari'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
start = user_agent.find(<span style="color: #a31515;">'version/'</span>) + 8<br />
<span style="color: #0000ff;">return</span> user_agent[start: start + 4]</p>
<p><span style="color: #0000ff;">if</span> <span style="color: #a31515;">'msie'</span> <span style="color: #0000ff;">in</span> user_agent:<br />
start = user_agent.find(<span style="color: #a31515;">'msie'</span>) + 4<br />
<span style="color: #0000ff;">return</span> user_agent[start: start + 4]</p>
<p><span style="color: #0000ff;">return</span> <span style="color: #a31515;">'unknown'</span></p>
<p>def truncate_time(self, time):<br />
date = datetime.datetime<br />
<span style="color: #0000ff;">return</span> date.fromtimestamp(time).strftime(<span style="color: #a31515;">'%d.%m.%Y'</span>)<br />
Пример использования</p>
<div class="codecolorer-container python geshi" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:810px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">statex <span style="color: #66cc66;">=</span> Stats<span style="color: black;">&#40;</span><span style="color: #66cc66;">&lt;</span>span style<span style="color: #66cc66;">=</span><span style="color: #483d8b;">&quot;color: #a31515;&quot;</span><span style="color: #66cc66;">&gt;</span><span style="color: #483d8b;">'statistics.db'</span><span style="color: #66cc66;">&lt;</span>/span<span style="color: #66cc66;">&gt;</span><span style="color: black;">&#41;</span></div></td></tr></tbody></table></div>
<p><span style="color: #0000ff;">for</span> row <span style="color: #0000ff;">in</span> statex.browser_type():<br />
print <span style="color: #a31515;">'%s %s'</span> % (row[<span style="color: #a31515;">'browser'</span>], row[<span style="color: #a31515;">'count'</span>])</p>
<p><span style="color: #0000ff;">for</span> row <span style="color: #0000ff;">in</span> statex.os_type():<br />
print <span style="color: #a31515;">'%s %s'</span> % (row[<span style="color: #a31515;">'os'</span>], row[<span style="color: #a31515;">'count'</span>])<br />
У меня в проекте это выглядит примерно так.<br />
Выполняю запрос и передаю его в шаблон:<br />
statex = Stats(<span style="color: #a31515;">'statistics.db'</span>)<br />
total = statex.count()</p>
<p><span style="color: #0000ff;">if</span> (re.match(r<span style="color: #a31515;">'^(.*)/os(\/*)$'</span>, req.uri)):<br />
os_types = []<br />
<span style="color: #0000ff;">for</span> row <span style="color: #0000ff;">in</span> statex.os_type():<br />
os_types.append({<span style="color: #a31515;">'name'</span>: row[<span style="color: #a31515;">'os'</span>], <span style="color: #a31515;">'count'</span>: row[<span style="color: #a31515;">'count'</span>], <span style="color: #a31515;">'percent'</span>: calc_percent(total, row[<span style="color: #a31515;">'count'</span>])})</p>
<p>os_versions = []<br />
<span style="color: #0000ff;">for</span> row <span style="color: #0000ff;">in</span> statex.os_version():<br />
os_versions.append({<span style="color: #a31515;">'name'</span>: row[<span style="color: #a31515;">'os'</span>], <span style="color: #a31515;">'version'</span>: row[<span style="color: #a31515;">'version'</span>], <span style="color: #a31515;">'count'</span>: row[<span style="color: #a31515;">'count'</span>], <span style="color: #a31515;">'percent'</span>: calc_percent(total, row[<span style="color: #a31515;">'count'</span>])})</p>
<p>template = Template(filename=path + <span style="color: #a31515;">'/templates/os.tpl'</span>, format_exceptions=True)<br />
req.content_type = <span style="color: #a31515;">'text/html'</span><br />
req.write(template.render(os_types=os_types, os_versions=os_versions, fetch_time=round(time.time() — start, 3)))<br />
В шаблоне рисую табличку<br />
<code lang="python"><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span>OS<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span></p>
<p><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span></p>
<p>% for row in os_types:<br />
${row['name']} ${row['count']} ${row['percent']}<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">br</span><span style="color: #0000ff;">&gt;</span><br />
% endfor</p>
<p><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span>OS Versions<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">h1</span><span style="color: #0000ff;">&gt;</span></p>
<p>% for row in os_versions:<br />
${row['name']} ${row['version']} ${row['count']} ${row['percent']}<span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">br</span><span style="color: #0000ff;">&gt;</span><br />
% endfor</p>
<p><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">p</span><span style="color: #0000ff;">&gt;</span></p>
<p>Fetch time: ${fetch_time}<br />
Все. Дорабатывайте парсер и запросы под свои нужды.</p>
<p>P.S. Да бы меня не уличие в велосипедостроении, прошу считать данный пост примером к использованию sqlite3 и python :)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/writing-his-visitation-statistics-on-python.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Web Admin Permissions for Trac 0.10</title>
		<link>http://www.developers-life.com/web-admin-permissions-for-trac-010.html</link>
		<comments>http://www.developers-life.com/web-admin-permissions-for-trac-010.html#comments</comments>
		<pubDate>Wed, 03 Sep 2008 17:11:11 +0000</pubDate>
		<dc:creator>Vladimir Boychentsov</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[Plugin]]></category>

		<guid isPermaLink="false">http://developers-life.com/?p=14</guid>
		<description><![CDATA[Плагин для управления правами доступа пользователей (Web Admin Permissions)  WebAdminPerm совмести с Trac 0.10. Легок в установке и настройке. В версии трака Trac 0.11dev это реализовано, но так-как это dev версия она не стабильна, а этот плагин полноценно заменяет возможности управления правами. Установив плагин нужно указать в trac.ini в секци [components] следующую строку: webadminperm.perm.permissionadminpage = [...]]]></description>
			<content:encoded><![CDATA[<p>Плагин для управления правами доступа пользователей (Web Admin Permissions)  <a href="http://sakrist.org.ua/userfiles/webadminperm.tar">WebAdminPerm</a> совмести с Trac 0.10. Легок в установке и настройке.</p>
<p>В версии трака Trac 0.11dev это реализовано, но так-как это dev версия она не стабильна, а этот плагин полноценно заменяет возможности управления правами.</p>
<p>Установив плагин нужно указать в trac.ini в секци [components] следующую строку:<br />
webadminperm.perm.permissionadminpage = enabled<br />
<span id="more-14"></span><br />
В данные момент разработка плагина приостановлена.</p>
<p>Скриншот в действии:</p>
<p><img src="http://sakrist.org.ua/userfiles/xp3.jpg" alt="Trac Permission" width="733" height="384" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.developers-life.com/web-admin-permissions-for-trac-010.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

