Minor: Fixed return value
[biaweb_qt.git] / main_window.py
index f917e76..799fdf8 100644 (file)
@@ -2,11 +2,15 @@
 # Main Window class
 
 import PyQt4
+import sys
+
 import ui_main_window
 import site_configuration_dialog as scd
 import category_dialog as catd
+import article_dialog as artd
+import templates_dialog as tpld
+import generate_dialog as gend
 import biaweb_db
-import sys
 
 class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
        def __init__ (self):
@@ -17,36 +21,183 @@ class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
        # refresh the category list
        def repopulate_categories (self):
                recs = biaweb_db.get_categories (self.current_db)
+
+               # check with False because None is returned when no records exist
                if recs == False:
                        PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in getting the categories")
-                       return
+                       return False
 
                self.categories.clear ()
                for (id, name, desc, stub) in recs:
                        qrow = PyQt4.QtGui.QTreeWidgetItem ([str(id), str(name)])
                        self.categories.addTopLevelItem (qrow)
 
+               # return true when successful
+               return True
+
        # refresh the articles list
        def repopulate_articles (self, catid=None):
                recs = biaweb_db.get_articles (self.current_db, catid)
+
+               # check with False because None is returned when no records exist
                if recs == False:
                        PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in getting the articles")
-                       return
+                       return False
 
                self.articles.clear ()
                for item in recs:
                        qrow = PyQt4.QtGui.QTreeWidgetItem ([str(item[0]), str(item[1])])
                        self.articles.addTopLevelItem (qrow)
+               # return true when successful
+               return True
+
+       # when the view is refreshed
+       def onViewRefresh (self):
+               if self.current_db is not None:
+                       self.repopulate_categories ()
+                       self.repopulate_articles ()
+
+       # when add article is triggered
+       def onArticleAdd (self):
+               if self.current_db is None:
+                       PyQt4.QtGui.QMessageBox.critical (self, "Error",
+                                                       "Cannot create article. You need to create or open a website first")
+               else:
+                       catid = self.get_selected_item_id (self.categories)
+                       # if no category is selected
+                       if catid is None:
+                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "No category selected for article")
+                               return
+                       artdlg = artd.ArticleDialog (self)
+                       cats = biaweb_db.get_categories (self.current_db)
+
+                       artdlg.populate_categories (cats, catid)
+
+                       # if OK is pressed
+                       if artdlg.exec_ () == PyQt4.QtGui.QDialog.Accepted:
+                               title = str (artdlg.article_title.text ()).strip ()
+                               keywords = str (artdlg.keywords.text ()).strip ()
+                               summary = str (artdlg.summary.toPlainText ()).strip ()
+                               content = str (artdlg.content.toPlainText ()).strip ()
+                               cid, ok = artdlg.category.itemData (artdlg.category.currentIndex ()).toInt ()
+                               # if catid is not an integer then abort
+                               if not ok:
+                                       return
+                               rating = artdlg.rating.value ()
+                               stub = str (artdlg.stub.text ()).strip ()
+
+                               ret = biaweb_db.create_article (self.current_db, title, summary, keywords, content, cid,
+                                                                                               stub, rating)
+                               if ret:
+                                       PyQt4.QtGui.QMessageBox.information (self, "Success", "Article successfully created")
+                                       self.repopulate_categories ()
+                                       self.repopulate_articles (catid)
+                               else:
+                                       PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in creating article")
+
+       # when edit article is triggered
+       def onArticleEdit (self):
+               if self.current_db is None:
+                       PyQt4.QtGui.QMessageBox.critical (self, "Error",
+                                                       "Cannot edit article. You need to create or open a website first")
+               else:
+                       # get the selected article
+                       artid = self.get_selected_item_id (self.articles)
+                       catid = self.get_selected_item_id (self.categories)
+
+                       # no article is selected
+                       if artid is None:
+                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "No article selected")
+                               return
+                       article = biaweb_db.get_article (self.current_db, artid)
+                       # if article cannot be read
+                       if not article:
+                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in reading article")
+                               return
+                       artdlg = artd.ArticleDialog (self)
+
+                       artdlg.article_title.setText (article[1])
+                       artdlg.summary.setPlainText (article[2])
+                       artdlg.keywords.setText (article[3])
+                       artdlg.content.setPlainText (article[4])
+                       # populate category combo box and set active category to the article's category
+                       cats = biaweb_db.get_categories (self.current_db)
+                       artdlg.populate_categories (cats, article[7])
+                       artdlg.stub.setText (article[8])
+                       artdlg.rating.setValue (article[9])
+
+                       # ok is pressed
+                       if artdlg.exec_ () == PyQt4.QtGui.QDialog.Accepted:
+                               title = str (artdlg.article_title.text ()).strip ()
+                               summary = str (artdlg.summary.toPlainText ()).strip ()
+                               keywords = str (artdlg.keywords.text ()).strip ()
+                               content = str (artdlg.content.toPlainText ()).strip ()
+                               cid, ok = artdlg.category.itemData (artdlg.category.currentIndex()).toInt ()
+                               # if cat id is not an integer
+                               if not ok:
+                                       return
+                               rating = artdlg.rating.value ()
+                               stub = str (artdlg.stub.text ()).strip ()
+                               ret = biaweb_db.update_article (self.current_db, artid, title,
+                                                                               summary, keywords, content, cid, stub, rating)
+                               if ret:
+                                       PyQt4.QtGui.QMessageBox.information (self, "Success", "Article successfully updated")
+                                       self.repopulate_articles (catid)
+                               else:
+                                       PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in updating article")
+
+       # when delete article is triggered
+       def onArticleDelete (self):
+               if self.current_db is None:
+                       PyQt4.QtGui.QMessageBox.critical (self, "Error",
+                                                       "Cannot delete article. You need to create or open a website first")
+               else:
+                       # get the selected article
+                       artid = self.get_selected_item_id (self.articles)
+                       catid = self.get_selected_item_id (self.categories)
+                       if artid is None:
+                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "No article selected")
+                               return
+                       # get confirmation on delete
+                       flag = PyQt4.QtGui.QMessageBox.question (self, "Confirm",
+                                                       "Are you sure you wish to delete the selected article?",
+                                                       PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
+                       # confirmed
+                       if flag == PyQt4.QtGui.QMessageBox.Yes:
+                               ret = biaweb_db.delete_article (self.current_db, artid)
+                               if not ret:
+                                       PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in deleting article")
+                               else:
+                                       self.repopulate_articles (catid)
 
-       # configuration dialog
+       # when category item is activated
+       def onCategoryItemActivated (self):
+               self.onCategoryEdit ()
+
+       # when article item is activated
+       def onArticleItemActivated (self):
+               self.onArticleEdit ()
+
+       # when item selection is changed in categories tree widget
+       def onCategorySelectionChanged (self):
+               if self.current_db is not None:
+                       catid = self.get_selected_item_id (self.categories)
+                       self.repopulate_articles (catid)
+
+       # when configuration menu is triggered
        def onConfiguration (self):
-               if self.current_db == None:
+               if self.current_db is None:
                        PyQt4.QtGui.QMessageBox.critical (self, "Error",
                                                        "Cannot edit configuration. You need to create or open a website first")
                else:
                        dlg = scd.SiteConfigDialog (self)
                        configs = biaweb_db.get_configuration (self.current_db)
 
+                       if not configs:
+                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in reading configuration")
+                               return
+
+                       # set the data
                        dlg.site_url.setText (configs[0])
                        dlg.site_title.setText (configs[1])
                        dlg.keywords.setText (configs[2])
@@ -56,6 +207,7 @@ class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
                        dlg.copyright.setText (configs[6])
 
                        if (dlg.exec_ () == PyQt4.QtGui.QDialog.Accepted):
+                               # if accepted, get the data and store in database
                                site_title = str (dlg.site_title.text ()).strip ()
                                site_url = str (dlg.site_url.text ()).strip ()
                                keywords = str (dlg.keywords.text ()).strip ()
@@ -63,17 +215,103 @@ class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
                                description = str (dlg.description.toPlainText ()).strip ()
                                num_rss = dlg.num_rss_items.value ()
                                copyright = str (dlg.copyright.text ()).strip ()
+                               # database update
                                flag = biaweb_db.set_configuration (self.current_db, site_title, site_url, keywords, description,
                                                                                        copyright, num_rss, destination)
-                               if flag == False:
+                               if not flag:
                                        PyQt4.QtGui.QMessageBox.critical (self, "Error",
                                                                                        "SQLite 3 error in updating configuration")
 
+       # when templates menu is triggered
+       def onTemplates (self):
+               if self.current_db is None:
+                       PyQt4.QtGui.QMessageBox.critical (self, "Error",
+                                                               "Cannot edit templates. You need to create or open a website first")
+               else:
+                       tdlg = tpld.TemplatesDialog (self, self.current_db)
+                       tdlg.exec_ ()
+
+       # function to get the category or article ID from current selected item in a tree widget
+       def get_selected_item_id (self, twidget):
+               selitems = twidget.selectedItems ()
+               if selitems:
+                       # get the first column data as integer
+                       selindex = selitems[0].data(0, 0).toInt ()[0]
+                       return selindex
+               else:
+                       return None
+
+       # category edit action
+       def onCategoryEdit (self):
+               # if no database is open
+               if self.current_db is None:
+                       PyQt4.QtGui.QMessageBox.critical (self, "Error",
+                                                       "Cannot edit category. You need to create or open a website first")
+               # database is open
+               else:
+                       catid = self.get_selected_item_id (self.categories)
+                       # if no category is selected, display an error
+                       if catid is None:
+                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "No category selected")
+                       # category is selected
+                       else:
+                               cat = biaweb_db.get_category (self.current_db, catid)
+                               # if the category cannot be retrieved from database
+                               if not cat:
+                                       PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in reading category")
+                                       return
+
+                               # set the data in the dialog
+                               dlg = catd.CategoryDialog (self)
+                               dlg.category_name.setText (cat[1])
+                               dlg.category_desc.setText (cat[2])
+                               dlg.category_stub.setText (cat[3])
+
+                               # if accepted
+                               if dlg.exec_ () == PyQt4.QtGui.QDialog.Accepted:
+                                       category_name = str (dlg.category_name.text ()).strip ()
+                                       category_desc = str (dlg.category_desc.text ()).strip ()
+                                       category_stub = str (dlg.category_stub.text ()).strip ()
+
+                                       ret = biaweb_db.update_category (self.current_db,
+                                                                                               catid, category_name, category_desc, category_stub)
+                                       if ret:
+                                               PyQt4.QtGui.QMessageBox.information (self, "Success", "Category successfully updated")
+                                               self.repopulate_categories ()
+                                       else:
+                                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in updating category")
+
+
+       # category delete action
+       def onCategoryDelete (self):
+               # if there is no database
+               if self.current_db is None:
+                       PyQt4.QtGui.QMessageBox.critical (self, "Error",
+                                                               "Cannot delete category. You need to create or open a website first")
+               else:
+                       # get the selected category
+                       catid = self.get_selected_item_id (self.categories)
+                       if catid is None:
+                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "No category selected")
+                       # category is selected
+                       else:
+                               # get confirmation first
+                               flag = PyQt4.QtGui.QMessageBox.question (self, "Confirm",
+                       "This will delete the category and all associated articles. Are you sure you wish to continue?",
+                       PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
+                               # if confirmed
+                               if flag == PyQt4.QtGui.QMessageBox.Yes:
+                                       ret = biaweb_db.remove_category (self.current_db, catid)
+                                       if not ret:
+                                               PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in deleting category")
+                                       else:
+                                               self.repopulate_categories ()
+                                               self.repopulate_articles ()
 
        # category add action
        def onCategoryAdd (self):
                # if there is no database
-               if self.current_db == None:
+               if self.current_db is None:
                        PyQt4.QtGui.QMessageBox.critical (self, "Error",
                                                        "Cannot add category. You need to create or open a website first")
                else:
@@ -85,7 +323,7 @@ class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
                                cat_desc = str (dlg.category_desc.text ()).strip ()
                                cat_stub = str (dlg.category_stub.text ()).strip ()
                                ret = biaweb_db.create_category (self.current_db, cat_name, cat_desc, cat_stub)
-                               if ret == True:
+                               if ret:
                                        PyQt4.QtGui.QMessageBox.information (self, "Success", "Category successfully created")
                                        self.repopulate_categories ()
                                        self.repopulate_articles ()
@@ -97,9 +335,21 @@ class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
                filename = PyQt4.QtGui.QFileDialog.getOpenFileName (self, "Open Site Database")
                if filename:
                        self.current_db = str (filename)
-                       self.setWindowTitle ("BiaWeb - " + self.current_db)
-                       self.repopulate_categories ()
-                       self.repopulate_articles ()
+
+                       # added to check whether categories are loaded successfully or not
+                       # if not, then reset the current_db to None
+                       loaded_cats = self.repopulate_categories ()
+                       loaded_arts = self.repopulate_articles ()
+                       # if failed in loading either categories or articles (note: checking against
+                       # False and not None)
+                       if loaded_cats == False or loaded_arts == False:
+                               self.current_db = None
+                               PyQt4.QtGui.QMessageBox.critical (self, "Error",
+                                       "SQLite 3 error in loading site database. This appears to be an invalid BiaWeb database")
+                       else:
+                               # set the window title to the database
+                               self.setWindowTitle ("BiaWeb - " + self.current_db)
+
 
        # file new menu is clicked
        def onFileNew (self):
@@ -122,7 +372,7 @@ class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
                                self.setWindowTitle ("BiaWeb - " + self.current_db)
                                flag = biaweb_db.create_db (self.current_db, site_title, site_url, keywords, description,
                                                                copyright, num_rss, destination)
-                               if flag == True:
+                               if flag:
                                        PyQt4.QtGui.QMessageBox.information (self, "Success",
                                                                                                                        "New site db successfully created")
                                        self.articles.clear ()
@@ -130,6 +380,23 @@ class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
                                else:
                                        PyQt4.QtGui.QMessageBox.critical (self, "Error", "System or SQLite 3 error in creating database")
 
+       # when generate site menu is triggered
+       def onGenerateSite (self):
+               if self.current_db is None:
+                       PyQt4.QtGui.QMessageBox.critical (self, "Error",
+                                                               "Cannot generate site. You need to create or open a website first")
+               else:
+                       # run the generate site dialog
+                       gendlg = gend.GenerateDialog (self, self.current_db)
+                       gendlg.exec_ ()
+
+       # about menu is triggered
+       def onAbout (self):
+               PyQt4.QtGui.QMessageBox.about (self, "BiaWeb Qt",
+                       "<b>A static website/weblog content management system</b><br /><br />\
+Copyright &copy; 2010 <a href=\"http://www.harishankar.org\">Harishankar</a><br />\
+Licensed under GNU/GPL v3")
+
        # file quit is clicked
        def onFileQuit (self):
                sys.exit (0)