cdb1305e4ca6419f1aec5addff973f11f9eecb97
[biacv.git] / biacv_mainwindow.py
1 # BiaCV
2 # class for main window
3
4 import PyQt4
5 import biacv_mainwindow_ui as bui
6 import biacv_lang as lang
7 import biacv_data as data
8
9 class Biacv_mainwindow (PyQt4.QtGui.QMainWindow, bui.Ui_biacv_mainwindow):
10 def __init__ (self):
11 PyQt4.QtGui.QMainWindow.__init__ (self)
12 self.setupUi (self)
13 self.currentfile = None
14 self.ismodified = False
15
16 # function to save a file
17 def on_file_save (self):
18 # only save modified file
19 if self.ismodified is False:
20 return
21
22 # if no current file get file name from file save dialog
23 if self.currentfile is None:
24 self.currentfile = PyQt4.QtGui.QFileDialog.getSaveFileName (self,
25 lang.SAVE_TITLE)
26
27 if self.currentfile <> "":
28 mydata = self.get_document_data ()
29 mydata.save_data (self.currentfile)
30 self.ismodified = False
31 else:
32 self.currentfile = None
33 else:
34 mydata = self.get_document_data ()
35 mydata.save_data (self.currentfile)
36 self.ismodified = False
37
38 # function to set document data from the GUI
39 def get_document_data (self):
40 docdata = data.BiaCVData ()
41
42 # set the document title
43 docdata.set_document_title (unicode (self.title.text ().toUtf8 (), "utf-8"))
44
45 # get the marital status string from check box
46 if self.married.isChecked ():
47 maritalstatus = True
48 elif self.single.isChecked ():
49 maritalstatus = False
50 else:
51 maritalstatus = None
52
53 docdata.set_personal_info (
54 unicode (self.nametitle.lineEdit ().text ().toUtf8 (), "utf-8"),
55 unicode (self.firstname.text ().toUtf8 (), "utf-8"),
56 unicode (self.lastname.text ().toUtf8 (), "utf-8"),
57 unicode (self.dateofbirth.date().toString ("dd MMM, yyyy"), "utf-8"),
58 unicode (self.street.text ().toUtf8 (), "utf-8"),
59 unicode (self.area.text ().toUtf8 (), "utf-8"),
60 unicode (self.city.text ().toUtf8 (), "utf-8"),
61 unicode (self.areacode.text ().toUtf8 (), "utf-8"),
62 unicode (self.countrycode_landline.text ().toUtf8 (), "utf-8"),
63 unicode (self.telephone.text ().toUtf8 (), "utf-8"),
64 unicode (self.countrycode_mobile.text ().toUtf8 (), "utf-8"),
65 unicode (self.mobilenumber.text ().toUtf8 (), "utf-8"),
66 unicode (self.email.text ().toUtf8 (), "utf-8"),
67 maritalstatus
68 )
69 # get the list of educational qualifications from the treewidget
70 education = []
71 i = 0
72 while i < self.educationlist.topLevelItemCount ():
73 curitem = self.educationlist.topLevelItem (i)
74 curdict = {}
75 curdict["degree"] = unicode (curitem.text (0).toUtf8 (), "utf-8")
76 curdict["graduation"] = unicode (curitem.text (1).toUtf8 (), "utf-8")
77 curdict["institution"] = unicode (curitem.text (2).toUtf8 (), "utf-8")
78 curdict["university"] = unicode (curitem.text (3).toUtf8 (), "utf-8")
79 curdict["grade"] = unicode (curitem.text (4).toUtf8 (), "utf-8")
80 curdict["percentage"] = float (curitem.text (5))
81 education.append (curdict)
82 i += 1
83
84 # set the educational qualifications
85 docdata.set_educational_qualifications (education)
86
87 # get the list of professional history from the treewidget
88 professional = []
89 i = 0
90 while i < self.professionlist.topLevelItemCount ():
91 curitem = self.professionlist.topLevelItem (i)
92 curdict = {}
93 curdict["jobtitle"] = unicode (curitem.text (0).toUtf8 (), "utf-8")
94 curdict["joindate"] = unicode (curitem.text (1), "utf-8")
95 curdict["leavedate"] = unicode (curitem.text (2), "utf-8")
96 curdict["organization"] = unicode (curitem.text (3).toUtf8 (), "utf-8")
97 curdict["additionalinfo"] = unicode (curitem.text (4).toUtf8 (), "utf-8")
98 professional.append (curdict)
99 i += 1
100
101 # set the professional qualifications
102 docdata.set_professional_history (professional)
103
104 # set the career objectives
105 shorttermobjectives = unicode (self.shorttermcareer.toPlainText ().toUtf8 (), "utf-8").splitlines ()
106 longtermgoals = unicode (self.longtermgoals.toPlainText ().toUtf8 (), "utf-8").splitlines ()
107
108 docdata.set_career_objectives (shorttermobjectives, longtermgoals)
109
110 # set the skill sets
111 skills = []
112 i = 0
113 while i < self.skillslist.topLevelItemCount ():
114 curitem = self.skillslist.topLevelItem (i)
115 curdict = {}
116 curdict["skilltitle"] = unicode (curitem.text (0).toUtf8 (), "utf-8")
117 curdict["skilldesc"] = unicode (curitem.text (1).toUtf8 (), "utf-8")
118 skills.append (curdict)
119 i += 1
120 # set the list of skills
121 docdata.set_skillsets (skills)
122
123 # get the list of languages
124 langsknown = []
125 i = 0
126 while i < self.languageslist.topLevelItemCount ():
127 curitem = self.languageslist.topLevelItem (i)
128 curdict = {}
129 curdict["language"] = unicode (curitem.text (0).toUtf8 (), "utf-8")
130 curdict["canspeak" ] = (curitem.text (1) == "True")
131 curdict["canreadwrite"] = (curitem.text (2) == "True")
132 curdict["isproficient"] = (curitem.text (3) == "True")
133 langsknown.append (curdict)
134 i += 1
135
136 additionalinformation = unicode (self.additionalinformation.toPlainText ().toUtf8 (), "utf-8")
137
138 docdata.set_additional_information (langsknown, additionalinformation)
139
140 return docdata
141
142 # function to reset personal information data in the GUI
143 def reset_personal_info (self):
144 self.nametitle.setEditText ("")
145 self.firstname.setText ("")
146 self.lastname.setText ("")
147 self.dateofbirth.setDate (PyQt4.QtCore.QDate (1970, 1, 1))
148 self.street.setText ("")
149 self.area.setText ("")
150 self.city.setText ("")
151 self.countrycode_landline.setText ("")
152 self.telephone.setText ("")
153 self.countrycode_mobile.setText ("")
154 self.mobilenumber.setText ("")
155 self.email.setText ("")
156 self.areacode.setText ("")
157 self.unspecified.setChecked (True)
158
159 # function to clear professional history in the GUI
160 def reset_professional_history (self):
161 self.reset_profession_fields ()
162 self.professionlist.clear ()
163
164 # function to clear educational qualifications in the GUI
165 def reset_educational_qualifications (self):
166 self.reset_education_fields ()
167 self.educationlist.clear ()
168
169 # function to clear career objectives data in the GUI
170 def reset_career_objectives (self):
171 self.shorttermcareer.setPlainText ("")
172 self.longtermgoals.setPlainText ("")
173
174 # function to clear skill sets data in the GUI
175 def reset_skillsets_info (self):
176 self.reset_skillset_fields ()
177 self.skillslist.clear ()
178
179 # function to clear additional information data in the GUI
180 def reset_additional_info (self):
181 self.reset_language_fields ()
182 self.languageslist.clear ()
183 self.additionalinformation.setPlainText ("")
184
185 # function to clear all the fields and reset them to defaults
186 def new_document (self):
187 # first clear the individual record fields in the tabs
188 self.reset_language_fields ()
189 self.reset_skillset_fields ()
190
191 # clear document data
192 self.title.setText ("")
193
194 self.reset_personal_info ()
195 self.reset_professional_history ()
196 self.reset_educational_qualifications ()
197 self.reset_career_objectives ()
198 self.reset_skillsets_info ()
199 self.reset_additional_info ()
200
201 # set the page to first page
202 self.pages.setCurrentIndex (0)
203
204 # set current file to none and modified to false
205 self.currentfile = None
206 self.ismodified = False
207
208 # file new action is triggered
209 def on_file_new (self):
210 # if the previous document is modified
211 # as if it should be discarded
212 if self.ismodified is True:
213 ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM,
214 lang.CONFIRM_DISCARD_SAVE,
215 PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
216 if ans == PyQt4.QtGui.QMessageBox.Yes:
217 self.new_document ()
218 # if not modified then simply create a new document
219 else:
220 self.new_document ()
221
222 # when the document is modified
223 def on_document_modified (self):
224 # set the document modified flag
225 self.ismodified = True
226
227 # update a language in the list of languages
228 def on_update_lang (self):
229 # get the selected language
230 selitems = self.languageslist.selectedItems ()
231 if selitems == []:
232 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_NO_SELECTION)
233 return
234 # check if the language string is not empty
235 if self.language.text () == "":
236 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_REQ_MISSING)
237 return
238 selitem = selitems[0]
239 selitem.setText (0, self.language.text ())
240 selitem.setText (1, str (self.canspeak.isChecked ()))
241 selitem.setText (2, str (self.canreadwrite.isChecked ()))
242 selitem.setText (3, str (self.isproficient.isChecked ()))
243
244 # modified the document
245 self.ismodified = True
246
247 # selecting a language from the list of languages
248 def on_select_lang (self):
249 # set the language fields from the selected item
250 self.set_language_fields ()
251
252 # delete a language from the list of languages known
253 def on_delete_lang (self):
254 # get selected language
255 selitems = self.languageslist.selectedItems ()
256 if selitems == []:
257 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_DELETE, lang.ERROR_REQ_MISSING)
258 return
259 # confirm
260 ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DELETE,
261 PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
262 if ans == PyQt4.QtGui.QMessageBox.Yes:
263 for item in selitems:
264 self.languageslist.takeTopLevelItem (self.languageslist.indexOfTopLevelItem (item))
265
266 self.reset_language_fields ()
267 # set the modified flag
268 self.ismodified = True
269
270 # add a language to the list of languages known
271 def on_add_lang (self):
272 # check if the language is set
273 if self.language.text () == "":
274 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_REQ_MISSING)
275 return
276 langitem = PyQt4.QtGui.QTreeWidgetItem (
277 [
278 self.language.text (),
279 str (self.canspeak.isChecked ()),
280 str (self.canreadwrite.isChecked ()),
281 str (self.isproficient.isChecked ())
282 ]
283 )
284 self.languageslist.addTopLevelItem (langitem)
285 self.reset_language_fields ()
286
287 # set the modified flag
288 self.ismodified = True
289
290 # set the language fields from the selected item
291 def set_language_fields (self):
292 selitems = self.languageslist.selectedItems ()
293 if selitems == []:
294 return
295 selitem = selitems[0]
296 self.language.setText (selitem.text (0))
297 self.canspeak.setChecked (selitem.text (1) == "True")
298 self.canreadwrite.setChecked (selitem.text(2) == "True")
299 self.isproficient.setChecked (selitem.text(3) == "True")
300
301 # reset the language fields
302 def reset_language_fields (self):
303 self.language.setText ("")
304 self.canspeak.setChecked (True)
305 self.canreadwrite.setChecked (False)
306 self.isproficient.setChecked (False)
307
308 # update the skill set button event
309 def on_update_skill (self):
310 # get the selected item
311 selitems = self.skillslist.selectedItems ()
312 if selitems == []:
313 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_NO_SELECTION)
314 return
315 if self.skillsettitle.text () == "":
316 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_REQ_MISSING)
317 return
318 selitem = selitems[0]
319
320 selitem.setText (0, self.skillsettitle.text ())
321 selitem.setText (1, self.skilldescription.toPlainText ())
322 # set the modified flag
323 self.ismodified = True
324
325 # selecting a skill from the list event
326 def on_select_skill (self):
327 self.set_skill_fields ()
328
329 # set the skill fields from the selected skill from the list
330 def set_skill_fields (self):
331 # get the selected items
332 selitems = self.skillslist.selectedItems ()
333 if selitems == []:
334 return
335 selitem = selitems[0]
336 self.skillsettitle.setText (selitem.text (0))
337 self.skilldescription.setPlainText (selitem.text (1))
338
339 # delete skill set button is clicked
340 def on_delete_skill (self):
341 # get the selected items
342 selitems = self.skillslist.selectedItems ()
343 if selitems == []:
344 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_DELETE, lang.ERROR_NO_SELECTION)
345 return
346 # confirm
347 ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DELETE,
348 PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
349 # answer is yes
350 if ans == PyQt4.QtGui.QMessageBox.Yes:
351 for item in selitems:
352 self.skillslist.takeTopLevelItem (self.skillslist.indexOfTopLevelItem (item))
353
354 self.reset_skillset_fields ()
355 # set the modified flag
356 self.ismodified = True
357
358 # add skill set button is clicked
359 def on_add_skill (self):
360 # if the skill title is blank
361 if self.skillsettitle.text () == "":
362 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_REQ_MISSING)
363 return
364 skillitem = PyQt4.QtGui.QTreeWidgetItem (
365 [
366 self.skillsettitle.text (),
367 self.skilldescription.toPlainText ()
368 ]
369 )
370 self.skillslist.addTopLevelItem (skillitem)
371 self.reset_skillset_fields ()
372 # set the modified flag
373 self.ismodified = True
374
375 # clear the skill set fields
376 def reset_skillset_fields (self):
377 self.skillsettitle.setText ("")
378 self.skilldescription.setPlainText ("")
379
380 # update professional history button is clicked
381 def on_update_profession (self):
382 # get the selected item
383 selitems = self.professionlist.selectedItems ()
384 if selitems == []:
385 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_NO_SELECTION)
386 return
387 selitem = selitems[0]
388 # if designation is not set
389 if self.designation.text () == "":
390 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_REQ_MISSING)
391 return
392 # if currently employed in that position, leaving date is to be disabled
393 # and set to "current"
394 if self.currentemployment.isChecked ():
395 leavedatestr = "current"
396 else:
397 # if the leaving date is < join date
398 if self.leavedate.date () < self.joindate.date ():
399 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_DATE)
400 return
401 leavedatestr = self.leavedate.date ().toString ("dd MMM, yyyy")
402
403 selitem.setText (0, self.designation.text ())
404 selitem.setText (1, self.joindate.date ().toString ("dd MMM, yyyy"))
405 selitem.setText (2, leavedatestr)
406 selitem.setText (3, self.organization.text ())
407 selitem.setText (4, self.additionalinfo.text ())
408 # set the modified flag
409 self.ismodified = True
410
411 # delete professional history button is clicked
412 def on_delete_profession (self):
413 # get the selected items
414 selitems = self.professionlist.selectedItems ()
415 if selitems == []:
416 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_DELETE, lang.ERROR_NO_SELECTION)
417 return
418 # confirm deletion
419 ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DELETE,
420 PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
421 # if confirmed
422 if ans == PyQt4.QtGui.QMessageBox.Yes:
423 for item in selitems:
424 self.professionlist.takeTopLevelItem (self.professionlist.indexOfTopLevelItem (item))
425 self.reset_profession_fields ()
426 # set the modified flag
427 self.ismodified = True
428
429 # add professional history button is clicked
430 def on_add_profession (self):
431 if self.designation.text () == "":
432 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_REQ_MISSING)
433 return
434 # if currently employed in that position, leaving date is to be disabled
435 # and set to "current"
436 if self.currentemployment.isChecked ():
437 leavedatestr = "current"
438 else:
439 # if the leaving date is < join date
440 if self.leavedate.date () < self.joindate.date ():
441 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_DATE)
442 return
443 leavedatestr = self.leavedate.date ().toString ("dd MMM, yyyy")
444
445 professionitem = PyQt4.QtGui.QTreeWidgetItem (
446 [
447 self.designation.text (),
448 self.joindate.date ().toString ("dd MMM, yyyy"),
449 leavedatestr,
450 self.organization.text (),
451 self.additionalinfo.text ()
452 ]
453 )
454
455 self.professionlist.addTopLevelItem (professionitem)
456
457 self.reset_profession_fields ()
458 # set the modified flag
459 self.ismodified = True
460
461 # when selection of profession list is changed
462 def on_select_profession (self):
463 self.set_profession_fields ()
464
465 # set the profession fields from the selected item in profession list
466 def set_profession_fields (self):
467 selitems = self.professionlist.selectedItems ()
468 if selitems == []:
469 return
470 selitem = selitems[0]
471 self.designation.setText (selitem.text (0))
472 self.joindate.setDate (PyQt4.QtCore.QDate.fromString (selitem.text(1), "dd MMM, yyyy"))
473 if selitem.text (2) == "current":
474 self.leavedate.setEnabled (False)
475 self.currentemployment.setChecked (True)
476 else:
477 self.leavedate.setDate (PyQt4.QtCore.QDate.fromString (selitem.text (2), "dd MMM, yyyy"))
478 self.leavedate.setEnabled (True)
479 self.currentemployment.setChecked (False)
480
481 self.organization.setText (selitem.text (3))
482 self.additionalinfo.setText (selitem.text (4))
483
484 def reset_profession_fields (self):
485 self.designation.setText ("")
486 self.joindate.setDate (PyQt4.QtCore.QDate (2000, 1, 1))
487 self.leavedate.setDate (PyQt4.QtCore.QDate (2003, 1, 1))
488 self.currentemployment.setChecked (False)
489 self.organization.setText ("")
490 self.additionalinfo.setText ("")
491
492 # current employment check box is changed
493 def on_change_currentemployment (self, val):
494 if val == True:
495 self.leavedate.setEnabled (False)
496 else:
497 self.leavedate.setEnabled (True)
498
499 # delete educational qualification
500 def on_delete_education (self):
501 # get the selected items in the education list
502 selitems = self.educationlist.selectedItems ()
503 # if no items are selected
504 if selitems == []:
505 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_DELETE, lang.ERROR_NO_SELECTION)
506 # delete the items after confirmation
507 else:
508 ans = PyQt4.QtGui.QMessageBox.question (self, lang.CONFIRM, lang.CONFIRM_DELETE,
509 PyQt4.QtGui.QMessageBox.Yes, PyQt4.QtGui.QMessageBox.No)
510 if ans == PyQt4.QtGui.QMessageBox.Yes:
511 # remove the item selected
512 for item in selitems:
513 self.educationlist.takeTopLevelItem (self.educationlist.indexOfTopLevelItem (item))
514 self.reset_education_fields ()
515 # set the modified flag
516 self.ismodified = True
517
518 # selection is changed
519 def on_select_education (self):
520 self.set_education_fields ()
521
522 # update educational qualification button
523 def on_update_education (self):
524 selitems = self.educationlist.selectedItems ()
525 # if no item is selected
526 if selitems == []:
527 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_NO_SELECTION)
528 return
529 # if the qualification title is not set
530 if self.degree_name.text () == "":
531 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_UPDATE, lang.ERROR_REQ_MISSING)
532 return
533 selitem = selitems[0]
534
535 selitem.setText (0, self.degree_name.text ())
536 selitem.setText (1, self.yearofpassing.date ().toString ("MMM, yyyy"))
537 selitem.setText (2, self.institution.text ())
538 selitem.setText (3, self.university.text ())
539 selitem.setText (4, self.grade.text ())
540 selitem.setText (5, str (self.percentage.value ()))
541 # set the modified flag
542 self.ismodified = True
543
544 # add educational qualification button
545 def on_add_education (self):
546 # check if the qualification title is set
547 if self.degree_name.text () == "":
548 PyQt4.QtGui.QMessageBox.critical (self, lang.ERROR_ADD, lang.ERROR_REQ_MISSING)
549 return
550 educationitem = PyQt4.QtGui.QTreeWidgetItem ([
551 self.degree_name.text (),
552 self.yearofpassing.date ().toString ("MMM, yyyy"),
553 self.institution.text (),
554 self.university.text (),
555 self.grade.text (),
556 str (self.percentage.value ())
557 ])
558 self.educationlist.addTopLevelItem (educationitem)
559 # clear the fields
560 self.reset_education_fields ()
561 # set the modified flag
562 self.ismodified = True
563
564 # set fields in the education tab from current selected item
565 def set_education_fields (self):
566 selitems = self.educationlist.selectedItems ()
567 if selitems == []:
568 return
569 selitem = selitems[0]
570 # set the fields to the data in the selected item in the list
571 self.degree_name.setText (selitem.text (0))
572 self.yearofpassing.setDate (PyQt4.QtCore.QDate.fromString (selitem.text(1), "MMM, yyyy"))
573 self.institution.setText (selitem.text (2))
574 self.university.setText (selitem.text (3))
575 self.grade.setText (selitem.text(4))
576 self.percentage.setValue (self.percentage.valueFromText (selitem.text(5)))
577
578 # reset fields in the education tab
579 def reset_education_fields (self):
580 self.degree_name.setText ("")
581 self.yearofpassing.setDate (PyQt4.QtCore.QDate (1988, 1, 1))
582 self.institution.setText ("")
583 self.university.setText ("")
584 self.grade.setText ("")
585 self.percentage.setValue (50.0)
586