X-Git-Url: https://harishankar.org/repos/?p=biaweb_qt.git;a=blobdiff_plain;f=main_window.py;h=896353602418e5950578e03125f6b2e9b6903ab4;hp=f917e760ade95d39b6f87245a06025819788d13a;hb=3ded989fee52f6804d0f8b5b5c0847a9030c7f04;hpb=3632ca174c91a33db13178bc19ad2f93473b52c0
diff --git a/main_window.py b/main_window.py
index f917e76..8963536 100644
--- a/main_window.py
+++ b/main_window.py
@@ -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,182 @@ 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
+
+ # 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 +206,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 +214,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 +322,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 +334,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 +371,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 +379,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",
+ "A static website/weblog content management system
\
+Copyright © 2010 Harishankar
\
+Licensed under GNU/GPL v3")
+
# file quit is clicked
def onFileQuit (self):
sys.exit (0)