Completed the template editing functionality
authorHarishankar <v.harishankar@gmail.com>
Mon, 29 Nov 2010 13:01:44 +0000 (18:31 +0530)
committerHarishankar <v.harishankar@gmail.com>
Mon, 29 Nov 2010 13:01:44 +0000 (18:31 +0530)
Completed the template editing functionality.
Also removed the default templates from main code and
put it in a separate module. This is for future use (e.g.
for reverting templates to default feature)

biaweb_db.py
biaweb_strings.py [new file with mode: 0644]
editor_dialog.py
editor_dialog.ui
templates_dialog.py
templates_dialog.ui
ui_editor_dialog.py
ui_templates_dialog.py

index c2761f5..b310972 100644 (file)
@@ -6,6 +6,8 @@ import os
 import os.path
 import time
 
+import biaweb_strings as bws
+
 # function to get the template text for a particular template
 def get_template_text (dbname, template_name):
        try:
@@ -20,6 +22,19 @@ def get_template_text (dbname, template_name):
        except sqlite3.Error:
                return False
 
+# function to update the template
+def update_template (dbname, template_name, template_str):
+       try:
+               conn = sqlite3.connect (dbname)
+               c = conn.cursor ()
+               c.execute ("UPDATE templates SET template_content=? WHERE template_name=?",
+                                               (template_str, template_name))
+               conn.commit ()
+               conn.close ()
+               return True
+       except sqlite3.Error:
+               return False
+
 # function to retrieve the templates from the database
 def get_templates (dbname):
        try:
@@ -233,6 +248,8 @@ def create_db (dbname, site_title, site_url, keywords, description, copyright,
        try:
                conn = sqlite3.connect (dbname)
                c = conn.cursor ()
+
+               # create the tables
                c.execute ("CREATE TABLE IF NOT EXISTS \
                                        categories (cid INTEGER PRIMARY KEY, \
                                        name TEXT, desc TEXT, \
@@ -248,203 +265,17 @@ def create_db (dbname, site_title, site_url, keywords, description, copyright,
                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;
-}"""
-
+               # insert the templates into the newly created database
                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]])
-
+                                                                       [["main_template", bws.template_main],
+                                                                        ["article_bit", bws.template_article_bit],
+                                                                        ["news_bit", bws.template_news_item_bit],
+                                                                        ["table_bit", bws.template_table_bit],
+                                                                        ["tablerow_bit", bws.template_tablerow_bit],
+                                                                        ["stylesheet", bws.template_style],
+                                                                        ["index_bit", bws.template_index_bit]])
+
+               # inser the configuration
                c.executemany ("INSERT INTO config (config_name, config_param) VALUES (?, ?); ",
                                                                        [["Website URL", site_url],
                                                                         ["Website Title", site_title],
diff --git a/biaweb_strings.py b/biaweb_strings.py
new file mode 100644 (file)
index 0000000..62d1f5e
--- /dev/null
@@ -0,0 +1,190 @@
+# BiaWeb Website content manager (c) 2010 V.Harishankar
+# Strings class
+
+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;
+}"""
\ No newline at end of file
index 9c35a22..e19101e 100644 (file)
@@ -17,9 +17,9 @@ class EditorDialog (PyQt4.QtGui.QDialog, ui_editor_dialog.Ui_EditorDialog):
                self.setWindowTitle ("Editor - " + title)
 
                # set text highlighting
-               highlighter.SimpleHtmlHighlighter (self.template_text.document ())
+               highlighter.SimpleHtmlHighlighter (self.text.document ())
 
-               self.template_text.setPlainText (init_text)
+               self.text.setPlainText (init_text)
                # set modified flag to false
                self.modified = False
 
index 8a86b7c..e652b6a 100644 (file)
@@ -15,7 +15,7 @@
   </property>
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0">
-    <widget class="QPlainTextEdit" name="template_text">
+    <widget class="QPlainTextEdit" name="text">
      <property name="font">
       <font>
        <family>Monospace</family>
@@ -79,7 +79,7 @@
    </hints>
   </connection>
   <connection>
-   <sender>template_text</sender>
+   <sender>text</sender>
    <signal>textChanged()</signal>
    <receiver>EditorDialog</receiver>
    <slot>onTextChanged()</slot>
index efd5bd7..64cc70c 100644 (file)
@@ -21,10 +21,10 @@ class TemplatesDialog (PyQt4.QtGui.QDialog, ui_templates_dialog.Ui_TemplatesDial
 
        def onEdit (self):
                # get the currently selected list item
-               tpl_name = self.templates.currentItem ().data (0).toString ()
+               tpl_name = str (self.templates.currentItem ().data (0).toString ())
 
                # get the template content from the database
-               tpl_str = biaweb_db.get_template_text (self.current_db, str (tpl_name))
+               tpl_str = biaweb_db.get_template_text (self.current_db, tpl_name)
 
                # if template string cannot be obtained for some reason
                if tpl_str == False:
@@ -32,4 +32,13 @@ class TemplatesDialog (PyQt4.QtGui.QDialog, ui_templates_dialog.Ui_TemplatesDial
                else:
                        # open edit dialog with title "template name" and text as the template string
                        edlg = editor_dialog.EditorDialog (self, tpl_name, tpl_str)
-                       edlg.exec_ ()
+                       # if editing is confirmed
+                       if edlg.exec_ () == PyQt4.QtGui.QDialog.Accepted:
+                               upd_tpl_str = str (edlg.text.toPlainText ()).strip ()
+
+                               # update the template with the new template string
+                               ret = biaweb_db.update_template (self.current_db, tpl_name, upd_tpl_str)
+                               # if update failed
+                               if ret == False:
+                                       PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in updating template")
+
index d8e5a04..93e391d 100644 (file)
     <height>256</height>
    </rect>
   </property>
+  <property name="minimumSize">
+   <size>
+    <width>350</width>
+    <height>256</height>
+   </size>
+  </property>
+  <property name="maximumSize">
+   <size>
+    <width>350</width>
+    <height>256</height>
+   </size>
+  </property>
   <property name="windowTitle">
    <string>Templates</string>
   </property>
index 62b5e44..e9d7a25 100644 (file)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'editor_dialog.ui'
 #
-# Created: Mon Nov 29 17:43:54 2010
+# Created: Mon Nov 29 18:18:36 2010
 #      by: PyQt4 UI code generator 4.7.4
 #
 # WARNING! All changes made in this file will be lost!
@@ -15,15 +15,15 @@ class Ui_EditorDialog(object):
         EditorDialog.resize(663, 463)
         self.gridLayout = QtGui.QGridLayout(EditorDialog)
         self.gridLayout.setObjectName("gridLayout")
-        self.template_text = QtGui.QPlainTextEdit(EditorDialog)
+        self.text = QtGui.QPlainTextEdit(EditorDialog)
         font = QtGui.QFont()
         font.setFamily("Monospace")
-        self.template_text.setFont(font)
-        self.template_text.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
-        self.template_text.setTabChangesFocus(True)
-        self.template_text.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap)
-        self.template_text.setObjectName("template_text")
-        self.gridLayout.addWidget(self.template_text, 0, 0, 1, 1)
+        self.text.setFont(font)
+        self.text.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
+        self.text.setTabChangesFocus(True)
+        self.text.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap)
+        self.text.setObjectName("text")
+        self.gridLayout.addWidget(self.text, 0, 0, 1, 1)
         self.buttonBox = QtGui.QDialogButtonBox(EditorDialog)
         self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
         self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
@@ -33,7 +33,7 @@ class Ui_EditorDialog(object):
         self.retranslateUi(EditorDialog)
         QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("accepted()"), EditorDialog.accept)
         QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL("rejected()"), EditorDialog.reject)
-        QtCore.QObject.connect(self.template_text, QtCore.SIGNAL("textChanged()"), EditorDialog.onTextChanged)
+        QtCore.QObject.connect(self.text, QtCore.SIGNAL("textChanged()"), EditorDialog.onTextChanged)
         QtCore.QMetaObject.connectSlotsByName(EditorDialog)
 
     def retranslateUi(self, EditorDialog):
index 7c2fce4..9912eff 100644 (file)
@@ -2,7 +2,7 @@
 
 # Form implementation generated from reading ui file 'templates_dialog.ui'
 #
-# Created: Mon Nov 29 16:38:12 2010
+# Created: Mon Nov 29 18:11:30 2010
 #      by: PyQt4 UI code generator 4.7.4
 #
 # WARNING! All changes made in this file will be lost!
@@ -13,6 +13,8 @@ class Ui_TemplatesDialog(object):
     def setupUi(self, TemplatesDialog):
         TemplatesDialog.setObjectName("TemplatesDialog")
         TemplatesDialog.resize(350, 256)
+        TemplatesDialog.setMinimumSize(QtCore.QSize(350, 256))
+        TemplatesDialog.setMaximumSize(QtCore.QSize(350, 256))
         self.gridLayout = QtGui.QGridLayout(TemplatesDialog)
         self.gridLayout.setObjectName("gridLayout")
         self.label = QtGui.QLabel(TemplatesDialog)