# BiaWeb Website content manager (c) 2010 V.Harishankar
# 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
class MainWindow (PyQt4.QtGui.QMainWindow, ui_main_window.Ui_MainWindow):
def __init__ (self):
PyQt4.QtGui.QMainWindow.__init__ (self)
self.setupUi (self)
self.current_db = None
# 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 is False:
PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in getting the categories")
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 is False:
PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in getting the articles")
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)
# 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 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])
dlg.description.setPlainText (configs[3])
dlg.num_rss_items.setValue (configs[4])
dlg.destination.setText (configs[5])
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 ()
destination = str (dlg.destination.text ()).strip ()
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 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 is None:
PyQt4.QtGui.QMessageBox.critical (self, "Error",
"Cannot add category. You need to create or open a website first")
else:
# show the category add dialog
dlg = catd.CategoryDialog (self)
# if OK button is pressed
if dlg.exec_ () == PyQt4.QtGui.QDialog.Accepted:
cat_name = str (dlg.category_name.text ()).strip ()
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:
PyQt4.QtGui.QMessageBox.information (self, "Success", "Category successfully created")
self.repopulate_categories ()
self.repopulate_articles ()
else:
PyQt4.QtGui.QMessageBox.critical (self, "Error", "SQLite 3 error in creating category")
# file open menu is clicked
def onFileOpen (self):
filename = PyQt4.QtGui.QFileDialog.getOpenFileName (self, "Open Site Database")
if filename:
self.current_db = str (filename)
# 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 is False or loaded_arts is 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):
# show the site configuration dialog to get the new site details
dlg = scd.SiteConfigDialog (self)
# if OK button is pressed
if dlg.exec_ () == PyQt4.QtGui.QDialog.Accepted:
site_title = str (dlg.site_title.text ()).strip ()
site_url = str (dlg.site_url.text ()).strip ()
keywords = str (dlg.keywords.text ()).strip ()
destination = str (dlg.destination.text ()).strip ()
description = str (dlg.description.toPlainText ()).strip ()
num_rss = dlg.num_rss_items.value ()
copyright = str (dlg.copyright.text ()).strip ()
savefilename = PyQt4.QtGui.QFileDialog.getSaveFileName (self, "Save site database to")
if savefilename:
self.current_db = str (savefilename)
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:
PyQt4.QtGui.QMessageBox.information (self, "Success",
"New site db successfully created")
self.articles.clear ()
self.categories.clear ()
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)