New site functionality implemented
[biaweb_qt.git] / biaweb_db.py
diff --git a/biaweb_db.py b/biaweb_db.py
new file mode 100644 (file)
index 0000000..9be184d
--- /dev/null
@@ -0,0 +1,236 @@
+# BiaWeb Website content manager (c) 2010 V.Harishankar
+# Database handling functions
+
+import sqlite3
+
+def create_db (dbname, site_title, site_url, keywords, description, copyright,
+                                       num_rss, dest_path):
+       try:
+               conn = sqlite3.connect (dbname)
+               c = conn.cursor ()
+               c.execute ("CREATE TABLE IF NOT EXISTS \
+                                       categories (cid INTEGER PRIMARY KEY, \
+                                       name TEXT, desc TEXT, \
+                                       stub TEXT);")
+               c.execute ("CREATE TABLE IF NOT EXISTS \
+                                       articles (aid INTEGER PRIMARY KEY, \
+                                       title TEXT, summary TEXT, keywords TEXT, \
+                                       content TEXT, cdate NUMERIC, mdate NUMERIC, cid NUMERIC, \
+                                       stub TEXT, rating NUMERIC);")
+               c.execute ("CREATE TABLE IF NOT EXISTS \
+                                       config (config_name TEXT, config_param TEXT);")
+
+               c.execute ("CREATE TABLE IF NOT EXISTS \
+                                       templates (template_name TEXT, template_content);")
+
+               template_main = """<?xml version="1.0" encoding="UTF-8"?>
+       <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+       <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+       <head>
+       <title>${site_title}</title>
+       <base href="${site_url}" />
+       <meta name="generator" content="BiaWeb"/>
+       <meta name="keywords" content="${meta_keywords}"/>
+       <meta name="description" content="${meta_description}"/>
+       <link rel="StyleSheet" type="text/css" href="style.css" />
+       <link rel="alternate" type="application/rss+xml" title="Entries RSS 2.0" href="subscribe.xml" />
+       </head>
+       <body>
+               <div id="head">
+                       <h1><a href="${site_url}">${page_title}</a></h1>
+                       <div class="headerdesc">${page_desc}</div>
+               </div>
+               <div id="main">
+                       ${contents_bit}
+               </div>
+               <div id="sidebar">
+                       <h2>Categories</h2>
+                       ${list_of_categories}
+                       <h2>Best rated</h2>
+                       ${list_best_rated}
+                       <h2>Subscribe</h2>
+                       <a href="subscribe.xml">Latest articles (RSS)</a>
+                       <h2>Search</h2>
+                       <form action="cgi-bin/search.py" method="post" enctype="multipart/form-data">
+                                               <p><input type="text" name="query" maxlength="255" style="width:142px;border: 1px inset #5A5A5A; color:#5A5A5A; background-color:#FFFFFF;" value="" /><br />
+                                               <input type="submit" value="Search" /><br />
+                                               <input type="hidden" name="fromsearch" value="fromsearch" />
+                                               <input type="radio" name="criteria" value="1" checked="checked" />All words<br />
+                                               <input type="radio" name="criteria" value="2" />Any word</p>
+                       </form>
+               </div>
+               <div id="footer">${copyright}<br />Site generated by
+               <a href=\"http://harishankar.org/software/biaweb.php\">BiaWeb</a> created by V. Harishankar</div>
+       </body>
+       </html>"""
+
+               template_article_bit = """<h2>${article_title}</h2>
+       <div class="modified">Created: ${article_cdate} | Last modified: ${article_mdate}</div>
+       <div class="rating">Rating: ${rating}</div>
+       <div class="content">${article_contents}</div>
+       """
+
+               template_news_item_bit = """<h3><a href="${news_link}">${news_title}</a></h3>
+       <div class="modified">${news_datetime}</div>
+       <div class="content">${news_description}</div>
+       """
+
+               template_index_bit = """<h2>Welcome to ${site_name}</h2>
+       <div class="content">
+       Welcome to my site, ${site_name}.
+       </div>
+       <h2>Latest Articles</h2>
+       ${news_updates}
+       """
+
+               template_table_bit = """<h2>${category_title}</h2>
+                       <p>${category_desc}</p>
+               <table class="categorytable">
+               <thead>
+                       <tr>
+                               <td style="width:50%">Title</td>
+                               <td>Created on</td>
+                               <td>Rated</td>
+                       </tr>
+               </thead>
+               <tbody>
+                       ${table_rows}
+               </tbody>
+       </table>
+       """
+
+               template_tablerow_bit = """<tr>
+               <td style="width:50%"><a href="${article_url}">${title}</a></td>
+               <td>${created}</td>
+               <td>${rating}</td>
+       </tr>
+       """
+
+               template_style = """body {
+               font-family: "Bitstream Vera Sans", Verdana, Arial, Sans Serif;
+               font-size: 0.9em;
+               background-color: #ffffff;
+               color: #000000;
+               margin: auto
+       }
+       #head {
+               width: 98%;
+               background-color: #efefef;
+               padding: 1%;
+               text-align: center;
+       }
+
+       #main {
+               width: 73%;
+               padding: 1%;
+               float: left;
+       }
+
+       #sidebar {
+               width: 23%;
+               padding: 1%;
+               float: right;
+       }
+
+       #footer {
+               width: 100%;
+               padding-top: 5px;
+               padding-bottom: 5px;
+               font-size: 0.9em;
+               text-align: center;
+               float: left;
+               background-color: #efefef;
+       }
+
+       .headerdesc {
+               font-variant: small-caps;
+               font-size: 1.1em;
+       }
+
+       .content {
+               text-align: justify;
+               line-height: 1.1em;
+       }
+
+       .categorytable {
+               width: 100%;
+       }
+
+       .categorytable thead {
+               font-weight: bold;
+       }
+
+       .modified {
+               font-size: 0.8em;
+               color: #666666;
+       }
+
+       .rating {
+               font-size: 0.8em;
+               color: #666666;
+       }
+
+       h1, h2, h3 {
+               font-family: "Bitstream Vera Serif", Serif;
+               padding: 0;
+               margin: 0;
+               margin-top: 5px;
+               margin-bottom: 5px;
+       }
+
+       hr {
+               border: 0;
+               border-bottom: 1px solid;
+               border-color: #888888;
+       }
+
+       h1 {
+               font-size: 2.4em;
+               color: #000099;
+
+       }
+       h1 a, h1 a:hover, h1 a:visited, h2 a:active {
+               text-decoration: none;
+       }
+       h2 {
+               font-size: 1.4em;
+               background-color: #efefef;
+       }
+       h2 a, h2 a:hover, h2 a:visited, h2 a:active {
+               text-decoration: none;
+       }
+       h3 {
+               font-size: 1.2em;
+       a  {
+               color: #0000dd;
+       }
+       a:visited {
+               color: #0000aa;
+       }
+       a:active, a:hover {
+               color: #0000ff;
+       }"""
+
+               c.executemany ("INSERT INTO templates (template_name, template_content) VALUES (?, ?);",
+                                                                       [["main_template", template_main],
+                                                                        ["article_bit", template_article_bit],
+                                                                        ["news_bit", template_news_item_bit],
+                                                                        ["table_bit", template_table_bit],
+                                                                        ["tablerow_bit", template_tablerow_bit],
+                                                                        ["stylesheet", template_style],
+                                                                        ["index_bit", template_index_bit]])
+
+               c.executemany ("INSERT INTO config (config_name, config_param) VALUES (?, ?); ",
+                                                                       [["Website URL", site_url],
+                                                                        ["Website Title", site_title],
+                                                                        ["Keywords", keywords],
+                                                                        ["Description", description],
+                                                                        ["No. of RSS items", num_rss],
+                                                                        ["Destination path", dest_path],
+                                                                        ["Copyright", copyright]])
+
+               conn.commit ()
+               conn.close ()
+               return True
+       except sqlite3.Error:
+               return False